@jagilber-org/index-server 1.22.1 → 1.26.4
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/CHANGELOG.md +91 -2
- package/CODE_OF_CONDUCT.md +2 -0
- package/CONTRIBUTING.md +32 -2
- package/README.md +82 -19
- package/SECURITY.md +17 -5
- package/dist/config/dashboardConfig.d.ts +3 -0
- package/dist/config/dashboardConfig.js +3 -0
- package/dist/config/defaultValues.d.ts +1 -1
- package/dist/config/defaultValues.js +1 -1
- package/dist/config/featureConfig.d.ts +2 -0
- package/dist/config/featureConfig.js +6 -1
- package/dist/config/runtimeConfig.d.ts +1 -1
- package/dist/config/runtimeConfig.js +8 -9
- package/dist/dashboard/client/admin.html +170 -53
- package/dist/dashboard/client/css/admin.css +132 -0
- package/dist/dashboard/client/js/admin.auth.js +25 -11
- package/dist/dashboard/client/js/admin.config.js +1 -1
- package/dist/dashboard/client/js/admin.feedback.js +328 -0
- package/dist/dashboard/client/js/admin.graph.js +120 -18
- package/dist/dashboard/client/js/admin.instructions.js +27 -13
- package/dist/dashboard/client/js/admin.logs.js +1 -5
- package/dist/dashboard/client/js/admin.maintenance.js +53 -8
- package/dist/dashboard/client/js/admin.messaging.js +1 -4
- package/dist/dashboard/client/js/admin.overview.js +5 -1
- package/dist/dashboard/client/js/admin.sessions.js +1 -1
- package/dist/dashboard/client/js/admin.utils.js +43 -1
- package/dist/dashboard/client/js/mermaid.min.js +813 -537
- package/dist/dashboard/export/DataExporter.js +2 -1
- package/dist/dashboard/server/AdminPanel.d.ts +3 -0
- package/dist/dashboard/server/AdminPanel.js +132 -35
- package/dist/dashboard/server/ApiRoutes.js +40 -9
- package/dist/dashboard/server/DashboardServer.js +1 -1
- package/dist/dashboard/server/FileMetricsStorage.d.ts +19 -0
- package/dist/dashboard/server/FileMetricsStorage.js +52 -5
- package/dist/dashboard/server/HttpTransport.js +6 -0
- package/dist/dashboard/server/InstanceManager.js +7 -2
- package/dist/dashboard/server/KnowledgeStore.js +7 -2
- package/dist/dashboard/server/MetricsCollector.d.ts +16 -0
- package/dist/dashboard/server/MetricsCollector.js +113 -17
- package/dist/dashboard/server/legacyDashboardHtml.js +7 -2
- package/dist/dashboard/server/middleware/ensureLoadedMiddleware.d.ts +1 -1
- package/dist/dashboard/server/middleware/ensureLoadedMiddleware.js +8 -3
- package/dist/dashboard/server/routes/admin.feedback.routes.d.ts +15 -0
- package/dist/dashboard/server/routes/admin.feedback.routes.js +188 -0
- package/dist/dashboard/server/routes/admin.routes.js +35 -27
- package/dist/dashboard/server/routes/alerts.routes.js +4 -3
- package/dist/dashboard/server/routes/api.feedback.routes.js +2 -1
- package/dist/dashboard/server/routes/api.usage.routes.js +8 -7
- package/dist/dashboard/server/routes/embeddings.routes.d.ts +2 -1
- package/dist/dashboard/server/routes/embeddings.routes.js +18 -9
- package/dist/dashboard/server/routes/graph.routes.js +10 -13
- package/dist/dashboard/server/routes/index.d.ts +1 -0
- package/dist/dashboard/server/routes/index.js +74 -39
- package/dist/dashboard/server/routes/instances.routes.js +2 -1
- package/dist/dashboard/server/routes/instructions.routes.js +46 -27
- package/dist/dashboard/server/routes/knowledge.routes.js +4 -3
- package/dist/dashboard/server/routes/logs.routes.js +5 -4
- package/dist/dashboard/server/routes/messaging.routes.js +15 -14
- package/dist/dashboard/server/routes/metrics.routes.js +14 -13
- package/dist/dashboard/server/routes/scripts.routes.js +6 -3
- package/dist/dashboard/server/routes/status.routes.js +5 -4
- package/dist/dashboard/server/routes/synthetic.routes.js +3 -2
- package/dist/dashboard/server/routes/usage.routes.js +2 -1
- package/dist/dashboard/server/utils/escapeHtml.d.ts +1 -0
- package/dist/dashboard/server/utils/escapeHtml.js +11 -0
- package/dist/dashboard/server/utils/pathContainment.d.ts +1 -0
- package/dist/dashboard/server/utils/pathContainment.js +15 -0
- package/dist/dashboard/server/wsInit.js +2 -2
- package/dist/lib/mcpStdioLogging.d.ts +165 -0
- package/dist/lib/mcpStdioLogging.js +287 -0
- package/dist/schemas/index.d.ts +37 -2
- package/dist/schemas/index.js +27 -3
- package/dist/server/backgroundServicesStartup.d.ts +7 -1
- package/dist/server/backgroundServicesStartup.js +25 -8
- package/dist/server/certInit.d.ts +97 -0
- package/dist/server/certInit.js +359 -0
- package/dist/server/certInit.types.d.ts +92 -0
- package/dist/server/certInit.types.js +34 -0
- package/dist/server/handshake/fallbackFrames.d.ts +31 -0
- package/dist/server/handshake/fallbackFrames.js +38 -0
- package/dist/server/handshake/initializeDetector.d.ts +31 -0
- package/dist/server/handshake/initializeDetector.js +88 -0
- package/dist/server/handshake/protocol.d.ts +15 -0
- package/dist/server/handshake/protocol.js +37 -0
- package/dist/server/handshake/readyEmitter.d.ts +6 -0
- package/dist/server/handshake/readyEmitter.js +88 -0
- package/dist/server/handshake/safetyFallbacks.d.ts +1 -0
- package/dist/server/handshake/safetyFallbacks.js +134 -0
- package/dist/server/handshake/stdinSniffer.d.ts +1 -0
- package/dist/server/handshake/stdinSniffer.js +260 -0
- package/dist/server/handshake/tracing.d.ts +16 -0
- package/dist/server/handshake/tracing.js +95 -0
- package/dist/server/handshakeManager.d.ts +23 -23
- package/dist/server/handshakeManager.js +36 -466
- package/dist/server/index-server.d.ts +23 -0
- package/dist/server/index-server.js +194 -9
- package/dist/server/mcpReadOnlySurfaces.d.ts +44 -0
- package/dist/server/mcpReadOnlySurfaces.js +297 -0
- package/dist/server/sdkServer.js +69 -7
- package/dist/server/transport.d.ts +5 -6
- package/dist/server/transport.js +46 -64
- package/dist/server/transportFactory.d.ts +3 -9
- package/dist/server/transportFactory.js +18 -380
- package/dist/services/atomicFs.d.ts +3 -0
- package/dist/services/atomicFs.js +171 -13
- package/dist/services/auditLog.d.ts +17 -2
- package/dist/services/auditLog.js +75 -14
- package/dist/services/bootstrapGating.js +1 -1
- package/dist/services/categoryRules.d.ts +10 -0
- package/dist/services/categoryRules.js +17 -0
- package/dist/services/classificationService.js +7 -5
- package/dist/services/embeddingService.d.ts +27 -11
- package/dist/services/embeddingService.js +51 -14
- package/dist/services/feedbackStorage.d.ts +39 -0
- package/dist/services/feedbackStorage.js +88 -0
- package/dist/services/handlers/instructions.add.js +429 -317
- package/dist/services/handlers/instructions.groom.js +128 -31
- package/dist/services/handlers/instructions.import.js +56 -23
- package/dist/services/handlers/instructions.patch.js +43 -32
- package/dist/services/handlers/instructions.query.js +20 -29
- package/dist/services/handlers/instructions.shared.d.ts +54 -0
- package/dist/services/handlers/instructions.shared.js +126 -1
- package/dist/services/handlers.activation.js +83 -81
- package/dist/services/handlers.dashboardConfig.d.ts +2 -2
- package/dist/services/handlers.dashboardConfig.js +1 -2
- package/dist/services/handlers.diagnostics.js +75 -54
- package/dist/services/handlers.feedback.d.ts +4 -11
- package/dist/services/handlers.feedback.js +11 -333
- package/dist/services/handlers.gates.js +69 -37
- package/dist/services/handlers.graph.js +2 -2
- package/dist/services/handlers.help.js +2 -2
- package/dist/services/handlers.instructionSchema.js +4 -2
- package/dist/services/handlers.integrity.js +42 -22
- package/dist/services/handlers.messaging.js +1 -1
- package/dist/services/handlers.metrics.js +51 -6
- package/dist/services/handlers.prompt.js +10 -2
- package/dist/services/handlers.search.js +94 -44
- package/dist/services/handlers.trace.js +1 -1
- package/dist/services/handlers.usage.js +38 -7
- package/dist/services/indexContext.d.ts +21 -1
- package/dist/services/indexContext.js +263 -78
- package/dist/services/indexLoader.d.ts +1 -0
- package/dist/services/indexLoader.js +28 -8
- package/dist/services/instructionRecordValidation.d.ts +39 -0
- package/dist/services/instructionRecordValidation.js +388 -0
- package/dist/services/instructions.dispatcher.js +4 -4
- package/dist/services/loaderSchemaValidator.d.ts +15 -0
- package/dist/services/loaderSchemaValidator.js +69 -0
- package/dist/services/logger.js +11 -2
- package/dist/services/mcpLogBridge.d.ts +49 -0
- package/dist/services/mcpLogBridge.js +83 -0
- package/dist/services/ownershipService.js +18 -8
- package/dist/services/performanceBaseline.js +23 -22
- package/dist/services/promptReviewService.d.ts +3 -1
- package/dist/services/promptReviewService.js +41 -13
- package/dist/services/regexSafety.d.ts +6 -0
- package/dist/services/regexSafety.js +46 -0
- package/dist/services/seedBootstrap.js +1 -1
- package/dist/services/storage/factory.d.ts +14 -1
- package/dist/services/storage/factory.js +61 -1
- package/dist/services/storage/jsonEmbeddingStore.d.ts +15 -0
- package/dist/services/storage/jsonEmbeddingStore.js +83 -0
- package/dist/services/storage/jsonFileStore.d.ts +3 -1
- package/dist/services/storage/jsonFileStore.js +8 -6
- package/dist/services/storage/migrationEngine.d.ts +13 -0
- package/dist/services/storage/migrationEngine.js +31 -0
- package/dist/services/storage/sqliteEmbeddingStore.d.ts +30 -0
- package/dist/services/storage/sqliteEmbeddingStore.js +222 -0
- package/dist/services/storage/sqliteStore.d.ts +3 -1
- package/dist/services/storage/sqliteStore.js +2 -2
- package/dist/services/storage/types.d.ts +48 -1
- package/dist/services/toolRegistry.js +77 -67
- package/dist/services/toolRegistry.zod.js +89 -86
- package/dist/services/tracing.js +5 -4
- package/dist/utils/envUtils.d.ts +4 -0
- package/dist/utils/envUtils.js +7 -0
- package/dist/utils/memoryMonitor.js +11 -10
- package/package.json +12 -4
- package/schemas/instruction.schema.json +38 -1
- package/scripts/copy-dashboard-assets.mjs +1 -1
- package/scripts/dist/README.md +1 -1
- package/scripts/generate-certs.mjs +201 -0
- package/scripts/setup-wizard.mjs +781 -0
- package/server.json +20 -0
- package/dist/externalClientLib.d.ts +0 -1
- package/dist/externalClientLib.js +0 -2
- package/dist/portableClientWrapper.d.ts +0 -1
- package/dist/portableClientWrapper.js +0 -2
- package/dist/services/indexingService.d.ts +0 -1
- package/dist/services/indexingService.js +0 -2
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* generate-certs.mjs — Generate self-signed TLS certificates for Index Server.
|
|
4
|
+
*
|
|
5
|
+
* Creates a CA + server certificate pair in ./certs/ for HTTPS dashboard access.
|
|
6
|
+
* For production, replace with certificates from a real CA.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* node scripts/generate-certs.mjs [--hostname <name>] [--days <n>] [--output <dir>]
|
|
10
|
+
*/
|
|
11
|
+
import { execFileSync } from 'child_process';
|
|
12
|
+
import fs from 'fs';
|
|
13
|
+
import path from 'path';
|
|
14
|
+
import { fileURLToPath } from 'url';
|
|
15
|
+
|
|
16
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
17
|
+
const ROOT = path.resolve(__dirname, '..');
|
|
18
|
+
|
|
19
|
+
function parseArgs() {
|
|
20
|
+
const args = process.argv.slice(2);
|
|
21
|
+
const config = {
|
|
22
|
+
hostname: 'localhost',
|
|
23
|
+
days: 365,
|
|
24
|
+
outputDir: path.join(ROOT, 'certs'),
|
|
25
|
+
keySize: 4096,
|
|
26
|
+
};
|
|
27
|
+
for (let i = 0; i < args.length; i++) {
|
|
28
|
+
if (args[i] === '--hostname' && args[i + 1]) config.hostname = args[++i];
|
|
29
|
+
else if (args[i] === '--days' && args[i + 1]) config.days = parseInt(args[++i], 10);
|
|
30
|
+
else if (args[i] === '--output' && args[i + 1]) config.outputDir = path.resolve(args[++i]);
|
|
31
|
+
else if (args[i] === '--key-size' && args[i + 1]) config.keySize = parseInt(args[++i], 10);
|
|
32
|
+
else if (args[i] === '--help') {
|
|
33
|
+
console.log(`Usage: generate-certs.mjs [options]
|
|
34
|
+
--hostname <name> Server hostname (default: localhost)
|
|
35
|
+
--days <n> Certificate validity in days (default: 365)
|
|
36
|
+
--output <dir> Output directory (default: ./certs)
|
|
37
|
+
--key-size <bits> RSA key size (default: 4096)`);
|
|
38
|
+
process.exit(0);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return config;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const WELL_KNOWN_OPENSSL_DIRS = [
|
|
45
|
+
'C:\\Program Files\\Git\\usr\\bin',
|
|
46
|
+
'C:\\Program Files (x86)\\Git\\usr\\bin',
|
|
47
|
+
'C:\\Program Files\\OpenSSL-Win64\\bin',
|
|
48
|
+
'C:\\Program Files\\OpenSSL\\bin',
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
function checkOpenssl() {
|
|
52
|
+
try {
|
|
53
|
+
execFileSync('openssl', ['version'], { stdio: 'pipe' });
|
|
54
|
+
return true;
|
|
55
|
+
} catch {
|
|
56
|
+
// Try well-known paths on Windows
|
|
57
|
+
for (const dir of WELL_KNOWN_OPENSSL_DIRS) {
|
|
58
|
+
const exe = path.join(dir, 'openssl.exe');
|
|
59
|
+
if (fs.existsSync(exe)) {
|
|
60
|
+
console.log(`ℹ️ Found OpenSSL at: ${dir}`);
|
|
61
|
+
process.env.PATH = `${dir}${path.delimiter}${process.env.PATH}`;
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function runOpenSsl(args, options = {}) {
|
|
70
|
+
execFileSync('openssl', args, { stdio: 'pipe', ...options });
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function generateCerts(config) {
|
|
74
|
+
const { hostname, days, outputDir, keySize } = config;
|
|
75
|
+
|
|
76
|
+
// Validate hostname to prevent command injection via -subj parameter
|
|
77
|
+
if (!/^[a-zA-Z0-9._-]+$/.test(hostname)) {
|
|
78
|
+
console.error(`❌ Invalid hostname: "${hostname}". Only alphanumeric, dots, hyphens, and underscores allowed.`);
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
if (!Number.isInteger(days) || days < 1 || days > 3650) {
|
|
82
|
+
console.error(`❌ Invalid days value: "${days}". Expected an integer between 1 and 3650.`);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
if (!Number.isInteger(keySize) || ![2048, 3072, 4096].includes(keySize)) {
|
|
86
|
+
console.error(`❌ Invalid key size: "${keySize}". Allowed values: 2048, 3072, 4096.`);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Ensure output directory exists
|
|
91
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
92
|
+
|
|
93
|
+
const caKeyPath = path.join(outputDir, 'ca.key');
|
|
94
|
+
const caCertPath = path.join(outputDir, 'ca.crt');
|
|
95
|
+
const serverKeyPath = path.join(outputDir, 'server.key');
|
|
96
|
+
const serverCsrPath = path.join(outputDir, 'server.csr');
|
|
97
|
+
const serverCertPath = path.join(outputDir, 'server.crt');
|
|
98
|
+
const extPath = path.join(outputDir, 'server.ext');
|
|
99
|
+
const cnfPath = path.join(outputDir, 'openssl.cnf');
|
|
100
|
+
|
|
101
|
+
console.log(`\n🔐 Generating TLS certificates for: ${hostname}`);
|
|
102
|
+
console.log(` Output: ${outputDir}`);
|
|
103
|
+
console.log(` Validity: ${days} days`);
|
|
104
|
+
console.log(` Key size: ${keySize} bits\n`);
|
|
105
|
+
|
|
106
|
+
// Create a minimal openssl config to avoid system config issues (Windows compat)
|
|
107
|
+
const cnfContent = `[req]
|
|
108
|
+
distinguished_name = req_dn
|
|
109
|
+
prompt = no
|
|
110
|
+
|
|
111
|
+
[req_dn]
|
|
112
|
+
C = US
|
|
113
|
+
ST = Dev
|
|
114
|
+
L = Local
|
|
115
|
+
O = IndexServer
|
|
116
|
+
`;
|
|
117
|
+
fs.writeFileSync(cnfPath, cnfContent, 'utf8');
|
|
118
|
+
const cnfEnv = { ...process.env, OPENSSL_CONF: cnfPath };
|
|
119
|
+
|
|
120
|
+
// Step 1: Generate CA private key
|
|
121
|
+
console.log('1/5 Generating CA private key...');
|
|
122
|
+
runOpenSsl(['genrsa', '-out', caKeyPath, String(keySize)], { env: cnfEnv });
|
|
123
|
+
|
|
124
|
+
// Step 2: Generate CA certificate
|
|
125
|
+
console.log('2/5 Generating CA certificate...');
|
|
126
|
+
runOpenSsl([
|
|
127
|
+
'req', '-x509', '-new', '-nodes', '-key', caKeyPath, '-sha256', '-days', String(days),
|
|
128
|
+
'-subj', '/C=US/ST=Dev/L=Local/O=IndexServer/OU=Dev/CN=IndexServerCA',
|
|
129
|
+
'-config', cnfPath, '-out', caCertPath,
|
|
130
|
+
], { env: cnfEnv });
|
|
131
|
+
|
|
132
|
+
// Step 3: Generate server private key
|
|
133
|
+
console.log('3/5 Generating server private key...');
|
|
134
|
+
runOpenSsl(['genrsa', '-out', serverKeyPath, String(keySize)], { env: cnfEnv });
|
|
135
|
+
|
|
136
|
+
// Step 4: Generate server CSR
|
|
137
|
+
console.log('4/5 Generating server CSR...');
|
|
138
|
+
runOpenSsl([
|
|
139
|
+
'req', '-new', '-key', serverKeyPath,
|
|
140
|
+
'-subj', `/C=US/ST=Dev/L=Local/O=IndexServer/OU=Server/CN=${hostname}`,
|
|
141
|
+
'-config', cnfPath, '-out', serverCsrPath,
|
|
142
|
+
], { env: cnfEnv });
|
|
143
|
+
|
|
144
|
+
// Step 5: Create extensions file and sign server cert
|
|
145
|
+
console.log('5/5 Signing server certificate...');
|
|
146
|
+
const extContent = `authorityKeyIdentifier=keyid,issuer
|
|
147
|
+
basicConstraints=CA:FALSE
|
|
148
|
+
keyUsage=digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
|
|
149
|
+
subjectAltName=@alt_names
|
|
150
|
+
|
|
151
|
+
[alt_names]
|
|
152
|
+
DNS.1=${hostname}
|
|
153
|
+
DNS.2=*.${hostname}
|
|
154
|
+
IP.1=127.0.0.1
|
|
155
|
+
IP.2=::1`;
|
|
156
|
+
|
|
157
|
+
fs.writeFileSync(extPath, extContent, 'utf8');
|
|
158
|
+
|
|
159
|
+
runOpenSsl([
|
|
160
|
+
'x509', '-req', '-in', serverCsrPath, '-CA', caCertPath, '-CAkey', caKeyPath,
|
|
161
|
+
'-CAcreateserial', '-out', serverCertPath, '-days', String(days), '-sha256', '-extfile', extPath,
|
|
162
|
+
], { env: cnfEnv });
|
|
163
|
+
|
|
164
|
+
// Cleanup intermediate files
|
|
165
|
+
try { fs.unlinkSync(serverCsrPath); } catch { /* ok */ }
|
|
166
|
+
try { fs.unlinkSync(extPath); } catch { /* ok */ }
|
|
167
|
+
try { fs.unlinkSync(cnfPath); } catch { /* ok */ }
|
|
168
|
+
try { fs.unlinkSync(path.join(outputDir, 'ca.srl')); } catch { /* ok */ }
|
|
169
|
+
|
|
170
|
+
// Set restrictive permissions on private keys
|
|
171
|
+
try {
|
|
172
|
+
fs.chmodSync(caKeyPath, 0o600);
|
|
173
|
+
fs.chmodSync(serverKeyPath, 0o600);
|
|
174
|
+
} catch { /* Windows doesn't support chmod */ }
|
|
175
|
+
|
|
176
|
+
console.log('\n✅ TLS certificates generated successfully:');
|
|
177
|
+
console.log(` CA cert: ${caCertPath}`);
|
|
178
|
+
console.log(` Server cert: ${serverCertPath}`);
|
|
179
|
+
console.log(` Server key: ${serverKeyPath}`);
|
|
180
|
+
console.log(` CA key: ${caKeyPath}`);
|
|
181
|
+
console.log('\nTo use with Docker:');
|
|
182
|
+
console.log(' docker compose --profile tls up -d');
|
|
183
|
+
console.log('\nTo use standalone:');
|
|
184
|
+
console.log(` INDEX_SERVER_DASHBOARD_TLS=1 \\`);
|
|
185
|
+
console.log(` INDEX_SERVER_DASHBOARD_TLS_CERT=${serverCertPath} \\`);
|
|
186
|
+
console.log(` INDEX_SERVER_DASHBOARD_TLS_KEY=${serverKeyPath} \\`);
|
|
187
|
+
console.log(' node dist/server/index-server.js --dashboard');
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Main
|
|
191
|
+
const config = parseArgs();
|
|
192
|
+
if (!checkOpenssl()) {
|
|
193
|
+
console.error('❌ OpenSSL is not installed or not in PATH.');
|
|
194
|
+
console.error(' Install OpenSSL and try again.');
|
|
195
|
+
console.error(' Options:');
|
|
196
|
+
console.error(' - Install Git for Windows (includes OpenSSL): https://git-scm.com/download/win');
|
|
197
|
+
console.error(' - Install OpenSSL directly: https://slproweb.com/products/Win32OpenSSL.html');
|
|
198
|
+
console.error(' - On Linux/macOS: sudo apt install openssl / brew install openssl');
|
|
199
|
+
process.exit(1);
|
|
200
|
+
}
|
|
201
|
+
generateCerts(config);
|