@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.
Files changed (190) hide show
  1. package/CHANGELOG.md +91 -2
  2. package/CODE_OF_CONDUCT.md +2 -0
  3. package/CONTRIBUTING.md +32 -2
  4. package/README.md +82 -19
  5. package/SECURITY.md +17 -5
  6. package/dist/config/dashboardConfig.d.ts +3 -0
  7. package/dist/config/dashboardConfig.js +3 -0
  8. package/dist/config/defaultValues.d.ts +1 -1
  9. package/dist/config/defaultValues.js +1 -1
  10. package/dist/config/featureConfig.d.ts +2 -0
  11. package/dist/config/featureConfig.js +6 -1
  12. package/dist/config/runtimeConfig.d.ts +1 -1
  13. package/dist/config/runtimeConfig.js +8 -9
  14. package/dist/dashboard/client/admin.html +170 -53
  15. package/dist/dashboard/client/css/admin.css +132 -0
  16. package/dist/dashboard/client/js/admin.auth.js +25 -11
  17. package/dist/dashboard/client/js/admin.config.js +1 -1
  18. package/dist/dashboard/client/js/admin.feedback.js +328 -0
  19. package/dist/dashboard/client/js/admin.graph.js +120 -18
  20. package/dist/dashboard/client/js/admin.instructions.js +27 -13
  21. package/dist/dashboard/client/js/admin.logs.js +1 -5
  22. package/dist/dashboard/client/js/admin.maintenance.js +53 -8
  23. package/dist/dashboard/client/js/admin.messaging.js +1 -4
  24. package/dist/dashboard/client/js/admin.overview.js +5 -1
  25. package/dist/dashboard/client/js/admin.sessions.js +1 -1
  26. package/dist/dashboard/client/js/admin.utils.js +43 -1
  27. package/dist/dashboard/client/js/mermaid.min.js +813 -537
  28. package/dist/dashboard/export/DataExporter.js +2 -1
  29. package/dist/dashboard/server/AdminPanel.d.ts +3 -0
  30. package/dist/dashboard/server/AdminPanel.js +132 -35
  31. package/dist/dashboard/server/ApiRoutes.js +40 -9
  32. package/dist/dashboard/server/DashboardServer.js +1 -1
  33. package/dist/dashboard/server/FileMetricsStorage.d.ts +19 -0
  34. package/dist/dashboard/server/FileMetricsStorage.js +52 -5
  35. package/dist/dashboard/server/HttpTransport.js +6 -0
  36. package/dist/dashboard/server/InstanceManager.js +7 -2
  37. package/dist/dashboard/server/KnowledgeStore.js +7 -2
  38. package/dist/dashboard/server/MetricsCollector.d.ts +16 -0
  39. package/dist/dashboard/server/MetricsCollector.js +113 -17
  40. package/dist/dashboard/server/legacyDashboardHtml.js +7 -2
  41. package/dist/dashboard/server/middleware/ensureLoadedMiddleware.d.ts +1 -1
  42. package/dist/dashboard/server/middleware/ensureLoadedMiddleware.js +8 -3
  43. package/dist/dashboard/server/routes/admin.feedback.routes.d.ts +15 -0
  44. package/dist/dashboard/server/routes/admin.feedback.routes.js +188 -0
  45. package/dist/dashboard/server/routes/admin.routes.js +35 -27
  46. package/dist/dashboard/server/routes/alerts.routes.js +4 -3
  47. package/dist/dashboard/server/routes/api.feedback.routes.js +2 -1
  48. package/dist/dashboard/server/routes/api.usage.routes.js +8 -7
  49. package/dist/dashboard/server/routes/embeddings.routes.d.ts +2 -1
  50. package/dist/dashboard/server/routes/embeddings.routes.js +18 -9
  51. package/dist/dashboard/server/routes/graph.routes.js +10 -13
  52. package/dist/dashboard/server/routes/index.d.ts +1 -0
  53. package/dist/dashboard/server/routes/index.js +74 -39
  54. package/dist/dashboard/server/routes/instances.routes.js +2 -1
  55. package/dist/dashboard/server/routes/instructions.routes.js +46 -27
  56. package/dist/dashboard/server/routes/knowledge.routes.js +4 -3
  57. package/dist/dashboard/server/routes/logs.routes.js +5 -4
  58. package/dist/dashboard/server/routes/messaging.routes.js +15 -14
  59. package/dist/dashboard/server/routes/metrics.routes.js +14 -13
  60. package/dist/dashboard/server/routes/scripts.routes.js +6 -3
  61. package/dist/dashboard/server/routes/status.routes.js +5 -4
  62. package/dist/dashboard/server/routes/synthetic.routes.js +3 -2
  63. package/dist/dashboard/server/routes/usage.routes.js +2 -1
  64. package/dist/dashboard/server/utils/escapeHtml.d.ts +1 -0
  65. package/dist/dashboard/server/utils/escapeHtml.js +11 -0
  66. package/dist/dashboard/server/utils/pathContainment.d.ts +1 -0
  67. package/dist/dashboard/server/utils/pathContainment.js +15 -0
  68. package/dist/dashboard/server/wsInit.js +2 -2
  69. package/dist/lib/mcpStdioLogging.d.ts +165 -0
  70. package/dist/lib/mcpStdioLogging.js +287 -0
  71. package/dist/schemas/index.d.ts +37 -2
  72. package/dist/schemas/index.js +27 -3
  73. package/dist/server/backgroundServicesStartup.d.ts +7 -1
  74. package/dist/server/backgroundServicesStartup.js +25 -8
  75. package/dist/server/certInit.d.ts +97 -0
  76. package/dist/server/certInit.js +359 -0
  77. package/dist/server/certInit.types.d.ts +92 -0
  78. package/dist/server/certInit.types.js +34 -0
  79. package/dist/server/handshake/fallbackFrames.d.ts +31 -0
  80. package/dist/server/handshake/fallbackFrames.js +38 -0
  81. package/dist/server/handshake/initializeDetector.d.ts +31 -0
  82. package/dist/server/handshake/initializeDetector.js +88 -0
  83. package/dist/server/handshake/protocol.d.ts +15 -0
  84. package/dist/server/handshake/protocol.js +37 -0
  85. package/dist/server/handshake/readyEmitter.d.ts +6 -0
  86. package/dist/server/handshake/readyEmitter.js +88 -0
  87. package/dist/server/handshake/safetyFallbacks.d.ts +1 -0
  88. package/dist/server/handshake/safetyFallbacks.js +134 -0
  89. package/dist/server/handshake/stdinSniffer.d.ts +1 -0
  90. package/dist/server/handshake/stdinSniffer.js +260 -0
  91. package/dist/server/handshake/tracing.d.ts +16 -0
  92. package/dist/server/handshake/tracing.js +95 -0
  93. package/dist/server/handshakeManager.d.ts +23 -23
  94. package/dist/server/handshakeManager.js +36 -466
  95. package/dist/server/index-server.d.ts +23 -0
  96. package/dist/server/index-server.js +194 -9
  97. package/dist/server/mcpReadOnlySurfaces.d.ts +44 -0
  98. package/dist/server/mcpReadOnlySurfaces.js +297 -0
  99. package/dist/server/sdkServer.js +69 -7
  100. package/dist/server/transport.d.ts +5 -6
  101. package/dist/server/transport.js +46 -64
  102. package/dist/server/transportFactory.d.ts +3 -9
  103. package/dist/server/transportFactory.js +18 -380
  104. package/dist/services/atomicFs.d.ts +3 -0
  105. package/dist/services/atomicFs.js +171 -13
  106. package/dist/services/auditLog.d.ts +17 -2
  107. package/dist/services/auditLog.js +75 -14
  108. package/dist/services/bootstrapGating.js +1 -1
  109. package/dist/services/categoryRules.d.ts +10 -0
  110. package/dist/services/categoryRules.js +17 -0
  111. package/dist/services/classificationService.js +7 -5
  112. package/dist/services/embeddingService.d.ts +27 -11
  113. package/dist/services/embeddingService.js +51 -14
  114. package/dist/services/feedbackStorage.d.ts +39 -0
  115. package/dist/services/feedbackStorage.js +88 -0
  116. package/dist/services/handlers/instructions.add.js +429 -317
  117. package/dist/services/handlers/instructions.groom.js +128 -31
  118. package/dist/services/handlers/instructions.import.js +56 -23
  119. package/dist/services/handlers/instructions.patch.js +43 -32
  120. package/dist/services/handlers/instructions.query.js +20 -29
  121. package/dist/services/handlers/instructions.shared.d.ts +54 -0
  122. package/dist/services/handlers/instructions.shared.js +126 -1
  123. package/dist/services/handlers.activation.js +83 -81
  124. package/dist/services/handlers.dashboardConfig.d.ts +2 -2
  125. package/dist/services/handlers.dashboardConfig.js +1 -2
  126. package/dist/services/handlers.diagnostics.js +75 -54
  127. package/dist/services/handlers.feedback.d.ts +4 -11
  128. package/dist/services/handlers.feedback.js +11 -333
  129. package/dist/services/handlers.gates.js +69 -37
  130. package/dist/services/handlers.graph.js +2 -2
  131. package/dist/services/handlers.help.js +2 -2
  132. package/dist/services/handlers.instructionSchema.js +4 -2
  133. package/dist/services/handlers.integrity.js +42 -22
  134. package/dist/services/handlers.messaging.js +1 -1
  135. package/dist/services/handlers.metrics.js +51 -6
  136. package/dist/services/handlers.prompt.js +10 -2
  137. package/dist/services/handlers.search.js +94 -44
  138. package/dist/services/handlers.trace.js +1 -1
  139. package/dist/services/handlers.usage.js +38 -7
  140. package/dist/services/indexContext.d.ts +21 -1
  141. package/dist/services/indexContext.js +263 -78
  142. package/dist/services/indexLoader.d.ts +1 -0
  143. package/dist/services/indexLoader.js +28 -8
  144. package/dist/services/instructionRecordValidation.d.ts +39 -0
  145. package/dist/services/instructionRecordValidation.js +388 -0
  146. package/dist/services/instructions.dispatcher.js +4 -4
  147. package/dist/services/loaderSchemaValidator.d.ts +15 -0
  148. package/dist/services/loaderSchemaValidator.js +69 -0
  149. package/dist/services/logger.js +11 -2
  150. package/dist/services/mcpLogBridge.d.ts +49 -0
  151. package/dist/services/mcpLogBridge.js +83 -0
  152. package/dist/services/ownershipService.js +18 -8
  153. package/dist/services/performanceBaseline.js +23 -22
  154. package/dist/services/promptReviewService.d.ts +3 -1
  155. package/dist/services/promptReviewService.js +41 -13
  156. package/dist/services/regexSafety.d.ts +6 -0
  157. package/dist/services/regexSafety.js +46 -0
  158. package/dist/services/seedBootstrap.js +1 -1
  159. package/dist/services/storage/factory.d.ts +14 -1
  160. package/dist/services/storage/factory.js +61 -1
  161. package/dist/services/storage/jsonEmbeddingStore.d.ts +15 -0
  162. package/dist/services/storage/jsonEmbeddingStore.js +83 -0
  163. package/dist/services/storage/jsonFileStore.d.ts +3 -1
  164. package/dist/services/storage/jsonFileStore.js +8 -6
  165. package/dist/services/storage/migrationEngine.d.ts +13 -0
  166. package/dist/services/storage/migrationEngine.js +31 -0
  167. package/dist/services/storage/sqliteEmbeddingStore.d.ts +30 -0
  168. package/dist/services/storage/sqliteEmbeddingStore.js +222 -0
  169. package/dist/services/storage/sqliteStore.d.ts +3 -1
  170. package/dist/services/storage/sqliteStore.js +2 -2
  171. package/dist/services/storage/types.d.ts +48 -1
  172. package/dist/services/toolRegistry.js +77 -67
  173. package/dist/services/toolRegistry.zod.js +89 -86
  174. package/dist/services/tracing.js +5 -4
  175. package/dist/utils/envUtils.d.ts +4 -0
  176. package/dist/utils/envUtils.js +7 -0
  177. package/dist/utils/memoryMonitor.js +11 -10
  178. package/package.json +12 -4
  179. package/schemas/instruction.schema.json +38 -1
  180. package/scripts/copy-dashboard-assets.mjs +1 -1
  181. package/scripts/dist/README.md +1 -1
  182. package/scripts/generate-certs.mjs +201 -0
  183. package/scripts/setup-wizard.mjs +781 -0
  184. package/server.json +20 -0
  185. package/dist/externalClientLib.d.ts +0 -1
  186. package/dist/externalClientLib.js +0 -2
  187. package/dist/portableClientWrapper.d.ts +0 -1
  188. package/dist/portableClientWrapper.js +0 -2
  189. package/dist/services/indexingService.d.ts +0 -1
  190. 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);