@jagilber-org/index-server 1.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1218 -0
- package/CODE_OF_CONDUCT.md +49 -0
- package/CONTRIBUTING.md +75 -0
- package/LICENSE +21 -0
- package/README.md +523 -0
- package/SECURITY.md +50 -0
- package/dist/config/configUtils.d.ts +11 -0
- package/dist/config/configUtils.js +87 -0
- package/dist/config/dashboardConfig.d.ts +45 -0
- package/dist/config/dashboardConfig.js +63 -0
- package/dist/config/defaultValues.d.ts +61 -0
- package/dist/config/defaultValues.js +70 -0
- package/dist/config/dirConstants.d.ts +17 -0
- package/dist/config/dirConstants.js +28 -0
- package/dist/config/featureConfig.d.ts +61 -0
- package/dist/config/featureConfig.js +121 -0
- package/dist/config/runtimeConfig.d.ts +145 -0
- package/dist/config/runtimeConfig.js +334 -0
- package/dist/config/serverConfig.d.ts +90 -0
- package/dist/config/serverConfig.js +164 -0
- package/dist/dashboard/analytics/AnalyticsEngine.d.ts +142 -0
- package/dist/dashboard/analytics/AnalyticsEngine.js +373 -0
- package/dist/dashboard/analytics/BusinessIntelligence.d.ts +187 -0
- package/dist/dashboard/analytics/BusinessIntelligence.js +594 -0
- package/dist/dashboard/client/admin.html +2150 -0
- package/dist/dashboard/client/chunks/mermaid-layout-elk.esm.min/chunk-SP2CHFBE.mjs +1 -0
- package/dist/dashboard/client/chunks/mermaid-layout-elk.esm.min/render-T6MDALS3.mjs +27 -0
- package/dist/dashboard/client/css/admin.css +1466 -0
- package/dist/dashboard/client/js/admin.boot.js +359 -0
- package/dist/dashboard/client/js/admin.config.js +196 -0
- package/dist/dashboard/client/js/admin.embeddings.js +425 -0
- package/dist/dashboard/client/js/admin.graph.js +583 -0
- package/dist/dashboard/client/js/admin.instances.js +120 -0
- package/dist/dashboard/client/js/admin.instructions.js +552 -0
- package/dist/dashboard/client/js/admin.logs.js +113 -0
- package/dist/dashboard/client/js/admin.maintenance.js +354 -0
- package/dist/dashboard/client/js/admin.messaging.js +635 -0
- package/dist/dashboard/client/js/admin.monitor.js +181 -0
- package/dist/dashboard/client/js/admin.overview.js +221 -0
- package/dist/dashboard/client/js/admin.performance.js +61 -0
- package/dist/dashboard/client/js/admin.sessions.js +293 -0
- package/dist/dashboard/client/js/admin.sqlite.js +366 -0
- package/dist/dashboard/client/js/admin.utils.js +49 -0
- package/dist/dashboard/client/js/chart.umd.js +14 -0
- package/dist/dashboard/client/js/elk.bundled.js +6696 -0
- package/dist/dashboard/client/js/marked.umd.js +74 -0
- package/dist/dashboard/client/js/mermaid.min.js +3022 -0
- package/dist/dashboard/client/mermaid-layout-elk.esm.min.mjs +1 -0
- package/dist/dashboard/export/DataExporter.d.ts +169 -0
- package/dist/dashboard/export/DataExporter.js +737 -0
- package/dist/dashboard/export/exporters/csvExporter.d.ts +11 -0
- package/dist/dashboard/export/exporters/csvExporter.js +46 -0
- package/dist/dashboard/export/exporters/exportTypes.d.ts +89 -0
- package/dist/dashboard/export/exporters/exportTypes.js +5 -0
- package/dist/dashboard/export/exporters/jsonExporter.d.ts +7 -0
- package/dist/dashboard/export/exporters/jsonExporter.js +22 -0
- package/dist/dashboard/export/exporters/xmlExporter.d.ts +17 -0
- package/dist/dashboard/export/exporters/xmlExporter.js +175 -0
- package/dist/dashboard/integration/APIIntegration.d.ts +41 -0
- package/dist/dashboard/integration/APIIntegration.js +95 -0
- package/dist/dashboard/security/SecurityMonitor.d.ts +167 -0
- package/dist/dashboard/security/SecurityMonitor.js +559 -0
- package/dist/dashboard/server/AdminPanel.d.ts +183 -0
- package/dist/dashboard/server/AdminPanel.js +792 -0
- package/dist/dashboard/server/AdminPanelConfig.d.ts +42 -0
- package/dist/dashboard/server/AdminPanelConfig.js +80 -0
- package/dist/dashboard/server/AdminPanelState.d.ts +47 -0
- package/dist/dashboard/server/AdminPanelState.js +214 -0
- package/dist/dashboard/server/ApiRoutes.d.ts +17 -0
- package/dist/dashboard/server/ApiRoutes.js +149 -0
- package/dist/dashboard/server/DashboardServer.d.ts +49 -0
- package/dist/dashboard/server/DashboardServer.js +159 -0
- package/dist/dashboard/server/FileMetricsStorage.d.ts +49 -0
- package/dist/dashboard/server/FileMetricsStorage.js +195 -0
- package/dist/dashboard/server/HttpTransport.d.ts +23 -0
- package/dist/dashboard/server/HttpTransport.js +116 -0
- package/dist/dashboard/server/InstanceManager.d.ts +53 -0
- package/dist/dashboard/server/InstanceManager.js +284 -0
- package/dist/dashboard/server/KnowledgeStore.d.ts +35 -0
- package/dist/dashboard/server/KnowledgeStore.js +105 -0
- package/dist/dashboard/server/LeaderElection.d.ts +81 -0
- package/dist/dashboard/server/LeaderElection.js +268 -0
- package/dist/dashboard/server/MetricsCollector.d.ts +200 -0
- package/dist/dashboard/server/MetricsCollector.js +803 -0
- package/dist/dashboard/server/SessionPersistenceManager.d.ts +88 -0
- package/dist/dashboard/server/SessionPersistenceManager.js +457 -0
- package/dist/dashboard/server/ThinClient.d.ts +64 -0
- package/dist/dashboard/server/ThinClient.js +237 -0
- package/dist/dashboard/server/WebSocketManager.d.ts +161 -0
- package/dist/dashboard/server/WebSocketManager.js +463 -0
- package/dist/dashboard/server/httpLifecycle.d.ts +17 -0
- package/dist/dashboard/server/httpLifecycle.js +35 -0
- package/dist/dashboard/server/legacyDashboardHtml.d.ts +9 -0
- package/dist/dashboard/server/legacyDashboardHtml.js +618 -0
- package/dist/dashboard/server/legacyDashboardStyles.d.ts +5 -0
- package/dist/dashboard/server/legacyDashboardStyles.js +490 -0
- package/dist/dashboard/server/metricsAggregation.d.ts +252 -0
- package/dist/dashboard/server/metricsAggregation.js +206 -0
- package/dist/dashboard/server/metricsSerializer.d.ts +25 -0
- package/dist/dashboard/server/metricsSerializer.js +195 -0
- package/dist/dashboard/server/routes/admin.routes.d.ts +16 -0
- package/dist/dashboard/server/routes/admin.routes.js +596 -0
- package/dist/dashboard/server/routes/alerts.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/alerts.routes.js +93 -0
- package/dist/dashboard/server/routes/api.feedback.routes.d.ts +73 -0
- package/dist/dashboard/server/routes/api.feedback.routes.js +171 -0
- package/dist/dashboard/server/routes/api.instructions.routes.d.ts +101 -0
- package/dist/dashboard/server/routes/api.instructions.routes.js +213 -0
- package/dist/dashboard/server/routes/api.usage.routes.d.ts +57 -0
- package/dist/dashboard/server/routes/api.usage.routes.js +374 -0
- package/dist/dashboard/server/routes/embeddings.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/embeddings.routes.js +246 -0
- package/dist/dashboard/server/routes/graph.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/graph.routes.js +280 -0
- package/dist/dashboard/server/routes/index.d.ts +38 -0
- package/dist/dashboard/server/routes/index.js +194 -0
- package/dist/dashboard/server/routes/instances.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/instances.routes.js +35 -0
- package/dist/dashboard/server/routes/instructions.routes.d.ts +8 -0
- package/dist/dashboard/server/routes/instructions.routes.js +336 -0
- package/dist/dashboard/server/routes/knowledge.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/knowledge.routes.js +82 -0
- package/dist/dashboard/server/routes/logs.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/logs.routes.js +164 -0
- package/dist/dashboard/server/routes/messaging.routes.d.ts +16 -0
- package/dist/dashboard/server/routes/messaging.routes.js +293 -0
- package/dist/dashboard/server/routes/metrics.routes.d.ts +10 -0
- package/dist/dashboard/server/routes/metrics.routes.js +346 -0
- package/dist/dashboard/server/routes/scripts.routes.d.ts +9 -0
- package/dist/dashboard/server/routes/scripts.routes.js +84 -0
- package/dist/dashboard/server/routes/sqlite.routes.d.ts +9 -0
- package/dist/dashboard/server/routes/sqlite.routes.js +569 -0
- package/dist/dashboard/server/routes/status.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/status.routes.js +183 -0
- package/dist/dashboard/server/routes/synthetic.routes.d.ts +7 -0
- package/dist/dashboard/server/routes/synthetic.routes.js +195 -0
- package/dist/dashboard/server/routes/tools.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/tools.routes.js +46 -0
- package/dist/dashboard/server/routes/usage.routes.d.ts +6 -0
- package/dist/dashboard/server/routes/usage.routes.js +25 -0
- package/dist/dashboard/server/wsInit.d.ts +16 -0
- package/dist/dashboard/server/wsInit.js +35 -0
- package/dist/externalClientLib.d.ts +1 -0
- package/dist/externalClientLib.js +2 -0
- package/dist/minimal/index.d.ts +1 -0
- package/dist/minimal/index.js +140 -0
- package/dist/models/SessionPersistence.d.ts +115 -0
- package/dist/models/SessionPersistence.js +66 -0
- package/dist/models/instruction.d.ts +45 -0
- package/dist/models/instruction.js +2 -0
- package/dist/perf/benchmark.d.ts +1 -0
- package/dist/perf/benchmark.js +50 -0
- package/dist/portableClientWrapper.d.ts +1 -0
- package/dist/portableClientWrapper.js +2 -0
- package/dist/schemas/index.d.ts +128 -0
- package/dist/schemas/index.js +371 -0
- package/dist/scripts/runPerformanceBaseline.d.ts +1 -0
- package/dist/scripts/runPerformanceBaseline.js +17 -0
- package/dist/server/handshakeManager.d.ts +25 -0
- package/dist/server/handshakeManager.js +472 -0
- package/dist/server/index-server.d.ts +56 -0
- package/dist/server/index-server.js +822 -0
- package/dist/server/registry.d.ts +44 -0
- package/dist/server/registry.js +236 -0
- package/dist/server/sdkServer.d.ts +8 -0
- package/dist/server/sdkServer.js +299 -0
- package/dist/server/shutdownGuard.d.ts +41 -0
- package/dist/server/shutdownGuard.js +52 -0
- package/dist/server/thin-client.d.ts +22 -0
- package/dist/server/thin-client.js +111 -0
- package/dist/server/transport.d.ts +41 -0
- package/dist/server/transport.js +312 -0
- package/dist/server/transportFactory.d.ts +21 -0
- package/dist/server/transportFactory.js +429 -0
- package/dist/services/atomicFs.d.ts +22 -0
- package/dist/services/atomicFs.js +103 -0
- package/dist/services/auditLog.d.ts +38 -0
- package/dist/services/auditLog.js +142 -0
- package/dist/services/autoBackup.d.ts +14 -0
- package/dist/services/autoBackup.js +171 -0
- package/dist/services/autoSplit.d.ts +32 -0
- package/dist/services/autoSplit.js +113 -0
- package/dist/services/backupZip.d.ts +25 -0
- package/dist/services/backupZip.js +110 -0
- package/dist/services/bootstrapGating.d.ts +123 -0
- package/dist/services/bootstrapGating.js +221 -0
- package/dist/services/canonical.d.ts +23 -0
- package/dist/services/canonical.js +65 -0
- package/dist/services/categoryRules.d.ts +7 -0
- package/dist/services/categoryRules.js +37 -0
- package/dist/services/classificationService.d.ts +42 -0
- package/dist/services/classificationService.js +168 -0
- package/dist/services/embeddingService.d.ts +62 -0
- package/dist/services/embeddingService.js +259 -0
- package/dist/services/errors.d.ts +22 -0
- package/dist/services/errors.js +31 -0
- package/dist/services/featureFlags.d.ts +25 -0
- package/dist/services/featureFlags.js +89 -0
- package/dist/services/features.d.ts +13 -0
- package/dist/services/features.js +35 -0
- package/dist/services/handlers/instructions.add.d.ts +1 -0
- package/dist/services/handlers/instructions.add.js +496 -0
- package/dist/services/handlers/instructions.groom.d.ts +1 -0
- package/dist/services/handlers/instructions.groom.js +523 -0
- package/dist/services/handlers/instructions.import.d.ts +1 -0
- package/dist/services/handlers/instructions.import.js +173 -0
- package/dist/services/handlers/instructions.patch.d.ts +1 -0
- package/dist/services/handlers/instructions.patch.js +167 -0
- package/dist/services/handlers/instructions.query.d.ts +163 -0
- package/dist/services/handlers/instructions.query.js +522 -0
- package/dist/services/handlers/instructions.reload.d.ts +1 -0
- package/dist/services/handlers/instructions.reload.js +13 -0
- package/dist/services/handlers/instructions.remove.d.ts +1 -0
- package/dist/services/handlers/instructions.remove.js +118 -0
- package/dist/services/handlers/instructions.shared.d.ts +31 -0
- package/dist/services/handlers/instructions.shared.js +124 -0
- package/dist/services/handlers.activation.d.ts +1 -0
- package/dist/services/handlers.activation.js +203 -0
- package/dist/services/handlers.bootstrap.d.ts +1 -0
- package/dist/services/handlers.bootstrap.js +38 -0
- package/dist/services/handlers.dashboardConfig.d.ts +34 -0
- package/dist/services/handlers.dashboardConfig.js +108 -0
- package/dist/services/handlers.diagnostics.d.ts +1 -0
- package/dist/services/handlers.diagnostics.js +64 -0
- package/dist/services/handlers.feedback.d.ts +15 -0
- package/dist/services/handlers.feedback.js +378 -0
- package/dist/services/handlers.gates.d.ts +1 -0
- package/dist/services/handlers.gates.js +46 -0
- package/dist/services/handlers.graph.d.ts +53 -0
- package/dist/services/handlers.graph.js +231 -0
- package/dist/services/handlers.help.d.ts +1 -0
- package/dist/services/handlers.help.js +119 -0
- package/dist/services/handlers.instructionSchema.d.ts +1 -0
- package/dist/services/handlers.instructionSchema.js +227 -0
- package/dist/services/handlers.instructions.d.ts +8 -0
- package/dist/services/handlers.instructions.js +14 -0
- package/dist/services/handlers.instructionsDiagnostics.d.ts +1 -0
- package/dist/services/handlers.instructionsDiagnostics.js +14 -0
- package/dist/services/handlers.integrity.d.ts +1 -0
- package/dist/services/handlers.integrity.js +35 -0
- package/dist/services/handlers.manifest.d.ts +1 -0
- package/dist/services/handlers.manifest.js +24 -0
- package/dist/services/handlers.messaging.d.ts +12 -0
- package/dist/services/handlers.messaging.js +203 -0
- package/dist/services/handlers.metrics.d.ts +1 -0
- package/dist/services/handlers.metrics.js +43 -0
- package/dist/services/handlers.promote.d.ts +1 -0
- package/dist/services/handlers.promote.js +306 -0
- package/dist/services/handlers.prompt.d.ts +1 -0
- package/dist/services/handlers.prompt.js +7 -0
- package/dist/services/handlers.search.d.ts +69 -0
- package/dist/services/handlers.search.js +645 -0
- package/dist/services/handlers.testPrimitive.d.ts +1 -0
- package/dist/services/handlers.testPrimitive.js +5 -0
- package/dist/services/handlers.trace.d.ts +1 -0
- package/dist/services/handlers.trace.js +31 -0
- package/dist/services/handlers.usage.d.ts +1 -0
- package/dist/services/handlers.usage.js +11 -0
- package/dist/services/hotScore.d.ts +137 -0
- package/dist/services/hotScore.js +244 -0
- package/dist/services/indexContext.d.ts +117 -0
- package/dist/services/indexContext.js +968 -0
- package/dist/services/indexLoader.d.ts +44 -0
- package/dist/services/indexLoader.js +921 -0
- package/dist/services/indexRepository.d.ts +32 -0
- package/dist/services/indexRepository.js +71 -0
- package/dist/services/indexingService.d.ts +1 -0
- package/dist/services/indexingService.js +2 -0
- package/dist/services/instructions.dispatcher.d.ts +1 -0
- package/dist/services/instructions.dispatcher.js +231 -0
- package/dist/services/logPrefix.d.ts +1 -0
- package/dist/services/logPrefix.js +30 -0
- package/dist/services/logger.d.ts +52 -0
- package/dist/services/logger.js +268 -0
- package/dist/services/manifestManager.d.ts +82 -0
- package/dist/services/manifestManager.js +200 -0
- package/dist/services/messaging/agentMailbox.d.ts +60 -0
- package/dist/services/messaging/agentMailbox.js +353 -0
- package/dist/services/messaging/messagingPersistence.d.ts +20 -0
- package/dist/services/messaging/messagingPersistence.js +111 -0
- package/dist/services/messaging/messagingTypes.d.ts +150 -0
- package/dist/services/messaging/messagingTypes.js +66 -0
- package/dist/services/ownershipService.d.ts +1 -0
- package/dist/services/ownershipService.js +38 -0
- package/dist/services/performanceBaseline.d.ts +19 -0
- package/dist/services/performanceBaseline.js +210 -0
- package/dist/services/preflight.d.ts +12 -0
- package/dist/services/preflight.js +79 -0
- package/dist/services/promptReviewService.d.ts +44 -0
- package/dist/services/promptReviewService.js +101 -0
- package/dist/services/responseEnvelope.d.ts +6 -0
- package/dist/services/responseEnvelope.js +25 -0
- package/dist/services/seedBootstrap.d.ts +34 -0
- package/dist/services/seedBootstrap.js +427 -0
- package/dist/services/storage/factory.d.ts +17 -0
- package/dist/services/storage/factory.js +35 -0
- package/dist/services/storage/hashUtils.d.ts +11 -0
- package/dist/services/storage/hashUtils.js +35 -0
- package/dist/services/storage/index.d.ts +12 -0
- package/dist/services/storage/index.js +18 -0
- package/dist/services/storage/jsonFileStore.d.ts +32 -0
- package/dist/services/storage/jsonFileStore.js +241 -0
- package/dist/services/storage/migrationEngine.d.ts +35 -0
- package/dist/services/storage/migrationEngine.js +93 -0
- package/dist/services/storage/sqliteMessageStore.d.ts +53 -0
- package/dist/services/storage/sqliteMessageStore.js +146 -0
- package/dist/services/storage/sqliteSchema.d.ts +12 -0
- package/dist/services/storage/sqliteSchema.js +122 -0
- package/dist/services/storage/sqliteStore.d.ts +41 -0
- package/dist/services/storage/sqliteStore.js +339 -0
- package/dist/services/storage/sqliteUsageStore.d.ts +35 -0
- package/dist/services/storage/sqliteUsageStore.js +94 -0
- package/dist/services/storage/types.d.ts +171 -0
- package/dist/services/storage/types.js +12 -0
- package/dist/services/toolHandlers.d.ts +23 -0
- package/dist/services/toolHandlers.js +50 -0
- package/dist/services/toolRegistry.d.ts +20 -0
- package/dist/services/toolRegistry.js +490 -0
- package/dist/services/toolRegistry.zod.d.ts +10 -0
- package/dist/services/toolRegistry.zod.js +323 -0
- package/dist/services/tracing.d.ts +26 -0
- package/dist/services/tracing.js +260 -0
- package/dist/services/usageBuckets.d.ts +161 -0
- package/dist/services/usageBuckets.js +364 -0
- package/dist/services/validationService.d.ts +38 -0
- package/dist/services/validationService.js +125 -0
- package/dist/utils/BufferRing.d.ts +203 -0
- package/dist/utils/BufferRing.js +551 -0
- package/dist/utils/BufferRingExamples.d.ts +55 -0
- package/dist/utils/BufferRingExamples.js +188 -0
- package/dist/utils/envUtils.d.ts +42 -0
- package/dist/utils/envUtils.js +80 -0
- package/dist/utils/memoryMonitor.d.ts +83 -0
- package/dist/utils/memoryMonitor.js +275 -0
- package/dist/versioning/schemaVersion.d.ts +6 -0
- package/dist/versioning/schemaVersion.js +93 -0
- package/package.json +134 -0
- package/schemas/README.md +13 -0
- package/schemas/feedback-entry.schema.json +27 -0
- package/schemas/graph-export-v2.schema.json +60 -0
- package/schemas/index-server.code-schema.json +38477 -0
- package/schemas/instruction.schema.json +262 -0
- package/schemas/json-schema/SessionPersistence-persisted-admin-session.schema.json +54 -0
- package/schemas/json-schema/SessionPersistence-persisted-session-history-entry.schema.json +51 -0
- package/schemas/json-schema/SessionPersistence-persisted-web-socket-connection.schema.json +54 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-config.schema.json +110 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-data.schema.json +229 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-manifest.schema.json +109 -0
- package/schemas/json-schema/SessionPersistence-session-persistence-metadata.schema.json +55 -0
- package/schemas/json-schema/instruction-audience-scope.schema.json +14 -0
- package/schemas/json-schema/instruction-content-type.schema.json +17 -0
- package/schemas/json-schema/instruction-instruction-entry.schema.json +206 -0
- package/schemas/json-schema/instruction-requirement-level.schema.json +16 -0
- package/schemas/manifest.json +78 -0
- package/schemas/manifest.schema.json +33 -0
- package/schemas/usage-batch.schema.json +16 -0
- package/schemas/usage-buckets.schema.json +30 -0
- package/schemas/usage-event.schema.json +17 -0
- package/scripts/copy-dashboard-assets.mjs +170 -0
- package/scripts/setup-hooks.cjs +28 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* BufferRing Usage Examples
|
|
4
|
+
*
|
|
5
|
+
* This file demonstrates various use cases for the configurable BufferRing utility,
|
|
6
|
+
* particularly for log management, metrics collection, and event handling in the
|
|
7
|
+
* Index Server.
|
|
8
|
+
*/
|
|
9
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
10
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.OverflowStrategy = exports.BufferRingFactory = exports.BufferRing = exports.LogStreamer = exports.LogViewerService = void 0;
|
|
14
|
+
exports.createLogViewerBuffer = createLogViewerBuffer;
|
|
15
|
+
exports.createMetricsCollector = createMetricsCollector;
|
|
16
|
+
exports.createEventTracker = createEventTracker;
|
|
17
|
+
exports.createToolMetricsBuffer = createToolMetricsBuffer;
|
|
18
|
+
exports.createConfiguredBuffer = createConfiguredBuffer;
|
|
19
|
+
const BufferRing_1 = require("./BufferRing");
|
|
20
|
+
Object.defineProperty(exports, "BufferRing", { enumerable: true, get: function () { return BufferRing_1.BufferRing; } });
|
|
21
|
+
Object.defineProperty(exports, "BufferRingFactory", { enumerable: true, get: function () { return BufferRing_1.BufferRingFactory; } });
|
|
22
|
+
Object.defineProperty(exports, "OverflowStrategy", { enumerable: true, get: function () { return BufferRing_1.OverflowStrategy; } });
|
|
23
|
+
const path_1 = __importDefault(require("path"));
|
|
24
|
+
// Example 1: Log Buffer for Real-time Log Viewer
|
|
25
|
+
function createLogViewerBuffer(logDir) {
|
|
26
|
+
const logBuffer = BufferRing_1.BufferRingFactory.createLogBuffer(1000, // Keep last 1000 log entries
|
|
27
|
+
path_1.default.join(logDir, 'log-buffer.json'));
|
|
28
|
+
// Event handling for log monitoring
|
|
29
|
+
logBuffer.on('entry-added', (logEntry) => {
|
|
30
|
+
// Could trigger WebSocket broadcast to connected clients
|
|
31
|
+
console.log(`New log entry: ${logEntry.slice(0, 100)}...`);
|
|
32
|
+
});
|
|
33
|
+
logBuffer.on('buffer-full', () => {
|
|
34
|
+
console.log('Log buffer is full, oldest entries will be dropped');
|
|
35
|
+
});
|
|
36
|
+
return logBuffer;
|
|
37
|
+
}
|
|
38
|
+
// Example 2: Metrics Collection with Periodic Persistence
|
|
39
|
+
function createMetricsCollector(dataDir) {
|
|
40
|
+
const metricsBuffer = BufferRing_1.BufferRingFactory.createMetricsBuffer(500, path_1.default.join(dataDir, 'metrics-buffer.json'));
|
|
41
|
+
// Periodic persistence every 30 seconds
|
|
42
|
+
setInterval(async () => {
|
|
43
|
+
try {
|
|
44
|
+
await metricsBuffer.saveToDisk();
|
|
45
|
+
console.log(`Persisted ${metricsBuffer.getStats().count} metrics entries`);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.error('Failed to persist metrics:', error);
|
|
49
|
+
}
|
|
50
|
+
}, 30000);
|
|
51
|
+
return metricsBuffer;
|
|
52
|
+
}
|
|
53
|
+
// Example 3: Event Buffer for System Events
|
|
54
|
+
function createEventTracker() {
|
|
55
|
+
const eventBuffer = BufferRing_1.BufferRingFactory.createEventBuffer(200);
|
|
56
|
+
// Track various system events
|
|
57
|
+
eventBuffer.on('entry-added', (event) => {
|
|
58
|
+
if (event.level === 'error') {
|
|
59
|
+
console.error('System error event:', event);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
return eventBuffer;
|
|
63
|
+
}
|
|
64
|
+
// Example 4: Custom Tool Metrics Buffer with Memory Management
|
|
65
|
+
function createToolMetricsBuffer() {
|
|
66
|
+
const toolMetrics = new BufferRing_1.BufferRing({
|
|
67
|
+
capacity: 1000,
|
|
68
|
+
overflowStrategy: BufferRing_1.OverflowStrategy.DROP_OLDEST,
|
|
69
|
+
autoPersist: false,
|
|
70
|
+
enableIntegrityCheck: false,
|
|
71
|
+
serializer: (entry) => {
|
|
72
|
+
const typedEntry = entry;
|
|
73
|
+
return {
|
|
74
|
+
...entry,
|
|
75
|
+
timestamp: typedEntry.timestamp || new Date().toISOString()
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
// Memory cleanup when buffer gets large
|
|
80
|
+
toolMetrics.on('buffer-full', () => {
|
|
81
|
+
// Keep only successful calls from last hour
|
|
82
|
+
const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000).toISOString();
|
|
83
|
+
const recentSuccessful = toolMetrics.filter((entry) => entry.success && entry.timestamp > oneHourAgo);
|
|
84
|
+
toolMetrics.clear();
|
|
85
|
+
recentSuccessful.forEach(entry => toolMetrics.add(entry));
|
|
86
|
+
console.log(`Cleaned tool metrics buffer, retained ${recentSuccessful.length} entries`);
|
|
87
|
+
});
|
|
88
|
+
return toolMetrics;
|
|
89
|
+
}
|
|
90
|
+
function createConfiguredBuffer(config) {
|
|
91
|
+
switch (config.type) {
|
|
92
|
+
case 'log':
|
|
93
|
+
return BufferRing_1.BufferRingFactory.createLogBuffer(config.capacity, config.persistPath);
|
|
94
|
+
case 'metrics':
|
|
95
|
+
return BufferRing_1.BufferRingFactory.createMetricsBuffer(config.capacity, config.persistPath);
|
|
96
|
+
case 'events':
|
|
97
|
+
return BufferRing_1.BufferRingFactory.createEventBuffer(config.capacity);
|
|
98
|
+
case 'custom':
|
|
99
|
+
return new BufferRing_1.BufferRing({
|
|
100
|
+
capacity: config.capacity,
|
|
101
|
+
persistPath: config.persistPath,
|
|
102
|
+
overflowStrategy: config.overflowStrategy || BufferRing_1.OverflowStrategy.DROP_OLDEST,
|
|
103
|
+
autoPersist: config.autoPersist || false,
|
|
104
|
+
enableIntegrityCheck: !!config.persistPath
|
|
105
|
+
});
|
|
106
|
+
default:
|
|
107
|
+
throw new Error(`Unknown buffer type: ${config.type}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Example 6: Integration with Log Viewer API
|
|
111
|
+
class LogViewerService {
|
|
112
|
+
logBuffer;
|
|
113
|
+
constructor(logDir) {
|
|
114
|
+
this.logBuffer = createLogViewerBuffer(logDir);
|
|
115
|
+
}
|
|
116
|
+
addLogEntry(logLine) {
|
|
117
|
+
this.logBuffer.add(logLine);
|
|
118
|
+
}
|
|
119
|
+
getRecentLogs(count = 100) {
|
|
120
|
+
return this.logBuffer.getLast(count);
|
|
121
|
+
}
|
|
122
|
+
getLogRange(start, end) {
|
|
123
|
+
return this.logBuffer.getRange(start, end);
|
|
124
|
+
}
|
|
125
|
+
searchLogs(pattern) {
|
|
126
|
+
const regex = new RegExp(pattern, 'i');
|
|
127
|
+
return this.logBuffer.filter((line) => regex.test(line));
|
|
128
|
+
}
|
|
129
|
+
getLogStats() {
|
|
130
|
+
const stats = this.logBuffer.getStats();
|
|
131
|
+
return {
|
|
132
|
+
totalLines: stats.count,
|
|
133
|
+
bufferUtilization: stats.utilization,
|
|
134
|
+
memoryUsage: stats.memoryUsage,
|
|
135
|
+
totalProcessed: stats.totalAdded,
|
|
136
|
+
droppedLines: stats.totalDropped
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
clearLogs() {
|
|
140
|
+
this.logBuffer.clear();
|
|
141
|
+
}
|
|
142
|
+
async persistLogs() {
|
|
143
|
+
await this.logBuffer.saveToDisk();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
exports.LogViewerService = LogViewerService;
|
|
147
|
+
// Example 7: Real-time Log Streaming with Buffer
|
|
148
|
+
class LogStreamer {
|
|
149
|
+
logBuffer;
|
|
150
|
+
subscribers = new Set();
|
|
151
|
+
constructor(bufferSize = 500) {
|
|
152
|
+
this.logBuffer = new BufferRing_1.BufferRing({
|
|
153
|
+
capacity: bufferSize,
|
|
154
|
+
overflowStrategy: BufferRing_1.OverflowStrategy.DROP_OLDEST
|
|
155
|
+
});
|
|
156
|
+
// Broadcast new entries to all subscribers
|
|
157
|
+
this.logBuffer.on('entry-added', (logEntry) => {
|
|
158
|
+
this.subscribers.forEach(callback => {
|
|
159
|
+
try {
|
|
160
|
+
callback(logEntry);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
console.error('Error in log subscriber:', error);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
addLog(logEntry) {
|
|
169
|
+
this.logBuffer.add(logEntry);
|
|
170
|
+
}
|
|
171
|
+
subscribe(callback) {
|
|
172
|
+
this.subscribers.add(callback);
|
|
173
|
+
// Return unsubscribe function
|
|
174
|
+
return () => {
|
|
175
|
+
this.subscribers.delete(callback);
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
getBufferSnapshot() {
|
|
179
|
+
return this.logBuffer.getAll();
|
|
180
|
+
}
|
|
181
|
+
getStats() {
|
|
182
|
+
return {
|
|
183
|
+
bufferStats: this.logBuffer.getStats(),
|
|
184
|
+
subscriberCount: this.subscribers.size
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
exports.LogStreamer = LogStreamer;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for environment variable parsing
|
|
3
|
+
*/
|
|
4
|
+
export declare const TRUTHY_VALUES: readonly ["1", "true", "yes", "on"];
|
|
5
|
+
export declare const FALSY_VALUES: readonly ["0", "false", "no", "off"];
|
|
6
|
+
export declare const FALSY_VALUES_EXTENDED: readonly ["0", "false", "no", "off", "disabled", "none"];
|
|
7
|
+
export declare const TRUTHY_OR_DEFAULT: readonly ["true", "on", "yes", "default"];
|
|
8
|
+
/**
|
|
9
|
+
* Check whether a raw string is a recognised truthy value.
|
|
10
|
+
*/
|
|
11
|
+
export declare function isTruthy(value: string | undefined): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Check whether a raw string is a recognised falsy value.
|
|
14
|
+
*/
|
|
15
|
+
export declare function isFalsy(value: string | undefined): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Extended falsy check that also recognises "disabled" and "none".
|
|
18
|
+
*/
|
|
19
|
+
export declare function isFalsyExtended(value: string | undefined): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Returns true when DEBUG or VERBOSE_LOGGING env flags are set.
|
|
22
|
+
* Consolidates the repeated `process.env.INDEX_SERVER_DEBUG === '1' ||
|
|
23
|
+
* process.env.INDEX_SERVER_VERBOSE_LOGGING === '1'` check.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isDebugOrVerbose(): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Parse a boolean environment variable that accepts multiple truthy/falsy values:
|
|
28
|
+
* - Truthy: "1", "true", "yes", "on" (case insensitive)
|
|
29
|
+
* - Falsy: "0", "false", "no", "off" (case insensitive) or undefined/empty
|
|
30
|
+
*
|
|
31
|
+
* @param envVar - The environment variable value
|
|
32
|
+
* @param defaultValue - Default value if envVar is undefined/empty (default: false)
|
|
33
|
+
* @returns boolean value
|
|
34
|
+
*/
|
|
35
|
+
export declare function parseBooleanEnv(envVar: string | undefined, defaultValue?: boolean): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Get a boolean environment variable with consistent parsing
|
|
38
|
+
* @param name - Environment variable name
|
|
39
|
+
* @param defaultValue - Default value if not set (default: false)
|
|
40
|
+
* @returns boolean value
|
|
41
|
+
*/
|
|
42
|
+
export declare function getBooleanEnv(name: string, defaultValue?: boolean): boolean;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Utility functions for environment variable parsing
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TRUTHY_OR_DEFAULT = exports.FALSY_VALUES_EXTENDED = exports.FALSY_VALUES = exports.TRUTHY_VALUES = void 0;
|
|
7
|
+
exports.isTruthy = isTruthy;
|
|
8
|
+
exports.isFalsy = isFalsy;
|
|
9
|
+
exports.isFalsyExtended = isFalsyExtended;
|
|
10
|
+
exports.isDebugOrVerbose = isDebugOrVerbose;
|
|
11
|
+
exports.parseBooleanEnv = parseBooleanEnv;
|
|
12
|
+
exports.getBooleanEnv = getBooleanEnv;
|
|
13
|
+
// ── Canonical truthy / falsy value sets ──────────────────────────────
|
|
14
|
+
exports.TRUTHY_VALUES = ['1', 'true', 'yes', 'on'];
|
|
15
|
+
exports.FALSY_VALUES = ['0', 'false', 'no', 'off'];
|
|
16
|
+
exports.FALSY_VALUES_EXTENDED = ['0', 'false', 'no', 'off', 'disabled', 'none'];
|
|
17
|
+
exports.TRUTHY_OR_DEFAULT = ['true', 'on', 'yes', 'default'];
|
|
18
|
+
/**
|
|
19
|
+
* Check whether a raw string is a recognised truthy value.
|
|
20
|
+
*/
|
|
21
|
+
function isTruthy(value) {
|
|
22
|
+
if (!value)
|
|
23
|
+
return false;
|
|
24
|
+
return exports.TRUTHY_VALUES.includes(value.toLowerCase().trim());
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check whether a raw string is a recognised falsy value.
|
|
28
|
+
*/
|
|
29
|
+
function isFalsy(value) {
|
|
30
|
+
if (!value)
|
|
31
|
+
return false;
|
|
32
|
+
return exports.FALSY_VALUES.includes(value.toLowerCase().trim());
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Extended falsy check that also recognises "disabled" and "none".
|
|
36
|
+
*/
|
|
37
|
+
function isFalsyExtended(value) {
|
|
38
|
+
if (!value)
|
|
39
|
+
return false;
|
|
40
|
+
return exports.FALSY_VALUES_EXTENDED.includes(value.toLowerCase().trim());
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Returns true when DEBUG or VERBOSE_LOGGING env flags are set.
|
|
44
|
+
* Consolidates the repeated `process.env.INDEX_SERVER_DEBUG === '1' ||
|
|
45
|
+
* process.env.INDEX_SERVER_VERBOSE_LOGGING === '1'` check.
|
|
46
|
+
*/
|
|
47
|
+
function isDebugOrVerbose() {
|
|
48
|
+
return process.env.INDEX_SERVER_DEBUG === '1' || process.env.INDEX_SERVER_VERBOSE_LOGGING === '1';
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Parse a boolean environment variable that accepts multiple truthy/falsy values:
|
|
52
|
+
* - Truthy: "1", "true", "yes", "on" (case insensitive)
|
|
53
|
+
* - Falsy: "0", "false", "no", "off" (case insensitive) or undefined/empty
|
|
54
|
+
*
|
|
55
|
+
* @param envVar - The environment variable value
|
|
56
|
+
* @param defaultValue - Default value if envVar is undefined/empty (default: false)
|
|
57
|
+
* @returns boolean value
|
|
58
|
+
*/
|
|
59
|
+
function parseBooleanEnv(envVar, defaultValue = false) {
|
|
60
|
+
if (!envVar)
|
|
61
|
+
return defaultValue;
|
|
62
|
+
const normalized = envVar.toLowerCase().trim();
|
|
63
|
+
if (exports.TRUTHY_VALUES.includes(normalized)) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
if (exports.FALSY_VALUES.includes(normalized)) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
// Unknown values default to false
|
|
70
|
+
return defaultValue;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get a boolean environment variable with consistent parsing
|
|
74
|
+
* @param name - Environment variable name
|
|
75
|
+
* @param defaultValue - Default value if not set (default: false)
|
|
76
|
+
* @returns boolean value
|
|
77
|
+
*/
|
|
78
|
+
function getBooleanEnv(name, defaultValue = false) {
|
|
79
|
+
return parseBooleanEnv(process.env[name], defaultValue);
|
|
80
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
interface MemorySnapshot {
|
|
2
|
+
timestamp: number;
|
|
3
|
+
heapUsed: number;
|
|
4
|
+
heapTotal: number;
|
|
5
|
+
external: number;
|
|
6
|
+
arrayBuffers: number;
|
|
7
|
+
rss: number;
|
|
8
|
+
pid: number;
|
|
9
|
+
}
|
|
10
|
+
interface MemoryTrend {
|
|
11
|
+
snapshots: MemorySnapshot[];
|
|
12
|
+
leakDetected: boolean;
|
|
13
|
+
growthRate: number;
|
|
14
|
+
recommendation: string;
|
|
15
|
+
}
|
|
16
|
+
declare class MemoryMonitor {
|
|
17
|
+
private snapshots;
|
|
18
|
+
private maxSnapshots;
|
|
19
|
+
private intervalId?;
|
|
20
|
+
private isMonitoring;
|
|
21
|
+
/**
|
|
22
|
+
* Start continuous memory monitoring
|
|
23
|
+
*/
|
|
24
|
+
startMonitoring(intervalMs?: number): void;
|
|
25
|
+
/**
|
|
26
|
+
* Stop monitoring
|
|
27
|
+
*/
|
|
28
|
+
stopMonitoring(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Take a memory snapshot
|
|
31
|
+
*/
|
|
32
|
+
takeSnapshot(): MemorySnapshot;
|
|
33
|
+
/**
|
|
34
|
+
* Get current memory status
|
|
35
|
+
*/
|
|
36
|
+
getCurrentStatus(): string;
|
|
37
|
+
/**
|
|
38
|
+
* Analyze memory trends for potential leaks
|
|
39
|
+
*/
|
|
40
|
+
analyzeTrends(windowMinutes?: number): MemoryTrend;
|
|
41
|
+
/**
|
|
42
|
+
* Get detailed memory report
|
|
43
|
+
*/
|
|
44
|
+
getDetailedReport(): string;
|
|
45
|
+
/**
|
|
46
|
+
* Take heap snapshot (requires --expose-gc)
|
|
47
|
+
*/
|
|
48
|
+
takeHeapSnapshot(): string | null;
|
|
49
|
+
/**
|
|
50
|
+
* Monitor event listeners for potential leaks
|
|
51
|
+
*/
|
|
52
|
+
checkEventListeners(): string;
|
|
53
|
+
private formatBytes;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get or create global memory monitor instance
|
|
57
|
+
*/
|
|
58
|
+
export declare function getMemoryMonitor(): MemoryMonitor;
|
|
59
|
+
/**
|
|
60
|
+
* Quick memory status check
|
|
61
|
+
*/
|
|
62
|
+
export declare function memStatus(): void;
|
|
63
|
+
/**
|
|
64
|
+
* Start memory monitoring
|
|
65
|
+
*/
|
|
66
|
+
export declare function startMemWatch(intervalMs?: number): void;
|
|
67
|
+
/**
|
|
68
|
+
* Stop memory monitoring
|
|
69
|
+
*/
|
|
70
|
+
export declare function stopMemWatch(): void;
|
|
71
|
+
/**
|
|
72
|
+
* Get memory report
|
|
73
|
+
*/
|
|
74
|
+
export declare function memReport(): void;
|
|
75
|
+
/**
|
|
76
|
+
* Force garbage collection and show memory
|
|
77
|
+
*/
|
|
78
|
+
export declare function forceGC(): void;
|
|
79
|
+
/**
|
|
80
|
+
* Check event listeners
|
|
81
|
+
*/
|
|
82
|
+
export declare function checkListeners(): void;
|
|
83
|
+
export { MemoryMonitor, MemorySnapshot, MemoryTrend };
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MemoryMonitor = void 0;
|
|
4
|
+
exports.getMemoryMonitor = getMemoryMonitor;
|
|
5
|
+
exports.memStatus = memStatus;
|
|
6
|
+
exports.startMemWatch = startMemWatch;
|
|
7
|
+
exports.stopMemWatch = stopMemWatch;
|
|
8
|
+
exports.memReport = memReport;
|
|
9
|
+
exports.forceGC = forceGC;
|
|
10
|
+
exports.checkListeners = checkListeners;
|
|
11
|
+
/**
|
|
12
|
+
* Memory Monitoring Utilities for MCP Server
|
|
13
|
+
*
|
|
14
|
+
* Provides comprehensive memory leak detection and monitoring tools.
|
|
15
|
+
* Use while attached to debugger for real-time memory analysis.
|
|
16
|
+
*/
|
|
17
|
+
const envUtils_1 = require("./envUtils");
|
|
18
|
+
class MemoryMonitor {
|
|
19
|
+
snapshots = [];
|
|
20
|
+
maxSnapshots = 1000;
|
|
21
|
+
intervalId;
|
|
22
|
+
isMonitoring = false;
|
|
23
|
+
/**
|
|
24
|
+
* Start continuous memory monitoring
|
|
25
|
+
*/
|
|
26
|
+
startMonitoring(intervalMs = 5000) {
|
|
27
|
+
if (this.isMonitoring) {
|
|
28
|
+
console.error('[MemoryMonitor] Already monitoring');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
console.error(`[MemoryMonitor] Starting memory monitoring (interval: ${intervalMs}ms)`);
|
|
32
|
+
this.isMonitoring = true;
|
|
33
|
+
this.intervalId = setInterval(() => {
|
|
34
|
+
this.takeSnapshot();
|
|
35
|
+
}, intervalMs);
|
|
36
|
+
// Take initial snapshot
|
|
37
|
+
this.takeSnapshot();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Stop monitoring
|
|
41
|
+
*/
|
|
42
|
+
stopMonitoring() {
|
|
43
|
+
if (this.intervalId) {
|
|
44
|
+
clearInterval(this.intervalId);
|
|
45
|
+
this.intervalId = undefined;
|
|
46
|
+
}
|
|
47
|
+
this.isMonitoring = false;
|
|
48
|
+
console.error('[MemoryMonitor] Stopped monitoring');
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Take a memory snapshot
|
|
52
|
+
*/
|
|
53
|
+
takeSnapshot() {
|
|
54
|
+
const memUsage = process.memoryUsage();
|
|
55
|
+
const snapshot = {
|
|
56
|
+
timestamp: Date.now(),
|
|
57
|
+
heapUsed: memUsage.heapUsed,
|
|
58
|
+
heapTotal: memUsage.heapTotal,
|
|
59
|
+
external: memUsage.external,
|
|
60
|
+
arrayBuffers: memUsage.arrayBuffers,
|
|
61
|
+
rss: memUsage.rss,
|
|
62
|
+
pid: process.pid
|
|
63
|
+
};
|
|
64
|
+
this.snapshots.push(snapshot);
|
|
65
|
+
// Trim old snapshots
|
|
66
|
+
if (this.snapshots.length > this.maxSnapshots) {
|
|
67
|
+
this.snapshots.shift();
|
|
68
|
+
}
|
|
69
|
+
// Log significant changes
|
|
70
|
+
if (this.snapshots.length > 1) {
|
|
71
|
+
const previous = this.snapshots[this.snapshots.length - 2];
|
|
72
|
+
const heapGrowth = snapshot.heapUsed - previous.heapUsed;
|
|
73
|
+
const rssGrowth = snapshot.rss - previous.rss;
|
|
74
|
+
if (Math.abs(heapGrowth) > 1024 * 1024 || Math.abs(rssGrowth) > 5 * 1024 * 1024) {
|
|
75
|
+
const payload = {
|
|
76
|
+
ts: snapshot.timestamp,
|
|
77
|
+
level: 'info',
|
|
78
|
+
src: 'memory',
|
|
79
|
+
event: 'delta',
|
|
80
|
+
heapDelta: heapGrowth,
|
|
81
|
+
heapUsed: snapshot.heapUsed,
|
|
82
|
+
rssDelta: rssGrowth,
|
|
83
|
+
rss: snapshot.rss,
|
|
84
|
+
pid: snapshot.pid
|
|
85
|
+
};
|
|
86
|
+
// Structured logging piggybacks on existing debug/verbose flags to avoid introducing new env flags.
|
|
87
|
+
const wantStructured = (0, envUtils_1.isDebugOrVerbose)();
|
|
88
|
+
try {
|
|
89
|
+
if (wantStructured) {
|
|
90
|
+
console.error(JSON.stringify(payload));
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// Fallback concise plain text (single line) to preserve readability and avoid multi-line noise.
|
|
94
|
+
console.error(`[MemoryMonitor] heapDelta=${this.formatBytes(heapGrowth)} heapUsed=${this.formatBytes(snapshot.heapUsed)} rssDelta=${this.formatBytes(rssGrowth)} rss=${this.formatBytes(snapshot.rss)}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch { /* swallow */ }
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return snapshot;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get current memory status
|
|
104
|
+
*/
|
|
105
|
+
getCurrentStatus() {
|
|
106
|
+
const memUsage = process.memoryUsage();
|
|
107
|
+
return `Memory Status (PID: ${process.pid}):
|
|
108
|
+
Heap Used: ${this.formatBytes(memUsage.heapUsed)}
|
|
109
|
+
Heap Total: ${this.formatBytes(memUsage.heapTotal)}
|
|
110
|
+
RSS: ${this.formatBytes(memUsage.rss)}
|
|
111
|
+
External: ${this.formatBytes(memUsage.external)}
|
|
112
|
+
Array Buffers: ${this.formatBytes(memUsage.arrayBuffers)}`;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Analyze memory trends for potential leaks
|
|
116
|
+
*/
|
|
117
|
+
analyzeTrends(windowMinutes = 10) {
|
|
118
|
+
const windowMs = windowMinutes * 60 * 1000;
|
|
119
|
+
const cutoff = Date.now() - windowMs;
|
|
120
|
+
const recentSnapshots = this.snapshots.filter(s => s.timestamp >= cutoff);
|
|
121
|
+
if (recentSnapshots.length < 3) {
|
|
122
|
+
return {
|
|
123
|
+
snapshots: recentSnapshots,
|
|
124
|
+
leakDetected: false,
|
|
125
|
+
growthRate: 0,
|
|
126
|
+
recommendation: 'Need more data points for analysis'
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// Calculate growth rate (bytes per second)
|
|
130
|
+
const first = recentSnapshots[0];
|
|
131
|
+
const last = recentSnapshots[recentSnapshots.length - 1];
|
|
132
|
+
const timeDiff = (last.timestamp - first.timestamp) / 1000; // seconds
|
|
133
|
+
const heapGrowth = last.heapUsed - first.heapUsed;
|
|
134
|
+
const growthRate = heapGrowth / timeDiff;
|
|
135
|
+
// Detect potential leak (consistent growth > 100KB/minute)
|
|
136
|
+
const leakThreshold = (100 * 1024) / 60; // bytes per second
|
|
137
|
+
const leakDetected = growthRate > leakThreshold;
|
|
138
|
+
let recommendation = '';
|
|
139
|
+
if (leakDetected) {
|
|
140
|
+
recommendation = `⚠️ Potential memory leak detected! Growth rate: ${this.formatBytes(growthRate * 60)}/minute`;
|
|
141
|
+
}
|
|
142
|
+
else if (growthRate > 0) {
|
|
143
|
+
recommendation = `✅ Memory growth within normal range: ${this.formatBytes(growthRate * 60)}/minute`;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
recommendation = `✅ Memory usage stable or decreasing`;
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
snapshots: recentSnapshots,
|
|
150
|
+
leakDetected,
|
|
151
|
+
growthRate,
|
|
152
|
+
recommendation
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get detailed memory report
|
|
157
|
+
*/
|
|
158
|
+
getDetailedReport() {
|
|
159
|
+
const trend = this.analyzeTrends();
|
|
160
|
+
const current = this.getCurrentStatus();
|
|
161
|
+
return `
|
|
162
|
+
=== MEMORY MONITOR REPORT ===
|
|
163
|
+
${current}
|
|
164
|
+
|
|
165
|
+
=== TREND ANALYSIS (10 min window) ===
|
|
166
|
+
${trend.recommendation}
|
|
167
|
+
Growth Rate: ${this.formatBytes(trend.growthRate * 60)}/minute
|
|
168
|
+
Snapshots: ${trend.snapshots.length}
|
|
169
|
+
Leak Detected: ${trend.leakDetected ? 'YES' : 'NO'}
|
|
170
|
+
|
|
171
|
+
=== DEBUGGING TIPS ===
|
|
172
|
+
1. Force GC: global.gc() (if --expose-gc flag used)
|
|
173
|
+
2. Heap snapshot: takeHeapSnapshot()
|
|
174
|
+
3. Check event listeners: process.listeners()
|
|
175
|
+
4. Monitor specific objects with WeakRef
|
|
176
|
+
`;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Take heap snapshot (requires --expose-gc)
|
|
180
|
+
*/
|
|
181
|
+
takeHeapSnapshot() {
|
|
182
|
+
try {
|
|
183
|
+
if (typeof global.gc === 'function') {
|
|
184
|
+
global.gc();
|
|
185
|
+
console.error('[MemoryMonitor] Forced garbage collection');
|
|
186
|
+
}
|
|
187
|
+
// Note: This would require v8 module for actual heap snapshots
|
|
188
|
+
// For now, just return memory usage after GC
|
|
189
|
+
const afterGC = process.memoryUsage();
|
|
190
|
+
return `Heap snapshot taken. Memory after GC: ${this.formatBytes(afterGC.heapUsed)}`;
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
return `Heap snapshot failed: ${error}. Start with --expose-gc flag for full functionality.`;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Monitor event listeners for potential leaks
|
|
198
|
+
*/
|
|
199
|
+
checkEventListeners() {
|
|
200
|
+
const process_listeners = process.eventNames().map(name => ({
|
|
201
|
+
event: String(name),
|
|
202
|
+
count: process.listenerCount(name)
|
|
203
|
+
}));
|
|
204
|
+
return `Event Listeners:
|
|
205
|
+
${process_listeners.map(l => ` ${l.event}: ${l.count}`).join('\n')}`;
|
|
206
|
+
}
|
|
207
|
+
formatBytes(bytes) {
|
|
208
|
+
if (bytes === 0)
|
|
209
|
+
return '0 B';
|
|
210
|
+
const k = 1024;
|
|
211
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
212
|
+
const i = Math.floor(Math.log(Math.abs(bytes)) / Math.log(k));
|
|
213
|
+
const sign = bytes < 0 ? '-' : '';
|
|
214
|
+
return `${sign}${parseFloat((Math.abs(bytes) / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
exports.MemoryMonitor = MemoryMonitor;
|
|
218
|
+
// Global instance
|
|
219
|
+
let globalMemoryMonitor = null;
|
|
220
|
+
/**
|
|
221
|
+
* Get or create global memory monitor instance
|
|
222
|
+
*/
|
|
223
|
+
function getMemoryMonitor() {
|
|
224
|
+
if (!globalMemoryMonitor) {
|
|
225
|
+
globalMemoryMonitor = new MemoryMonitor();
|
|
226
|
+
}
|
|
227
|
+
return globalMemoryMonitor;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Quick memory status check
|
|
231
|
+
*/
|
|
232
|
+
function memStatus() {
|
|
233
|
+
console.error(getMemoryMonitor().getCurrentStatus());
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Start memory monitoring
|
|
237
|
+
*/
|
|
238
|
+
function startMemWatch(intervalMs = 5000) {
|
|
239
|
+
getMemoryMonitor().startMonitoring(intervalMs);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Stop memory monitoring
|
|
243
|
+
*/
|
|
244
|
+
function stopMemWatch() {
|
|
245
|
+
getMemoryMonitor().stopMonitoring();
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Get memory report
|
|
249
|
+
*/
|
|
250
|
+
function memReport() {
|
|
251
|
+
console.error(getMemoryMonitor().getDetailedReport());
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Force garbage collection and show memory
|
|
255
|
+
*/
|
|
256
|
+
function forceGC() {
|
|
257
|
+
const result = getMemoryMonitor().takeHeapSnapshot();
|
|
258
|
+
console.error(result);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Check event listeners
|
|
262
|
+
*/
|
|
263
|
+
function checkListeners() {
|
|
264
|
+
console.error(getMemoryMonitor().checkEventListeners());
|
|
265
|
+
}
|
|
266
|
+
// Global exports for debugger console
|
|
267
|
+
if (typeof global !== 'undefined') {
|
|
268
|
+
const globalAny = global;
|
|
269
|
+
globalAny.memStatus = memStatus;
|
|
270
|
+
globalAny.startMemWatch = startMemWatch;
|
|
271
|
+
globalAny.stopMemWatch = stopMemWatch;
|
|
272
|
+
globalAny.memReport = memReport;
|
|
273
|
+
globalAny.forceGC = forceGC;
|
|
274
|
+
globalAny.checkListeners = checkListeners;
|
|
275
|
+
}
|