@jagilber-org/index-server 1.19.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.
- package/CHANGELOG.md +1218 -0
- package/CODE_OF_CONDUCT.md +49 -0
- package/CONTRIBUTING.md +75 -0
- package/LICENSE +21 -0
- package/README.md +523 -0
- package/SECURITY.md +50 -0
- package/dist/config/configUtils.d.ts +11 -0
- package/dist/config/configUtils.js +87 -0
- package/dist/config/dashboardConfig.d.ts +45 -0
- package/dist/config/dashboardConfig.js +63 -0
- package/dist/config/defaultValues.d.ts +61 -0
- package/dist/config/defaultValues.js +70 -0
- package/dist/config/dirConstants.d.ts +17 -0
- package/dist/config/dirConstants.js +28 -0
- package/dist/config/featureConfig.d.ts +61 -0
- package/dist/config/featureConfig.js +121 -0
- package/dist/config/runtimeConfig.d.ts +145 -0
- package/dist/config/runtimeConfig.js +334 -0
- package/dist/config/serverConfig.d.ts +90 -0
- package/dist/config/serverConfig.js +164 -0
- package/dist/dashboard/analytics/AnalyticsEngine.d.ts +142 -0
- package/dist/dashboard/analytics/AnalyticsEngine.js +373 -0
- package/dist/dashboard/analytics/BusinessIntelligence.d.ts +187 -0
- package/dist/dashboard/analytics/BusinessIntelligence.js +594 -0
- package/dist/dashboard/client/admin.html +2150 -0
- package/dist/dashboard/client/chunks/mermaid-layout-elk.esm.min/chunk-SP2CHFBE.mjs +1 -0
- package/dist/dashboard/client/chunks/mermaid-layout-elk.esm.min/render-T6MDALS3.mjs +27 -0
- package/dist/dashboard/client/css/admin.css +1466 -0
- package/dist/dashboard/client/js/admin.boot.js +359 -0
- package/dist/dashboard/client/js/admin.config.js +196 -0
- package/dist/dashboard/client/js/admin.embeddings.js +425 -0
- package/dist/dashboard/client/js/admin.graph.js +583 -0
- package/dist/dashboard/client/js/admin.instances.js +120 -0
- package/dist/dashboard/client/js/admin.instructions.js +552 -0
- package/dist/dashboard/client/js/admin.logs.js +113 -0
- package/dist/dashboard/client/js/admin.maintenance.js +354 -0
- package/dist/dashboard/client/js/admin.messaging.js +635 -0
- package/dist/dashboard/client/js/admin.monitor.js +181 -0
- package/dist/dashboard/client/js/admin.overview.js +221 -0
- package/dist/dashboard/client/js/admin.performance.js +61 -0
- package/dist/dashboard/client/js/admin.sessions.js +293 -0
- package/dist/dashboard/client/js/admin.sqlite.js +366 -0
- package/dist/dashboard/client/js/admin.utils.js +49 -0
- package/dist/dashboard/client/js/chart.umd.js +14 -0
- package/dist/dashboard/client/js/elk.bundled.js +6696 -0
- package/dist/dashboard/client/js/marked.umd.js +74 -0
- package/dist/dashboard/client/js/mermaid.min.js +3022 -0
- package/dist/dashboard/client/mermaid-layout-elk.esm.min.mjs +1 -0
- package/dist/dashboard/export/DataExporter.d.ts +169 -0
- package/dist/dashboard/export/DataExporter.js +737 -0
- package/dist/dashboard/export/exporters/csvExporter.d.ts +11 -0
- package/dist/dashboard/export/exporters/csvExporter.js +46 -0
- package/dist/dashboard/export/exporters/exportTypes.d.ts +89 -0
- package/dist/dashboard/export/exporters/exportTypes.js +5 -0
- package/dist/dashboard/export/exporters/jsonExporter.d.ts +7 -0
- package/dist/dashboard/export/exporters/jsonExporter.js +22 -0
- package/dist/dashboard/export/exporters/xmlExporter.d.ts +17 -0
- package/dist/dashboard/export/exporters/xmlExporter.js +175 -0
- package/dist/dashboard/integration/APIIntegration.d.ts +41 -0
- package/dist/dashboard/integration/APIIntegration.js +95 -0
- package/dist/dashboard/security/SecurityMonitor.d.ts +167 -0
- package/dist/dashboard/security/SecurityMonitor.js +559 -0
- package/dist/dashboard/server/AdminPanel.d.ts +183 -0
- package/dist/dashboard/server/AdminPanel.js +792 -0
- package/dist/dashboard/server/AdminPanelConfig.d.ts +42 -0
- package/dist/dashboard/server/AdminPanelConfig.js +80 -0
- package/dist/dashboard/server/AdminPanelState.d.ts +47 -0
- package/dist/dashboard/server/AdminPanelState.js +214 -0
- package/dist/dashboard/server/ApiRoutes.d.ts +17 -0
- package/dist/dashboard/server/ApiRoutes.js +149 -0
- package/dist/dashboard/server/DashboardServer.d.ts +49 -0
- package/dist/dashboard/server/DashboardServer.js +159 -0
- package/dist/dashboard/server/FileMetricsStorage.d.ts +49 -0
- package/dist/dashboard/server/FileMetricsStorage.js +195 -0
- package/dist/dashboard/server/HttpTransport.d.ts +23 -0
- package/dist/dashboard/server/HttpTransport.js +116 -0
- package/dist/dashboard/server/InstanceManager.d.ts +53 -0
- package/dist/dashboard/server/InstanceManager.js +284 -0
- package/dist/dashboard/server/KnowledgeStore.d.ts +35 -0
- package/dist/dashboard/server/KnowledgeStore.js +105 -0
- package/dist/dashboard/server/LeaderElection.d.ts +81 -0
- package/dist/dashboard/server/LeaderElection.js +268 -0
- package/dist/dashboard/server/MetricsCollector.d.ts +200 -0
- package/dist/dashboard/server/MetricsCollector.js +803 -0
- package/dist/dashboard/server/SessionPersistenceManager.d.ts +88 -0
- package/dist/dashboard/server/SessionPersistenceManager.js +457 -0
- package/dist/dashboard/server/ThinClient.d.ts +64 -0
- package/dist/dashboard/server/ThinClient.js +237 -0
- package/dist/dashboard/server/WebSocketManager.d.ts +161 -0
- package/dist/dashboard/server/WebSocketManager.js +463 -0
- package/dist/dashboard/server/httpLifecycle.d.ts +17 -0
- package/dist/dashboard/server/httpLifecycle.js +35 -0
- package/dist/dashboard/server/legacyDashboardHtml.d.ts +9 -0
- package/dist/dashboard/server/legacyDashboardHtml.js +618 -0
- package/dist/dashboard/server/legacyDashboardStyles.d.ts +5 -0
- package/dist/dashboard/server/legacyDashboardStyles.js +490 -0
- package/dist/dashboard/server/metricsAggregation.d.ts +252 -0
- package/dist/dashboard/server/metricsAggregation.js +206 -0
- package/dist/dashboard/server/metricsSerializer.d.ts +25 -0
- package/dist/dashboard/server/metricsSerializer.js +195 -0
- package/dist/dashboard/server/routes/admin.routes.d.ts +16 -0
- package/dist/dashboard/server/routes/admin.routes.js +596 -0
- package/dist/dashboard/server/routes/alerts.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/alerts.routes.js +93 -0
- package/dist/dashboard/server/routes/api.feedback.routes.d.ts +73 -0
- package/dist/dashboard/server/routes/api.feedback.routes.js +171 -0
- package/dist/dashboard/server/routes/api.instructions.routes.d.ts +101 -0
- package/dist/dashboard/server/routes/api.instructions.routes.js +213 -0
- package/dist/dashboard/server/routes/api.usage.routes.d.ts +57 -0
- package/dist/dashboard/server/routes/api.usage.routes.js +374 -0
- package/dist/dashboard/server/routes/embeddings.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/embeddings.routes.js +246 -0
- package/dist/dashboard/server/routes/graph.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/graph.routes.js +280 -0
- package/dist/dashboard/server/routes/index.d.ts +38 -0
- package/dist/dashboard/server/routes/index.js +194 -0
- package/dist/dashboard/server/routes/instances.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/instances.routes.js +35 -0
- package/dist/dashboard/server/routes/instructions.routes.d.ts +8 -0
- package/dist/dashboard/server/routes/instructions.routes.js +336 -0
- package/dist/dashboard/server/routes/knowledge.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/knowledge.routes.js +82 -0
- package/dist/dashboard/server/routes/logs.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/logs.routes.js +164 -0
- package/dist/dashboard/server/routes/messaging.routes.d.ts +16 -0
- package/dist/dashboard/server/routes/messaging.routes.js +293 -0
- package/dist/dashboard/server/routes/metrics.routes.d.ts +10 -0
- package/dist/dashboard/server/routes/metrics.routes.js +346 -0
- package/dist/dashboard/server/routes/scripts.routes.d.ts +9 -0
- package/dist/dashboard/server/routes/scripts.routes.js +84 -0
- package/dist/dashboard/server/routes/sqlite.routes.d.ts +9 -0
- package/dist/dashboard/server/routes/sqlite.routes.js +569 -0
- package/dist/dashboard/server/routes/status.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/status.routes.js +183 -0
- package/dist/dashboard/server/routes/synthetic.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/synthetic.routes.js +195 -0
- package/dist/dashboard/server/routes/tools.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/tools.routes.js +46 -0
- package/dist/dashboard/server/routes/usage.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/usage.routes.js +25 -0
- package/dist/dashboard/server/wsInit.d.ts +16 -0
- package/dist/dashboard/server/wsInit.js +35 -0
- package/dist/externalClientLib.d.ts +1 -0
- package/dist/externalClientLib.js +2 -0
- package/dist/minimal/index.d.ts +1 -0
- package/dist/minimal/index.js +140 -0
- package/dist/models/SessionPersistence.d.ts +115 -0
- package/dist/models/SessionPersistence.js +66 -0
- package/dist/models/instruction.d.ts +45 -0
- package/dist/models/instruction.js +2 -0
- package/dist/perf/benchmark.d.ts +1 -0
- package/dist/perf/benchmark.js +50 -0
- package/dist/portableClientWrapper.d.ts +1 -0
- package/dist/portableClientWrapper.js +2 -0
- package/dist/schemas/index.d.ts +128 -0
- package/dist/schemas/index.js +371 -0
- package/dist/scripts/runPerformanceBaseline.d.ts +1 -0
- package/dist/scripts/runPerformanceBaseline.js +17 -0
- package/dist/server/handshakeManager.d.ts +25 -0
- package/dist/server/handshakeManager.js +472 -0
- package/dist/server/index-server.d.ts +56 -0
- package/dist/server/index-server.js +822 -0
- package/dist/server/registry.d.ts +44 -0
- package/dist/server/registry.js +236 -0
- package/dist/server/sdkServer.d.ts +8 -0
- package/dist/server/sdkServer.js +299 -0
- package/dist/server/shutdownGuard.d.ts +41 -0
- package/dist/server/shutdownGuard.js +52 -0
- package/dist/server/thin-client.d.ts +22 -0
- package/dist/server/thin-client.js +111 -0
- package/dist/server/transport.d.ts +41 -0
- package/dist/server/transport.js +312 -0
- package/dist/server/transportFactory.d.ts +21 -0
- package/dist/server/transportFactory.js +429 -0
- package/dist/services/atomicFs.d.ts +22 -0
- package/dist/services/atomicFs.js +103 -0
- package/dist/services/auditLog.d.ts +38 -0
- package/dist/services/auditLog.js +142 -0
- package/dist/services/autoBackup.d.ts +14 -0
- package/dist/services/autoBackup.js +171 -0
- package/dist/services/autoSplit.d.ts +32 -0
- package/dist/services/autoSplit.js +113 -0
- package/dist/services/backupZip.d.ts +25 -0
- package/dist/services/backupZip.js +110 -0
- package/dist/services/bootstrapGating.d.ts +123 -0
- package/dist/services/bootstrapGating.js +221 -0
- package/dist/services/canonical.d.ts +23 -0
- package/dist/services/canonical.js +65 -0
- package/dist/services/categoryRules.d.ts +7 -0
- package/dist/services/categoryRules.js +37 -0
- package/dist/services/classificationService.d.ts +42 -0
- package/dist/services/classificationService.js +168 -0
- package/dist/services/embeddingService.d.ts +62 -0
- package/dist/services/embeddingService.js +259 -0
- package/dist/services/errors.d.ts +22 -0
- package/dist/services/errors.js +31 -0
- package/dist/services/featureFlags.d.ts +25 -0
- package/dist/services/featureFlags.js +89 -0
- package/dist/services/features.d.ts +13 -0
- package/dist/services/features.js +35 -0
- package/dist/services/handlers/instructions.add.d.ts +1 -0
- package/dist/services/handlers/instructions.add.js +496 -0
- package/dist/services/handlers/instructions.groom.d.ts +1 -0
- package/dist/services/handlers/instructions.groom.js +523 -0
- package/dist/services/handlers/instructions.import.d.ts +1 -0
- package/dist/services/handlers/instructions.import.js +173 -0
- package/dist/services/handlers/instructions.patch.d.ts +1 -0
- package/dist/services/handlers/instructions.patch.js +167 -0
- package/dist/services/handlers/instructions.query.d.ts +163 -0
- package/dist/services/handlers/instructions.query.js +522 -0
- package/dist/services/handlers/instructions.reload.d.ts +1 -0
- package/dist/services/handlers/instructions.reload.js +13 -0
- package/dist/services/handlers/instructions.remove.d.ts +1 -0
- package/dist/services/handlers/instructions.remove.js +118 -0
- package/dist/services/handlers/instructions.shared.d.ts +31 -0
- package/dist/services/handlers/instructions.shared.js +124 -0
- package/dist/services/handlers.activation.d.ts +1 -0
- package/dist/services/handlers.activation.js +203 -0
- package/dist/services/handlers.bootstrap.d.ts +1 -0
- package/dist/services/handlers.bootstrap.js +38 -0
- package/dist/services/handlers.dashboardConfig.d.ts +34 -0
- package/dist/services/handlers.dashboardConfig.js +108 -0
- package/dist/services/handlers.diagnostics.d.ts +1 -0
- package/dist/services/handlers.diagnostics.js +64 -0
- package/dist/services/handlers.feedback.d.ts +15 -0
- package/dist/services/handlers.feedback.js +378 -0
- package/dist/services/handlers.gates.d.ts +1 -0
- package/dist/services/handlers.gates.js +46 -0
- package/dist/services/handlers.graph.d.ts +53 -0
- package/dist/services/handlers.graph.js +231 -0
- package/dist/services/handlers.help.d.ts +1 -0
- package/dist/services/handlers.help.js +119 -0
- package/dist/services/handlers.instructionSchema.d.ts +1 -0
- package/dist/services/handlers.instructionSchema.js +227 -0
- package/dist/services/handlers.instructions.d.ts +8 -0
- package/dist/services/handlers.instructions.js +14 -0
- package/dist/services/handlers.instructionsDiagnostics.d.ts +1 -0
- package/dist/services/handlers.instructionsDiagnostics.js +14 -0
- package/dist/services/handlers.integrity.d.ts +1 -0
- package/dist/services/handlers.integrity.js +35 -0
- package/dist/services/handlers.manifest.d.ts +1 -0
- package/dist/services/handlers.manifest.js +24 -0
- package/dist/services/handlers.messaging.d.ts +12 -0
- package/dist/services/handlers.messaging.js +203 -0
- package/dist/services/handlers.metrics.d.ts +1 -0
- package/dist/services/handlers.metrics.js +43 -0
- package/dist/services/handlers.promote.d.ts +1 -0
- package/dist/services/handlers.promote.js +306 -0
- package/dist/services/handlers.prompt.d.ts +1 -0
- package/dist/services/handlers.prompt.js +7 -0
- package/dist/services/handlers.search.d.ts +69 -0
- package/dist/services/handlers.search.js +645 -0
- package/dist/services/handlers.testPrimitive.d.ts +1 -0
- package/dist/services/handlers.testPrimitive.js +5 -0
- package/dist/services/handlers.trace.d.ts +1 -0
- package/dist/services/handlers.trace.js +31 -0
- package/dist/services/handlers.usage.d.ts +1 -0
- package/dist/services/handlers.usage.js +11 -0
- package/dist/services/hotScore.d.ts +137 -0
- package/dist/services/hotScore.js +244 -0
- package/dist/services/indexContext.d.ts +117 -0
- package/dist/services/indexContext.js +968 -0
- package/dist/services/indexLoader.d.ts +44 -0
- package/dist/services/indexLoader.js +921 -0
- package/dist/services/indexRepository.d.ts +32 -0
- package/dist/services/indexRepository.js +71 -0
- package/dist/services/indexingService.d.ts +1 -0
- package/dist/services/indexingService.js +2 -0
- package/dist/services/instructions.dispatcher.d.ts +1 -0
- package/dist/services/instructions.dispatcher.js +231 -0
- package/dist/services/logPrefix.d.ts +1 -0
- package/dist/services/logPrefix.js +30 -0
- package/dist/services/logger.d.ts +52 -0
- package/dist/services/logger.js +268 -0
- package/dist/services/manifestManager.d.ts +82 -0
- package/dist/services/manifestManager.js +200 -0
- package/dist/services/messaging/agentMailbox.d.ts +60 -0
- package/dist/services/messaging/agentMailbox.js +353 -0
- package/dist/services/messaging/messagingPersistence.d.ts +20 -0
- package/dist/services/messaging/messagingPersistence.js +111 -0
- package/dist/services/messaging/messagingTypes.d.ts +150 -0
- package/dist/services/messaging/messagingTypes.js +66 -0
- package/dist/services/ownershipService.d.ts +1 -0
- package/dist/services/ownershipService.js +38 -0
- package/dist/services/performanceBaseline.d.ts +19 -0
- package/dist/services/performanceBaseline.js +210 -0
- package/dist/services/preflight.d.ts +12 -0
- package/dist/services/preflight.js +79 -0
- package/dist/services/promptReviewService.d.ts +44 -0
- package/dist/services/promptReviewService.js +101 -0
- package/dist/services/responseEnvelope.d.ts +6 -0
- package/dist/services/responseEnvelope.js +25 -0
- package/dist/services/seedBootstrap.d.ts +34 -0
- package/dist/services/seedBootstrap.js +427 -0
- package/dist/services/storage/factory.d.ts +17 -0
- package/dist/services/storage/factory.js +35 -0
- package/dist/services/storage/hashUtils.d.ts +11 -0
- package/dist/services/storage/hashUtils.js +35 -0
- package/dist/services/storage/index.d.ts +12 -0
- package/dist/services/storage/index.js +18 -0
- package/dist/services/storage/jsonFileStore.d.ts +32 -0
- package/dist/services/storage/jsonFileStore.js +241 -0
- package/dist/services/storage/migrationEngine.d.ts +35 -0
- package/dist/services/storage/migrationEngine.js +93 -0
- package/dist/services/storage/sqliteMessageStore.d.ts +53 -0
- package/dist/services/storage/sqliteMessageStore.js +146 -0
- package/dist/services/storage/sqliteSchema.d.ts +12 -0
- package/dist/services/storage/sqliteSchema.js +122 -0
- package/dist/services/storage/sqliteStore.d.ts +41 -0
- package/dist/services/storage/sqliteStore.js +339 -0
- package/dist/services/storage/sqliteUsageStore.d.ts +35 -0
- package/dist/services/storage/sqliteUsageStore.js +94 -0
- package/dist/services/storage/types.d.ts +171 -0
- package/dist/services/storage/types.js +12 -0
- package/dist/services/toolHandlers.d.ts +23 -0
- package/dist/services/toolHandlers.js +50 -0
- package/dist/services/toolRegistry.d.ts +20 -0
- package/dist/services/toolRegistry.js +490 -0
- package/dist/services/toolRegistry.zod.d.ts +10 -0
- package/dist/services/toolRegistry.zod.js +323 -0
- package/dist/services/tracing.d.ts +26 -0
- package/dist/services/tracing.js +260 -0
- package/dist/services/usageBuckets.d.ts +161 -0
- package/dist/services/usageBuckets.js +364 -0
- package/dist/services/validationService.d.ts +38 -0
- package/dist/services/validationService.js +125 -0
- package/dist/utils/BufferRing.d.ts +203 -0
- package/dist/utils/BufferRing.js +551 -0
- package/dist/utils/BufferRingExamples.d.ts +55 -0
- package/dist/utils/BufferRingExamples.js +188 -0
- package/dist/utils/envUtils.d.ts +42 -0
- package/dist/utils/envUtils.js +80 -0
- package/dist/utils/memoryMonitor.d.ts +83 -0
- package/dist/utils/memoryMonitor.js +275 -0
- package/dist/versioning/schemaVersion.d.ts +6 -0
- package/dist/versioning/schemaVersion.js +93 -0
- package/package.json +134 -0
- package/schemas/README.md +13 -0
- package/schemas/feedback-entry.schema.json +27 -0
- package/schemas/graph-export-v2.schema.json +60 -0
- package/schemas/index-server.code-schema.json +38477 -0
- package/schemas/instruction.schema.json +262 -0
- package/schemas/json-schema/SessionPersistence-persisted-admin-session.schema.json +54 -0
- package/schemas/json-schema/SessionPersistence-persisted-session-history-entry.schema.json +51 -0
- package/schemas/json-schema/SessionPersistence-persisted-web-socket-connection.schema.json +54 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-config.schema.json +110 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-data.schema.json +229 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-manifest.schema.json +109 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-metadata.schema.json +55 -0
- package/schemas/json-schema/instruction-audience-scope.schema.json +14 -0
- package/schemas/json-schema/instruction-content-type.schema.json +17 -0
- package/schemas/json-schema/instruction-instruction-entry.schema.json +206 -0
- package/schemas/json-schema/instruction-requirement-level.schema.json +16 -0
- package/schemas/manifest.json +78 -0
- package/schemas/manifest.schema.json +33 -0
- package/schemas/usage-batch.schema.json +16 -0
- package/schemas/usage-buckets.schema.json +30 -0
- package/schemas/usage-event.schema.json +17 -0
- package/scripts/copy-dashboard-assets.mjs +170 -0
- package/scripts/setup-hooks.cjs +28 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ThinClient - Stdio-to-HTTP bridge for MCP clients.
|
|
4
|
+
*
|
|
5
|
+
* **EXPERIMENTAL** — APIs, configuration, and behavior may change.
|
|
6
|
+
*
|
|
7
|
+
* A lightweight process that MCP hosts (VS Code, Claude) spawn via stdio.
|
|
8
|
+
* Instead of loading the full index, it forwards JSON-RPC frames to
|
|
9
|
+
* the leader server's HTTP endpoint.
|
|
10
|
+
*
|
|
11
|
+
* Flow: MCP Host --stdio--> ThinClient --HTTP--> Leader Server
|
|
12
|
+
*
|
|
13
|
+
* Features:
|
|
14
|
+
* - Reads JSON-RPC frames from stdin, POSTs to leader
|
|
15
|
+
* - Writes responses to stdout
|
|
16
|
+
* - Auto-discovers leader from instance state files
|
|
17
|
+
* - Reconnects on leader failover
|
|
18
|
+
*/
|
|
19
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
20
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.ThinClient = void 0;
|
|
24
|
+
const fs_1 = __importDefault(require("fs"));
|
|
25
|
+
const path_1 = __importDefault(require("path"));
|
|
26
|
+
const http_1 = __importDefault(require("http"));
|
|
27
|
+
const DEFAULT_MAX_RETRIES = 5;
|
|
28
|
+
const DEFAULT_RETRY_DELAY = 500;
|
|
29
|
+
const LOCK_FILE = 'leader.lock';
|
|
30
|
+
class ThinClient {
|
|
31
|
+
leaderUrl;
|
|
32
|
+
stateDir;
|
|
33
|
+
maxRetries;
|
|
34
|
+
retryDelayMs;
|
|
35
|
+
_connected = false;
|
|
36
|
+
_stopped = false;
|
|
37
|
+
healthTimer = null;
|
|
38
|
+
constructor(options = {}) {
|
|
39
|
+
this.leaderUrl = options.leaderUrl ?? null;
|
|
40
|
+
this.stateDir = options.stateDir ?? null;
|
|
41
|
+
this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
42
|
+
this.retryDelayMs = options.retryDelayMs ?? DEFAULT_RETRY_DELAY;
|
|
43
|
+
}
|
|
44
|
+
get connected() { return this._connected; }
|
|
45
|
+
/**
|
|
46
|
+
* Discover the leader URL from the state directory.
|
|
47
|
+
*/
|
|
48
|
+
discoverLeader() {
|
|
49
|
+
if (!this.stateDir)
|
|
50
|
+
return null;
|
|
51
|
+
const lockPath = path_1.default.join(this.stateDir, LOCK_FILE);
|
|
52
|
+
try {
|
|
53
|
+
if (!fs_1.default.existsSync(lockPath))
|
|
54
|
+
return null;
|
|
55
|
+
const raw = fs_1.default.readFileSync(lockPath, 'utf8');
|
|
56
|
+
const entry = JSON.parse(raw);
|
|
57
|
+
if (entry.host && entry.port) {
|
|
58
|
+
return `http://${entry.host}:${entry.port}/mcp`;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Can't read lock file
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Resolve the leader URL (explicit or discovered).
|
|
68
|
+
* Re-discovers if the cached URL might be stale (leader changed port/host).
|
|
69
|
+
*/
|
|
70
|
+
resolveLeaderUrl() {
|
|
71
|
+
if (this.leaderUrl && this.stateDir) {
|
|
72
|
+
// Validate cached URL still matches current leader.lock
|
|
73
|
+
const freshUrl = this.discoverLeader();
|
|
74
|
+
if (freshUrl && freshUrl !== this.leaderUrl) {
|
|
75
|
+
this.leaderUrl = freshUrl;
|
|
76
|
+
this._connected = false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else if (!this.leaderUrl) {
|
|
80
|
+
const discovered = this.discoverLeader();
|
|
81
|
+
if (discovered) {
|
|
82
|
+
this.leaderUrl = discovered;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return this.leaderUrl;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Send a JSON-RPC request to the leader and return the response.
|
|
89
|
+
*/
|
|
90
|
+
async sendRpc(method, params = {}, id = 1) {
|
|
91
|
+
const url = this.resolveLeaderUrl();
|
|
92
|
+
if (!url) {
|
|
93
|
+
throw new Error('No leader URL available');
|
|
94
|
+
}
|
|
95
|
+
let lastError = null;
|
|
96
|
+
for (let attempt = 0; attempt < this.maxRetries; attempt++) {
|
|
97
|
+
try {
|
|
98
|
+
const response = await this.httpPost(`${url}/rpc`, {
|
|
99
|
+
jsonrpc: '2.0',
|
|
100
|
+
method,
|
|
101
|
+
params,
|
|
102
|
+
id,
|
|
103
|
+
});
|
|
104
|
+
this._connected = true;
|
|
105
|
+
return response;
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
lastError = err instanceof Error ? err : new Error(String(err));
|
|
109
|
+
this._connected = false;
|
|
110
|
+
// On failure, try re-discovering leader (may have failed over)
|
|
111
|
+
if (this.stateDir && attempt < this.maxRetries - 1) {
|
|
112
|
+
this.leaderUrl = null; // Force re-discovery
|
|
113
|
+
await this.sleep(this.retryDelayMs * Math.pow(2, attempt));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
throw lastError ?? new Error('Failed to connect to leader');
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Check if the leader is healthy.
|
|
121
|
+
*/
|
|
122
|
+
async checkHealth() {
|
|
123
|
+
const url = this.resolveLeaderUrl();
|
|
124
|
+
if (!url)
|
|
125
|
+
return false;
|
|
126
|
+
try {
|
|
127
|
+
const response = await this.httpGet(`${url}/health`);
|
|
128
|
+
return response?.status === 'ok';
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Process a raw JSON-RPC frame (as received from stdin).
|
|
136
|
+
*/
|
|
137
|
+
async processFrame(frame) {
|
|
138
|
+
let parsed;
|
|
139
|
+
try {
|
|
140
|
+
parsed = JSON.parse(frame);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return JSON.stringify({
|
|
144
|
+
jsonrpc: '2.0',
|
|
145
|
+
error: { code: -32700, message: 'Parse error' },
|
|
146
|
+
id: null,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
const result = await this.sendRpc(parsed.method, parsed.params, parsed.id);
|
|
151
|
+
return JSON.stringify(result);
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
return JSON.stringify({
|
|
155
|
+
jsonrpc: '2.0',
|
|
156
|
+
error: { code: -32603, message: err instanceof Error ? err.message : 'Internal error' },
|
|
157
|
+
id: parsed.id ?? null,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
stop() {
|
|
162
|
+
this._stopped = true;
|
|
163
|
+
this._connected = false;
|
|
164
|
+
if (this.healthTimer) {
|
|
165
|
+
clearInterval(this.healthTimer);
|
|
166
|
+
this.healthTimer = null;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async httpPost(url, body) {
|
|
170
|
+
const bodyStr = JSON.stringify(body);
|
|
171
|
+
return new Promise((resolve, reject) => {
|
|
172
|
+
const urlObj = new URL(url);
|
|
173
|
+
const req = http_1.default.request({
|
|
174
|
+
hostname: urlObj.hostname,
|
|
175
|
+
port: parseInt(urlObj.port),
|
|
176
|
+
path: urlObj.pathname,
|
|
177
|
+
method: 'POST',
|
|
178
|
+
headers: {
|
|
179
|
+
'Content-Type': 'application/json',
|
|
180
|
+
'Content-Length': Buffer.byteLength(bodyStr),
|
|
181
|
+
},
|
|
182
|
+
timeout: 10000,
|
|
183
|
+
}, (res) => {
|
|
184
|
+
let data = '';
|
|
185
|
+
res.on('data', (chunk) => { data += chunk; });
|
|
186
|
+
res.on('end', () => {
|
|
187
|
+
try {
|
|
188
|
+
resolve(JSON.parse(data));
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
reject(new Error(`Invalid JSON response: ${data.slice(0, 100)}`));
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
req.on('error', reject);
|
|
196
|
+
req.on('timeout', () => {
|
|
197
|
+
req.destroy();
|
|
198
|
+
reject(new Error('Request timeout'));
|
|
199
|
+
});
|
|
200
|
+
req.write(bodyStr);
|
|
201
|
+
req.end();
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
async httpGet(url) {
|
|
205
|
+
return new Promise((resolve, reject) => {
|
|
206
|
+
const urlObj = new URL(url);
|
|
207
|
+
const req = http_1.default.request({
|
|
208
|
+
hostname: urlObj.hostname,
|
|
209
|
+
port: parseInt(urlObj.port),
|
|
210
|
+
path: urlObj.pathname,
|
|
211
|
+
method: 'GET',
|
|
212
|
+
timeout: 5000,
|
|
213
|
+
}, (res) => {
|
|
214
|
+
let data = '';
|
|
215
|
+
res.on('data', (chunk) => { data += chunk; });
|
|
216
|
+
res.on('end', () => {
|
|
217
|
+
try {
|
|
218
|
+
resolve(JSON.parse(data));
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
reject(new Error(`Invalid JSON response`));
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
req.on('error', reject);
|
|
226
|
+
req.on('timeout', () => {
|
|
227
|
+
req.destroy();
|
|
228
|
+
reject(new Error('Request timeout'));
|
|
229
|
+
});
|
|
230
|
+
req.end();
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
sleep(ms) {
|
|
234
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
exports.ThinClient = ThinClient;
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocketManager - Phase 1 Dashboard Foundation
|
|
3
|
+
*
|
|
4
|
+
* Manages WebSocket connections for real-time dashboard updates.
|
|
5
|
+
* Provides bidirectional communication between dashboard clients and server.
|
|
6
|
+
*/
|
|
7
|
+
import { WebSocket } from 'ws';
|
|
8
|
+
import { Server as HttpServer } from 'http';
|
|
9
|
+
import { MetricsSnapshot } from './MetricsCollector.js';
|
|
10
|
+
export interface DashboardMessage {
|
|
11
|
+
type: string;
|
|
12
|
+
timestamp: number;
|
|
13
|
+
data?: unknown;
|
|
14
|
+
}
|
|
15
|
+
export interface MetricsUpdateMessage extends DashboardMessage {
|
|
16
|
+
type: 'metrics_update';
|
|
17
|
+
data: MetricsSnapshot;
|
|
18
|
+
}
|
|
19
|
+
export interface ToolCallMessage extends DashboardMessage {
|
|
20
|
+
type: 'tool_call';
|
|
21
|
+
data: {
|
|
22
|
+
toolName: string;
|
|
23
|
+
success: boolean;
|
|
24
|
+
responseTime: number;
|
|
25
|
+
clientId?: string;
|
|
26
|
+
errorType?: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface ClientConnectMessage extends DashboardMessage {
|
|
30
|
+
type: 'client_connect';
|
|
31
|
+
data: {
|
|
32
|
+
clientId: string;
|
|
33
|
+
timestamp: number;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export interface ClientDisconnectMessage extends DashboardMessage {
|
|
37
|
+
type: 'client_disconnect';
|
|
38
|
+
data: {
|
|
39
|
+
clientId: string;
|
|
40
|
+
timestamp: number;
|
|
41
|
+
duration: number;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export interface ErrorMessage extends DashboardMessage {
|
|
45
|
+
type: 'error';
|
|
46
|
+
data: {
|
|
47
|
+
message: string;
|
|
48
|
+
stack?: string;
|
|
49
|
+
severity: 'low' | 'medium' | 'high' | 'critical';
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export interface GenericMessage extends DashboardMessage {
|
|
53
|
+
type: 'welcome' | 'pong' | 'subscribed';
|
|
54
|
+
data?: unknown;
|
|
55
|
+
}
|
|
56
|
+
export interface MessagingEventMessage extends DashboardMessage {
|
|
57
|
+
type: 'message_received' | 'message_purged';
|
|
58
|
+
data?: {
|
|
59
|
+
messageId?: string;
|
|
60
|
+
channel?: string;
|
|
61
|
+
count?: number;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export interface SyntheticTraceMessage extends DashboardMessage {
|
|
65
|
+
type: 'synthetic_trace';
|
|
66
|
+
data: {
|
|
67
|
+
runId: string;
|
|
68
|
+
seq: number;
|
|
69
|
+
total?: number;
|
|
70
|
+
method: string;
|
|
71
|
+
success: boolean;
|
|
72
|
+
durationMs: number;
|
|
73
|
+
started: number;
|
|
74
|
+
ended: number;
|
|
75
|
+
error?: string;
|
|
76
|
+
skipped?: boolean;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export type DashboardEventMessage = MetricsUpdateMessage | ToolCallMessage | ClientConnectMessage | ClientDisconnectMessage | ErrorMessage | GenericMessage | SyntheticTraceMessage | MessagingEventMessage;
|
|
80
|
+
interface ExtendedWebSocket extends WebSocket {
|
|
81
|
+
isAlive?: boolean;
|
|
82
|
+
clientId?: string;
|
|
83
|
+
connectedAt?: number;
|
|
84
|
+
lastActivity?: number;
|
|
85
|
+
ipAddress?: string;
|
|
86
|
+
userAgent?: string;
|
|
87
|
+
}
|
|
88
|
+
export interface WebSocketManagerOptions {
|
|
89
|
+
path?: string;
|
|
90
|
+
maxConnections?: number;
|
|
91
|
+
pingInterval?: number;
|
|
92
|
+
pongTimeout?: number;
|
|
93
|
+
}
|
|
94
|
+
export declare class WebSocketManager {
|
|
95
|
+
private wss;
|
|
96
|
+
private clients;
|
|
97
|
+
private options;
|
|
98
|
+
private pingTimer?;
|
|
99
|
+
private persistenceManager;
|
|
100
|
+
constructor(options?: WebSocketManagerOptions);
|
|
101
|
+
/**
|
|
102
|
+
* Initialize WebSocket server
|
|
103
|
+
*/
|
|
104
|
+
initialize(server: HttpServer): void;
|
|
105
|
+
/**
|
|
106
|
+
* Broadcast message to all connected clients
|
|
107
|
+
*/
|
|
108
|
+
broadcast(message: DashboardEventMessage): void;
|
|
109
|
+
/**
|
|
110
|
+
* Send message to specific client
|
|
111
|
+
*/
|
|
112
|
+
sendToClient(client: ExtendedWebSocket, message: DashboardEventMessage): void;
|
|
113
|
+
/**
|
|
114
|
+
* Get connected client count
|
|
115
|
+
*/
|
|
116
|
+
getClientCount(): number;
|
|
117
|
+
/**
|
|
118
|
+
* Get all connected clients
|
|
119
|
+
*/
|
|
120
|
+
getClients(): ExtendedWebSocket[];
|
|
121
|
+
/**
|
|
122
|
+
* Close all connections and cleanup
|
|
123
|
+
*/
|
|
124
|
+
close(): void;
|
|
125
|
+
private handleConnection;
|
|
126
|
+
private handleClientMessage;
|
|
127
|
+
private sendError;
|
|
128
|
+
private startHeartbeat;
|
|
129
|
+
/** Generate a UUID using crypto.randomUUID if available */
|
|
130
|
+
private safeGenerateClientId;
|
|
131
|
+
/** Send current metrics snapshot to a specific client */
|
|
132
|
+
private sendCurrentMetrics;
|
|
133
|
+
/** Broadcast fresh metrics snapshot to all clients */
|
|
134
|
+
private broadcastMetricsSnapshot;
|
|
135
|
+
/**
|
|
136
|
+
* Return lightweight summaries of active websocket connections with real IDs and durations.
|
|
137
|
+
* Exposed via /api/admin/connections for dashboard consumption.
|
|
138
|
+
*/
|
|
139
|
+
getActiveConnectionSummaries(): {
|
|
140
|
+
id: string;
|
|
141
|
+
connectedAt: number;
|
|
142
|
+
durationMs: number;
|
|
143
|
+
}[];
|
|
144
|
+
/**
|
|
145
|
+
* Persist current WebSocket connection state to disk
|
|
146
|
+
*/
|
|
147
|
+
private persistConnectionState;
|
|
148
|
+
/**
|
|
149
|
+
* Update connection activity timestamp
|
|
150
|
+
*/
|
|
151
|
+
updateConnectionActivity(clientId: string): boolean;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get or create the global WebSocket manager instance
|
|
155
|
+
*/
|
|
156
|
+
export declare function getWebSocketManager(): WebSocketManager;
|
|
157
|
+
/**
|
|
158
|
+
* Set a custom WebSocket manager instance (useful for testing)
|
|
159
|
+
*/
|
|
160
|
+
export declare function setWebSocketManager(manager: WebSocketManager | null): void;
|
|
161
|
+
export {};
|