@iworkforces/tracelattice 2.0.3
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/LICENSE +24 -0
- package/README.md +260 -0
- package/dist/CliLifecycle.d.ts +31 -0
- package/dist/CliLifecycle.d.ts.map +1 -0
- package/dist/CliLifecycle.js +90 -0
- package/dist/CliLifecycle.js.map +1 -0
- package/dist/ServerConfig.d.ts +290 -0
- package/dist/ServerConfig.d.ts.map +1 -0
- package/dist/ServerConfig.js +175 -0
- package/dist/ServerConfig.js.map +1 -0
- package/dist/cache/DiscoveryCache.d.ts +269 -0
- package/dist/cache/DiscoveryCache.d.ts.map +1 -0
- package/dist/cache/DiscoveryCache.js +104 -0
- package/dist/cache/DiscoveryCache.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +5177 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/ConfigLoader.d.ts +270 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +186 -0
- package/dist/config/ConfigLoader.js.map +1 -0
- package/dist/context/RequestContext.d.ts +43 -0
- package/dist/context/RequestContext.d.ts.map +1 -0
- package/dist/context/RequestContext.js +14 -0
- package/dist/context/RequestContext.js.map +1 -0
- package/dist/contracts/PersistenceBackend.d.ts +134 -0
- package/dist/contracts/PersistenceBackend.d.ts.map +1 -0
- package/dist/contracts/PersistenceBackend.js +6 -0
- package/dist/contracts/PersistenceBackend.js.map +1 -0
- package/dist/contracts/calibrator.d.ts +97 -0
- package/dist/contracts/calibrator.d.ts.map +1 -0
- package/dist/contracts/calibrator.js +1 -0
- package/dist/contracts/features.d.ts +35 -0
- package/dist/contracts/features.d.ts.map +1 -0
- package/dist/contracts/features.js +12 -0
- package/dist/contracts/features.js.map +1 -0
- package/dist/contracts/ids.d.ts +68 -0
- package/dist/contracts/ids.d.ts.map +1 -0
- package/dist/contracts/ids.js +40 -0
- package/dist/contracts/ids.js.map +1 -0
- package/dist/contracts/interfaces.d.ts +254 -0
- package/dist/contracts/interfaces.d.ts.map +1 -0
- package/dist/contracts/interfaces.js +1 -0
- package/dist/contracts/persistence-work.d.ts +96 -0
- package/dist/contracts/persistence-work.d.ts.map +1 -0
- package/dist/contracts/persistence-work.js +1 -0
- package/dist/contracts/reasoning-types.d.ts +21 -0
- package/dist/contracts/reasoning-types.d.ts.map +1 -0
- package/dist/contracts/reasoning-types.js +1 -0
- package/dist/contracts/strategy.d.ts +107 -0
- package/dist/contracts/strategy.d.ts.map +1 -0
- package/dist/contracts/strategy.js +1 -0
- package/dist/contracts/summary.d.ts +110 -0
- package/dist/contracts/summary.d.ts.map +1 -0
- package/dist/contracts/summary.js +1 -0
- package/dist/contracts/suspension.d.ts +215 -0
- package/dist/contracts/suspension.d.ts.map +1 -0
- package/dist/contracts/suspension.js +1 -0
- package/dist/contracts/transport.d.ts +26 -0
- package/dist/contracts/transport.d.ts.map +1 -0
- package/dist/contracts/transport.js +1 -0
- package/dist/core/CrossReferenceValidator.d.ts +18 -0
- package/dist/core/CrossReferenceValidator.d.ts.map +1 -0
- package/dist/core/CrossReferenceValidator.js +125 -0
- package/dist/core/CrossReferenceValidator.js.map +1 -0
- package/dist/core/HistoryManager.d.ts +215 -0
- package/dist/core/HistoryManager.d.ts.map +1 -0
- package/dist/core/HistoryManager.js +594 -0
- package/dist/core/HistoryManager.js.map +1 -0
- package/dist/core/IHistoryManager.d.ts +163 -0
- package/dist/core/IHistoryManager.d.ts.map +1 -0
- package/dist/core/IHistoryManager.js +1 -0
- package/dist/core/IThoughtFormatter.d.ts +51 -0
- package/dist/core/IThoughtFormatter.d.ts.map +1 -0
- package/dist/core/IThoughtFormatter.js +1 -0
- package/dist/core/InputNormalizer.d.ts +140 -0
- package/dist/core/InputNormalizer.d.ts.map +1 -0
- package/dist/core/InputNormalizer.js +95 -0
- package/dist/core/InputNormalizer.js.map +1 -0
- package/dist/core/PersistenceBuffer.d.ts +204 -0
- package/dist/core/PersistenceBuffer.d.ts.map +1 -0
- package/dist/core/PersistenceBuffer.js +382 -0
- package/dist/core/PersistenceBuffer.js.map +1 -0
- package/dist/core/PersistenceBufferErrors.d.ts +22 -0
- package/dist/core/PersistenceBufferErrors.d.ts.map +1 -0
- package/dist/core/PersistenceBufferErrors.js +30 -0
- package/dist/core/PersistenceBufferErrors.js.map +1 -0
- package/dist/core/PersistenceRestore.d.ts +21 -0
- package/dist/core/PersistenceRestore.d.ts.map +1 -0
- package/dist/core/PersistenceRestore.js +87 -0
- package/dist/core/PersistenceRestore.js.map +1 -0
- package/dist/core/PersistenceWorkQueue.d.ts +155 -0
- package/dist/core/PersistenceWorkQueue.d.ts.map +1 -0
- package/dist/core/PersistenceWorkQueue.js +298 -0
- package/dist/core/PersistenceWorkQueue.js.map +1 -0
- package/dist/core/PersistenceWriter.d.ts +55 -0
- package/dist/core/PersistenceWriter.d.ts.map +1 -0
- package/dist/core/PersistenceWriter.js +112 -0
- package/dist/core/PersistenceWriter.js.map +1 -0
- package/dist/core/SessionErrors.d.ts +37 -0
- package/dist/core/SessionErrors.d.ts.map +1 -0
- package/dist/core/SessionErrors.js +50 -0
- package/dist/core/SessionErrors.js.map +1 -0
- package/dist/core/SessionLifecycleCoordinator.d.ts +74 -0
- package/dist/core/SessionLifecycleCoordinator.d.ts.map +1 -0
- package/dist/core/SessionLifecycleCoordinator.js +222 -0
- package/dist/core/SessionLifecycleCoordinator.js.map +1 -0
- package/dist/core/SessionLock.d.ts +59 -0
- package/dist/core/SessionLock.d.ts.map +1 -0
- package/dist/core/SessionLock.js +39 -0
- package/dist/core/SessionLock.js.map +1 -0
- package/dist/core/SessionManager.d.ts +62 -0
- package/dist/core/SessionManager.d.ts.map +1 -0
- package/dist/core/SessionManager.js +75 -0
- package/dist/core/SessionManager.js.map +1 -0
- package/dist/core/SessionResetCoordinator.d.ts +37 -0
- package/dist/core/SessionResetCoordinator.d.ts.map +1 -0
- package/dist/core/SessionResetCoordinator.js +80 -0
- package/dist/core/SessionResetCoordinator.js.map +1 -0
- package/dist/core/ThoughtEvaluator.d.ts +48 -0
- package/dist/core/ThoughtEvaluator.d.ts.map +1 -0
- package/dist/core/ThoughtEvaluator.js +85 -0
- package/dist/core/ThoughtEvaluator.js.map +1 -0
- package/dist/core/ThoughtFormatter.d.ts +134 -0
- package/dist/core/ThoughtFormatter.d.ts.map +1 -0
- package/dist/core/ThoughtFormatter.js +118 -0
- package/dist/core/ThoughtFormatter.js.map +1 -0
- package/dist/core/ThoughtProcessor.d.ts +259 -0
- package/dist/core/ThoughtProcessor.d.ts.map +1 -0
- package/dist/core/ThoughtProcessor.js +451 -0
- package/dist/core/ThoughtProcessor.js.map +1 -0
- package/dist/core/ThoughtReferenceIndex.d.ts +23 -0
- package/dist/core/ThoughtReferenceIndex.d.ts.map +1 -0
- package/dist/core/ThoughtReferenceIndex.js +66 -0
- package/dist/core/ThoughtReferenceIndex.js.map +1 -0
- package/dist/core/VerificationOutcomeAdmission.d.ts +15 -0
- package/dist/core/VerificationOutcomeAdmission.d.ts.map +1 -0
- package/dist/core/VerificationOutcomeAdmission.js +28 -0
- package/dist/core/VerificationOutcomeAdmission.js.map +1 -0
- package/dist/core/compression/CompressionService.d.ts +76 -0
- package/dist/core/compression/CompressionService.d.ts.map +1 -0
- package/dist/core/compression/CompressionService.js +160 -0
- package/dist/core/compression/CompressionService.js.map +1 -0
- package/dist/core/compression/DehydrationPolicy.d.ts +75 -0
- package/dist/core/compression/DehydrationPolicy.d.ts.map +1 -0
- package/dist/core/compression/DehydrationPolicy.js +45 -0
- package/dist/core/compression/DehydrationPolicy.js.map +1 -0
- package/dist/core/compression/InMemorySummaryStore.d.ts +132 -0
- package/dist/core/compression/InMemorySummaryStore.d.ts.map +1 -0
- package/dist/core/compression/InMemorySummaryStore.js +69 -0
- package/dist/core/compression/InMemorySummaryStore.js.map +1 -0
- package/dist/core/compression/Summary.d.ts +74 -0
- package/dist/core/compression/Summary.d.ts.map +1 -0
- package/dist/core/compression/Summary.js +16 -0
- package/dist/core/compression/Summary.js.map +1 -0
- package/dist/core/evaluator/Aggregator.d.ts +40 -0
- package/dist/core/evaluator/Aggregator.d.ts.map +1 -0
- package/dist/core/evaluator/Aggregator.js +36 -0
- package/dist/core/evaluator/Aggregator.js.map +1 -0
- package/dist/core/evaluator/Calibrator.d.ts +52 -0
- package/dist/core/evaluator/Calibrator.d.ts.map +1 -0
- package/dist/core/evaluator/Calibrator.js +135 -0
- package/dist/core/evaluator/Calibrator.js.map +1 -0
- package/dist/core/evaluator/PatternDetector.d.ts +69 -0
- package/dist/core/evaluator/PatternDetector.d.ts.map +1 -0
- package/dist/core/evaluator/PatternDetector.js +192 -0
- package/dist/core/evaluator/PatternDetector.js.map +1 -0
- package/dist/core/evaluator/SignalComputer.d.ts +116 -0
- package/dist/core/evaluator/SignalComputer.d.ts.map +1 -0
- package/dist/core/evaluator/SignalComputer.js +110 -0
- package/dist/core/evaluator/SignalComputer.js.map +1 -0
- package/dist/core/evaluator/calibration-math.d.ts +39 -0
- package/dist/core/evaluator/calibration-math.d.ts.map +1 -0
- package/dist/core/evaluator/calibration-math.js +42 -0
- package/dist/core/evaluator/calibration-math.js.map +1 -0
- package/dist/core/evaluator/internals.d.ts +36 -0
- package/dist/core/evaluator/internals.d.ts.map +1 -0
- package/dist/core/evaluator/internals.js +43 -0
- package/dist/core/evaluator/internals.js.map +1 -0
- package/dist/core/graph/Edge.d.ts +58 -0
- package/dist/core/graph/Edge.d.ts.map +1 -0
- package/dist/core/graph/Edge.js +1 -0
- package/dist/core/graph/EdgeEmitter.d.ts +68 -0
- package/dist/core/graph/EdgeEmitter.d.ts.map +1 -0
- package/dist/core/graph/EdgeEmitter.js +118 -0
- package/dist/core/graph/EdgeEmitter.js.map +1 -0
- package/dist/core/graph/EdgeStore.d.ts +116 -0
- package/dist/core/graph/EdgeStore.d.ts.map +1 -0
- package/dist/core/graph/EdgeStore.js +107 -0
- package/dist/core/graph/EdgeStore.js.map +1 -0
- package/dist/core/graph/GraphView.d.ts +157 -0
- package/dist/core/graph/GraphView.d.ts.map +1 -0
- package/dist/core/graph/GraphView.js +149 -0
- package/dist/core/graph/GraphView.js.map +1 -0
- package/dist/core/ids.d.ts +33 -0
- package/dist/core/ids.d.ts.map +1 -0
- package/dist/core/ids.js +11 -0
- package/dist/core/ids.js.map +1 -0
- package/dist/core/reasoning/OutcomeRecorder.d.ts +88 -0
- package/dist/core/reasoning/OutcomeRecorder.d.ts.map +1 -0
- package/dist/core/reasoning/OutcomeRecorder.js +51 -0
- package/dist/core/reasoning/OutcomeRecorder.js.map +1 -0
- package/dist/core/reasoning/strategies/SequentialStrategy.d.ts +54 -0
- package/dist/core/reasoning/strategies/SequentialStrategy.d.ts.map +1 -0
- package/dist/core/reasoning/strategies/SequentialStrategy.js +22 -0
- package/dist/core/reasoning/strategies/SequentialStrategy.js.map +1 -0
- package/dist/core/reasoning/strategies/StrategyFactory.d.ts +25 -0
- package/dist/core/reasoning/strategies/StrategyFactory.d.ts.map +1 -0
- package/dist/core/reasoning/strategies/StrategyFactory.js +16 -0
- package/dist/core/reasoning/strategies/StrategyFactory.js.map +1 -0
- package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.d.ts +58 -0
- package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.d.ts.map +1 -0
- package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.js +103 -0
- package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.js.map +1 -0
- package/dist/core/reasoning/strategies/plateau.d.ts +18 -0
- package/dist/core/reasoning/strategies/plateau.d.ts.map +1 -0
- package/dist/core/reasoning/strategies/plateau.js +12 -0
- package/dist/core/reasoning/strategies/plateau.js.map +1 -0
- package/dist/core/reasoning/strategies/totScoring.d.ts +91 -0
- package/dist/core/reasoning/strategies/totScoring.d.ts.map +1 -0
- package/dist/core/reasoning/strategies/totScoring.js +88 -0
- package/dist/core/reasoning/strategies/totScoring.js.map +1 -0
- package/dist/core/reasoning.d.ts +179 -0
- package/dist/core/reasoning.d.ts.map +1 -0
- package/dist/core/reasoning.js +1 -0
- package/dist/core/step.d.ts +50 -0
- package/dist/core/step.d.ts.map +1 -0
- package/dist/core/step.js +1 -0
- package/dist/core/thought.d.ts +113 -0
- package/dist/core/thought.d.ts.map +1 -0
- package/dist/core/thought.js +1 -0
- package/dist/core/tools/InMemorySuspensionStore.d.ts +66 -0
- package/dist/core/tools/InMemorySuspensionStore.d.ts.map +1 -0
- package/dist/core/tools/InMemorySuspensionStore.js +121 -0
- package/dist/core/tools/InMemorySuspensionStore.js.map +1 -0
- package/dist/di/Container.d.ts +253 -0
- package/dist/di/Container.d.ts.map +1 -0
- package/dist/di/Container.js +111 -0
- package/dist/di/Container.js.map +1 -0
- package/dist/di/ServiceRegistry.d.ts +50 -0
- package/dist/di/ServiceRegistry.d.ts.map +1 -0
- package/dist/di/ServiceRegistry.js +1 -0
- package/dist/errors.d.ts +663 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +282 -0
- package/dist/errors.js.map +1 -0
- package/dist/health/HealthChecker.d.ts +73 -0
- package/dist/health/HealthChecker.d.ts.map +1 -0
- package/dist/health/HealthChecker.js +70 -0
- package/dist/health/HealthChecker.js.map +1 -0
- package/dist/lib.d.ts +273 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +409 -0
- package/dist/lib.js.map +1 -0
- package/dist/logger/NullLogger.d.ts +154 -0
- package/dist/logger/NullLogger.d.ts.map +1 -0
- package/dist/logger/NullLogger.js +24 -0
- package/dist/logger/NullLogger.js.map +1 -0
- package/dist/logger/StructuredLogger.d.ts +327 -0
- package/dist/logger/StructuredLogger.d.ts.map +1 -0
- package/dist/logger/StructuredLogger.js +72 -0
- package/dist/logger/StructuredLogger.js.map +1 -0
- package/dist/metrics/metrics.impl.d.ts +252 -0
- package/dist/metrics/metrics.impl.d.ts.map +1 -0
- package/dist/metrics/metrics.impl.js +197 -0
- package/dist/metrics/metrics.impl.js.map +1 -0
- package/dist/persistence/FileLegacyImport.d.ts +2 -0
- package/dist/persistence/FileLegacyImport.d.ts.map +1 -0
- package/dist/persistence/FileLegacyImport.js +183 -0
- package/dist/persistence/FileLegacyImport.js.map +1 -0
- package/dist/persistence/FilePersistence.d.ts +53 -0
- package/dist/persistence/FilePersistence.d.ts.map +1 -0
- package/dist/persistence/FilePersistence.js +312 -0
- package/dist/persistence/FilePersistence.js.map +1 -0
- package/dist/persistence/FileSnapshotTypes.d.ts +29 -0
- package/dist/persistence/FileSnapshotTypes.d.ts.map +1 -0
- package/dist/persistence/FileSnapshotTypes.js +1 -0
- package/dist/persistence/FileSnapshotV2.d.ts +377 -0
- package/dist/persistence/FileSnapshotV2.d.ts.map +1 -0
- package/dist/persistence/FileSnapshotV2.js +124 -0
- package/dist/persistence/FileSnapshotV2.js.map +1 -0
- package/dist/persistence/FileSnapshotValidation.d.ts +15 -0
- package/dist/persistence/FileSnapshotValidation.d.ts.map +1 -0
- package/dist/persistence/FileSnapshotValidation.js +64 -0
- package/dist/persistence/FileSnapshotValidation.js.map +1 -0
- package/dist/persistence/FileWriter.d.ts +30 -0
- package/dist/persistence/FileWriter.d.ts.map +1 -0
- package/dist/persistence/FileWriter.js +155 -0
- package/dist/persistence/FileWriter.js.map +1 -0
- package/dist/persistence/MemoryPersistence.d.ts +45 -0
- package/dist/persistence/MemoryPersistence.d.ts.map +1 -0
- package/dist/persistence/MemoryPersistence.js +180 -0
- package/dist/persistence/MemoryPersistence.js.map +1 -0
- package/dist/persistence/PersistenceCodec.d.ts +7 -0
- package/dist/persistence/PersistenceCodec.d.ts.map +1 -0
- package/dist/persistence/PersistenceCodec.js +97 -0
- package/dist/persistence/PersistenceCodec.js.map +1 -0
- package/dist/persistence/PersistenceErrors.d.ts +23 -0
- package/dist/persistence/PersistenceErrors.d.ts.map +1 -0
- package/dist/persistence/PersistenceErrors.js +26 -0
- package/dist/persistence/PersistenceErrors.js.map +1 -0
- package/dist/persistence/PersistenceFactory.d.ts +21 -0
- package/dist/persistence/PersistenceFactory.d.ts.map +1 -0
- package/dist/persistence/PersistenceFactory.js +28 -0
- package/dist/persistence/PersistenceFactory.js.map +1 -0
- package/dist/persistence/PersistenceScope.d.ts +42 -0
- package/dist/persistence/PersistenceScope.d.ts.map +1 -0
- package/dist/persistence/PersistenceScope.js +93 -0
- package/dist/persistence/PersistenceScope.js.map +1 -0
- package/dist/persistence/SessionScopedPersistence.d.ts +4 -0
- package/dist/persistence/SessionScopedPersistence.d.ts.map +1 -0
- package/dist/persistence/SessionScopedPersistence.js +9 -0
- package/dist/persistence/SessionScopedPersistence.js.map +1 -0
- package/dist/persistence/SqliteDriver.d.ts +22 -0
- package/dist/persistence/SqliteDriver.d.ts.map +1 -0
- package/dist/persistence/SqliteDriver.js +29 -0
- package/dist/persistence/SqliteDriver.js.map +1 -0
- package/dist/persistence/SqliteLegacyImport.d.ts +14 -0
- package/dist/persistence/SqliteLegacyImport.d.ts.map +1 -0
- package/dist/persistence/SqliteLegacyImport.js +136 -0
- package/dist/persistence/SqliteLegacyImport.js.map +1 -0
- package/dist/persistence/SqliteLegacySchema.d.ts +15 -0
- package/dist/persistence/SqliteLegacySchema.d.ts.map +1 -0
- package/dist/persistence/SqliteLegacySchema.js +72 -0
- package/dist/persistence/SqliteLegacySchema.js.map +1 -0
- package/dist/persistence/SqlitePayload.d.ts +11 -0
- package/dist/persistence/SqlitePayload.d.ts.map +1 -0
- package/dist/persistence/SqlitePayload.js +86 -0
- package/dist/persistence/SqlitePayload.js.map +1 -0
- package/dist/persistence/SqlitePersistence.d.ts +49 -0
- package/dist/persistence/SqlitePersistence.d.ts.map +1 -0
- package/dist/persistence/SqlitePersistence.js +248 -0
- package/dist/persistence/SqlitePersistence.js.map +1 -0
- package/dist/persistence/SqliteSchemaV2.d.ts +14 -0
- package/dist/persistence/SqliteSchemaV2.d.ts.map +1 -0
- package/dist/persistence/SqliteSchemaV2.js +129 -0
- package/dist/persistence/SqliteSchemaV2.js.map +1 -0
- package/dist/persistence/SqliteSnapshotWriter.d.ts +17 -0
- package/dist/persistence/SqliteSnapshotWriter.d.ts.map +1 -0
- package/dist/persistence/SqliteSnapshotWriter.js +30 -0
- package/dist/persistence/SqliteSnapshotWriter.js.map +1 -0
- package/dist/pool/ConnectionPool.d.ts +203 -0
- package/dist/pool/ConnectionPool.d.ts.map +1 -0
- package/dist/pool/ConnectionPool.js +303 -0
- package/dist/pool/ConnectionPool.js.map +1 -0
- package/dist/pool/IConnectionPool.d.ts +143 -0
- package/dist/pool/IConnectionPool.d.ts.map +1 -0
- package/dist/pool/IConnectionPool.js +1 -0
- package/dist/pool/PoolErrors.d.ts +11 -0
- package/dist/pool/PoolErrors.d.ts.map +1 -0
- package/dist/pool/PoolErrors.js +16 -0
- package/dist/pool/PoolErrors.js.map +1 -0
- package/dist/registry/BaseRegistry.d.ts +219 -0
- package/dist/registry/BaseRegistry.d.ts.map +1 -0
- package/dist/registry/BaseRegistry.js +215 -0
- package/dist/registry/BaseRegistry.js.map +1 -0
- package/dist/registry/SkillRegistry.d.ts +67 -0
- package/dist/registry/SkillRegistry.d.ts.map +1 -0
- package/dist/registry/SkillRegistry.js +87 -0
- package/dist/registry/SkillRegistry.js.map +1 -0
- package/dist/registry/ToolRegistry.d.ts +70 -0
- package/dist/registry/ToolRegistry.d.ts.map +1 -0
- package/dist/registry/ToolRegistry.js +96 -0
- package/dist/registry/ToolRegistry.js.map +1 -0
- package/dist/sanitize.d.ts +164 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +100 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/schema.d.ts +562 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +251 -0
- package/dist/schema.js.map +1 -0
- package/dist/transport/BaseTransport.d.ts +166 -0
- package/dist/transport/BaseTransport.d.ts.map +1 -0
- package/dist/transport/BaseTransport.js +199 -0
- package/dist/transport/BaseTransport.js.map +1 -0
- package/dist/transport/HttpHelpers.d.ts +53 -0
- package/dist/transport/HttpHelpers.d.ts.map +1 -0
- package/dist/transport/HttpHelpers.js +44 -0
- package/dist/transport/HttpHelpers.js.map +1 -0
- package/dist/transport/HttpRequestLifecycle.d.ts +37 -0
- package/dist/transport/HttpRequestLifecycle.d.ts.map +1 -0
- package/dist/transport/HttpRequestLifecycle.js +87 -0
- package/dist/transport/HttpRequestLifecycle.js.map +1 -0
- package/dist/transport/HttpTransport.d.ts +140 -0
- package/dist/transport/HttpTransport.d.ts.map +1 -0
- package/dist/transport/HttpTransport.js +245 -0
- package/dist/transport/HttpTransport.js.map +1 -0
- package/dist/transport/SseTransport.d.ts +149 -0
- package/dist/transport/SseTransport.d.ts.map +1 -0
- package/dist/transport/SseTransport.js +470 -0
- package/dist/transport/SseTransport.js.map +1 -0
- package/dist/transport/StreamableHttpTransport.d.ts +225 -0
- package/dist/transport/StreamableHttpTransport.d.ts.map +1 -0
- package/dist/transport/StreamableHttpTransport.js +449 -0
- package/dist/transport/StreamableHttpTransport.js.map +1 -0
- package/dist/types/disposable.d.ts +22 -0
- package/dist/types/disposable.d.ts.map +1 -0
- package/dist/types/disposable.js +1 -0
- package/dist/types/server-config.d.ts +32 -0
- package/dist/types/server-config.d.ts.map +1 -0
- package/dist/types/server-config.js +1 -0
- package/dist/types/skill.d.ts +74 -0
- package/dist/types/skill.d.ts.map +1 -0
- package/dist/types/skill.js +1 -0
- package/dist/types/tool.d.ts +78 -0
- package/dist/types/tool.d.ts.map +1 -0
- package/dist/types/tool.js +1 -0
- package/dist/utils.d.ts +27 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +6 -0
- package/dist/utils.js.map +1 -0
- package/dist/watchers/SkillWatcher.d.ts +25 -0
- package/dist/watchers/SkillWatcher.d.ts.map +1 -0
- package/dist/watchers/SkillWatcher.js +96 -0
- package/dist/watchers/SkillWatcher.js.map +1 -0
- package/dist/watchers/ToolWatcher.d.ts +24 -0
- package/dist/watchers/ToolWatcher.d.ts.map +1 -0
- package/dist/watchers/ToolWatcher.js +92 -0
- package/dist/watchers/ToolWatcher.js.map +1 -0
- package/package.json +106 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env bun\n\n// CLI entry point for tracelattice MCP server.\n// This file handles CLI argument parsing, transport selection, and signal handlers.\n// For library usage, import from './lib.js' or './index.js' instead.\n\nimport { ValibotJsonSchemaAdapter } from '@tmcp/adapter-valibot';\nimport { StdioTransport } from '@tmcp/transport-stdio';\nimport { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { McpServer } from 'tmcp';\nimport type { GenericSchema } from 'valibot';\nimport { CliLifecycle, createCliShutdownHandler } from './CliLifecycle.js';\nimport type { ToolAwareSequentialThinkingServer } from './lib.js';\nimport { initializeServer } from './lib.js';\nimport { ServerConfig } from './ServerConfig.js';\nimport { ConfigLoader } from './config/ConfigLoader.js';\nimport { asSessionId } from './contracts/ids.js';\nimport { getOwner } from './context/RequestContext.js';\nimport { StructuredLogger } from './logger/StructuredLogger.js';\nimport { getErrorMessage } from './errors.js';\nimport { SEQUENTIAL_THINKING_TOOL, SequentialThinkingSchema } from './schema.js';\nimport { assertPooledSsePersistence } from './transport/SseTransport.js';\n\n// Get version from package.json\nconst CLI_NAME = 'tracelattice' as const;\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst package_json = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));\nconst { version } = package_json;\n// Handle CLI arguments\nconst args = process.argv.slice(2);\nconst shouldShowVersion = args.includes('--version') || args.includes('-v');\n\nif (shouldShowVersion) {\n\tconsole.log(`${CLI_NAME} v${version}`);\n\tprocess.exit(0);\n}\nasync function main() {\n\tconst transportType = process.env.TRANSPORT_TYPE || 'stdio';\n\tif (transportType === 'sse' && process.env.SSE_ENABLE_POOL !== 'false') {\n\t\tconst configLoader = new ConfigLoader();\n\t\tconst fileConfig = configLoader.load();\n\t\tconst effectiveConfig = new ServerConfig(configLoader.toServerConfigOptions(fileConfig ?? {}));\n\t\tassertPooledSsePersistence(true, effectiveConfig.persistence);\n\t}\n\n\tconst adapter = new ValibotJsonSchemaAdapter();\n\tconst server = new McpServer(\n\t\t{\n\t\t\tname: CLI_NAME,\n\t\t\tversion,\n\t\t\tdescription: 'Semantic Sequential Thinking MCP Server',\n\t\t},\n\t\t{\n\t\t\tadapter,\n\t\t\tcapabilities: {\n\t\t\t\ttools: { listChanged: true },\n\t\t\t},\n\t\t}\n\t);\n\n\tconst thinkingServer = await initializeServer();\n\tconst lifecycle = new CliLifecycle(thinkingServer);\n\ttry {\n\t\tif (transportType === 'sse') {\n\t\t\tawait startSseTransport(server, thinkingServer, lifecycle);\n\t\t} else {\n\t\t\tserver.tool(\n\t\t\t\t{\n\t\t\t\t\tname: 'sequentialthinking_tools',\n\t\t\t\t\tdescription: SEQUENTIAL_THINKING_TOOL.description,\n\t\t\t\t\tschema: SequentialThinkingSchema,\n\t\t\t\t},\n\t\t\t\tasync (input) => thinkingServer.processThought(input)\n\t\t\t);\n\t\t\tif (transportType === 'streamable-http') {\n\t\t\t\tawait startStreamableHttpTransport(server, thinkingServer, lifecycle);\n\t\t\t} else {\n\t\t\t\tawait startStdioTransport(server, thinkingServer, lifecycle);\n\t\t\t}\n\t\t}\n\t\tregisterShutdownHandlers(lifecycle, thinkingServer, transportType === 'stdio');\n\t} catch (error) {\n\t\tawait lifecycle.rollbackStartup(error);\n\t}\n}\n/**\n * Start SSE transport for multi-user support\n */\nasync function startSseTransport(\n\tserver: McpServer<GenericSchema>,\n\tthinkingServer: ToolAwareSequentialThinkingServer,\n\tlifecycle: CliLifecycle\n): Promise<void> {\n\tconst { SseTransport } = await import('./transport/SseTransport.js');\n\tconst { createConnectionPool } = await import('./pool/ConnectionPool.js');\n\tconst port = parseInt(process.env.SSE_PORT || '3000', 10);\n\tconst host = process.env.SSE_HOST || 'localhost';\n\tconst transportMetrics = thinkingServer.getContainer().resolve('Metrics');\n\tconst enablePool = process.env.SSE_ENABLE_POOL !== 'false';\n\tconst maxSessions = parseInt(process.env.SSE_MAX_SESSIONS || '100', 10);\n\tconst sessionTimeout = parseInt(process.env.SSE_SESSION_TIMEOUT || '300000', 10);\n\tconst connectionPool = enablePool\n\t\t? createConnectionPool({\n\t\t\t\tmaxSessions,\n\t\t\t\tsessionTimeout,\n\t\t\t\tlogger: thinkingServer['_logger'],\n\t\t\t\tserverFactory: async () => {\n\t\t\t\t\tconst { createServer: createThinkingServer } = await import('./lib.js');\n\t\t\t\t\tconst sessionServer = await createThinkingServer({ autoDiscover: true });\n\t\t\t\t\treturn sessionServer;\n\t\t\t\t},\n\t\t\t})\n\t\t: undefined;\n\tconst sseTransport = new SseTransport({\n\t\tport,\n\t\thost,\n\t\tcorsOrigin: process.env.CORS_ORIGIN || '*',\n\t\tenableCors: process.env.ENABLE_CORS !== 'false',\n\t\tallowedHosts: process.env.ALLOWED_HOSTS?.split(',').map((hostValue) => hostValue.trim()),\n\t\tmetrics: transportMetrics,\n\t\tconnectionPool,\n\t\tpersistence: thinkingServer.config.persistence,\n\t});\n\tlifecycle.attachTransport(sseTransport);\n\tserver.tool(\n\t\t{\n\t\t\tname: 'sequentialthinking_tools',\n\t\t\tdescription: SEQUENTIAL_THINKING_TOOL.description,\n\t\t\tschema: SequentialThinkingSchema,\n\t\t},\n\t\tasync (input) => {\n\t\t\tif (!connectionPool) {\n\t\t\t\treturn thinkingServer.processThought(input);\n\t\t\t}\n\t\t\tconst result = await connectionPool.process(asSessionId(getOwner() ?? ''), input);\n\t\t\treturn {\n\t\t\t\tcontent: result.content,\n\t\t\t\t...(result.isError === undefined ? {} : { isError: result.isError }),\n\t\t\t};\n\t\t}\n\t);\n\t// Connect the SSE transport\n\tawait sseTransport.connect(server);\n\tthinkingServer['_logger'].info(\n\t\t`Sequential Thinking MCP Server running on SSE transport at http://${host}:${port}`\n\t);\n}\n/**\n * Start Streamable HTTP transport (MCP spec recommended)\n */\nasync function startStreamableHttpTransport(\n\tserver: McpServer,\n\tthinkingServer: ToolAwareSequentialThinkingServer,\n\tlifecycle: CliLifecycle\n): Promise<void> {\n\tconst { StreamableHttpTransport } = await import('./transport/StreamableHttpTransport.js');\n\tconst port = parseInt(process.env.STREAMABLE_HTTP_PORT || process.env.SSE_PORT || '3000', 10);\n\tconst host = process.env.STREAMABLE_HTTP_HOST || process.env.SSE_HOST || 'localhost';\n\tconst transportMetrics = thinkingServer.getContainer().resolve('Metrics');\n\tconst stateful = process.env.STREAMABLE_HTTP_STATEFUL !== 'false';\n\tconst streamableTransport = new StreamableHttpTransport({\n\t\tport,\n\t\thost,\n\t\tcorsOrigin: process.env.CORS_ORIGIN || '*',\n\t\tenableCors: process.env.ENABLE_CORS !== 'false',\n\t\tallowedHosts: process.env.ALLOWED_HOSTS?.split(',').map((hostValue) => hostValue.trim()),\n\t\tmetrics: transportMetrics,\n\t\tstateful,\n\t});\n\tlifecycle.attachTransport(streamableTransport);\n\t// Connect the Streamable HTTP transport\n\tawait streamableTransport.connect(server);\n\tthinkingServer['_logger'].info(\n\t\t`Sequential Thinking MCP Server running on Streamable HTTP transport at http://${host}:${port}`\n\t);\n}\n/**\n * Start stdio transport (default, single-user)\n */\nasync function startStdioTransport(\n\tserver: McpServer,\n\tthinkingServer: ToolAwareSequentialThinkingServer,\n\tlifecycle: CliLifecycle\n): Promise<void> {\n\tconst transport = new StdioTransport(server);\n\tconst processListeners = {\n\t\tsigint: new Set(process.listeners('SIGINT')),\n\t\tsigterm: new Set(process.listeners('SIGTERM')),\n\t\tstdinEnd: new Set(process.stdin.listeners('end')),\n\t};\n\tlifecycle.attachTransport({ stop: () => transport.close() });\n\ttransport.listen();\n\tfor (const listener of process.listeners('SIGINT')) {\n\t\tif (!processListeners.sigint.has(listener)) process.off('SIGINT', listener);\n\t}\n\tfor (const listener of process.listeners('SIGTERM')) {\n\t\tif (!processListeners.sigterm.has(listener)) process.off('SIGTERM', listener);\n\t}\n\tfor (const listener of process.stdin.listeners('end')) {\n\t\tif (!processListeners.stdinEnd.has(listener)) process.stdin.off('end', listener);\n\t}\n\tthinkingServer['_logger'].info('Sequential Thinking MCP Server running on stdio');\n}\n/**\n * Register shutdown signal handlers for a common pattern\n */\nfunction registerShutdownHandlers(\n\tlifecycle: CliLifecycle,\n\tthinkingServer: ToolAwareSequentialThinkingServer,\n\tshutdownOnStdinEnd: boolean\n): void {\n\tconst shutdown = createCliShutdownHandler(lifecycle, {\n\t\treportFailure: (error) => {\n\t\t\tthinkingServer['_logger'].error('CLI shutdown failed', failureMetadata(error));\n\t\t},\n\t\texit: (code) => process.exit(code),\n\t});\n\tconst requestShutdown = (): void => {\n\t\tvoid shutdown();\n\t};\n\tprocess.on('SIGINT', requestShutdown);\n\tprocess.on('SIGTERM', requestShutdown);\n\tif (shutdownOnStdinEnd) process.stdin.on('end', requestShutdown);\n}\n\nfunction failureMetadata(error: unknown): Record<string, unknown> {\n\tif (!(error instanceof AggregateError)) return { error: getErrorMessage(error) };\n\treturn {\n\t\terror: error.message,\n\t\tcauses: error.errors.map((cause) => getErrorMessage(cause)),\n\t};\n}\nmain().catch((error) => {\n\tconst logger = new StructuredLogger({\n\t\tlevel: 'error',\n\t\tcontext: 'SequentialThinking',\n\t\tpretty: true,\n\t});\n\tlogger.error('Fatal error running server', failureMetadata(error));\n\tprocess.exit(1);\n});\n"],"names":["CLI_NAME","__filename","fileURLToPath","__dirname","dirname","package_json","JSON","readFileSync","join","version","args","process","shouldShowVersion","console","main","transportType","configLoader","ConfigLoader","fileConfig","effectiveConfig","ServerConfig","assertPooledSsePersistence","adapter","ValibotJsonSchemaAdapter","server","McpServer","thinkingServer","initializeServer","lifecycle","CliLifecycle","startSseTransport","SEQUENTIAL_THINKING_TOOL","SequentialThinkingSchema","input","startStreamableHttpTransport","startStdioTransport","registerShutdownHandlers","error","SseTransport","createConnectionPool","port","parseInt","host","transportMetrics","enablePool","maxSessions","sessionTimeout","connectionPool","createThinkingServer","sessionServer","undefined","sseTransport","hostValue","result","asSessionId","getOwner","StreamableHttpTransport","stateful","streamableTransport","transport","StdioTransport","processListeners","Set","listener","shutdownOnStdinEnd","shutdown","createCliShutdownHandler","failureMetadata","code","requestShutdown","AggregateError","getErrorMessage","cause","logger","StructuredLogger"],"mappings":"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"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration file loading with environment variable override support.
|
|
3
|
+
*
|
|
4
|
+
* This module provides the `ConfigLoader` class which handles loading configuration
|
|
5
|
+
* from YAML and JSON files in standard locations, with automatic environment variable
|
|
6
|
+
* overrides for all settings.
|
|
7
|
+
*
|
|
8
|
+
* @module config
|
|
9
|
+
*/
|
|
10
|
+
import type { PersistenceConfig } from '../contracts/PersistenceBackend.js';
|
|
11
|
+
import type { FeatureFlags } from '../contracts/features.js';
|
|
12
|
+
import type { ServerConfigOptions } from '../ServerConfig.js';
|
|
13
|
+
/**
|
|
14
|
+
* Configuration options loaded from config files.
|
|
15
|
+
*
|
|
16
|
+
* These options represent the structure of configuration files (JSON or YAML)
|
|
17
|
+
* that can be loaded from standard locations. All values can be overridden
|
|
18
|
+
* by environment variables.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```yaml
|
|
22
|
+
* # .claude/config.yaml
|
|
23
|
+
* maxHistorySize: 500
|
|
24
|
+
* maxBranches: 25
|
|
25
|
+
* logLevel: debug
|
|
26
|
+
* prettyLog: true
|
|
27
|
+
* skillDirs:
|
|
28
|
+
* - ./custom-skills
|
|
29
|
+
* toolDirs:
|
|
30
|
+
* - ./custom-tools
|
|
31
|
+
* discoveryCache:
|
|
32
|
+
* ttl: 600000
|
|
33
|
+
* maxSize: 200
|
|
34
|
+
* persistence:
|
|
35
|
+
* enabled: true
|
|
36
|
+
* backend: sqlite
|
|
37
|
+
* options:
|
|
38
|
+
* dbPath: ./data/history.db
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export interface ConfigFileOptions {
|
|
42
|
+
/**
|
|
43
|
+
* Maximum number of thoughts to keep in history.
|
|
44
|
+
* Can be overridden by `MAX_HISTORY_SIZE` environment variable.
|
|
45
|
+
*/
|
|
46
|
+
readonly maxHistorySize?: number;
|
|
47
|
+
/**
|
|
48
|
+
* Maximum number of branches to maintain.
|
|
49
|
+
* Can be overridden by `MAX_BRANCHES` environment variable.
|
|
50
|
+
*/
|
|
51
|
+
readonly maxBranches?: number;
|
|
52
|
+
/**
|
|
53
|
+
* Maximum size of each branch.
|
|
54
|
+
* Can be overridden by `MAX_BRANCH_SIZE` environment variable.
|
|
55
|
+
*/
|
|
56
|
+
readonly maxBranchSize?: number;
|
|
57
|
+
/**
|
|
58
|
+
* Logging level for the application.
|
|
59
|
+
* Can be overridden by `LOG_LEVEL` environment variable.
|
|
60
|
+
*/
|
|
61
|
+
readonly logLevel?: 'debug' | 'info' | 'warn' | 'error';
|
|
62
|
+
/**
|
|
63
|
+
* Whether to enable pretty (formatted) logging output.
|
|
64
|
+
* Can be overridden by `PRETTY_LOG` environment variable (set to "false" to disable).
|
|
65
|
+
*/
|
|
66
|
+
readonly prettyLog?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Directory paths to search for skills.
|
|
69
|
+
* Can be overridden by `SKILL_DIRS` environment variable (colon-separated).
|
|
70
|
+
*/
|
|
71
|
+
readonly skillDirs?: string[];
|
|
72
|
+
/**
|
|
73
|
+
* Directory paths to search for tools.
|
|
74
|
+
* Can be overridden by `TOOL_DIRS` environment variable (colon-separated).
|
|
75
|
+
*/
|
|
76
|
+
readonly toolDirs?: string[];
|
|
77
|
+
/**
|
|
78
|
+
* Discovery cache configuration.
|
|
79
|
+
* Can be overridden by `DISCOVERY_CACHE_TTL` and `DISCOVERY_CACHE_MAX_SIZE` environment variables.
|
|
80
|
+
*/
|
|
81
|
+
readonly discoveryCache?: {
|
|
82
|
+
/**
|
|
83
|
+
* Time-to-live for cache entries in milliseconds.
|
|
84
|
+
* Environment variable `DISCOVERY_CACHE_TTL` accepts seconds.
|
|
85
|
+
*/
|
|
86
|
+
readonly ttl?: number;
|
|
87
|
+
/**
|
|
88
|
+
* Maximum number of entries in the cache.
|
|
89
|
+
*/
|
|
90
|
+
readonly maxSize?: number;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Persistence configuration for storing history and state.
|
|
94
|
+
*/
|
|
95
|
+
readonly persistence?: PersistenceConfig;
|
|
96
|
+
/**
|
|
97
|
+
* Feature flag overrides. Each field can be set independently.
|
|
98
|
+
* Can be overridden by `TRACELATTICE_FEATURES_*` environment variables.
|
|
99
|
+
*/
|
|
100
|
+
readonly features?: Partial<FeatureFlags>;
|
|
101
|
+
/**
|
|
102
|
+
* TTL in milliseconds for suspended tool-interleave entries.
|
|
103
|
+
* Can be overridden by `TRACELATTICE_TOOL_INTERLEAVE_TTL_MS` environment variable.
|
|
104
|
+
*/
|
|
105
|
+
readonly toolInterleaveTtlMs?: number;
|
|
106
|
+
/**
|
|
107
|
+
* Sweep interval in milliseconds for SuspensionStore expiration cleanup.
|
|
108
|
+
* Can be overridden by `TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS` environment variable.
|
|
109
|
+
*/
|
|
110
|
+
readonly toolInterleaveSweepMs?: number;
|
|
111
|
+
/**
|
|
112
|
+
* Maximum sessions per owner. Per-owner LRU bucket prevents one user from
|
|
113
|
+
* consuming all session slots.
|
|
114
|
+
* Can be overridden by `SESSION_MAX_PER_OWNER` environment variable.
|
|
115
|
+
*/
|
|
116
|
+
readonly maxSessionsPerOwner?: number;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Loads configuration from files with environment variable overrides.
|
|
120
|
+
*
|
|
121
|
+
* This class searches for configuration files in standard locations and applies
|
|
122
|
+
* environment variable overrides. Files are searched in priority order, with the
|
|
123
|
+
* first match being used. Environment variables always take precedence over file values.
|
|
124
|
+
*
|
|
125
|
+
* @remarks
|
|
126
|
+
* **Config File Search Order (priority):**
|
|
127
|
+
* 1. Custom path (if provided to constructor)
|
|
128
|
+
* 2. `.claude/config.json` (project-local)
|
|
129
|
+
* 3. `.claude/config.yaml` (project-local)
|
|
130
|
+
* 4. `.claude/config.yml` (project-local)
|
|
131
|
+
* 5. `~/.claude/config.json` (user-global)
|
|
132
|
+
* 6. `~/.claude/config.yaml` (user-global)
|
|
133
|
+
* 7. `~/.claude/config.yml` (user-global)
|
|
134
|
+
*
|
|
135
|
+
* **Environment Variable Overrides:**
|
|
136
|
+
* | Variable | Type | Description |
|
|
137
|
+
* |----------|------|-------------|
|
|
138
|
+
* | `MAX_HISTORY_SIZE` | number | Max thoughts in history |
|
|
139
|
+
* | `MAX_BRANCHES` | number | Max number of branches |
|
|
140
|
+
* | `MAX_BRANCH_SIZE` | number | Max size of each branch |
|
|
141
|
+
* | `LOG_LEVEL` | string | Logging level (debug/info/warn/error) |
|
|
142
|
+
* | `PRETTY_LOG` | string | "false" to disable pretty logging |
|
|
143
|
+
* | `SKILL_DIRS` | string | Colon-separated directory paths |
|
|
144
|
+
* | `TOOL_DIRS` | string | Colon-separated directory paths |
|
|
145
|
+
* | `DISCOVERY_CACHE_TTL` | number | TTL in seconds (converted to ms) |
|
|
146
|
+
* | `DISCOVERY_CACHE_MAX_SIZE` | number | Max cache entries |
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```typescript
|
|
150
|
+
* // Use default search paths
|
|
151
|
+
* const loader1 = new ConfigLoader();
|
|
152
|
+
* const config1 = loader1.load();
|
|
153
|
+
*
|
|
154
|
+
* // Use custom config path
|
|
155
|
+
* const loader2 = new ConfigLoader('./my-config.yaml');
|
|
156
|
+
* const config2 = loader2.load();
|
|
157
|
+
*
|
|
158
|
+
* // Convert to ServerConfig options
|
|
159
|
+
* const serverOptions = loader2.toServerConfigOptions(config2);
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
export declare class ConfigLoader {
|
|
163
|
+
/** Array of config file paths to search, in priority order. */
|
|
164
|
+
private _configPaths;
|
|
165
|
+
/**
|
|
166
|
+
* Creates a new ConfigLoader instance.
|
|
167
|
+
*
|
|
168
|
+
* @param customPath - Optional custom config file path. If provided, only this path will be checked.
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* ```typescript
|
|
172
|
+
* // Use default search paths
|
|
173
|
+
* const loader1 = new ConfigLoader();
|
|
174
|
+
*
|
|
175
|
+
* // Use a specific config file
|
|
176
|
+
* const loader2 = new ConfigLoader('./custom-config.json');
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
constructor(customPath?: string);
|
|
180
|
+
/**
|
|
181
|
+
* Loads configuration from files and applies environment overrides.
|
|
182
|
+
*
|
|
183
|
+
* Searches for config files in the configured paths (in priority order),
|
|
184
|
+
* parses the first match, and applies environment variable overrides.
|
|
185
|
+
* Returns null if no config file is found and no environment overrides are set.
|
|
186
|
+
*
|
|
187
|
+
* @returns The loaded configuration with environment overrides applied, or null if no config found
|
|
188
|
+
*
|
|
189
|
+
* @example
|
|
190
|
+
* ```typescript
|
|
191
|
+
* const loader = new ConfigLoader();
|
|
192
|
+
* const config = loader.load();
|
|
193
|
+
*
|
|
194
|
+
* if (config) {
|
|
195
|
+
* console.log('Max history size:', config.maxHistorySize);
|
|
196
|
+
* console.log('Log level:', config.logLevel);
|
|
197
|
+
* }
|
|
198
|
+
* ```
|
|
199
|
+
*/
|
|
200
|
+
load(): ConfigFileOptions | null;
|
|
201
|
+
/**
|
|
202
|
+
* Applies environment variable overrides to the configuration.
|
|
203
|
+
*
|
|
204
|
+
* Environment variables take precedence over file-based configuration.
|
|
205
|
+
* Supported environment variables:
|
|
206
|
+
* - `MAX_HISTORY_SIZE`, `MAX_BRANCHES`, `MAX_BRANCH_SIZE` (numbers)
|
|
207
|
+
* - `LOG_LEVEL` (debug/info/warn/error)
|
|
208
|
+
* - `PRETTY_LOG` ("false" to disable)
|
|
209
|
+
* - `SKILL_DIRS` (colon-separated paths)
|
|
210
|
+
* - `TOOL_DIRS` (colon-separated paths)
|
|
211
|
+
* - `DISCOVERY_CACHE_TTL` (in seconds, converted to ms)
|
|
212
|
+
* - `DISCOVERY_CACHE_MAX_SIZE` (number)
|
|
213
|
+
*
|
|
214
|
+
* @param config - The configuration to apply overrides to
|
|
215
|
+
* @returns A new configuration object with environment overrides applied
|
|
216
|
+
*/
|
|
217
|
+
applyEnvironmentOverrides(config: ConfigFileOptions): ConfigFileOptions;
|
|
218
|
+
/**
|
|
219
|
+
* Applies TRACELATTICE_FEATURES_* environment variable overrides for feature flags.
|
|
220
|
+
* Booleans accept 'true'/'false'/'1'/'0' (case-insensitive).
|
|
221
|
+
* Invalid reasoningStrategy values are rejected.
|
|
222
|
+
*
|
|
223
|
+
* @param result - Configuration object to mutate with feature flag overrides
|
|
224
|
+
* @private
|
|
225
|
+
*/
|
|
226
|
+
private applyFeatureFlagOverrides;
|
|
227
|
+
private parseEnvironmentInteger;
|
|
228
|
+
/**
|
|
229
|
+
* Parses a boolean from an environment variable string.
|
|
230
|
+
* Accepts 'true'/'false'/'1'/'0' case-insensitively.
|
|
231
|
+
*
|
|
232
|
+
* @param raw - Raw environment variable string
|
|
233
|
+
* @returns Parsed boolean, or undefined if the value is invalid
|
|
234
|
+
* @private
|
|
235
|
+
*/
|
|
236
|
+
private parseBoolean;
|
|
237
|
+
/**
|
|
238
|
+
* Parses a configuration file (JSON or YAML).
|
|
239
|
+
*
|
|
240
|
+
* Detects the file type by extension and uses the appropriate parser.
|
|
241
|
+
* Supports `.json`, `.yaml`, and `.yml` file extensions.
|
|
242
|
+
*
|
|
243
|
+
* @param filePath - Path to the configuration file to parse
|
|
244
|
+
* @returns The parsed configuration object
|
|
245
|
+
* @throws {Error} If the file cannot be parsed
|
|
246
|
+
* @private
|
|
247
|
+
*/
|
|
248
|
+
private parseConfig;
|
|
249
|
+
/**
|
|
250
|
+
* Converts file-based configuration to ServerConfig options.
|
|
251
|
+
*
|
|
252
|
+
* This is a convenience method for extracting the ServerConfig-relevant
|
|
253
|
+
* options from a file-based configuration.
|
|
254
|
+
*
|
|
255
|
+
* @param config - The configuration to convert
|
|
256
|
+
* @returns An object with ServerConfig-compatible options
|
|
257
|
+
*
|
|
258
|
+
* @example
|
|
259
|
+
* ```typescript
|
|
260
|
+
* const loader = new ConfigLoader();
|
|
261
|
+
* const config = loader.load();
|
|
262
|
+
* if (config) {
|
|
263
|
+
* const serverOpts = loader.toServerConfigOptions(config);
|
|
264
|
+
* const serverConfig = new ServerConfig(serverOpts);
|
|
265
|
+
* }
|
|
266
|
+
* ```
|
|
267
|
+
*/
|
|
268
|
+
toServerConfigOptions(config: ConfigFileOptions): ServerConfigOptions;
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=ConfigLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigLoader.d.ts","sourceRoot":"","sources":["../../src/config/ConfigLoader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAE5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AA8B9D;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,iBAAiB;IACjC;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAEjC;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE9B;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAEhC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAExD;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAE9B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE;QACzB;;;WAGG;QACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QACtB;;WAEG;QACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IAEF;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAEzC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAE1C;;;OAGG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAEtC;;;OAGG;IACH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAExC;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,qBAAa,YAAY;IACxB,+DAA+D;IAC/D,OAAO,CAAC,YAAY,CAAW;IAE/B;;;;;;;;;;;;;OAaG;gBACS,UAAU,CAAC,EAAE,MAAM;IAa/B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,IAAI,IAAI,iBAAiB,GAAG,IAAI;IAiBhC;;;;;;;;;;;;;;;OAeG;IACI,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB;IA6F9E;;;;;;;OAOG;IACH,OAAO,CAAC,yBAAyB;IAuCjC,OAAO,CAAC,uBAAuB;IAW/B;;;;;;;OAOG;IACH,OAAO,CAAC,YAAY;IAOpB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,WAAW;IASnB;;;;;;;;;;;;;;;;;;OAkBG;IACH,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,mBAAmB;CAerE"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { parse } from "yaml";
|
|
5
|
+
import { ConfigurationError, getErrorMessage } from "../errors.js";
|
|
6
|
+
import * as __rspack_external_valibot from "valibot";
|
|
7
|
+
const ConfigFileOptionsSchema = __rspack_external_valibot.looseObject({
|
|
8
|
+
maxHistorySize: __rspack_external_valibot.optional(__rspack_external_valibot.number()),
|
|
9
|
+
maxBranches: __rspack_external_valibot.optional(__rspack_external_valibot.number()),
|
|
10
|
+
maxBranchSize: __rspack_external_valibot.optional(__rspack_external_valibot.number()),
|
|
11
|
+
logLevel: __rspack_external_valibot.optional(__rspack_external_valibot.picklist([
|
|
12
|
+
'debug',
|
|
13
|
+
'info',
|
|
14
|
+
'warn',
|
|
15
|
+
'error'
|
|
16
|
+
])),
|
|
17
|
+
prettyLog: __rspack_external_valibot.optional(__rspack_external_valibot.boolean()),
|
|
18
|
+
skillDirs: __rspack_external_valibot.optional(__rspack_external_valibot.array(__rspack_external_valibot.string())),
|
|
19
|
+
toolDirs: __rspack_external_valibot.optional(__rspack_external_valibot.array(__rspack_external_valibot.string())),
|
|
20
|
+
discoveryCache: __rspack_external_valibot.optional(__rspack_external_valibot.looseObject({
|
|
21
|
+
ttl: __rspack_external_valibot.optional(__rspack_external_valibot.number()),
|
|
22
|
+
maxSize: __rspack_external_valibot.optional(__rspack_external_valibot.number())
|
|
23
|
+
})),
|
|
24
|
+
persistence: __rspack_external_valibot.optional(__rspack_external_valibot.looseObject({})),
|
|
25
|
+
features: __rspack_external_valibot.optional(__rspack_external_valibot.looseObject({})),
|
|
26
|
+
toolInterleaveTtlMs: __rspack_external_valibot.optional(__rspack_external_valibot.number()),
|
|
27
|
+
toolInterleaveSweepMs: __rspack_external_valibot.optional(__rspack_external_valibot.number()),
|
|
28
|
+
maxSessionsPerOwner: __rspack_external_valibot.optional(__rspack_external_valibot.number())
|
|
29
|
+
});
|
|
30
|
+
class ConfigLoader {
|
|
31
|
+
_configPaths;
|
|
32
|
+
constructor(customPath){
|
|
33
|
+
this._configPaths = customPath ? [
|
|
34
|
+
customPath
|
|
35
|
+
] : [
|
|
36
|
+
'.claude/config.json',
|
|
37
|
+
'.claude/config.yaml',
|
|
38
|
+
'.claude/config.yml',
|
|
39
|
+
join(homedir(), '.claude/config.json'),
|
|
40
|
+
join(homedir(), '.claude/config.yaml'),
|
|
41
|
+
join(homedir(), '.claude/config.yml')
|
|
42
|
+
];
|
|
43
|
+
}
|
|
44
|
+
load() {
|
|
45
|
+
let config = null;
|
|
46
|
+
for (const configPath of this._configPaths)if (existsSync(configPath)) try {
|
|
47
|
+
config = this.parseConfig(configPath);
|
|
48
|
+
break;
|
|
49
|
+
} catch (error) {
|
|
50
|
+
console.error(`Failed to load config from ${configPath}:`, getErrorMessage(error));
|
|
51
|
+
}
|
|
52
|
+
return this.applyEnvironmentOverrides(config || {});
|
|
53
|
+
}
|
|
54
|
+
applyEnvironmentOverrides(config) {
|
|
55
|
+
const result = {
|
|
56
|
+
...config,
|
|
57
|
+
...void 0 === config.skillDirs ? {} : {
|
|
58
|
+
skillDirs: [
|
|
59
|
+
...config.skillDirs
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
...void 0 === config.toolDirs ? {} : {
|
|
63
|
+
toolDirs: [
|
|
64
|
+
...config.toolDirs
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
...void 0 === config.discoveryCache ? {} : {
|
|
68
|
+
discoveryCache: {
|
|
69
|
+
...config.discoveryCache
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
...void 0 === config.persistence ? {} : {
|
|
73
|
+
persistence: {
|
|
74
|
+
...config.persistence,
|
|
75
|
+
...void 0 === config.persistence.options ? {} : {
|
|
76
|
+
options: {
|
|
77
|
+
...config.persistence.options
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
...void 0 === config.features ? {} : {
|
|
83
|
+
features: {
|
|
84
|
+
...config.features
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
if (void 0 !== process.env.MAX_HISTORY_SIZE) result.maxHistorySize = this.parseEnvironmentInteger('MAX_HISTORY_SIZE', process.env.MAX_HISTORY_SIZE);
|
|
89
|
+
if (void 0 !== process.env.MAX_BRANCHES) result.maxBranches = this.parseEnvironmentInteger('MAX_BRANCHES', process.env.MAX_BRANCHES);
|
|
90
|
+
if (void 0 !== process.env.MAX_BRANCH_SIZE) result.maxBranchSize = this.parseEnvironmentInteger('MAX_BRANCH_SIZE', process.env.MAX_BRANCH_SIZE);
|
|
91
|
+
if (process.env.LOG_LEVEL && [
|
|
92
|
+
'debug',
|
|
93
|
+
'info',
|
|
94
|
+
'warn',
|
|
95
|
+
'error'
|
|
96
|
+
].includes(process.env.LOG_LEVEL)) result.logLevel = process.env.LOG_LEVEL;
|
|
97
|
+
if ('false' === process.env.PRETTY_LOG) result.prettyLog = false;
|
|
98
|
+
if (void 0 !== process.env.SKILL_DIRS) result.skillDirs = '' === process.env.SKILL_DIRS ? [] : process.env.SKILL_DIRS.split(':');
|
|
99
|
+
if (void 0 !== process.env.TOOL_DIRS) result.toolDirs = '' === process.env.TOOL_DIRS ? [] : process.env.TOOL_DIRS.split(':');
|
|
100
|
+
if (void 0 !== process.env.DISCOVERY_CACHE_TTL) {
|
|
101
|
+
const seconds = this.parseEnvironmentInteger('DISCOVERY_CACHE_TTL', process.env.DISCOVERY_CACHE_TTL);
|
|
102
|
+
const ttl = 1000 * seconds;
|
|
103
|
+
if (!Number.isSafeInteger(ttl)) throw new ConfigurationError('DISCOVERY_CACHE_TTL exceeds the safe integer range');
|
|
104
|
+
result.discoveryCache = {
|
|
105
|
+
...result.discoveryCache,
|
|
106
|
+
ttl
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
if (void 0 !== process.env.DISCOVERY_CACHE_MAX_SIZE) {
|
|
110
|
+
const maxSize = this.parseEnvironmentInteger('DISCOVERY_CACHE_MAX_SIZE', process.env.DISCOVERY_CACHE_MAX_SIZE);
|
|
111
|
+
result.discoveryCache = {
|
|
112
|
+
...result.discoveryCache,
|
|
113
|
+
maxSize
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
if (void 0 !== process.env.TRACELATTICE_TOOL_INTERLEAVE_TTL_MS) result.toolInterleaveTtlMs = this.parseEnvironmentInteger('TRACELATTICE_TOOL_INTERLEAVE_TTL_MS', process.env.TRACELATTICE_TOOL_INTERLEAVE_TTL_MS);
|
|
117
|
+
if (void 0 !== process.env.TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS) result.toolInterleaveSweepMs = this.parseEnvironmentInteger('TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS', process.env.TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS);
|
|
118
|
+
if (void 0 !== process.env.SESSION_MAX_PER_OWNER) result.maxSessionsPerOwner = this.parseEnvironmentInteger('SESSION_MAX_PER_OWNER', process.env.SESSION_MAX_PER_OWNER);
|
|
119
|
+
this.applyFeatureFlagOverrides(result);
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
applyFeatureFlagOverrides(result) {
|
|
123
|
+
const boolMap = {
|
|
124
|
+
TRACELATTICE_FEATURES_DAG_EDGES: 'dagEdges',
|
|
125
|
+
TRACELATTICE_FEATURES_CALIBRATION: 'calibration',
|
|
126
|
+
TRACELATTICE_FEATURES_COMPRESSION: 'compression',
|
|
127
|
+
TRACELATTICE_FEATURES_TOOL_INTERLEAVE: 'toolInterleave',
|
|
128
|
+
TRACELATTICE_FEATURES_NEW_THOUGHT_TYPES: 'newThoughtTypes',
|
|
129
|
+
TRACELATTICE_FEATURES_OUTCOME_RECORDING: 'outcomeRecording'
|
|
130
|
+
};
|
|
131
|
+
for (const [envVar, key] of Object.entries(boolMap)){
|
|
132
|
+
const raw = process.env[envVar];
|
|
133
|
+
if (void 0 === raw) continue;
|
|
134
|
+
const parsed = this.parseBoolean(raw);
|
|
135
|
+
if (void 0 === parsed) {
|
|
136
|
+
console.warn(`Invalid boolean value for ${envVar}: "${raw}" (expected true/false/1/0). Ignoring.`);
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
const features = result.features ?? {};
|
|
140
|
+
features[key] = parsed;
|
|
141
|
+
result.features = features;
|
|
142
|
+
}
|
|
143
|
+
const strategyRaw = process.env.TRACELATTICE_FEATURES_REASONING_STRATEGY;
|
|
144
|
+
if (void 0 !== strategyRaw) {
|
|
145
|
+
if ('sequential' !== strategyRaw && 'tot' !== strategyRaw) throw new ConfigurationError(`TRACELATTICE_FEATURES_REASONING_STRATEGY must be one of sequential, tot, got ${strategyRaw}`);
|
|
146
|
+
const features = result.features ?? {};
|
|
147
|
+
features.reasoningStrategy = strategyRaw;
|
|
148
|
+
result.features = features;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
parseEnvironmentInteger(environmentName, raw) {
|
|
152
|
+
if (!/^(0|[1-9]\d*)$/.test(raw)) throw new ConfigurationError(`${environmentName} must be an integer, got ${raw}`);
|
|
153
|
+
const parsed = Number(raw);
|
|
154
|
+
if (!Number.isSafeInteger(parsed)) throw new ConfigurationError(`${environmentName} must be a safe integer, got ${raw}`);
|
|
155
|
+
return parsed;
|
|
156
|
+
}
|
|
157
|
+
parseBoolean(raw) {
|
|
158
|
+
const v = raw.trim().toLowerCase();
|
|
159
|
+
if ('true' === v || '1' === v) return true;
|
|
160
|
+
if ('false' === v || '0' === v) return false;
|
|
161
|
+
}
|
|
162
|
+
parseConfig(filePath) {
|
|
163
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
164
|
+
const ext = filePath.split('.').pop()?.toLowerCase();
|
|
165
|
+
const raw = 'yaml' === ext || 'yml' === ext ? parse(content) : JSON.parse(content);
|
|
166
|
+
return __rspack_external_valibot.parse(ConfigFileOptionsSchema, raw);
|
|
167
|
+
}
|
|
168
|
+
toServerConfigOptions(config) {
|
|
169
|
+
return {
|
|
170
|
+
maxHistorySize: config.maxHistorySize,
|
|
171
|
+
maxBranches: config.maxBranches,
|
|
172
|
+
maxBranchSize: config.maxBranchSize,
|
|
173
|
+
skillDirs: config.skillDirs,
|
|
174
|
+
toolDirs: config.toolDirs,
|
|
175
|
+
discoveryCache: config.discoveryCache,
|
|
176
|
+
persistence: config.persistence,
|
|
177
|
+
features: config.features,
|
|
178
|
+
toolInterleaveTtlMs: config.toolInterleaveTtlMs,
|
|
179
|
+
toolInterleaveSweepMs: config.toolInterleaveSweepMs,
|
|
180
|
+
maxSessionsPerOwner: config.maxSessionsPerOwner
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
export { ConfigLoader };
|
|
185
|
+
|
|
186
|
+
//# sourceMappingURL=ConfigLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config/ConfigLoader.js","sources":["../../src/config/ConfigLoader.ts"],"sourcesContent":["/**\n * Configuration file loading with environment variable override support.\n *\n * This module provides the `ConfigLoader` class which handles loading configuration\n * from YAML and JSON files in standard locations, with automatic environment variable\n * overrides for all settings.\n *\n * @module config\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { parse as parseYaml } from 'yaml';\nimport * as v from 'valibot';\nimport type { PersistenceConfig } from '../contracts/PersistenceBackend.js';\nimport { ConfigurationError, getErrorMessage } from '../errors.js';\nimport type { FeatureFlags } from '../contracts/features.js';\nimport type { ServerConfigOptions } from '../ServerConfig.js';\n\n/**\n * Lenient runtime schema for config files. Only validates top-level shape;\n * unknown extra fields are preserved by Valibot's default object behavior\n * being strict is avoided by using `v.looseObject`. All fields are optional.\n */\nconst ConfigFileOptionsSchema = v.looseObject({\n\tmaxHistorySize: v.optional(v.number()),\n\tmaxBranches: v.optional(v.number()),\n\tmaxBranchSize: v.optional(v.number()),\n\tlogLevel: v.optional(v.picklist(['debug', 'info', 'warn', 'error'])),\n\tprettyLog: v.optional(v.boolean()),\n\tskillDirs: v.optional(v.array(v.string())),\n\ttoolDirs: v.optional(v.array(v.string())),\n\tdiscoveryCache: v.optional(\n\t\tv.looseObject({\n\t\t\tttl: v.optional(v.number()),\n\t\t\tmaxSize: v.optional(v.number()),\n\t\t})\n\t),\n\tpersistence: v.optional(v.looseObject({})),\n\tfeatures: v.optional(v.looseObject({})),\n\ttoolInterleaveTtlMs: v.optional(v.number()),\n\ttoolInterleaveSweepMs: v.optional(v.number()),\n\tmaxSessionsPerOwner: v.optional(v.number()),\n});\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\n\n/**\n * Configuration options loaded from config files.\n *\n * These options represent the structure of configuration files (JSON or YAML)\n * that can be loaded from standard locations. All values can be overridden\n * by environment variables.\n *\n * @example\n * ```yaml\n * # .claude/config.yaml\n * maxHistorySize: 500\n * maxBranches: 25\n * logLevel: debug\n * prettyLog: true\n * skillDirs:\n * - ./custom-skills\n * toolDirs:\n * - ./custom-tools\n * discoveryCache:\n * ttl: 600000\n * maxSize: 200\n * persistence:\n * enabled: true\n * backend: sqlite\n * options:\n * dbPath: ./data/history.db\n * ```\n */\nexport interface ConfigFileOptions {\n\t/**\n\t * Maximum number of thoughts to keep in history.\n\t * Can be overridden by `MAX_HISTORY_SIZE` environment variable.\n\t */\n\treadonly maxHistorySize?: number;\n\n\t/**\n\t * Maximum number of branches to maintain.\n\t * Can be overridden by `MAX_BRANCHES` environment variable.\n\t */\n\treadonly maxBranches?: number;\n\n\t/**\n\t * Maximum size of each branch.\n\t * Can be overridden by `MAX_BRANCH_SIZE` environment variable.\n\t */\n\treadonly maxBranchSize?: number;\n\n\t/**\n\t * Logging level for the application.\n\t * Can be overridden by `LOG_LEVEL` environment variable.\n\t */\n\treadonly logLevel?: 'debug' | 'info' | 'warn' | 'error';\n\n\t/**\n\t * Whether to enable pretty (formatted) logging output.\n\t * Can be overridden by `PRETTY_LOG` environment variable (set to \"false\" to disable).\n\t */\n\treadonly prettyLog?: boolean;\n\n\t/**\n\t * Directory paths to search for skills.\n\t * Can be overridden by `SKILL_DIRS` environment variable (colon-separated).\n\t */\n\treadonly skillDirs?: string[];\n\n\t/**\n\t * Directory paths to search for tools.\n\t * Can be overridden by `TOOL_DIRS` environment variable (colon-separated).\n\t */\n\treadonly toolDirs?: string[];\n\n\t/**\n\t * Discovery cache configuration.\n\t * Can be overridden by `DISCOVERY_CACHE_TTL` and `DISCOVERY_CACHE_MAX_SIZE` environment variables.\n\t */\n\treadonly discoveryCache?: {\n\t\t/**\n\t\t * Time-to-live for cache entries in milliseconds.\n\t\t * Environment variable `DISCOVERY_CACHE_TTL` accepts seconds.\n\t\t */\n\t\treadonly ttl?: number;\n\t\t/**\n\t\t * Maximum number of entries in the cache.\n\t\t */\n\t\treadonly maxSize?: number;\n\t};\n\n\t/**\n\t * Persistence configuration for storing history and state.\n\t */\n\treadonly persistence?: PersistenceConfig;\n\n\t/**\n\t * Feature flag overrides. Each field can be set independently.\n\t * Can be overridden by `TRACELATTICE_FEATURES_*` environment variables.\n\t */\n\treadonly features?: Partial<FeatureFlags>;\n\n\t/**\n\t * TTL in milliseconds for suspended tool-interleave entries.\n\t * Can be overridden by `TRACELATTICE_TOOL_INTERLEAVE_TTL_MS` environment variable.\n\t */\n\treadonly toolInterleaveTtlMs?: number;\n\n\t/**\n\t * Sweep interval in milliseconds for SuspensionStore expiration cleanup.\n\t * Can be overridden by `TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS` environment variable.\n\t */\n\treadonly toolInterleaveSweepMs?: number;\n\n\t/**\n\t * Maximum sessions per owner. Per-owner LRU bucket prevents one user from\n\t * consuming all session slots.\n\t * Can be overridden by `SESSION_MAX_PER_OWNER` environment variable.\n\t */\n\treadonly maxSessionsPerOwner?: number;\n}\n\n/**\n * Loads configuration from files with environment variable overrides.\n *\n * This class searches for configuration files in standard locations and applies\n * environment variable overrides. Files are searched in priority order, with the\n * first match being used. Environment variables always take precedence over file values.\n *\n * @remarks\n * **Config File Search Order (priority):**\n * 1. Custom path (if provided to constructor)\n * 2. `.claude/config.json` (project-local)\n * 3. `.claude/config.yaml` (project-local)\n * 4. `.claude/config.yml` (project-local)\n * 5. `~/.claude/config.json` (user-global)\n * 6. `~/.claude/config.yaml` (user-global)\n * 7. `~/.claude/config.yml` (user-global)\n *\n * **Environment Variable Overrides:**\n * | Variable | Type | Description |\n * |----------|------|-------------|\n * | `MAX_HISTORY_SIZE` | number | Max thoughts in history |\n * | `MAX_BRANCHES` | number | Max number of branches |\n * | `MAX_BRANCH_SIZE` | number | Max size of each branch |\n * | `LOG_LEVEL` | string | Logging level (debug/info/warn/error) |\n * | `PRETTY_LOG` | string | \"false\" to disable pretty logging |\n * | `SKILL_DIRS` | string | Colon-separated directory paths |\n * | `TOOL_DIRS` | string | Colon-separated directory paths |\n * | `DISCOVERY_CACHE_TTL` | number | TTL in seconds (converted to ms) |\n * | `DISCOVERY_CACHE_MAX_SIZE` | number | Max cache entries |\n *\n * @example\n * ```typescript\n * // Use default search paths\n * const loader1 = new ConfigLoader();\n * const config1 = loader1.load();\n *\n * // Use custom config path\n * const loader2 = new ConfigLoader('./my-config.yaml');\n * const config2 = loader2.load();\n *\n * // Convert to ServerConfig options\n * const serverOptions = loader2.toServerConfigOptions(config2);\n * ```\n */\nexport class ConfigLoader {\n\t/** Array of config file paths to search, in priority order. */\n\tprivate _configPaths: string[];\n\n\t/**\n\t * Creates a new ConfigLoader instance.\n\t *\n\t * @param customPath - Optional custom config file path. If provided, only this path will be checked.\n\t *\n\t * @example\n\t * ```typescript\n\t * // Use default search paths\n\t * const loader1 = new ConfigLoader();\n\t *\n\t * // Use a specific config file\n\t * const loader2 = new ConfigLoader('./custom-config.json');\n\t * ```\n\t */\n\tconstructor(customPath?: string) {\n\t\tthis._configPaths = customPath\n\t\t\t? [customPath]\n\t\t\t: [\n\t\t\t\t\t'.claude/config.json',\n\t\t\t\t\t'.claude/config.yaml',\n\t\t\t\t\t'.claude/config.yml',\n\t\t\t\t\tjoin(homedir(), '.claude/config.json'),\n\t\t\t\t\tjoin(homedir(), '.claude/config.yaml'),\n\t\t\t\t\tjoin(homedir(), '.claude/config.yml'),\n\t\t\t\t];\n\t}\n\n\t/**\n\t * Loads configuration from files and applies environment overrides.\n\t *\n\t * Searches for config files in the configured paths (in priority order),\n\t * parses the first match, and applies environment variable overrides.\n\t * Returns null if no config file is found and no environment overrides are set.\n\t *\n\t * @returns The loaded configuration with environment overrides applied, or null if no config found\n\t *\n\t * @example\n\t * ```typescript\n\t * const loader = new ConfigLoader();\n\t * const config = loader.load();\n\t *\n\t * if (config) {\n\t * console.log('Max history size:', config.maxHistorySize);\n\t * console.log('Log level:', config.logLevel);\n\t * }\n\t * ```\n\t */\n\tload(): ConfigFileOptions | null {\n\t\tlet config: ConfigFileOptions | null = null;\n\n\t\tfor (const configPath of this._configPaths) {\n\t\t\tif (existsSync(configPath)) {\n\t\t\t\ttry {\n\t\t\t\t\tconfig = this.parseConfig(configPath);\n\t\t\t\t\tbreak;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(`Failed to load config from ${configPath}:`, getErrorMessage(error));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.applyEnvironmentOverrides(config || {});\n\t}\n\n\t/**\n\t * Applies environment variable overrides to the configuration.\n\t *\n\t * Environment variables take precedence over file-based configuration.\n\t * Supported environment variables:\n\t * - `MAX_HISTORY_SIZE`, `MAX_BRANCHES`, `MAX_BRANCH_SIZE` (numbers)\n\t * - `LOG_LEVEL` (debug/info/warn/error)\n\t * - `PRETTY_LOG` (\"false\" to disable)\n\t * - `SKILL_DIRS` (colon-separated paths)\n\t * - `TOOL_DIRS` (colon-separated paths)\n\t * - `DISCOVERY_CACHE_TTL` (in seconds, converted to ms)\n\t * - `DISCOVERY_CACHE_MAX_SIZE` (number)\n\t *\n\t * @param config - The configuration to apply overrides to\n\t * @returns A new configuration object with environment overrides applied\n\t */\n\tpublic applyEnvironmentOverrides(config: ConfigFileOptions): ConfigFileOptions {\n\t\tconst result: Mutable<ConfigFileOptions> = {\n\t\t\t...config,\n\t\t\t...(config.skillDirs === undefined ? {} : { skillDirs: [...config.skillDirs] }),\n\t\t\t...(config.toolDirs === undefined ? {} : { toolDirs: [...config.toolDirs] }),\n\t\t\t...(config.discoveryCache === undefined\n\t\t\t\t? {}\n\t\t\t\t: { discoveryCache: { ...config.discoveryCache } }),\n\t\t\t...(config.persistence === undefined\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\tpersistence: {\n\t\t\t\t\t\t\t...config.persistence,\n\t\t\t\t\t\t\t...(config.persistence.options === undefined\n\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t: { options: { ...config.persistence.options } }),\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t...(config.features === undefined ? {} : { features: { ...config.features } }),\n\t\t};\n\n\t\tif (process.env.MAX_HISTORY_SIZE !== undefined) {\n\t\t\tresult.maxHistorySize = this.parseEnvironmentInteger(\n\t\t\t\t'MAX_HISTORY_SIZE',\n\t\t\t\tprocess.env.MAX_HISTORY_SIZE\n\t\t\t);\n\t\t}\n\t\tif (process.env.MAX_BRANCHES !== undefined) {\n\t\t\tresult.maxBranches = this.parseEnvironmentInteger('MAX_BRANCHES', process.env.MAX_BRANCHES);\n\t\t}\n\t\tif (process.env.MAX_BRANCH_SIZE !== undefined) {\n\t\t\tresult.maxBranchSize = this.parseEnvironmentInteger(\n\t\t\t\t'MAX_BRANCH_SIZE',\n\t\t\t\tprocess.env.MAX_BRANCH_SIZE\n\t\t\t);\n\t\t}\n\t\tif (\n\t\t\tprocess.env.LOG_LEVEL &&\n\t\t\t['debug', 'info', 'warn', 'error'].includes(process.env.LOG_LEVEL)\n\t\t) {\n\t\t\tresult.logLevel = process.env.LOG_LEVEL as 'debug' | 'info' | 'warn' | 'error';\n\t\t}\n\t\tif (process.env.PRETTY_LOG === 'false') {\n\t\t\tresult.prettyLog = false;\n\t\t}\n\t\tif (process.env.SKILL_DIRS !== undefined) {\n\t\t\tresult.skillDirs = process.env.SKILL_DIRS === '' ? [] : process.env.SKILL_DIRS.split(':');\n\t\t}\n\t\tif (process.env.TOOL_DIRS !== undefined) {\n\t\t\tresult.toolDirs = process.env.TOOL_DIRS === '' ? [] : process.env.TOOL_DIRS.split(':');\n\t\t}\n\t\tif (process.env.DISCOVERY_CACHE_TTL !== undefined) {\n\t\t\tconst seconds = this.parseEnvironmentInteger(\n\t\t\t\t'DISCOVERY_CACHE_TTL',\n\t\t\t\tprocess.env.DISCOVERY_CACHE_TTL\n\t\t\t);\n\t\t\tconst ttl = seconds * 1000;\n\t\t\tif (!Number.isSafeInteger(ttl)) {\n\t\t\t\tthrow new ConfigurationError('DISCOVERY_CACHE_TTL exceeds the safe integer range');\n\t\t\t}\n\t\t\tresult.discoveryCache = { ...result.discoveryCache, ttl };\n\t\t}\n\t\tif (process.env.DISCOVERY_CACHE_MAX_SIZE !== undefined) {\n\t\t\tconst maxSize = this.parseEnvironmentInteger(\n\t\t\t\t'DISCOVERY_CACHE_MAX_SIZE',\n\t\t\t\tprocess.env.DISCOVERY_CACHE_MAX_SIZE\n\t\t\t);\n\t\t\tresult.discoveryCache = { ...result.discoveryCache, maxSize };\n\t\t}\n\t\tif (process.env.TRACELATTICE_TOOL_INTERLEAVE_TTL_MS !== undefined) {\n\t\t\tresult.toolInterleaveTtlMs = this.parseEnvironmentInteger(\n\t\t\t\t'TRACELATTICE_TOOL_INTERLEAVE_TTL_MS',\n\t\t\t\tprocess.env.TRACELATTICE_TOOL_INTERLEAVE_TTL_MS\n\t\t\t);\n\t\t}\n\t\tif (process.env.TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS !== undefined) {\n\t\t\tresult.toolInterleaveSweepMs = this.parseEnvironmentInteger(\n\t\t\t\t'TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS',\n\t\t\t\tprocess.env.TRACELATTICE_TOOL_INTERLEAVE_SWEEP_MS\n\t\t\t);\n\t\t}\n\t\tif (process.env.SESSION_MAX_PER_OWNER !== undefined) {\n\t\t\tresult.maxSessionsPerOwner = this.parseEnvironmentInteger(\n\t\t\t\t'SESSION_MAX_PER_OWNER',\n\t\t\t\tprocess.env.SESSION_MAX_PER_OWNER\n\t\t\t);\n\t\t}\n\n\t\tthis.applyFeatureFlagOverrides(result);\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Applies TRACELATTICE_FEATURES_* environment variable overrides for feature flags.\n\t * Booleans accept 'true'/'false'/'1'/'0' (case-insensitive).\n\t * Invalid reasoningStrategy values are rejected.\n\t *\n\t * @param result - Configuration object to mutate with feature flag overrides\n\t * @private\n\t */\n\tprivate applyFeatureFlagOverrides(result: Mutable<ConfigFileOptions>): void {\n\t\tconst boolMap: Record<string, Exclude<keyof FeatureFlags, 'reasoningStrategy'>> = {\n\t\t\tTRACELATTICE_FEATURES_DAG_EDGES: 'dagEdges',\n\t\t\tTRACELATTICE_FEATURES_CALIBRATION: 'calibration',\n\t\t\tTRACELATTICE_FEATURES_COMPRESSION: 'compression',\n\t\t\tTRACELATTICE_FEATURES_TOOL_INTERLEAVE: 'toolInterleave',\n\t\t\tTRACELATTICE_FEATURES_NEW_THOUGHT_TYPES: 'newThoughtTypes',\n\t\t\tTRACELATTICE_FEATURES_OUTCOME_RECORDING: 'outcomeRecording',\n\t\t};\n\t\tfor (const [envVar, key] of Object.entries(boolMap)) {\n\t\t\tconst raw = process.env[envVar];\n\t\t\tif (raw === undefined) continue;\n\t\t\tconst parsed = this.parseBoolean(raw);\n\t\t\tif (parsed === undefined) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Invalid boolean value for ${envVar}: \"${raw}\" (expected true/false/1/0). Ignoring.`\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst features: { -readonly [K in keyof FeatureFlags]?: FeatureFlags[K] } =\n\t\t\t\tresult.features ?? {};\n\t\t\tfeatures[key] = parsed;\n\t\t\tresult.features = features;\n\t\t}\n\n\t\tconst strategyRaw = process.env.TRACELATTICE_FEATURES_REASONING_STRATEGY;\n\t\tif (strategyRaw !== undefined) {\n\t\t\tif (strategyRaw !== 'sequential' && strategyRaw !== 'tot') {\n\t\t\t\tthrow new ConfigurationError(\n\t\t\t\t\t`TRACELATTICE_FEATURES_REASONING_STRATEGY must be one of sequential, tot, got ${strategyRaw}`\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst features: { -readonly [K in keyof FeatureFlags]?: FeatureFlags[K] } =\n\t\t\t\tresult.features ?? {};\n\t\t\tfeatures.reasoningStrategy = strategyRaw;\n\t\t\tresult.features = features;\n\t\t}\n\t}\n\n\tprivate parseEnvironmentInteger(environmentName: string, raw: string): number {\n\t\tif (!/^(0|[1-9]\\d*)$/.test(raw)) {\n\t\t\tthrow new ConfigurationError(`${environmentName} must be an integer, got ${raw}`);\n\t\t}\n\t\tconst parsed = Number(raw);\n\t\tif (!Number.isSafeInteger(parsed)) {\n\t\t\tthrow new ConfigurationError(`${environmentName} must be a safe integer, got ${raw}`);\n\t\t}\n\t\treturn parsed;\n\t}\n\n\t/**\n\t * Parses a boolean from an environment variable string.\n\t * Accepts 'true'/'false'/'1'/'0' case-insensitively.\n\t *\n\t * @param raw - Raw environment variable string\n\t * @returns Parsed boolean, or undefined if the value is invalid\n\t * @private\n\t */\n\tprivate parseBoolean(raw: string): boolean | undefined {\n\t\tconst v = raw.trim().toLowerCase();\n\t\tif (v === 'true' || v === '1') return true;\n\t\tif (v === 'false' || v === '0') return false;\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Parses a configuration file (JSON or YAML).\n\t *\n\t * Detects the file type by extension and uses the appropriate parser.\n\t * Supports `.json`, `.yaml`, and `.yml` file extensions.\n\t *\n\t * @param filePath - Path to the configuration file to parse\n\t * @returns The parsed configuration object\n\t * @throws {Error} If the file cannot be parsed\n\t * @private\n\t */\n\tprivate parseConfig(filePath: string): ConfigFileOptions {\n\t\tconst content = readFileSync(filePath, 'utf-8');\n\t\tconst ext = filePath.split('.').pop()?.toLowerCase();\n\n\t\tconst raw: unknown = ext === 'yaml' || ext === 'yml' ? parseYaml(content) : JSON.parse(content);\n\n\t\treturn v.parse(ConfigFileOptionsSchema, raw) as ConfigFileOptions;\n\t}\n\n\t/**\n\t * Converts file-based configuration to ServerConfig options.\n\t *\n\t * This is a convenience method for extracting the ServerConfig-relevant\n\t * options from a file-based configuration.\n\t *\n\t * @param config - The configuration to convert\n\t * @returns An object with ServerConfig-compatible options\n\t *\n\t * @example\n\t * ```typescript\n\t * const loader = new ConfigLoader();\n\t * const config = loader.load();\n\t * if (config) {\n\t * const serverOpts = loader.toServerConfigOptions(config);\n\t * const serverConfig = new ServerConfig(serverOpts);\n\t * }\n\t * ```\n\t */\n\ttoServerConfigOptions(config: ConfigFileOptions): ServerConfigOptions {\n\t\treturn {\n\t\t\tmaxHistorySize: config.maxHistorySize,\n\t\t\tmaxBranches: config.maxBranches,\n\t\t\tmaxBranchSize: config.maxBranchSize,\n\t\t\tskillDirs: config.skillDirs,\n\t\t\ttoolDirs: config.toolDirs,\n\t\t\tdiscoveryCache: config.discoveryCache,\n\t\t\tpersistence: config.persistence,\n\t\t\tfeatures: config.features,\n\t\t\ttoolInterleaveTtlMs: config.toolInterleaveTtlMs,\n\t\t\ttoolInterleaveSweepMs: config.toolInterleaveSweepMs,\n\t\t\tmaxSessionsPerOwner: config.maxSessionsPerOwner,\n\t\t};\n\t}\n}\n"],"names":["ConfigFileOptionsSchema","v","ConfigLoader","customPath","join","homedir","config","configPath","existsSync","error","console","getErrorMessage","result","undefined","process","seconds","ttl","Number","ConfigurationError","maxSize","boolMap","envVar","key","Object","raw","parsed","features","strategyRaw","environmentName","filePath","content","readFileSync","ext","parseYaml","JSON"],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request context management using AsyncLocalStorage for correlation IDs.
|
|
3
|
+
*
|
|
4
|
+
* Provides zero-cost request ID propagation across async boundaries
|
|
5
|
+
* via Node.js AsyncLocalStorage.
|
|
6
|
+
*
|
|
7
|
+
* @module context
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Internal context structure stored per-request.
|
|
11
|
+
*/
|
|
12
|
+
interface RequestCtx {
|
|
13
|
+
requestId: string;
|
|
14
|
+
owner?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get the current request ID from context.
|
|
18
|
+
*
|
|
19
|
+
* Returns undefined if called outside of a runWithContext() call.
|
|
20
|
+
*
|
|
21
|
+
* @returns The current request ID or undefined
|
|
22
|
+
*/
|
|
23
|
+
export declare function getRequestId(): string | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Run a function with the given request context. The context propagates
|
|
26
|
+
* across async boundaries via AsyncLocalStorage.
|
|
27
|
+
*
|
|
28
|
+
* @param ctx - Request context to install (requestId, optional owner)
|
|
29
|
+
* @param fn - Function to execute within the context
|
|
30
|
+
* @returns The return value of `fn`
|
|
31
|
+
*/
|
|
32
|
+
export declare function runWithContext<T>(ctx: RequestCtx, fn: () => T): T;
|
|
33
|
+
/**
|
|
34
|
+
* Get the current owner identifier from context.
|
|
35
|
+
*
|
|
36
|
+
* Returns undefined when called outside of a runWithContext() call or when
|
|
37
|
+
* the context did not specify an owner (e.g. stdio transport).
|
|
38
|
+
*
|
|
39
|
+
* @returns The current owner or undefined
|
|
40
|
+
*/
|
|
41
|
+
export declare function getOwner(): string | undefined;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=RequestContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestContext.d.ts","sourceRoot":"","sources":["../../src/context/RequestContext.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;GAEG;AACH,UAAU,UAAU;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAQD;;;;;;GAMG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAEjD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEjE;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAE7C"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
const store = new AsyncLocalStorage();
|
|
3
|
+
function getRequestId() {
|
|
4
|
+
return store.getStore()?.requestId;
|
|
5
|
+
}
|
|
6
|
+
function runWithContext(ctx, fn) {
|
|
7
|
+
return store.run(ctx, fn);
|
|
8
|
+
}
|
|
9
|
+
function getOwner() {
|
|
10
|
+
return store.getStore()?.owner;
|
|
11
|
+
}
|
|
12
|
+
export { getOwner, getRequestId, runWithContext };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=RequestContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context/RequestContext.js","sources":["../../src/context/RequestContext.ts"],"sourcesContent":["/**\n * Request context management using AsyncLocalStorage for correlation IDs.\n *\n * Provides zero-cost request ID propagation across async boundaries\n * via Node.js AsyncLocalStorage.\n *\n * @module context\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\n/**\n * Internal context structure stored per-request.\n */\ninterface RequestCtx {\n\trequestId: string;\n\towner?: string;\n}\n\n/**\n * AsyncLocalStorage instance for request context.\n * Stores requestId that propagates across async boundaries.\n */\nconst store = new AsyncLocalStorage<RequestCtx>();\n\n/**\n * Get the current request ID from context.\n *\n * Returns undefined if called outside of a runWithContext() call.\n *\n * @returns The current request ID or undefined\n */\nexport function getRequestId(): string | undefined {\n\treturn store.getStore()?.requestId;\n}\n\n/**\n * Run a function with the given request context. The context propagates\n * across async boundaries via AsyncLocalStorage.\n *\n * @param ctx - Request context to install (requestId, optional owner)\n * @param fn - Function to execute within the context\n * @returns The return value of `fn`\n */\nexport function runWithContext<T>(ctx: RequestCtx, fn: () => T): T {\n\treturn store.run(ctx, fn);\n}\n\n/**\n * Get the current owner identifier from context.\n *\n * Returns undefined when called outside of a runWithContext() call or when\n * the context did not specify an owner (e.g. stdio transport).\n *\n * @returns The current owner or undefined\n */\nexport function getOwner(): string | undefined {\n\treturn store.getStore()?.owner;\n}\n"],"names":["store","AsyncLocalStorage","getRequestId","runWithContext","ctx","fn","getOwner"],"mappings":";AAuBA,MAAMA,QAAQ,IAAIC;AASX,SAASC;IACf,OAAOF,MAAM,QAAQ,IAAI;AAC1B;AAUO,SAASG,eAAkBC,GAAe,EAAEC,EAAW;IAC7D,OAAOL,MAAM,GAAG,CAACI,KAAKC;AACvB;AAUO,SAASC;IACf,OAAON,MAAM,QAAQ,IAAI;AAC1B"}
|