@vulcan-energy/mcp-helper 0.1.1

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 (74) hide show
  1. package/README.md +154 -0
  2. package/dist/bin/vulcan-mcp-helper.d.ts +9 -0
  3. package/dist/bin/vulcan-mcp-helper.d.ts.map +1 -0
  4. package/dist/bin/vulcan-mcp-helper.js +58 -0
  5. package/dist/bin/vulcan-mcp-helper.js.map +1 -0
  6. package/dist/src/engine/filesystem.d.ts +30 -0
  7. package/dist/src/engine/filesystem.d.ts.map +1 -0
  8. package/dist/src/engine/filesystem.js +61 -0
  9. package/dist/src/engine/filesystem.js.map +1 -0
  10. package/dist/src/engine/wasm.d.ts +23 -0
  11. package/dist/src/engine/wasm.d.ts.map +1 -0
  12. package/dist/src/engine/wasm.js +333 -0
  13. package/dist/src/engine/wasm.js.map +1 -0
  14. package/dist/src/engine/workspace.d.ts +23 -0
  15. package/dist/src/engine/workspace.d.ts.map +1 -0
  16. package/dist/src/engine/workspace.js +82 -0
  17. package/dist/src/engine/workspace.js.map +1 -0
  18. package/dist/src/server.d.ts +8 -0
  19. package/dist/src/server.d.ts.map +1 -0
  20. package/dist/src/server.js +166 -0
  21. package/dist/src/server.js.map +1 -0
  22. package/dist/src/tools/calculateMetrics.d.ts +31 -0
  23. package/dist/src/tools/calculateMetrics.d.ts.map +1 -0
  24. package/dist/src/tools/calculateMetrics.js +347 -0
  25. package/dist/src/tools/calculateMetrics.js.map +1 -0
  26. package/dist/src/tools/createBatchConfig.d.ts +25 -0
  27. package/dist/src/tools/createBatchConfig.d.ts.map +1 -0
  28. package/dist/src/tools/createBatchConfig.js +128 -0
  29. package/dist/src/tools/createBatchConfig.js.map +1 -0
  30. package/dist/src/tools/getBatchStatus.d.ts +23 -0
  31. package/dist/src/tools/getBatchStatus.d.ts.map +1 -0
  32. package/dist/src/tools/getBatchStatus.js +194 -0
  33. package/dist/src/tools/getBatchStatus.js.map +1 -0
  34. package/dist/src/tools/index.d.ts +67 -0
  35. package/dist/src/tools/index.d.ts.map +1 -0
  36. package/dist/src/tools/index.js +361 -0
  37. package/dist/src/tools/index.js.map +1 -0
  38. package/dist/src/tools/listBatchModels.d.ts +25 -0
  39. package/dist/src/tools/listBatchModels.d.ts.map +1 -0
  40. package/dist/src/tools/listBatchModels.js +86 -0
  41. package/dist/src/tools/listBatchModels.js.map +1 -0
  42. package/dist/src/tools/listCsvColumns.d.ts +27 -0
  43. package/dist/src/tools/listCsvColumns.d.ts.map +1 -0
  44. package/dist/src/tools/listCsvColumns.js +93 -0
  45. package/dist/src/tools/listCsvColumns.js.map +1 -0
  46. package/dist/src/tools/listParameters.d.ts +25 -0
  47. package/dist/src/tools/listParameters.d.ts.map +1 -0
  48. package/dist/src/tools/listParameters.js +64 -0
  49. package/dist/src/tools/listParameters.js.map +1 -0
  50. package/dist/src/tools/runBatch.d.ts +19 -0
  51. package/dist/src/tools/runBatch.d.ts.map +1 -0
  52. package/dist/src/tools/runBatch.js +90 -0
  53. package/dist/src/tools/runBatch.js.map +1 -0
  54. package/dist/src/tools/saveParameter.d.ts +23 -0
  55. package/dist/src/tools/saveParameter.d.ts.map +1 -0
  56. package/dist/src/tools/saveParameter.js +87 -0
  57. package/dist/src/tools/saveParameter.js.map +1 -0
  58. package/dist/src/tools/viewParameter.d.ts +18 -0
  59. package/dist/src/tools/viewParameter.d.ts.map +1 -0
  60. package/dist/src/tools/viewParameter.js +51 -0
  61. package/dist/src/tools/viewParameter.js.map +1 -0
  62. package/dist/src/utils/batchConfig.d.ts +32 -0
  63. package/dist/src/utils/batchConfig.d.ts.map +1 -0
  64. package/dist/src/utils/batchConfig.js +130 -0
  65. package/dist/src/utils/batchConfig.js.map +1 -0
  66. package/dist/src/utils/fileLoader.d.ts +21 -0
  67. package/dist/src/utils/fileLoader.d.ts.map +1 -0
  68. package/dist/src/utils/fileLoader.js +86 -0
  69. package/dist/src/utils/fileLoader.js.map +1 -0
  70. package/package.json +47 -0
  71. package/wasm/snippets/wasm-bindgen-rayon-38edf6e439f6d70d/src/workerHelpers.no-bundler.js +77 -0
  72. package/wasm/wasm_version.json +8 -0
  73. package/wasm/wasm_wrapper.js +1190 -0
  74. package/wasm/wasm_wrapper_bg.wasm +0 -0
@@ -0,0 +1,25 @@
1
+ import type { MCPConfig } from '../engine/workspace.js';
2
+ export interface ListBatchModelsArgs {
3
+ config_name: string;
4
+ }
5
+ export interface ModelInfo {
6
+ name: string;
7
+ csv_path?: string;
8
+ has_results: boolean;
9
+ }
10
+ export interface ListBatchModelsResult {
11
+ config_name: string;
12
+ models: ModelInfo[];
13
+ total_models: number;
14
+ output_dir: string;
15
+ error?: string;
16
+ }
17
+ /**
18
+ * List all model names from a completed batch run
19
+ *
20
+ * @param config - MCP config with workspace path
21
+ * @param args - Tool arguments { config_name }
22
+ * @returns List of model names that can be used in vulcan_calculate_metrics
23
+ */
24
+ export declare function listBatchModels(config: MCPConfig, args: ListBatchModelsArgs): Promise<ListBatchModelsResult>;
25
+ //# sourceMappingURL=listBatchModels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listBatchModels.d.ts","sourceRoot":"","sources":["../../../src/tools/listBatchModels.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGxD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,qBAAqB,CAAC,CAiFhC"}
@@ -0,0 +1,86 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import { pathExists } from '../engine/filesystem.js';
4
+ /**
5
+ * List all model names from a completed batch run
6
+ *
7
+ * @param config - MCP config with workspace path
8
+ * @param args - Tool arguments { config_name }
9
+ * @returns List of model names that can be used in vulcan_calculate_metrics
10
+ */
11
+ export async function listBatchModels(config, args) {
12
+ const { workspace } = config;
13
+ const { config_name } = args;
14
+ const outputDir = path.join(workspace, 'output');
15
+ const cleanConfigName = config_name.replace('.json', '');
16
+ const models = [];
17
+ const modelNamesSet = new Set();
18
+ try {
19
+ // Check in config-specific output directory
20
+ const configOutputDir = path.join(outputDir, cleanConfigName);
21
+ if (await pathExists(configOutputDir)) {
22
+ const files = await fs.readdir(configOutputDir);
23
+ for (const file of files) {
24
+ // Match pattern: {model_name}__core__results.csv or {model_name}__results.csv
25
+ const match = file.match(/^(.+?)__(?:core__)?results\.csv$/);
26
+ if (match && match[1]) {
27
+ const modelName = match[1];
28
+ if (!modelNamesSet.has(modelName)) {
29
+ modelNamesSet.add(modelName);
30
+ models.push({
31
+ name: modelName,
32
+ csv_path: path.join(configOutputDir, file),
33
+ has_results: true
34
+ });
35
+ }
36
+ }
37
+ }
38
+ }
39
+ // Also check in result_* directories
40
+ const filesInOutputDir = await fs.readdir(outputDir);
41
+ const resultDirs = filesInOutputDir.filter(f => f.startsWith(`result_${cleanConfigName}_`));
42
+ for (const resultDir of resultDirs) {
43
+ const resultDirPath = path.join(outputDir, resultDir);
44
+ try {
45
+ const files = await fs.readdir(resultDirPath);
46
+ for (const file of files) {
47
+ // Match pattern: {model_name}__core__results.csv or {model_name}__results.csv
48
+ const match = file.match(/^(.+?)__(?:core__)?results\.csv$/);
49
+ if (match && match[1]) {
50
+ const modelName = match[1];
51
+ if (!modelNamesSet.has(modelName)) {
52
+ modelNamesSet.add(modelName);
53
+ models.push({
54
+ name: modelName,
55
+ csv_path: path.join(resultDirPath, file),
56
+ has_results: true
57
+ });
58
+ }
59
+ }
60
+ }
61
+ }
62
+ catch (e) {
63
+ // Ignore errors reading individual result directories
64
+ console.warn(`Failed to read result directory ${resultDir}: ${e.message}`);
65
+ }
66
+ }
67
+ // Sort models by name for consistent ordering
68
+ models.sort((a, b) => a.name.localeCompare(b.name));
69
+ return {
70
+ config_name: cleanConfigName,
71
+ models,
72
+ total_models: models.length,
73
+ output_dir: outputDir
74
+ };
75
+ }
76
+ catch (error) {
77
+ return {
78
+ config_name: cleanConfigName,
79
+ models: [],
80
+ total_models: 0,
81
+ output_dir: outputDir,
82
+ error: `Failed to list models: ${error.message}`
83
+ };
84
+ }
85
+ }
86
+ //# sourceMappingURL=listBatchModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listBatchModels.js","sourceRoot":"","sources":["../../../src/tools/listBatchModels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { MCPConfig } from '../engine/workspace.js';
2
+ export interface ListCsvColumnsArgs {
3
+ config_name: string;
4
+ model_name: string;
5
+ }
6
+ export interface ColumnInfo {
7
+ name: string;
8
+ unit: string;
9
+ index: number;
10
+ }
11
+ export interface ListCsvColumnsResult {
12
+ config_name: string;
13
+ model_name: string;
14
+ columns: ColumnInfo[];
15
+ total_columns: number;
16
+ csv_path?: string;
17
+ error?: string;
18
+ }
19
+ /**
20
+ * List available columns from a CSV result file
21
+ *
22
+ * @param config - MCP config with workspace path
23
+ * @param args - Tool arguments { config_name, model_name }
24
+ * @returns List of columns with names and units
25
+ */
26
+ export declare function listCsvColumns(config: MCPConfig, args: ListCsvColumnsArgs): Promise<ListCsvColumnsResult>;
27
+ //# sourceMappingURL=listCsvColumns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listCsvColumns.d.ts","sourceRoot":"","sources":["../../../src/tools/listCsvColumns.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGxD,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,oBAAoB,CAAC,CA6F/B"}
@@ -0,0 +1,93 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import { pathExists } from '../engine/filesystem.js';
4
+ /**
5
+ * List available columns from a CSV result file
6
+ *
7
+ * @param config - MCP config with workspace path
8
+ * @param args - Tool arguments { config_name, model_name }
9
+ * @returns List of columns with names and units
10
+ */
11
+ export async function listCsvColumns(config, args) {
12
+ const { workspace } = config;
13
+ const { config_name, model_name } = args;
14
+ const outputDir = path.join(workspace, 'output');
15
+ const cleanConfigName = config_name.replace('.json', '');
16
+ // Try various paths for the CSV file
17
+ const potentialCsvPaths = [
18
+ path.join(outputDir, cleanConfigName, `${model_name}__core__results.csv`),
19
+ path.join(outputDir, cleanConfigName, `${model_name}__results.csv`),
20
+ ];
21
+ // Also check in result_* directories
22
+ try {
23
+ const filesInOutputDir = await fs.readdir(outputDir);
24
+ const resultDirs = filesInOutputDir.filter(f => f.startsWith(`result_${cleanConfigName}_`));
25
+ for (const resultDir of resultDirs) {
26
+ potentialCsvPaths.push(path.join(outputDir, resultDir, `${model_name}__core__results.csv`));
27
+ potentialCsvPaths.push(path.join(outputDir, resultDir, `${model_name}__results.csv`));
28
+ }
29
+ }
30
+ catch (e) {
31
+ // Ignore errors reading directory
32
+ }
33
+ let csvPath;
34
+ let csvContent;
35
+ for (const p of potentialCsvPaths) {
36
+ if (await pathExists(p)) {
37
+ csvPath = p;
38
+ try {
39
+ csvContent = await fs.readFile(csvPath, 'utf-8');
40
+ break;
41
+ }
42
+ catch (e) {
43
+ console.warn(`Failed to read CSV from ${p}: ${e.message}`);
44
+ }
45
+ }
46
+ }
47
+ if (!csvContent || !csvPath) {
48
+ return {
49
+ config_name: cleanConfigName,
50
+ model_name,
51
+ columns: [],
52
+ total_columns: 0,
53
+ error: `CSV file not found for model ${model_name}. Tried: ${potentialCsvPaths.join(', ')}`
54
+ };
55
+ }
56
+ // Parse CSV headers and units
57
+ const lines = csvContent.split('\n').filter(line => line.trim());
58
+ if (lines.length < 2) {
59
+ return {
60
+ config_name: cleanConfigName,
61
+ model_name,
62
+ columns: [],
63
+ total_columns: 0,
64
+ csv_path: csvPath,
65
+ error: 'CSV must have at least headers and units rows'
66
+ };
67
+ }
68
+ // Parse headers (row 1)
69
+ const headers = lines[0]?.split(',').map(h => h.trim()) || [];
70
+ // Parse units (row 2)
71
+ const units = lines[1]?.split(',').map(u => u.trim()) || [];
72
+ // Build column info (skip first column which is Timestep)
73
+ const columns = [];
74
+ for (let i = 1; i < headers.length; i++) {
75
+ const header = headers[i];
76
+ const unit = i < units.length ? units[i] : '';
77
+ if (header) {
78
+ columns.push({
79
+ name: header,
80
+ unit: unit || '',
81
+ index: i - 1 // 0-based index excluding Timestep
82
+ });
83
+ }
84
+ }
85
+ return {
86
+ config_name: cleanConfigName,
87
+ model_name,
88
+ columns,
89
+ total_columns: columns.length,
90
+ csv_path: csvPath
91
+ };
92
+ }
93
+ //# sourceMappingURL=listCsvColumns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listCsvColumns.js","sourceRoot":"","sources":["../../../src/tools/listCsvColumns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { MCPConfig } from '../engine/workspace.js';
2
+ interface ListParametersArgs {
3
+ category?: string;
4
+ }
5
+ interface ParameterInfo {
6
+ id: string;
7
+ name: string;
8
+ description: string;
9
+ category: string;
10
+ }
11
+ interface CategoryInfo {
12
+ category: string;
13
+ parameters: ParameterInfo[];
14
+ }
15
+ interface ListParametersResult {
16
+ catalog: Record<string, CategoryInfo>;
17
+ total_categories: number;
18
+ total_parameters: number;
19
+ }
20
+ /**
21
+ * List available parameter categories and their JSON snippets
22
+ */
23
+ export declare function listParameters(config: MCPConfig, args?: ListParametersArgs): Promise<ListParametersResult>;
24
+ export {};
25
+ //# sourceMappingURL=listParameters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listParameters.d.ts","sourceRoot":"","sources":["../../../src/tools/listParameters.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,YAAY;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,aAAa,EAAE,CAAC;CAC7B;AAED,UAAU,oBAAoB;IAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtC,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,oBAAoB,CAAC,CAuE/B"}
@@ -0,0 +1,64 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ /**
4
+ * List available parameter categories and their JSON snippets
5
+ */
6
+ export async function listParameters(config, args = {}) {
7
+ const { workspace } = config;
8
+ const { category: filterCategory } = args;
9
+ const batchParamsDir = path.join(workspace, 'input', 'batch_parameters');
10
+ // Read directory structure
11
+ const entries = await fs.readdir(batchParamsDir, { withFileTypes: true });
12
+ const catalog = {};
13
+ for (const entry of entries) {
14
+ if (!entry.isDirectory()) {
15
+ continue;
16
+ }
17
+ const categoryName = entry.name;
18
+ // If filtering by category, skip others
19
+ if (filterCategory && categoryName !== filterCategory) {
20
+ continue;
21
+ }
22
+ const categoryPath = path.join(batchParamsDir, categoryName);
23
+ const categoryFiles = await fs.readdir(categoryPath);
24
+ const parameters = [];
25
+ for (const file of categoryFiles) {
26
+ if (!file.endsWith('.json')) {
27
+ continue;
28
+ }
29
+ const parameterId = file.replace('.json', '');
30
+ const filePath = path.join(categoryPath, file);
31
+ try {
32
+ // Read JSON file to extract metadata
33
+ const content = await fs.readFile(filePath, 'utf-8');
34
+ const json = JSON.parse(content);
35
+ // Extract name and description if available
36
+ const name = json.name || parameterId;
37
+ const description = json.description || '';
38
+ parameters.push({
39
+ id: parameterId,
40
+ name,
41
+ description,
42
+ category: categoryName
43
+ });
44
+ }
45
+ catch (error) {
46
+ // Skip files that can't be parsed
47
+ const err = error;
48
+ console.error(`Failed to parse ${filePath}: ${err.message}`);
49
+ }
50
+ }
51
+ if (parameters.length > 0) {
52
+ catalog[categoryName] = {
53
+ category: categoryName,
54
+ parameters: parameters.sort((a, b) => a.name.localeCompare(b.name))
55
+ };
56
+ }
57
+ }
58
+ return {
59
+ catalog,
60
+ total_categories: Object.keys(catalog).length,
61
+ total_parameters: Object.values(catalog).reduce((sum, cat) => sum + cat.parameters.length, 0)
62
+ };
63
+ }
64
+ //# sourceMappingURL=listParameters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listParameters.js","sourceRoot":"","sources":["../../../src/tools/listParameters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { MCPConfig } from '../engine/workspace.js';
2
+ interface RunBatchArgs {
3
+ config_name: string;
4
+ job_id?: string;
5
+ }
6
+ interface RunBatchResult {
7
+ job_id: string;
8
+ status: 'started' | 'error';
9
+ message: string;
10
+ config_name?: string;
11
+ output_dir?: string;
12
+ error?: string;
13
+ }
14
+ /**
15
+ * Run a batch simulation configuration asynchronously
16
+ */
17
+ export declare function runBatch(config: MCPConfig, args: RunBatchArgs): Promise<RunBatchResult>;
18
+ export {};
19
+ //# sourceMappingURL=runBatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runBatch.d.ts","sourceRoot":"","sources":["../../../src/tools/runBatch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGxD,UAAU,YAAY;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,cAAc,CAAC,CAgGzB"}
@@ -0,0 +1,90 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import { randomUUID } from 'crypto';
4
+ import { initWasm, getWasmModule, setWorkspace } from '../engine/wasm.js';
5
+ /**
6
+ * Run a batch simulation configuration asynchronously
7
+ */
8
+ export async function runBatch(config, args) {
9
+ const { workspace } = config;
10
+ const { config_name, job_id } = args;
11
+ if (!config_name) {
12
+ throw new Error('config_name is required');
13
+ }
14
+ // Generate job ID with mcp_ prefix
15
+ const finalJobId = job_id || `mcp_${randomUUID()}`;
16
+ // Load batch config
17
+ const configFileName = config_name.endsWith('.json') ? config_name : `${config_name}.json`;
18
+ const configPath = path.join(workspace, 'input', 'batch_configs', configFileName);
19
+ let configContent;
20
+ try {
21
+ configContent = await fs.readFile(configPath, 'utf-8');
22
+ }
23
+ catch (error) {
24
+ const err = error;
25
+ if (err.code === 'ENOENT') {
26
+ throw new Error(`Batch config '${config_name}' not found at ${configPath}`);
27
+ }
28
+ throw new Error(`Failed to read config file: ${err.message}`);
29
+ }
30
+ // Initialize WASM if not already done
31
+ let wasm;
32
+ try {
33
+ await initWasm();
34
+ wasm = getWasmModule();
35
+ }
36
+ catch (error) {
37
+ const err = error;
38
+ return {
39
+ job_id: finalJobId,
40
+ status: 'error',
41
+ message: `WASM initialization failed: ${err.message}`,
42
+ error: err.message
43
+ };
44
+ }
45
+ if (!wasm.process_batch_config) {
46
+ return {
47
+ job_id: finalJobId,
48
+ status: 'error',
49
+ message: 'WASM process_batch_config function not available',
50
+ error: 'WASM function missing'
51
+ };
52
+ }
53
+ // Set workspace for file system bridge functions
54
+ setWorkspace(workspace);
55
+ // Prepare paths
56
+ const outputDir = path.join(workspace, 'output');
57
+ await fs.mkdir(outputDir, { recursive: true });
58
+ // Call WASM batch processing
59
+ // Note: process_batch_config expects: (config_json, project_root, output_dir, config_name, job_id)
60
+ try {
61
+ const resultJson = wasm.process_batch_config(configContent, workspace, outputDir, config_name.replace('.json', ''), finalJobId);
62
+ const result = JSON.parse(resultJson);
63
+ // Check if there was an error in the result
64
+ if (result.error) {
65
+ return {
66
+ job_id: finalJobId,
67
+ status: 'error',
68
+ message: `Batch execution failed: ${result.error}`,
69
+ error: result.error
70
+ };
71
+ }
72
+ return {
73
+ job_id: finalJobId,
74
+ status: 'started',
75
+ message: 'Batch execution started successfully',
76
+ config_name,
77
+ output_dir: outputDir
78
+ };
79
+ }
80
+ catch (error) {
81
+ const err = error;
82
+ return {
83
+ job_id: finalJobId,
84
+ status: 'error',
85
+ message: `Failed to start batch execution: ${err.message}`,
86
+ error: err.message
87
+ };
88
+ }
89
+ }
90
+ //# sourceMappingURL=runBatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runBatch.js","sourceRoot":"","sources":["../../../src/tools/runBatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { MCPConfig } from '../engine/workspace.js';
2
+ interface SaveParameterArgs {
3
+ category: string;
4
+ parameter_id: string;
5
+ content: any;
6
+ markdown_content?: string;
7
+ }
8
+ interface SaveParameterResult {
9
+ success: boolean;
10
+ valid: boolean;
11
+ errors: string[];
12
+ message: string;
13
+ paths?: {
14
+ json: string;
15
+ markdown: string | null;
16
+ };
17
+ }
18
+ /**
19
+ * Create or edit a parameter JSON snippet with validation
20
+ */
21
+ export declare function saveParameter(config: MCPConfig, args: SaveParameterArgs): Promise<SaveParameterResult>;
22
+ export {};
23
+ //# sourceMappingURL=saveParameter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saveParameter.d.ts","sourceRoot":"","sources":["../../../src/tools/saveParameter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAIxD,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,GAAG,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,mBAAmB;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;KACzB,CAAC;CACH;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,mBAAmB,CAAC,CAkG9B"}
@@ -0,0 +1,87 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import { initWasm, getWasmModule } from '../engine/wasm.js';
4
+ import { loadSchema, loadBaseline, loadSimplifiedExample, ensureDir } from '../utils/fileLoader.js';
5
+ /**
6
+ * Create or edit a parameter JSON snippet with validation
7
+ */
8
+ export async function saveParameter(config, args) {
9
+ const { workspace } = config;
10
+ const { category, parameter_id, content, markdown_content } = args;
11
+ if (!category) {
12
+ throw new Error('category is required');
13
+ }
14
+ if (!parameter_id) {
15
+ throw new Error('parameter_id is required');
16
+ }
17
+ if (!content) {
18
+ throw new Error('content is required');
19
+ }
20
+ // Validate JSON syntax
21
+ let jsonContent;
22
+ try {
23
+ jsonContent = typeof content === 'string' ? JSON.parse(content) : content;
24
+ }
25
+ catch (error) {
26
+ const err = error;
27
+ throw new Error(`Invalid JSON syntax: ${err.message}`);
28
+ }
29
+ // Initialize WASM if not already done
30
+ let wasm;
31
+ try {
32
+ await initWasm();
33
+ wasm = getWasmModule();
34
+ }
35
+ catch (error) {
36
+ const err = error;
37
+ throw new Error(`WASM initialization failed: ${err.message}`);
38
+ }
39
+ if (!wasm.validate_snippet_js) {
40
+ throw new Error('WASM validate_snippet_js function not available');
41
+ }
42
+ // Load required files for validation
43
+ const [schema, baseline, simplifiedExample] = await Promise.all([
44
+ loadSchema(workspace),
45
+ loadBaseline(workspace),
46
+ loadSimplifiedExample(workspace, category)
47
+ ]);
48
+ // Prepare validation inputs
49
+ const snippetJson = JSON.stringify(jsonContent);
50
+ const schemaJson = JSON.stringify(schema);
51
+ const baselineJson = JSON.stringify(baseline);
52
+ const simplifiedExampleJson = simplifiedExample ? JSON.stringify(simplifiedExample) : null;
53
+ // Call WASM validation
54
+ const validationResult = wasm.validate_snippet_js(category, snippetJson, schemaJson, baselineJson, simplifiedExampleJson);
55
+ const validation = JSON.parse(validationResult);
56
+ if (!validation.ok) {
57
+ return {
58
+ success: false,
59
+ valid: false,
60
+ errors: validation.errors.map((e) => e.message || String(e)),
61
+ message: `Validation failed: ${validation.errors.map((e) => e.message || String(e)).join('; ')}`
62
+ };
63
+ }
64
+ // Validation passed - save files
65
+ const paramDir = path.join(workspace, 'input', 'batch_parameters', category);
66
+ await ensureDir(paramDir);
67
+ const jsonPath = path.join(paramDir, `${parameter_id}.json`);
68
+ const jsonContentString = JSON.stringify(jsonContent, null, 2);
69
+ await fs.writeFile(jsonPath, jsonContentString, 'utf-8');
70
+ // Save markdown if provided
71
+ let markdownPath = null;
72
+ if (markdown_content) {
73
+ markdownPath = path.join(paramDir, `${parameter_id}.md`);
74
+ await fs.writeFile(markdownPath, markdown_content, 'utf-8');
75
+ }
76
+ return {
77
+ success: true,
78
+ valid: true,
79
+ errors: [],
80
+ message: `Parameter '${parameter_id}' saved successfully in category '${category}'`,
81
+ paths: {
82
+ json: jsonPath,
83
+ markdown: markdownPath
84
+ }
85
+ };
86
+ }
87
+ //# sourceMappingURL=saveParameter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saveParameter.js","sourceRoot":"","sources":["../../../src/tools/saveParameter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { MCPConfig } from '../engine/workspace.js';
2
+ interface ViewParameterArgs {
3
+ category: string;
4
+ parameter_id: string;
5
+ }
6
+ interface ViewParameterResult {
7
+ category: string;
8
+ parameter_id: string;
9
+ json: any;
10
+ markdown: string | null;
11
+ has_markdown: boolean;
12
+ }
13
+ /**
14
+ * View a specific parameter JSON snippet and its markdown documentation
15
+ */
16
+ export declare function viewParameter(config: MCPConfig, args: ViewParameterArgs): Promise<ViewParameterResult>;
17
+ export {};
18
+ //# sourceMappingURL=viewParameter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewParameter.d.ts","sourceRoot":"","sources":["../../../src/tools/viewParameter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,GAAG,CAAC;IACV,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,mBAAmB,CAAC,CAgD9B"}