@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.
Files changed (190) hide show
  1. package/CHANGELOG.md +91 -2
  2. package/CODE_OF_CONDUCT.md +2 -0
  3. package/CONTRIBUTING.md +32 -2
  4. package/README.md +82 -19
  5. package/SECURITY.md +17 -5
  6. package/dist/config/dashboardConfig.d.ts +3 -0
  7. package/dist/config/dashboardConfig.js +3 -0
  8. package/dist/config/defaultValues.d.ts +1 -1
  9. package/dist/config/defaultValues.js +1 -1
  10. package/dist/config/featureConfig.d.ts +2 -0
  11. package/dist/config/featureConfig.js +6 -1
  12. package/dist/config/runtimeConfig.d.ts +1 -1
  13. package/dist/config/runtimeConfig.js +8 -9
  14. package/dist/dashboard/client/admin.html +170 -53
  15. package/dist/dashboard/client/css/admin.css +132 -0
  16. package/dist/dashboard/client/js/admin.auth.js +25 -11
  17. package/dist/dashboard/client/js/admin.config.js +1 -1
  18. package/dist/dashboard/client/js/admin.feedback.js +328 -0
  19. package/dist/dashboard/client/js/admin.graph.js +120 -18
  20. package/dist/dashboard/client/js/admin.instructions.js +27 -13
  21. package/dist/dashboard/client/js/admin.logs.js +1 -5
  22. package/dist/dashboard/client/js/admin.maintenance.js +53 -8
  23. package/dist/dashboard/client/js/admin.messaging.js +1 -4
  24. package/dist/dashboard/client/js/admin.overview.js +5 -1
  25. package/dist/dashboard/client/js/admin.sessions.js +1 -1
  26. package/dist/dashboard/client/js/admin.utils.js +43 -1
  27. package/dist/dashboard/client/js/mermaid.min.js +813 -537
  28. package/dist/dashboard/export/DataExporter.js +2 -1
  29. package/dist/dashboard/server/AdminPanel.d.ts +3 -0
  30. package/dist/dashboard/server/AdminPanel.js +132 -35
  31. package/dist/dashboard/server/ApiRoutes.js +40 -9
  32. package/dist/dashboard/server/DashboardServer.js +1 -1
  33. package/dist/dashboard/server/FileMetricsStorage.d.ts +19 -0
  34. package/dist/dashboard/server/FileMetricsStorage.js +52 -5
  35. package/dist/dashboard/server/HttpTransport.js +6 -0
  36. package/dist/dashboard/server/InstanceManager.js +7 -2
  37. package/dist/dashboard/server/KnowledgeStore.js +7 -2
  38. package/dist/dashboard/server/MetricsCollector.d.ts +16 -0
  39. package/dist/dashboard/server/MetricsCollector.js +113 -17
  40. package/dist/dashboard/server/legacyDashboardHtml.js +7 -2
  41. package/dist/dashboard/server/middleware/ensureLoadedMiddleware.d.ts +1 -1
  42. package/dist/dashboard/server/middleware/ensureLoadedMiddleware.js +8 -3
  43. package/dist/dashboard/server/routes/admin.feedback.routes.d.ts +15 -0
  44. package/dist/dashboard/server/routes/admin.feedback.routes.js +188 -0
  45. package/dist/dashboard/server/routes/admin.routes.js +35 -27
  46. package/dist/dashboard/server/routes/alerts.routes.js +4 -3
  47. package/dist/dashboard/server/routes/api.feedback.routes.js +2 -1
  48. package/dist/dashboard/server/routes/api.usage.routes.js +8 -7
  49. package/dist/dashboard/server/routes/embeddings.routes.d.ts +2 -1
  50. package/dist/dashboard/server/routes/embeddings.routes.js +18 -9
  51. package/dist/dashboard/server/routes/graph.routes.js +10 -13
  52. package/dist/dashboard/server/routes/index.d.ts +1 -0
  53. package/dist/dashboard/server/routes/index.js +74 -39
  54. package/dist/dashboard/server/routes/instances.routes.js +2 -1
  55. package/dist/dashboard/server/routes/instructions.routes.js +46 -27
  56. package/dist/dashboard/server/routes/knowledge.routes.js +4 -3
  57. package/dist/dashboard/server/routes/logs.routes.js +5 -4
  58. package/dist/dashboard/server/routes/messaging.routes.js +15 -14
  59. package/dist/dashboard/server/routes/metrics.routes.js +14 -13
  60. package/dist/dashboard/server/routes/scripts.routes.js +6 -3
  61. package/dist/dashboard/server/routes/status.routes.js +5 -4
  62. package/dist/dashboard/server/routes/synthetic.routes.js +3 -2
  63. package/dist/dashboard/server/routes/usage.routes.js +2 -1
  64. package/dist/dashboard/server/utils/escapeHtml.d.ts +1 -0
  65. package/dist/dashboard/server/utils/escapeHtml.js +11 -0
  66. package/dist/dashboard/server/utils/pathContainment.d.ts +1 -0
  67. package/dist/dashboard/server/utils/pathContainment.js +15 -0
  68. package/dist/dashboard/server/wsInit.js +2 -2
  69. package/dist/lib/mcpStdioLogging.d.ts +165 -0
  70. package/dist/lib/mcpStdioLogging.js +287 -0
  71. package/dist/schemas/index.d.ts +37 -2
  72. package/dist/schemas/index.js +27 -3
  73. package/dist/server/backgroundServicesStartup.d.ts +7 -1
  74. package/dist/server/backgroundServicesStartup.js +25 -8
  75. package/dist/server/certInit.d.ts +97 -0
  76. package/dist/server/certInit.js +359 -0
  77. package/dist/server/certInit.types.d.ts +92 -0
  78. package/dist/server/certInit.types.js +34 -0
  79. package/dist/server/handshake/fallbackFrames.d.ts +31 -0
  80. package/dist/server/handshake/fallbackFrames.js +38 -0
  81. package/dist/server/handshake/initializeDetector.d.ts +31 -0
  82. package/dist/server/handshake/initializeDetector.js +88 -0
  83. package/dist/server/handshake/protocol.d.ts +15 -0
  84. package/dist/server/handshake/protocol.js +37 -0
  85. package/dist/server/handshake/readyEmitter.d.ts +6 -0
  86. package/dist/server/handshake/readyEmitter.js +88 -0
  87. package/dist/server/handshake/safetyFallbacks.d.ts +1 -0
  88. package/dist/server/handshake/safetyFallbacks.js +134 -0
  89. package/dist/server/handshake/stdinSniffer.d.ts +1 -0
  90. package/dist/server/handshake/stdinSniffer.js +260 -0
  91. package/dist/server/handshake/tracing.d.ts +16 -0
  92. package/dist/server/handshake/tracing.js +95 -0
  93. package/dist/server/handshakeManager.d.ts +23 -23
  94. package/dist/server/handshakeManager.js +36 -466
  95. package/dist/server/index-server.d.ts +23 -0
  96. package/dist/server/index-server.js +194 -9
  97. package/dist/server/mcpReadOnlySurfaces.d.ts +44 -0
  98. package/dist/server/mcpReadOnlySurfaces.js +297 -0
  99. package/dist/server/sdkServer.js +69 -7
  100. package/dist/server/transport.d.ts +5 -6
  101. package/dist/server/transport.js +46 -64
  102. package/dist/server/transportFactory.d.ts +3 -9
  103. package/dist/server/transportFactory.js +18 -380
  104. package/dist/services/atomicFs.d.ts +3 -0
  105. package/dist/services/atomicFs.js +171 -13
  106. package/dist/services/auditLog.d.ts +17 -2
  107. package/dist/services/auditLog.js +75 -14
  108. package/dist/services/bootstrapGating.js +1 -1
  109. package/dist/services/categoryRules.d.ts +10 -0
  110. package/dist/services/categoryRules.js +17 -0
  111. package/dist/services/classificationService.js +7 -5
  112. package/dist/services/embeddingService.d.ts +27 -11
  113. package/dist/services/embeddingService.js +51 -14
  114. package/dist/services/feedbackStorage.d.ts +39 -0
  115. package/dist/services/feedbackStorage.js +88 -0
  116. package/dist/services/handlers/instructions.add.js +429 -317
  117. package/dist/services/handlers/instructions.groom.js +128 -31
  118. package/dist/services/handlers/instructions.import.js +56 -23
  119. package/dist/services/handlers/instructions.patch.js +43 -32
  120. package/dist/services/handlers/instructions.query.js +20 -29
  121. package/dist/services/handlers/instructions.shared.d.ts +54 -0
  122. package/dist/services/handlers/instructions.shared.js +126 -1
  123. package/dist/services/handlers.activation.js +83 -81
  124. package/dist/services/handlers.dashboardConfig.d.ts +2 -2
  125. package/dist/services/handlers.dashboardConfig.js +1 -2
  126. package/dist/services/handlers.diagnostics.js +75 -54
  127. package/dist/services/handlers.feedback.d.ts +4 -11
  128. package/dist/services/handlers.feedback.js +11 -333
  129. package/dist/services/handlers.gates.js +69 -37
  130. package/dist/services/handlers.graph.js +2 -2
  131. package/dist/services/handlers.help.js +2 -2
  132. package/dist/services/handlers.instructionSchema.js +4 -2
  133. package/dist/services/handlers.integrity.js +42 -22
  134. package/dist/services/handlers.messaging.js +1 -1
  135. package/dist/services/handlers.metrics.js +51 -6
  136. package/dist/services/handlers.prompt.js +10 -2
  137. package/dist/services/handlers.search.js +94 -44
  138. package/dist/services/handlers.trace.js +1 -1
  139. package/dist/services/handlers.usage.js +38 -7
  140. package/dist/services/indexContext.d.ts +21 -1
  141. package/dist/services/indexContext.js +263 -78
  142. package/dist/services/indexLoader.d.ts +1 -0
  143. package/dist/services/indexLoader.js +28 -8
  144. package/dist/services/instructionRecordValidation.d.ts +39 -0
  145. package/dist/services/instructionRecordValidation.js +388 -0
  146. package/dist/services/instructions.dispatcher.js +4 -4
  147. package/dist/services/loaderSchemaValidator.d.ts +15 -0
  148. package/dist/services/loaderSchemaValidator.js +69 -0
  149. package/dist/services/logger.js +11 -2
  150. package/dist/services/mcpLogBridge.d.ts +49 -0
  151. package/dist/services/mcpLogBridge.js +83 -0
  152. package/dist/services/ownershipService.js +18 -8
  153. package/dist/services/performanceBaseline.js +23 -22
  154. package/dist/services/promptReviewService.d.ts +3 -1
  155. package/dist/services/promptReviewService.js +41 -13
  156. package/dist/services/regexSafety.d.ts +6 -0
  157. package/dist/services/regexSafety.js +46 -0
  158. package/dist/services/seedBootstrap.js +1 -1
  159. package/dist/services/storage/factory.d.ts +14 -1
  160. package/dist/services/storage/factory.js +61 -1
  161. package/dist/services/storage/jsonEmbeddingStore.d.ts +15 -0
  162. package/dist/services/storage/jsonEmbeddingStore.js +83 -0
  163. package/dist/services/storage/jsonFileStore.d.ts +3 -1
  164. package/dist/services/storage/jsonFileStore.js +8 -6
  165. package/dist/services/storage/migrationEngine.d.ts +13 -0
  166. package/dist/services/storage/migrationEngine.js +31 -0
  167. package/dist/services/storage/sqliteEmbeddingStore.d.ts +30 -0
  168. package/dist/services/storage/sqliteEmbeddingStore.js +222 -0
  169. package/dist/services/storage/sqliteStore.d.ts +3 -1
  170. package/dist/services/storage/sqliteStore.js +2 -2
  171. package/dist/services/storage/types.d.ts +48 -1
  172. package/dist/services/toolRegistry.js +77 -67
  173. package/dist/services/toolRegistry.zod.js +89 -86
  174. package/dist/services/tracing.js +5 -4
  175. package/dist/utils/envUtils.d.ts +4 -0
  176. package/dist/utils/envUtils.js +7 -0
  177. package/dist/utils/memoryMonitor.js +11 -10
  178. package/package.json +12 -4
  179. package/schemas/instruction.schema.json +38 -1
  180. package/scripts/copy-dashboard-assets.mjs +1 -1
  181. package/scripts/dist/README.md +1 -1
  182. package/scripts/generate-certs.mjs +201 -0
  183. package/scripts/setup-wizard.mjs +781 -0
  184. package/server.json +20 -0
  185. package/dist/externalClientLib.d.ts +0 -1
  186. package/dist/externalClientLib.js +0 -2
  187. package/dist/portableClientWrapper.d.ts +0 -1
  188. package/dist/portableClientWrapper.js +0 -2
  189. package/dist/services/indexingService.d.ts +0 -1
  190. 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.string().optional(),
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.string().optional(),
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
- const zIndexEntry = zod_1.z.object({
57
- id: zod_1.z.string().min(1),
58
- title: zod_1.z.string().min(1).optional(),
59
- body: zod_1.z.string().min(1).max(1000000),
60
- rationale: zod_1.z.string().optional(),
61
- priority: zod_1.z.number().int().min(1).max(100).optional(),
62
- audience: zod_1.z.string().optional(),
63
- requirement: zod_1.z.string().optional(),
64
- categories: zod_1.z.array(zod_1.z.string()).max(50).optional(),
65
- deprecatedBy: zod_1.z.string().optional(),
66
- riskScore: zod_1.z.number().optional(),
67
- extensions: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional()
68
- }).strict();
69
- const zAdd = zod_1.z.object({
70
- entry: zIndexEntry,
71
- overwrite: zod_1.z.boolean().optional(),
72
- lax: zod_1.z.boolean().optional()
73
- }).strict();
74
- const zImport = zod_1.z.object({
75
- entries: zod_1.z.union([
76
- zod_1.z.array(zod_1.z.object({
77
- id: zod_1.z.string(),
78
- title: zod_1.z.string(),
79
- body: zod_1.z.string().max(1000000),
80
- rationale: zod_1.z.string().optional(),
81
- priority: zod_1.z.number(),
82
- audience: zod_1.z.string(),
83
- requirement: zod_1.z.string(),
84
- categories: zod_1.z.array(zod_1.z.string()).optional(),
85
- extensions: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional(),
86
- mode: zod_1.z.string().optional()
87
- }).passthrough()).min(1),
88
- zod_1.z.string()
89
- ]).optional(),
90
- source: zod_1.z.string().optional(),
91
- mode: zod_1.z.enum(['skip', 'overwrite']).optional()
92
- }).strict();
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 = zodMap[e.name];
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 zodMap[toolName];
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
  }
@@ -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 || Math.random().toString(36).slice(2, 10); // lgtm[js/insecure-randomness] — trace ID for correlation, not security
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
- // eslint-disable-next-line no-console
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) {
@@ -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;
@@ -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
- console.error('[MemoryMonitor] Already monitoring');
29
+ (0, logger_js_1.logError)('[MemoryMonitor] Already monitoring');
29
30
  return;
30
31
  }
31
- console.error(`[MemoryMonitor] Starting memory monitoring (interval: ${intervalMs}ms)`);
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
- console.error('[MemoryMonitor] Stopped monitoring');
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
- console.error(JSON.stringify(payload));
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
- console.error(`[MemoryMonitor] heapDelta=${this.formatBytes(heapGrowth)} heapUsed=${this.formatBytes(snapshot.heapUsed)} rssDelta=${this.formatBytes(rssGrowth)} rss=${this.formatBytes(snapshot.rss)}`);
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
- console.error('[MemoryMonitor] Forced garbage collection');
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
- console.error(getMemoryMonitor().getCurrentStatus());
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
- console.error(getMemoryMonitor().getDetailedReport());
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
- console.error(result);
259
+ (0, logger_js_1.logError)(result ?? '');
259
260
  }
260
261
  /**
261
262
  * Check event listeners
262
263
  */
263
264
  function checkListeners() {
264
- console.error(getMemoryMonitor().checkEventListeners());
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.22.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": "vitest run",
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
- "prepack": "npm run audit",
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": true
293
+ "additionalProperties": {
294
+ "$ref": "#/definitions/extensionValue"
295
+ }
259
296
  }
260
297
  },
261
298
  "additionalProperties": false
@@ -54,7 +54,7 @@ function copyAssets() {
54
54
  try {
55
55
  const srcStat = statSync(srcPath);
56
56
  let needsCopy = true;
57
- let reason = 'new';
57
+ let reason;
58
58
  try {
59
59
  const destStat = statSync(destPath);
60
60
  if (destStat.size === srcStat.size) {
@@ -1,6 +1,6 @@
1
1
  # scripts/dist/
2
2
 
3
- User-facing utility scripts bundled into the VSIX extension package.
3
+ User-facing utility scripts bundled into distributable runtime packages.
4
4
 
5
5
  These are copied from `scripts/` during the build. Edit the originals in `scripts/`, not here.
6
6