@jagilber-org/index-server 1.22.0 → 1.26.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 (189) hide show
  1. package/CHANGELOG.md +87 -2
  2. package/CODE_OF_CONDUCT.md +2 -0
  3. package/CONTRIBUTING.md +32 -2
  4. package/README.md +83 -20
  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 +173 -54
  15. package/dist/dashboard/client/css/admin.css +151 -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 +25 -6
  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 +267 -82
  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 +4 -4
  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 +11 -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/setup-wizard.mjs +781 -0
  183. package/server.json +1 -0
  184. package/dist/externalClientLib.d.ts +0 -1
  185. package/dist/externalClientLib.js +0 -2
  186. package/dist/portableClientWrapper.d.ts +0 -1
  187. package/dist/portableClientWrapper.js +0 -2
  188. package/dist/services/indexingService.d.ts +0 -1
  189. package/dist/services/indexingService.js +0 -2
@@ -27,18 +27,54 @@
27
27
  if (meta) meta.textContent = 'No backups available';
28
28
  return;
29
29
  }
30
- sel.innerHTML = backups.map(b => {
31
- const label = `${b.id} • ${b.instructionCount} files • ${b.schemaVersion || 'schema?'} • ${new Date(b.createdAt).toLocaleString()}`;
32
- return `<option value="${b.id}">${label}</option>`;
30
+ const warningBackups = backups.filter(function(b){ return b.warnings && b.warnings.length > 0; });
31
+ sel.innerHTML = backups.map(function(b) {
32
+ var warnTag = (b.warnings && b.warnings.length > 0) ? ' ⚠️' : '';
33
+ var label = b.id + ' • ' + b.instructionCount + ' files • ' + (b.schemaVersion || 'schema?') + ' • ' + new Date(b.createdAt).toLocaleString() + warnTag;
34
+ return '<option value="' + b.id + '">' + label + '</option>';
33
35
  }).join('');
34
- if (meta) meta.textContent = `${backups.length} backup(s)`;
36
+ if (meta) {
37
+ var metaText = backups.length + ' backup(s)';
38
+ if (warningBackups.length > 0) {
39
+ metaText += ' — ⚠️ ' + warningBackups.length + ' with warnings';
40
+ }
41
+ meta.innerHTML = metaText;
42
+ }
43
+ if (data.hasWarnings) {
44
+ showBackupWarningBanner(warningBackups);
45
+ } else {
46
+ clearBackupWarningBanner();
47
+ }
35
48
  } catch (err) {
36
49
  console.warn('loadBackups error', err);
37
- const sel = document.getElementById('backup-select');
50
+ var sel = document.getElementById('backup-select');
38
51
  if (sel) sel.innerHTML = '<option value="">(error loading)</option>';
52
+ showBackupWarningBanner([{ id: 'load-error', warnings: ['Failed to load backup list: ' + (err.message || err)] }]);
39
53
  }
40
54
  }
41
55
 
56
+ function showBackupWarningBanner(backupsWithWarnings) {
57
+ var container = document.getElementById('backup-restore-area');
58
+ if (!container) return;
59
+ clearBackupWarningBanner();
60
+ if (!backupsWithWarnings || backupsWithWarnings.length === 0) return;
61
+ var banner = document.createElement('div');
62
+ banner.id = 'backup-warning-banner';
63
+ banner.setAttribute('role', 'alert');
64
+ banner.style.cssText = 'background:#ff983022;border:1px solid #ff983066;border-radius:6px;padding:8px 12px;margin-top:8px;font-size:12px;color:#ff9830;';
65
+ var lines = ['<strong>⚠️ Backup warnings:</strong>'];
66
+ backupsWithWarnings.forEach(function(b) {
67
+ (b.warnings || []).forEach(function(w) { lines.push('• ' + w); });
68
+ });
69
+ banner.innerHTML = lines.join('<br>');
70
+ container.parentNode.insertBefore(banner, container.nextSibling);
71
+ }
72
+
73
+ function clearBackupWarningBanner() {
74
+ var existing = document.getElementById('backup-warning-banner');
75
+ if (existing) existing.remove();
76
+ }
77
+
42
78
  async function restoreSelectedBackup() {
43
79
  try {
44
80
  const sel = document.getElementById('backup-select');
@@ -68,7 +104,7 @@
68
104
  const data = await response.json();
69
105
 
70
106
  if (data.success) {
71
- if (typeof displayMaintenanceStatus === 'function') displayMaintenanceStatus(data.maintenance);
107
+ if (typeof displayMaintenanceStatus === 'function') displayMaintenanceStatus(data.maintenance); // lgtm[js/unneeded-defensive-code] — global may load asynchronously across dashboard panels
72
108
  } else {
73
109
  if (typeof showError === 'function') showError('Failed to load maintenance status');
74
110
  }
@@ -221,9 +257,18 @@
221
257
  try {
222
258
  const res = await adminAuth.adminFetch('/api/admin/maintenance/backups/prune', { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify({ retain })});
223
259
  const data = await res.json();
224
- if(data.success){ if (typeof showSuccess === 'function') showSuccess(data.message || 'Pruned'); loadMaintenanceStatus(); loadBackups(); }
260
+ if(data.success){
261
+ var msg = data.message || 'Pruned';
262
+ if (data.errors && data.errors.length > 0) {
263
+ msg += '\n⚠️ ' + data.errors.length + ' error(s):\n' + data.errors.join('\n');
264
+ if (typeof showError === 'function') showError(msg);
265
+ } else {
266
+ if (typeof showSuccess === 'function') showSuccess(msg);
267
+ }
268
+ loadMaintenanceStatus(); loadBackups();
269
+ }
225
270
  else { if (typeof showError === 'function') showError(data.error || 'Prune failed'); }
226
- } catch(e){ if (typeof showError === 'function') showError('Prune failed'); }
271
+ } catch(e){ if (typeof showError === 'function') showError('Prune failed: ' + (e.message || e)); }
227
272
  }
228
273
 
229
274
  function filterBackupRows(){
@@ -566,10 +566,7 @@
566
566
 
567
567
  // ── Helpers ─────────────────────────────────────────────────────────────
568
568
 
569
- function esc(str) {
570
- if (!str) return '';
571
- return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
572
- }
569
+ const esc = window.adminUtils.escapeHtml;
573
570
 
574
571
  function extractTitle(body) {
575
572
  if (!body) return '';
@@ -23,7 +23,11 @@
23
23
  try { displayMaintenanceInfo(maintenanceData.maintenance); } catch(e){ console.warn('displayMaintenanceInfo failed:', e); }
24
24
  }
25
25
  if(healthData && (healthData.success || ['ok','healthy','degraded'].includes(healthData.status))){
26
- displaySystemHealth(healthData.systemHealth || healthData.maintenance?.systemHealth || healthData);
26
+ // /api/system/health wraps the actual payload under .data; older
27
+ // shapes use .systemHealth or .maintenance.systemHealth. Unwrap so
28
+ // displaySystemHealth sees status/uptime/checks at the top level
29
+ // instead of receiving the wrapper and degrading to 'unknown'.
30
+ displaySystemHealth(healthData.systemHealth || healthData.maintenance?.systemHealth || healthData.data || healthData);
27
31
  }
28
32
  } catch(err){
29
33
  console.error('Error loading overview data:', err);
@@ -147,7 +147,7 @@
147
147
  if (connEl) connEl.innerHTML = '<div class="error-message">Error loading active connections</div>';
148
148
  }
149
149
 
150
- try { if (typeof loadSessionHistory === 'function') loadSessionHistory(parseInt(document.getElementById('session-history-limit')?.value || '50', 10)); } catch {}
150
+ try { if (typeof loadSessionHistory === 'function') loadSessionHistory(parseInt(document.getElementById('session-history-limit')?.value || '50', 10)); } catch {} // lgtm[js/unneeded-defensive-code] — global may load asynchronously across dashboard panels
151
151
  window.__lastSessionsCount = sessionsCount;
152
152
  window.__lastConnectionsCount = connectionsCount;
153
153
  updateSessionsNavBadge();
@@ -39,11 +39,53 @@
39
39
  setTimeout(()=> d.remove(), 5000);
40
40
  }
41
41
 
42
+ /**
43
+ * Show a rate-limit notification banner with countdown timer.
44
+ * Accessible: uses role="alert" and aria-live for screen readers.
45
+ */
46
+ function showRateLimitBanner(retryAfterSeconds, tier) {
47
+ clearRateLimitBanner();
48
+ var container = document.querySelector('.admin-container');
49
+ if (!container) return;
50
+ var banner = document.createElement('div');
51
+ banner.id = 'rate-limit-banner';
52
+ banner.setAttribute('role', 'alert');
53
+ banner.setAttribute('aria-live', 'assertive');
54
+ banner.style.cssText = 'background:#f2495c22;border:1px solid #f2495c66;border-radius:6px;padding:10px 16px;margin:8px 0;font-size:13px;color:#f2495c;display:flex;align-items:center;gap:8px;';
55
+ var tierLabel = (tier === 'mutation') ? 'Mutation rate limit' : 'Rate limit';
56
+ var seconds = Math.max(1, Math.round(retryAfterSeconds));
57
+ banner.innerHTML = '<span style="font-size:18px;" aria-hidden="true">🚦</span>'
58
+ + '<span><strong>' + tierLabel + ' exceeded.</strong> Retry in <span id="rl-countdown">' + seconds + '</span> second(s).</span>';
59
+ container.insertBefore(banner, container.firstChild.nextSibling);
60
+
61
+ var countdownEl = document.getElementById('rl-countdown');
62
+ var interval = setInterval(function() {
63
+ seconds--;
64
+ if (countdownEl) countdownEl.textContent = String(Math.max(0, seconds));
65
+ if (seconds <= 0) {
66
+ clearInterval(interval);
67
+ clearRateLimitBanner();
68
+ }
69
+ }, 1000);
70
+ banner._rlInterval = interval;
71
+ }
72
+
73
+ function clearRateLimitBanner() {
74
+ var existing = document.getElementById('rate-limit-banner');
75
+ if (existing) {
76
+ if (existing._rlInterval) clearInterval(existing._rlInterval);
77
+ existing.remove();
78
+ }
79
+ }
80
+
42
81
  // Expose minimal API
43
82
  window.adminUtils = Object.assign(window.adminUtils || {}, {
44
83
  escapeHtml,
45
84
  formatBytes,
46
85
  showError,
47
- showSuccess
86
+ showSuccess,
87
+ showRateLimitBanner,
88
+ clearRateLimitBanner
48
89
  });
90
+ if (!window.escapeHtml) window.escapeHtml = escapeHtml;
49
91
  })(window);