@jagilber-org/index-server 1.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1218 -0
- package/CODE_OF_CONDUCT.md +49 -0
- package/CONTRIBUTING.md +75 -0
- package/LICENSE +21 -0
- package/README.md +523 -0
- package/SECURITY.md +50 -0
- package/dist/config/configUtils.d.ts +11 -0
- package/dist/config/configUtils.js +87 -0
- package/dist/config/dashboardConfig.d.ts +45 -0
- package/dist/config/dashboardConfig.js +63 -0
- package/dist/config/defaultValues.d.ts +61 -0
- package/dist/config/defaultValues.js +70 -0
- package/dist/config/dirConstants.d.ts +17 -0
- package/dist/config/dirConstants.js +28 -0
- package/dist/config/featureConfig.d.ts +61 -0
- package/dist/config/featureConfig.js +121 -0
- package/dist/config/runtimeConfig.d.ts +145 -0
- package/dist/config/runtimeConfig.js +334 -0
- package/dist/config/serverConfig.d.ts +90 -0
- package/dist/config/serverConfig.js +164 -0
- package/dist/dashboard/analytics/AnalyticsEngine.d.ts +142 -0
- package/dist/dashboard/analytics/AnalyticsEngine.js +373 -0
- package/dist/dashboard/analytics/BusinessIntelligence.d.ts +187 -0
- package/dist/dashboard/analytics/BusinessIntelligence.js +594 -0
- package/dist/dashboard/client/admin.html +2150 -0
- package/dist/dashboard/client/chunks/mermaid-layout-elk.esm.min/chunk-SP2CHFBE.mjs +1 -0
- package/dist/dashboard/client/chunks/mermaid-layout-elk.esm.min/render-T6MDALS3.mjs +27 -0
- package/dist/dashboard/client/css/admin.css +1466 -0
- package/dist/dashboard/client/js/admin.boot.js +359 -0
- package/dist/dashboard/client/js/admin.config.js +196 -0
- package/dist/dashboard/client/js/admin.embeddings.js +425 -0
- package/dist/dashboard/client/js/admin.graph.js +583 -0
- package/dist/dashboard/client/js/admin.instances.js +120 -0
- package/dist/dashboard/client/js/admin.instructions.js +552 -0
- package/dist/dashboard/client/js/admin.logs.js +113 -0
- package/dist/dashboard/client/js/admin.maintenance.js +354 -0
- package/dist/dashboard/client/js/admin.messaging.js +635 -0
- package/dist/dashboard/client/js/admin.monitor.js +181 -0
- package/dist/dashboard/client/js/admin.overview.js +221 -0
- package/dist/dashboard/client/js/admin.performance.js +61 -0
- package/dist/dashboard/client/js/admin.sessions.js +293 -0
- package/dist/dashboard/client/js/admin.sqlite.js +366 -0
- package/dist/dashboard/client/js/admin.utils.js +49 -0
- package/dist/dashboard/client/js/chart.umd.js +14 -0
- package/dist/dashboard/client/js/elk.bundled.js +6696 -0
- package/dist/dashboard/client/js/marked.umd.js +74 -0
- package/dist/dashboard/client/js/mermaid.min.js +3022 -0
- package/dist/dashboard/client/mermaid-layout-elk.esm.min.mjs +1 -0
- package/dist/dashboard/export/DataExporter.d.ts +169 -0
- package/dist/dashboard/export/DataExporter.js +737 -0
- package/dist/dashboard/export/exporters/csvExporter.d.ts +11 -0
- package/dist/dashboard/export/exporters/csvExporter.js +46 -0
- package/dist/dashboard/export/exporters/exportTypes.d.ts +89 -0
- package/dist/dashboard/export/exporters/exportTypes.js +5 -0
- package/dist/dashboard/export/exporters/jsonExporter.d.ts +7 -0
- package/dist/dashboard/export/exporters/jsonExporter.js +22 -0
- package/dist/dashboard/export/exporters/xmlExporter.d.ts +17 -0
- package/dist/dashboard/export/exporters/xmlExporter.js +175 -0
- package/dist/dashboard/integration/APIIntegration.d.ts +41 -0
- package/dist/dashboard/integration/APIIntegration.js +95 -0
- package/dist/dashboard/security/SecurityMonitor.d.ts +167 -0
- package/dist/dashboard/security/SecurityMonitor.js +559 -0
- package/dist/dashboard/server/AdminPanel.d.ts +183 -0
- package/dist/dashboard/server/AdminPanel.js +792 -0
- package/dist/dashboard/server/AdminPanelConfig.d.ts +42 -0
- package/dist/dashboard/server/AdminPanelConfig.js +80 -0
- package/dist/dashboard/server/AdminPanelState.d.ts +47 -0
- package/dist/dashboard/server/AdminPanelState.js +214 -0
- package/dist/dashboard/server/ApiRoutes.d.ts +17 -0
- package/dist/dashboard/server/ApiRoutes.js +149 -0
- package/dist/dashboard/server/DashboardServer.d.ts +49 -0
- package/dist/dashboard/server/DashboardServer.js +159 -0
- package/dist/dashboard/server/FileMetricsStorage.d.ts +49 -0
- package/dist/dashboard/server/FileMetricsStorage.js +195 -0
- package/dist/dashboard/server/HttpTransport.d.ts +23 -0
- package/dist/dashboard/server/HttpTransport.js +116 -0
- package/dist/dashboard/server/InstanceManager.d.ts +53 -0
- package/dist/dashboard/server/InstanceManager.js +284 -0
- package/dist/dashboard/server/KnowledgeStore.d.ts +35 -0
- package/dist/dashboard/server/KnowledgeStore.js +105 -0
- package/dist/dashboard/server/LeaderElection.d.ts +81 -0
- package/dist/dashboard/server/LeaderElection.js +268 -0
- package/dist/dashboard/server/MetricsCollector.d.ts +200 -0
- package/dist/dashboard/server/MetricsCollector.js +803 -0
- package/dist/dashboard/server/SessionPersistenceManager.d.ts +88 -0
- package/dist/dashboard/server/SessionPersistenceManager.js +457 -0
- package/dist/dashboard/server/ThinClient.d.ts +64 -0
- package/dist/dashboard/server/ThinClient.js +237 -0
- package/dist/dashboard/server/WebSocketManager.d.ts +161 -0
- package/dist/dashboard/server/WebSocketManager.js +463 -0
- package/dist/dashboard/server/httpLifecycle.d.ts +17 -0
- package/dist/dashboard/server/httpLifecycle.js +35 -0
- package/dist/dashboard/server/legacyDashboardHtml.d.ts +9 -0
- package/dist/dashboard/server/legacyDashboardHtml.js +618 -0
- package/dist/dashboard/server/legacyDashboardStyles.d.ts +5 -0
- package/dist/dashboard/server/legacyDashboardStyles.js +490 -0
- package/dist/dashboard/server/metricsAggregation.d.ts +252 -0
- package/dist/dashboard/server/metricsAggregation.js +206 -0
- package/dist/dashboard/server/metricsSerializer.d.ts +25 -0
- package/dist/dashboard/server/metricsSerializer.js +195 -0
- package/dist/dashboard/server/routes/admin.routes.d.ts +16 -0
- package/dist/dashboard/server/routes/admin.routes.js +596 -0
- package/dist/dashboard/server/routes/alerts.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/alerts.routes.js +93 -0
- package/dist/dashboard/server/routes/api.feedback.routes.d.ts +73 -0
- package/dist/dashboard/server/routes/api.feedback.routes.js +171 -0
- package/dist/dashboard/server/routes/api.instructions.routes.d.ts +101 -0
- package/dist/dashboard/server/routes/api.instructions.routes.js +213 -0
- package/dist/dashboard/server/routes/api.usage.routes.d.ts +57 -0
- package/dist/dashboard/server/routes/api.usage.routes.js +374 -0
- package/dist/dashboard/server/routes/embeddings.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/embeddings.routes.js +246 -0
- package/dist/dashboard/server/routes/graph.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/graph.routes.js +280 -0
- package/dist/dashboard/server/routes/index.d.ts +38 -0
- package/dist/dashboard/server/routes/index.js +194 -0
- package/dist/dashboard/server/routes/instances.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/instances.routes.js +35 -0
- package/dist/dashboard/server/routes/instructions.routes.d.ts +8 -0
- package/dist/dashboard/server/routes/instructions.routes.js +336 -0
- package/dist/dashboard/server/routes/knowledge.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/knowledge.routes.js +82 -0
- package/dist/dashboard/server/routes/logs.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/logs.routes.js +164 -0
- package/dist/dashboard/server/routes/messaging.routes.d.ts +16 -0
- package/dist/dashboard/server/routes/messaging.routes.js +293 -0
- package/dist/dashboard/server/routes/metrics.routes.d.ts +10 -0
- package/dist/dashboard/server/routes/metrics.routes.js +346 -0
- package/dist/dashboard/server/routes/scripts.routes.d.ts +9 -0
- package/dist/dashboard/server/routes/scripts.routes.js +84 -0
- package/dist/dashboard/server/routes/sqlite.routes.d.ts +9 -0
- package/dist/dashboard/server/routes/sqlite.routes.js +569 -0
- package/dist/dashboard/server/routes/status.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/status.routes.js +183 -0
- package/dist/dashboard/server/routes/synthetic.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/synthetic.routes.js +195 -0
- package/dist/dashboard/server/routes/tools.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/tools.routes.js +46 -0
- package/dist/dashboard/server/routes/usage.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/usage.routes.js +25 -0
- package/dist/dashboard/server/wsInit.d.ts +16 -0
- package/dist/dashboard/server/wsInit.js +35 -0
- package/dist/externalClientLib.d.ts +1 -0
- package/dist/externalClientLib.js +2 -0
- package/dist/minimal/index.d.ts +1 -0
- package/dist/minimal/index.js +140 -0
- package/dist/models/SessionPersistence.d.ts +115 -0
- package/dist/models/SessionPersistence.js +66 -0
- package/dist/models/instruction.d.ts +45 -0
- package/dist/models/instruction.js +2 -0
- package/dist/perf/benchmark.d.ts +1 -0
- package/dist/perf/benchmark.js +50 -0
- package/dist/portableClientWrapper.d.ts +1 -0
- package/dist/portableClientWrapper.js +2 -0
- package/dist/schemas/index.d.ts +128 -0
- package/dist/schemas/index.js +371 -0
- package/dist/scripts/runPerformanceBaseline.d.ts +1 -0
- package/dist/scripts/runPerformanceBaseline.js +17 -0
- package/dist/server/handshakeManager.d.ts +25 -0
- package/dist/server/handshakeManager.js +472 -0
- package/dist/server/index-server.d.ts +56 -0
- package/dist/server/index-server.js +822 -0
- package/dist/server/registry.d.ts +44 -0
- package/dist/server/registry.js +236 -0
- package/dist/server/sdkServer.d.ts +8 -0
- package/dist/server/sdkServer.js +299 -0
- package/dist/server/shutdownGuard.d.ts +41 -0
- package/dist/server/shutdownGuard.js +52 -0
- package/dist/server/thin-client.d.ts +22 -0
- package/dist/server/thin-client.js +111 -0
- package/dist/server/transport.d.ts +41 -0
- package/dist/server/transport.js +312 -0
- package/dist/server/transportFactory.d.ts +21 -0
- package/dist/server/transportFactory.js +429 -0
- package/dist/services/atomicFs.d.ts +22 -0
- package/dist/services/atomicFs.js +103 -0
- package/dist/services/auditLog.d.ts +38 -0
- package/dist/services/auditLog.js +142 -0
- package/dist/services/autoBackup.d.ts +14 -0
- package/dist/services/autoBackup.js +171 -0
- package/dist/services/autoSplit.d.ts +32 -0
- package/dist/services/autoSplit.js +113 -0
- package/dist/services/backupZip.d.ts +25 -0
- package/dist/services/backupZip.js +110 -0
- package/dist/services/bootstrapGating.d.ts +123 -0
- package/dist/services/bootstrapGating.js +221 -0
- package/dist/services/canonical.d.ts +23 -0
- package/dist/services/canonical.js +65 -0
- package/dist/services/categoryRules.d.ts +7 -0
- package/dist/services/categoryRules.js +37 -0
- package/dist/services/classificationService.d.ts +42 -0
- package/dist/services/classificationService.js +168 -0
- package/dist/services/embeddingService.d.ts +62 -0
- package/dist/services/embeddingService.js +259 -0
- package/dist/services/errors.d.ts +22 -0
- package/dist/services/errors.js +31 -0
- package/dist/services/featureFlags.d.ts +25 -0
- package/dist/services/featureFlags.js +89 -0
- package/dist/services/features.d.ts +13 -0
- package/dist/services/features.js +35 -0
- package/dist/services/handlers/instructions.add.d.ts +1 -0
- package/dist/services/handlers/instructions.add.js +496 -0
- package/dist/services/handlers/instructions.groom.d.ts +1 -0
- package/dist/services/handlers/instructions.groom.js +523 -0
- package/dist/services/handlers/instructions.import.d.ts +1 -0
- package/dist/services/handlers/instructions.import.js +173 -0
- package/dist/services/handlers/instructions.patch.d.ts +1 -0
- package/dist/services/handlers/instructions.patch.js +167 -0
- package/dist/services/handlers/instructions.query.d.ts +163 -0
- package/dist/services/handlers/instructions.query.js +522 -0
- package/dist/services/handlers/instructions.reload.d.ts +1 -0
- package/dist/services/handlers/instructions.reload.js +13 -0
- package/dist/services/handlers/instructions.remove.d.ts +1 -0
- package/dist/services/handlers/instructions.remove.js +118 -0
- package/dist/services/handlers/instructions.shared.d.ts +31 -0
- package/dist/services/handlers/instructions.shared.js +124 -0
- package/dist/services/handlers.activation.d.ts +1 -0
- package/dist/services/handlers.activation.js +203 -0
- package/dist/services/handlers.bootstrap.d.ts +1 -0
- package/dist/services/handlers.bootstrap.js +38 -0
- package/dist/services/handlers.dashboardConfig.d.ts +34 -0
- package/dist/services/handlers.dashboardConfig.js +108 -0
- package/dist/services/handlers.diagnostics.d.ts +1 -0
- package/dist/services/handlers.diagnostics.js +64 -0
- package/dist/services/handlers.feedback.d.ts +15 -0
- package/dist/services/handlers.feedback.js +378 -0
- package/dist/services/handlers.gates.d.ts +1 -0
- package/dist/services/handlers.gates.js +46 -0
- package/dist/services/handlers.graph.d.ts +53 -0
- package/dist/services/handlers.graph.js +231 -0
- package/dist/services/handlers.help.d.ts +1 -0
- package/dist/services/handlers.help.js +119 -0
- package/dist/services/handlers.instructionSchema.d.ts +1 -0
- package/dist/services/handlers.instructionSchema.js +227 -0
- package/dist/services/handlers.instructions.d.ts +8 -0
- package/dist/services/handlers.instructions.js +14 -0
- package/dist/services/handlers.instructionsDiagnostics.d.ts +1 -0
- package/dist/services/handlers.instructionsDiagnostics.js +14 -0
- package/dist/services/handlers.integrity.d.ts +1 -0
- package/dist/services/handlers.integrity.js +35 -0
- package/dist/services/handlers.manifest.d.ts +1 -0
- package/dist/services/handlers.manifest.js +24 -0
- package/dist/services/handlers.messaging.d.ts +12 -0
- package/dist/services/handlers.messaging.js +203 -0
- package/dist/services/handlers.metrics.d.ts +1 -0
- package/dist/services/handlers.metrics.js +43 -0
- package/dist/services/handlers.promote.d.ts +1 -0
- package/dist/services/handlers.promote.js +306 -0
- package/dist/services/handlers.prompt.d.ts +1 -0
- package/dist/services/handlers.prompt.js +7 -0
- package/dist/services/handlers.search.d.ts +69 -0
- package/dist/services/handlers.search.js +645 -0
- package/dist/services/handlers.testPrimitive.d.ts +1 -0
- package/dist/services/handlers.testPrimitive.js +5 -0
- package/dist/services/handlers.trace.d.ts +1 -0
- package/dist/services/handlers.trace.js +31 -0
- package/dist/services/handlers.usage.d.ts +1 -0
- package/dist/services/handlers.usage.js +11 -0
- package/dist/services/hotScore.d.ts +137 -0
- package/dist/services/hotScore.js +244 -0
- package/dist/services/indexContext.d.ts +117 -0
- package/dist/services/indexContext.js +968 -0
- package/dist/services/indexLoader.d.ts +44 -0
- package/dist/services/indexLoader.js +921 -0
- package/dist/services/indexRepository.d.ts +32 -0
- package/dist/services/indexRepository.js +71 -0
- package/dist/services/indexingService.d.ts +1 -0
- package/dist/services/indexingService.js +2 -0
- package/dist/services/instructions.dispatcher.d.ts +1 -0
- package/dist/services/instructions.dispatcher.js +231 -0
- package/dist/services/logPrefix.d.ts +1 -0
- package/dist/services/logPrefix.js +30 -0
- package/dist/services/logger.d.ts +52 -0
- package/dist/services/logger.js +268 -0
- package/dist/services/manifestManager.d.ts +82 -0
- package/dist/services/manifestManager.js +200 -0
- package/dist/services/messaging/agentMailbox.d.ts +60 -0
- package/dist/services/messaging/agentMailbox.js +353 -0
- package/dist/services/messaging/messagingPersistence.d.ts +20 -0
- package/dist/services/messaging/messagingPersistence.js +111 -0
- package/dist/services/messaging/messagingTypes.d.ts +150 -0
- package/dist/services/messaging/messagingTypes.js +66 -0
- package/dist/services/ownershipService.d.ts +1 -0
- package/dist/services/ownershipService.js +38 -0
- package/dist/services/performanceBaseline.d.ts +19 -0
- package/dist/services/performanceBaseline.js +210 -0
- package/dist/services/preflight.d.ts +12 -0
- package/dist/services/preflight.js +79 -0
- package/dist/services/promptReviewService.d.ts +44 -0
- package/dist/services/promptReviewService.js +101 -0
- package/dist/services/responseEnvelope.d.ts +6 -0
- package/dist/services/responseEnvelope.js +25 -0
- package/dist/services/seedBootstrap.d.ts +34 -0
- package/dist/services/seedBootstrap.js +427 -0
- package/dist/services/storage/factory.d.ts +17 -0
- package/dist/services/storage/factory.js +35 -0
- package/dist/services/storage/hashUtils.d.ts +11 -0
- package/dist/services/storage/hashUtils.js +35 -0
- package/dist/services/storage/index.d.ts +12 -0
- package/dist/services/storage/index.js +18 -0
- package/dist/services/storage/jsonFileStore.d.ts +32 -0
- package/dist/services/storage/jsonFileStore.js +241 -0
- package/dist/services/storage/migrationEngine.d.ts +35 -0
- package/dist/services/storage/migrationEngine.js +93 -0
- package/dist/services/storage/sqliteMessageStore.d.ts +53 -0
- package/dist/services/storage/sqliteMessageStore.js +146 -0
- package/dist/services/storage/sqliteSchema.d.ts +12 -0
- package/dist/services/storage/sqliteSchema.js +122 -0
- package/dist/services/storage/sqliteStore.d.ts +41 -0
- package/dist/services/storage/sqliteStore.js +339 -0
- package/dist/services/storage/sqliteUsageStore.d.ts +35 -0
- package/dist/services/storage/sqliteUsageStore.js +94 -0
- package/dist/services/storage/types.d.ts +171 -0
- package/dist/services/storage/types.js +12 -0
- package/dist/services/toolHandlers.d.ts +23 -0
- package/dist/services/toolHandlers.js +50 -0
- package/dist/services/toolRegistry.d.ts +20 -0
- package/dist/services/toolRegistry.js +490 -0
- package/dist/services/toolRegistry.zod.d.ts +10 -0
- package/dist/services/toolRegistry.zod.js +323 -0
- package/dist/services/tracing.d.ts +26 -0
- package/dist/services/tracing.js +260 -0
- package/dist/services/usageBuckets.d.ts +161 -0
- package/dist/services/usageBuckets.js +364 -0
- package/dist/services/validationService.d.ts +38 -0
- package/dist/services/validationService.js +125 -0
- package/dist/utils/BufferRing.d.ts +203 -0
- package/dist/utils/BufferRing.js +551 -0
- package/dist/utils/BufferRingExamples.d.ts +55 -0
- package/dist/utils/BufferRingExamples.js +188 -0
- package/dist/utils/envUtils.d.ts +42 -0
- package/dist/utils/envUtils.js +80 -0
- package/dist/utils/memoryMonitor.d.ts +83 -0
- package/dist/utils/memoryMonitor.js +275 -0
- package/dist/versioning/schemaVersion.d.ts +6 -0
- package/dist/versioning/schemaVersion.js +93 -0
- package/package.json +134 -0
- package/schemas/README.md +13 -0
- package/schemas/feedback-entry.schema.json +27 -0
- package/schemas/graph-export-v2.schema.json +60 -0
- package/schemas/index-server.code-schema.json +38477 -0
- package/schemas/instruction.schema.json +262 -0
- package/schemas/json-schema/SessionPersistence-persisted-admin-session.schema.json +54 -0
- package/schemas/json-schema/SessionPersistence-persisted-session-history-entry.schema.json +51 -0
- package/schemas/json-schema/SessionPersistence-persisted-web-socket-connection.schema.json +54 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-config.schema.json +110 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-data.schema.json +229 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-manifest.schema.json +109 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-metadata.schema.json +55 -0
- package/schemas/json-schema/instruction-audience-scope.schema.json +14 -0
- package/schemas/json-schema/instruction-content-type.schema.json +17 -0
- package/schemas/json-schema/instruction-instruction-entry.schema.json +206 -0
- package/schemas/json-schema/instruction-requirement-level.schema.json +16 -0
- package/schemas/manifest.json +78 -0
- package/schemas/manifest.schema.json +33 -0
- package/schemas/usage-batch.schema.json +16 -0
- package/schemas/usage-buckets.schema.json +30 -0
- package/schemas/usage-event.schema.json +17 -0
- package/scripts/copy-dashboard-assets.mjs +170 -0
- package/scripts/setup-hooks.cjs +28 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin Panel Routes
|
|
3
|
+
* Routes: GET /admin/config, GET /admin/flags, POST /admin/config,
|
|
4
|
+
* GET /admin/sessions, POST /admin/sessions, DELETE /admin/sessions/:sessionId,
|
|
5
|
+
* GET /admin/connections, GET /admin/sessions/history,
|
|
6
|
+
* GET /admin/maintenance, POST /admin/maintenance/mode,
|
|
7
|
+
* POST /admin/maintenance/normalize, POST /admin/maintenance/backup,
|
|
8
|
+
* GET /admin/maintenance/backups, POST /admin/maintenance/restore,
|
|
9
|
+
* DELETE /admin/maintenance/backup/:id, POST /admin/maintenance/backups/prune,
|
|
10
|
+
* GET /admin/maintenance/backup/:id/export, POST /admin/maintenance/backup/import,
|
|
11
|
+
* GET /admin/stats, POST /admin/restart, POST /admin/cache/clear,
|
|
12
|
+
* POST /admin/clear-metrics
|
|
13
|
+
*/
|
|
14
|
+
import { Router } from 'express';
|
|
15
|
+
import { MetricsCollector } from '../MetricsCollector.js';
|
|
16
|
+
export declare function createAdminRoutes(metricsCollector: MetricsCollector): Router;
|
|
@@ -0,0 +1,596 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Admin Panel Routes
|
|
4
|
+
* Routes: GET /admin/config, GET /admin/flags, POST /admin/config,
|
|
5
|
+
* GET /admin/sessions, POST /admin/sessions, DELETE /admin/sessions/:sessionId,
|
|
6
|
+
* GET /admin/connections, GET /admin/sessions/history,
|
|
7
|
+
* GET /admin/maintenance, POST /admin/maintenance/mode,
|
|
8
|
+
* POST /admin/maintenance/normalize, POST /admin/maintenance/backup,
|
|
9
|
+
* GET /admin/maintenance/backups, POST /admin/maintenance/restore,
|
|
10
|
+
* DELETE /admin/maintenance/backup/:id, POST /admin/maintenance/backups/prune,
|
|
11
|
+
* GET /admin/maintenance/backup/:id/export, POST /admin/maintenance/backup/import,
|
|
12
|
+
* GET /admin/stats, POST /admin/restart, POST /admin/cache/clear,
|
|
13
|
+
* POST /admin/clear-metrics
|
|
14
|
+
*/
|
|
15
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
16
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.createAdminRoutes = createAdminRoutes;
|
|
20
|
+
const fs_1 = __importDefault(require("fs"));
|
|
21
|
+
const express_1 = require("express");
|
|
22
|
+
const AdminPanel_js_1 = require("../AdminPanel.js");
|
|
23
|
+
const WebSocketManager_js_1 = require("../WebSocketManager.js");
|
|
24
|
+
const featureFlags_js_1 = require("../../../services/featureFlags.js");
|
|
25
|
+
const handlers_dashboardConfig_js_1 = require("../../../services/handlers.dashboardConfig.js");
|
|
26
|
+
const registry_js_1 = require("../../../server/registry.js");
|
|
27
|
+
const runtimeConfig_js_1 = require("../../../config/runtimeConfig.js");
|
|
28
|
+
function createAdminRoutes(metricsCollector) {
|
|
29
|
+
const router = (0, express_1.Router)();
|
|
30
|
+
const adminPanel = (0, AdminPanel_js_1.getAdminPanel)();
|
|
31
|
+
// Admin authentication middleware (Issue #30 fix)
|
|
32
|
+
// Dashboard is localhost-only; require API key via INDEX_SERVER_ADMIN_API_KEY env var when set
|
|
33
|
+
router.use((req, res, next) => {
|
|
34
|
+
const adminKey = (0, runtimeConfig_js_1.getRuntimeConfig)().dashboard.http.adminApiKey;
|
|
35
|
+
// If no key configured, allow localhost-only access (backward compatible)
|
|
36
|
+
if (!adminKey) {
|
|
37
|
+
const host = req.hostname || req.ip;
|
|
38
|
+
if (host === 'localhost' || host === '127.0.0.1' || host === '::1') {
|
|
39
|
+
return next();
|
|
40
|
+
}
|
|
41
|
+
res.status(403).json({ error: 'Admin access restricted to localhost' });
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// Validate API key from Authorization header only (query params leak in logs/history)
|
|
45
|
+
const provided = req.headers.authorization?.replace(/^Bearer\s+/i, '');
|
|
46
|
+
if (provided === adminKey) {
|
|
47
|
+
return next();
|
|
48
|
+
}
|
|
49
|
+
res.status(401).json({ error: 'Admin API key required. Set INDEX_SERVER_ADMIN_API_KEY and pass via Authorization: Bearer <key>' });
|
|
50
|
+
});
|
|
51
|
+
/**
|
|
52
|
+
* GET /api/admin/config - Get admin configuration
|
|
53
|
+
*/
|
|
54
|
+
router.get('/admin/config', (_req, res) => {
|
|
55
|
+
try {
|
|
56
|
+
const config = adminPanel.getAdminConfig();
|
|
57
|
+
// Surface feature flags (environment + file) for visibility
|
|
58
|
+
let featureFlags = {};
|
|
59
|
+
try {
|
|
60
|
+
featureFlags = (0, featureFlags_js_1.dumpFlags)();
|
|
61
|
+
}
|
|
62
|
+
catch { /* ignore */ }
|
|
63
|
+
// Include full registry snapshot for UI (so dashboard shows ALL flags, not just active)
|
|
64
|
+
let allFlags = [];
|
|
65
|
+
try {
|
|
66
|
+
allFlags = (0, handlers_dashboardConfig_js_1.getFlagRegistrySnapshot)();
|
|
67
|
+
}
|
|
68
|
+
catch { /* ignore */ }
|
|
69
|
+
res.json({
|
|
70
|
+
success: true,
|
|
71
|
+
config,
|
|
72
|
+
featureFlags, // currently configured / resolved flags
|
|
73
|
+
allFlags, // full registry with metadata + parsed values
|
|
74
|
+
timestamp: Date.now()
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.error('[API] Get admin config error:', error);
|
|
79
|
+
res.status(500).json({
|
|
80
|
+
success: false,
|
|
81
|
+
error: 'Failed to get admin configuration',
|
|
82
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// Lightweight flags-only endpoint so the UI can retry if /admin/config was served from an older cache.
|
|
87
|
+
router.get('/admin/flags', (_req, res) => {
|
|
88
|
+
try {
|
|
89
|
+
let featureFlags = {};
|
|
90
|
+
try {
|
|
91
|
+
featureFlags = (0, featureFlags_js_1.dumpFlags)();
|
|
92
|
+
}
|
|
93
|
+
catch { /* ignore */ }
|
|
94
|
+
let allFlags = [];
|
|
95
|
+
try {
|
|
96
|
+
allFlags = (0, handlers_dashboardConfig_js_1.getFlagRegistrySnapshot)();
|
|
97
|
+
}
|
|
98
|
+
catch { /* ignore */ }
|
|
99
|
+
res.json({ success: true, featureFlags, allFlags, total: allFlags.length, timestamp: Date.now() });
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
res.status(500).json({ success: false, error: 'Failed to get flags snapshot', message: error instanceof Error ? error.message : 'Unknown error' });
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
/**
|
|
106
|
+
* POST /api/admin/config - Update admin configuration
|
|
107
|
+
*/
|
|
108
|
+
router.post('/admin/config', (req, res) => {
|
|
109
|
+
try {
|
|
110
|
+
const updates = req.body;
|
|
111
|
+
const result = adminPanel.updateAdminConfig(updates);
|
|
112
|
+
// Feature flag persistence (optional field featureFlags { name:boolean })
|
|
113
|
+
if (updates.featureFlags && typeof updates.featureFlags === 'object') {
|
|
114
|
+
try {
|
|
115
|
+
(0, featureFlags_js_1.updateFlags)(updates.featureFlags);
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
console.warn('[API] feature flag update failed:', e instanceof Error ? e.message : e);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (result.success) {
|
|
122
|
+
res.json({
|
|
123
|
+
success: true,
|
|
124
|
+
message: result.message,
|
|
125
|
+
timestamp: Date.now()
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
res.status(400).json({
|
|
130
|
+
success: false,
|
|
131
|
+
error: result.message,
|
|
132
|
+
timestamp: Date.now()
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
console.error('[API] Update admin config error:', error);
|
|
138
|
+
res.status(500).json({
|
|
139
|
+
success: false,
|
|
140
|
+
error: 'Failed to update admin configuration',
|
|
141
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
/**
|
|
146
|
+
* GET /api/admin/sessions - Get active admin sessions
|
|
147
|
+
*/
|
|
148
|
+
router.get('/admin/sessions', (_req, res) => {
|
|
149
|
+
try {
|
|
150
|
+
const sessions = adminPanel.getActiveSessions();
|
|
151
|
+
res.json({
|
|
152
|
+
success: true,
|
|
153
|
+
sessions,
|
|
154
|
+
count: sessions.length,
|
|
155
|
+
timestamp: Date.now()
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.error('[API] Get admin sessions error:', error);
|
|
160
|
+
res.status(500).json({
|
|
161
|
+
success: false,
|
|
162
|
+
error: 'Failed to get admin sessions',
|
|
163
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
/**
|
|
168
|
+
* GET /api/admin/connections - Get active websocket connections (Phase 4.1 enhancement)
|
|
169
|
+
*/
|
|
170
|
+
router.get('/admin/connections', (_req, res) => {
|
|
171
|
+
try {
|
|
172
|
+
const wsMgr = (0, WebSocketManager_js_1.getWebSocketManager)();
|
|
173
|
+
const connections = wsMgr.getActiveConnectionSummaries();
|
|
174
|
+
res.json({
|
|
175
|
+
success: true,
|
|
176
|
+
connections: connections.sort((a, b) => a.connectedAt - b.connectedAt),
|
|
177
|
+
count: connections.length,
|
|
178
|
+
timestamp: Date.now()
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
console.error('[API] Get active connections error:', error);
|
|
183
|
+
res.status(500).json({ success: false, error: 'Failed to get active connections' });
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
/**
|
|
187
|
+
* POST /api/admin/sessions - Create new admin session
|
|
188
|
+
*/
|
|
189
|
+
router.post('/admin/sessions', (req, res) => {
|
|
190
|
+
try {
|
|
191
|
+
const { userId } = req.body;
|
|
192
|
+
const ipAddress = req.ip || req.connection.remoteAddress || 'unknown';
|
|
193
|
+
const userAgent = req.get('User-Agent') || 'unknown';
|
|
194
|
+
const session = adminPanel.createAdminSession(userId, ipAddress, userAgent);
|
|
195
|
+
res.json({
|
|
196
|
+
success: true,
|
|
197
|
+
session,
|
|
198
|
+
message: 'Admin session created successfully',
|
|
199
|
+
timestamp: Date.now()
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
console.error('[API] Create admin session error:', error);
|
|
204
|
+
res.status(500).json({
|
|
205
|
+
success: false,
|
|
206
|
+
error: 'Failed to create admin session',
|
|
207
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
/**
|
|
212
|
+
* DELETE /api/admin/sessions/:sessionId - Terminate admin session
|
|
213
|
+
*/
|
|
214
|
+
router.delete('/admin/sessions/:sessionId', (req, res) => {
|
|
215
|
+
try {
|
|
216
|
+
const { sessionId } = req.params;
|
|
217
|
+
const terminated = adminPanel.terminateSession(sessionId);
|
|
218
|
+
if (terminated) {
|
|
219
|
+
res.json({
|
|
220
|
+
success: true,
|
|
221
|
+
message: 'Admin session terminated successfully',
|
|
222
|
+
timestamp: Date.now()
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
res.status(404).json({
|
|
227
|
+
success: false,
|
|
228
|
+
error: 'Session not found',
|
|
229
|
+
timestamp: Date.now()
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
console.error('[API] Terminate admin session error:', error);
|
|
235
|
+
res.status(500).json({
|
|
236
|
+
success: false,
|
|
237
|
+
error: 'Failed to terminate admin session',
|
|
238
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
/**
|
|
243
|
+
* GET /api/admin/maintenance - Get maintenance information
|
|
244
|
+
*/
|
|
245
|
+
router.get('/admin/maintenance', (_req, res) => {
|
|
246
|
+
try {
|
|
247
|
+
const maintenance = adminPanel.getMaintenanceInfo();
|
|
248
|
+
res.json({
|
|
249
|
+
success: true,
|
|
250
|
+
maintenance,
|
|
251
|
+
timestamp: Date.now()
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
console.error('[API] Get maintenance info error:', error);
|
|
256
|
+
res.status(500).json({
|
|
257
|
+
success: false,
|
|
258
|
+
error: 'Failed to get maintenance information',
|
|
259
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
/**
|
|
264
|
+
* POST /api/admin/maintenance/mode - Set maintenance mode
|
|
265
|
+
*/
|
|
266
|
+
router.post('/admin/maintenance/mode', (req, res) => {
|
|
267
|
+
try {
|
|
268
|
+
const { enabled, message } = req.body;
|
|
269
|
+
const result = adminPanel.setMaintenanceMode(enabled, message);
|
|
270
|
+
if (result.success) {
|
|
271
|
+
res.json({
|
|
272
|
+
success: true,
|
|
273
|
+
message: result.message,
|
|
274
|
+
timestamp: Date.now()
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
res.status(400).json({
|
|
279
|
+
success: false,
|
|
280
|
+
error: result.message,
|
|
281
|
+
timestamp: Date.now()
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
console.error('[API] Set maintenance mode error:', error);
|
|
287
|
+
res.status(500).json({
|
|
288
|
+
success: false,
|
|
289
|
+
error: 'Failed to set maintenance mode',
|
|
290
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
/**
|
|
295
|
+
* POST /api/admin/maintenance/normalize - Normalize instruction index
|
|
296
|
+
* (FIX: extracted from /status handler where it was accidentally nested)
|
|
297
|
+
*/
|
|
298
|
+
router.post('/admin/maintenance/normalize', async (req, res) => {
|
|
299
|
+
try {
|
|
300
|
+
const { dryRun, forceCanonical } = req.body || {};
|
|
301
|
+
// We call the handler directly (registered via handlers.instructions) ensuring mutation flag is respected.
|
|
302
|
+
const handler = (0, registry_js_1.getLocalHandler)('index_normalize');
|
|
303
|
+
if (!handler) {
|
|
304
|
+
return res.status(503).json({ success: false, error: 'normalize_tool_unavailable' });
|
|
305
|
+
}
|
|
306
|
+
const started = Date.now();
|
|
307
|
+
const summary = await Promise.resolve(handler({ dryRun: !!dryRun, forceCanonical: !!forceCanonical }));
|
|
308
|
+
const durationMs = Date.now() - started;
|
|
309
|
+
res.json({ success: true, durationMs, dryRun: !!dryRun, forceCanonical: !!forceCanonical, summary });
|
|
310
|
+
}
|
|
311
|
+
catch (err) {
|
|
312
|
+
res.status(500).json({ success: false, error: 'normalize_failed', message: err instanceof Error ? err.message : String(err) });
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
/**
|
|
316
|
+
* POST /api/admin/maintenance/backup - Perform system backup
|
|
317
|
+
*/
|
|
318
|
+
router.post('/admin/maintenance/backup', async (_req, res) => {
|
|
319
|
+
try {
|
|
320
|
+
const result = await adminPanel.performBackup();
|
|
321
|
+
if (result.success) {
|
|
322
|
+
res.json({
|
|
323
|
+
success: true,
|
|
324
|
+
message: result.message,
|
|
325
|
+
backupId: result.backupId,
|
|
326
|
+
timestamp: Date.now()
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
res.status(500).json({
|
|
331
|
+
success: false,
|
|
332
|
+
error: result.message,
|
|
333
|
+
timestamp: Date.now()
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
console.error('[API] Perform backup error:', error);
|
|
339
|
+
res.status(500).json({
|
|
340
|
+
success: false,
|
|
341
|
+
error: 'Failed to perform backup',
|
|
342
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
/**
|
|
347
|
+
* GET /api/admin/maintenance/backups - List available backups
|
|
348
|
+
*/
|
|
349
|
+
router.get('/admin/maintenance/backups', (_req, res) => {
|
|
350
|
+
try {
|
|
351
|
+
const backups = adminPanel.listBackups();
|
|
352
|
+
res.json({ success: true, backups, count: backups.length, timestamp: Date.now() });
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
console.error('[API] List backups error:', error);
|
|
356
|
+
res.status(500).json({ success: false, error: 'Failed to list backups', message: error instanceof Error ? error.message : 'Unknown error' });
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
/**
|
|
360
|
+
* POST /api/admin/maintenance/restore - Restore a backup
|
|
361
|
+
* body: { backupId: string }
|
|
362
|
+
*/
|
|
363
|
+
router.post('/admin/maintenance/restore', (req, res) => {
|
|
364
|
+
try {
|
|
365
|
+
const { backupId } = req.body || {};
|
|
366
|
+
const result = adminPanel.restoreBackup(backupId);
|
|
367
|
+
if (result.success) {
|
|
368
|
+
res.json({ success: true, message: result.message, restored: result.restored, timestamp: Date.now() });
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
res.status(400).json({ success: false, error: result.message, timestamp: Date.now() });
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
catch (error) {
|
|
375
|
+
console.error('[API] Restore backup error:', error);
|
|
376
|
+
res.status(500).json({ success: false, error: 'Failed to restore backup', message: error instanceof Error ? error.message : 'Unknown error' });
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
/**
|
|
380
|
+
* DELETE /api/admin/maintenance/backup/:id - Delete a specific backup directory
|
|
381
|
+
*/
|
|
382
|
+
router.delete('/admin/maintenance/backup/:id', (req, res) => {
|
|
383
|
+
try {
|
|
384
|
+
const { id } = req.params;
|
|
385
|
+
const result = adminPanel.deleteBackup(id);
|
|
386
|
+
if (result.success) {
|
|
387
|
+
res.json({ success: true, message: result.message, removed: result.removed, timestamp: Date.now() });
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
res.status(400).json({ success: false, error: result.message, timestamp: Date.now() });
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
catch (error) {
|
|
394
|
+
console.error('[API] Delete backup error:', error);
|
|
395
|
+
res.status(500).json({ success: false, error: 'Failed to delete backup', message: error instanceof Error ? error.message : 'Unknown error' });
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
/**
|
|
399
|
+
* POST /api/admin/maintenance/backups/prune { retain:number } - retain newest N (0 = delete all)
|
|
400
|
+
*/
|
|
401
|
+
router.post('/admin/maintenance/backups/prune', (req, res) => {
|
|
402
|
+
try {
|
|
403
|
+
const retain = typeof req.body?.retain === 'number' ? req.body.retain : 10;
|
|
404
|
+
const result = adminPanel.pruneBackups(retain);
|
|
405
|
+
if (result.success) {
|
|
406
|
+
res.json({ success: true, message: result.message, pruned: result.pruned, timestamp: Date.now() });
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
res.status(400).json({ success: false, error: result.message, timestamp: Date.now() });
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
catch (error) {
|
|
413
|
+
console.error('[API] Prune backups error:', error);
|
|
414
|
+
res.status(500).json({ success: false, error: 'Failed to prune backups', message: error instanceof Error ? error.message : 'Unknown error' });
|
|
415
|
+
}
|
|
416
|
+
});
|
|
417
|
+
/**
|
|
418
|
+
* GET /api/admin/maintenance/backup/:id/export - Export backup as downloadable zip or JSON bundle
|
|
419
|
+
*/
|
|
420
|
+
router.get('/admin/maintenance/backup/:id/export', (req, res) => {
|
|
421
|
+
try {
|
|
422
|
+
const { id } = req.params;
|
|
423
|
+
const result = adminPanel.exportBackup(id);
|
|
424
|
+
if (result.success && result.zipPath) {
|
|
425
|
+
res.setHeader('Content-Type', 'application/zip');
|
|
426
|
+
res.setHeader('Content-Disposition', `attachment; filename="${id}.zip"`);
|
|
427
|
+
const stream = fs_1.default.createReadStream(result.zipPath);
|
|
428
|
+
stream.pipe(res);
|
|
429
|
+
}
|
|
430
|
+
else if (result.success && result.bundle) {
|
|
431
|
+
// Legacy directory backup — serve as JSON
|
|
432
|
+
res.setHeader('Content-Type', 'application/json');
|
|
433
|
+
res.setHeader('Content-Disposition', `attachment; filename="${id}.json"`);
|
|
434
|
+
res.json(result.bundle);
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
res.status(400).json({ success: false, error: result.message, timestamp: Date.now() });
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
catch (error) {
|
|
441
|
+
console.error('[API] Export backup error:', error);
|
|
442
|
+
res.status(500).json({ success: false, error: 'Failed to export backup', message: error instanceof Error ? error.message : 'Unknown error' });
|
|
443
|
+
}
|
|
444
|
+
});
|
|
445
|
+
/**
|
|
446
|
+
* POST /api/admin/maintenance/backup/import - Import backup from uploaded JSON bundle
|
|
447
|
+
* body: { manifest?: object, files: { [filename]: content } }
|
|
448
|
+
*/
|
|
449
|
+
router.post('/admin/maintenance/backup/import', (req, res) => {
|
|
450
|
+
try {
|
|
451
|
+
const bundle = req.body;
|
|
452
|
+
if (!bundle || typeof bundle !== 'object' || !bundle.files) {
|
|
453
|
+
return res.status(400).json({ success: false, error: 'Request body must contain a "files" object', timestamp: Date.now() });
|
|
454
|
+
}
|
|
455
|
+
const result = adminPanel.importBackup(bundle);
|
|
456
|
+
if (result.success) {
|
|
457
|
+
res.json({ success: true, message: result.message, backupId: result.backupId, files: result.files, timestamp: Date.now() });
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
res.status(400).json({ success: false, error: result.message, timestamp: Date.now() });
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
catch (error) {
|
|
464
|
+
console.error('[API] Import backup error:', error);
|
|
465
|
+
res.status(500).json({ success: false, error: 'Failed to import backup', message: error instanceof Error ? error.message : 'Unknown error' });
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
/**
|
|
469
|
+
* GET /api/admin/stats - Get comprehensive admin statistics
|
|
470
|
+
*/
|
|
471
|
+
router.get('/admin/stats', (_req, res) => {
|
|
472
|
+
try {
|
|
473
|
+
const stats = adminPanel.getAdminStats();
|
|
474
|
+
res.json({
|
|
475
|
+
success: true,
|
|
476
|
+
stats,
|
|
477
|
+
timestamp: Date.now()
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
catch (error) {
|
|
481
|
+
console.error('[API] Get admin stats error:', error);
|
|
482
|
+
res.status(500).json({
|
|
483
|
+
success: false,
|
|
484
|
+
error: 'Failed to get admin statistics',
|
|
485
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
});
|
|
489
|
+
/**
|
|
490
|
+
* GET /api/admin/sessions/history - Historical admin sessions (bounded)
|
|
491
|
+
*/
|
|
492
|
+
router.get('/admin/sessions/history', (req, res) => {
|
|
493
|
+
try {
|
|
494
|
+
const limitParam = req.query.limit;
|
|
495
|
+
const limit = limitParam ? parseInt(limitParam, 10) : undefined;
|
|
496
|
+
const history = adminPanel.getSessionHistory(limit);
|
|
497
|
+
res.json({
|
|
498
|
+
success: true,
|
|
499
|
+
history,
|
|
500
|
+
count: history.length,
|
|
501
|
+
timestamp: Date.now()
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
catch (error) {
|
|
505
|
+
console.error('[API] Get session history error:', error);
|
|
506
|
+
res.status(500).json({
|
|
507
|
+
success: false,
|
|
508
|
+
error: 'Failed to get session history',
|
|
509
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
});
|
|
513
|
+
/**
|
|
514
|
+
* POST /api/admin/restart - Restart server components
|
|
515
|
+
*/
|
|
516
|
+
router.post('/admin/restart', async (req, res) => {
|
|
517
|
+
try {
|
|
518
|
+
const { component = 'all' } = req.body;
|
|
519
|
+
const result = await adminPanel.restartServer(component);
|
|
520
|
+
if (result.success) {
|
|
521
|
+
res.json({
|
|
522
|
+
success: true,
|
|
523
|
+
message: result.message,
|
|
524
|
+
timestamp: Date.now()
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
else {
|
|
528
|
+
res.status(500).json({
|
|
529
|
+
success: false,
|
|
530
|
+
error: result.message,
|
|
531
|
+
timestamp: Date.now()
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
catch (error) {
|
|
536
|
+
console.error('[API] Restart server error:', error);
|
|
537
|
+
res.status(500).json({
|
|
538
|
+
success: false,
|
|
539
|
+
error: 'Failed to restart server',
|
|
540
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
541
|
+
});
|
|
542
|
+
}
|
|
543
|
+
});
|
|
544
|
+
/**
|
|
545
|
+
* POST /api/admin/cache/clear - Clear server caches
|
|
546
|
+
*/
|
|
547
|
+
router.post('/admin/cache/clear', (_req, res) => {
|
|
548
|
+
try {
|
|
549
|
+
const result = adminPanel.clearCaches();
|
|
550
|
+
if (result.success) {
|
|
551
|
+
res.json({
|
|
552
|
+
success: true,
|
|
553
|
+
message: result.message,
|
|
554
|
+
cleared: result.cleared,
|
|
555
|
+
timestamp: Date.now()
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
else {
|
|
559
|
+
res.status(500).json({
|
|
560
|
+
success: false,
|
|
561
|
+
error: result.message,
|
|
562
|
+
timestamp: Date.now()
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
catch (error) {
|
|
567
|
+
console.error('[API] Clear caches error:', error);
|
|
568
|
+
res.status(500).json({
|
|
569
|
+
success: false,
|
|
570
|
+
error: 'Failed to clear caches',
|
|
571
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
572
|
+
});
|
|
573
|
+
}
|
|
574
|
+
});
|
|
575
|
+
/**
|
|
576
|
+
* POST /api/admin/clear-metrics - Clear all metrics data (admin only)
|
|
577
|
+
*/
|
|
578
|
+
router.post('/admin/clear-metrics', (_req, res) => {
|
|
579
|
+
try {
|
|
580
|
+
metricsCollector.clearMetrics();
|
|
581
|
+
res.json({
|
|
582
|
+
success: true,
|
|
583
|
+
message: 'Metrics cleared successfully',
|
|
584
|
+
timestamp: Date.now(),
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
catch (error) {
|
|
588
|
+
console.error('[API] Clear metrics error:', error);
|
|
589
|
+
res.status(500).json({
|
|
590
|
+
error: 'Failed to clear metrics',
|
|
591
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
});
|
|
595
|
+
return router;
|
|
596
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alerts Routes
|
|
3
|
+
* Routes: GET /alerts/active, POST /alerts/:id/resolve, POST /alerts/generate
|
|
4
|
+
*/
|
|
5
|
+
import { Router } from 'express';
|
|
6
|
+
import { MetricsCollector } from '../MetricsCollector.js';
|
|
7
|
+
export declare function createAlertsRoutes(metricsCollector: MetricsCollector): Router;
|