@vulcan-energy/mcp-helper 0.1.2 → 0.1.3
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 +20 -0
- package/README.md +230 -77
- package/THIRD_PARTY_NOTICES.md +158 -0
- package/dist/bin/vulcan-mcp-helper.js +7 -2
- package/dist/bin/vulcan-mcp-helper.js.map +1 -1
- package/dist/src/engine/licenseKeys.d.ts +2 -0
- package/dist/src/engine/licenseKeys.d.ts.map +1 -0
- package/dist/src/engine/licenseKeys.js +9 -0
- package/dist/src/engine/licenseKeys.js.map +1 -0
- package/dist/src/engine/wasm.d.ts.map +1 -1
- package/dist/src/engine/wasm.js +16 -14
- package/dist/src/engine/wasm.js.map +1 -1
- package/dist/src/engine/workspace.d.ts +1 -1
- package/dist/src/engine/workspace.d.ts.map +1 -1
- package/dist/src/engine/workspace.js +60 -4
- package/dist/src/engine/workspace.js.map +1 -1
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +11 -5
- package/dist/src/server.js.map +1 -1
- package/dist/src/tools/calculateMetrics.d.ts.map +1 -1
- package/dist/src/tools/calculateMetrics.js +46 -12
- package/dist/src/tools/calculateMetrics.js.map +1 -1
- package/dist/src/tools/getBatchStatus.d.ts.map +1 -1
- package/dist/src/tools/getBatchStatus.js +4 -1
- package/dist/src/tools/getBatchStatus.js.map +1 -1
- package/dist/src/tools/index.d.ts +6 -0
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +37 -0
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/mergeCsvToJson.d.ts +27 -0
- package/dist/src/tools/mergeCsvToJson.d.ts.map +1 -0
- package/dist/src/tools/mergeCsvToJson.js +154 -0
- package/dist/src/tools/mergeCsvToJson.js.map +1 -0
- package/dist/src/utils/batchConfig.d.ts.map +1 -1
- package/dist/src/utils/batchConfig.js +13 -8
- package/dist/src/utils/batchConfig.js.map +1 -1
- package/dist/src/utils/fileLoader.d.ts +19 -1
- package/dist/src/utils/fileLoader.d.ts.map +1 -1
- package/dist/src/utils/fileLoader.js +75 -2
- package/dist/src/utils/fileLoader.js.map +1 -1
- package/dist/src/utils/tls.d.ts +7 -0
- package/dist/src/utils/tls.d.ts.map +1 -0
- package/dist/src/utils/tls.js +183 -0
- package/dist/src/utils/tls.js.map +1 -0
- package/package.json +8 -3
- package/wasm/wasm_version.json +4 -4
- package/wasm/wasm_wrapper.js +13 -5
- package/wasm/wasm_wrapper_bg.wasm +0 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
PROPRIETARY SOFTWARE LICENSE
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Home Energy Foundry Limited
|
|
4
|
+
|
|
5
|
+
This software and associated documentation files (the "Software") are the
|
|
6
|
+
proprietary and confidential information of Home Energy Foundry Limited. The Software
|
|
7
|
+
is licensed, not sold.
|
|
8
|
+
|
|
9
|
+
All rights reserved. No part of this Software may be reproduced, distributed,
|
|
10
|
+
or transmitted in any form or by any means, including photocopying, recording,
|
|
11
|
+
or other electronic or mechanical methods, without the prior written permission
|
|
12
|
+
of Home Energy Foundry Limited.
|
|
13
|
+
|
|
14
|
+
This Software is provided "AS IS" without warranty of any kind, either express
|
|
15
|
+
or implied, including but not limited to the implied warranties of
|
|
16
|
+
merchantability and fitness for a particular purpose.
|
|
17
|
+
|
|
18
|
+
For licensing inquiries, contact: info@usevulcan.app
|
|
19
|
+
|
|
20
|
+
|
package/README.md
CHANGED
|
@@ -1,154 +1,307 @@
|
|
|
1
|
-
# Vulcan MCP
|
|
1
|
+
# Vulcan MCP Helper
|
|
2
2
|
|
|
3
3
|
A Model Context Protocol (MCP) server that exposes Vulcan's core functionality for integration with Cursor and other MCP clients.
|
|
4
4
|
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
This MCP server provides access to Vulcan's parameter management, batch configuration, and simulation capabilities via stdio **or** Streamable HTTP (JSON-RPC over HTTP).
|
|
8
|
-
|
|
9
5
|
## Prerequisites
|
|
10
6
|
|
|
11
|
-
- Node.js
|
|
7
|
+
- **Node.js v18 or later** (must be installed separately - not included)
|
|
12
8
|
- A Vulcan workspace with FSA (File System Access) mode enabled
|
|
13
9
|
- A valid `vulcan-mcp-config.json` file (generated from Vulcan → Integrations → MCP)
|
|
14
10
|
|
|
15
11
|
## Installation
|
|
16
12
|
|
|
17
|
-
|
|
13
|
+
Install globally using npm:
|
|
18
14
|
|
|
19
15
|
```bash
|
|
20
|
-
|
|
21
|
-
npm install
|
|
16
|
+
npm install -g @vulcan-energy/mcp-helper
|
|
22
17
|
```
|
|
23
18
|
|
|
24
|
-
### Production Distribution
|
|
25
|
-
|
|
26
|
-
The server will be distributed via Vulcan website (behind authentication) for end users.
|
|
27
|
-
|
|
28
19
|
## Configuration
|
|
29
20
|
|
|
30
|
-
|
|
21
|
+
### Step 1: Download Config File
|
|
22
|
+
|
|
23
|
+
1. Open Vulcan web app
|
|
24
|
+
2. Log in to your account
|
|
25
|
+
3. Select a workspace in FSA (Folder) mode
|
|
26
|
+
4. Go to **Integrations → MCP**
|
|
27
|
+
5. Click **"Generate Config"**
|
|
31
28
|
|
|
29
|
+
This creates `vulcan-mcp-config.json` in your workspace root with:
|
|
32
30
|
```json
|
|
33
31
|
{
|
|
34
|
-
"workspace": "
|
|
35
|
-
"
|
|
32
|
+
"workspace": ".",
|
|
33
|
+
"license_token": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9..."
|
|
36
34
|
}
|
|
37
35
|
```
|
|
38
36
|
|
|
39
|
-
|
|
40
|
-
1. Logging into Vulcan
|
|
41
|
-
2. Selecting a workspace in FSA (Folder) mode
|
|
37
|
+
The `license_token` is valid for ~30 days. The helper verifies it locally on startup. If expired or invalid, you'll get an error message instructing you to refresh it in Vulcan.
|
|
42
38
|
|
|
43
|
-
|
|
39
|
+
### Step 2: Start the Server
|
|
44
40
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
#### Stdio mode (original)
|
|
41
|
+
From your workspace directory:
|
|
48
42
|
|
|
49
43
|
```bash
|
|
50
|
-
|
|
44
|
+
vulcan-mcp-helper
|
|
51
45
|
```
|
|
52
46
|
|
|
53
|
-
|
|
47
|
+
Or specify config and port:
|
|
54
48
|
|
|
55
|
-
**Using npm (easiest):**
|
|
56
49
|
```bash
|
|
57
|
-
|
|
58
|
-
npm start
|
|
50
|
+
vulcan-mcp-helper --config /path/to/vulcan-mcp-config.json --port 5000
|
|
59
51
|
```
|
|
60
52
|
|
|
61
|
-
**
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
53
|
+
**CLI Options:**
|
|
54
|
+
- `--config <path>` - Path to config file (default: `./vulcan-mcp-config.json`)
|
|
55
|
+
- `--port <port>` - Port to listen on (default: `5000`, or `HELPER_PORT` env var)
|
|
56
|
+
- `--help, -h` - Show help message
|
|
57
|
+
|
|
58
|
+
**Expected Output:**
|
|
59
|
+
```
|
|
60
|
+
[MCP Helper] Config loaded from: /path/to/vulcan-mcp-config.json
|
|
61
|
+
[MCP Helper] Workspace: /path/to/workspace
|
|
62
|
+
[MCP Helper] WASM initialized
|
|
63
|
+
[MCP Helper] Server running on http://127.0.0.1:5000
|
|
64
|
+
[MCP Helper] MCP endpoint: http://127.0.0.1:5000/mcp
|
|
65
65
|
```
|
|
66
66
|
|
|
67
|
-
### Cursor
|
|
67
|
+
### Step 3: Configure Cursor
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
Add to your Cursor MCP configuration (`~/.cursor/mcp.json` or Cursor settings):
|
|
70
70
|
|
|
71
71
|
```json
|
|
72
72
|
{
|
|
73
73
|
"mcpServers": {
|
|
74
74
|
"vulcan": {
|
|
75
|
-
"url": "http://127.0.0.1:
|
|
75
|
+
"url": "http://127.0.0.1:5000/mcp"
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
-
|
|
81
|
+
Restart Cursor to connect.
|
|
82
82
|
|
|
83
|
+
## Available Tools
|
|
84
|
+
|
|
85
|
+
The MCP helper provides 10 tools for managing parameters, batch configurations, and simulations. Tools are called via MCP protocol (automatically in Cursor) or via HTTP POST to `/mcp`.
|
|
86
|
+
|
|
87
|
+
### 1. `vulcan_list_parameters`
|
|
88
|
+
|
|
89
|
+
List available parameter categories and their parameter IDs.
|
|
90
|
+
|
|
91
|
+
**Parameters:**
|
|
92
|
+
- `category` (optional, string): Filter by category name (e.g., "base_json", "heat_source_wet", "controls")
|
|
93
|
+
|
|
94
|
+
**Example:**
|
|
95
|
+
```json
|
|
96
|
+
{"category": "heat_source_wet"}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 2. `vulcan_view_parameter`
|
|
100
|
+
|
|
101
|
+
View a specific parameter JSON snippet and documentation.
|
|
102
|
+
|
|
103
|
+
**Parameters:**
|
|
104
|
+
- `category` (required, string): Parameter category (e.g., "heat_source_wet", "controls", "base_json")
|
|
105
|
+
- `parameter_id` (required, string): Parameter ID (filename without .json extension)
|
|
106
|
+
|
|
107
|
+
**Example:**
|
|
108
|
+
```json
|
|
109
|
+
{"category": "heat_source_wet", "parameter_id": "hp"}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 3. `vulcan_save_parameter`
|
|
113
|
+
|
|
114
|
+
Create or edit a parameter with validation.
|
|
115
|
+
|
|
116
|
+
**Parameters:**
|
|
117
|
+
- `category` (required, string): Parameter category
|
|
118
|
+
- `parameter_id` (required, string): Parameter ID (filename without .json extension)
|
|
119
|
+
- `content` (required, object): Parameter JSON content
|
|
120
|
+
- `markdown_content` (optional, string): Optional markdown documentation
|
|
121
|
+
|
|
122
|
+
**Example:**
|
|
83
123
|
```json
|
|
84
124
|
{
|
|
85
|
-
"
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
125
|
+
"category": "heat_source_wet",
|
|
126
|
+
"parameter_id": "hp_custom",
|
|
127
|
+
"content": {"efficiency": 0.85, "type": "heat_pump"},
|
|
128
|
+
"markdown_content": "# Custom Heat Pump\n\nDescription..."
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 4. `vulcan_create_batch_config`
|
|
133
|
+
|
|
134
|
+
Create a batch simulation configuration.
|
|
135
|
+
|
|
136
|
+
**Parameters:**
|
|
137
|
+
- `config_name` (required, string): Configuration name (saved as {config_name}.json)
|
|
138
|
+
- `base_model` (required, string): Base model filename (without .json extension)
|
|
139
|
+
- `weather_file` (required, string): Weather file name (with or without .epw extension)
|
|
140
|
+
- `wrapper` (optional, string): Model wrapper (e.g., "fhs_compliance", "passthrough")
|
|
141
|
+
- `parameters` (required, object): Object mapping category to array of parameter IDs
|
|
142
|
+
|
|
143
|
+
**Example:**
|
|
144
|
+
```json
|
|
145
|
+
{
|
|
146
|
+
"config_name": "hp_vs_boiler",
|
|
147
|
+
"base_model": "demo_hp_annual",
|
|
148
|
+
"weather_file": "London-Gatwick-TMY",
|
|
149
|
+
"wrapper": "passthrough",
|
|
150
|
+
"parameters": {
|
|
151
|
+
"heat_source_wet": ["hp", "gas_boiler"],
|
|
152
|
+
"controls": ["standard_schedule"]
|
|
90
153
|
}
|
|
91
154
|
}
|
|
92
155
|
```
|
|
93
156
|
|
|
94
|
-
|
|
157
|
+
### 5. `vulcan_run_batch`
|
|
158
|
+
|
|
159
|
+
Run a batch configuration asynchronously.
|
|
160
|
+
|
|
161
|
+
**Parameters:**
|
|
162
|
+
- `config_name` (required, string): Configuration name (with or without .json extension)
|
|
163
|
+
- `job_id` (optional, string): Custom job ID (defaults to mcp_{uuid})
|
|
164
|
+
|
|
165
|
+
**Example:**
|
|
166
|
+
```json
|
|
167
|
+
{"config_name": "hp_vs_boiler"}
|
|
168
|
+
```
|
|
95
169
|
|
|
96
|
-
### `
|
|
170
|
+
### 6. `vulcan_get_batch_status`
|
|
97
171
|
|
|
98
|
-
|
|
172
|
+
Check status/progress of a batch run.
|
|
99
173
|
|
|
100
|
-
**
|
|
101
|
-
- `
|
|
174
|
+
**Parameters:**
|
|
175
|
+
- `job_id` (optional, string): Job ID returned from vulcan_run_batch
|
|
176
|
+
- `config_name` (optional, string): Configuration name (alternative to job_id)
|
|
102
177
|
|
|
103
|
-
**
|
|
104
|
-
- Catalog structure with categories and parameters
|
|
105
|
-
- Total counts
|
|
178
|
+
**Note:** Either `job_id` or `config_name` must be provided.
|
|
106
179
|
|
|
107
|
-
|
|
180
|
+
**Example:**
|
|
181
|
+
```json
|
|
182
|
+
{"config_name": "hp_vs_boiler"}
|
|
183
|
+
```
|
|
108
184
|
|
|
109
|
-
|
|
110
|
-
- Cost metrics are temporarily blocked in MCP until tariff data plumbing lands—requests containing cost metrics will return an actionable error.
|
|
111
|
-
- Results now include each metric’s `id`, `name`, `column`, and `function`, matching what you send from Cursor.
|
|
185
|
+
### 7. `vulcan_list_batch_models`
|
|
112
186
|
|
|
113
|
-
|
|
187
|
+
List all model names from a completed batch.
|
|
114
188
|
|
|
115
|
-
|
|
189
|
+
**Parameters:**
|
|
190
|
+
- `config_name` (required, string): Configuration name (with or without .json extension)
|
|
116
191
|
|
|
117
|
-
|
|
192
|
+
**Example:**
|
|
193
|
+
```json
|
|
194
|
+
{"config_name": "hp_vs_boiler"}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### 8. `vulcan_list_csv_columns`
|
|
198
|
+
|
|
199
|
+
List available columns from a CSV result file.
|
|
200
|
+
|
|
201
|
+
**Parameters:**
|
|
202
|
+
- `config_name` (required, string): Configuration name (with or without .json extension)
|
|
203
|
+
- `model_name` (required, string): Model name (e.g., "scenario_1_0")
|
|
204
|
+
|
|
205
|
+
**Example:**
|
|
206
|
+
```json
|
|
207
|
+
{"config_name": "hp_vs_boiler", "model_name": "scenario_1_0"}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### 9. `vulcan_calculate_metrics`
|
|
211
|
+
|
|
212
|
+
Calculate metrics (sum, average, peak, min, cost) from results.
|
|
213
|
+
|
|
214
|
+
**Parameters:**
|
|
215
|
+
- `config_name` (required, string): Configuration name (with or without .json extension)
|
|
216
|
+
- `model_names` (required, array): Array of model names to calculate metrics for
|
|
217
|
+
- `metric_definitions` (required, array): Array of metric definition objects:
|
|
218
|
+
- `id` (optional, string)
|
|
219
|
+
- `name` (optional, string)
|
|
220
|
+
- `column` (optional, string)
|
|
221
|
+
- `function` (optional, enum): "sum", "average", "peak", "min", "cost", "sumIf", "averageIf", "countIf"
|
|
222
|
+
- `comparator` (optional, string): For conditional metrics (">=", "<=", ">", "<", "=")
|
|
223
|
+
- `threshold` (optional, number): For conditional metrics
|
|
224
|
+
- `time_range` (optional, object): Time range filter
|
|
225
|
+
- `start` (optional, number): Start timestep
|
|
226
|
+
- `end` (optional, number): End timestep
|
|
227
|
+
- `tariff_file_path` (optional, string): Path to tariff CSV (required for cost metrics)
|
|
228
|
+
- `tariff_column_index` (optional, number): Zero-based index of tariff column (required for cost metrics)
|
|
229
|
+
|
|
230
|
+
**Example:**
|
|
118
231
|
```json
|
|
119
232
|
{
|
|
120
|
-
"
|
|
121
|
-
"
|
|
233
|
+
"config_name": "hp_vs_boiler",
|
|
234
|
+
"model_names": ["scenario_1_0", "scenario_1_1"],
|
|
235
|
+
"metric_definitions": [
|
|
236
|
+
{"name": "Total Electricity", "column": "Electricity", "function": "sum"},
|
|
237
|
+
{"name": "Peak Demand", "column": "Electricity", "function": "peak"}
|
|
238
|
+
]
|
|
122
239
|
}
|
|
123
240
|
```
|
|
124
241
|
|
|
125
|
-
|
|
126
|
-
```
|
|
127
|
-
|
|
242
|
+
**Example with cost metric:**
|
|
243
|
+
```json
|
|
244
|
+
{
|
|
245
|
+
"config_name": "hp_vs_boiler",
|
|
246
|
+
"model_names": ["scenario_1_0"],
|
|
247
|
+
"metric_definitions": [
|
|
248
|
+
{"name": "Energy Cost", "column": "Electricity", "function": "cost"}
|
|
249
|
+
],
|
|
250
|
+
"tariff_file_path": "input/tariff_data_structured/Octopus.csv",
|
|
251
|
+
"tariff_column_index": 2
|
|
252
|
+
}
|
|
128
253
|
```
|
|
129
254
|
|
|
130
|
-
|
|
255
|
+
### 10. `vulcan_merge_csv_to_json`
|
|
256
|
+
|
|
257
|
+
Convert geometry CSV files to JSON format.
|
|
258
|
+
|
|
259
|
+
**Parameters:**
|
|
260
|
+
- `csv_path` (required, string): Path to CSV file (relative to workspace or absolute)
|
|
261
|
+
- `output_path` (optional, string): Output JSON path (defaults to input/batch_parameters/base_json/{csv_filename}.json)
|
|
262
|
+
- `schema_path` (optional, string): Custom schema path (defaults to input_core_allowing_fhs.schema.json)
|
|
263
|
+
- `defaults_path` (optional, string): Custom defaults path (defaults to utility/defaults_template.json)
|
|
264
|
+
|
|
265
|
+
**Example:**
|
|
131
266
|
```json
|
|
132
|
-
{"
|
|
133
|
-
{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}
|
|
134
|
-
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"vulcan_list_parameters","arguments":{}}}
|
|
267
|
+
{"csv_path": "input/base_models/my_model.csv"}
|
|
135
268
|
```
|
|
136
269
|
|
|
137
|
-
##
|
|
270
|
+
## Error Messages
|
|
138
271
|
|
|
139
|
-
|
|
140
|
-
- When debugging, tail stderr (or pipe it to a file) to see WASM initialization and metrics parsing logs.
|
|
272
|
+
Common errors and what they mean:
|
|
141
273
|
|
|
142
|
-
|
|
274
|
+
- **`Config file not found: <path>`** - Config file missing. Generate it from Vulcan → Integrations → MCP
|
|
275
|
+
- **`Invalid JSON in config file`** - Config file is malformed. Regenerate from Vulcan
|
|
276
|
+
- **`Config file missing required field: workspace`** - Config file incomplete. Regenerate from Vulcan
|
|
277
|
+
- **`Your Vulcan MCP token is missing`** - Token not in config. Generate config from Vulcan
|
|
278
|
+
- **`Workspace directory not found: <path>`** - Workspace path in config is incorrect
|
|
279
|
+
- **`Workspace missing required directory: input/batch_parameters`** - Not a valid Vulcan workspace or not in FSA mode
|
|
280
|
+
- **`Your Vulcan MCP token has expired`** - Token expired (~30 days). Refresh in Vulcan → Integrations → MCP
|
|
281
|
+
- **`Your Vulcan MCP token is invalid`** - Token signature invalid. Refresh in Vulcan
|
|
282
|
+
- **`WASM initialization failed`** - WASM files missing or corrupted. Reinstall package
|
|
283
|
+
- **`Port argument is missing`** - Invalid `--port` usage. Use `--port <number>`
|
|
284
|
+
- **`Invalid port: <value>`** - Port must be 1-65535
|
|
285
|
+
|
|
286
|
+
## Testing
|
|
287
|
+
|
|
288
|
+
Test the server is running:
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
curl http://127.0.0.1:5000/health
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
Should return:
|
|
295
|
+
```json
|
|
296
|
+
{"status":"running","port":5000,"version":"0.1.3","name":"vulcan-mcp-helper"}
|
|
297
|
+
```
|
|
143
298
|
|
|
144
|
-
|
|
145
|
-
- **WASM**: Uses existing WASM bundle from `web/pkg/` (for validation, batch execution, metrics)
|
|
146
|
-
- **File Operations**: Node.js `fs` module for workspace file access
|
|
147
|
-
- **Protocol**: MCP via stdio (newline-delimited JSON-RPC) or Streamable HTTP (`POST /mcp`)
|
|
299
|
+
## Troubleshooting
|
|
148
300
|
|
|
149
|
-
|
|
301
|
+
- **Server won't start**: Check Node.js version (`node --version` must be v18+)
|
|
302
|
+
- **Config errors**: Ensure workspace is in FSA (Folder) mode, not OPFS
|
|
303
|
+
- **Token expired**: Refresh token in Vulcan → Integrations → MCP
|
|
304
|
+
- **Port in use**: Use `--port` to specify a different port
|
|
305
|
+
- **WASM errors**: Reinstall package: `npm install -g @vulcan-energy/mcp-helper`
|
|
150
306
|
|
|
151
|
-
- Additional tools: `vulcan_view_parameter`, `vulcan_save_parameter`, `vulcan_create_batch_config`, `vulcan_run_batch`, `vulcan_get_batch_status`, `vulcan_calculate_metrics`
|
|
152
|
-
- WASM integration for validation and batch execution
|
|
153
|
-
- Enhanced error handling and logging
|
|
154
307
|
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Third-Party Notices (Vulcan MCP Helper)
|
|
2
|
+
|
|
3
|
+
This package (`@vulcan-energy/mcp-helper`) is **proprietary software** (see `LICENSE`).
|
|
4
|
+
|
|
5
|
+
It also includes and/or depends on third-party software. This file is the starting point for tracking notices and license obligations.
|
|
6
|
+
|
|
7
|
+
## How to keep this accurate (recommended)
|
|
8
|
+
|
|
9
|
+
- Generate a full dependency license report at release time (CI or local) and update this file.
|
|
10
|
+
- Suggested tooling:
|
|
11
|
+
- Node: `license-checker` (or equivalent) against the exact production dependency tree
|
|
12
|
+
- If the published tarball includes bundled assets under `wasm/`, ensure those are also covered by notices
|
|
13
|
+
|
|
14
|
+
## Direct npm dependencies (from `package.json`)
|
|
15
|
+
|
|
16
|
+
The following packages are declared as direct dependencies:
|
|
17
|
+
|
|
18
|
+
- `@modelcontextprotocol/sdk`
|
|
19
|
+
- `cors`
|
|
20
|
+
- `express`
|
|
21
|
+
- `jose`
|
|
22
|
+
- `zod`
|
|
23
|
+
|
|
24
|
+
> Note: This section does **not** yet enumerate transitive dependencies. Use a license-report tool to produce the authoritative list for each release.
|
|
25
|
+
|
|
26
|
+
## Full production dependency license report
|
|
27
|
+
|
|
28
|
+
The following table was generated locally via:
|
|
29
|
+
|
|
30
|
+
- `cd vulcan-mcp-server`
|
|
31
|
+
- `npm install`
|
|
32
|
+
- `npx license-checker --production --json`
|
|
33
|
+
|
|
34
|
+
This is intended to be a **complete** list of production dependencies (including transitives) for the published npm package.
|
|
35
|
+
|
|
36
|
+
| Package | Version | License | Repository/Homepage |
|
|
37
|
+
|---|---:|---|---|
|
|
38
|
+
| @modelcontextprotocol/sdk | 1.22.0 | MIT | https://github.com/modelcontextprotocol/typescript-sdk |
|
|
39
|
+
| accepts | 1.3.8 | MIT | https://github.com/jshttp/accepts |
|
|
40
|
+
| accepts | 2.0.0 | MIT | https://github.com/jshttp/accepts |
|
|
41
|
+
| ajv | 8.17.1 | MIT | https://github.com/ajv-validator/ajv |
|
|
42
|
+
| ajv-formats | 3.0.1 | MIT | https://github.com/ajv-validator/ajv-formats |
|
|
43
|
+
| array-flatten | 1.1.1 | MIT | https://github.com/blakeembrey/array-flatten |
|
|
44
|
+
| body-parser | 1.20.3 | MIT | https://github.com/expressjs/body-parser |
|
|
45
|
+
| body-parser | 2.2.0 | MIT | https://github.com/expressjs/body-parser |
|
|
46
|
+
| bytes | 3.1.2 | MIT | https://github.com/visionmedia/bytes.js |
|
|
47
|
+
| call-bind-apply-helpers | 1.0.2 | MIT | https://github.com/ljharb/call-bind-apply-helpers |
|
|
48
|
+
| call-bound | 1.0.4 | MIT | https://github.com/ljharb/call-bound |
|
|
49
|
+
| content-disposition | 0.5.4 | MIT | https://github.com/jshttp/content-disposition |
|
|
50
|
+
| content-disposition | 1.0.1 | MIT | https://github.com/jshttp/content-disposition |
|
|
51
|
+
| content-type | 1.0.5 | MIT | https://github.com/jshttp/content-type |
|
|
52
|
+
| cookie | 0.7.1 | MIT | https://github.com/jshttp/cookie |
|
|
53
|
+
| cookie-signature | 1.0.6 | MIT | https://github.com/visionmedia/node-cookie-signature |
|
|
54
|
+
| cookie-signature | 1.2.2 | MIT | https://github.com/visionmedia/node-cookie-signature |
|
|
55
|
+
| cors | 2.8.5 | MIT | https://github.com/expressjs/cors |
|
|
56
|
+
| cross-spawn | 7.0.6 | MIT | https://github.com/moxystudio/node-cross-spawn |
|
|
57
|
+
| debug | 2.6.9 | MIT | https://github.com/visionmedia/debug |
|
|
58
|
+
| debug | 4.4.3 | MIT | https://github.com/debug-js/debug |
|
|
59
|
+
| depd | 2.0.0 | MIT | https://github.com/dougwilson/nodejs-depd |
|
|
60
|
+
| destroy | 1.2.0 | MIT | https://github.com/stream-utils/destroy |
|
|
61
|
+
| dunder-proto | 1.0.1 | MIT | https://github.com/es-shims/dunder-proto |
|
|
62
|
+
| ee-first | 1.1.1 | MIT | https://github.com/jonathanong/ee-first |
|
|
63
|
+
| encodeurl | 1.0.2 | MIT | https://github.com/pillarjs/encodeurl |
|
|
64
|
+
| encodeurl | 2.0.0 | MIT | https://github.com/pillarjs/encodeurl |
|
|
65
|
+
| es-define-property | 1.0.1 | MIT | https://github.com/ljharb/es-define-property |
|
|
66
|
+
| es-errors | 1.3.0 | MIT | https://github.com/ljharb/es-errors |
|
|
67
|
+
| es-object-atoms | 1.1.1 | MIT | https://github.com/ljharb/es-object-atoms |
|
|
68
|
+
| escape-html | 1.0.3 | MIT | https://github.com/component/escape-html |
|
|
69
|
+
| etag | 1.8.1 | MIT | https://github.com/jshttp/etag |
|
|
70
|
+
| eventsource | 3.0.7 | MIT | git://git@github.com/EventSource/eventsource |
|
|
71
|
+
| eventsource-parser | 3.0.6 | MIT | https://github.com/rexxars/eventsource-parser |
|
|
72
|
+
| express | 4.21.2 | MIT | https://github.com/expressjs/express |
|
|
73
|
+
| express | 5.1.0 | MIT | https://github.com/expressjs/express |
|
|
74
|
+
| express-rate-limit | 7.5.1 | MIT | https://github.com/express-rate-limit/express-rate-limit |
|
|
75
|
+
| fast-deep-equal | 3.1.3 | MIT | https://github.com/epoberezkin/fast-deep-equal |
|
|
76
|
+
| fast-uri | 3.1.0 | BSD-3-Clause | https://github.com/fastify/fast-uri |
|
|
77
|
+
| finalhandler | 1.3.1 | MIT | https://github.com/pillarjs/finalhandler |
|
|
78
|
+
| finalhandler | 2.1.0 | MIT | https://github.com/pillarjs/finalhandler |
|
|
79
|
+
| forwarded | 0.2.0 | MIT | https://github.com/jshttp/forwarded |
|
|
80
|
+
| fresh | 0.5.2 | MIT | https://github.com/jshttp/fresh |
|
|
81
|
+
| fresh | 2.0.0 | MIT | https://github.com/jshttp/fresh |
|
|
82
|
+
| function-bind | 1.1.2 | MIT | https://github.com/Raynos/function-bind |
|
|
83
|
+
| get-intrinsic | 1.3.0 | MIT | https://github.com/ljharb/get-intrinsic |
|
|
84
|
+
| get-proto | 1.0.1 | MIT | https://github.com/ljharb/get-proto |
|
|
85
|
+
| gopd | 1.2.0 | MIT | https://github.com/ljharb/gopd |
|
|
86
|
+
| has-symbols | 1.1.0 | MIT | https://github.com/inspect-js/has-symbols |
|
|
87
|
+
| hasown | 2.0.2 | MIT | https://github.com/inspect-js/hasOwn |
|
|
88
|
+
| http-errors | 2.0.0 | MIT | https://github.com/jshttp/http-errors |
|
|
89
|
+
| http-errors | 2.0.1 | MIT | https://github.com/jshttp/http-errors |
|
|
90
|
+
| iconv-lite | 0.4.24 | MIT | https://github.com/ashtuchkin/iconv-lite |
|
|
91
|
+
| iconv-lite | 0.6.3 | MIT | https://github.com/ashtuchkin/iconv-lite |
|
|
92
|
+
| iconv-lite | 0.7.0 | MIT | https://github.com/pillarjs/iconv-lite |
|
|
93
|
+
| inherits | 2.0.4 | ISC | https://github.com/isaacs/inherits |
|
|
94
|
+
| ipaddr.js | 1.9.1 | MIT | https://github.com/whitequark/ipaddr.js |
|
|
95
|
+
| is-promise | 4.0.0 | MIT | https://github.com/then/is-promise |
|
|
96
|
+
| isexe | 2.0.0 | ISC | https://github.com/isaacs/isexe |
|
|
97
|
+
| jose | 6.1.2 | MIT | https://github.com/panva/jose |
|
|
98
|
+
| json-schema-traverse | 1.0.0 | MIT | https://github.com/epoberezkin/json-schema-traverse |
|
|
99
|
+
| math-intrinsics | 1.1.0 | MIT | https://github.com/es-shims/math-intrinsics |
|
|
100
|
+
| media-typer | 0.3.0 | MIT | https://github.com/jshttp/media-typer |
|
|
101
|
+
| media-typer | 1.1.0 | MIT | https://github.com/jshttp/media-typer |
|
|
102
|
+
| merge-descriptors | 1.0.3 | MIT | https://github.com/sindresorhus/merge-descriptors |
|
|
103
|
+
| merge-descriptors | 2.0.0 | MIT | https://github.com/sindresorhus/merge-descriptors |
|
|
104
|
+
| methods | 1.1.2 | MIT | https://github.com/jshttp/methods |
|
|
105
|
+
| mime | 1.6.0 | MIT | https://github.com/broofa/node-mime |
|
|
106
|
+
| mime-db | 1.52.0 | MIT | https://github.com/jshttp/mime-db |
|
|
107
|
+
| mime-db | 1.54.0 | MIT | https://github.com/jshttp/mime-db |
|
|
108
|
+
| mime-types | 2.1.35 | MIT | https://github.com/jshttp/mime-types |
|
|
109
|
+
| mime-types | 3.0.2 | MIT | https://github.com/jshttp/mime-types |
|
|
110
|
+
| ms | 2.0.0 | MIT | https://github.com/zeit/ms |
|
|
111
|
+
| ms | 2.1.3 | MIT | https://github.com/vercel/ms |
|
|
112
|
+
| negotiator | 0.6.3 | MIT | https://github.com/jshttp/negotiator |
|
|
113
|
+
| negotiator | 1.0.0 | MIT | https://github.com/jshttp/negotiator |
|
|
114
|
+
| object-assign | 4.1.1 | MIT | https://github.com/sindresorhus/object-assign |
|
|
115
|
+
| object-inspect | 1.13.4 | MIT | https://github.com/inspect-js/object-inspect |
|
|
116
|
+
| on-finished | 2.4.1 | MIT | https://github.com/jshttp/on-finished |
|
|
117
|
+
| once | 1.4.0 | ISC | https://github.com/isaacs/once |
|
|
118
|
+
| parseurl | 1.3.3 | MIT | https://github.com/pillarjs/parseurl |
|
|
119
|
+
| path-key | 3.1.1 | MIT | https://github.com/sindresorhus/path-key |
|
|
120
|
+
| path-to-regexp | 0.1.12 | MIT | https://github.com/pillarjs/path-to-regexp |
|
|
121
|
+
| path-to-regexp | 8.3.0 | MIT | https://github.com/pillarjs/path-to-regexp |
|
|
122
|
+
| pkce-challenge | 5.0.1 | MIT | https://github.com/crouchcd/pkce-challenge |
|
|
123
|
+
| proxy-addr | 2.0.7 | MIT | https://github.com/jshttp/proxy-addr |
|
|
124
|
+
| qs | 6.13.0 | BSD-3-Clause | https://github.com/ljharb/qs |
|
|
125
|
+
| qs | 6.14.0 | BSD-3-Clause | https://github.com/ljharb/qs |
|
|
126
|
+
| range-parser | 1.2.1 | MIT | https://github.com/jshttp/range-parser |
|
|
127
|
+
| raw-body | 2.5.2 | MIT | https://github.com/stream-utils/raw-body |
|
|
128
|
+
| raw-body | 3.0.2 | MIT | https://github.com/stream-utils/raw-body |
|
|
129
|
+
| require-from-string | 2.0.2 | MIT | https://github.com/floatdrop/require-from-string |
|
|
130
|
+
| router | 2.2.0 | MIT | https://github.com/pillarjs/router |
|
|
131
|
+
| safe-buffer | 5.2.1 | MIT | https://github.com/feross/safe-buffer |
|
|
132
|
+
| safer-buffer | 2.1.2 | MIT | https://github.com/ChALkeR/safer-buffer |
|
|
133
|
+
| send | 0.19.0 | MIT | https://github.com/pillarjs/send |
|
|
134
|
+
| send | 1.2.0 | MIT | https://github.com/pillarjs/send |
|
|
135
|
+
| serve-static | 1.16.2 | MIT | https://github.com/expressjs/serve-static |
|
|
136
|
+
| serve-static | 2.2.0 | MIT | https://github.com/expressjs/serve-static |
|
|
137
|
+
| setprototypeof | 1.2.0 | ISC | https://github.com/wesleytodd/setprototypeof |
|
|
138
|
+
| shebang-command | 2.0.0 | MIT | https://github.com/kevva/shebang-command |
|
|
139
|
+
| shebang-regex | 3.0.0 | MIT | https://github.com/sindresorhus/shebang-regex |
|
|
140
|
+
| side-channel | 1.1.0 | MIT | https://github.com/ljharb/side-channel |
|
|
141
|
+
| side-channel-list | 1.0.0 | MIT | https://github.com/ljharb/side-channel-list |
|
|
142
|
+
| side-channel-map | 1.0.1 | MIT | https://github.com/ljharb/side-channel-map |
|
|
143
|
+
| side-channel-weakmap | 1.0.2 | MIT | https://github.com/ljharb/side-channel-weakmap |
|
|
144
|
+
| statuses | 2.0.1 | MIT | https://github.com/jshttp/statuses |
|
|
145
|
+
| statuses | 2.0.2 | MIT | https://github.com/jshttp/statuses |
|
|
146
|
+
| toidentifier | 1.0.1 | MIT | https://github.com/component/toidentifier |
|
|
147
|
+
| type-is | 1.6.18 | MIT | https://github.com/jshttp/type-is |
|
|
148
|
+
| type-is | 2.0.1 | MIT | https://github.com/jshttp/type-is |
|
|
149
|
+
| unpipe | 1.0.0 | MIT | https://github.com/stream-utils/unpipe |
|
|
150
|
+
| utils-merge | 1.0.1 | MIT | https://github.com/jaredhanson/utils-merge |
|
|
151
|
+
| vary | 1.1.2 | MIT | https://github.com/jshttp/vary |
|
|
152
|
+
| which | 2.0.2 | ISC | https://github.com/isaacs/node-which |
|
|
153
|
+
| wrappy | 1.0.2 | ISC | https://github.com/npm/wrappy |
|
|
154
|
+
| zod | 3.25.76 | MIT | https://github.com/colinhacks/zod |
|
|
155
|
+
| zod | 4.1.12 | MIT | https://github.com/colinhacks/zod |
|
|
156
|
+
| zod-to-json-schema | 3.25.0 | ISC | https://github.com/StefanTerdell/zod-to-json-schema |
|
|
157
|
+
|
|
158
|
+
|
|
@@ -15,9 +15,14 @@ function parseArgs() {
|
|
|
15
15
|
i++; // Skip next arg
|
|
16
16
|
}
|
|
17
17
|
else if (args[i] === '--port' && i + 1 < args.length) {
|
|
18
|
-
const
|
|
18
|
+
const portArg = args[i + 1];
|
|
19
|
+
if (!portArg) {
|
|
20
|
+
console.error('Port argument is missing');
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
const port = parseInt(portArg, 10);
|
|
19
24
|
if (isNaN(port) || port < 1 || port > 65535) {
|
|
20
|
-
console.error(`Invalid port: ${
|
|
25
|
+
console.error(`Invalid port: ${portArg}`);
|
|
21
26
|
process.exit(1);
|
|
22
27
|
}
|
|
23
28
|
result.port = port;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vulcan-mcp-helper.js","sourceRoot":"","sources":["../../bin/vulcan-mcp-helper.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,MAAM,GAA2C,EAAE,CAAC;IAE1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAClD,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,CAAC,EAAE,CAAC,CAAC,gBAAgB;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,
|
|
1
|
+
{"version":3,"file":"vulcan-mcp-helper.js","sourceRoot":"","sources":["../../bin/vulcan-mcp-helper.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,MAAM,GAA2C,EAAE,CAAC;IAE1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAClD,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,CAAC,EAAE,CAAC,CAAC,gBAAgB;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACvD,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;gBAC5C,OAAO,CAAC,KAAK,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC;gBAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;YACnB,CAAC,EAAE,CAAC,CAAC,gBAAgB;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;CAajB,CAAC,CAAC;YACG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,CAAC;QACzC,MAAM,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAc,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"licenseKeys.d.ts","sourceRoot":"","sources":["../../../src/engine/licenseKeys.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,eAAe,EAAE,MAAM,EAInC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Public keys used by the MCP helper to verify license_token signatures.
|
|
2
|
+
// These correspond to the private keys used by vulcan-website to issue MCP tokens.
|
|
3
|
+
// v1: single Ed25519 key, but we support an array to allow future rotation.
|
|
4
|
+
export const MCP_PUBLIC_KEYS = [
|
|
5
|
+
`-----BEGIN PUBLIC KEY-----
|
|
6
|
+
MCowBQYDK2VwAyEAOmr0DweQnQ2L747vGML7l/ieYywCQzrnd39idAZ2YK4=
|
|
7
|
+
-----END PUBLIC KEY-----`,
|
|
8
|
+
];
|
|
9
|
+
//# sourceMappingURL=licenseKeys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"licenseKeys.js","sourceRoot":"","sources":["../../../src/engine/licenseKeys.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,mFAAmF;AACnF,4EAA4E;AAE5E,MAAM,CAAC,MAAM,eAAe,GAAa;IACvC;;yBAEuB;CACxB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wasm.d.ts","sourceRoot":"","sources":["../../../src/engine/wasm.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,UAAU,UAAU;IAClB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9D,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"wasm.d.ts","sourceRoot":"","sources":["../../../src/engine/wasm.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,UAAU,UAAU;IAClB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9D,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AA+KD,wBAAsB,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,CAqLpD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAK1C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEpD"}
|