@jagilber-org/index-server 1.22.0
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 +1354 -0
- package/CODE_OF_CONDUCT.md +49 -0
- package/CONTRIBUTING.md +99 -0
- package/LICENSE +21 -0
- package/README.md +228 -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 +46 -0
- package/dist/config/dashboardConfig.js +67 -0
- package/dist/config/defaultValues.d.ts +63 -0
- package/dist/config/defaultValues.js +72 -0
- package/dist/config/dirConstants.d.ts +18 -0
- package/dist/config/dirConstants.js +29 -0
- package/dist/config/featureConfig.d.ts +61 -0
- package/dist/config/featureConfig.js +121 -0
- package/dist/config/runtimeConfig.d.ts +151 -0
- package/dist/config/runtimeConfig.js +380 -0
- package/dist/config/serverConfig.d.ts +90 -0
- package/dist/config/serverConfig.js +167 -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 +2175 -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 +1587 -0
- package/dist/dashboard/client/js/admin.auth.js +179 -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 +426 -0
- package/dist/dashboard/client/js/admin.graph.js +615 -0
- package/dist/dashboard/client/js/admin.instances.js +120 -0
- package/dist/dashboard/client/js/admin.instructions.js +579 -0
- package/dist/dashboard/client/js/admin.logs.js +113 -0
- package/dist/dashboard/client/js/admin.maintenance.js +393 -0
- package/dist/dashboard/client/js/admin.messaging.js +636 -0
- package/dist/dashboard/client/js/admin.monitor.js +184 -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 +292 -0
- package/dist/dashboard/client/js/admin.sqlite.js +373 -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 +47 -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 +23 -0
- package/dist/dashboard/export/exporters/xmlExporter.d.ts +17 -0
- package/dist/dashboard/export/exporters/xmlExporter.js +176 -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 +560 -0
- package/dist/dashboard/server/AdminPanel.d.ts +195 -0
- package/dist/dashboard/server/AdminPanel.js +861 -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 +215 -0
- package/dist/dashboard/server/ApiRoutes.d.ts +17 -0
- package/dist/dashboard/server/ApiRoutes.js +184 -0
- package/dist/dashboard/server/DashboardServer.d.ts +49 -0
- package/dist/dashboard/server/DashboardServer.js +160 -0
- package/dist/dashboard/server/FileMetricsStorage.d.ts +49 -0
- package/dist/dashboard/server/FileMetricsStorage.js +196 -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 +295 -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 +810 -0
- package/dist/dashboard/server/SessionPersistenceManager.d.ts +88 -0
- package/dist/dashboard/server/SessionPersistenceManager.js +458 -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 +448 -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 +210 -0
- package/dist/dashboard/server/metricsSerializer.d.ts +25 -0
- package/dist/dashboard/server/metricsSerializer.js +195 -0
- package/dist/dashboard/server/middleware/ensureLoadedMiddleware.d.ts +25 -0
- package/dist/dashboard/server/middleware/ensureLoadedMiddleware.js +24 -0
- package/dist/dashboard/server/routes/admin.routes.d.ts +16 -0
- package/dist/dashboard/server/routes/admin.routes.js +574 -0
- package/dist/dashboard/server/routes/adminAuth.d.ts +4 -0
- package/dist/dashboard/server/routes/adminAuth.js +46 -0
- package/dist/dashboard/server/routes/alerts.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/alerts.routes.js +91 -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 +279 -0
- package/dist/dashboard/server/routes/index.d.ts +39 -0
- package/dist/dashboard/server/routes/index.js +229 -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 +268 -0
- package/dist/dashboard/server/routes/knowledge.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/knowledge.routes.js +80 -0
- package/dist/dashboard/server/routes/logs.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/logs.routes.js +166 -0
- package/dist/dashboard/server/routes/messaging.routes.d.ts +16 -0
- package/dist/dashboard/server/routes/messaging.routes.js +307 -0
- package/dist/dashboard/server/routes/metrics.routes.d.ts +10 -0
- package/dist/dashboard/server/routes/metrics.routes.js +335 -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 +570 -0
- package/dist/dashboard/server/routes/status.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/status.routes.js +179 -0
- package/dist/dashboard/server/routes/synthetic.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/synthetic.routes.js +197 -0
- package/dist/dashboard/server/routes/tools.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/tools.routes.js +47 -0
- package/dist/dashboard/server/routes/usage.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/usage.routes.js +26 -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 +46 -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 +132 -0
- package/dist/schemas/index.js +372 -0
- package/dist/scripts/runPerformanceBaseline.d.ts +1 -0
- package/dist/scripts/runPerformanceBaseline.js +17 -0
- package/dist/server/backgroundServicesStartup.d.ts +3 -0
- package/dist/server/backgroundServicesStartup.js +51 -0
- package/dist/server/handshakeManager.d.ts +25 -0
- package/dist/server/handshakeManager.js +470 -0
- package/dist/server/index-server.d.ts +38 -0
- package/dist/server/index-server.js +620 -0
- package/dist/server/multiInstanceStartup.d.ts +6 -0
- package/dist/server/multiInstanceStartup.js +132 -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/startupDiagnostics.d.ts +2 -0
- package/dist/server/startupDiagnostics.js +33 -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 +112 -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 +264 -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 +510 -0
- package/dist/services/handlers/instructions.groom.d.ts +1 -0
- package/dist/services/handlers/instructions.groom.js +575 -0
- package/dist/services/handlers/instructions.import.d.ts +1 -0
- package/dist/services/handlers/instructions.import.js +205 -0
- package/dist/services/handlers/instructions.patch.d.ts +1 -0
- package/dist/services/handlers/instructions.patch.js +121 -0
- package/dist/services/handlers/instructions.query.d.ts +159 -0
- package/dist/services/handlers/instructions.query.js +469 -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 +122 -0
- package/dist/services/handlers/instructions.shared.d.ts +32 -0
- package/dist/services/handlers/instructions.shared.js +91 -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 +110 -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 +389 -0
- package/dist/services/handlers.gates.d.ts +1 -0
- package/dist/services/handlers.gates.js +47 -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 +326 -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 +669 -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 +35 -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 +989 -0
- package/dist/services/indexLoader.d.ts +44 -0
- package/dist/services/indexLoader.js +920 -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 +36 -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 +259 -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 +123 -0
- package/dist/services/storage/sqliteStore.d.ts +42 -0
- package/dist/services/storage/sqliteStore.js +361 -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 +325 -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 +94 -0
- package/package.json +139 -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 +40670 -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 +210 -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/dist/README.md +15 -0
- package/scripts/setup-hooks.cjs +28 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Logs Routes
|
|
4
|
+
* Routes: GET /logs, GET /logs/stream
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.createLogsRoutes = createLogsRoutes;
|
|
11
|
+
const express_1 = require("express");
|
|
12
|
+
const fs_1 = __importDefault(require("fs"));
|
|
13
|
+
const runtimeConfig_js_1 = require("../../../config/runtimeConfig.js");
|
|
14
|
+
function createLogsRoutes() {
|
|
15
|
+
const router = (0, express_1.Router)();
|
|
16
|
+
/**
|
|
17
|
+
* GET /api/logs - Get server logs with optional tail functionality
|
|
18
|
+
*/
|
|
19
|
+
router.get('/logs', (req, res) => {
|
|
20
|
+
try {
|
|
21
|
+
const loggingConfig = (0, runtimeConfig_js_1.getRuntimeConfig)().logging;
|
|
22
|
+
const logFile = loggingConfig.file;
|
|
23
|
+
const lines = req.query.lines ? parseInt(req.query.lines, 10) : 100;
|
|
24
|
+
const follow = req.query.follow === 'true';
|
|
25
|
+
const raw = req.query.raw === '1' || req.query.raw === 'true';
|
|
26
|
+
if (!logFile || !fs_1.default.existsSync(logFile)) {
|
|
27
|
+
return res.json({
|
|
28
|
+
logs: [],
|
|
29
|
+
message: 'No log file configured or file not found. Set INDEX_SERVER_LOG_FILE environment variable or update runtime logging configuration.',
|
|
30
|
+
timestamp: Date.now(),
|
|
31
|
+
totalLines: 0
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
// Read log file
|
|
35
|
+
const logContent = fs_1.default.readFileSync(logFile, 'utf8');
|
|
36
|
+
const allLines = logContent.split('\n').filter(line => line.trim());
|
|
37
|
+
// Get last N lines (tail functionality)
|
|
38
|
+
const tailLines = lines > 0 ? allLines.slice(-lines) : allLines;
|
|
39
|
+
if (raw) {
|
|
40
|
+
// Plain text response for simpler clients (backwards-compatible option)
|
|
41
|
+
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
|
|
42
|
+
res.send(tailLines.join('\n'));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
res.json({
|
|
46
|
+
logs: tailLines,
|
|
47
|
+
timestamp: Date.now(),
|
|
48
|
+
totalLines: allLines.length,
|
|
49
|
+
showing: tailLines.length,
|
|
50
|
+
file: loggingConfig.rawFileValue ?? logFile,
|
|
51
|
+
follow: follow,
|
|
52
|
+
mode: raw ? 'text' : 'json'
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.error('[API] Logs error:', error);
|
|
57
|
+
res.status(500).json({
|
|
58
|
+
error: 'Failed to read logs',
|
|
59
|
+
timestamp: Date.now()
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
/**
|
|
64
|
+
* GET /api/logs/stream - Server-Sent Events stream for real-time log tailing
|
|
65
|
+
*/
|
|
66
|
+
router.get('/logs/stream', (req, res) => {
|
|
67
|
+
const loggingConfig = (0, runtimeConfig_js_1.getRuntimeConfig)().logging;
|
|
68
|
+
const logFile = loggingConfig.file;
|
|
69
|
+
if (!logFile || !fs_1.default.existsSync(logFile)) {
|
|
70
|
+
return res.status(404).json({
|
|
71
|
+
error: 'Log file not available',
|
|
72
|
+
message: 'No log file configured or file not found. Set INDEX_SERVER_LOG_FILE environment variable or update runtime logging configuration.'
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
// Set up Server-Sent Events
|
|
76
|
+
const origin = req.headers.origin;
|
|
77
|
+
const corsOrigin = (origin && /^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/.test(origin)) ? origin : '';
|
|
78
|
+
res.writeHead(200, {
|
|
79
|
+
'Content-Type': 'text/event-stream',
|
|
80
|
+
'Cache-Control': 'no-cache',
|
|
81
|
+
'Connection': 'keep-alive',
|
|
82
|
+
...(corsOrigin ? { 'Access-Control-Allow-Origin': corsOrigin } : {}),
|
|
83
|
+
});
|
|
84
|
+
let lastSize = 0;
|
|
85
|
+
let watchInterval = null;
|
|
86
|
+
try {
|
|
87
|
+
// Get initial file size
|
|
88
|
+
const initialStats = fs_1.default.statSync(logFile);
|
|
89
|
+
lastSize = initialStats.size;
|
|
90
|
+
// Send initial connection message
|
|
91
|
+
res.write(`data: ${JSON.stringify({ type: 'connected', timestamp: Date.now() })}\n\n`);
|
|
92
|
+
// Poll for file changes (more reliable than fs.watchFile)
|
|
93
|
+
watchInterval = setInterval(() => {
|
|
94
|
+
try {
|
|
95
|
+
const currentStats = fs_1.default.statSync(logFile);
|
|
96
|
+
if (currentStats.size > lastSize) {
|
|
97
|
+
// File has grown, read new content
|
|
98
|
+
const stream = fs_1.default.createReadStream(logFile, {
|
|
99
|
+
start: lastSize,
|
|
100
|
+
end: currentStats.size - 1,
|
|
101
|
+
encoding: 'utf8'
|
|
102
|
+
});
|
|
103
|
+
let buffer = '';
|
|
104
|
+
stream.on('data', (chunk) => {
|
|
105
|
+
const chunkStr = chunk.toString();
|
|
106
|
+
buffer += chunkStr;
|
|
107
|
+
const lineArr = buffer.split('\n');
|
|
108
|
+
buffer = lineArr.pop() || ''; // Keep incomplete line in buffer
|
|
109
|
+
lineArr.forEach(line => {
|
|
110
|
+
if (line.trim()) {
|
|
111
|
+
res.write(`data: ${JSON.stringify({
|
|
112
|
+
type: 'log',
|
|
113
|
+
line: line.trim(),
|
|
114
|
+
timestamp: Date.now()
|
|
115
|
+
})}\n\n`);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
stream.on('end', () => {
|
|
120
|
+
lastSize = currentStats.size;
|
|
121
|
+
});
|
|
122
|
+
stream.on('error', (error) => {
|
|
123
|
+
console.error('[Logs] Stream read error:', error);
|
|
124
|
+
res.write(`data: ${JSON.stringify({
|
|
125
|
+
type: 'error',
|
|
126
|
+
message: 'Failed to read log stream',
|
|
127
|
+
timestamp: Date.now()
|
|
128
|
+
})}\n\n`);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.error('[Logs] Stream poll error:', error);
|
|
134
|
+
res.write(`data: ${JSON.stringify({
|
|
135
|
+
type: 'error',
|
|
136
|
+
message: 'Failed to poll log file',
|
|
137
|
+
timestamp: Date.now()
|
|
138
|
+
})}\n\n`);
|
|
139
|
+
}
|
|
140
|
+
}, 1000);
|
|
141
|
+
// Cleanup on client disconnect
|
|
142
|
+
req.on('close', () => {
|
|
143
|
+
if (watchInterval) {
|
|
144
|
+
clearInterval(watchInterval);
|
|
145
|
+
watchInterval = null;
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
// Keep connection alive
|
|
149
|
+
const heartbeat = setInterval(() => {
|
|
150
|
+
res.write(`data: ${JSON.stringify({ type: 'heartbeat', timestamp: Date.now() })}\n\n`);
|
|
151
|
+
}, 30000);
|
|
152
|
+
req.on('close', () => {
|
|
153
|
+
clearInterval(heartbeat);
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
console.error('[Logs] Failed to start log streaming:', error);
|
|
158
|
+
res.write(`data: ${JSON.stringify({
|
|
159
|
+
type: 'error',
|
|
160
|
+
message: 'Failed to start log streaming',
|
|
161
|
+
timestamp: Date.now()
|
|
162
|
+
})}\n\n`);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
return router;
|
|
166
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Messaging Routes — Dashboard REST API for inter-agent messaging.
|
|
3
|
+
*
|
|
4
|
+
* Routes:
|
|
5
|
+
* POST /api/messages — send a message
|
|
6
|
+
* GET /api/messages/channels — list channels
|
|
7
|
+
* GET /api/messages/stats — reader stats
|
|
8
|
+
* GET /api/messages/:channel — read messages from channel
|
|
9
|
+
* POST /api/messages/ack — acknowledge messages
|
|
10
|
+
* GET /api/messages/by-id/:id — get message by ID
|
|
11
|
+
* PUT /api/messages/by-id/:id — update message
|
|
12
|
+
* DELETE /api/messages — purge messages
|
|
13
|
+
* POST /api/messages/inbound — peer inbound (cross-instance)
|
|
14
|
+
*/
|
|
15
|
+
import { Router } from 'express';
|
|
16
|
+
export declare function createMessagingRoutes(): Router;
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Messaging Routes — Dashboard REST API for inter-agent messaging.
|
|
4
|
+
*
|
|
5
|
+
* Routes:
|
|
6
|
+
* POST /api/messages — send a message
|
|
7
|
+
* GET /api/messages/channels — list channels
|
|
8
|
+
* GET /api/messages/stats — reader stats
|
|
9
|
+
* GET /api/messages/:channel — read messages from channel
|
|
10
|
+
* POST /api/messages/ack — acknowledge messages
|
|
11
|
+
* GET /api/messages/by-id/:id — get message by ID
|
|
12
|
+
* PUT /api/messages/by-id/:id — update message
|
|
13
|
+
* DELETE /api/messages — purge messages
|
|
14
|
+
* POST /api/messages/inbound — peer inbound (cross-instance)
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.createMessagingRoutes = createMessagingRoutes;
|
|
18
|
+
const express_1 = require("express");
|
|
19
|
+
const agentMailbox_js_1 = require("../../../services/messaging/agentMailbox.js");
|
|
20
|
+
const runtimeConfig_js_1 = require("../../../config/runtimeConfig.js");
|
|
21
|
+
const messagingTypes_js_1 = require("../../../services/messaging/messagingTypes.js");
|
|
22
|
+
const WebSocketManager_js_1 = require("../WebSocketManager.js");
|
|
23
|
+
const adminAuth_js_1 = require("./adminAuth.js");
|
|
24
|
+
let _mailbox = null;
|
|
25
|
+
function getMailbox() {
|
|
26
|
+
if (!_mailbox) {
|
|
27
|
+
_mailbox = new agentMailbox_js_1.AgentMailbox((0, runtimeConfig_js_1.getRuntimeConfig)().messaging);
|
|
28
|
+
}
|
|
29
|
+
return _mailbox;
|
|
30
|
+
}
|
|
31
|
+
/** Format Zod issues with field paths for actionable error messages. */
|
|
32
|
+
function formatZodIssues(issues) {
|
|
33
|
+
return issues.map(i => {
|
|
34
|
+
const field = i.path.length ? i.path.join('.') : 'body';
|
|
35
|
+
return `${field}: ${i.message}`;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const SEND_SCHEMA_HINT = {
|
|
39
|
+
required: { channel: 'string', sender: 'string', recipients: 'string[]', body: 'string' },
|
|
40
|
+
optional: { priority: 'low|normal|high|critical', ttlSeconds: 'number (1-86400)', persistent: 'boolean', payload: 'object', parentId: 'string', tags: 'string[]', requiresAck: 'boolean', ackBySeconds: 'number' },
|
|
41
|
+
};
|
|
42
|
+
function createMessagingRoutes() {
|
|
43
|
+
const router = (0, express_1.Router)();
|
|
44
|
+
// POST /api/messages — send a message
|
|
45
|
+
router.post('/messages', adminAuth_js_1.dashboardAdminAuth, (req, res) => {
|
|
46
|
+
try {
|
|
47
|
+
const parsed = messagingTypes_js_1.SendMessageOptionsSchema.safeParse(req.body);
|
|
48
|
+
if (!parsed.success) {
|
|
49
|
+
res.status(400).json({
|
|
50
|
+
success: false,
|
|
51
|
+
error: 'Invalid message payload',
|
|
52
|
+
issues: formatZodIssues(parsed.error.issues),
|
|
53
|
+
hint: 'POST /api/messages expects a JSON body with required fields: channel, sender, recipients, body',
|
|
54
|
+
schema: SEND_SCHEMA_HINT,
|
|
55
|
+
});
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const mailbox = getMailbox();
|
|
59
|
+
mailbox.send(parsed.data).then(messageId => {
|
|
60
|
+
try {
|
|
61
|
+
(0, WebSocketManager_js_1.getWebSocketManager)().broadcast({ type: 'message_received', timestamp: Date.now(), data: { messageId, channel: parsed.data.channel } });
|
|
62
|
+
}
|
|
63
|
+
catch { /* ws optional */ }
|
|
64
|
+
res.status(201).json({
|
|
65
|
+
success: true,
|
|
66
|
+
messageId,
|
|
67
|
+
channel: parsed.data.channel,
|
|
68
|
+
status: 'sent',
|
|
69
|
+
});
|
|
70
|
+
}).catch(err => {
|
|
71
|
+
console.error('[Messaging] Send failed:', err);
|
|
72
|
+
res.status(500).json({ success: false, error: 'Send failed' });
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error('[Messaging] Failed to send message:', error);
|
|
77
|
+
res.status(500).json({ success: false, error: 'Failed to send message' });
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// GET /api/messages/channels — list all channels
|
|
81
|
+
router.get('/messages/channels', (_req, res) => {
|
|
82
|
+
try {
|
|
83
|
+
const mailbox = getMailbox();
|
|
84
|
+
const channels = mailbox.listChannels();
|
|
85
|
+
res.json({ success: true, count: channels.length, channels });
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.error('[Messaging] Failed to list channels:', error);
|
|
89
|
+
res.status(500).json({ success: false, error: 'Failed to list channels' });
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
// GET /api/messages/stats — reader stats
|
|
93
|
+
router.get('/messages/stats', (req, res) => {
|
|
94
|
+
try {
|
|
95
|
+
const reader = req.query.reader || '*';
|
|
96
|
+
const mailbox = getMailbox();
|
|
97
|
+
const stats = mailbox.getStats(reader);
|
|
98
|
+
res.json({ success: true, reader, ...stats });
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
console.error('[Messaging] Failed to get stats:', error);
|
|
102
|
+
res.status(500).json({ success: false, error: 'Failed to get stats' });
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
// GET /api/messages/by-id/:id — get message by ID
|
|
106
|
+
router.get('/messages/by-id/:id', (req, res) => {
|
|
107
|
+
try {
|
|
108
|
+
const mailbox = getMailbox();
|
|
109
|
+
const message = mailbox.getMessage(req.params.id);
|
|
110
|
+
if (!message) {
|
|
111
|
+
res.status(404).json({ success: false, error: `Message not found: ${req.params.id}`, hint: 'Use GET /api/messages/channels to list channels, then GET /api/messages/:channel to browse messages' });
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
res.json({ success: true, message });
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.error('[Messaging] Failed to get message:', error);
|
|
118
|
+
res.status(500).json({ success: false, error: 'Failed to get message' });
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
// PUT /api/messages/by-id/:id — update message
|
|
122
|
+
router.put('/messages/by-id/:id', adminAuth_js_1.dashboardAdminAuth, (req, res) => {
|
|
123
|
+
try {
|
|
124
|
+
const mailbox = getMailbox();
|
|
125
|
+
const updated = mailbox.updateMessage(req.params.id, {
|
|
126
|
+
body: req.body.body,
|
|
127
|
+
recipients: req.body.recipients,
|
|
128
|
+
payload: req.body.payload,
|
|
129
|
+
persistent: req.body.persistent,
|
|
130
|
+
});
|
|
131
|
+
if (!updated) {
|
|
132
|
+
res.status(404).json({ success: false, error: `Message not found: ${req.params.id}`, hint: 'Use GET /api/messages/by-id/:id to verify the message exists before updating' });
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
(0, WebSocketManager_js_1.getWebSocketManager)().broadcast({ type: 'message_received', timestamp: Date.now(), data: { messageId: req.params.id } });
|
|
137
|
+
}
|
|
138
|
+
catch { /* ws optional */ }
|
|
139
|
+
res.json({ success: true, message: updated });
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
console.error('[Messaging] Failed to update message:', error);
|
|
143
|
+
res.status(500).json({ success: false, error: 'Failed to update message' });
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
// GET /api/messages/thread/:parentId — get full thread
|
|
147
|
+
router.get('/messages/thread/:parentId', (req, res) => {
|
|
148
|
+
try {
|
|
149
|
+
const parentId = decodeURIComponent(req.params.parentId);
|
|
150
|
+
const mailbox = getMailbox();
|
|
151
|
+
const thread = mailbox.getThread(parentId);
|
|
152
|
+
if (!thread || thread.length === 0) {
|
|
153
|
+
res.status(404).json({ success: false, error: `No thread found for parentId: ${parentId}` });
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
res.json({ success: true, parentId, count: thread.length, messages: thread });
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.error('[Messaging] Failed to get thread:', error);
|
|
160
|
+
res.status(500).json({ success: false, error: 'Failed to get thread' });
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
// GET /api/messages/:channel — read messages from channel
|
|
164
|
+
router.get('/messages/:channel', (req, res) => {
|
|
165
|
+
try {
|
|
166
|
+
const channel = decodeURIComponent(req.params.channel);
|
|
167
|
+
const reader = req.query.reader || '*';
|
|
168
|
+
const unreadOnly = req.query.unreadOnly === 'true';
|
|
169
|
+
const limit = req.query.limit ? parseInt(req.query.limit, 10) : undefined;
|
|
170
|
+
const markRead = req.query.markRead === 'true';
|
|
171
|
+
const tags = req.query.tags ? req.query.tags.split(',').map(t => t.trim()).filter(Boolean) : undefined;
|
|
172
|
+
const sender = req.query.sender || undefined;
|
|
173
|
+
const mailbox = getMailbox();
|
|
174
|
+
const messages = mailbox.read({ channel, reader, unreadOnly, limit, markRead, tags, sender });
|
|
175
|
+
res.json({ success: true, channel, reader, count: messages.length, messages });
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
console.error('[Messaging] Failed to read messages:', error);
|
|
179
|
+
res.status(500).json({ success: false, error: 'Failed to read messages' });
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
// POST /api/messages/ack — acknowledge messages
|
|
183
|
+
router.post('/messages/ack', adminAuth_js_1.dashboardAdminAuth, (req, res) => {
|
|
184
|
+
try {
|
|
185
|
+
const { messageIds, reader } = req.body;
|
|
186
|
+
if (!Array.isArray(messageIds) || !reader) {
|
|
187
|
+
res.status(400).json({
|
|
188
|
+
success: false,
|
|
189
|
+
error: 'Invalid ack request',
|
|
190
|
+
issues: [
|
|
191
|
+
...(!Array.isArray(messageIds) ? ['messageIds: must be a non-empty array of message ID strings'] : []),
|
|
192
|
+
...(!reader ? ['reader: must be a non-empty string identifying the acknowledging agent'] : []),
|
|
193
|
+
],
|
|
194
|
+
hint: 'POST /api/messages/ack expects { "messageIds": ["msg-..."], "reader": "agent-name" }',
|
|
195
|
+
});
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const mailbox = getMailbox();
|
|
199
|
+
const acknowledged = mailbox.ack(messageIds, reader);
|
|
200
|
+
res.json({ success: true, acknowledged, reader });
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
console.error('[Messaging] Failed to acknowledge messages:', error);
|
|
204
|
+
res.status(500).json({ success: false, error: 'Failed to acknowledge messages' });
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
// DELETE /api/messages — purge messages
|
|
208
|
+
router.delete('/messages', adminAuth_js_1.dashboardAdminAuth, (req, res) => {
|
|
209
|
+
try {
|
|
210
|
+
const mailbox = getMailbox();
|
|
211
|
+
let removed;
|
|
212
|
+
let action = 'purge_all';
|
|
213
|
+
if (req.body?.messageIds?.length) {
|
|
214
|
+
removed = mailbox.deleteMessages(req.body.messageIds);
|
|
215
|
+
action = 'delete_by_ids';
|
|
216
|
+
}
|
|
217
|
+
else if (req.body?.channel) {
|
|
218
|
+
removed = mailbox.purgeChannel(req.body.channel);
|
|
219
|
+
action = 'purge_channel';
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
removed = mailbox.purgeAll();
|
|
223
|
+
action = 'purge_all';
|
|
224
|
+
}
|
|
225
|
+
try {
|
|
226
|
+
(0, WebSocketManager_js_1.getWebSocketManager)().broadcast({ type: 'message_purged', timestamp: Date.now(), data: { count: removed } });
|
|
227
|
+
}
|
|
228
|
+
catch { /* ws optional */ }
|
|
229
|
+
res.json({ success: true, action, purged: removed });
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
console.error('[Messaging] Failed to purge messages:', error);
|
|
233
|
+
res.status(500).json({ success: false, error: 'Failed to purge messages' });
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
// POST /api/messages/inbound — receive message from peer instance
|
|
237
|
+
router.post('/messages/inbound', adminAuth_js_1.dashboardAdminAuth, (req, res) => {
|
|
238
|
+
try {
|
|
239
|
+
if (!req.body || !req.body.id || !req.body.channel) {
|
|
240
|
+
res.status(400).json({
|
|
241
|
+
success: false,
|
|
242
|
+
error: 'Invalid inbound message',
|
|
243
|
+
issues: [
|
|
244
|
+
...(!req.body?.id ? ['id: required — unique message identifier'] : []),
|
|
245
|
+
...(!req.body?.channel ? ['channel: required — target channel name'] : []),
|
|
246
|
+
],
|
|
247
|
+
hint: 'POST /api/messages/inbound expects { "id": "...", "channel": "...", "sender": "...", "body": "..." }',
|
|
248
|
+
});
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
const mailbox = getMailbox();
|
|
252
|
+
mailbox.send({
|
|
253
|
+
channel: req.body.channel,
|
|
254
|
+
sender: req.body.sender || 'peer',
|
|
255
|
+
recipients: req.body.recipients || ['*'],
|
|
256
|
+
body: req.body.body || '',
|
|
257
|
+
ttlSeconds: req.body.ttlSeconds,
|
|
258
|
+
persistent: req.body.persistent,
|
|
259
|
+
payload: req.body.payload,
|
|
260
|
+
priority: req.body.priority,
|
|
261
|
+
parentId: req.body.parentId,
|
|
262
|
+
tags: req.body.tags,
|
|
263
|
+
}).then(() => {
|
|
264
|
+
try {
|
|
265
|
+
(0, WebSocketManager_js_1.getWebSocketManager)().broadcast({ type: 'message_received', timestamp: Date.now(), data: { channel: req.body.channel } });
|
|
266
|
+
}
|
|
267
|
+
catch { /* ws optional */ }
|
|
268
|
+
res.json({ success: true, status: 'received' });
|
|
269
|
+
}).catch(err => {
|
|
270
|
+
console.error('[Messaging] Inbound failed:', err);
|
|
271
|
+
res.status(500).json({ success: false, error: 'Inbound failed' });
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
console.error('[Messaging] Failed to process inbound message:', error);
|
|
276
|
+
res.status(500).json({ success: false, error: 'Failed to process inbound message' });
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
// POST /api/messages/reply — reply to a message
|
|
280
|
+
router.post('/messages/reply', adminAuth_js_1.dashboardAdminAuth, async (req, res) => {
|
|
281
|
+
try {
|
|
282
|
+
const { parentId, sender, body, replyAll, recipients, priority, tags, persistent, payload } = req.body || {};
|
|
283
|
+
if (!parentId || !sender || !body) {
|
|
284
|
+
res.status(400).json({
|
|
285
|
+
success: false,
|
|
286
|
+
error: 'Missing required fields: parentId, sender, body',
|
|
287
|
+
hint: 'POST /api/messages/reply expects { "parentId": "...", "sender": "...", "body": "...", "replyAll": false }',
|
|
288
|
+
});
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
const mailbox = getMailbox();
|
|
292
|
+
const result = await mailbox.reply(parentId, sender, body, { replyAll, recipients, priority, tags, persistent, payload });
|
|
293
|
+
try {
|
|
294
|
+
(0, WebSocketManager_js_1.getWebSocketManager)().broadcast({ type: 'message_received', timestamp: Date.now(), data: { channel: result.channel } });
|
|
295
|
+
}
|
|
296
|
+
catch { /* ws optional */ }
|
|
297
|
+
res.json({ success: true, message: result });
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
console.error('[Messaging] Failed to reply to message:', error);
|
|
301
|
+
const isNotFound = error instanceof Error && error.message.includes('not found');
|
|
302
|
+
const status = isNotFound ? 404 : 500;
|
|
303
|
+
res.status(status).json({ success: false, error: isNotFound ? 'Parent message not found' : 'Failed to reply to message' });
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
return router;
|
|
307
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics & Analytics Routes
|
|
3
|
+
* Routes: GET /metrics, GET /metrics/history, GET /tools, GET /tools/:toolName,
|
|
4
|
+
* GET /performance, GET /performance/detailed, GET /realtime,
|
|
5
|
+
* GET /streaming/data, GET /charts/tool-usage, GET /charts/performance,
|
|
6
|
+
* GET /charts/timerange, GET /charts/export, GET /analytics/advanced
|
|
7
|
+
*/
|
|
8
|
+
import { Router } from 'express';
|
|
9
|
+
import { MetricsCollector } from '../MetricsCollector.js';
|
|
10
|
+
export declare function createMetricsRoutes(metricsCollector: MetricsCollector): Router;
|