@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,229 @@
|
|
|
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.renderPanelMarkdownHtml = renderPanelMarkdownHtml;
|
|
11
|
+
exports.mountDashboardRoutes = mountDashboardRoutes;
|
|
12
|
+
const promises_1 = require("fs/promises");
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
const ApiRoutes_js_1 = require("../ApiRoutes.js");
|
|
15
|
+
const legacyDashboardHtml_js_1 = require("../legacyDashboardHtml.js");
|
|
16
|
+
const registry_js_1 = require("../../../server/registry.js");
|
|
17
|
+
var status_routes_js_1 = require("./status.routes.js");
|
|
18
|
+
Object.defineProperty(exports, "createStatusRoutes", { enumerable: true, get: function () { return status_routes_js_1.createStatusRoutes; } });
|
|
19
|
+
var metrics_routes_js_1 = require("./metrics.routes.js");
|
|
20
|
+
Object.defineProperty(exports, "createMetricsRoutes", { enumerable: true, get: function () { return metrics_routes_js_1.createMetricsRoutes; } });
|
|
21
|
+
var admin_routes_js_1 = require("./admin.routes.js");
|
|
22
|
+
Object.defineProperty(exports, "createAdminRoutes", { enumerable: true, get: function () { return admin_routes_js_1.createAdminRoutes; } });
|
|
23
|
+
var graph_routes_js_1 = require("./graph.routes.js");
|
|
24
|
+
Object.defineProperty(exports, "createGraphRoutes", { enumerable: true, get: function () { return graph_routes_js_1.createGraphRoutes; } });
|
|
25
|
+
var instructions_routes_js_1 = require("./instructions.routes.js");
|
|
26
|
+
Object.defineProperty(exports, "createInstructionsRoutes", { enumerable: true, get: function () { return instructions_routes_js_1.createInstructionsRoutes; } });
|
|
27
|
+
var knowledge_routes_js_1 = require("./knowledge.routes.js");
|
|
28
|
+
Object.defineProperty(exports, "createKnowledgeRoutes", { enumerable: true, get: function () { return knowledge_routes_js_1.createKnowledgeRoutes; } });
|
|
29
|
+
var alerts_routes_js_1 = require("./alerts.routes.js");
|
|
30
|
+
Object.defineProperty(exports, "createAlertsRoutes", { enumerable: true, get: function () { return alerts_routes_js_1.createAlertsRoutes; } });
|
|
31
|
+
var logs_routes_js_1 = require("./logs.routes.js");
|
|
32
|
+
Object.defineProperty(exports, "createLogsRoutes", { enumerable: true, get: function () { return logs_routes_js_1.createLogsRoutes; } });
|
|
33
|
+
var synthetic_routes_js_1 = require("./synthetic.routes.js");
|
|
34
|
+
Object.defineProperty(exports, "createSyntheticRoutes", { enumerable: true, get: function () { return synthetic_routes_js_1.createSyntheticRoutes; } });
|
|
35
|
+
var instances_routes_js_1 = require("./instances.routes.js");
|
|
36
|
+
Object.defineProperty(exports, "createInstancesRoutes", { enumerable: true, get: function () { return instances_routes_js_1.createInstancesRoutes; } });
|
|
37
|
+
var tools_routes_js_1 = require("./tools.routes.js");
|
|
38
|
+
Object.defineProperty(exports, "createToolsRoutes", { enumerable: true, get: function () { return tools_routes_js_1.createToolsRoutes; } });
|
|
39
|
+
var embeddings_routes_js_1 = require("./embeddings.routes.js");
|
|
40
|
+
Object.defineProperty(exports, "createEmbeddingsRoutes", { enumerable: true, get: function () { return embeddings_routes_js_1.createEmbeddingsRoutes; } });
|
|
41
|
+
var usage_routes_js_1 = require("./usage.routes.js");
|
|
42
|
+
Object.defineProperty(exports, "createUsageRoutes", { enumerable: true, get: function () { return usage_routes_js_1.createUsageRoutes; } });
|
|
43
|
+
var scripts_routes_js_1 = require("./scripts.routes.js");
|
|
44
|
+
Object.defineProperty(exports, "createScriptsRoutes", { enumerable: true, get: function () { return scripts_routes_js_1.createScriptsRoutes; } });
|
|
45
|
+
var messaging_routes_js_1 = require("./messaging.routes.js");
|
|
46
|
+
Object.defineProperty(exports, "createMessagingRoutes", { enumerable: true, get: function () { return messaging_routes_js_1.createMessagingRoutes; } });
|
|
47
|
+
var sqlite_routes_js_1 = require("./sqlite.routes.js");
|
|
48
|
+
Object.defineProperty(exports, "createSqliteRoutes", { enumerable: true, get: function () { return sqlite_routes_js_1.createSqliteRoutes; } });
|
|
49
|
+
function escapeHtml(value) {
|
|
50
|
+
return value
|
|
51
|
+
.replace(/&/g, '&')
|
|
52
|
+
.replace(/</g, '<')
|
|
53
|
+
.replace(/>/g, '>')
|
|
54
|
+
.replace(/"/g, '"')
|
|
55
|
+
.replace(/'/g, ''');
|
|
56
|
+
}
|
|
57
|
+
function sanitizeDocUrl(rawUrl, allowDataImage = false) {
|
|
58
|
+
const url = rawUrl.trim();
|
|
59
|
+
if (!url)
|
|
60
|
+
return '#';
|
|
61
|
+
if (/^(https?:\/\/|\/|\.\/|\.\.\/|#)/i.test(url))
|
|
62
|
+
return url;
|
|
63
|
+
if (allowDataImage && /^data:image\//i.test(url))
|
|
64
|
+
return url;
|
|
65
|
+
return '#';
|
|
66
|
+
}
|
|
67
|
+
function renderPanelMarkdownHtml(name, markdown) {
|
|
68
|
+
const bodyHtml = escapeHtml(markdown)
|
|
69
|
+
.replace(/^### (.+)$/gm, '<h3>$1</h3>')
|
|
70
|
+
.replace(/^## (.+)$/gm, '<h2>$1</h2>')
|
|
71
|
+
.replace(/^# (.+)$/gm, '<h1>$1</h1>')
|
|
72
|
+
.replace(/^---$/gm, '<hr>')
|
|
73
|
+
.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>')
|
|
74
|
+
.replace(/`([^`]+)`/g, '<code>$1</code>')
|
|
75
|
+
.replace(/!\[([^\]]*)\]\(([^)]+)\)/g, (_m, alt, url) => {
|
|
76
|
+
const safeUrl = sanitizeDocUrl(url, true);
|
|
77
|
+
const safeAlt = alt;
|
|
78
|
+
return `<img src="${safeUrl}" alt="${safeAlt}" style="max-width:100%;border-radius:8px;border:1px solid #1f2a3a;margin:12px 0;">`;
|
|
79
|
+
})
|
|
80
|
+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_m, label, url) => {
|
|
81
|
+
const safeUrl = sanitizeDocUrl(url);
|
|
82
|
+
return `<a href="${safeUrl}" target="_blank" rel="noopener">${label}</a>`;
|
|
83
|
+
})
|
|
84
|
+
.replace(/^\| (.+) \|$/gm, (_m, row) => {
|
|
85
|
+
const cells = row.split('|').map((c) => c.trim());
|
|
86
|
+
return '<tr>' + cells.map((c) => `<td>${c}</td>`).join('') + '</tr>';
|
|
87
|
+
})
|
|
88
|
+
.replace(/^\|[-| ]+\|$/gm, '')
|
|
89
|
+
.replace(/((?:<tr>.*<\/tr>\n?)+)/g, '<table>$1</table>')
|
|
90
|
+
.replace(/^- (.+)$/gm, '<li>$1</li>')
|
|
91
|
+
.replace(/((?:<li>.*<\/li>\n?)+)/g, '<ul>$1</ul>')
|
|
92
|
+
.replace(/\n{2,}/g, '\n<br>\n');
|
|
93
|
+
return `<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>${escapeHtml(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>`;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Registers all top-level dashboard routes on the given Express app.
|
|
97
|
+
* Called once during DashboardServer construction after middleware is set up.
|
|
98
|
+
*/
|
|
99
|
+
function mountDashboardRoutes(app, ctx) {
|
|
100
|
+
// Redirect root to admin panel (v2 dashboard)
|
|
101
|
+
app.get('/', (_req, res) => {
|
|
102
|
+
res.redirect('/admin');
|
|
103
|
+
});
|
|
104
|
+
// Legacy v1 dashboard (kept for backward compatibility)
|
|
105
|
+
app.get('/legacy', (_req, res) => {
|
|
106
|
+
const nonce = res.locals.cspNonce;
|
|
107
|
+
const snapshot = ctx.metricsCollector.getCurrentSnapshot();
|
|
108
|
+
const serverInfo = ctx.getServerInfo();
|
|
109
|
+
const webSocketUrl = ctx.enableWebSockets && serverInfo
|
|
110
|
+
? `${ctx.wsProtocol}://${serverInfo.host}:${serverInfo.port}/ws`
|
|
111
|
+
: null;
|
|
112
|
+
res.send((0, legacyDashboardHtml_js_1.generateDashboardHtml)(nonce, snapshot, webSocketUrl));
|
|
113
|
+
});
|
|
114
|
+
// Admin Panel (v2 dashboard — primary UI)
|
|
115
|
+
app.get('/admin', async (_req, res) => {
|
|
116
|
+
try {
|
|
117
|
+
// __dirname here is src/dashboard/server/routes — step up two levels to reach client/
|
|
118
|
+
const adminHtmlPath = path_1.default.join(__dirname, '..', '..', 'client', 'admin.html');
|
|
119
|
+
let adminHtml = await (0, promises_1.readFile)(adminHtmlPath, 'utf-8');
|
|
120
|
+
if (!ctx.graphEnabled) {
|
|
121
|
+
adminHtml = (0, legacyDashboardHtml_js_1.stripGraphTab)(adminHtml);
|
|
122
|
+
}
|
|
123
|
+
const nonce = res.locals.cspNonce;
|
|
124
|
+
adminHtml = adminHtml.replace(/<script>/g, `<script nonce="${nonce}">`); // lgtm[js/bad-tag-filter] — nonce is crypto-generated
|
|
125
|
+
adminHtml = adminHtml.replace(/<script defer /g, `<script nonce="${nonce}" defer `);
|
|
126
|
+
res.type('html').send(adminHtml);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
// eslint-disable-next-line no-console
|
|
130
|
+
console.error('[Dashboard] Admin panel load error:', error);
|
|
131
|
+
res.status(500).send('<h1>500 - Admin Panel Error</h1><p>Failed to load admin panel</p>');
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
// Health check
|
|
135
|
+
app.get('/health', (_req, res) => {
|
|
136
|
+
const snapshot = ctx.metricsCollector.getCurrentSnapshot();
|
|
137
|
+
res.json({
|
|
138
|
+
status: 'healthy',
|
|
139
|
+
timestamp: Date.now(),
|
|
140
|
+
uptime: snapshot.server.uptime,
|
|
141
|
+
version: snapshot.server.version,
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
// Panel documentation — serves markdown rendered as styled HTML
|
|
145
|
+
app.get('/api/docs/:name', async (req, res) => {
|
|
146
|
+
const name = req.params.name.replace(/[^a-z0-9_-]/gi, '');
|
|
147
|
+
if (!name) {
|
|
148
|
+
res.status(400).send('Invalid doc name');
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const docsDir = path_1.default.resolve(__dirname, '..', '..', '..', '..', 'docs', 'panels');
|
|
152
|
+
const docPath = path_1.default.resolve(docsDir, `${name}.md`); // lgtm[js/path-injection] — startsWith guard on next line
|
|
153
|
+
// Security: verify resolved path stays inside the allowed docs directory
|
|
154
|
+
if (!docPath.startsWith(docsDir + path_1.default.sep) && docPath !== docsDir) {
|
|
155
|
+
res.status(400).send('Invalid doc name');
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
const md = await (0, promises_1.readFile)(docPath, 'utf-8');
|
|
160
|
+
res.type('html').send(renderPanelMarkdownHtml(name, md));
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
res.status(404).send('<h1>404</h1><p>Panel documentation not found.</p><p><a href="/admin">Back to Admin</a></p>');
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
// Panel screenshot — serves PNG images from docs/screenshots/
|
|
167
|
+
app.get('/api/screenshots/:name', async (req, res) => {
|
|
168
|
+
const fileName = req.params.name.replace(/[^a-z0-9._-]/gi, '');
|
|
169
|
+
if (!fileName || !fileName.endsWith('.png')) {
|
|
170
|
+
res.status(400).send('Invalid');
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const screenshotsDir = path_1.default.resolve(__dirname, '..', '..', '..', '..', 'docs', 'screenshots');
|
|
174
|
+
const filePath = path_1.default.resolve(screenshotsDir, fileName);
|
|
175
|
+
// Security: verify resolved path stays inside the allowed screenshots directory
|
|
176
|
+
if (!filePath.startsWith(screenshotsDir + path_1.default.sep)) {
|
|
177
|
+
res.status(400).send('Invalid path');
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
const data = await (0, promises_1.readFile)(filePath);
|
|
182
|
+
res.setHeader('Content-Type', 'image/png');
|
|
183
|
+
res.setHeader('Cache-Control', 'public, max-age=3600');
|
|
184
|
+
res.send(data);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
res.status(404).send('Screenshot not found');
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
// API sub-routes (mounted at /api)
|
|
191
|
+
app.use('/api', (0, ApiRoutes_js_1.createApiRoutes)({ enableCors: ctx.enableCors, rateLimit: { windowMs: 60_000, max: 100 } }));
|
|
192
|
+
// Back-compat: legacy tests expect /tools.json at dashboard root
|
|
193
|
+
app.get('/tools.json', (_req, res) => {
|
|
194
|
+
try {
|
|
195
|
+
const tools = (0, registry_js_1.listRegisteredMethods)();
|
|
196
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
197
|
+
const toolMetrics = ctx.metricsCollector.getToolMetrics();
|
|
198
|
+
const enrichedTools = tools.map(toolName => ({
|
|
199
|
+
name: toolName,
|
|
200
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
201
|
+
metrics: toolMetrics[toolName] || {
|
|
202
|
+
callCount: 0,
|
|
203
|
+
successCount: 0,
|
|
204
|
+
errorCount: 0,
|
|
205
|
+
totalResponseTime: 0,
|
|
206
|
+
errorTypes: {},
|
|
207
|
+
},
|
|
208
|
+
}));
|
|
209
|
+
res.json({ tools: enrichedTools, totalTools: tools.length, timestamp: Date.now(), legacy: true });
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
// eslint-disable-next-line no-console
|
|
213
|
+
console.error('[Dashboard] /tools.json route error:', error);
|
|
214
|
+
res.status(500).json({ error: 'Failed to get tools list' });
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
// WebSocket connection info
|
|
218
|
+
app.get('/ws-info', (_req, res) => {
|
|
219
|
+
const serverInfo = ctx.getServerInfo();
|
|
220
|
+
res.json({
|
|
221
|
+
enabled: ctx.enableWebSockets,
|
|
222
|
+
url: serverInfo ? `${ctx.wsProtocol}://${serverInfo.host}:${serverInfo.port}/ws` : null,
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
// 404 fallback
|
|
226
|
+
app.use((_req, res) => {
|
|
227
|
+
res.status(404).send('<h1>404 - Page Not Found</h1><p>Return to <a href="/">Dashboard</a></p>');
|
|
228
|
+
});
|
|
229
|
+
}
|
|
@@ -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
|
+
console.error('[API] Failed to list instances:', error);
|
|
28
|
+
res.status(500).json({
|
|
29
|
+
error: 'Failed to list instances',
|
|
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;
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Instructions Management Routes
|
|
4
|
+
* Routes: GET /instructions, GET /instructions_search, GET /instructions_categories,
|
|
5
|
+
* GET /instructions/:name, POST /instructions, PUT /instructions/:name,
|
|
6
|
+
* DELETE /instructions/:name
|
|
7
|
+
*/
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.createInstructionsRoutes = createInstructionsRoutes;
|
|
13
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
14
|
+
const express_1 = require("express");
|
|
15
|
+
const registry_js_1 = require("../../../server/registry.js");
|
|
16
|
+
const indexContext_js_1 = require("../../../services/indexContext.js");
|
|
17
|
+
const adminAuth_js_1 = require("./adminAuth.js");
|
|
18
|
+
const handlers_search_js_1 = require("../../../services/handlers.search.js");
|
|
19
|
+
/** Sanitize an instruction name with defense-in-depth path-traversal guard. */
|
|
20
|
+
function safeName(name) {
|
|
21
|
+
const sanitized = String(name).replace(/[^a-zA-Z0-9-_]/g, '-');
|
|
22
|
+
// Defense-in-depth: verify the resolved path stays inside the instructions directory
|
|
23
|
+
const base = (0, indexContext_js_1.getInstructionsDir)();
|
|
24
|
+
const resolved = node_path_1.default.resolve(base, `${sanitized}.json`);
|
|
25
|
+
const normalized = node_path_1.default.normalize(resolved);
|
|
26
|
+
if (!normalized.startsWith(node_path_1.default.normalize(base) + node_path_1.default.sep) && normalized !== node_path_1.default.normalize(base)) {
|
|
27
|
+
throw new Error('Path traversal detected');
|
|
28
|
+
}
|
|
29
|
+
return sanitized;
|
|
30
|
+
}
|
|
31
|
+
function createInstructionsRoutes() {
|
|
32
|
+
const router = (0, express_1.Router)();
|
|
33
|
+
const buildSnippet = (parts, query) => {
|
|
34
|
+
const source = parts.filter((part) => typeof part === 'string' && part.trim().length > 0).join('\n');
|
|
35
|
+
if (!source)
|
|
36
|
+
return '';
|
|
37
|
+
const snippetWindow = 120;
|
|
38
|
+
const lowerSource = source.toLowerCase();
|
|
39
|
+
const lowerQuery = query.toLowerCase();
|
|
40
|
+
const matchIndex = lowerSource.indexOf(lowerQuery);
|
|
41
|
+
const start = matchIndex === -1 ? 0 : Math.max(0, matchIndex - snippetWindow);
|
|
42
|
+
const end = matchIndex === -1 ? Math.min(source.length, 240) : Math.min(source.length, matchIndex + lowerQuery.length + snippetWindow);
|
|
43
|
+
let snippet = source.slice(start, end).replace(/\s+/g, ' ').trim();
|
|
44
|
+
if (!snippet)
|
|
45
|
+
return '';
|
|
46
|
+
if (matchIndex !== -1) {
|
|
47
|
+
snippet = snippet.replace(new RegExp(query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i'), match => `**${match}**`);
|
|
48
|
+
}
|
|
49
|
+
return snippet;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* GET /api/instructions - list all instructions from the store
|
|
53
|
+
*/
|
|
54
|
+
router.get('/instructions', (_req, res) => {
|
|
55
|
+
try {
|
|
56
|
+
const st = res.locals.indexState;
|
|
57
|
+
const instructions = st.list.map((entry) => {
|
|
58
|
+
const bodyStr = typeof entry.body === 'string' ? entry.body : '';
|
|
59
|
+
const bodySize = Buffer.byteLength(bodyStr, 'utf8');
|
|
60
|
+
const sizeCategory = bodySize < 1024 ? 'small' : (bodySize < 5 * 1024 ? 'medium' : 'large');
|
|
61
|
+
const cats = Array.isArray(entry.categories) ? entry.categories : [];
|
|
62
|
+
const primaryCategory = cats.length > 0 ? cats[0] : 'general';
|
|
63
|
+
let semanticSummary;
|
|
64
|
+
const desc = entry.description;
|
|
65
|
+
if (typeof desc === 'string' && desc.trim()) {
|
|
66
|
+
semanticSummary = desc.trim();
|
|
67
|
+
}
|
|
68
|
+
else if (bodyStr.trim()) {
|
|
69
|
+
const firstLine = bodyStr.split(/\r?\n/).map((l) => l.trim()).filter(Boolean)[0];
|
|
70
|
+
if (firstLine)
|
|
71
|
+
semanticSummary = firstLine;
|
|
72
|
+
}
|
|
73
|
+
if (semanticSummary && semanticSummary.length > 400)
|
|
74
|
+
semanticSummary = semanticSummary.slice(0, 400) + '…';
|
|
75
|
+
return {
|
|
76
|
+
name: entry.id,
|
|
77
|
+
size: bodySize,
|
|
78
|
+
mtime: entry.updatedAt ? new Date(entry.updatedAt).getTime() : Date.now(),
|
|
79
|
+
category: primaryCategory,
|
|
80
|
+
categories: cats.length ? cats : [primaryCategory],
|
|
81
|
+
sizeCategory,
|
|
82
|
+
semanticSummary,
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
res.json({ success: true, instructions, count: instructions.length, timestamp: Date.now() });
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.error('[API] Failed to list instructions:', error);
|
|
89
|
+
res.status(500).json({ success: false, error: 'Failed to list instructions' });
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
/**
|
|
93
|
+
* GET /api/instructions_search?q=term&limit=20
|
|
94
|
+
*/
|
|
95
|
+
router.get('/instructions_search', async (req, res) => {
|
|
96
|
+
try {
|
|
97
|
+
const qRaw = String(req.query.q || '').trim();
|
|
98
|
+
const query = qRaw.slice(0, 256);
|
|
99
|
+
const limitRaw = parseInt(String(req.query.limit || '20'), 10);
|
|
100
|
+
const limit = Math.min(100, Math.max(1, isNaN(limitRaw) ? 20 : limitRaw));
|
|
101
|
+
if (!query || query.length < 2) {
|
|
102
|
+
return res.json({ success: true, query, count: 0, results: [], note: 'query_too_short' });
|
|
103
|
+
}
|
|
104
|
+
const searchResult = await (0, handlers_search_js_1.handleInstructionsSearch)({
|
|
105
|
+
keywords: [query],
|
|
106
|
+
limit,
|
|
107
|
+
includeCategories: true,
|
|
108
|
+
});
|
|
109
|
+
const state = res.locals.indexState;
|
|
110
|
+
const results = [];
|
|
111
|
+
for (const match of searchResult.results) {
|
|
112
|
+
try {
|
|
113
|
+
const entry = state.byId.get(match.instructionId);
|
|
114
|
+
if (!entry)
|
|
115
|
+
continue;
|
|
116
|
+
const bodyStr = typeof entry.body === 'string' ? entry.body : '';
|
|
117
|
+
const snippet = buildSnippet([
|
|
118
|
+
entry.id,
|
|
119
|
+
entry.title,
|
|
120
|
+
entry.semanticSummary,
|
|
121
|
+
entry.categories.join(' '),
|
|
122
|
+
entry.body,
|
|
123
|
+
], query);
|
|
124
|
+
results.push({
|
|
125
|
+
name: entry.id,
|
|
126
|
+
categories: entry.categories.slice(0, 10),
|
|
127
|
+
size: Buffer.byteLength(bodyStr, 'utf8'),
|
|
128
|
+
mtime: entry.updatedAt ? new Date(entry.updatedAt).getTime() : Date.now(),
|
|
129
|
+
snippet,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
catch { /* skip file on error */ }
|
|
133
|
+
}
|
|
134
|
+
res.json({ success: true, query, count: results.length, results, timestamp: Date.now() });
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
console.error('[API] instructions search error:', error);
|
|
138
|
+
res.status(500).json({ success: false, error: 'search_failed' });
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
/**
|
|
142
|
+
* GET /api/instructions_categories - get dynamic categories from actual instructions
|
|
143
|
+
*/
|
|
144
|
+
router.get('/instructions_categories', async (_req, res) => {
|
|
145
|
+
try {
|
|
146
|
+
const instructionHandler = (0, registry_js_1.getLocalHandler)('index_dispatch');
|
|
147
|
+
if (!instructionHandler) {
|
|
148
|
+
return res.status(500).json({ success: false, error: 'Instruction handler not available' });
|
|
149
|
+
}
|
|
150
|
+
const result = await instructionHandler({
|
|
151
|
+
action: 'categories'
|
|
152
|
+
});
|
|
153
|
+
res.json({
|
|
154
|
+
success: true,
|
|
155
|
+
categories: result?.categories || [],
|
|
156
|
+
count: result?.count || 0,
|
|
157
|
+
timestamp: Date.now()
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
console.error('[API] Failed to get categories:', error);
|
|
162
|
+
res.status(500).json({
|
|
163
|
+
success: false,
|
|
164
|
+
error: 'Failed to get categories',
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
/**
|
|
169
|
+
* GET /api/instructions/:name - get single instruction content
|
|
170
|
+
*/
|
|
171
|
+
router.get('/instructions/:name', (req, res) => {
|
|
172
|
+
try {
|
|
173
|
+
const id = safeName(req.params.name);
|
|
174
|
+
const st = res.locals.indexState;
|
|
175
|
+
const entry = st.byId.get(id);
|
|
176
|
+
if (!entry)
|
|
177
|
+
return res.status(404).json({ success: false, error: 'Not found' });
|
|
178
|
+
res.json({ success: true, content: entry, timestamp: Date.now() });
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
console.error('[API] Failed to load instruction:', error);
|
|
182
|
+
res.status(500).json({ success: false, error: 'Failed to load instruction' });
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
/**
|
|
186
|
+
* POST /api/instructions - create new instruction
|
|
187
|
+
* body: { name, content }
|
|
188
|
+
*/
|
|
189
|
+
router.post('/instructions', adminAuth_js_1.dashboardAdminAuth, (req, res) => {
|
|
190
|
+
try {
|
|
191
|
+
const { name, content } = req.body || {};
|
|
192
|
+
if (!name || !content)
|
|
193
|
+
return res.status(400).json({ success: false, error: 'Missing name or content' });
|
|
194
|
+
const id = safeName(name);
|
|
195
|
+
const st = res.locals.indexState;
|
|
196
|
+
if (st.byId.has(id))
|
|
197
|
+
return res.status(409).json({ success: false, error: 'Instruction already exists' });
|
|
198
|
+
const entry = {
|
|
199
|
+
...(typeof content === 'object' && content !== null ? content : {}),
|
|
200
|
+
id,
|
|
201
|
+
title: (content && typeof content === 'object' ? content.title : undefined) || id,
|
|
202
|
+
body: (content && typeof content === 'object' ? content.body : undefined) || (typeof content === 'string' ? content : ''),
|
|
203
|
+
createdAt: new Date().toISOString(),
|
|
204
|
+
updatedAt: new Date().toISOString(),
|
|
205
|
+
};
|
|
206
|
+
(0, indexContext_js_1.writeEntry)(entry); // lgtm[js/http-to-file-access] — writes to config-controlled instructions directory
|
|
207
|
+
(0, indexContext_js_1.touchIndexVersion)();
|
|
208
|
+
(0, indexContext_js_1.invalidate)();
|
|
209
|
+
(0, indexContext_js_1.ensureLoaded)();
|
|
210
|
+
res.json({ success: true, message: 'Instruction created', name: id, timestamp: Date.now() });
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
console.error('[API] Failed to create instruction:', error);
|
|
214
|
+
res.status(500).json({ success: false, error: 'Failed to create instruction' });
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
/**
|
|
218
|
+
* PUT /api/instructions/:name - update existing instruction
|
|
219
|
+
*/
|
|
220
|
+
router.put('/instructions/:name', adminAuth_js_1.dashboardAdminAuth, (req, res) => {
|
|
221
|
+
try {
|
|
222
|
+
const { content } = req.body || {};
|
|
223
|
+
const id = safeName(req.params.name);
|
|
224
|
+
if (!content)
|
|
225
|
+
return res.status(400).json({ success: false, error: 'Missing content' });
|
|
226
|
+
const st = res.locals.indexState;
|
|
227
|
+
const existing = st.byId.get(id);
|
|
228
|
+
if (!existing)
|
|
229
|
+
return res.status(404).json({ success: false, error: 'Not found' });
|
|
230
|
+
const updated = {
|
|
231
|
+
...existing,
|
|
232
|
+
...(typeof content === 'object' && content !== null ? content : {}),
|
|
233
|
+
id, // preserve id
|
|
234
|
+
updatedAt: new Date().toISOString(),
|
|
235
|
+
};
|
|
236
|
+
(0, indexContext_js_1.writeEntry)(updated); // lgtm[js/http-to-file-access] — writes to config-controlled instructions directory
|
|
237
|
+
(0, indexContext_js_1.touchIndexVersion)();
|
|
238
|
+
(0, indexContext_js_1.invalidate)();
|
|
239
|
+
(0, indexContext_js_1.ensureLoaded)();
|
|
240
|
+
res.json({ success: true, message: 'Instruction updated', timestamp: Date.now() });
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
console.error('[API] Failed to update instruction:', error);
|
|
244
|
+
res.status(500).json({ success: false, error: 'Failed to update instruction' });
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
/**
|
|
248
|
+
* DELETE /api/instructions/:name - delete instruction
|
|
249
|
+
*/
|
|
250
|
+
router.delete('/instructions/:name', adminAuth_js_1.dashboardAdminAuth, (req, res) => {
|
|
251
|
+
try {
|
|
252
|
+
const id = safeName(req.params.name);
|
|
253
|
+
const st = res.locals.indexState;
|
|
254
|
+
if (!st.byId.has(id))
|
|
255
|
+
return res.status(404).json({ success: false, error: 'Not found' });
|
|
256
|
+
(0, indexContext_js_1.removeEntry)(id);
|
|
257
|
+
(0, indexContext_js_1.touchIndexVersion)();
|
|
258
|
+
(0, indexContext_js_1.invalidate)();
|
|
259
|
+
(0, indexContext_js_1.ensureLoaded)();
|
|
260
|
+
res.json({ success: true, message: 'Instruction deleted', timestamp: Date.now() });
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
console.error('[API] Failed to delete instruction:', error);
|
|
264
|
+
res.status(500).json({ success: false, error: 'Failed to delete instruction' });
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
return router;
|
|
268
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Knowledge Store Routes
|
|
4
|
+
* Routes: POST /knowledge, GET /knowledge/search, GET /knowledge/:key
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.createKnowledgeRoutes = createKnowledgeRoutes;
|
|
8
|
+
const express_1 = require("express");
|
|
9
|
+
const KnowledgeStore_js_1 = require("../KnowledgeStore.js");
|
|
10
|
+
const adminAuth_js_1 = require("./adminAuth.js");
|
|
11
|
+
function createKnowledgeRoutes() {
|
|
12
|
+
const router = (0, express_1.Router)();
|
|
13
|
+
/**
|
|
14
|
+
* POST /api/knowledge - Store or update a knowledge entry
|
|
15
|
+
* Body: { key: string, content: string, metadata?: Record<string, unknown> }
|
|
16
|
+
*/
|
|
17
|
+
router.post('/knowledge', adminAuth_js_1.dashboardAdminAuth, (req, res) => {
|
|
18
|
+
try {
|
|
19
|
+
const { key, content, metadata } = req.body;
|
|
20
|
+
if (!key || typeof key !== 'string') {
|
|
21
|
+
return res.status(400).json({ success: false, error: 'Missing required field: key (string)' });
|
|
22
|
+
}
|
|
23
|
+
if (!content || typeof content !== 'string') {
|
|
24
|
+
return res.status(400).json({ success: false, error: 'Missing required field: content (string)' });
|
|
25
|
+
}
|
|
26
|
+
const store = (0, KnowledgeStore_js_1.getKnowledgeStore)();
|
|
27
|
+
const entry = store.upsert(key, content, metadata || {});
|
|
28
|
+
res.json({ success: true, entry, timestamp: Date.now() });
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
console.error('[API] Knowledge store error:', error);
|
|
32
|
+
res.status(500).json({
|
|
33
|
+
success: false,
|
|
34
|
+
error: 'Failed to store knowledge entry',
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
/**
|
|
39
|
+
* GET /api/knowledge/search?q=query&category=cat&limit=20
|
|
40
|
+
*/
|
|
41
|
+
router.get('/knowledge/search', (req, res) => {
|
|
42
|
+
try {
|
|
43
|
+
const query = String(req.query.q || '').trim();
|
|
44
|
+
if (!query) {
|
|
45
|
+
return res.json({ success: true, query: '', results: [], count: 0, timestamp: Date.now() });
|
|
46
|
+
}
|
|
47
|
+
const category = req.query.category ? String(req.query.category) : undefined;
|
|
48
|
+
const limit = Math.min(100, Math.max(1, parseInt(String(req.query.limit || '20'), 10) || 20));
|
|
49
|
+
const store = (0, KnowledgeStore_js_1.getKnowledgeStore)();
|
|
50
|
+
const results = store.search(query, { category, limit });
|
|
51
|
+
res.json({
|
|
52
|
+
success: true, query, category: category || null,
|
|
53
|
+
results, count: results.length, totalEntries: store.count(), timestamp: Date.now(),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.error('[API] Knowledge search error:', error);
|
|
58
|
+
res.status(500).json({ success: false, error: 'Failed to search knowledge' });
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
/**
|
|
62
|
+
* GET /api/knowledge/:key - Get a specific knowledge entry
|
|
63
|
+
*/
|
|
64
|
+
router.get('/knowledge/:key', (req, res) => {
|
|
65
|
+
try {
|
|
66
|
+
const key = decodeURIComponent(req.params.key);
|
|
67
|
+
const store = (0, KnowledgeStore_js_1.getKnowledgeStore)();
|
|
68
|
+
const entry = store.get(key);
|
|
69
|
+
if (!entry) {
|
|
70
|
+
return res.status(404).json({ success: false, error: `Knowledge entry not found: ${key}` });
|
|
71
|
+
}
|
|
72
|
+
res.json({ success: true, ...entry, timestamp: Date.now() });
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.error('[API] Knowledge get error:', error);
|
|
76
|
+
res.status(500).json({ success: false, error: 'Failed to get knowledge entry' });
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
return router;
|
|
80
|
+
}
|