@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,280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Graph Routes
|
|
4
|
+
* Routes: GET /graph/mermaid, GET /graph/categories, GET /graph/instructions, GET /graph/relations
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.createGraphRoutes = createGraphRoutes;
|
|
8
|
+
const express_1 = require("express");
|
|
9
|
+
const handlers_graph_js_1 = require("../../../services/handlers.graph.js");
|
|
10
|
+
const indexContext_js_1 = require("../../../services/indexContext.js");
|
|
11
|
+
const runtimeConfig_js_1 = require("../../../config/runtimeConfig.js");
|
|
12
|
+
function createGraphRoutes() {
|
|
13
|
+
const router = (0, express_1.Router)();
|
|
14
|
+
/**
|
|
15
|
+
* GET /api/graph/mermaid - Returns mermaid representation of the instruction graph.
|
|
16
|
+
* Query params:
|
|
17
|
+
* enrich=1 -> include enriched schema (v2) data generation path
|
|
18
|
+
* categories=1 -> include explicit category nodes
|
|
19
|
+
* usage=1 -> include usageCount when available
|
|
20
|
+
* edgeTypes=a,b -> restrict edge types (comma separated)
|
|
21
|
+
*/
|
|
22
|
+
router.get('/graph/mermaid', (req, res) => {
|
|
23
|
+
try {
|
|
24
|
+
const { enrich, categories, usage, edgeTypes, selectedCategories, selectedIds } = req.query;
|
|
25
|
+
const includeEdgeTypes = edgeTypes ? edgeTypes.split(',').filter(Boolean) : undefined;
|
|
26
|
+
const t0 = Date.now();
|
|
27
|
+
try {
|
|
28
|
+
// eslint-disable-next-line no-console
|
|
29
|
+
console.debug('[graph/mermaid][start]', `enrich=${enrich}`, `categories=${categories}`, `usage=${usage}`, `edgeTypes=${edgeTypes || ''}`, `selCats=${selectedCategories || ''}`, `selIds=${selectedIds || ''}`);
|
|
30
|
+
}
|
|
31
|
+
catch { /* ignore diag logging errors */ }
|
|
32
|
+
const graph = (0, handlers_graph_js_1.buildGraph)({
|
|
33
|
+
enrich: enrich === '1' || enrich === 'true',
|
|
34
|
+
includeCategoryNodes: categories === '1' || categories === 'true',
|
|
35
|
+
includeUsage: usage === '1' || usage === 'true',
|
|
36
|
+
includeEdgeTypes,
|
|
37
|
+
format: 'mermaid'
|
|
38
|
+
});
|
|
39
|
+
if (!graph.mermaid) {
|
|
40
|
+
return res.status(500).json({ success: false, error: 'failed_to_generate_mermaid' });
|
|
41
|
+
}
|
|
42
|
+
let mermaidSource = graph.mermaid;
|
|
43
|
+
const catFilter = selectedCategories?.split(',').filter(Boolean) || [];
|
|
44
|
+
const idFilter = selectedIds?.split(',').filter(Boolean) || [];
|
|
45
|
+
let filteredNodeCount;
|
|
46
|
+
let filteredEdgeCount;
|
|
47
|
+
let scoped = false;
|
|
48
|
+
let keptIdsSize = 0;
|
|
49
|
+
if ((catFilter.length || idFilter.length) && mermaidSource) {
|
|
50
|
+
try {
|
|
51
|
+
const keepIds = new Set();
|
|
52
|
+
for (const id of idFilter)
|
|
53
|
+
keepIds.add(id);
|
|
54
|
+
const wantCategoryNodes = (categories === '1' || categories === 'true');
|
|
55
|
+
if (catFilter.length) {
|
|
56
|
+
const catSet = new Set(catFilter.map(c => c.toLowerCase()));
|
|
57
|
+
if (wantCategoryNodes) {
|
|
58
|
+
for (const c of catFilter) {
|
|
59
|
+
keepIds.add(`category:${c}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (graph.meta.graphSchemaVersion === 2) {
|
|
63
|
+
for (const nodeRaw of graph.nodes) {
|
|
64
|
+
const nodeCats = nodeRaw.categories;
|
|
65
|
+
if (Array.isArray(nodeCats) && nodeCats.some(c => catSet.has(c.toLowerCase()))) {
|
|
66
|
+
keepIds.add(nodeRaw.id);
|
|
67
|
+
if (wantCategoryNodes) {
|
|
68
|
+
for (const c of nodeCats) {
|
|
69
|
+
if (catSet.has(c.toLowerCase()))
|
|
70
|
+
keepIds.add(`category:${c}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (keepIds.size) {
|
|
78
|
+
let frontmatterBlock = '';
|
|
79
|
+
let remainder = mermaidSource;
|
|
80
|
+
if (remainder.startsWith('---\n')) {
|
|
81
|
+
const fmMatch = /^---\n[\s\S]*?\n---\n/.exec(remainder);
|
|
82
|
+
if (fmMatch) {
|
|
83
|
+
frontmatterBlock = fmMatch[0];
|
|
84
|
+
remainder = remainder.slice(fmMatch[0].length);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const lines = remainder.split(/\r?\n/);
|
|
88
|
+
const directiveIdx = lines.findIndex(l => /^\s*(flowchart|graph)\b/i.test(l));
|
|
89
|
+
let directiveLine = '';
|
|
90
|
+
if (directiveIdx >= 0) {
|
|
91
|
+
directiveLine = lines[directiveIdx];
|
|
92
|
+
}
|
|
93
|
+
const nodeIdPattern = Array.from(keepIds).map(id => id.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')).join('|');
|
|
94
|
+
const nodeRegex = new RegExp(`^(\\s*)(${nodeIdPattern})\\[`);
|
|
95
|
+
const edgeRegex = new RegExp(`^(.*)(${nodeIdPattern})(.*)(${nodeIdPattern})(.*)$`);
|
|
96
|
+
const filtered = [];
|
|
97
|
+
const styleRegexes = [
|
|
98
|
+
/^\s*classDef\s+/i,
|
|
99
|
+
/^\s*style\s+[A-Za-z0-9:_-]+\s+/i,
|
|
100
|
+
/^\s*class\s+[A-Za-z0-9:_-]+\s+/i,
|
|
101
|
+
/^\s*linkStyle\s+\d+/i
|
|
102
|
+
];
|
|
103
|
+
for (const ln of lines) {
|
|
104
|
+
if (!ln)
|
|
105
|
+
continue;
|
|
106
|
+
if (directiveLine && ln === directiveLine) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const trimmed = ln.trim();
|
|
110
|
+
if (trimmed.startsWith('%%')) {
|
|
111
|
+
filtered.push(ln);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (styleRegexes.some(r => r.test(trimmed))) {
|
|
115
|
+
filtered.push(ln);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (nodeRegex.test(ln) || edgeRegex.test(ln))
|
|
119
|
+
filtered.push(ln);
|
|
120
|
+
}
|
|
121
|
+
const parts = [];
|
|
122
|
+
if (frontmatterBlock)
|
|
123
|
+
parts.push(frontmatterBlock.trimEnd());
|
|
124
|
+
if (directiveLine)
|
|
125
|
+
parts.push(directiveLine);
|
|
126
|
+
parts.push(...filtered);
|
|
127
|
+
mermaidSource = parts.join('\n');
|
|
128
|
+
if ((0, runtimeConfig_js_1.getRuntimeConfig)().logging.verbose) {
|
|
129
|
+
// eslint-disable-next-line no-console
|
|
130
|
+
console.debug('[graph/mermaid][filter:new]', { selectedIds: idFilter.length, selectedCategories: catFilter.length, kept: keepIds.size, totalLines: lines.length, emittedLines: parts.length });
|
|
131
|
+
}
|
|
132
|
+
keptIdsSize = keepIds.size;
|
|
133
|
+
scoped = true;
|
|
134
|
+
try {
|
|
135
|
+
const nodeLineRegex = /^(\s*)([A-Za-z0-9:_-]+)\[[^\]]*\]/;
|
|
136
|
+
const edgeLineRegex = /-->|===|~~>|\|-/;
|
|
137
|
+
let n = 0, eCnt = 0;
|
|
138
|
+
for (const ln of filtered) {
|
|
139
|
+
if (nodeLineRegex.test(ln))
|
|
140
|
+
n++;
|
|
141
|
+
else if (edgeLineRegex.test(ln))
|
|
142
|
+
eCnt++;
|
|
143
|
+
}
|
|
144
|
+
filteredNodeCount = n;
|
|
145
|
+
filteredEdgeCount = eCnt;
|
|
146
|
+
}
|
|
147
|
+
catch { /* ignore count derivation errors */ }
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (filterErr) {
|
|
151
|
+
console.warn('[graph/mermaid][filter-failed]', filterErr);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
// eslint-disable-next-line no-console
|
|
156
|
+
console.debug('[graph/mermaid][ok]', { ms: Date.now() - t0, nodes: graph.meta?.nodeCount, edges: graph.meta?.edgeCount, bytes: mermaidSource.length });
|
|
157
|
+
}
|
|
158
|
+
catch { /* ignore diag logging errors */ }
|
|
159
|
+
let metaOut = graph.meta;
|
|
160
|
+
if (scoped && graph.meta) {
|
|
161
|
+
try {
|
|
162
|
+
const base = { ...graph.meta };
|
|
163
|
+
const augmented = base;
|
|
164
|
+
if (typeof filteredNodeCount === 'number')
|
|
165
|
+
augmented.nodeCount = filteredNodeCount;
|
|
166
|
+
if (typeof filteredEdgeCount === 'number')
|
|
167
|
+
augmented.edgeCount = filteredEdgeCount;
|
|
168
|
+
augmented.scoped = true;
|
|
169
|
+
augmented.keptIds = keptIdsSize;
|
|
170
|
+
metaOut = augmented;
|
|
171
|
+
}
|
|
172
|
+
catch { /* ignore meta cloning issues */ }
|
|
173
|
+
}
|
|
174
|
+
res.json({ success: true, meta: metaOut, mermaid: mermaidSource });
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
const e = err;
|
|
178
|
+
try {
|
|
179
|
+
// eslint-disable-next-line no-console
|
|
180
|
+
console.warn('[graph/mermaid][error]', e.message);
|
|
181
|
+
}
|
|
182
|
+
catch { /* ignore diag logging errors */ }
|
|
183
|
+
res.status(500).json({ success: false, error: String(e.message || e) });
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
/**
|
|
187
|
+
* GET /api/graph/categories
|
|
188
|
+
* Returns list of unique categories with instruction counts.
|
|
189
|
+
*/
|
|
190
|
+
router.get('/graph/categories', (_req, res) => {
|
|
191
|
+
try {
|
|
192
|
+
const st = (0, indexContext_js_1.ensureLoaded)();
|
|
193
|
+
const map = new Map();
|
|
194
|
+
for (const inst of st.list) {
|
|
195
|
+
const cats = Array.isArray(inst.categories) ? inst.categories : [];
|
|
196
|
+
for (const c of cats) {
|
|
197
|
+
map.set(c, (map.get(c) || 0) + 1);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const categories = [...map.entries()].sort((a, b) => a[0].localeCompare(b[0])).map(([id, count]) => ({ id, count }));
|
|
201
|
+
res.json({ success: true, categories, total: categories.length, timestamp: Date.now() });
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
const e = err;
|
|
205
|
+
res.status(500).json({ success: false, error: e.message || String(e) });
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
/**
|
|
209
|
+
* GET /api/graph/instructions?categories=a,b&limit=100
|
|
210
|
+
* Returns lightweight instruction list filtered by categories (OR semantics).
|
|
211
|
+
*/
|
|
212
|
+
router.get('/graph/instructions', (req, res) => {
|
|
213
|
+
try {
|
|
214
|
+
const st = (0, indexContext_js_1.ensureLoaded)();
|
|
215
|
+
const catsParam = req.query.categories || '';
|
|
216
|
+
const filterCats = catsParam ? catsParam.split(',').filter(Boolean) : [];
|
|
217
|
+
const limitRaw = parseInt(req.query.limit || '0', 10);
|
|
218
|
+
const limit = Number.isFinite(limitRaw) && limitRaw > 0 ? limitRaw : 500;
|
|
219
|
+
let instructions = st.list.slice().sort((a, b) => a.id.localeCompare(b.id));
|
|
220
|
+
if (filterCats.length) {
|
|
221
|
+
const set = new Set(filterCats.map(c => c.toLowerCase()));
|
|
222
|
+
instructions = instructions.filter(i => (i.categories || []).some(c => set.has(c.toLowerCase())));
|
|
223
|
+
}
|
|
224
|
+
instructions = instructions.slice(0, limit);
|
|
225
|
+
const flat = instructions.map(i => ({ id: i.id, primaryCategory: i.primaryCategory || i.categories?.[0], categories: i.categories || [] }));
|
|
226
|
+
res.json({ success: true, instructions: flat, count: flat.length, filtered: !!filterCats.length, timestamp: Date.now() });
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
const e = err;
|
|
230
|
+
res.status(500).json({ success: false, error: e.message || String(e) });
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
/**
|
|
234
|
+
* GET /api/graph/relations?instructions=id1,id2
|
|
235
|
+
* Returns minimal edges among the provided instruction ids plus category linkage.
|
|
236
|
+
*/
|
|
237
|
+
router.get('/graph/relations', (req, res) => {
|
|
238
|
+
try {
|
|
239
|
+
const idsParam = req.query.instructions || '';
|
|
240
|
+
const ids = idsParam.split(',').filter(Boolean);
|
|
241
|
+
if (!ids.length) {
|
|
242
|
+
return res.json({ success: true, nodes: [], edges: [], categories: [], timestamp: Date.now() });
|
|
243
|
+
}
|
|
244
|
+
const graph = (0, handlers_graph_js_1.buildGraph)({ enrich: true, includeCategoryNodes: true, includeUsage: false });
|
|
245
|
+
const expand = (req.query.expand === '1' || req.query.expand === 'true');
|
|
246
|
+
const selectedSet = new Set(ids);
|
|
247
|
+
const workingSet = new Set(ids);
|
|
248
|
+
const firstEdges = graph.edges.filter(e => selectedSet.has(e.from) || selectedSet.has(e.to));
|
|
249
|
+
if (expand) {
|
|
250
|
+
const instructionNodeIds = new Set(graph.nodes.filter(n => n.nodeType === 'instruction').map(n => n.id));
|
|
251
|
+
for (const e of firstEdges) {
|
|
252
|
+
if (instructionNodeIds.has(e.from) && !workingSet.has(e.from))
|
|
253
|
+
workingSet.add(e.from);
|
|
254
|
+
if (instructionNodeIds.has(e.to) && !workingSet.has(e.to))
|
|
255
|
+
workingSet.add(e.to);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const nodesAll = graph.nodes.filter(n => workingSet.has(n.id) || n.nodeType === 'category');
|
|
259
|
+
const edges = graph.edges.filter(e => workingSet.has(e.from) && workingSet.has(e.to) && (selectedSet.has(e.from) || selectedSet.has(e.to)));
|
|
260
|
+
const categoryRefs = new Set();
|
|
261
|
+
for (const e of edges) {
|
|
262
|
+
if (e.type === 'belongs' || e.type === 'primary') {
|
|
263
|
+
if (e.to.startsWith('category:'))
|
|
264
|
+
categoryRefs.add(e.to);
|
|
265
|
+
if (e.from.startsWith('category:'))
|
|
266
|
+
categoryRefs.add(e.from);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
const finalNodes = nodesAll.filter(n => !('nodeType' in n && n.nodeType === 'category') || categoryRefs.has(n.id));
|
|
270
|
+
const categories = [...categoryRefs].map(id => ({ id: id.replace(/^category:/, '') }));
|
|
271
|
+
const expandedCount = workingSet.size - selectedSet.size;
|
|
272
|
+
res.json({ success: true, nodes: finalNodes, edges, categories, expanded: expand ? expandedCount : 0, timestamp: Date.now() });
|
|
273
|
+
}
|
|
274
|
+
catch (err) {
|
|
275
|
+
const e = err;
|
|
276
|
+
res.status(500).json({ success: false, error: e.message || String(e) });
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
return router;
|
|
280
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route module index — re-exports all route factories and mounts dashboard routes.
|
|
3
|
+
*/
|
|
4
|
+
import { Express } from 'express';
|
|
5
|
+
import { MetricsCollector } from '../MetricsCollector.js';
|
|
6
|
+
export { createStatusRoutes } from './status.routes.js';
|
|
7
|
+
export { createMetricsRoutes } from './metrics.routes.js';
|
|
8
|
+
export { createAdminRoutes } from './admin.routes.js';
|
|
9
|
+
export { createGraphRoutes } from './graph.routes.js';
|
|
10
|
+
export { createInstructionsRoutes } from './instructions.routes.js';
|
|
11
|
+
export { createKnowledgeRoutes } from './knowledge.routes.js';
|
|
12
|
+
export { createAlertsRoutes } from './alerts.routes.js';
|
|
13
|
+
export { createLogsRoutes } from './logs.routes.js';
|
|
14
|
+
export { createSyntheticRoutes } from './synthetic.routes.js';
|
|
15
|
+
export { createInstancesRoutes } from './instances.routes.js';
|
|
16
|
+
export { createToolsRoutes } from './tools.routes.js';
|
|
17
|
+
export { createEmbeddingsRoutes } from './embeddings.routes.js';
|
|
18
|
+
export { createUsageRoutes } from './usage.routes.js';
|
|
19
|
+
export { createScriptsRoutes } from './scripts.routes.js';
|
|
20
|
+
export { createMessagingRoutes } from './messaging.routes.js';
|
|
21
|
+
export { createSqliteRoutes } from './sqlite.routes.js';
|
|
22
|
+
export interface DashboardRoutesContext {
|
|
23
|
+
metricsCollector: MetricsCollector;
|
|
24
|
+
enableWebSockets: boolean;
|
|
25
|
+
enableCors: boolean;
|
|
26
|
+
graphEnabled: boolean;
|
|
27
|
+
wsProtocol: 'wss' | 'ws';
|
|
28
|
+
getServerInfo: () => {
|
|
29
|
+
port: number;
|
|
30
|
+
host: string;
|
|
31
|
+
url: string;
|
|
32
|
+
} | null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Registers all top-level dashboard routes on the given Express app.
|
|
36
|
+
* Called once during DashboardServer construction after middleware is set up.
|
|
37
|
+
*/
|
|
38
|
+
export declare function mountDashboardRoutes(app: Express, ctx: DashboardRoutesContext): void;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Route module index — re-exports all route factories and mounts dashboard routes.
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createSqliteRoutes = exports.createMessagingRoutes = exports.createScriptsRoutes = exports.createUsageRoutes = exports.createEmbeddingsRoutes = exports.createToolsRoutes = exports.createInstancesRoutes = exports.createSyntheticRoutes = exports.createLogsRoutes = exports.createAlertsRoutes = exports.createKnowledgeRoutes = exports.createInstructionsRoutes = exports.createGraphRoutes = exports.createAdminRoutes = exports.createMetricsRoutes = exports.createStatusRoutes = void 0;
|
|
10
|
+
exports.mountDashboardRoutes = mountDashboardRoutes;
|
|
11
|
+
const promises_1 = require("fs/promises");
|
|
12
|
+
const path_1 = __importDefault(require("path"));
|
|
13
|
+
const ApiRoutes_js_1 = require("../ApiRoutes.js");
|
|
14
|
+
const legacyDashboardHtml_js_1 = require("../legacyDashboardHtml.js");
|
|
15
|
+
const registry_js_1 = require("../../../server/registry.js");
|
|
16
|
+
var status_routes_js_1 = require("./status.routes.js");
|
|
17
|
+
Object.defineProperty(exports, "createStatusRoutes", { enumerable: true, get: function () { return status_routes_js_1.createStatusRoutes; } });
|
|
18
|
+
var metrics_routes_js_1 = require("./metrics.routes.js");
|
|
19
|
+
Object.defineProperty(exports, "createMetricsRoutes", { enumerable: true, get: function () { return metrics_routes_js_1.createMetricsRoutes; } });
|
|
20
|
+
var admin_routes_js_1 = require("./admin.routes.js");
|
|
21
|
+
Object.defineProperty(exports, "createAdminRoutes", { enumerable: true, get: function () { return admin_routes_js_1.createAdminRoutes; } });
|
|
22
|
+
var graph_routes_js_1 = require("./graph.routes.js");
|
|
23
|
+
Object.defineProperty(exports, "createGraphRoutes", { enumerable: true, get: function () { return graph_routes_js_1.createGraphRoutes; } });
|
|
24
|
+
var instructions_routes_js_1 = require("./instructions.routes.js");
|
|
25
|
+
Object.defineProperty(exports, "createInstructionsRoutes", { enumerable: true, get: function () { return instructions_routes_js_1.createInstructionsRoutes; } });
|
|
26
|
+
var knowledge_routes_js_1 = require("./knowledge.routes.js");
|
|
27
|
+
Object.defineProperty(exports, "createKnowledgeRoutes", { enumerable: true, get: function () { return knowledge_routes_js_1.createKnowledgeRoutes; } });
|
|
28
|
+
var alerts_routes_js_1 = require("./alerts.routes.js");
|
|
29
|
+
Object.defineProperty(exports, "createAlertsRoutes", { enumerable: true, get: function () { return alerts_routes_js_1.createAlertsRoutes; } });
|
|
30
|
+
var logs_routes_js_1 = require("./logs.routes.js");
|
|
31
|
+
Object.defineProperty(exports, "createLogsRoutes", { enumerable: true, get: function () { return logs_routes_js_1.createLogsRoutes; } });
|
|
32
|
+
var synthetic_routes_js_1 = require("./synthetic.routes.js");
|
|
33
|
+
Object.defineProperty(exports, "createSyntheticRoutes", { enumerable: true, get: function () { return synthetic_routes_js_1.createSyntheticRoutes; } });
|
|
34
|
+
var instances_routes_js_1 = require("./instances.routes.js");
|
|
35
|
+
Object.defineProperty(exports, "createInstancesRoutes", { enumerable: true, get: function () { return instances_routes_js_1.createInstancesRoutes; } });
|
|
36
|
+
var tools_routes_js_1 = require("./tools.routes.js");
|
|
37
|
+
Object.defineProperty(exports, "createToolsRoutes", { enumerable: true, get: function () { return tools_routes_js_1.createToolsRoutes; } });
|
|
38
|
+
var embeddings_routes_js_1 = require("./embeddings.routes.js");
|
|
39
|
+
Object.defineProperty(exports, "createEmbeddingsRoutes", { enumerable: true, get: function () { return embeddings_routes_js_1.createEmbeddingsRoutes; } });
|
|
40
|
+
var usage_routes_js_1 = require("./usage.routes.js");
|
|
41
|
+
Object.defineProperty(exports, "createUsageRoutes", { enumerable: true, get: function () { return usage_routes_js_1.createUsageRoutes; } });
|
|
42
|
+
var scripts_routes_js_1 = require("./scripts.routes.js");
|
|
43
|
+
Object.defineProperty(exports, "createScriptsRoutes", { enumerable: true, get: function () { return scripts_routes_js_1.createScriptsRoutes; } });
|
|
44
|
+
var messaging_routes_js_1 = require("./messaging.routes.js");
|
|
45
|
+
Object.defineProperty(exports, "createMessagingRoutes", { enumerable: true, get: function () { return messaging_routes_js_1.createMessagingRoutes; } });
|
|
46
|
+
var sqlite_routes_js_1 = require("./sqlite.routes.js");
|
|
47
|
+
Object.defineProperty(exports, "createSqliteRoutes", { enumerable: true, get: function () { return sqlite_routes_js_1.createSqliteRoutes; } });
|
|
48
|
+
/**
|
|
49
|
+
* Registers all top-level dashboard routes on the given Express app.
|
|
50
|
+
* Called once during DashboardServer construction after middleware is set up.
|
|
51
|
+
*/
|
|
52
|
+
function mountDashboardRoutes(app, ctx) {
|
|
53
|
+
// Redirect root to admin panel (v2 dashboard)
|
|
54
|
+
app.get('/', (_req, res) => {
|
|
55
|
+
res.redirect('/admin');
|
|
56
|
+
});
|
|
57
|
+
// Legacy v1 dashboard (kept for backward compatibility)
|
|
58
|
+
app.get('/legacy', (_req, res) => {
|
|
59
|
+
const nonce = res.locals.cspNonce;
|
|
60
|
+
const snapshot = ctx.metricsCollector.getCurrentSnapshot();
|
|
61
|
+
const serverInfo = ctx.getServerInfo();
|
|
62
|
+
const webSocketUrl = ctx.enableWebSockets && serverInfo
|
|
63
|
+
? `${ctx.wsProtocol}://${serverInfo.host}:${serverInfo.port}/ws`
|
|
64
|
+
: null;
|
|
65
|
+
res.send((0, legacyDashboardHtml_js_1.generateDashboardHtml)(nonce, snapshot, webSocketUrl));
|
|
66
|
+
});
|
|
67
|
+
// Admin Panel (v2 dashboard — primary UI)
|
|
68
|
+
app.get('/admin', async (_req, res) => {
|
|
69
|
+
try {
|
|
70
|
+
// __dirname here is src/dashboard/server/routes — step up two levels to reach client/
|
|
71
|
+
const adminHtmlPath = path_1.default.join(__dirname, '..', '..', 'client', 'admin.html');
|
|
72
|
+
let adminHtml = await (0, promises_1.readFile)(adminHtmlPath, 'utf-8');
|
|
73
|
+
if (!ctx.graphEnabled) {
|
|
74
|
+
adminHtml = (0, legacyDashboardHtml_js_1.stripGraphTab)(adminHtml);
|
|
75
|
+
}
|
|
76
|
+
const nonce = res.locals.cspNonce;
|
|
77
|
+
adminHtml = adminHtml.replace(/<script>/g, `<script nonce="${nonce}">`);
|
|
78
|
+
adminHtml = adminHtml.replace(/<script defer /g, `<script nonce="${nonce}" defer `);
|
|
79
|
+
res.type('html').send(adminHtml);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
// eslint-disable-next-line no-console
|
|
83
|
+
console.error('[Dashboard] Admin panel load error:', error);
|
|
84
|
+
res.status(500).send('<h1>500 - Admin Panel Error</h1><p>Failed to load admin panel</p>');
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
// Health check
|
|
88
|
+
app.get('/health', (_req, res) => {
|
|
89
|
+
const snapshot = ctx.metricsCollector.getCurrentSnapshot();
|
|
90
|
+
res.json({
|
|
91
|
+
status: 'healthy',
|
|
92
|
+
timestamp: Date.now(),
|
|
93
|
+
uptime: snapshot.server.uptime,
|
|
94
|
+
version: snapshot.server.version,
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
// Panel documentation — serves markdown rendered as styled HTML
|
|
98
|
+
app.get('/api/docs/:name', async (req, res) => {
|
|
99
|
+
const name = req.params.name.replace(/[^a-z0-9_-]/gi, '');
|
|
100
|
+
if (!name) {
|
|
101
|
+
res.status(400).send('Invalid doc name');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const docPath = path_1.default.join(__dirname, '..', '..', '..', '..', 'docs', 'panels', `${name}.md`);
|
|
105
|
+
try {
|
|
106
|
+
const md = await (0, promises_1.readFile)(docPath, 'utf-8');
|
|
107
|
+
const bodyHtml = md
|
|
108
|
+
.replace(/^### (.+)$/gm, '<h3>$1</h3>')
|
|
109
|
+
.replace(/^## (.+)$/gm, '<h2>$1</h2>')
|
|
110
|
+
.replace(/^# (.+)$/gm, '<h1>$1</h1>')
|
|
111
|
+
.replace(/^---$/gm, '<hr>')
|
|
112
|
+
.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>')
|
|
113
|
+
.replace(/`([^`]+)`/g, '<code>$1</code>')
|
|
114
|
+
.replace(/!\[([^\]]*)\]\(([^)]+)\)/g, '<img src="$2" alt="$1" style="max-width:100%;border-radius:8px;border:1px solid #1f2a3a;margin:12px 0;">')
|
|
115
|
+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank" rel="noopener">$1</a>')
|
|
116
|
+
.replace(/^\| (.+) \|$/gm, (_m, row) => {
|
|
117
|
+
const cells = row.split('|').map((c) => c.trim());
|
|
118
|
+
return '<tr>' + cells.map((c) => `<td>${c}</td>`).join('') + '</tr>';
|
|
119
|
+
})
|
|
120
|
+
.replace(/^\|[-| ]+\|$/gm, '')
|
|
121
|
+
.replace(/((?:<tr>.*<\/tr>\n?)+)/g, '<table>$1</table>')
|
|
122
|
+
.replace(/^- (.+)$/gm, '<li>$1</li>')
|
|
123
|
+
.replace(/((?:<li>.*<\/li>\n?)+)/g, '<ul>$1</ul>')
|
|
124
|
+
.replace(/\n{2,}/g, '\n<br>\n');
|
|
125
|
+
const html = `<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>${name} - Panel Docs</title><style>body{background:#0b0f19;color:#e3ebf5;font-family:'Segoe UI',system-ui,sans-serif;padding:24px 32px;max-width:800px;margin:0 auto;line-height:1.6;}h1{color:#667eea;border-bottom:1px solid #1f2a3a;padding-bottom:8px;}h2{color:#9fb5cc;margin-top:24px;}h3{color:#b0c4de;}table{width:100%;border-collapse:collapse;margin:12px 0;}td{padding:6px 10px;border:1px solid #1f2a3a;font-size:13px;}tr:first-child td{background:#101726;font-weight:600;}code{background:#182234;padding:2px 6px;border-radius:4px;font-size:12px;}a{color:#667eea;}hr{border:none;border-top:1px solid #1f2a3a;margin:20px 0;}ul{padding-left:20px;}li{margin:4px 0;}</style></head><body>${bodyHtml}</body></html>`;
|
|
126
|
+
res.type('html').send(html);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
res.status(404).send('<h1>404</h1><p>Panel documentation not found.</p><p><a href="/admin">Back to Admin</a></p>');
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
// Panel screenshot — serves PNG images from docs/screenshots/
|
|
133
|
+
app.get('/api/screenshots/:name', async (req, res) => {
|
|
134
|
+
const fileName = req.params.name.replace(/[^a-z0-9._-]/gi, '');
|
|
135
|
+
if (!fileName || !fileName.endsWith('.png')) {
|
|
136
|
+
res.status(400).send('Invalid');
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const screenshotsDir = path_1.default.resolve(__dirname, '..', '..', '..', '..', 'docs', 'screenshots');
|
|
140
|
+
const filePath = path_1.default.join(screenshotsDir, fileName);
|
|
141
|
+
if (!filePath.startsWith(screenshotsDir)) {
|
|
142
|
+
res.status(400).send('Invalid path');
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
const data = await (0, promises_1.readFile)(filePath);
|
|
147
|
+
res.setHeader('Content-Type', 'image/png');
|
|
148
|
+
res.setHeader('Cache-Control', 'public, max-age=3600');
|
|
149
|
+
res.send(data);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
res.status(404).send('Screenshot not found');
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
// API sub-routes (mounted at /api)
|
|
156
|
+
app.use('/api', (0, ApiRoutes_js_1.createApiRoutes)({ enableCors: ctx.enableCors }));
|
|
157
|
+
// Back-compat: legacy tests expect /tools.json at dashboard root
|
|
158
|
+
app.get('/tools.json', (_req, res) => {
|
|
159
|
+
try {
|
|
160
|
+
const tools = (0, registry_js_1.listRegisteredMethods)();
|
|
161
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
162
|
+
const toolMetrics = ctx.metricsCollector.getToolMetrics();
|
|
163
|
+
const enrichedTools = tools.map(toolName => ({
|
|
164
|
+
name: toolName,
|
|
165
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
166
|
+
metrics: toolMetrics[toolName] || {
|
|
167
|
+
callCount: 0,
|
|
168
|
+
successCount: 0,
|
|
169
|
+
errorCount: 0,
|
|
170
|
+
totalResponseTime: 0,
|
|
171
|
+
errorTypes: {},
|
|
172
|
+
},
|
|
173
|
+
}));
|
|
174
|
+
res.json({ tools: enrichedTools, totalTools: tools.length, timestamp: Date.now(), legacy: true });
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
// eslint-disable-next-line no-console
|
|
178
|
+
console.error('[Dashboard] /tools.json route error:', error);
|
|
179
|
+
res.status(500).json({ error: 'Failed to get tools list' });
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
// WebSocket connection info
|
|
183
|
+
app.get('/ws-info', (_req, res) => {
|
|
184
|
+
const serverInfo = ctx.getServerInfo();
|
|
185
|
+
res.json({
|
|
186
|
+
enabled: ctx.enableWebSockets,
|
|
187
|
+
url: serverInfo ? `${ctx.wsProtocol}://${serverInfo.host}:${serverInfo.port}/ws` : null,
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
// 404 fallback
|
|
191
|
+
app.use((_req, res) => {
|
|
192
|
+
res.status(404).send('<h1>404 - Page Not Found</h1><p>Return to <a href="/">Dashboard</a></p>');
|
|
193
|
+
});
|
|
194
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Instances Routes
|
|
4
|
+
* Routes: GET /instances
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.createInstancesRoutes = createInstancesRoutes;
|
|
8
|
+
const express_1 = require("express");
|
|
9
|
+
const InstanceManager_js_1 = require("../InstanceManager.js");
|
|
10
|
+
function createInstancesRoutes() {
|
|
11
|
+
const router = (0, express_1.Router)();
|
|
12
|
+
/**
|
|
13
|
+
* GET /api/instances - List all active dashboard instances
|
|
14
|
+
*/
|
|
15
|
+
router.get('/instances', (_req, res) => {
|
|
16
|
+
try {
|
|
17
|
+
const instances = (0, InstanceManager_js_1.getActiveInstances)();
|
|
18
|
+
const current = instances.find(i => i.current);
|
|
19
|
+
res.json({
|
|
20
|
+
current: current ? { pid: current.pid, port: current.port, host: current.host } : null,
|
|
21
|
+
instances,
|
|
22
|
+
count: instances.length,
|
|
23
|
+
timestamp: Date.now(),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
res.status(500).json({
|
|
28
|
+
error: 'Failed to list instances',
|
|
29
|
+
message: error instanceof Error ? error.message : String(error),
|
|
30
|
+
timestamp: Date.now(),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return router;
|
|
35
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Instructions Management Routes
|
|
3
|
+
* Routes: GET /instructions, GET /instructions_search, GET /instructions_categories,
|
|
4
|
+
* GET /instructions/:name, POST /instructions, PUT /instructions/:name,
|
|
5
|
+
* DELETE /instructions/:name
|
|
6
|
+
*/
|
|
7
|
+
import { Router } from 'express';
|
|
8
|
+
export declare function createInstructionsRoutes(): Router;
|