@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,472 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SUPPORTED_PROTOCOL_VERSIONS = void 0;
|
|
4
|
+
exports.isHandshakeTraceEnabled = isHandshakeTraceEnabled;
|
|
5
|
+
exports.handshakeLog = handshakeLog;
|
|
6
|
+
exports.isHandshakeFallbacksEnabled = isHandshakeFallbacksEnabled;
|
|
7
|
+
exports.record = record;
|
|
8
|
+
exports.isInitFrameDiagEnabled = isInitFrameDiagEnabled;
|
|
9
|
+
exports.initFrameLog = initFrameLog;
|
|
10
|
+
exports.negotiateProtocolVersion = negotiateProtocolVersion;
|
|
11
|
+
exports.emitReadyGlobal = emitReadyGlobal;
|
|
12
|
+
exports.setupStdinSniffer = setupStdinSniffer;
|
|
13
|
+
exports.setupSafetyFallbacks = setupSafetyFallbacks;
|
|
14
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
15
|
+
/**
|
|
16
|
+
* Handshake/protocol negotiation logic for the MCP server.
|
|
17
|
+
* Manages protocol version negotiation, handshake tracing, ready notification
|
|
18
|
+
* emission, stdin sniffing for initialize detection, and safety fallbacks.
|
|
19
|
+
*/
|
|
20
|
+
const runtimeConfig_1 = require("../config/runtimeConfig");
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Optional handshake tracing (enable via INDEX_SERVER_TRACE=handshake)
|
|
23
|
+
// Emits structured JSON lines to stderr prefixed with [handshake].
|
|
24
|
+
// Each event receives a monotonic sequence number.
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
function isHandshakeTraceEnabled() { return (0, runtimeConfig_1.getRuntimeConfig)().trace.has('handshake'); }
|
|
27
|
+
let HANDSHAKE_SEQ = 0;
|
|
28
|
+
function handshakeLog(stage, data) {
|
|
29
|
+
if (!isHandshakeTraceEnabled())
|
|
30
|
+
return; // fast path
|
|
31
|
+
try {
|
|
32
|
+
const payload = { handshake: true, seq: ++HANDSHAKE_SEQ, ts: new Date().toISOString(), stage, ...(data || {}) };
|
|
33
|
+
process.stderr.write(`[handshake] ${JSON.stringify(payload)}\n`);
|
|
34
|
+
}
|
|
35
|
+
catch { /* ignore */ }
|
|
36
|
+
}
|
|
37
|
+
// Central gating flag: by default we disable ALL non-primary ready fallbacks (watchdogs, safety timeouts,
|
|
38
|
+
// stdin sniff synthetic initialize, unconditional init fallbacks, etc.). Enable via
|
|
39
|
+
// INDEX_SERVER_INIT_FEATURES=handshakeFallbacks to re-enable the safety nets.
|
|
40
|
+
function isHandshakeFallbacksEnabled() { return (0, runtimeConfig_1.getRuntimeConfig)().initFeatures.has('handshakeFallbacks'); }
|
|
41
|
+
// Supported protocol versions (ordered descending preference – first is default)
|
|
42
|
+
exports.SUPPORTED_PROTOCOL_VERSIONS = ['2025-06-18', '2024-11-05', '2024-10-07'];
|
|
43
|
+
const HANDSHAKE_EVENTS = [];
|
|
44
|
+
function record(stage, extra) {
|
|
45
|
+
const evt = { seq: ++HANDSHAKE_SEQ, ts: new Date().toISOString(), stage, extra };
|
|
46
|
+
HANDSHAKE_EVENTS.push(evt);
|
|
47
|
+
if (HANDSHAKE_EVENTS.length > 50)
|
|
48
|
+
HANDSHAKE_EVENTS.shift();
|
|
49
|
+
if (isHandshakeTraceEnabled()) {
|
|
50
|
+
try {
|
|
51
|
+
process.stderr.write(`[handshake] ${JSON.stringify(evt)}\n`);
|
|
52
|
+
}
|
|
53
|
+
catch { /* ignore */ }
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// Initialize frame instrumentation (opt-in via INDEX_SERVER_TRACE=initFrame)
|
|
58
|
+
// Provides high-fidelity breadcrumbs to stderr with prefix [init-frame]
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
function isInitFrameDiagEnabled() { return (0, runtimeConfig_1.getRuntimeConfig)().trace.has('initFrame'); }
|
|
61
|
+
function initFrameLog(stage, extra) {
|
|
62
|
+
if (!isInitFrameDiagEnabled())
|
|
63
|
+
return;
|
|
64
|
+
try {
|
|
65
|
+
const payload = { stage, t: Date.now(), ...(extra || {}) };
|
|
66
|
+
process.stderr.write(`[init-frame] ${JSON.stringify(payload)}\n`);
|
|
67
|
+
}
|
|
68
|
+
catch { /* ignore */ }
|
|
69
|
+
}
|
|
70
|
+
// Expose reference for diagnostics_handshake tool (read-only access)
|
|
71
|
+
try {
|
|
72
|
+
global.HANDSHAKE_EVENTS_REF = HANDSHAKE_EVENTS;
|
|
73
|
+
}
|
|
74
|
+
catch { /* ignore */ }
|
|
75
|
+
// Helper: negotiate a protocol version with graceful fallback
|
|
76
|
+
function negotiateProtocolVersion(requested) {
|
|
77
|
+
if (!requested)
|
|
78
|
+
return exports.SUPPORTED_PROTOCOL_VERSIONS[0];
|
|
79
|
+
if (exports.SUPPORTED_PROTOCOL_VERSIONS.includes(requested))
|
|
80
|
+
return requested;
|
|
81
|
+
// Future: could attempt minor compatibility mapping. For now choose latest supported.
|
|
82
|
+
return exports.SUPPORTED_PROTOCOL_VERSIONS[0];
|
|
83
|
+
}
|
|
84
|
+
// Module-level idempotent ready emitter so both createSdkServer and startSdkServer dynamic paths can use it.
|
|
85
|
+
function emitReadyGlobal(server, reason) {
|
|
86
|
+
// Unified, ordering-safe emission of server/ready. Invoked ONLY after the
|
|
87
|
+
// initialize response has been (or is about to be) flushed.
|
|
88
|
+
try {
|
|
89
|
+
if (!server)
|
|
90
|
+
return;
|
|
91
|
+
if (server.__readyNotified)
|
|
92
|
+
return;
|
|
93
|
+
// Ordering gate: ONLY allow emission if initialize response actually flushed
|
|
94
|
+
if (!server.__initResponseSent) {
|
|
95
|
+
if (!isHandshakeFallbacksEnabled()) {
|
|
96
|
+
return; // strict mode: never emit early
|
|
97
|
+
}
|
|
98
|
+
const allowReasons = new Set(['unconditional-init-fallback', 'unconditional-init-fallback-direct', 'forced-init-fallback']);
|
|
99
|
+
if (!allowReasons.has(reason))
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const v = server.__declaredVersion || server.version || '0.0.0';
|
|
103
|
+
// Mark before sending to avoid re-entrancy
|
|
104
|
+
server.__readyNotified = true;
|
|
105
|
+
record('ready_emitted', { reason, version: v });
|
|
106
|
+
try {
|
|
107
|
+
process.stderr.write(`[ready] emit reason=${reason} version=${v}\n`);
|
|
108
|
+
}
|
|
109
|
+
catch { /* ignore */ }
|
|
110
|
+
const msg = { jsonrpc: '2.0', method: 'server/ready', params: { version: v } };
|
|
111
|
+
let dispatched = false;
|
|
112
|
+
// Prefer raw transport to bypass any SDK notification filtering.
|
|
113
|
+
try {
|
|
114
|
+
const t = server._transport;
|
|
115
|
+
if (t?.send) {
|
|
116
|
+
const p = t.send(msg);
|
|
117
|
+
p?.catch?.(() => { });
|
|
118
|
+
dispatched = true;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch { /* ignore */ }
|
|
122
|
+
if (!dispatched) {
|
|
123
|
+
try {
|
|
124
|
+
server.sendNotification?.({ method: 'server/ready', params: { version: v } });
|
|
125
|
+
dispatched = true;
|
|
126
|
+
}
|
|
127
|
+
catch { /* ignore */ }
|
|
128
|
+
}
|
|
129
|
+
if (!dispatched) {
|
|
130
|
+
// Final fallback direct stdout (rare path)
|
|
131
|
+
try {
|
|
132
|
+
process.stdout.write(JSON.stringify(msg) + '\n');
|
|
133
|
+
dispatched = true;
|
|
134
|
+
}
|
|
135
|
+
catch { /* ignore */ }
|
|
136
|
+
}
|
|
137
|
+
// Always follow with tools/list_changed AFTER ready to guarantee ordering.
|
|
138
|
+
try {
|
|
139
|
+
if (typeof server.sendToolListChanged === 'function') {
|
|
140
|
+
server.sendToolListChanged();
|
|
141
|
+
record('list_changed_after_ready');
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch { /* ignore */ }
|
|
145
|
+
}
|
|
146
|
+
catch { /* ignore */ }
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Pre-connect stdin sniffer: if we observe an initialize request but downstream logic fails
|
|
150
|
+
* to emit server/ready, schedule a guarded fallback emission.
|
|
151
|
+
*/
|
|
152
|
+
function setupStdinSniffer(server) {
|
|
153
|
+
try {
|
|
154
|
+
const disableInitSniff = (0, runtimeConfig_1.getRuntimeConfig)().initFeatures.has('disableSniff');
|
|
155
|
+
if (!server || disableInitSniff)
|
|
156
|
+
return;
|
|
157
|
+
const INIT_FALLBACK_ENABLED = (0, runtimeConfig_1.getRuntimeConfig)().initFeatures.has('initFallback');
|
|
158
|
+
let __sniffBuf = '';
|
|
159
|
+
if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed')) {
|
|
160
|
+
try {
|
|
161
|
+
if (!server.__diagRQMap) {
|
|
162
|
+
server.__diagRQMap = new Map();
|
|
163
|
+
server.__diagQueueDepthSniff = 0;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch { /* ignore */ }
|
|
167
|
+
}
|
|
168
|
+
process.stdin.on('data', (chunk) => {
|
|
169
|
+
try {
|
|
170
|
+
// Log first chunk (sanitized) once for corruption triage
|
|
171
|
+
if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed') && !server.__diagFirstChunkLogged) {
|
|
172
|
+
server.__diagFirstChunkLogged = true;
|
|
173
|
+
const raw = chunk.toString('utf8');
|
|
174
|
+
const snippet = raw.replace(/\r/g, ' ').replace(/\n/g, '\\n').slice(0, 240);
|
|
175
|
+
process.stderr.write(`[diag] ${Date.now()} stdin_first_chunk size=${chunk.length} snippet="${snippet}"\n`);
|
|
176
|
+
}
|
|
177
|
+
__sniffBuf += chunk.toString('utf8');
|
|
178
|
+
// Fast substring / subsequence search instead of full JSON parse
|
|
179
|
+
if (!(server.__sniffedInit)) {
|
|
180
|
+
const bufForScan = __sniffBuf.slice(-8000); // bound work
|
|
181
|
+
const direct = /"method"\s*:\s*"initialize"/.test(bufForScan);
|
|
182
|
+
let fuzzy = false;
|
|
183
|
+
let subseq = false;
|
|
184
|
+
if (!direct) {
|
|
185
|
+
// Fuzzy reconstruction (bounded gaps) scoped near a method sentinel
|
|
186
|
+
const target = 'initialize';
|
|
187
|
+
const methodIdx = bufForScan.indexOf('"method"');
|
|
188
|
+
const sliceA = methodIdx !== -1 ? bufForScan.slice(methodIdx, methodIdx + 1200) : '';
|
|
189
|
+
const trySlices = sliceA ? [sliceA] : [];
|
|
190
|
+
if (!sliceA && (0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed'))
|
|
191
|
+
trySlices.push(bufForScan.slice(-2000));
|
|
192
|
+
for (const slice of trySlices) {
|
|
193
|
+
let ti = 0;
|
|
194
|
+
let gaps = 0;
|
|
195
|
+
for (let i = 0; i < slice.length && ti < target.length; i++) {
|
|
196
|
+
const ch = slice[i];
|
|
197
|
+
if (ch.toLowerCase?.() === target[ti]) {
|
|
198
|
+
ti++;
|
|
199
|
+
gaps = 0;
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (gaps < 3) {
|
|
203
|
+
gaps++;
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
ti = 0;
|
|
207
|
+
gaps = 0;
|
|
208
|
+
if (ch.toLowerCase?.() === target[ti]) {
|
|
209
|
+
ti++;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (ti === target.length) {
|
|
213
|
+
fuzzy = true;
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Subsequence (very tolerant) – strip non-letters and search contiguous
|
|
218
|
+
if (!fuzzy) {
|
|
219
|
+
const letters = bufForScan.replace(/[^a-zA-Z]/g, '').toLowerCase();
|
|
220
|
+
let ti = 0;
|
|
221
|
+
for (let i = 0; i < letters.length && ti < target.length; i++) {
|
|
222
|
+
if (letters[i] === target[ti])
|
|
223
|
+
ti++;
|
|
224
|
+
}
|
|
225
|
+
if (ti === target.length)
|
|
226
|
+
subseq = true;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (direct || fuzzy || subseq) {
|
|
230
|
+
server.__sniffedInit = true;
|
|
231
|
+
const mode = direct ? 'direct' : (fuzzy ? 'fuzzy' : 'subseq');
|
|
232
|
+
if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed')) {
|
|
233
|
+
try {
|
|
234
|
+
const norm = bufForScan.slice(0, 400).replace(/\r/g, ' ').replace(/\n/g, '\\n');
|
|
235
|
+
process.stderr.write(`[diag] ${Date.now()} sniff_init_${mode}_detect buffer_bytes=${__sniffBuf.length} preview="${norm}"\n`);
|
|
236
|
+
}
|
|
237
|
+
catch { /* ignore */ }
|
|
238
|
+
}
|
|
239
|
+
// Schedule marking + optional synthetic dispatch if initialize not parsed normally
|
|
240
|
+
setTimeout(() => {
|
|
241
|
+
try {
|
|
242
|
+
if (!server.__sawInitializeRequest) {
|
|
243
|
+
server.__sawInitializeRequest = true;
|
|
244
|
+
if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed')) {
|
|
245
|
+
try {
|
|
246
|
+
process.stderr.write(`[diag] ${Date.now()} sniff_init_mark_sawInit mode=${mode}\n`);
|
|
247
|
+
}
|
|
248
|
+
catch { /* ignore */ }
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (INIT_FALLBACK_ENABLED && !server.__initResponseSent) {
|
|
252
|
+
setTimeout(() => {
|
|
253
|
+
try {
|
|
254
|
+
if (server.__initResponseSent || server.__syntheticInitDispatched)
|
|
255
|
+
return;
|
|
256
|
+
let id = 1;
|
|
257
|
+
const idMatch = /"id"\s*:\s*(\d{1,6})/.exec(bufForScan);
|
|
258
|
+
if (idMatch)
|
|
259
|
+
id = parseInt(idMatch[1], 10);
|
|
260
|
+
const req = { jsonrpc: '2.0', id, method: 'initialize', params: {} };
|
|
261
|
+
server.__syntheticInitDispatched = true;
|
|
262
|
+
const dispatch = server._onRequest || server._onrequest;
|
|
263
|
+
if (typeof dispatch === 'function') {
|
|
264
|
+
if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed')) {
|
|
265
|
+
try {
|
|
266
|
+
process.stderr.write(`[diag] ${Date.now()} sniff_init_synthetic_dispatch id=${id}\n`);
|
|
267
|
+
}
|
|
268
|
+
catch { /* ignore */ }
|
|
269
|
+
}
|
|
270
|
+
try {
|
|
271
|
+
dispatch.call(server, req);
|
|
272
|
+
}
|
|
273
|
+
catch { /* ignore */ }
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
catch { /* ignore */ }
|
|
277
|
+
}, 40).unref?.();
|
|
278
|
+
if (INIT_FALLBACK_ENABLED) {
|
|
279
|
+
// Forced result fallback if still not sent after additional grace
|
|
280
|
+
setTimeout(() => {
|
|
281
|
+
try {
|
|
282
|
+
if (server.__initResponseSent)
|
|
283
|
+
return;
|
|
284
|
+
const tr = server._transport || server.__transportRef;
|
|
285
|
+
if (tr && typeof tr.send === 'function') {
|
|
286
|
+
let negotiated = '2024-11-05';
|
|
287
|
+
try {
|
|
288
|
+
negotiated = (typeof negotiateProtocolVersion === 'function' ? negotiateProtocolVersion('2024-11-05') : negotiated) || negotiated;
|
|
289
|
+
}
|
|
290
|
+
catch { /* ignore */ }
|
|
291
|
+
const frame = { jsonrpc: '2.0', id: 1, result: { protocolVersion: negotiated, capabilities: {}, instructions: 'Use initialize -> tools/list -> tools/call { name, arguments }. (forced-init-fallback)' } };
|
|
292
|
+
server.__initResponseSent = true;
|
|
293
|
+
if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed')) {
|
|
294
|
+
try {
|
|
295
|
+
process.stderr.write(`[diag] ${Date.now()} sniff_init_forced_result_emit id=1 negotiated=${negotiated}\n`);
|
|
296
|
+
}
|
|
297
|
+
catch { /* ignore */ }
|
|
298
|
+
}
|
|
299
|
+
Promise.resolve(tr.send(frame)).then(() => {
|
|
300
|
+
if (!server.__readyNotified) {
|
|
301
|
+
emitReadyGlobal(server, 'forced-init-fallback');
|
|
302
|
+
}
|
|
303
|
+
}).catch(() => { });
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
catch { /* ignore */ }
|
|
307
|
+
}, 140).unref?.();
|
|
308
|
+
}
|
|
309
|
+
else if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed')) {
|
|
310
|
+
try {
|
|
311
|
+
process.stderr.write(`[diag] ${Date.now()} sniff_init_forced_result_skip gating_off\n`);
|
|
312
|
+
}
|
|
313
|
+
catch { /* ignore */ }
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (isHandshakeFallbacksEnabled()) {
|
|
317
|
+
if (server.__initResponseSent && !server.__readyNotified) {
|
|
318
|
+
emitReadyGlobal(server, 'stdin-sniff-fallback');
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
catch { /* ignore */ }
|
|
323
|
+
}, 60).unref?.();
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// Fallback rq_* enqueue capture (only if diag flag set AND dispatcher override not active)
|
|
327
|
+
if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed') && !server.__dispatcherOverrideActive) {
|
|
328
|
+
try {
|
|
329
|
+
let idx;
|
|
330
|
+
while ((idx = __sniffBuf.indexOf('\n')) !== -1) {
|
|
331
|
+
const line = __sniffBuf.slice(0, idx).trim();
|
|
332
|
+
__sniffBuf = __sniffBuf.slice(idx + 1);
|
|
333
|
+
if (!line)
|
|
334
|
+
continue;
|
|
335
|
+
let obj;
|
|
336
|
+
try {
|
|
337
|
+
obj = JSON.parse(line);
|
|
338
|
+
}
|
|
339
|
+
catch (e) {
|
|
340
|
+
if (/jsonrpc|method/i.test(line)) {
|
|
341
|
+
const frag = line.replace(/\r/g, ' ').replace(/\n/g, ' ').slice(0, 200);
|
|
342
|
+
process.stderr.write(`[diag] ${Date.now()} malformed_json_line len=${line.length} frag="${frag}" err=${e.message || e}\n`);
|
|
343
|
+
}
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
if (obj && obj.jsonrpc === '2.0' && obj.method && Object.prototype.hasOwnProperty.call(obj, 'id')) {
|
|
347
|
+
const metaName = obj.method === 'tools/call' ? obj?.params?.name : '';
|
|
348
|
+
const category = (() => {
|
|
349
|
+
if (obj.method === 'initialize')
|
|
350
|
+
return 'init';
|
|
351
|
+
if (obj.method === 'health_check' || metaName === 'health_check')
|
|
352
|
+
return 'health';
|
|
353
|
+
if (obj.method === 'metrics_snapshot' || metaName === 'metrics_snapshot')
|
|
354
|
+
return 'metrics';
|
|
355
|
+
if (metaName === 'meta_tools')
|
|
356
|
+
return 'meta';
|
|
357
|
+
return 'other';
|
|
358
|
+
})();
|
|
359
|
+
if (category === 'health' || category === 'metrics' || category === 'meta' || category === 'init') {
|
|
360
|
+
try {
|
|
361
|
+
server.__diagQueueDepthSniff++;
|
|
362
|
+
server.__diagRQMap.set(obj.id, { start: Date.now(), cat: category, method: obj.method });
|
|
363
|
+
process.stderr.write(`[diag] ${Date.now()} rq_enqueue method=${obj.method} cat=${category} id=${obj.id} qdepth=${server.__diagQueueDepthSniff} src=sniff\n`);
|
|
364
|
+
}
|
|
365
|
+
catch { /* ignore */ }
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
catch { /* ignore */ }
|
|
371
|
+
}
|
|
372
|
+
// Truncate buffer to avoid unbounded growth
|
|
373
|
+
if (__sniffBuf.length > 10_000) {
|
|
374
|
+
__sniffBuf = __sniffBuf.slice(-2048);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
catch { /* ignore */ }
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
catch { /* ignore */ }
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Safety fallback timers for missed ready emissions, unconditional DIAG fallback,
|
|
384
|
+
* and _oninitialize patch for protocol negotiation.
|
|
385
|
+
*/
|
|
386
|
+
function setupSafetyFallbacks(server) {
|
|
387
|
+
// Safety fallback: if server/ready not emitted within 100ms of start
|
|
388
|
+
if (isHandshakeFallbacksEnabled()) {
|
|
389
|
+
setTimeout(() => {
|
|
390
|
+
try {
|
|
391
|
+
// Only emit via safety-timeout if initialize response was already sent (ordering guarantee)
|
|
392
|
+
if (server.__sawInitializeRequest && server.__initResponseSent && !server.__readyNotified) {
|
|
393
|
+
handshakeLog('safety_timeout_emit_attempt', { label: 'safety-timeout-100ms', sawInit: true, initRespSent: true });
|
|
394
|
+
emitReadyGlobal(server, 'safety-timeout-100ms');
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
catch { /* ignore */ }
|
|
398
|
+
}, 100).unref?.();
|
|
399
|
+
}
|
|
400
|
+
// Unconditional DIAG fallback (gated): if no initialize request OR response observed very early
|
|
401
|
+
if (isHandshakeFallbacksEnabled()) {
|
|
402
|
+
setTimeout(() => {
|
|
403
|
+
try {
|
|
404
|
+
const INIT_FALLBACK_ENABLED = (0, runtimeConfig_1.getRuntimeConfig)().initFeatures.has('initFallback');
|
|
405
|
+
if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed') && !server.__initResponseSent) {
|
|
406
|
+
if (!INIT_FALLBACK_ENABLED) {
|
|
407
|
+
try {
|
|
408
|
+
process.stderr.write(`[diag] ${Date.now()} init_unconditional_fallback_skip gating_off\n`);
|
|
409
|
+
}
|
|
410
|
+
catch { /* ignore */ }
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
if (!server.__sawInitializeRequest) {
|
|
414
|
+
if (process.stderr && !server.__diagForcedInitLogged) {
|
|
415
|
+
server.__diagForcedInitLogged = true;
|
|
416
|
+
try {
|
|
417
|
+
process.stderr.write(`[diag] ${Date.now()} init_unconditional_fallback_emit id=1 reason=no_init_seen_150ms\n`);
|
|
418
|
+
}
|
|
419
|
+
catch { /* ignore */ }
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
try {
|
|
424
|
+
process.stderr.write(`[diag] ${Date.now()} init_unconditional_fallback_emit id=1 reason=init_seen_no_response_150ms\n`);
|
|
425
|
+
}
|
|
426
|
+
catch { /* ignore */ }
|
|
427
|
+
}
|
|
428
|
+
const negotiated = '2024-11-05';
|
|
429
|
+
const frame = { jsonrpc: '2.0', id: 1, result: { protocolVersion: negotiated, capabilities: {}, instructions: 'Use initialize -> tools/list -> tools/call { name, arguments }. (unconditional-init-fallback)' } };
|
|
430
|
+
const tr = server._transport || server.__transportRef;
|
|
431
|
+
server.__initResponseSent = true;
|
|
432
|
+
if (tr && typeof tr.send === 'function') {
|
|
433
|
+
Promise.resolve(tr.send(frame)).then(() => { if (!server.__readyNotified)
|
|
434
|
+
emitReadyGlobal(server, 'unconditional-init-fallback'); }).catch(() => { });
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
try {
|
|
438
|
+
process.stdout.write(JSON.stringify(frame) + '\n');
|
|
439
|
+
}
|
|
440
|
+
catch { /* ignore */ }
|
|
441
|
+
if (!server.__readyNotified)
|
|
442
|
+
emitReadyGlobal(server, 'unconditional-init-fallback-direct');
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
catch { /* ignore */ }
|
|
447
|
+
}, 150).unref?.();
|
|
448
|
+
}
|
|
449
|
+
// Patch initialize result for instructions (SDK internal property)
|
|
450
|
+
const originalInit = server._oninitialize;
|
|
451
|
+
if (originalInit && !server.__initPatched) {
|
|
452
|
+
server.__initPatched = true;
|
|
453
|
+
server._oninitialize = async function (request) {
|
|
454
|
+
try {
|
|
455
|
+
this.__sawInitializeRequest = true;
|
|
456
|
+
handshakeLog('oninitialize_enter', { sawInit: true, ready: !!this.__readyNotified, initRespSent: !!server.__initResponseSent });
|
|
457
|
+
}
|
|
458
|
+
catch { /* ignore */ }
|
|
459
|
+
const result = await originalInit.call(this, request);
|
|
460
|
+
try {
|
|
461
|
+
const negotiated = negotiateProtocolVersion(request?.params?.protocolVersion);
|
|
462
|
+
result.protocolVersion = negotiated;
|
|
463
|
+
if (result && typeof result === 'object' && !('instructions' in result)) {
|
|
464
|
+
result.instructions = 'Use initialize -> tools/list -> tools/call { name, arguments }. Health: tools/call health_check. Metrics: tools/call metrics_snapshot. Ping: ping.';
|
|
465
|
+
}
|
|
466
|
+
// Do NOT emit server/ready here; ordering handled strictly by transport send hook.
|
|
467
|
+
}
|
|
468
|
+
catch { /* ignore */ }
|
|
469
|
+
return result;
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Index Server - Dual Transport Architecture
|
|
4
|
+
*
|
|
5
|
+
* PRIMARY TRANSPORT - MCP Protocol (stdin/stdout):
|
|
6
|
+
* - JSON-RPC 2.0 over stdio for all MCP client communication
|
|
7
|
+
* - VS Code, Claude, and other MCP clients connect via stdin/stdout only
|
|
8
|
+
* - Process-isolated, no network exposure
|
|
9
|
+
*
|
|
10
|
+
* SECONDARY TRANSPORT - Admin Dashboard (optional HTTP):
|
|
11
|
+
* - HTTP server on localhost for administrator monitoring
|
|
12
|
+
* - Read-only interface for status, tools, and metrics
|
|
13
|
+
* - Not for MCP client communication - admin use only
|
|
14
|
+
*/
|
|
15
|
+
import '../services/logPrefix';
|
|
16
|
+
import '../services/logger';
|
|
17
|
+
import '../services/handlers.instructions';
|
|
18
|
+
import '../services/handlers.search';
|
|
19
|
+
import '../services/instructions.dispatcher';
|
|
20
|
+
import '../services/handlers.integrity';
|
|
21
|
+
import '../services/handlers.usage';
|
|
22
|
+
import '../services/handlers.prompt';
|
|
23
|
+
import '../services/handlers.metrics';
|
|
24
|
+
import '../services/handlers.gates';
|
|
25
|
+
import '../services/handlers.testPrimitive';
|
|
26
|
+
import '../services/handlers.diagnostics';
|
|
27
|
+
import '../services/handlers.feedback';
|
|
28
|
+
import '../services/handlers.help';
|
|
29
|
+
import '../services/handlers.instructionSchema';
|
|
30
|
+
import '../services/handlers.bootstrap';
|
|
31
|
+
import '../services/handlers.manifest';
|
|
32
|
+
import '../services/handlers.instructionsDiagnostics';
|
|
33
|
+
import '../services/handlers.graph';
|
|
34
|
+
import '../services/handlers.activation';
|
|
35
|
+
import '../services/handlers.promote';
|
|
36
|
+
export declare const shutdownGuard: import("./shutdownGuard").ShutdownGuard;
|
|
37
|
+
interface CliConfig {
|
|
38
|
+
dashboard: boolean;
|
|
39
|
+
dashboardPort: number;
|
|
40
|
+
dashboardHost: string;
|
|
41
|
+
maxPortTries: number;
|
|
42
|
+
legacy: boolean;
|
|
43
|
+
dashboardTls: boolean;
|
|
44
|
+
dashboardTlsCert?: string;
|
|
45
|
+
dashboardTlsKey?: string;
|
|
46
|
+
dashboardTlsCa?: string;
|
|
47
|
+
}
|
|
48
|
+
declare function parseArgs(argv: string[]): CliConfig;
|
|
49
|
+
declare function findPackageVersion(): string;
|
|
50
|
+
declare function startDashboard(cfg: CliConfig): Promise<{
|
|
51
|
+
url: string;
|
|
52
|
+
close: () => void;
|
|
53
|
+
} | null>;
|
|
54
|
+
export declare function main(): Promise<void>;
|
|
55
|
+
export { parseArgs as _parseArgs, findPackageVersion as _findPackageVersion, startDashboard as _startDashboard };
|
|
56
|
+
export { startDashboard };
|