@jagilber-org/index-server 1.22.1 → 1.26.4
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 +91 -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 +12 -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/generate-certs.mjs +201 -0
- package/scripts/setup-wizard.mjs +781 -0
- package/server.json +20 -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
|
@@ -5,6 +5,7 @@ exports.getZodSchema = getZodSchema;
|
|
|
5
5
|
exports.hasZodSchema = hasZodSchema;
|
|
6
6
|
const zod_1 = require("zod");
|
|
7
7
|
const toolRegistry_1 = require("./toolRegistry");
|
|
8
|
+
const runtimeConfig_1 = require("../config/runtimeConfig");
|
|
8
9
|
/**
|
|
9
10
|
* Complete Zod schema registry for all MCP index tools.
|
|
10
11
|
* Zod schemas provide runtime validation with richer type inference.
|
|
@@ -13,6 +14,13 @@ const toolRegistry_1 = require("./toolRegistry");
|
|
|
13
14
|
// ── Reusable primitives ──────────────────────────────────────────────────────
|
|
14
15
|
const zEmpty = zod_1.z.object({}).passthrough();
|
|
15
16
|
const zStringId = zod_1.z.object({ id: zod_1.z.string().min(1) }).strict();
|
|
17
|
+
const zExtensionValue = zod_1.z.lazy(() => zod_1.z.union([
|
|
18
|
+
zod_1.z.string(),
|
|
19
|
+
zod_1.z.number(),
|
|
20
|
+
zod_1.z.boolean(),
|
|
21
|
+
zod_1.z.array(zExtensionValue),
|
|
22
|
+
zod_1.z.record(zod_1.z.string(), zExtensionValue),
|
|
23
|
+
]));
|
|
16
24
|
// ── Index dispatcher ───────────────────────────────────────────────────────
|
|
17
25
|
const zDispatch = zod_1.z.object({
|
|
18
26
|
action: zod_1.z.enum([
|
|
@@ -27,7 +35,7 @@ const zDispatch = zod_1.z.object({
|
|
|
27
35
|
keywords: zod_1.z.array(zod_1.z.string()).optional(),
|
|
28
36
|
ids: zod_1.z.array(zod_1.z.string()).optional(),
|
|
29
37
|
category: zod_1.z.string().optional(),
|
|
30
|
-
contentType: zod_1.z.
|
|
38
|
+
contentType: zod_1.z.enum(['instruction', 'template', 'chat-session', 'reference', 'example', 'agent']).optional(),
|
|
31
39
|
text: zod_1.z.string().optional(),
|
|
32
40
|
includeCategories: zod_1.z.boolean().optional(),
|
|
33
41
|
caseSensitive: zod_1.z.boolean().optional(),
|
|
@@ -38,13 +46,26 @@ const zDispatch = zod_1.z.object({
|
|
|
38
46
|
limit: zod_1.z.number().optional(),
|
|
39
47
|
offset: zod_1.z.number().optional(),
|
|
40
48
|
entry: zod_1.z.object({}).passthrough().optional(),
|
|
49
|
+
title: zod_1.z.string().optional(),
|
|
50
|
+
body: zod_1.z.string().optional(),
|
|
51
|
+
rationale: zod_1.z.string().optional(),
|
|
52
|
+
priority: zod_1.z.number().optional(),
|
|
53
|
+
audience: zod_1.z.string().optional(),
|
|
54
|
+
requirement: zod_1.z.string().optional(),
|
|
55
|
+
categories: zod_1.z.array(zod_1.z.string()).optional(),
|
|
56
|
+
deprecatedBy: zod_1.z.string().optional(),
|
|
57
|
+
riskScore: zod_1.z.number().optional(),
|
|
58
|
+
priorityTier: zod_1.z.enum(['P1', 'P2', 'P3', 'P4']).optional(),
|
|
59
|
+
classification: zod_1.z.enum(['public', 'internal', 'restricted']).optional(),
|
|
60
|
+
semanticSummary: zod_1.z.string().optional(),
|
|
61
|
+
changeLog: zod_1.z.array(zod_1.z.object({}).passthrough()).optional(),
|
|
41
62
|
overwrite: zod_1.z.boolean().optional(),
|
|
42
63
|
lax: zod_1.z.boolean().optional(),
|
|
43
64
|
entries: zod_1.z.union([zod_1.z.array(zod_1.z.object({}).passthrough()), zod_1.z.string()]).optional(),
|
|
44
65
|
source: zod_1.z.string().optional(),
|
|
45
66
|
mode: zod_1.z.unknown().optional(),
|
|
46
67
|
owner: zod_1.z.string().optional(),
|
|
47
|
-
status: zod_1.z.
|
|
68
|
+
status: zod_1.z.enum(['approved', 'draft', 'review', 'deprecated']).optional(),
|
|
48
69
|
bump: zod_1.z.enum(['patch', 'minor', 'major', 'none']).optional(),
|
|
49
70
|
lastReviewedAt: zod_1.z.string().optional(),
|
|
50
71
|
nextReviewDue: zod_1.z.string().optional(),
|
|
@@ -53,43 +74,62 @@ const zDispatch = zod_1.z.object({
|
|
|
53
74
|
dryRun: zod_1.z.boolean().optional()
|
|
54
75
|
}).passthrough();
|
|
55
76
|
// ── Index CRUD ─────────────────────────────────────────────────────────────
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
zod_1.z.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
zod_1.z.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
77
|
+
function zInstructionBody() {
|
|
78
|
+
return zod_1.z.string().min(1).max((0, runtimeConfig_1.getRuntimeConfig)().index.bodyWarnLength);
|
|
79
|
+
}
|
|
80
|
+
function buildZIndexEntry() {
|
|
81
|
+
return zod_1.z.object({
|
|
82
|
+
id: zod_1.z.string().min(1),
|
|
83
|
+
title: zod_1.z.string().min(1).optional(),
|
|
84
|
+
body: zInstructionBody(),
|
|
85
|
+
rationale: zod_1.z.string().optional(),
|
|
86
|
+
priority: zod_1.z.number().int().min(1).max(100).optional(),
|
|
87
|
+
audience: zod_1.z.string().optional(),
|
|
88
|
+
requirement: zod_1.z.string().optional(),
|
|
89
|
+
categories: zod_1.z.array(zod_1.z.string()).max(50).optional(),
|
|
90
|
+
deprecatedBy: zod_1.z.string().optional(),
|
|
91
|
+
riskScore: zod_1.z.number().optional(),
|
|
92
|
+
version: zod_1.z.string().optional(),
|
|
93
|
+
owner: zod_1.z.string().optional(),
|
|
94
|
+
status: zod_1.z.enum(['approved', 'draft', 'review', 'deprecated']).optional(),
|
|
95
|
+
priorityTier: zod_1.z.enum(['P1', 'P2', 'P3', 'P4']).optional(),
|
|
96
|
+
classification: zod_1.z.enum(['public', 'internal', 'restricted']).optional(),
|
|
97
|
+
lastReviewedAt: zod_1.z.string().optional(),
|
|
98
|
+
nextReviewDue: zod_1.z.string().optional(),
|
|
99
|
+
semanticSummary: zod_1.z.string().optional(),
|
|
100
|
+
changeLog: zod_1.z.array(zod_1.z.object({}).passthrough()).optional(),
|
|
101
|
+
contentType: zod_1.z.enum(['instruction', 'template', 'chat-session', 'reference', 'example', 'agent']).optional(),
|
|
102
|
+
extensions: zod_1.z.record(zod_1.z.string(), zExtensionValue).optional()
|
|
103
|
+
}).strict();
|
|
104
|
+
}
|
|
105
|
+
function buildZAdd() {
|
|
106
|
+
return zod_1.z.object({
|
|
107
|
+
entry: buildZIndexEntry(),
|
|
108
|
+
overwrite: zod_1.z.boolean().optional(),
|
|
109
|
+
lax: zod_1.z.boolean().optional()
|
|
110
|
+
}).strict();
|
|
111
|
+
}
|
|
112
|
+
function buildZImport() {
|
|
113
|
+
return zod_1.z.object({
|
|
114
|
+
entries: zod_1.z.union([
|
|
115
|
+
zod_1.z.array(zod_1.z.object({
|
|
116
|
+
id: zod_1.z.string(),
|
|
117
|
+
title: zod_1.z.string(),
|
|
118
|
+
body: zInstructionBody(),
|
|
119
|
+
rationale: zod_1.z.string().optional(),
|
|
120
|
+
priority: zod_1.z.number(),
|
|
121
|
+
audience: zod_1.z.string(),
|
|
122
|
+
requirement: zod_1.z.string(),
|
|
123
|
+
categories: zod_1.z.array(zod_1.z.string()).optional(),
|
|
124
|
+
extensions: zod_1.z.record(zod_1.z.string(), zExtensionValue).optional(),
|
|
125
|
+
mode: zod_1.z.string().optional()
|
|
126
|
+
}).passthrough()).min(1),
|
|
127
|
+
zod_1.z.string()
|
|
128
|
+
]).optional(),
|
|
129
|
+
source: zod_1.z.string().optional(),
|
|
130
|
+
mode: zod_1.z.enum(['skip', 'overwrite']).optional()
|
|
131
|
+
}).strict();
|
|
132
|
+
}
|
|
93
133
|
const zRemove = zod_1.z.object({
|
|
94
134
|
ids: zod_1.z.array(zod_1.z.string()).min(1),
|
|
95
135
|
missingOk: zod_1.z.boolean().optional(),
|
|
@@ -142,42 +182,6 @@ const zFeedbackSubmit = zod_1.z.object({
|
|
|
142
182
|
metadata: zod_1.z.object({}).passthrough().optional(),
|
|
143
183
|
tags: zod_1.z.array(zod_1.z.string()).max(10).optional()
|
|
144
184
|
}).strict();
|
|
145
|
-
const zFeedbackList = zod_1.z.object({
|
|
146
|
-
type: zod_1.z.enum(['issue', 'status', 'security', 'feature-request', 'bug-report', 'performance', 'usability', 'other']).optional(),
|
|
147
|
-
severity: zod_1.z.enum(['low', 'medium', 'high', 'critical']).optional(),
|
|
148
|
-
status: zod_1.z.enum(['new', 'acknowledged', 'in-progress', 'resolved', 'closed']).optional(),
|
|
149
|
-
limit: zod_1.z.number().int().min(1).max(200).optional(),
|
|
150
|
-
offset: zod_1.z.number().int().min(0).optional(),
|
|
151
|
-
since: zod_1.z.string().optional(),
|
|
152
|
-
tags: zod_1.z.array(zod_1.z.string()).optional()
|
|
153
|
-
}).strict();
|
|
154
|
-
const zFeedbackGet = zStringId;
|
|
155
|
-
const zFeedbackUpdate = zod_1.z.object({
|
|
156
|
-
id: zod_1.z.string().min(1),
|
|
157
|
-
status: zod_1.z.enum(['new', 'acknowledged', 'in-progress', 'resolved', 'closed']).optional(),
|
|
158
|
-
metadata: zod_1.z.object({}).passthrough().optional()
|
|
159
|
-
}).strict();
|
|
160
|
-
const zFeedbackStats = zod_1.z.object({
|
|
161
|
-
since: zod_1.z.string().optional()
|
|
162
|
-
}).strict();
|
|
163
|
-
const zFeedbackDispatch = zod_1.z.object({
|
|
164
|
-
action: zod_1.z.enum(['submit', 'list', 'get', 'update', 'stats', 'health', 'rate']),
|
|
165
|
-
instructionId: zod_1.z.string().optional(),
|
|
166
|
-
rating: zod_1.z.enum(['useful', 'not-useful', 'outdated', 'incomplete']).optional(),
|
|
167
|
-
comment: zod_1.z.string().max(1000).optional(),
|
|
168
|
-
type: zod_1.z.enum(['issue', 'status', 'security', 'feature-request', 'bug-report', 'performance', 'usability', 'other']).optional(),
|
|
169
|
-
severity: zod_1.z.enum(['low', 'medium', 'high', 'critical']).optional(),
|
|
170
|
-
title: zod_1.z.string().max(200).optional(),
|
|
171
|
-
description: zod_1.z.string().max(10000).optional(),
|
|
172
|
-
body: zod_1.z.string().max(10000).optional(),
|
|
173
|
-
id: zod_1.z.string().optional(),
|
|
174
|
-
status: zod_1.z.enum(['new', 'acknowledged', 'in-progress', 'resolved', 'closed']).optional(),
|
|
175
|
-
limit: zod_1.z.number().int().min(1).max(200).optional(),
|
|
176
|
-
offset: zod_1.z.number().int().min(0).optional(),
|
|
177
|
-
since: zod_1.z.string().optional(),
|
|
178
|
-
tags: zod_1.z.array(zod_1.z.string()).optional(),
|
|
179
|
-
metadata: zod_1.z.object({}).passthrough().optional()
|
|
180
|
-
}).passthrough();
|
|
181
185
|
// ── Usage ────────────────────────────────────────────────────────────────────
|
|
182
186
|
const zUsageTrack = zod_1.z.object({
|
|
183
187
|
id: zod_1.z.string().min(1),
|
|
@@ -257,14 +261,11 @@ const zodMap = {
|
|
|
257
261
|
'index_search': zSearch,
|
|
258
262
|
'prompt_review': zPromptReview,
|
|
259
263
|
'help_overview': zEmpty,
|
|
260
|
-
'feedback_dispatch': zFeedbackDispatch,
|
|
261
264
|
'bootstrap': zBootstrap,
|
|
262
265
|
// Extended tools
|
|
263
266
|
'graph_export': zGraphExport,
|
|
264
267
|
'usage_track': zUsageTrack,
|
|
265
268
|
'usage_hotset': zHotset,
|
|
266
|
-
'index_add': zAdd,
|
|
267
|
-
'index_import': zImport,
|
|
268
269
|
'index_remove': zRemove,
|
|
269
270
|
'index_reload': zEmpty,
|
|
270
271
|
'index_governanceHash': zEmpty,
|
|
@@ -276,11 +277,6 @@ const zodMap = {
|
|
|
276
277
|
'index_schema': zEmpty,
|
|
277
278
|
// Admin tools
|
|
278
279
|
'feedback_submit': zFeedbackSubmit,
|
|
279
|
-
'feedback_list': zFeedbackList,
|
|
280
|
-
'feedback_get': zFeedbackGet,
|
|
281
|
-
'feedback_update': zFeedbackUpdate,
|
|
282
|
-
'feedback_stats': zFeedbackStats,
|
|
283
|
-
'feedback_health': zEmpty,
|
|
284
280
|
'meta_tools': zEmpty,
|
|
285
281
|
'meta_activation_guide': zEmpty,
|
|
286
282
|
'meta_check_activation': zMetaCheckActivation,
|
|
@@ -305,10 +301,17 @@ const zodMap = {
|
|
|
305
301
|
'diagnostics_microtaskFlood': zDiagnosticsMicrotaskFlood,
|
|
306
302
|
'diagnostics_memoryPressure': zDiagnosticsMemoryPressure,
|
|
307
303
|
};
|
|
304
|
+
function getZodSchemaForTool(toolName) {
|
|
305
|
+
if (toolName === 'index_add')
|
|
306
|
+
return buildZAdd();
|
|
307
|
+
if (toolName === 'index_import')
|
|
308
|
+
return buildZImport();
|
|
309
|
+
return zodMap[toolName];
|
|
310
|
+
}
|
|
308
311
|
function getZodEnhancedRegistry() {
|
|
309
312
|
const base = (0, toolRegistry_1.getToolRegistry)({ tier: 'admin' });
|
|
310
313
|
for (const e of base) {
|
|
311
|
-
const zSchema =
|
|
314
|
+
const zSchema = getZodSchemaForTool(e.name);
|
|
312
315
|
if (zSchema) {
|
|
313
316
|
e.zodSchema = zSchema;
|
|
314
317
|
}
|
|
@@ -317,9 +320,9 @@ function getZodEnhancedRegistry() {
|
|
|
317
320
|
}
|
|
318
321
|
/** Get the Zod schema for a specific tool by name */
|
|
319
322
|
function getZodSchema(toolName) {
|
|
320
|
-
return
|
|
323
|
+
return getZodSchemaForTool(toolName);
|
|
321
324
|
}
|
|
322
325
|
/** Check if a tool has a Zod schema registered */
|
|
323
326
|
function hasZodSchema(toolName) {
|
|
324
|
-
return toolName in zodMap;
|
|
327
|
+
return toolName === 'index_add' || toolName === 'index_import' || toolName in zodMap;
|
|
325
328
|
}
|
package/dist/services/tracing.js
CHANGED
|
@@ -12,7 +12,9 @@ exports.getTraceFile = getTraceFile;
|
|
|
12
12
|
exports.summarizeTraceEnv = summarizeTraceEnv;
|
|
13
13
|
const fs_1 = __importDefault(require("fs"));
|
|
14
14
|
const path_1 = __importDefault(require("path"));
|
|
15
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
15
16
|
const runtimeConfig_1 = require("../config/runtimeConfig");
|
|
17
|
+
const logger_js_1 = require("./logger.js");
|
|
16
18
|
let cachedLevel = 0;
|
|
17
19
|
let lastLevelCheck = 0;
|
|
18
20
|
let traceStream = null;
|
|
@@ -72,7 +74,7 @@ function resolveSessionId() {
|
|
|
72
74
|
return cachedSessionId;
|
|
73
75
|
const tracing = (0, runtimeConfig_1.getRuntimeConfig)().tracing;
|
|
74
76
|
const provided = tracing.sessionId && tracing.sessionId.trim().length ? tracing.sessionId.trim() : undefined;
|
|
75
|
-
cachedSessionId = provided ||
|
|
77
|
+
cachedSessionId = provided || crypto_1.default.randomBytes(4).toString('hex');
|
|
76
78
|
return cachedSessionId;
|
|
77
79
|
}
|
|
78
80
|
function categoriesAllow(label, categories) {
|
|
@@ -218,8 +220,7 @@ function emitTrace(label, data, min = 1) {
|
|
|
218
220
|
rec.func = caller;
|
|
219
221
|
pushBuffer(rec, tracing.buffer);
|
|
220
222
|
try {
|
|
221
|
-
|
|
222
|
-
console.error(label, JSON.stringify(rec));
|
|
223
|
+
(0, logger_js_1.logError)(label, JSON.stringify(rec));
|
|
223
224
|
}
|
|
224
225
|
catch { /* ignore */ }
|
|
225
226
|
if (!(tracing.persist || tracing.file))
|
|
@@ -230,7 +231,7 @@ function emitTrace(label, data, min = 1) {
|
|
|
230
231
|
return;
|
|
231
232
|
const line = `${label} ${JSON.stringify(rec)}\n`;
|
|
232
233
|
try {
|
|
233
|
-
stream.write(line);
|
|
234
|
+
stream.write(line); // lgtm[js/http-to-file-access] — trace stream targets config-controlled trace file
|
|
234
235
|
traceBytesWritten += Buffer.byteLength(line);
|
|
235
236
|
rotateIfNeeded();
|
|
236
237
|
if (tracing.fsync) {
|
package/dist/utils/envUtils.d.ts
CHANGED
|
@@ -40,3 +40,7 @@ export declare function parseBooleanEnv(envVar: string | undefined, defaultValue
|
|
|
40
40
|
* @returns boolean value
|
|
41
41
|
*/
|
|
42
42
|
export declare function getBooleanEnv(name: string, defaultValue?: boolean): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Dangerous diagnostics are only available in explicit debug / stress sessions.
|
|
45
|
+
*/
|
|
46
|
+
export declare function dangerousDiagnosticsEnabled(): boolean;
|
package/dist/utils/envUtils.js
CHANGED
|
@@ -10,6 +10,7 @@ exports.isFalsyExtended = isFalsyExtended;
|
|
|
10
10
|
exports.isDebugOrVerbose = isDebugOrVerbose;
|
|
11
11
|
exports.parseBooleanEnv = parseBooleanEnv;
|
|
12
12
|
exports.getBooleanEnv = getBooleanEnv;
|
|
13
|
+
exports.dangerousDiagnosticsEnabled = dangerousDiagnosticsEnabled;
|
|
13
14
|
// ── Canonical truthy / falsy value sets ──────────────────────────────
|
|
14
15
|
exports.TRUTHY_VALUES = ['1', 'true', 'yes', 'on'];
|
|
15
16
|
exports.FALSY_VALUES = ['0', 'false', 'no', 'off'];
|
|
@@ -78,3 +79,9 @@ function parseBooleanEnv(envVar, defaultValue = false) {
|
|
|
78
79
|
function getBooleanEnv(name, defaultValue = false) {
|
|
79
80
|
return parseBooleanEnv(process.env[name], defaultValue);
|
|
80
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Dangerous diagnostics are only available in explicit debug / stress sessions.
|
|
84
|
+
*/
|
|
85
|
+
function dangerousDiagnosticsEnabled() {
|
|
86
|
+
return getBooleanEnv('INDEX_SERVER_STRESS_DIAG') || getBooleanEnv('INDEX_SERVER_DEBUG');
|
|
87
|
+
}
|
|
@@ -15,6 +15,7 @@ exports.checkListeners = checkListeners;
|
|
|
15
15
|
* Use while attached to debugger for real-time memory analysis.
|
|
16
16
|
*/
|
|
17
17
|
const envUtils_1 = require("./envUtils");
|
|
18
|
+
const logger_js_1 = require("../services/logger.js");
|
|
18
19
|
class MemoryMonitor {
|
|
19
20
|
snapshots = [];
|
|
20
21
|
maxSnapshots = 1000;
|
|
@@ -25,10 +26,10 @@ class MemoryMonitor {
|
|
|
25
26
|
*/
|
|
26
27
|
startMonitoring(intervalMs = 5000) {
|
|
27
28
|
if (this.isMonitoring) {
|
|
28
|
-
|
|
29
|
+
(0, logger_js_1.logError)('[MemoryMonitor] Already monitoring');
|
|
29
30
|
return;
|
|
30
31
|
}
|
|
31
|
-
|
|
32
|
+
(0, logger_js_1.logError)(`[MemoryMonitor] Starting memory monitoring (interval: ${intervalMs}ms)`);
|
|
32
33
|
this.isMonitoring = true;
|
|
33
34
|
this.intervalId = setInterval(() => {
|
|
34
35
|
this.takeSnapshot();
|
|
@@ -45,7 +46,7 @@ class MemoryMonitor {
|
|
|
45
46
|
this.intervalId = undefined;
|
|
46
47
|
}
|
|
47
48
|
this.isMonitoring = false;
|
|
48
|
-
|
|
49
|
+
(0, logger_js_1.logError)('[MemoryMonitor] Stopped monitoring');
|
|
49
50
|
}
|
|
50
51
|
/**
|
|
51
52
|
* Take a memory snapshot
|
|
@@ -87,11 +88,11 @@ class MemoryMonitor {
|
|
|
87
88
|
const wantStructured = (0, envUtils_1.isDebugOrVerbose)();
|
|
88
89
|
try {
|
|
89
90
|
if (wantStructured) {
|
|
90
|
-
|
|
91
|
+
(0, logger_js_1.logError)(JSON.stringify(payload));
|
|
91
92
|
}
|
|
92
93
|
else {
|
|
93
94
|
// Fallback concise plain text (single line) to preserve readability and avoid multi-line noise.
|
|
94
|
-
|
|
95
|
+
(0, logger_js_1.logError)(`[MemoryMonitor] heapDelta=${this.formatBytes(heapGrowth)} heapUsed=${this.formatBytes(snapshot.heapUsed)} rssDelta=${this.formatBytes(rssGrowth)} rss=${this.formatBytes(snapshot.rss)}`);
|
|
95
96
|
}
|
|
96
97
|
}
|
|
97
98
|
catch { /* swallow */ }
|
|
@@ -182,7 +183,7 @@ Leak Detected: ${trend.leakDetected ? 'YES' : 'NO'}
|
|
|
182
183
|
try {
|
|
183
184
|
if (typeof global.gc === 'function') {
|
|
184
185
|
global.gc();
|
|
185
|
-
|
|
186
|
+
(0, logger_js_1.logError)('[MemoryMonitor] Forced garbage collection');
|
|
186
187
|
}
|
|
187
188
|
// Note: This would require v8 module for actual heap snapshots
|
|
188
189
|
// For now, just return memory usage after GC
|
|
@@ -230,7 +231,7 @@ function getMemoryMonitor() {
|
|
|
230
231
|
* Quick memory status check
|
|
231
232
|
*/
|
|
232
233
|
function memStatus() {
|
|
233
|
-
|
|
234
|
+
(0, logger_js_1.logError)(getMemoryMonitor().getCurrentStatus());
|
|
234
235
|
}
|
|
235
236
|
/**
|
|
236
237
|
* Start memory monitoring
|
|
@@ -248,20 +249,20 @@ function stopMemWatch() {
|
|
|
248
249
|
* Get memory report
|
|
249
250
|
*/
|
|
250
251
|
function memReport() {
|
|
251
|
-
|
|
252
|
+
(0, logger_js_1.logError)(getMemoryMonitor().getDetailedReport());
|
|
252
253
|
}
|
|
253
254
|
/**
|
|
254
255
|
* Force garbage collection and show memory
|
|
255
256
|
*/
|
|
256
257
|
function forceGC() {
|
|
257
258
|
const result = getMemoryMonitor().takeHeapSnapshot();
|
|
258
|
-
|
|
259
|
+
(0, logger_js_1.logError)(result ?? '');
|
|
259
260
|
}
|
|
260
261
|
/**
|
|
261
262
|
* Check event listeners
|
|
262
263
|
*/
|
|
263
264
|
function checkListeners() {
|
|
264
|
-
|
|
265
|
+
(0, logger_js_1.logError)(getMemoryMonitor().checkEventListeners());
|
|
265
266
|
}
|
|
266
267
|
// Global exports for debugger console
|
|
267
268
|
if (typeof global !== 'undefined') {
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jagilber-org/index-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.26.4",
|
|
4
|
+
"mcpName": "io.github.jagilber-org/index-server",
|
|
4
5
|
"description": "MCP instruction indexing server for AI assistant governance — search, CRUD, schema validation, usage tracking, and cross-repo knowledge promotion.",
|
|
5
6
|
"publishConfig": {
|
|
6
7
|
"registry": "https://registry.npmjs.org/",
|
|
@@ -17,6 +18,9 @@
|
|
|
17
18
|
"templates/",
|
|
18
19
|
"scripts/copy-dashboard-assets.mjs",
|
|
19
20
|
"scripts/setup-hooks.cjs",
|
|
21
|
+
"scripts/generate-certs.mjs",
|
|
22
|
+
"scripts/setup-wizard.mjs",
|
|
23
|
+
"server.json",
|
|
20
24
|
"README.md",
|
|
21
25
|
"LICENSE",
|
|
22
26
|
"CHANGELOG.md",
|
|
@@ -29,6 +33,7 @@
|
|
|
29
33
|
"index-server": "dist/server/index-server.js"
|
|
30
34
|
},
|
|
31
35
|
"scripts": {
|
|
36
|
+
"setup": "node scripts/setup-wizard.mjs",
|
|
32
37
|
"instructions:normalize": "node scripts/normalize-instructions.js",
|
|
33
38
|
"build": "tsc -p tsconfig.json && node scripts/copy-dashboard-assets.mjs",
|
|
34
39
|
"start": "node dist/server/index-server.js",
|
|
@@ -45,7 +50,8 @@
|
|
|
45
50
|
"manifest:generate": "node scripts/generate-manifest.mjs",
|
|
46
51
|
"contract:tools": "node scripts/generate-tools-snapshot.mjs",
|
|
47
52
|
"verify:manifest": "node scripts/verify-manifest.mjs",
|
|
48
|
-
"test": "
|
|
53
|
+
"test": "npm run test:fast",
|
|
54
|
+
"test:all": "vitest run",
|
|
49
55
|
"test:watch": "vitest",
|
|
50
56
|
"test:contracts": "vitest run src/tests/contractSchemas.spec.ts",
|
|
51
57
|
"test:diag": "cross-env INDEX_SERVER_HEALTH_MIXED_DIAG=1 vitest run src/tests/handshakeFlakeRepro.spec.ts src/tests/healthMixedReproLoop.spec.ts src/tests/healthHangExploration.spec.ts",
|
|
@@ -58,8 +64,7 @@
|
|
|
58
64
|
"format": "prettier --write .",
|
|
59
65
|
"prepare": "node scripts/setup-hooks.cjs",
|
|
60
66
|
"audit": "npm audit --omit=dev --audit-level=high",
|
|
61
|
-
"
|
|
62
|
-
"prepublishOnly": "npm run build && npm run typecheck",
|
|
67
|
+
"prepublishOnly": "npm run build && npm run typecheck && npm run audit",
|
|
63
68
|
"scan:security": "node scripts/security-scan.mjs",
|
|
64
69
|
"release:patch": "node scripts/bump-version.mjs patch",
|
|
65
70
|
"release:minor": "node scripts/bump-version.mjs minor",
|
|
@@ -115,6 +120,7 @@
|
|
|
115
120
|
},
|
|
116
121
|
"dependencies": {
|
|
117
122
|
"@huggingface/transformers": "^3.8.1",
|
|
123
|
+
"@inquirer/prompts": "^8.4.2",
|
|
118
124
|
"@mermaid-js/layout-elk": "^0.2.1",
|
|
119
125
|
"@modelcontextprotocol/sdk": "^1.28.0",
|
|
120
126
|
"adm-zip": "^0.5.17",
|
|
@@ -122,6 +128,8 @@
|
|
|
122
128
|
"ajv-formats": "^2.1.1",
|
|
123
129
|
"express": "^5.2.1",
|
|
124
130
|
"express-rate-limit": "^8.3.2",
|
|
131
|
+
"safe-regex2": "^5.1.1",
|
|
132
|
+
"sqlite-vec": "0.1.9",
|
|
125
133
|
"ws": "^8.19.0",
|
|
126
134
|
"zod": "^3.23.8"
|
|
127
135
|
},
|
|
@@ -30,6 +30,31 @@
|
|
|
30
30
|
"description": "Human readable summary of change"
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
+
},
|
|
34
|
+
"extensionValue": {
|
|
35
|
+
"anyOf": [
|
|
36
|
+
{
|
|
37
|
+
"type": "string"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"type": "number"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"type": "boolean"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"type": "array",
|
|
47
|
+
"items": {
|
|
48
|
+
"$ref": "#/definitions/extensionValue"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"type": "object",
|
|
53
|
+
"additionalProperties": {
|
|
54
|
+
"$ref": "#/definitions/extensionValue"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
]
|
|
33
58
|
}
|
|
34
59
|
},
|
|
35
60
|
"required": [
|
|
@@ -148,6 +173,11 @@
|
|
|
148
173
|
"minimum": 0,
|
|
149
174
|
"description": "Number of tracked usage events"
|
|
150
175
|
},
|
|
176
|
+
"firstSeenTs": {
|
|
177
|
+
"type": "string",
|
|
178
|
+
"format": "date-time",
|
|
179
|
+
"description": "Timestamp when usage was first observed (ISO 8601)"
|
|
180
|
+
},
|
|
151
181
|
"lastUsedAt": {
|
|
152
182
|
"type": "string",
|
|
153
183
|
"format": "date-time",
|
|
@@ -237,6 +267,11 @@
|
|
|
237
267
|
"type": "string",
|
|
238
268
|
"description": "ID of instruction this one replaces"
|
|
239
269
|
},
|
|
270
|
+
"archivedAt": {
|
|
271
|
+
"type": "string",
|
|
272
|
+
"format": "date-time",
|
|
273
|
+
"description": "Timestamp when archived (ISO 8601)"
|
|
274
|
+
},
|
|
240
275
|
"semanticSummary": {
|
|
241
276
|
"type": "string",
|
|
242
277
|
"maxLength": 600,
|
|
@@ -255,7 +290,9 @@
|
|
|
255
290
|
"extensions": {
|
|
256
291
|
"type": "object",
|
|
257
292
|
"description": "Future-proof vendor / experimental fields",
|
|
258
|
-
"additionalProperties":
|
|
293
|
+
"additionalProperties": {
|
|
294
|
+
"$ref": "#/definitions/extensionValue"
|
|
295
|
+
}
|
|
259
296
|
}
|
|
260
297
|
},
|
|
261
298
|
"additionalProperties": false
|
package/scripts/dist/README.md
CHANGED