@gotza02/smartagent 1.2.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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +422 -0
  3. package/dist/config/index.d.ts +72 -0
  4. package/dist/config/index.d.ts.map +1 -0
  5. package/dist/config/index.js +329 -0
  6. package/dist/config/index.js.map +1 -0
  7. package/dist/core/agent-manager.d.ts +116 -0
  8. package/dist/core/agent-manager.d.ts.map +1 -0
  9. package/dist/core/agent-manager.js +460 -0
  10. package/dist/core/agent-manager.js.map +1 -0
  11. package/dist/core/context-manager.d.ts +107 -0
  12. package/dist/core/context-manager.d.ts.map +1 -0
  13. package/dist/core/context-manager.js +467 -0
  14. package/dist/core/context-manager.js.map +1 -0
  15. package/dist/core/database.d.ts +82 -0
  16. package/dist/core/database.d.ts.map +1 -0
  17. package/dist/core/database.js +751 -0
  18. package/dist/core/database.js.map +1 -0
  19. package/dist/core/event-emitter.d.ts +110 -0
  20. package/dist/core/event-emitter.d.ts.map +1 -0
  21. package/dist/core/event-emitter.js +240 -0
  22. package/dist/core/event-emitter.js.map +1 -0
  23. package/dist/core/metrics.d.ts +108 -0
  24. package/dist/core/metrics.d.ts.map +1 -0
  25. package/dist/core/metrics.js +281 -0
  26. package/dist/core/metrics.js.map +1 -0
  27. package/dist/core/middleware.d.ts +63 -0
  28. package/dist/core/middleware.d.ts.map +1 -0
  29. package/dist/core/middleware.js +194 -0
  30. package/dist/core/middleware.js.map +1 -0
  31. package/dist/core/plugin-system.d.ts +86 -0
  32. package/dist/core/plugin-system.d.ts.map +1 -0
  33. package/dist/core/plugin-system.js +251 -0
  34. package/dist/core/plugin-system.js.map +1 -0
  35. package/dist/core/task-scheduler.d.ts +130 -0
  36. package/dist/core/task-scheduler.d.ts.map +1 -0
  37. package/dist/core/task-scheduler.js +401 -0
  38. package/dist/core/task-scheduler.js.map +1 -0
  39. package/dist/engines/auto-router.d.ts +76 -0
  40. package/dist/engines/auto-router.d.ts.map +1 -0
  41. package/dist/engines/auto-router.js +445 -0
  42. package/dist/engines/auto-router.js.map +1 -0
  43. package/dist/engines/parallel-execution.d.ts +104 -0
  44. package/dist/engines/parallel-execution.d.ts.map +1 -0
  45. package/dist/engines/parallel-execution.js +591 -0
  46. package/dist/engines/parallel-execution.js.map +1 -0
  47. package/dist/engines/sequential-thinking.d.ts +88 -0
  48. package/dist/engines/sequential-thinking.d.ts.map +1 -0
  49. package/dist/engines/sequential-thinking.js +406 -0
  50. package/dist/engines/sequential-thinking.js.map +1 -0
  51. package/dist/index.d.ts +12 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +1101 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/security/validation.d.ts +87 -0
  56. package/dist/security/validation.d.ts.map +1 -0
  57. package/dist/security/validation.js +465 -0
  58. package/dist/security/validation.js.map +1 -0
  59. package/dist/tools/filesystem.d.ts +90 -0
  60. package/dist/tools/filesystem.d.ts.map +1 -0
  61. package/dist/tools/filesystem.js +292 -0
  62. package/dist/tools/filesystem.js.map +1 -0
  63. package/dist/tools/terminal.d.ts +99 -0
  64. package/dist/tools/terminal.d.ts.map +1 -0
  65. package/dist/tools/terminal.js +363 -0
  66. package/dist/tools/terminal.js.map +1 -0
  67. package/dist/types/index.d.ts +306 -0
  68. package/dist/types/index.d.ts.map +1 -0
  69. package/dist/types/index.js +54 -0
  70. package/dist/types/index.js.map +1 -0
  71. package/dist/utils/logger.d.ts +22 -0
  72. package/dist/utils/logger.d.ts.map +1 -0
  73. package/dist/utils/logger.js +189 -0
  74. package/dist/utils/logger.js.map +1 -0
  75. package/package.json +71 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Swarm MCP Enterprise
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,422 @@
1
+ # SmartAgent
2
+
3
+ Intelligent Multi-Agent System with Sequential Thinking & Auto-Routing
4
+
5
+ [![Version](https://img.shields.io/badge/version-1.0.0-blue.svg)](https://semver.org)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+ [![Node.js](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen.svg)](https://nodejs.org/)
8
+
9
+ ## Overview
10
+
11
+ SmartAgent is a production-ready Model Context Protocol (MCP) Server designed for managing multi-agent swarm systems. It provides intelligent agent orchestration, sequential thinking capabilities, and automatic routing based on intent classification.
12
+
13
+ ### Key Features
14
+
15
+ - **5 Base Agent Types**: Product Manager, Architect, Engineer, QA, Reviewer
16
+ - **3 Operating Modes**: Plan (read-only), Edit (write), Ralph (autonomous)
17
+ - **Sequential Thinking Engine**: Step-by-step reasoning with branching and revision
18
+ - **Auto-Routing**: Intent classification with ≥85% accuracy
19
+ - **Parallel Execution**: Concurrent task processing with result aggregation
20
+ - **Context Persistence**: SQLite/libSQL database with checkpoint system
21
+ - **Security Layer**: Path validation, command whitelisting, audit logging
22
+ - **Health Monitoring**: Automatic health checks every 30 seconds
23
+
24
+ ## Installation
25
+
26
+ ### Via npx (Recommended)
27
+
28
+ ```bash
29
+ npx @gotza02/smartagent
30
+ ```
31
+
32
+ ### Global Installation
33
+
34
+ ```bash
35
+ npm install -g @gotza02/smartagent
36
+ smartagent
37
+ ```
38
+
39
+ ### Development Setup
40
+
41
+ ```bash
42
+ git clone https://github.com/gotza02/smartagent.git
43
+ cd smartagent
44
+ npm install
45
+ npm run build
46
+ npm link
47
+ ```
48
+
49
+ ## Quick Start
50
+
51
+ ### 1. Configure with Claude Code
52
+
53
+ Add to your `claude_desktop_config.json`:
54
+
55
+ ```json
56
+ {
57
+ "mcpServers": {
58
+ "swarm-enterprise": {
59
+ "command": "npx",
60
+ "args": ["-y", "@gotza02/smartagent"],
61
+ "env": {
62
+ "SWARM_DEBUG": "false",
63
+ "SWARM_LOG_LEVEL": "info"
64
+ }
65
+ }
66
+ }
67
+ }
68
+ ```
69
+
70
+ ### 2. Spawn Your First Agent
71
+
72
+ ```
73
+ Use tool: spawn_agent
74
+ {
75
+ "type": "product_manager",
76
+ "name": "pm_lead",
77
+ "mode": "plan"
78
+ }
79
+ ```
80
+
81
+ ### 3. Create a Task
82
+
83
+ ```
84
+ Use tool: assign_task
85
+ {
86
+ "agentId": "<agent-id>",
87
+ "type": "requirements",
88
+ "description": "Define requirements for user authentication system",
89
+ "priority": 8
90
+ }
91
+ ```
92
+
93
+ ### 4. Start Sequential Thinking
94
+
95
+ ```
96
+ Use tool: thinking_create_chain
97
+ {
98
+ "agentId": "<agent-id>",
99
+ "taskId": "<task-id>",
100
+ "title": "User Auth Requirements Analysis"
101
+ }
102
+ ```
103
+
104
+ ## Architecture
105
+
106
+ ```
107
+ ┌─────────────────────────────────────────────────────────────┐
108
+ │ SmartAgent │
109
+ ├─────────────────────────────────────────────────────────────┤
110
+ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
111
+ │ │ Agent │ │ Sequential │ │ Auto │ │
112
+ │ │ Manager │ │ Thinking │ │ Router │ │
113
+ │ └──────────────┘ └──────────────┘ └──────────────┘ │
114
+ ├─────────────────────────────────────────────────────────────┤
115
+ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
116
+ │ │ Context │ │ Parallel │ │ Tool │ │
117
+ │ │ Manager │ │ Execution │ │ Manager │ │
118
+ │ └──────────────┘ └──────────────┘ └──────────────┘ │
119
+ ├─────────────────────────────────────────────────────────────┤
120
+ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
121
+ │ │ Security │ │ Database │ │ Logger │ │
122
+ │ │ Layer │ │ (libSQL) │ │ (Winston) │ │
123
+ │ └──────────────┘ └──────────────┘ └──────────────┘ │
124
+ └─────────────────────────────────────────────────────────────┘
125
+ ```
126
+
127
+ ## Available Tools
128
+
129
+ ### Agent Management
130
+
131
+ | Tool | Description |
132
+ |------|-------------|
133
+ | `spawn_agent` | Create a new agent |
134
+ | `spawn_agents_batch` | Create multiple agents (max 10) |
135
+ | `get_agent` | Get agent details |
136
+ | `list_agents` | List all agents with filters |
137
+ | `terminate_agent` | Terminate an agent |
138
+
139
+ ### Task Management
140
+
141
+ | Tool | Description |
142
+ |------|-------------|
143
+ | `assign_task` | Assign task to agent |
144
+ | `get_task` | Get task details |
145
+ | `complete_task` | Mark task as completed |
146
+ | `fail_task` | Mark task as failed |
147
+
148
+ ### Sequential Thinking
149
+
150
+ | Tool | Description |
151
+ |------|-------------|
152
+ | `thinking_create_chain` | Create thought chain |
153
+ | `thinking_add_thought` | Add thought to chain |
154
+ | `thinking_get_chain` | Get chain details |
155
+ | `thinking_export` | Export as JSON/Markdown |
156
+
157
+ ### Auto-Routing
158
+
159
+ | Tool | Description |
160
+ |------|-------------|
161
+ | `routing_classify_intent` | Classify input intent |
162
+ | `routing_route` | Route to appropriate agent |
163
+
164
+ ### Parallel Execution
165
+
166
+ | Tool | Description |
167
+ |------|-------------|
168
+ | `parallel_execute` | Execute tasks in parallel |
169
+ | `parallel_get_execution` | Get execution details |
170
+
171
+ ### Context & Handoff
172
+
173
+ | Tool | Description |
174
+ |------|-------------|
175
+ | `context_create` | Create agent context |
176
+ | `context_handoff` | Handoff between agents |
177
+ | `context_get_handoff_history` | View handoff history |
178
+
179
+ ### System
180
+
181
+ | Tool | Description |
182
+ |------|-------------|
183
+ | `system_stats` | Get system statistics |
184
+ | `system_health` | Perform health check |
185
+
186
+ ## Configuration
187
+
188
+ ### Environment Variables
189
+
190
+ | Variable | Description | Default |
191
+ |----------|-------------|---------|
192
+ | `SWARM_DEBUG` | Enable debug mode | `false` |
193
+ | `SWARM_LOG_LEVEL` | Log level (debug/info/warn/error) | `info` |
194
+ | `SWARM_MAX_AGENTS` | Maximum agents allowed | `100` |
195
+ | `SMARTAGENT_DB_PATH` | Database file path | `~/.smartagent/smartagent.db` |
196
+
197
+ ### Security Policy
198
+
199
+ Default security settings:
200
+ - Path validation enabled
201
+ - Blocked paths: `/`, `/bin`, `/etc`, `/sys`, `/proc`, `/dev`
202
+ - Command blacklist: `rm -rf /`, `format`, `mkfs`, `dd`
203
+ - Rate limit: 50 requests/minute, 1000/hour
204
+
205
+ ## Agent Types & Capabilities
206
+
207
+ ### Product Manager
208
+ - Requirements gathering
209
+ - User story creation
210
+ - Acceptance criteria
211
+ - Product roadmap
212
+ - Prioritization
213
+
214
+ ### Architect
215
+ - System design
216
+ - Technology selection
217
+ - Database schema design
218
+ - API design
219
+ - Pattern selection
220
+
221
+ ### Engineer
222
+ - Implementation
223
+ - Code development
224
+ - Debugging
225
+ - Refactoring
226
+ - Unit testing
227
+
228
+ ### QA
229
+ - Test planning
230
+ - Test automation
231
+ - Bug reporting
232
+ - Quality assurance
233
+ - Performance testing
234
+
235
+ ### Reviewer
236
+ - Code review
237
+ - Security audit
238
+ - Performance review
239
+ - Best practices
240
+ - Documentation review
241
+
242
+ ## Operating Modes
243
+
244
+ | Mode | Description | Tools Available |
245
+ |------|-------------|-----------------|
246
+ | `plan` | Read-only analysis | Filesystem (read), Terminal (read) |
247
+ | `edit` | Write operations | Filesystem (read/write), Terminal (read/write) |
248
+ | `ralph` | Autonomous execution | All tools with full permissions |
249
+
250
+ ## Sequential Thinking
251
+
252
+ The sequential thinking engine supports:
253
+
254
+ 1. **Step-by-step reasoning** - Each thought builds on previous ones
255
+ 2. **Branching** - Explore multiple paths from any thought
256
+ 3. **Revision** - Update previous thoughts with new information
257
+ 4. **Confidence scoring** - 0.0 to 1.0 confidence for each thought
258
+ 5. **Export formats** - JSON and Markdown
259
+
260
+ ### Example Workflow
261
+
262
+ ```
263
+ 1. thinking_create_chain
264
+ → Creates new chain for analysis
265
+
266
+ 2. thinking_add_thought (Step 1)
267
+ → "Identify user requirements"
268
+ → Confidence: 0.9
269
+
270
+ 3. thinking_add_thought (Step 2)
271
+ → "Analyze technical constraints"
272
+ → Confidence: 0.85
273
+
274
+ 4. thinking_add_thought (Step 3, branchFrom: step2)
275
+ → "Alternative architecture approach"
276
+ → Creates branch
277
+
278
+ 5. thinking_export (format: "markdown")
279
+ → Export complete thought chain
280
+ ```
281
+
282
+ ## Parallel Execution
283
+
284
+ Execute multiple tasks concurrently:
285
+
286
+ ```
287
+ parallel_execute
288
+ {
289
+ "tasks": [
290
+ { "agentType": "engineer", "type": "implement", "description": "API endpoint" },
291
+ { "agentType": "engineer", "type": "implement", "description": "Database model" },
292
+ { "agentType": "qa", "type": "test", "description": "Unit tests" }
293
+ ],
294
+ "maxConcurrency": 3,
295
+ "aggregationStrategy": "all"
296
+ }
297
+ ```
298
+
299
+ Aggregation strategies:
300
+ - `all` - Wait for all tasks, return all results
301
+ - `first` - Return first successful result
302
+ - `majority` - Return majority consensus
303
+ - `custom` - Custom aggregation logic
304
+
305
+ ## Monitoring & Logging
306
+
307
+ ### Log Files
308
+
309
+ Located at `~/.smartagent/logs/`:
310
+ - `combined.log` - All logs
311
+ - `error.log` - Error logs only
312
+ - `audit.log` - Security audit logs
313
+ - `performance.log` - Performance metrics
314
+
315
+ ### Health Checks
316
+
317
+ Automatic health checks every 30 seconds:
318
+ - Agent timeout detection
319
+ - Task status verification
320
+ - Resource usage monitoring
321
+
322
+ ### System Stats
323
+
324
+ ```
325
+ system_stats
326
+ → Returns:
327
+ - Agent counts by type/status
328
+ - Task statistics
329
+ - Database metrics
330
+ - Parallel execution stats
331
+ ```
332
+
333
+ ## Testing
334
+
335
+ ```bash
336
+ # Run all tests
337
+ npm test
338
+
339
+ # Run with coverage
340
+ npm run test:coverage
341
+
342
+ # Run in watch mode
343
+ npm run test:watch
344
+
345
+ # Run UI mode
346
+ npm run test:ui
347
+ ```
348
+
349
+ ## Performance
350
+
351
+ | Metric | Target | Actual |
352
+ |--------|--------|--------|
353
+ | Response Time (Local) | < 2s | ~500ms |
354
+ | Response Time (External) | < 5s | ~2s |
355
+ | Concurrent Agents | 10 | 10+ |
356
+ | Memory Footprint | < 512MB | ~256MB |
357
+ | Throughput | 50 calls/min | 100+ calls/min |
358
+
359
+ ## Security
360
+
361
+ - ✅ Path traversal protection
362
+ - ✅ Command validation & sanitization
363
+ - ✅ Rate limiting
364
+ - ✅ Audit logging
365
+ - ✅ No plaintext credential storage
366
+ - ✅ Input validation with Zod
367
+
368
+ ## Troubleshooting
369
+
370
+ ### Common Issues
371
+
372
+ **Issue**: Agent not responding
373
+ ```bash
374
+ # Check agent status
375
+ get_agent { "agentId": "<id>" }
376
+
377
+ # Perform health check
378
+ system_health
379
+ ```
380
+
381
+ **Issue**: Task timeout
382
+ ```bash
383
+ # Check task details
384
+ get_task { "taskId": "<id>" }
385
+
386
+ # Retry with longer timeout
387
+ assign_task { "timeout": 300 }
388
+ ```
389
+
390
+ **Issue**: Database locked
391
+ ```bash
392
+ # Restart the server
393
+ # Database will auto-recover
394
+ ```
395
+
396
+ ### Debug Mode
397
+
398
+ ```bash
399
+ SMARTAGENT_DEBUG=true npx @gotza02/smartagent
400
+ ```
401
+
402
+ ## Contributing
403
+
404
+ 1. Fork the repository
405
+ 2. Create feature branch (`git checkout -b feature/amazing-feature`)
406
+ 3. Commit changes (`git commit -m 'Add amazing feature'`)
407
+ 4. Push to branch (`git push origin feature/amazing-feature`)
408
+ 5. Open Pull Request
409
+
410
+ ## License
411
+
412
+ MIT License - see [LICENSE](LICENSE) file
413
+
414
+ ## Support
415
+
416
+ - Documentation: [docs/](docs/)
417
+ - Issues: [GitHub Issues](https://github.com/gotza02/smartagent/issues)
418
+ - Discussions: [GitHub Discussions](https://github.com/gotza02/smartagent/discussions)
419
+
420
+ ---
421
+
422
+ **Built with ❤️ for the AI Engineering Community**
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Configuration Management System
3
+ * Centralized configuration with environment variable support
4
+ */
5
+ import type { SystemConfig } from "../types/index.js";
6
+ /**
7
+ * Configuration Manager Class
8
+ */
9
+ declare class ConfigManager {
10
+ private config;
11
+ private initialized;
12
+ constructor();
13
+ /**
14
+ * Load configuration from multiple sources
15
+ */
16
+ private loadConfig;
17
+ /**
18
+ * Apply environment variable overrides
19
+ */
20
+ private applyEnvironmentVariables;
21
+ /**
22
+ * Apply config file overrides
23
+ */
24
+ private applyConfigFile;
25
+ /**
26
+ * Deep merge two objects
27
+ */
28
+ private deepMerge;
29
+ /**
30
+ * Get current configuration
31
+ */
32
+ getConfig(): SystemConfig;
33
+ /**
34
+ * Get specific configuration value
35
+ */
36
+ get<K extends keyof SystemConfig>(key: K): SystemConfig[K];
37
+ /**
38
+ * Update configuration at runtime
39
+ */
40
+ updateConfig(updates: Partial<SystemConfig>): void;
41
+ /**
42
+ * Update specific configuration value
43
+ */
44
+ set<K extends keyof SystemConfig>(key: K, value: SystemConfig[K]): void;
45
+ /**
46
+ * Reset to default configuration
47
+ */
48
+ reset(): void;
49
+ /**
50
+ * Validate configuration
51
+ */
52
+ validate(): {
53
+ valid: boolean;
54
+ errors: string[];
55
+ };
56
+ /**
57
+ * Get configuration as JSON
58
+ */
59
+ toJSON(): string;
60
+ /**
61
+ * Initialize configuration
62
+ */
63
+ initialize(): void;
64
+ /**
65
+ * Check if initialized
66
+ */
67
+ isInitialized(): boolean;
68
+ }
69
+ export declare const configManager: ConfigManager;
70
+ export declare const config: SystemConfig;
71
+ export type { SystemConfig };
72
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,mBAAmB,CAAC;AAkFjE;;GAEG;AACH,cAAM,aAAa;IACjB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,WAAW,CAAS;;IAM5B;;OAEG;IACH,OAAO,CAAC,UAAU;IAalB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA2FjC;;OAEG;IACH,OAAO,CAAC,eAAe;IAkBvB;;OAEG;IACH,OAAO,CAAC,SAAS;IA4BjB;;OAEG;IACH,SAAS,IAAI,YAAY;IAIzB;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IAI1D;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAKlD;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAKvE;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,QAAQ,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IA2DhD;;OAEG;IACH,MAAM,IAAI,MAAM;IAIhB;;OAEG;IACH,UAAU,IAAI,IAAI;IAkBlB;;OAEG;IACH,aAAa,IAAI,OAAO;CAGzB;AAGD,eAAO,MAAM,aAAa,eAAsB,CAAC;AAGjD,eAAO,MAAM,MAAM,cAA4B,CAAC;AAGhD,YAAY,EAAE,YAAY,EAAE,CAAC"}