@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,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Index Server - Thin Client Entry Point
|
|
3
|
+
*
|
|
4
|
+
* **EXPERIMENTAL** — APIs, configuration, and behavior may change.
|
|
5
|
+
*
|
|
6
|
+
* Lightweight stdio-to-HTTP bridge for MCP hosts.
|
|
7
|
+
* Instead of loading the full index and handler registry, this process
|
|
8
|
+
* reads JSON-RPC frames from stdin and forwards them to the leader server
|
|
9
|
+
* over HTTP.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* node dist/server/thin-client.js
|
|
13
|
+
*
|
|
14
|
+
* Environment:
|
|
15
|
+
* INDEX_SERVER_STATE_DIR - State directory to discover leader (default: ./data/state)
|
|
16
|
+
* INDEX_SERVER_LEADER_URL - Explicit leader URL (e.g., http://127.0.0.1:9090/mcp)
|
|
17
|
+
*
|
|
18
|
+
* The thin client auto-discovers the leader from the lock file in INDEX_SERVER_STATE_DIR,
|
|
19
|
+
* or connects to INDEX_SERVER_LEADER_URL if provided. On leader failover, it re-discovers
|
|
20
|
+
* and reconnects automatically.
|
|
21
|
+
*/
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Index Server - Thin Client Entry Point
|
|
4
|
+
*
|
|
5
|
+
* **EXPERIMENTAL** — APIs, configuration, and behavior may change.
|
|
6
|
+
*
|
|
7
|
+
* Lightweight stdio-to-HTTP bridge for MCP hosts.
|
|
8
|
+
* Instead of loading the full index and handler registry, this process
|
|
9
|
+
* reads JSON-RPC frames from stdin and forwards them to the leader server
|
|
10
|
+
* over HTTP.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* node dist/server/thin-client.js
|
|
14
|
+
*
|
|
15
|
+
* Environment:
|
|
16
|
+
* INDEX_SERVER_STATE_DIR - State directory to discover leader (default: ./data/state)
|
|
17
|
+
* INDEX_SERVER_LEADER_URL - Explicit leader URL (e.g., http://127.0.0.1:9090/mcp)
|
|
18
|
+
*
|
|
19
|
+
* The thin client auto-discovers the leader from the lock file in INDEX_SERVER_STATE_DIR,
|
|
20
|
+
* or connects to INDEX_SERVER_LEADER_URL if provided. On leader failover, it re-discovers
|
|
21
|
+
* and reconnects automatically.
|
|
22
|
+
*/
|
|
23
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
24
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
25
|
+
};
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
const path_1 = __importDefault(require("path"));
|
|
28
|
+
const ThinClient_js_1 = require("../dashboard/server/ThinClient.js");
|
|
29
|
+
const stateDir = process.env.INDEX_SERVER_STATE_DIR || path_1.default.join(process.cwd(), 'data', 'state');
|
|
30
|
+
const leaderUrl = process.env.INDEX_SERVER_LEADER_URL || undefined;
|
|
31
|
+
const client = new ThinClient_js_1.ThinClient({
|
|
32
|
+
leaderUrl,
|
|
33
|
+
stateDir,
|
|
34
|
+
maxRetries: 5,
|
|
35
|
+
retryDelayMs: 500,
|
|
36
|
+
});
|
|
37
|
+
process.stderr.write(`[thin-client] Starting stdio bridge (pid=${process.pid})\n`);
|
|
38
|
+
process.stderr.write(`[thin-client] State dir: ${stateDir}\n`);
|
|
39
|
+
if (leaderUrl) {
|
|
40
|
+
process.stderr.write(`[thin-client] Explicit leader URL: ${leaderUrl}\n`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const discovered = client.discoverLeader();
|
|
44
|
+
process.stderr.write(`[thin-client] Discovered leader: ${discovered || '(none yet — will retry on first request)'}\n`);
|
|
45
|
+
}
|
|
46
|
+
// Read JSON-RPC frames from stdin (Content-Length delimited or newline-delimited)
|
|
47
|
+
let buffer = '';
|
|
48
|
+
process.stdin.setEncoding('utf8');
|
|
49
|
+
process.stdin.on('data', (chunk) => {
|
|
50
|
+
buffer += chunk;
|
|
51
|
+
// Try Content-Length framing first (standard MCP protocol)
|
|
52
|
+
// eslint-disable-next-line no-constant-condition
|
|
53
|
+
while (true) {
|
|
54
|
+
const headerMatch = buffer.match(/^Content-Length:\s*(\d+)\r?\n\r?\n/);
|
|
55
|
+
if (headerMatch) {
|
|
56
|
+
const contentLength = parseInt(headerMatch[1], 10);
|
|
57
|
+
const headerEnd = headerMatch[0].length;
|
|
58
|
+
if (buffer.length >= headerEnd + contentLength) {
|
|
59
|
+
const frame = buffer.slice(headerEnd, headerEnd + contentLength);
|
|
60
|
+
buffer = buffer.slice(headerEnd + contentLength);
|
|
61
|
+
handleFrame(frame);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
break; // Wait for more data
|
|
65
|
+
}
|
|
66
|
+
// Fallback: newline-delimited JSON
|
|
67
|
+
const newlineIdx = buffer.indexOf('\n');
|
|
68
|
+
if (newlineIdx >= 0) {
|
|
69
|
+
const line = buffer.slice(0, newlineIdx).trim();
|
|
70
|
+
buffer = buffer.slice(newlineIdx + 1);
|
|
71
|
+
if (line.length > 0 && line.startsWith('{')) {
|
|
72
|
+
handleFrame(line);
|
|
73
|
+
}
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
break; // Wait for more data
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
async function handleFrame(frame) {
|
|
80
|
+
try {
|
|
81
|
+
const response = await client.processFrame(frame);
|
|
82
|
+
const responseBytes = Buffer.from(response, 'utf8');
|
|
83
|
+
process.stdout.write(`Content-Length: ${responseBytes.length}\r\n\r\n`);
|
|
84
|
+
process.stdout.write(responseBytes);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
const errorResponse = JSON.stringify({
|
|
88
|
+
jsonrpc: '2.0',
|
|
89
|
+
error: { code: -32603, message: err instanceof Error ? err.message : 'Internal error' },
|
|
90
|
+
id: null,
|
|
91
|
+
});
|
|
92
|
+
const errorBytes = Buffer.from(errorResponse, 'utf8');
|
|
93
|
+
process.stdout.write(`Content-Length: ${errorBytes.length}\r\n\r\n`);
|
|
94
|
+
process.stdout.write(errorBytes);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
process.stdin.on('end', () => {
|
|
98
|
+
process.stderr.write('[thin-client] stdin closed, shutting down\n');
|
|
99
|
+
client.stop();
|
|
100
|
+
process.exit(0);
|
|
101
|
+
});
|
|
102
|
+
process.on('SIGINT', () => {
|
|
103
|
+
process.stderr.write('[thin-client] SIGINT received, shutting down\n');
|
|
104
|
+
client.stop();
|
|
105
|
+
process.exit(0);
|
|
106
|
+
});
|
|
107
|
+
process.on('SIGTERM', () => {
|
|
108
|
+
process.stderr.write('[thin-client] SIGTERM received, shutting down\n');
|
|
109
|
+
client.stop();
|
|
110
|
+
process.exit(0);
|
|
111
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type Handler<TParams = unknown> = (params: TParams) => Promise<unknown> | unknown;
|
|
2
|
+
interface MetricRecord {
|
|
3
|
+
count: number;
|
|
4
|
+
totalMs: number;
|
|
5
|
+
maxMs: number;
|
|
6
|
+
}
|
|
7
|
+
/** Return the in-memory per-method metrics map (count, totalMs, maxMs).
|
|
8
|
+
* @returns Reference to the live metrics map keyed by method name
|
|
9
|
+
*/
|
|
10
|
+
export declare function getMetrics(): Record<string, MetricRecord>;
|
|
11
|
+
/**
|
|
12
|
+
* Register a method handler in the stdio transport's handler table.
|
|
13
|
+
* Unlike the SDK registry, this does not add wrapping (metrics, audit, etc.).
|
|
14
|
+
* @param method - JSON-RPC method name
|
|
15
|
+
* @param handler - Handler function invoked with the parsed params
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerHandler<TParams = unknown>(method: string, handler: Handler<TParams>): void;
|
|
18
|
+
/**
|
|
19
|
+
* Return a sorted list of all registered method names in the stdio transport.
|
|
20
|
+
* @returns Array of method name strings in alphabetical order
|
|
21
|
+
*/
|
|
22
|
+
export declare function listRegisteredMethods(): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Look up a registered handler by method name.
|
|
25
|
+
* @param method - JSON-RPC method name to look up
|
|
26
|
+
* @returns The handler function, or `undefined` if not registered
|
|
27
|
+
*/
|
|
28
|
+
export declare function getHandler(method: string): Handler | undefined;
|
|
29
|
+
export interface TransportOptions {
|
|
30
|
+
input?: NodeJS.ReadableStream;
|
|
31
|
+
output?: NodeJS.WritableStream;
|
|
32
|
+
stderr?: NodeJS.WritableStream;
|
|
33
|
+
env?: NodeJS.ProcessEnv;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Start the stdio JSON-RPC 2.0 transport, reading requests from stdin and writing responses to stdout.
|
|
37
|
+
* Registers built-in handlers for `initialize`, `notifications/initialized`, `shutdown`, and `exit`.
|
|
38
|
+
* @param opts - Optional stream overrides (input, output, stderr) and environment; defaults to process streams
|
|
39
|
+
*/
|
|
40
|
+
export declare function startTransport(opts?: TransportOptions): void;
|
|
41
|
+
export {};
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getMetrics = getMetrics;
|
|
7
|
+
exports.registerHandler = registerHandler;
|
|
8
|
+
exports.listRegisteredMethods = listRegisteredMethods;
|
|
9
|
+
exports.getHandler = getHandler;
|
|
10
|
+
exports.startTransport = startTransport;
|
|
11
|
+
/**
|
|
12
|
+
* MCP Transport Layer - stdio JSON-RPC 2.0 Only
|
|
13
|
+
*
|
|
14
|
+
* This module implements the primary MCP server transport over stdin/stdout.
|
|
15
|
+
* All MCP clients (VS Code, Claude, etc.) communicate exclusively through this stdio transport.
|
|
16
|
+
*
|
|
17
|
+
* Security: Process-isolated communication with no network exposure.
|
|
18
|
+
* Protocol: JSON-RPC 2.0 line-delimited over stdin/stdout streams.
|
|
19
|
+
*
|
|
20
|
+
* Note: The optional HTTP dashboard is implemented separately and is for admin use only.
|
|
21
|
+
*/
|
|
22
|
+
const readline_1 = require("readline");
|
|
23
|
+
const validationService_1 = require("../services/validationService");
|
|
24
|
+
const runtimeConfig_1 = require("../config/runtimeConfig");
|
|
25
|
+
const fs_1 = __importDefault(require("fs"));
|
|
26
|
+
const path_1 = __importDefault(require("path"));
|
|
27
|
+
// Robust version resolution: attempt cwd + relative to compiled dist location
|
|
28
|
+
const versionCandidates = [
|
|
29
|
+
path_1.default.join(process.cwd(), 'package.json'),
|
|
30
|
+
path_1.default.join(__dirname, '..', '..', 'package.json')
|
|
31
|
+
];
|
|
32
|
+
let VERSION = '0.0.0';
|
|
33
|
+
for (const p of versionCandidates) {
|
|
34
|
+
try {
|
|
35
|
+
if (fs_1.default.existsSync(p)) {
|
|
36
|
+
const raw = JSON.parse(fs_1.default.readFileSync(p, 'utf8'));
|
|
37
|
+
if (raw?.version) {
|
|
38
|
+
VERSION = raw.version;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch { /* ignore */ }
|
|
44
|
+
}
|
|
45
|
+
const handlers = {
|
|
46
|
+
'health_check': () => {
|
|
47
|
+
// Minimal fallback health; enriched version registered by handlers.metrics.ts overwrites this
|
|
48
|
+
let instances = [];
|
|
49
|
+
try {
|
|
50
|
+
// Dynamic require avoids circular dependency at module load time
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
52
|
+
const { getActiveInstances } = require('../dashboard/server/InstanceManager');
|
|
53
|
+
instances = getActiveInstances().map(i => ({ pid: i.pid, port: i.port, host: i.host, startedAt: i.startedAt, current: i.current }));
|
|
54
|
+
}
|
|
55
|
+
catch { /* fail-open */ }
|
|
56
|
+
return { status: 'ok', timestamp: new Date().toISOString(), version: VERSION, pid: process.pid, uptime: Math.round(process.uptime()), instances };
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
const metrics = {};
|
|
60
|
+
/** Return the in-memory per-method metrics map (count, totalMs, maxMs).
|
|
61
|
+
* @returns Reference to the live metrics map keyed by method name
|
|
62
|
+
*/
|
|
63
|
+
function getMetrics() { return metrics; }
|
|
64
|
+
const handlerMeta = {};
|
|
65
|
+
/**
|
|
66
|
+
* Register a method handler in the stdio transport's handler table.
|
|
67
|
+
* Unlike the SDK registry, this does not add wrapping (metrics, audit, etc.).
|
|
68
|
+
* @param method - JSON-RPC method name
|
|
69
|
+
* @param handler - Handler function invoked with the parsed params
|
|
70
|
+
*/
|
|
71
|
+
function registerHandler(method, handler) {
|
|
72
|
+
handlers[method] = handler;
|
|
73
|
+
handlerMeta[method] = { method };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Return a sorted list of all registered method names in the stdio transport.
|
|
77
|
+
* @returns Array of method name strings in alphabetical order
|
|
78
|
+
*/
|
|
79
|
+
function listRegisteredMethods() {
|
|
80
|
+
return Object.keys(handlerMeta).sort();
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Look up a registered handler by method name.
|
|
84
|
+
* @param method - JSON-RPC method name to look up
|
|
85
|
+
* @returns The handler function, or `undefined` if not registered
|
|
86
|
+
*/
|
|
87
|
+
function getHandler(method) {
|
|
88
|
+
return handlers[method];
|
|
89
|
+
}
|
|
90
|
+
function makeError(id, code, message, data) {
|
|
91
|
+
return { jsonrpc: '2.0', id: id ?? null, error: { code, message, data } };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Start the stdio JSON-RPC 2.0 transport, reading requests from stdin and writing responses to stdout.
|
|
95
|
+
* Registers built-in handlers for `initialize`, `notifications/initialized`, `shutdown`, and `exit`.
|
|
96
|
+
* @param opts - Optional stream overrides (input, output, stderr) and environment; defaults to process streams
|
|
97
|
+
*/
|
|
98
|
+
function startTransport(opts = {}) {
|
|
99
|
+
const runtimeConfig = (0, runtimeConfig_1.getRuntimeConfig)();
|
|
100
|
+
const verbose = runtimeConfig.logging.verbose;
|
|
101
|
+
const protocolLog = runtimeConfig.logging.protocol; // raw frames (parsed) logging
|
|
102
|
+
const diag = runtimeConfig.logging.diagnostics || verbose; // banner + environment snapshot
|
|
103
|
+
const log = (level, msg, extra) => {
|
|
104
|
+
if (level === 'debug' && !verbose)
|
|
105
|
+
return;
|
|
106
|
+
const ts = new Date().toISOString();
|
|
107
|
+
const line = `[${ts}] [${level}] ${msg}`;
|
|
108
|
+
try {
|
|
109
|
+
(opts.stderr || process.stderr).write(line + (extra ? ` ${JSON.stringify(extra)}` : '') + '\n');
|
|
110
|
+
}
|
|
111
|
+
catch { /* ignore */ }
|
|
112
|
+
};
|
|
113
|
+
if (diag) {
|
|
114
|
+
log('info', 'startup', {
|
|
115
|
+
version: VERSION,
|
|
116
|
+
pid: process.pid,
|
|
117
|
+
node: process.version,
|
|
118
|
+
cwd: process.cwd(),
|
|
119
|
+
mutationEnabled: runtimeConfig.mutationEnabled,
|
|
120
|
+
verbose,
|
|
121
|
+
protocolLog,
|
|
122
|
+
diagnosticsEnabled: runtimeConfig.logging.diagnostics
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
// Global crash / rejection safety net to aid diagnostics in host clients that only see silent exits.
|
|
126
|
+
// Note: process.exit() is handled by the unified shutdownGuard in index.ts (Issue #36 fix).
|
|
127
|
+
// This handler only logs — the guard prevents duplicate exit() races.
|
|
128
|
+
process.on('uncaughtException', (err) => {
|
|
129
|
+
log('error', 'uncaughtException', { message: err.message, stack: err.stack });
|
|
130
|
+
});
|
|
131
|
+
process.on('unhandledRejection', (reason) => {
|
|
132
|
+
const msg = typeof reason === 'object' && reason && 'message' in reason ? reason.message : String(reason);
|
|
133
|
+
log('error', 'unhandledRejection', { reason: msg });
|
|
134
|
+
});
|
|
135
|
+
// Handshake state & helpers (deterministic: initialize result flushes, then server/ready)
|
|
136
|
+
let initialized = false;
|
|
137
|
+
let readyEmitted = false;
|
|
138
|
+
function emitReady(reason) {
|
|
139
|
+
if (readyEmitted)
|
|
140
|
+
return;
|
|
141
|
+
readyEmitted = true;
|
|
142
|
+
try {
|
|
143
|
+
(opts.output || process.stdout).write(JSON.stringify({ jsonrpc: '2.0', method: 'server/ready', params: { version: VERSION, reason } }) + '\n');
|
|
144
|
+
(opts.output || process.stdout).write(JSON.stringify({ jsonrpc: '2.0', method: 'notifications/tools/list_changed', params: {} }) + '\n');
|
|
145
|
+
}
|
|
146
|
+
catch { /* ignore */ }
|
|
147
|
+
}
|
|
148
|
+
// Replace initialize handler with direct interception below to control write callback ordering.
|
|
149
|
+
registerHandler('initialize', (params) => {
|
|
150
|
+
// This body will be bypassed by explicit fast-path in line reader (kept for compatibility if called indirectly)
|
|
151
|
+
const p = params;
|
|
152
|
+
return {
|
|
153
|
+
protocolVersion: p?.protocolVersion || '2025-06-18',
|
|
154
|
+
serverInfo: { name: 'index', version: VERSION },
|
|
155
|
+
capabilities: { roots: { listChanged: true }, tools: { listChanged: true } }
|
|
156
|
+
};
|
|
157
|
+
});
|
|
158
|
+
// Accept notification some clients send post-initialize; respond benignly (single registration)
|
|
159
|
+
registerHandler('notifications/initialized', () => ({ acknowledged: true }));
|
|
160
|
+
registerHandler('shutdown', () => ({ shuttingDown: true }));
|
|
161
|
+
registerHandler('exit', () => { setTimeout(() => process.exit(0), 0); return { exiting: true }; });
|
|
162
|
+
// Use readline only for input parsing; do NOT set output to avoid echoing client-sent
|
|
163
|
+
// JSON-RPC request lines back to stdout (which confused tests expecting only server
|
|
164
|
+
// responses and caused false negatives when matching initialize/result frames).
|
|
165
|
+
const rl = (0, readline_1.createInterface)({ input: opts.input || process.stdin });
|
|
166
|
+
const respondFn = (obj) => {
|
|
167
|
+
if (protocolLog) {
|
|
168
|
+
const base = { id: obj.id ?? null };
|
|
169
|
+
if ('error' in obj)
|
|
170
|
+
base.error = obj.error.code;
|
|
171
|
+
else
|
|
172
|
+
base.ok = true;
|
|
173
|
+
log('debug', 'send', base);
|
|
174
|
+
}
|
|
175
|
+
(opts.output || process.stdout).write(JSON.stringify(obj) + '\n');
|
|
176
|
+
};
|
|
177
|
+
// NOTE: Unlike earlier versions we DO NOT emit server/ready until after initialize response.
|
|
178
|
+
// This matches stricter clients (and reference PowerShell server) that expect handshake ordering.
|
|
179
|
+
rl.on('line', (line) => {
|
|
180
|
+
const trimmed = line.trim();
|
|
181
|
+
if (!trimmed)
|
|
182
|
+
return;
|
|
183
|
+
if (trimmed === 'quit') {
|
|
184
|
+
process.exit(0);
|
|
185
|
+
}
|
|
186
|
+
let req;
|
|
187
|
+
try {
|
|
188
|
+
req = JSON.parse(trimmed);
|
|
189
|
+
if (protocolLog) {
|
|
190
|
+
log('debug', 'recv', { id: req.id ?? null, method: req.method });
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
log('error', 'parse_error', { raw: trimmed.slice(0, 200) });
|
|
195
|
+
respondFn(makeError(null, -32700, 'Parse error'));
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (req.jsonrpc !== '2.0' || !req.method) {
|
|
199
|
+
respondFn(makeError(req.id ?? null, -32600, 'Invalid Request'));
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
// Fast-path initialize for deterministic ordering: respond immediately with write callback then schedule ready.
|
|
203
|
+
if (req.method === 'initialize') {
|
|
204
|
+
const p = req.params;
|
|
205
|
+
if (initialized) {
|
|
206
|
+
respondFn(makeError(req.id ?? null, -32600, 'Already initialized'));
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
initialized = true;
|
|
210
|
+
// Reuse registered initialize handler so future shared logic (capability changes, root listing, etc.) stays centralized.
|
|
211
|
+
const initHandler = handlers['initialize'];
|
|
212
|
+
const start = Date.now();
|
|
213
|
+
let resultPayload;
|
|
214
|
+
try {
|
|
215
|
+
resultPayload = initHandler ? initHandler(req.params) : {
|
|
216
|
+
protocolVersion: p?.protocolVersion || '2025-06-18',
|
|
217
|
+
serverInfo: { name: 'index', version: VERSION },
|
|
218
|
+
capabilities: { roots: { listChanged: true }, tools: { listChanged: true } }
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
catch (e) {
|
|
222
|
+
respondFn(makeError(req.id ?? null, -32603, 'Initialize handler failure', { message: e?.message }));
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
// Support promise return from handler
|
|
226
|
+
Promise.resolve(resultPayload).then(resolved => {
|
|
227
|
+
const dur = Date.now() - start;
|
|
228
|
+
const rec = metrics['initialize'] || (metrics['initialize'] = { count: 0, totalMs: 0, maxMs: 0 });
|
|
229
|
+
rec.count++;
|
|
230
|
+
rec.totalMs += dur;
|
|
231
|
+
if (dur > rec.maxMs)
|
|
232
|
+
rec.maxMs = dur;
|
|
233
|
+
const initResult = { jsonrpc: '2.0', id: req.id ?? 1, result: resolved };
|
|
234
|
+
try {
|
|
235
|
+
if (protocolLog) {
|
|
236
|
+
log('debug', 'respond_success', { id: req.id ?? 1, method: 'initialize' });
|
|
237
|
+
}
|
|
238
|
+
(opts.output || process.stdout).write(JSON.stringify(initResult) + '\n', () => {
|
|
239
|
+
// Primary ready emission via macrotask after write flush
|
|
240
|
+
setTimeout(() => emitReady('post-initialize'), 0);
|
|
241
|
+
// Microtask fallback (parity with minimal server) for extreme scheduler edge cases
|
|
242
|
+
queueMicrotask(() => { if (!readyEmitted)
|
|
243
|
+
emitReady('post-initialize-microtask'); });
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
respondFn(makeError(req.id ?? null, -32603, 'Failed to write initialize result'));
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
const handler = handlers[req.method];
|
|
253
|
+
if (!handler) {
|
|
254
|
+
// Provide richer context for missing method to help client authors.
|
|
255
|
+
const available = listRegisteredMethods();
|
|
256
|
+
log('debug', 'method_not_found', { requested: req.method, availableCount: available.length });
|
|
257
|
+
respondFn(makeError(req.id ?? null, -32601, 'Method not found', { method: req.method, available }));
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
// Pre-dispatch parameter validation using registry input schemas (when available)
|
|
261
|
+
try {
|
|
262
|
+
const validation = (0, validationService_1.validateParams)(req.method, req.params);
|
|
263
|
+
if (!validation.ok) {
|
|
264
|
+
respondFn(makeError(req.id ?? null, -32602, 'Invalid params', { method: req.method, errors: validation.errors }));
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
catch (e) { /* fail-open on validator issues */ }
|
|
269
|
+
const start = Date.now();
|
|
270
|
+
Promise.resolve()
|
|
271
|
+
.then(() => handler(req.params))
|
|
272
|
+
.then(result => {
|
|
273
|
+
if (!initialized) {
|
|
274
|
+
log('debug', 'call_before_initialize', { method: req.method });
|
|
275
|
+
}
|
|
276
|
+
const dur = Date.now() - start;
|
|
277
|
+
const rec = metrics[req.method] || (metrics[req.method] = { count: 0, totalMs: 0, maxMs: 0 });
|
|
278
|
+
rec.count++;
|
|
279
|
+
rec.totalMs += dur;
|
|
280
|
+
if (dur > rec.maxMs)
|
|
281
|
+
rec.maxMs = dur;
|
|
282
|
+
if (req.id !== undefined && req.id !== null) {
|
|
283
|
+
try {
|
|
284
|
+
if (protocolLog || verbose)
|
|
285
|
+
log('debug', 'respond_success', { id: req.id, method: req.method });
|
|
286
|
+
}
|
|
287
|
+
catch { /* ignore */ }
|
|
288
|
+
respondFn({ jsonrpc: '2.0', id: req.id, result });
|
|
289
|
+
}
|
|
290
|
+
})
|
|
291
|
+
.catch(e => {
|
|
292
|
+
const dur = Date.now() - start;
|
|
293
|
+
const rec = metrics[req.method] || (metrics[req.method] = { count: 0, totalMs: 0, maxMs: 0 });
|
|
294
|
+
rec.count++;
|
|
295
|
+
rec.totalMs += dur;
|
|
296
|
+
if (dur > rec.maxMs)
|
|
297
|
+
rec.maxMs = dur;
|
|
298
|
+
const maybeErr = e;
|
|
299
|
+
if (maybeErr && typeof maybeErr === 'object' && Number.isSafeInteger(maybeErr.code)) {
|
|
300
|
+
log('error', 'handler_error', { method: req.method, message: maybeErr.message, code: maybeErr.code });
|
|
301
|
+
respondFn(makeError(req.id ?? null, maybeErr.code, maybeErr.message || 'Error', { method: req.method, ...(maybeErr.data || {}) }));
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
const errObj = e instanceof Error ? { message: e.message, stack: e.stack } : { message: 'Unknown error', value: e };
|
|
305
|
+
log('error', 'handler_error', { method: req.method, ...errObj });
|
|
306
|
+
respondFn(makeError(req.id ?? null, -32603, 'Internal error', { method: req.method, ...errObj }));
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
if (require.main === module) {
|
|
311
|
+
startTransport();
|
|
312
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const dynamicImport: (specifier: string) => any;
|
|
2
|
+
/**
|
|
3
|
+
* Set up stdout diagnostics wrapper for backpressure monitoring.
|
|
4
|
+
* Enabled via INDEX_SERVER_TRACE=healthMixed.
|
|
5
|
+
*/
|
|
6
|
+
export declare function setupStdoutDiagnostics(): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Override the internal request dispatcher to retain error.data & emit diagnostics.
|
|
9
|
+
* The upstream SDK has used both `_onRequest` (camel) and `_onrequest` (lower) across versions;
|
|
10
|
+
* we defensively hook whichever exists and assign our wrapper to BOTH names.
|
|
11
|
+
*/
|
|
12
|
+
export declare function setupDispatcherOverride(server: any): void;
|
|
13
|
+
/**
|
|
14
|
+
* Wrap transport.send to detect initialize response flush and emit ready.
|
|
15
|
+
*/
|
|
16
|
+
export declare function wrapTransportSend(server: any, transport: any): void;
|
|
17
|
+
/**
|
|
18
|
+
* Explicit keepalive to avoid premature process exit before first client request.
|
|
19
|
+
* @param label - Optional label for diagnostic log messages (e.g. 'secondary')
|
|
20
|
+
*/
|
|
21
|
+
export declare function setupKeepalive(label?: string): void;
|