@jagilber-org/index-server 1.22.1 → 1.26.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +87 -2
- package/CODE_OF_CONDUCT.md +2 -0
- package/CONTRIBUTING.md +32 -2
- package/README.md +82 -19
- package/SECURITY.md +17 -5
- package/dist/config/dashboardConfig.d.ts +3 -0
- package/dist/config/dashboardConfig.js +3 -0
- package/dist/config/defaultValues.d.ts +1 -1
- package/dist/config/defaultValues.js +1 -1
- package/dist/config/featureConfig.d.ts +2 -0
- package/dist/config/featureConfig.js +6 -1
- package/dist/config/runtimeConfig.d.ts +1 -1
- package/dist/config/runtimeConfig.js +8 -9
- package/dist/dashboard/client/admin.html +170 -53
- package/dist/dashboard/client/css/admin.css +132 -0
- package/dist/dashboard/client/js/admin.auth.js +25 -11
- package/dist/dashboard/client/js/admin.config.js +1 -1
- package/dist/dashboard/client/js/admin.feedback.js +328 -0
- package/dist/dashboard/client/js/admin.graph.js +120 -18
- package/dist/dashboard/client/js/admin.instructions.js +27 -13
- package/dist/dashboard/client/js/admin.logs.js +1 -5
- package/dist/dashboard/client/js/admin.maintenance.js +53 -8
- package/dist/dashboard/client/js/admin.messaging.js +1 -4
- package/dist/dashboard/client/js/admin.overview.js +5 -1
- package/dist/dashboard/client/js/admin.sessions.js +1 -1
- package/dist/dashboard/client/js/admin.utils.js +43 -1
- package/dist/dashboard/client/js/mermaid.min.js +813 -537
- package/dist/dashboard/export/DataExporter.js +2 -1
- package/dist/dashboard/server/AdminPanel.d.ts +3 -0
- package/dist/dashboard/server/AdminPanel.js +132 -35
- package/dist/dashboard/server/ApiRoutes.js +40 -9
- package/dist/dashboard/server/DashboardServer.js +1 -1
- package/dist/dashboard/server/FileMetricsStorage.d.ts +19 -0
- package/dist/dashboard/server/FileMetricsStorage.js +52 -5
- package/dist/dashboard/server/HttpTransport.js +6 -0
- package/dist/dashboard/server/InstanceManager.js +7 -2
- package/dist/dashboard/server/KnowledgeStore.js +7 -2
- package/dist/dashboard/server/MetricsCollector.d.ts +16 -0
- package/dist/dashboard/server/MetricsCollector.js +113 -17
- package/dist/dashboard/server/legacyDashboardHtml.js +7 -2
- package/dist/dashboard/server/middleware/ensureLoadedMiddleware.d.ts +1 -1
- package/dist/dashboard/server/middleware/ensureLoadedMiddleware.js +8 -3
- package/dist/dashboard/server/routes/admin.feedback.routes.d.ts +15 -0
- package/dist/dashboard/server/routes/admin.feedback.routes.js +188 -0
- package/dist/dashboard/server/routes/admin.routes.js +35 -27
- package/dist/dashboard/server/routes/alerts.routes.js +4 -3
- package/dist/dashboard/server/routes/api.feedback.routes.js +2 -1
- package/dist/dashboard/server/routes/api.usage.routes.js +8 -7
- package/dist/dashboard/server/routes/embeddings.routes.d.ts +2 -1
- package/dist/dashboard/server/routes/embeddings.routes.js +18 -9
- package/dist/dashboard/server/routes/graph.routes.js +10 -13
- package/dist/dashboard/server/routes/index.d.ts +1 -0
- package/dist/dashboard/server/routes/index.js +74 -39
- package/dist/dashboard/server/routes/instances.routes.js +2 -1
- package/dist/dashboard/server/routes/instructions.routes.js +46 -27
- package/dist/dashboard/server/routes/knowledge.routes.js +4 -3
- package/dist/dashboard/server/routes/logs.routes.js +5 -4
- package/dist/dashboard/server/routes/messaging.routes.js +15 -14
- package/dist/dashboard/server/routes/metrics.routes.js +14 -13
- package/dist/dashboard/server/routes/scripts.routes.js +6 -3
- package/dist/dashboard/server/routes/status.routes.js +5 -4
- package/dist/dashboard/server/routes/synthetic.routes.js +3 -2
- package/dist/dashboard/server/routes/usage.routes.js +2 -1
- package/dist/dashboard/server/utils/escapeHtml.d.ts +1 -0
- package/dist/dashboard/server/utils/escapeHtml.js +11 -0
- package/dist/dashboard/server/utils/pathContainment.d.ts +1 -0
- package/dist/dashboard/server/utils/pathContainment.js +15 -0
- package/dist/dashboard/server/wsInit.js +2 -2
- package/dist/lib/mcpStdioLogging.d.ts +165 -0
- package/dist/lib/mcpStdioLogging.js +287 -0
- package/dist/schemas/index.d.ts +37 -2
- package/dist/schemas/index.js +27 -3
- package/dist/server/backgroundServicesStartup.d.ts +7 -1
- package/dist/server/backgroundServicesStartup.js +25 -8
- package/dist/server/certInit.d.ts +97 -0
- package/dist/server/certInit.js +359 -0
- package/dist/server/certInit.types.d.ts +92 -0
- package/dist/server/certInit.types.js +34 -0
- package/dist/server/handshake/fallbackFrames.d.ts +31 -0
- package/dist/server/handshake/fallbackFrames.js +38 -0
- package/dist/server/handshake/initializeDetector.d.ts +31 -0
- package/dist/server/handshake/initializeDetector.js +88 -0
- package/dist/server/handshake/protocol.d.ts +15 -0
- package/dist/server/handshake/protocol.js +37 -0
- package/dist/server/handshake/readyEmitter.d.ts +6 -0
- package/dist/server/handshake/readyEmitter.js +88 -0
- package/dist/server/handshake/safetyFallbacks.d.ts +1 -0
- package/dist/server/handshake/safetyFallbacks.js +134 -0
- package/dist/server/handshake/stdinSniffer.d.ts +1 -0
- package/dist/server/handshake/stdinSniffer.js +260 -0
- package/dist/server/handshake/tracing.d.ts +16 -0
- package/dist/server/handshake/tracing.js +95 -0
- package/dist/server/handshakeManager.d.ts +23 -23
- package/dist/server/handshakeManager.js +36 -466
- package/dist/server/index-server.d.ts +23 -0
- package/dist/server/index-server.js +194 -9
- package/dist/server/mcpReadOnlySurfaces.d.ts +44 -0
- package/dist/server/mcpReadOnlySurfaces.js +297 -0
- package/dist/server/sdkServer.js +69 -7
- package/dist/server/transport.d.ts +5 -6
- package/dist/server/transport.js +46 -64
- package/dist/server/transportFactory.d.ts +3 -9
- package/dist/server/transportFactory.js +18 -380
- package/dist/services/atomicFs.d.ts +3 -0
- package/dist/services/atomicFs.js +171 -13
- package/dist/services/auditLog.d.ts +17 -2
- package/dist/services/auditLog.js +75 -14
- package/dist/services/bootstrapGating.js +1 -1
- package/dist/services/categoryRules.d.ts +10 -0
- package/dist/services/categoryRules.js +17 -0
- package/dist/services/classificationService.js +7 -5
- package/dist/services/embeddingService.d.ts +27 -11
- package/dist/services/embeddingService.js +51 -14
- package/dist/services/feedbackStorage.d.ts +39 -0
- package/dist/services/feedbackStorage.js +88 -0
- package/dist/services/handlers/instructions.add.js +429 -317
- package/dist/services/handlers/instructions.groom.js +128 -31
- package/dist/services/handlers/instructions.import.js +56 -23
- package/dist/services/handlers/instructions.patch.js +43 -32
- package/dist/services/handlers/instructions.query.js +20 -29
- package/dist/services/handlers/instructions.shared.d.ts +54 -0
- package/dist/services/handlers/instructions.shared.js +126 -1
- package/dist/services/handlers.activation.js +83 -81
- package/dist/services/handlers.dashboardConfig.d.ts +2 -2
- package/dist/services/handlers.dashboardConfig.js +1 -2
- package/dist/services/handlers.diagnostics.js +75 -54
- package/dist/services/handlers.feedback.d.ts +4 -11
- package/dist/services/handlers.feedback.js +11 -333
- package/dist/services/handlers.gates.js +69 -37
- package/dist/services/handlers.graph.js +2 -2
- package/dist/services/handlers.help.js +2 -2
- package/dist/services/handlers.instructionSchema.js +4 -2
- package/dist/services/handlers.integrity.js +42 -22
- package/dist/services/handlers.messaging.js +1 -1
- package/dist/services/handlers.metrics.js +51 -6
- package/dist/services/handlers.prompt.js +10 -2
- package/dist/services/handlers.search.js +94 -44
- package/dist/services/handlers.trace.js +1 -1
- package/dist/services/handlers.usage.js +38 -7
- package/dist/services/indexContext.d.ts +21 -1
- package/dist/services/indexContext.js +263 -78
- package/dist/services/indexLoader.d.ts +1 -0
- package/dist/services/indexLoader.js +28 -8
- package/dist/services/instructionRecordValidation.d.ts +39 -0
- package/dist/services/instructionRecordValidation.js +388 -0
- package/dist/services/instructions.dispatcher.js +4 -4
- package/dist/services/loaderSchemaValidator.d.ts +15 -0
- package/dist/services/loaderSchemaValidator.js +69 -0
- package/dist/services/logger.js +11 -2
- package/dist/services/mcpLogBridge.d.ts +49 -0
- package/dist/services/mcpLogBridge.js +83 -0
- package/dist/services/ownershipService.js +18 -8
- package/dist/services/performanceBaseline.js +23 -22
- package/dist/services/promptReviewService.d.ts +3 -1
- package/dist/services/promptReviewService.js +41 -13
- package/dist/services/regexSafety.d.ts +6 -0
- package/dist/services/regexSafety.js +46 -0
- package/dist/services/seedBootstrap.js +1 -1
- package/dist/services/storage/factory.d.ts +14 -1
- package/dist/services/storage/factory.js +61 -1
- package/dist/services/storage/jsonEmbeddingStore.d.ts +15 -0
- package/dist/services/storage/jsonEmbeddingStore.js +83 -0
- package/dist/services/storage/jsonFileStore.d.ts +3 -1
- package/dist/services/storage/jsonFileStore.js +8 -6
- package/dist/services/storage/migrationEngine.d.ts +13 -0
- package/dist/services/storage/migrationEngine.js +31 -0
- package/dist/services/storage/sqliteEmbeddingStore.d.ts +30 -0
- package/dist/services/storage/sqliteEmbeddingStore.js +222 -0
- package/dist/services/storage/sqliteStore.d.ts +3 -1
- package/dist/services/storage/sqliteStore.js +2 -2
- package/dist/services/storage/types.d.ts +48 -1
- package/dist/services/toolRegistry.js +77 -67
- package/dist/services/toolRegistry.zod.js +89 -86
- package/dist/services/tracing.js +5 -4
- package/dist/utils/envUtils.d.ts +4 -0
- package/dist/utils/envUtils.js +7 -0
- package/dist/utils/memoryMonitor.js +11 -10
- package/package.json +11 -4
- package/schemas/instruction.schema.json +38 -1
- package/scripts/copy-dashboard-assets.mjs +1 -1
- package/scripts/dist/README.md +1 -1
- package/scripts/setup-wizard.mjs +781 -0
- package/server.json +1 -0
- package/dist/externalClientLib.d.ts +0 -1
- package/dist/externalClientLib.js +0 -2
- package/dist/portableClientWrapper.d.ts +0 -1
- package/dist/portableClientWrapper.js +0 -2
- package/dist/services/indexingService.d.ts +0 -1
- package/dist/services/indexingService.js +0 -2
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
export declare function isHandshakeTraceEnabled(): boolean;
|
|
2
|
-
export declare function handshakeLog(stage: string, data?: Record<string, unknown>): void;
|
|
3
|
-
export declare function isHandshakeFallbacksEnabled(): boolean;
|
|
4
|
-
export declare const SUPPORTED_PROTOCOL_VERSIONS: string[];
|
|
5
|
-
export interface HandshakeEvent {
|
|
6
|
-
seq: number;
|
|
7
|
-
ts: string;
|
|
8
|
-
stage: string;
|
|
9
|
-
extra?: Record<string, unknown>;
|
|
10
|
-
}
|
|
11
|
-
export declare function record(stage: string, extra?: Record<string, unknown>): void;
|
|
12
|
-
export declare function isInitFrameDiagEnabled(): boolean;
|
|
13
|
-
export declare function initFrameLog(stage: string, extra?: Record<string, unknown>): void;
|
|
14
|
-
export declare function negotiateProtocolVersion(requested?: string): string;
|
|
15
|
-
export declare function emitReadyGlobal(server: any, reason: string): void;
|
|
16
1
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
2
|
+
* Handshake/protocol negotiation facade for the MCP server.
|
|
3
|
+
*
|
|
4
|
+
* The historical implementation lived in this single file (~500 lines, ~20
|
|
5
|
+
* silent catch blocks — see issue #138). It has been decomposed into focused
|
|
6
|
+
* modules under `./handshake/` so each concern can be unit-tested in isolation:
|
|
7
|
+
*
|
|
8
|
+
* - `handshake/tracing.ts` stderr-safe logging + ring buffer
|
|
9
|
+
* - `handshake/protocol.ts` pure version negotiation
|
|
10
|
+
* - `handshake/initializeDetector.ts` pure stdin scanning
|
|
11
|
+
* - `handshake/fallbackFrames.ts` pure JSON-RPC frame builders
|
|
12
|
+
* - `handshake/readyEmitter.ts` server/ready dispatch
|
|
13
|
+
* - `handshake/stdinSniffer.ts` stdin sniff + synthetic dispatch
|
|
14
|
+
* - `handshake/safetyFallbacks.ts` timer-driven last-resort fallbacks
|
|
15
|
+
*
|
|
16
|
+
* This file remains the public import surface for the rest of the server
|
|
17
|
+
* (`sdkServer.ts`, `mcpLogBridge.ts`, mocks in unit tests) and re-exports the
|
|
18
|
+
* full legacy API.
|
|
19
19
|
*/
|
|
20
|
-
export
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
export
|
|
20
|
+
export { isHandshakeTraceEnabled, handshakeLog, record, initFrameLog, isInitFrameDiagEnabled, exposeGlobalEventsRef, getHandshakeEvents, } from './handshake/tracing';
|
|
21
|
+
export type { HandshakeEvent } from './handshake/tracing';
|
|
22
|
+
export { SUPPORTED_PROTOCOL_VERSIONS, negotiateProtocolVersion, isHandshakeFallbacksEnabled, } from './handshake/protocol';
|
|
23
|
+
export { emitReadyGlobal } from './handshake/readyEmitter';
|
|
24
|
+
export { setupStdinSniffer } from './handshake/stdinSniffer';
|
|
25
|
+
export { setupSafetyFallbacks } from './handshake/safetyFallbacks';
|
|
@@ -1,470 +1,40 @@
|
|
|
1
1
|
"use strict";
|
|
2
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 */
|
|
3
|
+
exports.setupSafetyFallbacks = exports.setupStdinSniffer = exports.emitReadyGlobal = exports.isHandshakeFallbacksEnabled = exports.negotiateProtocolVersion = exports.SUPPORTED_PROTOCOL_VERSIONS = exports.getHandshakeEvents = exports.exposeGlobalEventsRef = exports.isInitFrameDiagEnabled = exports.initFrameLog = exports.record = exports.handshakeLog = exports.isHandshakeTraceEnabled = void 0;
|
|
15
4
|
/**
|
|
16
|
-
* Handshake/protocol negotiation
|
|
17
|
-
*
|
|
18
|
-
*
|
|
5
|
+
* Handshake/protocol negotiation facade for the MCP server.
|
|
6
|
+
*
|
|
7
|
+
* The historical implementation lived in this single file (~500 lines, ~20
|
|
8
|
+
* silent catch blocks — see issue #138). It has been decomposed into focused
|
|
9
|
+
* modules under `./handshake/` so each concern can be unit-tested in isolation:
|
|
10
|
+
*
|
|
11
|
+
* - `handshake/tracing.ts` stderr-safe logging + ring buffer
|
|
12
|
+
* - `handshake/protocol.ts` pure version negotiation
|
|
13
|
+
* - `handshake/initializeDetector.ts` pure stdin scanning
|
|
14
|
+
* - `handshake/fallbackFrames.ts` pure JSON-RPC frame builders
|
|
15
|
+
* - `handshake/readyEmitter.ts` server/ready dispatch
|
|
16
|
+
* - `handshake/stdinSniffer.ts` stdin sniff + synthetic dispatch
|
|
17
|
+
* - `handshake/safetyFallbacks.ts` timer-driven last-resort fallbacks
|
|
18
|
+
*
|
|
19
|
+
* This file remains the public import surface for the rest of the server
|
|
20
|
+
* (`sdkServer.ts`, `mcpLogBridge.ts`, mocks in unit tests) and re-exports the
|
|
21
|
+
* full legacy API.
|
|
19
22
|
*/
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
function
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
t.send(msg)?.catch?.(() => { });
|
|
117
|
-
dispatched = true;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
catch { /* ignore */ }
|
|
121
|
-
if (!dispatched) {
|
|
122
|
-
try {
|
|
123
|
-
server.sendNotification?.({ method: 'server/ready', params: { version: v } });
|
|
124
|
-
dispatched = true;
|
|
125
|
-
}
|
|
126
|
-
catch { /* ignore */ }
|
|
127
|
-
}
|
|
128
|
-
if (!dispatched) {
|
|
129
|
-
// Final fallback direct stdout (rare path)
|
|
130
|
-
try {
|
|
131
|
-
process.stdout.write(JSON.stringify(msg) + '\n');
|
|
132
|
-
}
|
|
133
|
-
catch { /* ignore */ }
|
|
134
|
-
}
|
|
135
|
-
// Always follow with tools/list_changed AFTER ready to guarantee ordering.
|
|
136
|
-
try {
|
|
137
|
-
if (typeof server.sendToolListChanged === 'function') {
|
|
138
|
-
server.sendToolListChanged();
|
|
139
|
-
record('list_changed_after_ready');
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
catch { /* ignore */ }
|
|
143
|
-
}
|
|
144
|
-
catch { /* ignore */ }
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Pre-connect stdin sniffer: if we observe an initialize request but downstream logic fails
|
|
148
|
-
* to emit server/ready, schedule a guarded fallback emission.
|
|
149
|
-
*/
|
|
150
|
-
function setupStdinSniffer(server) {
|
|
151
|
-
try {
|
|
152
|
-
const disableInitSniff = (0, runtimeConfig_1.getRuntimeConfig)().initFeatures.has('disableSniff');
|
|
153
|
-
if (!server || disableInitSniff)
|
|
154
|
-
return;
|
|
155
|
-
const INIT_FALLBACK_ENABLED = (0, runtimeConfig_1.getRuntimeConfig)().initFeatures.has('initFallback');
|
|
156
|
-
let __sniffBuf = '';
|
|
157
|
-
if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed')) {
|
|
158
|
-
try {
|
|
159
|
-
if (!server.__diagRQMap) {
|
|
160
|
-
server.__diagRQMap = new Map();
|
|
161
|
-
server.__diagQueueDepthSniff = 0;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
catch { /* ignore */ }
|
|
165
|
-
}
|
|
166
|
-
process.stdin.on('data', (chunk) => {
|
|
167
|
-
try {
|
|
168
|
-
// Log first chunk (sanitized) once for corruption triage
|
|
169
|
-
if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed') && !server.__diagFirstChunkLogged) {
|
|
170
|
-
server.__diagFirstChunkLogged = true;
|
|
171
|
-
const raw = chunk.toString('utf8');
|
|
172
|
-
const snippet = raw.replace(/\r/g, ' ').replace(/\n/g, '\\n').slice(0, 240);
|
|
173
|
-
process.stderr.write(`[diag] ${Date.now()} stdin_first_chunk size=${chunk.length} snippet="${snippet}"\n`);
|
|
174
|
-
}
|
|
175
|
-
__sniffBuf += chunk.toString('utf8');
|
|
176
|
-
// Fast substring / subsequence search instead of full JSON parse
|
|
177
|
-
if (!(server.__sniffedInit)) {
|
|
178
|
-
const bufForScan = __sniffBuf.slice(-8000); // bound work
|
|
179
|
-
const direct = /"method"\s*:\s*"initialize"/.test(bufForScan);
|
|
180
|
-
let fuzzy = false;
|
|
181
|
-
let subseq = false;
|
|
182
|
-
if (!direct) {
|
|
183
|
-
// Fuzzy reconstruction (bounded gaps) scoped near a method sentinel
|
|
184
|
-
const target = 'initialize';
|
|
185
|
-
const methodIdx = bufForScan.indexOf('"method"');
|
|
186
|
-
const sliceA = methodIdx !== -1 ? bufForScan.slice(methodIdx, methodIdx + 1200) : '';
|
|
187
|
-
const trySlices = sliceA ? [sliceA] : [];
|
|
188
|
-
if (!sliceA && (0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed'))
|
|
189
|
-
trySlices.push(bufForScan.slice(-2000));
|
|
190
|
-
for (const slice of trySlices) {
|
|
191
|
-
let ti = 0;
|
|
192
|
-
let gaps = 0;
|
|
193
|
-
for (let i = 0; i < slice.length && ti < target.length; i++) {
|
|
194
|
-
const ch = slice[i];
|
|
195
|
-
if (ch.toLowerCase?.() === target[ti]) {
|
|
196
|
-
ti++;
|
|
197
|
-
gaps = 0;
|
|
198
|
-
continue;
|
|
199
|
-
}
|
|
200
|
-
if (gaps < 3) {
|
|
201
|
-
gaps++;
|
|
202
|
-
continue;
|
|
203
|
-
}
|
|
204
|
-
ti = 0;
|
|
205
|
-
gaps = 0;
|
|
206
|
-
if (ch.toLowerCase?.() === target[ti]) {
|
|
207
|
-
ti++;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
if (ti === target.length) {
|
|
211
|
-
fuzzy = true;
|
|
212
|
-
break;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
// Subsequence (very tolerant) – strip non-letters and search contiguous
|
|
216
|
-
if (!fuzzy) {
|
|
217
|
-
const letters = bufForScan.replace(/[^a-zA-Z]/g, '').toLowerCase();
|
|
218
|
-
let ti = 0;
|
|
219
|
-
for (let i = 0; i < letters.length && ti < target.length; i++) {
|
|
220
|
-
if (letters[i] === target[ti])
|
|
221
|
-
ti++;
|
|
222
|
-
}
|
|
223
|
-
if (ti === target.length)
|
|
224
|
-
subseq = true;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
if (direct || fuzzy || subseq) {
|
|
228
|
-
server.__sniffedInit = true;
|
|
229
|
-
const mode = direct ? 'direct' : (fuzzy ? 'fuzzy' : 'subseq');
|
|
230
|
-
if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed')) {
|
|
231
|
-
try {
|
|
232
|
-
const norm = bufForScan.slice(0, 400).replace(/\r/g, ' ').replace(/\n/g, '\\n');
|
|
233
|
-
process.stderr.write(`[diag] ${Date.now()} sniff_init_${mode}_detect buffer_bytes=${__sniffBuf.length} preview="${norm}"\n`);
|
|
234
|
-
}
|
|
235
|
-
catch { /* ignore */ }
|
|
236
|
-
}
|
|
237
|
-
// Schedule marking + optional synthetic dispatch if initialize not parsed normally
|
|
238
|
-
setTimeout(() => {
|
|
239
|
-
try {
|
|
240
|
-
if (!server.__sawInitializeRequest) {
|
|
241
|
-
server.__sawInitializeRequest = true;
|
|
242
|
-
if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed')) {
|
|
243
|
-
try {
|
|
244
|
-
process.stderr.write(`[diag] ${Date.now()} sniff_init_mark_sawInit mode=${mode}\n`);
|
|
245
|
-
}
|
|
246
|
-
catch { /* ignore */ }
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
if (INIT_FALLBACK_ENABLED && !server.__initResponseSent) {
|
|
250
|
-
setTimeout(() => {
|
|
251
|
-
try {
|
|
252
|
-
if (server.__initResponseSent || server.__syntheticInitDispatched)
|
|
253
|
-
return;
|
|
254
|
-
let id = 1;
|
|
255
|
-
const idMatch = /"id"\s*:\s*(\d{1,6})/.exec(bufForScan);
|
|
256
|
-
if (idMatch)
|
|
257
|
-
id = parseInt(idMatch[1], 10);
|
|
258
|
-
const req = { jsonrpc: '2.0', id, method: 'initialize', params: {} };
|
|
259
|
-
server.__syntheticInitDispatched = true;
|
|
260
|
-
const dispatch = server._onRequest || server._onrequest;
|
|
261
|
-
if (typeof dispatch === 'function') {
|
|
262
|
-
if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed')) {
|
|
263
|
-
try {
|
|
264
|
-
process.stderr.write(`[diag] ${Date.now()} sniff_init_synthetic_dispatch id=${id}\n`);
|
|
265
|
-
}
|
|
266
|
-
catch { /* ignore */ }
|
|
267
|
-
}
|
|
268
|
-
try {
|
|
269
|
-
dispatch.call(server, req);
|
|
270
|
-
}
|
|
271
|
-
catch { /* ignore */ }
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
catch { /* ignore */ }
|
|
275
|
-
}, 40).unref?.();
|
|
276
|
-
if (INIT_FALLBACK_ENABLED) {
|
|
277
|
-
// Forced result fallback if still not sent after additional grace
|
|
278
|
-
setTimeout(() => {
|
|
279
|
-
try {
|
|
280
|
-
if (server.__initResponseSent)
|
|
281
|
-
return;
|
|
282
|
-
const tr = server._transport || server.__transportRef;
|
|
283
|
-
if (tr && typeof tr.send === 'function') {
|
|
284
|
-
let negotiated = '2024-11-05';
|
|
285
|
-
try {
|
|
286
|
-
negotiated = negotiateProtocolVersion('2024-11-05') || negotiated;
|
|
287
|
-
}
|
|
288
|
-
catch { /* ignore */ }
|
|
289
|
-
const frame = { jsonrpc: '2.0', id: 1, result: { protocolVersion: negotiated, capabilities: {}, instructions: 'Use initialize -> tools/list -> tools/call { name, arguments }. (forced-init-fallback)' } };
|
|
290
|
-
server.__initResponseSent = true;
|
|
291
|
-
if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed')) {
|
|
292
|
-
try {
|
|
293
|
-
process.stderr.write(`[diag] ${Date.now()} sniff_init_forced_result_emit id=1 negotiated=${negotiated}\n`);
|
|
294
|
-
}
|
|
295
|
-
catch { /* ignore */ }
|
|
296
|
-
}
|
|
297
|
-
Promise.resolve(tr.send(frame)).then(() => {
|
|
298
|
-
if (!server.__readyNotified) {
|
|
299
|
-
emitReadyGlobal(server, 'forced-init-fallback');
|
|
300
|
-
}
|
|
301
|
-
}).catch(() => { });
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
catch { /* ignore */ }
|
|
305
|
-
}, 140).unref?.();
|
|
306
|
-
}
|
|
307
|
-
else if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed')) {
|
|
308
|
-
try {
|
|
309
|
-
process.stderr.write(`[diag] ${Date.now()} sniff_init_forced_result_skip gating_off\n`);
|
|
310
|
-
}
|
|
311
|
-
catch { /* ignore */ }
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
if (isHandshakeFallbacksEnabled()) {
|
|
315
|
-
if (server.__initResponseSent && !server.__readyNotified) {
|
|
316
|
-
emitReadyGlobal(server, 'stdin-sniff-fallback');
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
catch { /* ignore */ }
|
|
321
|
-
}, 60).unref?.();
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
// Fallback rq_* enqueue capture (only if diag flag set AND dispatcher override not active)
|
|
325
|
-
if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed') && !server.__dispatcherOverrideActive) {
|
|
326
|
-
try {
|
|
327
|
-
let idx;
|
|
328
|
-
while ((idx = __sniffBuf.indexOf('\n')) !== -1) {
|
|
329
|
-
const line = __sniffBuf.slice(0, idx).trim();
|
|
330
|
-
__sniffBuf = __sniffBuf.slice(idx + 1);
|
|
331
|
-
if (!line)
|
|
332
|
-
continue;
|
|
333
|
-
let obj;
|
|
334
|
-
try {
|
|
335
|
-
obj = JSON.parse(line);
|
|
336
|
-
}
|
|
337
|
-
catch (e) {
|
|
338
|
-
if (/jsonrpc|method/i.test(line)) {
|
|
339
|
-
const frag = line.replace(/\r/g, ' ').replace(/\n/g, ' ').slice(0, 200);
|
|
340
|
-
process.stderr.write(`[diag] ${Date.now()} malformed_json_line len=${line.length} frag="${frag}" err=${e.message || e}\n`);
|
|
341
|
-
}
|
|
342
|
-
continue;
|
|
343
|
-
}
|
|
344
|
-
if (obj && obj.jsonrpc === '2.0' && obj.method && Object.prototype.hasOwnProperty.call(obj, 'id')) {
|
|
345
|
-
const metaName = obj.method === 'tools/call' ? obj?.params?.name : '';
|
|
346
|
-
const category = (() => {
|
|
347
|
-
if (obj.method === 'initialize')
|
|
348
|
-
return 'init';
|
|
349
|
-
if (obj.method === 'health_check' || metaName === 'health_check')
|
|
350
|
-
return 'health';
|
|
351
|
-
if (obj.method === 'metrics_snapshot' || metaName === 'metrics_snapshot')
|
|
352
|
-
return 'metrics';
|
|
353
|
-
if (metaName === 'meta_tools')
|
|
354
|
-
return 'meta';
|
|
355
|
-
return 'other';
|
|
356
|
-
})();
|
|
357
|
-
if (category === 'health' || category === 'metrics' || category === 'meta' || category === 'init') {
|
|
358
|
-
try {
|
|
359
|
-
server.__diagQueueDepthSniff++;
|
|
360
|
-
server.__diagRQMap.set(obj.id, { start: Date.now(), cat: category, method: obj.method });
|
|
361
|
-
process.stderr.write(`[diag] ${Date.now()} rq_enqueue method=${obj.method} cat=${category} id=${obj.id} qdepth=${server.__diagQueueDepthSniff} src=sniff\n`);
|
|
362
|
-
}
|
|
363
|
-
catch { /* ignore */ }
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
catch { /* ignore */ }
|
|
369
|
-
}
|
|
370
|
-
// Truncate buffer to avoid unbounded growth
|
|
371
|
-
if (__sniffBuf.length > 10_000) {
|
|
372
|
-
__sniffBuf = __sniffBuf.slice(-2048);
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
catch { /* ignore */ }
|
|
376
|
-
});
|
|
377
|
-
}
|
|
378
|
-
catch { /* ignore */ }
|
|
379
|
-
}
|
|
380
|
-
/**
|
|
381
|
-
* Safety fallback timers for missed ready emissions, unconditional DIAG fallback,
|
|
382
|
-
* and _oninitialize patch for protocol negotiation.
|
|
383
|
-
*/
|
|
384
|
-
function setupSafetyFallbacks(server) {
|
|
385
|
-
// Safety fallback: if server/ready not emitted within 100ms of start
|
|
386
|
-
if (isHandshakeFallbacksEnabled()) {
|
|
387
|
-
setTimeout(() => {
|
|
388
|
-
try {
|
|
389
|
-
// Only emit via safety-timeout if initialize response was already sent (ordering guarantee)
|
|
390
|
-
if (server.__sawInitializeRequest && server.__initResponseSent && !server.__readyNotified) {
|
|
391
|
-
handshakeLog('safety_timeout_emit_attempt', { label: 'safety-timeout-100ms', sawInit: true, initRespSent: true });
|
|
392
|
-
emitReadyGlobal(server, 'safety-timeout-100ms');
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
catch { /* ignore */ }
|
|
396
|
-
}, 100).unref?.();
|
|
397
|
-
}
|
|
398
|
-
// Unconditional DIAG fallback (gated): if no initialize request OR response observed very early
|
|
399
|
-
if (isHandshakeFallbacksEnabled()) {
|
|
400
|
-
setTimeout(() => {
|
|
401
|
-
try {
|
|
402
|
-
const INIT_FALLBACK_ENABLED = (0, runtimeConfig_1.getRuntimeConfig)().initFeatures.has('initFallback');
|
|
403
|
-
if ((0, runtimeConfig_1.getRuntimeConfig)().trace.has('healthMixed') && !server.__initResponseSent) {
|
|
404
|
-
if (!INIT_FALLBACK_ENABLED) {
|
|
405
|
-
try {
|
|
406
|
-
process.stderr.write(`[diag] ${Date.now()} init_unconditional_fallback_skip gating_off\n`);
|
|
407
|
-
}
|
|
408
|
-
catch { /* ignore */ }
|
|
409
|
-
return;
|
|
410
|
-
}
|
|
411
|
-
if (!server.__sawInitializeRequest) {
|
|
412
|
-
if (process.stderr && !server.__diagForcedInitLogged) {
|
|
413
|
-
server.__diagForcedInitLogged = true;
|
|
414
|
-
try {
|
|
415
|
-
process.stderr.write(`[diag] ${Date.now()} init_unconditional_fallback_emit id=1 reason=no_init_seen_150ms\n`);
|
|
416
|
-
}
|
|
417
|
-
catch { /* ignore */ }
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
else {
|
|
421
|
-
try {
|
|
422
|
-
process.stderr.write(`[diag] ${Date.now()} init_unconditional_fallback_emit id=1 reason=init_seen_no_response_150ms\n`);
|
|
423
|
-
}
|
|
424
|
-
catch { /* ignore */ }
|
|
425
|
-
}
|
|
426
|
-
const negotiated = '2024-11-05';
|
|
427
|
-
const frame = { jsonrpc: '2.0', id: 1, result: { protocolVersion: negotiated, capabilities: {}, instructions: 'Use initialize -> tools/list -> tools/call { name, arguments }. (unconditional-init-fallback)' } };
|
|
428
|
-
const tr = server._transport || server.__transportRef;
|
|
429
|
-
server.__initResponseSent = true;
|
|
430
|
-
if (tr && typeof tr.send === 'function') {
|
|
431
|
-
Promise.resolve(tr.send(frame)).then(() => { if (!server.__readyNotified)
|
|
432
|
-
emitReadyGlobal(server, 'unconditional-init-fallback'); }).catch(() => { });
|
|
433
|
-
}
|
|
434
|
-
else {
|
|
435
|
-
try {
|
|
436
|
-
process.stdout.write(JSON.stringify(frame) + '\n');
|
|
437
|
-
}
|
|
438
|
-
catch { /* ignore */ }
|
|
439
|
-
if (!server.__readyNotified)
|
|
440
|
-
emitReadyGlobal(server, 'unconditional-init-fallback-direct');
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
catch { /* ignore */ }
|
|
445
|
-
}, 150).unref?.();
|
|
446
|
-
}
|
|
447
|
-
// Patch initialize result for instructions (SDK internal property)
|
|
448
|
-
const originalInit = server._oninitialize;
|
|
449
|
-
if (originalInit && !server.__initPatched) {
|
|
450
|
-
server.__initPatched = true;
|
|
451
|
-
server._oninitialize = async function (request) {
|
|
452
|
-
try {
|
|
453
|
-
this.__sawInitializeRequest = true;
|
|
454
|
-
handshakeLog('oninitialize_enter', { sawInit: true, ready: !!this.__readyNotified, initRespSent: !!server.__initResponseSent });
|
|
455
|
-
}
|
|
456
|
-
catch { /* ignore */ }
|
|
457
|
-
const result = await originalInit.call(this, request);
|
|
458
|
-
try {
|
|
459
|
-
const negotiated = negotiateProtocolVersion(request?.params?.protocolVersion);
|
|
460
|
-
result.protocolVersion = negotiated;
|
|
461
|
-
if (result && typeof result === 'object' && !('instructions' in result)) {
|
|
462
|
-
result.instructions = 'Use initialize -> tools/list -> tools/call { name, arguments }. Health: tools/call health_check. Metrics: tools/call metrics_snapshot. Ping: ping.';
|
|
463
|
-
}
|
|
464
|
-
// Do NOT emit server/ready here; ordering handled strictly by transport send hook.
|
|
465
|
-
}
|
|
466
|
-
catch { /* ignore */ }
|
|
467
|
-
return result;
|
|
468
|
-
};
|
|
469
|
-
}
|
|
470
|
-
}
|
|
23
|
+
var tracing_1 = require("./handshake/tracing");
|
|
24
|
+
Object.defineProperty(exports, "isHandshakeTraceEnabled", { enumerable: true, get: function () { return tracing_1.isHandshakeTraceEnabled; } });
|
|
25
|
+
Object.defineProperty(exports, "handshakeLog", { enumerable: true, get: function () { return tracing_1.handshakeLog; } });
|
|
26
|
+
Object.defineProperty(exports, "record", { enumerable: true, get: function () { return tracing_1.record; } });
|
|
27
|
+
Object.defineProperty(exports, "initFrameLog", { enumerable: true, get: function () { return tracing_1.initFrameLog; } });
|
|
28
|
+
Object.defineProperty(exports, "isInitFrameDiagEnabled", { enumerable: true, get: function () { return tracing_1.isInitFrameDiagEnabled; } });
|
|
29
|
+
Object.defineProperty(exports, "exposeGlobalEventsRef", { enumerable: true, get: function () { return tracing_1.exposeGlobalEventsRef; } });
|
|
30
|
+
Object.defineProperty(exports, "getHandshakeEvents", { enumerable: true, get: function () { return tracing_1.getHandshakeEvents; } });
|
|
31
|
+
var protocol_1 = require("./handshake/protocol");
|
|
32
|
+
Object.defineProperty(exports, "SUPPORTED_PROTOCOL_VERSIONS", { enumerable: true, get: function () { return protocol_1.SUPPORTED_PROTOCOL_VERSIONS; } });
|
|
33
|
+
Object.defineProperty(exports, "negotiateProtocolVersion", { enumerable: true, get: function () { return protocol_1.negotiateProtocolVersion; } });
|
|
34
|
+
Object.defineProperty(exports, "isHandshakeFallbacksEnabled", { enumerable: true, get: function () { return protocol_1.isHandshakeFallbacksEnabled; } });
|
|
35
|
+
var readyEmitter_1 = require("./handshake/readyEmitter");
|
|
36
|
+
Object.defineProperty(exports, "emitReadyGlobal", { enumerable: true, get: function () { return readyEmitter_1.emitReadyGlobal; } });
|
|
37
|
+
var stdinSniffer_1 = require("./handshake/stdinSniffer");
|
|
38
|
+
Object.defineProperty(exports, "setupStdinSniffer", { enumerable: true, get: function () { return stdinSniffer_1.setupStdinSniffer; } });
|
|
39
|
+
var safetyFallbacks_1 = require("./handshake/safetyFallbacks");
|
|
40
|
+
Object.defineProperty(exports, "setupSafetyFallbacks", { enumerable: true, get: function () { return safetyFallbacks_1.setupSafetyFallbacks; } });
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* - Read-only interface for status, tools, and metrics
|
|
13
13
|
* - Not for MCP client communication - admin use only
|
|
14
14
|
*/
|
|
15
|
+
import '../services/mcpLogBridge';
|
|
15
16
|
import '../services/logPrefix';
|
|
16
17
|
import '../services/logger';
|
|
17
18
|
import '../services/toolHandlers';
|
|
@@ -26,6 +27,28 @@ interface CliConfig {
|
|
|
26
27
|
dashboardTlsCert?: string;
|
|
27
28
|
dashboardTlsKey?: string;
|
|
28
29
|
dashboardTlsCa?: string;
|
|
30
|
+
/** Trigger TLS cert generation on startup. */
|
|
31
|
+
initCert?: boolean;
|
|
32
|
+
/** Output directory for generated cert/key. Defaults to <home>/.index-server/certs. */
|
|
33
|
+
certDir?: string;
|
|
34
|
+
/** Override path for generated certificate file. */
|
|
35
|
+
certFile?: string;
|
|
36
|
+
/** Override path for generated private key file. */
|
|
37
|
+
keyFile?: string;
|
|
38
|
+
/** CommonName for the generated certificate. */
|
|
39
|
+
certCn?: string;
|
|
40
|
+
/** Comma-separated SAN entries (DNS:/IP: prefixed). */
|
|
41
|
+
certSan?: string;
|
|
42
|
+
/** Validity period in days (1..3650). */
|
|
43
|
+
certDays?: number;
|
|
44
|
+
/** RSA key size in bits (2048 or 4096). */
|
|
45
|
+
certKeyBits?: number;
|
|
46
|
+
/** Overwrite existing cert/key files. */
|
|
47
|
+
certForce?: boolean;
|
|
48
|
+
/** Print env-var lines after generation. true=auto, or 'posix'|'powershell'|'both'. */
|
|
49
|
+
certPrintEnv?: boolean | string;
|
|
50
|
+
/** Continue normal server startup after cert-init (composes with --init-cert). */
|
|
51
|
+
start?: boolean;
|
|
29
52
|
}
|
|
30
53
|
declare function parseArgs(argv: string[]): CliConfig;
|
|
31
54
|
declare function findPackageVersion(): string;
|