@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
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { lstat, mkdir, mkdtemp, readFile, readdir, rename, rm } from "node:fs/promises";
|
|
2
|
+
import { basename, dirname, join } from "node:path";
|
|
3
|
+
import { GLOBAL_SESSION_ID, asSessionId } from "../contracts/ids.js";
|
|
4
|
+
import { PersistenceCompatibilityError, PersistenceCorruptionError, PersistenceLegacyAmbiguityError } from "../errors.js";
|
|
5
|
+
import { EdgeSchema } from "../schema.js";
|
|
6
|
+
import { SummarySchema } from "../core/compression/Summary.js";
|
|
7
|
+
import { parseEdge, parseSummary, parseThoughtData } from "./PersistenceCodec.js";
|
|
8
|
+
import { EMPTY_FILE_SNAPSHOT_V2, parseFileSnapshotV2, serializeFileSnapshotV2 } from "./FileSnapshotV2.js";
|
|
9
|
+
import { FileWriter, isFileNotFound } from "./FileWriter.js";
|
|
10
|
+
import { compareCodePoint, parsePersistenceBranchId } from "./PersistenceScope.js";
|
|
11
|
+
import * as __rspack_external_valibot from "valibot";
|
|
12
|
+
const LEGACY_NAMESPACES = [
|
|
13
|
+
'branches',
|
|
14
|
+
'edges',
|
|
15
|
+
'summaries'
|
|
16
|
+
];
|
|
17
|
+
async function destinationIsAbsent(path) {
|
|
18
|
+
try {
|
|
19
|
+
await lstat(path);
|
|
20
|
+
return false;
|
|
21
|
+
} catch (error) {
|
|
22
|
+
if (isFileNotFound(error)) return true;
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function parseJson(path) {
|
|
27
|
+
try {
|
|
28
|
+
return JSON.parse(await readFile(path, 'utf-8'));
|
|
29
|
+
} catch (error) {
|
|
30
|
+
if (error instanceof SyntaxError) throw new PersistenceCorruptionError(path, error);
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function parseThoughtArray(path) {
|
|
35
|
+
const raw = await parseJson(path);
|
|
36
|
+
try {
|
|
37
|
+
return __rspack_external_valibot.parse(__rspack_external_valibot.array(__rspack_external_valibot.unknown()), raw).map((thought)=>parseThoughtData(thought, path));
|
|
38
|
+
} catch (error) {
|
|
39
|
+
if (error instanceof PersistenceCompatibilityError) throw error;
|
|
40
|
+
throw new PersistenceCorruptionError(path, error);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async function namespaceFiles(sourceDataDir, namespace) {
|
|
44
|
+
const directory = join(sourceDataDir, namespace);
|
|
45
|
+
try {
|
|
46
|
+
const entries = await readdir(directory, {
|
|
47
|
+
withFileTypes: true
|
|
48
|
+
});
|
|
49
|
+
for (const entry of entries)if (!entry.isFile() || !entry.name.endsWith('.json')) throw new PersistenceCompatibilityError(directory, `unknown legacy artifact '${entry.name}'`);
|
|
50
|
+
return entries.map((entry)=>join(directory, entry.name)).sort(compareCodePoint);
|
|
51
|
+
} catch (error) {
|
|
52
|
+
if (isFileNotFound(error)) return [];
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function validateLegacyLayout(sourceDataDir) {
|
|
57
|
+
const entries = await readdir(sourceDataDir, {
|
|
58
|
+
withFileTypes: true
|
|
59
|
+
});
|
|
60
|
+
const allowed = new Set([
|
|
61
|
+
'history.json',
|
|
62
|
+
...LEGACY_NAMESPACES
|
|
63
|
+
]);
|
|
64
|
+
for (const entry of entries){
|
|
65
|
+
if (!allowed.has(entry.name)) throw new PersistenceCompatibilityError(sourceDataDir, `unknown legacy artifact '${entry.name}'`);
|
|
66
|
+
if ('history.json' === entry.name ? !entry.isFile() : !entry.isDirectory()) throw new PersistenceCompatibilityError(sourceDataDir, `invalid legacy artifact '${entry.name}'`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function groupHistory(thoughts) {
|
|
70
|
+
const grouped = new Map();
|
|
71
|
+
for (const thought of thoughts){
|
|
72
|
+
const sessionId = thought.session_id ?? GLOBAL_SESSION_ID;
|
|
73
|
+
const history = grouped.get(sessionId) ?? [];
|
|
74
|
+
history.push(thought);
|
|
75
|
+
grouped.set(sessionId, history);
|
|
76
|
+
}
|
|
77
|
+
return [
|
|
78
|
+
...grouped
|
|
79
|
+
].map(([sessionId, sessionThoughts])=>({
|
|
80
|
+
sessionId,
|
|
81
|
+
thoughts: sessionThoughts
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
async function loadLegacyHistory(sourceDataDir) {
|
|
85
|
+
const historyPath = join(sourceDataDir, 'history.json');
|
|
86
|
+
try {
|
|
87
|
+
return groupHistory(await parseThoughtArray(historyPath));
|
|
88
|
+
} catch (error) {
|
|
89
|
+
if (isFileNotFound(error)) return [];
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async function loadLegacyBranches(sourceDataDir) {
|
|
94
|
+
const records = [];
|
|
95
|
+
for (const path of (await namespaceFiles(sourceDataDir, 'branches'))){
|
|
96
|
+
const branchId = parsePersistenceBranchId(basename(path, '.json'), path);
|
|
97
|
+
const thoughts = await parseThoughtArray(path);
|
|
98
|
+
if (0 === thoughts.length) throw new PersistenceLegacyAmbiguityError(path, 'empty branch has no inferable session');
|
|
99
|
+
const sessions = new Set(thoughts.map((thought)=>thought.session_id ?? GLOBAL_SESSION_ID));
|
|
100
|
+
if (1 !== sessions.size) throw new PersistenceLegacyAmbiguityError(path, 'branch thoughts resolve to multiple sessions');
|
|
101
|
+
const [sessionId] = sessions;
|
|
102
|
+
if (void 0 === sessionId) throw new PersistenceLegacyAmbiguityError(path, 'branch session is absent');
|
|
103
|
+
records.push({
|
|
104
|
+
sessionId,
|
|
105
|
+
branchId,
|
|
106
|
+
thoughts
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return records;
|
|
110
|
+
}
|
|
111
|
+
async function loadLegacyEdges(sourceDataDir) {
|
|
112
|
+
const records = [];
|
|
113
|
+
for (const path of (await namespaceFiles(sourceDataDir, 'edges'))){
|
|
114
|
+
const sessionId = asSessionId(basename(path, '.json'));
|
|
115
|
+
try {
|
|
116
|
+
const edges = __rspack_external_valibot.parse(__rspack_external_valibot.array(EdgeSchema), await parseJson(path)).map(parseEdge);
|
|
117
|
+
if (edges.length > 0) records.push({
|
|
118
|
+
sessionId,
|
|
119
|
+
edges
|
|
120
|
+
});
|
|
121
|
+
} catch (error) {
|
|
122
|
+
if (error instanceof PersistenceCorruptionError) throw error;
|
|
123
|
+
throw new PersistenceCorruptionError(path, error);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return records;
|
|
127
|
+
}
|
|
128
|
+
async function loadLegacySummaries(sourceDataDir) {
|
|
129
|
+
const records = [];
|
|
130
|
+
for (const path of (await namespaceFiles(sourceDataDir, 'summaries'))){
|
|
131
|
+
const sessionId = asSessionId(basename(path, '.json'));
|
|
132
|
+
try {
|
|
133
|
+
const summaries = __rspack_external_valibot.parse(__rspack_external_valibot.array(SummarySchema), await parseJson(path)).map((summary)=>parseSummary(summary, path));
|
|
134
|
+
if (summaries.length > 0) records.push({
|
|
135
|
+
sessionId,
|
|
136
|
+
summaries
|
|
137
|
+
});
|
|
138
|
+
} catch (error) {
|
|
139
|
+
if (error instanceof PersistenceCorruptionError) throw error;
|
|
140
|
+
throw new PersistenceCorruptionError(path, error);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return records;
|
|
144
|
+
}
|
|
145
|
+
async function loadLegacySnapshot(sourceDataDir) {
|
|
146
|
+
await validateLegacyLayout(sourceDataDir);
|
|
147
|
+
return {
|
|
148
|
+
...EMPTY_FILE_SNAPSHOT_V2,
|
|
149
|
+
thoughts: await loadLegacyHistory(sourceDataDir),
|
|
150
|
+
branches: await loadLegacyBranches(sourceDataDir),
|
|
151
|
+
edges: await loadLegacyEdges(sourceDataDir),
|
|
152
|
+
summaries: await loadLegacySummaries(sourceDataDir)
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
async function importLegacyFileV1(sourceDataDir, destinationDataDir) {
|
|
156
|
+
if (!await destinationIsAbsent(destinationDataDir)) throw new PersistenceCompatibilityError(destinationDataDir, 'destination must be absent');
|
|
157
|
+
const snapshot = await loadLegacySnapshot(sourceDataDir);
|
|
158
|
+
await mkdir(dirname(destinationDataDir), {
|
|
159
|
+
recursive: true
|
|
160
|
+
});
|
|
161
|
+
const stagingDir = await mkdtemp(join(dirname(destinationDataDir), `.${basename(destinationDataDir)}.import-`));
|
|
162
|
+
const writer = new FileWriter(stagingDir);
|
|
163
|
+
try {
|
|
164
|
+
await writer.ready();
|
|
165
|
+
await writer.run(async (dataDir)=>{
|
|
166
|
+
const snapshotPath = join(dataDir, 'snapshot.json');
|
|
167
|
+
await writer.publish(snapshotPath, serializeFileSnapshotV2(snapshot, snapshotPath));
|
|
168
|
+
});
|
|
169
|
+
await writer.close();
|
|
170
|
+
parseFileSnapshotV2(await readFile(join(stagingDir, 'snapshot.json'), 'utf-8'), join(stagingDir, 'snapshot.json'));
|
|
171
|
+
await rename(stagingDir, destinationDataDir);
|
|
172
|
+
} catch (error) {
|
|
173
|
+
await writer.close();
|
|
174
|
+
await rm(stagingDir, {
|
|
175
|
+
recursive: true,
|
|
176
|
+
force: true
|
|
177
|
+
});
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
export { importLegacyFileV1 };
|
|
182
|
+
|
|
183
|
+
//# sourceMappingURL=FileLegacyImport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence/FileLegacyImport.js","sources":["../../src/persistence/FileLegacyImport.ts"],"sourcesContent":["import { lstat, mkdtemp, mkdir, readFile, readdir, rename, rm } from 'node:fs/promises';\nimport { basename, dirname, join } from 'node:path';\nimport * as v from 'valibot';\nimport { asSessionId, GLOBAL_SESSION_ID, type SessionId } from '../contracts/ids.js';\nimport {\n\tPersistenceCompatibilityError,\n\tPersistenceCorruptionError,\n\tPersistenceLegacyAmbiguityError,\n} from '../errors.js';\nimport { EdgeSchema } from '../schema.js';\nimport { SummarySchema } from '../core/compression/Summary.js';\nimport type { ThoughtData } from '../core/thought.js';\nimport { parseEdge, parseSummary, parseThoughtData } from './PersistenceCodec.js';\nimport {\n\tEMPTY_FILE_SNAPSHOT_V2,\n\tparseFileSnapshotV2,\n\tserializeFileSnapshotV2,\n} from './FileSnapshotV2.js';\nimport type {\n\tBranchRecordV2,\n\tEdgeSessionV2,\n\tFileSnapshotV2,\n\tSummarySessionV2,\n\tThoughtSessionV2,\n} from './FileSnapshotTypes.js';\nimport { FileWriter, isFileNotFound } from './FileWriter.js';\nimport { compareCodePoint, parsePersistenceBranchId } from './PersistenceScope.js';\n\nconst LEGACY_NAMESPACES = ['branches', 'edges', 'summaries'] as const;\n\nasync function destinationIsAbsent(path: string): Promise<boolean> {\n\ttry {\n\t\tawait lstat(path);\n\t\treturn false;\n\t} catch (error) {\n\t\tif (isFileNotFound(error)) return true;\n\t\tthrow error;\n\t}\n}\n\nasync function parseJson(path: string): Promise<unknown> {\n\ttry {\n\t\treturn JSON.parse(await readFile(path, 'utf-8'));\n\t} catch (error) {\n\t\tif (error instanceof SyntaxError) throw new PersistenceCorruptionError(path, error);\n\t\tthrow error;\n\t}\n}\n\nasync function parseThoughtArray(path: string): Promise<ThoughtData[]> {\n\tconst raw = await parseJson(path);\n\ttry {\n\t\treturn v.parse(v.array(v.unknown()), raw).map((thought) => parseThoughtData(thought, path));\n\t} catch (error) {\n\t\tif (error instanceof PersistenceCompatibilityError) throw error;\n\t\tthrow new PersistenceCorruptionError(path, error);\n\t}\n}\n\nasync function namespaceFiles(sourceDataDir: string, namespace: string): Promise<string[]> {\n\tconst directory = join(sourceDataDir, namespace);\n\ttry {\n\t\tconst entries = await readdir(directory, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tif (!entry.isFile() || !entry.name.endsWith('.json')) {\n\t\t\t\tthrow new PersistenceCompatibilityError(\n\t\t\t\t\tdirectory,\n\t\t\t\t\t`unknown legacy artifact '${entry.name}'`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn entries.map((entry) => join(directory, entry.name)).sort(compareCodePoint);\n\t} catch (error) {\n\t\tif (isFileNotFound(error)) return [];\n\t\tthrow error;\n\t}\n}\n\nasync function validateLegacyLayout(sourceDataDir: string): Promise<void> {\n\tconst entries = await readdir(sourceDataDir, { withFileTypes: true });\n\tconst allowed = new Set<string>(['history.json', ...LEGACY_NAMESPACES]);\n\tfor (const entry of entries) {\n\t\tif (!allowed.has(entry.name)) {\n\t\t\tthrow new PersistenceCompatibilityError(\n\t\t\t\tsourceDataDir,\n\t\t\t\t`unknown legacy artifact '${entry.name}'`\n\t\t\t);\n\t\t}\n\t\tif (entry.name === 'history.json' ? !entry.isFile() : !entry.isDirectory()) {\n\t\t\tthrow new PersistenceCompatibilityError(\n\t\t\t\tsourceDataDir,\n\t\t\t\t`invalid legacy artifact '${entry.name}'`\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction groupHistory(thoughts: readonly ThoughtData[]): ThoughtSessionV2[] {\n\tconst grouped = new Map<SessionId, ThoughtData[]>();\n\tfor (const thought of thoughts) {\n\t\tconst sessionId = thought.session_id ?? GLOBAL_SESSION_ID;\n\t\tconst history = grouped.get(sessionId) ?? [];\n\t\thistory.push(thought);\n\t\tgrouped.set(sessionId, history);\n\t}\n\treturn [...grouped].map(([sessionId, sessionThoughts]) => ({\n\t\tsessionId,\n\t\tthoughts: sessionThoughts,\n\t}));\n}\n\nasync function loadLegacyHistory(sourceDataDir: string): Promise<ThoughtSessionV2[]> {\n\tconst historyPath = join(sourceDataDir, 'history.json');\n\ttry {\n\t\treturn groupHistory(await parseThoughtArray(historyPath));\n\t} catch (error) {\n\t\tif (isFileNotFound(error)) return [];\n\t\tthrow error;\n\t}\n}\n\nasync function loadLegacyBranches(sourceDataDir: string): Promise<BranchRecordV2[]> {\n\tconst records: BranchRecordV2[] = [];\n\tfor (const path of await namespaceFiles(sourceDataDir, 'branches')) {\n\t\tconst branchId = parsePersistenceBranchId(basename(path, '.json'), path);\n\t\tconst thoughts = await parseThoughtArray(path);\n\t\tif (thoughts.length === 0) {\n\t\t\tthrow new PersistenceLegacyAmbiguityError(path, 'empty branch has no inferable session');\n\t\t}\n\t\tconst sessions = new Set(thoughts.map((thought) => thought.session_id ?? GLOBAL_SESSION_ID));\n\t\tif (sessions.size !== 1) {\n\t\t\tthrow new PersistenceLegacyAmbiguityError(\n\t\t\t\tpath,\n\t\t\t\t'branch thoughts resolve to multiple sessions'\n\t\t\t);\n\t\t}\n\t\tconst [sessionId] = sessions;\n\t\tif (sessionId === undefined) {\n\t\t\tthrow new PersistenceLegacyAmbiguityError(path, 'branch session is absent');\n\t\t}\n\t\trecords.push({ sessionId, branchId, thoughts });\n\t}\n\treturn records;\n}\n\nasync function loadLegacyEdges(sourceDataDir: string): Promise<EdgeSessionV2[]> {\n\tconst records: EdgeSessionV2[] = [];\n\tfor (const path of await namespaceFiles(sourceDataDir, 'edges')) {\n\t\tconst sessionId = asSessionId(basename(path, '.json'));\n\t\ttry {\n\t\t\tconst edges = v.parse(v.array(EdgeSchema), await parseJson(path)).map(parseEdge);\n\t\t\tif (edges.length > 0) records.push({ sessionId, edges });\n\t\t} catch (error) {\n\t\t\tif (error instanceof PersistenceCorruptionError) throw error;\n\t\t\tthrow new PersistenceCorruptionError(path, error);\n\t\t}\n\t}\n\treturn records;\n}\n\nasync function loadLegacySummaries(sourceDataDir: string): Promise<SummarySessionV2[]> {\n\tconst records: SummarySessionV2[] = [];\n\tfor (const path of await namespaceFiles(sourceDataDir, 'summaries')) {\n\t\tconst sessionId = asSessionId(basename(path, '.json'));\n\t\ttry {\n\t\t\tconst summaries = v\n\t\t\t\t.parse(v.array(SummarySchema), await parseJson(path))\n\t\t\t\t.map((summary) => parseSummary(summary, path));\n\t\t\tif (summaries.length > 0) records.push({ sessionId, summaries });\n\t\t} catch (error) {\n\t\t\tif (error instanceof PersistenceCorruptionError) throw error;\n\t\t\tthrow new PersistenceCorruptionError(path, error);\n\t\t}\n\t}\n\treturn records;\n}\n\nasync function loadLegacySnapshot(sourceDataDir: string): Promise<FileSnapshotV2> {\n\tawait validateLegacyLayout(sourceDataDir);\n\treturn {\n\t\t...EMPTY_FILE_SNAPSHOT_V2,\n\t\tthoughts: await loadLegacyHistory(sourceDataDir),\n\t\tbranches: await loadLegacyBranches(sourceDataDir),\n\t\tedges: await loadLegacyEdges(sourceDataDir),\n\t\tsummaries: await loadLegacySummaries(sourceDataDir),\n\t};\n}\n\nexport async function importLegacyFileV1(\n\tsourceDataDir: string,\n\tdestinationDataDir: string\n): Promise<void> {\n\tif (!(await destinationIsAbsent(destinationDataDir))) {\n\t\tthrow new PersistenceCompatibilityError(destinationDataDir, 'destination must be absent');\n\t}\n\tconst snapshot = await loadLegacySnapshot(sourceDataDir);\n\tawait mkdir(dirname(destinationDataDir), { recursive: true });\n\tconst stagingDir = await mkdtemp(\n\t\tjoin(dirname(destinationDataDir), `.${basename(destinationDataDir)}.import-`)\n\t);\n\tconst writer = new FileWriter(stagingDir);\n\ttry {\n\t\tawait writer.ready();\n\t\tawait writer.run(async (dataDir) => {\n\t\t\tconst snapshotPath = join(dataDir, 'snapshot.json');\n\t\t\tawait writer.publish(snapshotPath, serializeFileSnapshotV2(snapshot, snapshotPath));\n\t\t});\n\t\tawait writer.close();\n\t\tparseFileSnapshotV2(\n\t\t\tawait readFile(join(stagingDir, 'snapshot.json'), 'utf-8'),\n\t\t\tjoin(stagingDir, 'snapshot.json')\n\t\t);\n\t\tawait rename(stagingDir, destinationDataDir);\n\t} catch (error) {\n\t\tawait writer.close();\n\t\tawait rm(stagingDir, { recursive: true, force: true });\n\t\tthrow error;\n\t}\n}\n"],"names":["LEGACY_NAMESPACES","destinationIsAbsent","path","lstat","error","isFileNotFound","parseJson","JSON","readFile","SyntaxError","PersistenceCorruptionError","parseThoughtArray","raw","v","thought","parseThoughtData","PersistenceCompatibilityError","namespaceFiles","sourceDataDir","namespace","directory","join","entries","readdir","entry","compareCodePoint","validateLegacyLayout","allowed","Set","groupHistory","thoughts","grouped","Map","sessionId","GLOBAL_SESSION_ID","history","sessionThoughts","loadLegacyHistory","historyPath","loadLegacyBranches","records","branchId","parsePersistenceBranchId","basename","PersistenceLegacyAmbiguityError","sessions","undefined","loadLegacyEdges","asSessionId","edges","EdgeSchema","parseEdge","loadLegacySummaries","summaries","SummarySchema","summary","parseSummary","loadLegacySnapshot","EMPTY_FILE_SNAPSHOT_V2","importLegacyFileV1","destinationDataDir","snapshot","mkdir","dirname","stagingDir","mkdtemp","writer","FileWriter","dataDir","snapshotPath","serializeFileSnapshotV2","parseFileSnapshotV2","rename","rm"],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { IMetrics } from '../contracts/interfaces.js';
|
|
2
|
+
import type { PersistenceConfig, SessionScopedPersistenceBackend } from '../contracts/PersistenceBackend.js';
|
|
3
|
+
import { type BranchId, type SessionId } from '../contracts/ids.js';
|
|
4
|
+
import type { Summary } from '../core/compression/Summary.js';
|
|
5
|
+
import type { Edge } from '../core/graph/Edge.js';
|
|
6
|
+
import type { ThoughtData } from '../core/thought.js';
|
|
7
|
+
import { type FileWriterOperations } from './FileWriter.js';
|
|
8
|
+
type FilePersistenceOptions = NonNullable<PersistenceConfig['options']> & {
|
|
9
|
+
readonly metrics?: IMetrics;
|
|
10
|
+
readonly writerOperations?: FileWriterOperations;
|
|
11
|
+
};
|
|
12
|
+
export declare class FilePersistence implements SessionScopedPersistenceBackend {
|
|
13
|
+
private readonly _dataDir;
|
|
14
|
+
private readonly _maxHistorySize;
|
|
15
|
+
private readonly _persistBranches;
|
|
16
|
+
private readonly _metrics;
|
|
17
|
+
private readonly _writer;
|
|
18
|
+
constructor(options?: FilePersistenceOptions);
|
|
19
|
+
static create(options?: FilePersistenceOptions): Promise<FilePersistence>;
|
|
20
|
+
saveThought(thought: ThoughtData): Promise<void>;
|
|
21
|
+
saveThoughtForSession(sessionId: SessionId, thought: ThoughtData): Promise<void>;
|
|
22
|
+
private _saveThought;
|
|
23
|
+
loadHistory(): Promise<ThoughtData[]>;
|
|
24
|
+
loadHistoryForSession(sessionId: SessionId): Promise<ThoughtData[]>;
|
|
25
|
+
saveBranch(branchId: BranchId, thoughts: ThoughtData[]): Promise<void>;
|
|
26
|
+
saveBranchForSession(sessionId: SessionId, branchId: BranchId, thoughts: readonly ThoughtData[]): Promise<void>;
|
|
27
|
+
private _saveBranch;
|
|
28
|
+
deleteBranch(branchId: BranchId): Promise<void>;
|
|
29
|
+
deleteBranchForSession(sessionId: SessionId, branchId: BranchId): Promise<void>;
|
|
30
|
+
loadBranch(branchId: BranchId): Promise<ThoughtData[] | undefined>;
|
|
31
|
+
loadBranchForSession(sessionId: SessionId, branchId: BranchId): Promise<ThoughtData[] | undefined>;
|
|
32
|
+
listBranches(): Promise<BranchId[]>;
|
|
33
|
+
listBranchesForSession(sessionId: SessionId): Promise<BranchId[]>;
|
|
34
|
+
listSessions(): Promise<SessionId[]>;
|
|
35
|
+
clear(): Promise<void>;
|
|
36
|
+
clearSession(sessionId: SessionId): Promise<void>;
|
|
37
|
+
saveEdges(sessionId: SessionId, edges: readonly Edge[]): Promise<void>;
|
|
38
|
+
loadEdges(sessionId: SessionId): Promise<Edge[]>;
|
|
39
|
+
listEdgeSessions(): Promise<SessionId[]>;
|
|
40
|
+
saveSummaries(sessionId: SessionId, summaries: readonly Summary[]): Promise<void>;
|
|
41
|
+
loadSummaries(sessionId: SessionId): Promise<Summary[]>;
|
|
42
|
+
healthy(): Promise<boolean>;
|
|
43
|
+
getDataDir(): string;
|
|
44
|
+
getBranchIds(): Promise<string[]>;
|
|
45
|
+
close(): Promise<void>;
|
|
46
|
+
private _read;
|
|
47
|
+
private _mutate;
|
|
48
|
+
private _loadSnapshot;
|
|
49
|
+
private _legacyArtifacts;
|
|
50
|
+
private _measure;
|
|
51
|
+
}
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=FilePersistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilePersistence.d.ts","sourceRoot":"","sources":["../../src/persistence/FilePersistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { readFile, readdir } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { GLOBAL_SESSION_ID, asSessionId } from "../contracts/ids.js";
|
|
6
|
+
import { PersistenceImportRequiredError } from "../errors.js";
|
|
7
|
+
import { EMPTY_FILE_SNAPSHOT_V2, parseFileSnapshotV2, serializeFileSnapshotV2, sessionsInSnapshot } from "./FileSnapshotV2.js";
|
|
8
|
+
import { FileWriter, isFileNotFound } from "./FileWriter.js";
|
|
9
|
+
import { assertBranchScope, assertEdgeScopes, assertPersistableThoughtCollections, assertPersistableThoughts, assertSummaryScopes, assertThoughtScope, compareCodePoint, parsePersistenceBranchId } from "./PersistenceScope.js";
|
|
10
|
+
const SNAPSHOT_NAME = 'snapshot.json';
|
|
11
|
+
const LEGACY_DIRECTORIES = [
|
|
12
|
+
'branches',
|
|
13
|
+
'edges',
|
|
14
|
+
'summaries'
|
|
15
|
+
];
|
|
16
|
+
class FilePersistence {
|
|
17
|
+
_dataDir;
|
|
18
|
+
_maxHistorySize;
|
|
19
|
+
_persistBranches;
|
|
20
|
+
_metrics;
|
|
21
|
+
_writer;
|
|
22
|
+
constructor(options){
|
|
23
|
+
const defaultDataDir = existsSync('.claude/data') ? '.claude/data' : join(homedir(), '.claude/data');
|
|
24
|
+
this._dataDir = options?.dataDir ?? defaultDataDir;
|
|
25
|
+
this._maxHistorySize = options?.maxHistorySize ?? 10000;
|
|
26
|
+
this._persistBranches = options?.persistBranches ?? true;
|
|
27
|
+
this._metrics = options?.metrics;
|
|
28
|
+
this._writer = new FileWriter(this._dataDir, options?.writerOperations);
|
|
29
|
+
}
|
|
30
|
+
static async create(options) {
|
|
31
|
+
const persistence = new FilePersistence(options);
|
|
32
|
+
try {
|
|
33
|
+
await persistence._writer.ready();
|
|
34
|
+
await persistence._writer.run(async (dataDir)=>await persistence._loadSnapshot(dataDir));
|
|
35
|
+
return persistence;
|
|
36
|
+
} catch (error) {
|
|
37
|
+
await persistence.close();
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async saveThought(thought) {
|
|
42
|
+
assertThoughtScope('saveThought', GLOBAL_SESSION_ID, thought);
|
|
43
|
+
await this._saveThought(GLOBAL_SESSION_ID, thought);
|
|
44
|
+
}
|
|
45
|
+
async saveThoughtForSession(sessionId, thought) {
|
|
46
|
+
const validatedSessionId = asSessionId(sessionId);
|
|
47
|
+
assertThoughtScope('saveThoughtForSession', validatedSessionId, thought);
|
|
48
|
+
await this._saveThought(validatedSessionId, thought);
|
|
49
|
+
}
|
|
50
|
+
async _saveThought(sessionId, thought) {
|
|
51
|
+
assertPersistableThoughts([
|
|
52
|
+
thought
|
|
53
|
+
], `${sessionId}/thoughts`);
|
|
54
|
+
await this._mutate('save_thought', (snapshot)=>{
|
|
55
|
+
const current = snapshot.thoughts.find((record)=>record.sessionId === sessionId)?.thoughts ?? [];
|
|
56
|
+
const prospective = [
|
|
57
|
+
...current,
|
|
58
|
+
thought
|
|
59
|
+
];
|
|
60
|
+
assertPersistableThoughtCollections([
|
|
61
|
+
{
|
|
62
|
+
sessionId,
|
|
63
|
+
thoughts: prospective
|
|
64
|
+
},
|
|
65
|
+
...snapshot.branches.filter((record)=>record.sessionId === sessionId).map((record)=>({
|
|
66
|
+
sessionId,
|
|
67
|
+
thoughts: record.thoughts
|
|
68
|
+
}))
|
|
69
|
+
], `${sessionId}/thoughts`);
|
|
70
|
+
const retained = this._maxHistorySize > 0 ? prospective.slice(-this._maxHistorySize) : prospective;
|
|
71
|
+
return {
|
|
72
|
+
...snapshot,
|
|
73
|
+
thoughts: [
|
|
74
|
+
...snapshot.thoughts.filter((record)=>record.sessionId !== sessionId),
|
|
75
|
+
{
|
|
76
|
+
sessionId,
|
|
77
|
+
thoughts: retained
|
|
78
|
+
}
|
|
79
|
+
]
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
async loadHistory() {
|
|
84
|
+
return await this.loadHistoryForSession(GLOBAL_SESSION_ID);
|
|
85
|
+
}
|
|
86
|
+
async loadHistoryForSession(sessionId) {
|
|
87
|
+
const validatedSessionId = asSessionId(sessionId);
|
|
88
|
+
return await this._read('load_history', (snapshot)=>[
|
|
89
|
+
...snapshot.thoughts.find((record)=>record.sessionId === validatedSessionId)?.thoughts ?? []
|
|
90
|
+
]);
|
|
91
|
+
}
|
|
92
|
+
async saveBranch(branchId, thoughts) {
|
|
93
|
+
const validatedBranchId = parsePersistenceBranchId(branchId, 'global/branches');
|
|
94
|
+
assertBranchScope('saveBranch', GLOBAL_SESSION_ID, validatedBranchId, thoughts);
|
|
95
|
+
await this._saveBranch(GLOBAL_SESSION_ID, validatedBranchId, thoughts);
|
|
96
|
+
}
|
|
97
|
+
async saveBranchForSession(sessionId, branchId, thoughts) {
|
|
98
|
+
const validatedSessionId = asSessionId(sessionId);
|
|
99
|
+
const validatedBranchId = parsePersistenceBranchId(branchId, `${validatedSessionId}/branches`);
|
|
100
|
+
assertBranchScope('saveBranchForSession', validatedSessionId, validatedBranchId, thoughts);
|
|
101
|
+
await this._saveBranch(validatedSessionId, validatedBranchId, thoughts);
|
|
102
|
+
}
|
|
103
|
+
async _saveBranch(sessionId, branchId, thoughts) {
|
|
104
|
+
assertPersistableThoughtCollections([
|
|
105
|
+
{
|
|
106
|
+
sessionId,
|
|
107
|
+
thoughts
|
|
108
|
+
}
|
|
109
|
+
], `${sessionId}/branches/${branchId}`);
|
|
110
|
+
if (!this._persistBranches) return void await this._writer.run(async (dataDir)=>{
|
|
111
|
+
const snapshot = await this._loadSnapshot(dataDir);
|
|
112
|
+
assertPersistableThoughtCollections([
|
|
113
|
+
{
|
|
114
|
+
sessionId,
|
|
115
|
+
thoughts: snapshot.thoughts.find((record)=>record.sessionId === sessionId)?.thoughts ?? []
|
|
116
|
+
},
|
|
117
|
+
...snapshot.branches.filter((record)=>record.sessionId === sessionId).map((record)=>({
|
|
118
|
+
sessionId,
|
|
119
|
+
thoughts: record.thoughts
|
|
120
|
+
})),
|
|
121
|
+
{
|
|
122
|
+
sessionId,
|
|
123
|
+
thoughts
|
|
124
|
+
}
|
|
125
|
+
], `${sessionId}/branches/${branchId}`);
|
|
126
|
+
});
|
|
127
|
+
await this._mutate('save_branch', (snapshot)=>({
|
|
128
|
+
...snapshot,
|
|
129
|
+
branches: [
|
|
130
|
+
...snapshot.branches.filter((record)=>record.sessionId !== sessionId || record.branchId !== branchId),
|
|
131
|
+
{
|
|
132
|
+
sessionId,
|
|
133
|
+
branchId,
|
|
134
|
+
thoughts: [
|
|
135
|
+
...thoughts
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
]
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
async deleteBranch(branchId) {
|
|
142
|
+
await this.deleteBranchForSession(GLOBAL_SESSION_ID, branchId);
|
|
143
|
+
}
|
|
144
|
+
async deleteBranchForSession(sessionId, branchId) {
|
|
145
|
+
if (!this._persistBranches) return;
|
|
146
|
+
const validatedSessionId = asSessionId(sessionId);
|
|
147
|
+
const validatedBranchId = parsePersistenceBranchId(branchId, `${validatedSessionId}/branches`);
|
|
148
|
+
await this._mutate('delete_branch', (snapshot)=>({
|
|
149
|
+
...snapshot,
|
|
150
|
+
branches: snapshot.branches.filter((record)=>record.sessionId !== validatedSessionId || record.branchId !== validatedBranchId)
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
async loadBranch(branchId) {
|
|
154
|
+
return await this.loadBranchForSession(GLOBAL_SESSION_ID, branchId);
|
|
155
|
+
}
|
|
156
|
+
async loadBranchForSession(sessionId, branchId) {
|
|
157
|
+
if (!this._persistBranches) return;
|
|
158
|
+
const validatedSessionId = asSessionId(sessionId);
|
|
159
|
+
const validatedBranchId = parsePersistenceBranchId(branchId, `${validatedSessionId}/branches`);
|
|
160
|
+
return await this._read('load_branch', (snapshot)=>{
|
|
161
|
+
const thoughts = snapshot.branches.find((record)=>record.sessionId === validatedSessionId && record.branchId === validatedBranchId)?.thoughts;
|
|
162
|
+
return void 0 === thoughts ? void 0 : [
|
|
163
|
+
...thoughts
|
|
164
|
+
];
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
async listBranches() {
|
|
168
|
+
return await this.listBranchesForSession(GLOBAL_SESSION_ID);
|
|
169
|
+
}
|
|
170
|
+
async listBranchesForSession(sessionId) {
|
|
171
|
+
if (!this._persistBranches) return [];
|
|
172
|
+
const validatedSessionId = asSessionId(sessionId);
|
|
173
|
+
return await this._read('list_branches', (snapshot)=>snapshot.branches.filter((record)=>record.sessionId === validatedSessionId).map((record)=>record.branchId).sort(compareCodePoint));
|
|
174
|
+
}
|
|
175
|
+
async listSessions() {
|
|
176
|
+
return await this._read('list_sessions', sessionsInSnapshot);
|
|
177
|
+
}
|
|
178
|
+
async clear() {
|
|
179
|
+
await this._mutate('clear', ()=>EMPTY_FILE_SNAPSHOT_V2);
|
|
180
|
+
}
|
|
181
|
+
async clearSession(sessionId) {
|
|
182
|
+
const validatedSessionId = asSessionId(sessionId);
|
|
183
|
+
await this._mutate('clear_session', (snapshot)=>({
|
|
184
|
+
version: 2,
|
|
185
|
+
thoughts: snapshot.thoughts.filter((record)=>record.sessionId !== validatedSessionId),
|
|
186
|
+
branches: snapshot.branches.filter((record)=>record.sessionId !== validatedSessionId),
|
|
187
|
+
edges: snapshot.edges.filter((record)=>record.sessionId !== validatedSessionId),
|
|
188
|
+
summaries: snapshot.summaries.filter((record)=>record.sessionId !== validatedSessionId)
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
async saveEdges(sessionId, edges) {
|
|
192
|
+
const validatedSessionId = asSessionId(sessionId);
|
|
193
|
+
assertEdgeScopes(validatedSessionId, edges);
|
|
194
|
+
await this._mutate('save_edges', (snapshot)=>({
|
|
195
|
+
...snapshot,
|
|
196
|
+
edges: [
|
|
197
|
+
...snapshot.edges.filter((record)=>record.sessionId !== validatedSessionId),
|
|
198
|
+
...0 === edges.length ? [] : [
|
|
199
|
+
{
|
|
200
|
+
sessionId: validatedSessionId,
|
|
201
|
+
edges: [
|
|
202
|
+
...edges
|
|
203
|
+
]
|
|
204
|
+
}
|
|
205
|
+
]
|
|
206
|
+
]
|
|
207
|
+
}));
|
|
208
|
+
}
|
|
209
|
+
async loadEdges(sessionId) {
|
|
210
|
+
const validatedSessionId = asSessionId(sessionId);
|
|
211
|
+
return await this._read('load_edges', (snapshot)=>[
|
|
212
|
+
...snapshot.edges.find((record)=>record.sessionId === validatedSessionId)?.edges ?? []
|
|
213
|
+
]);
|
|
214
|
+
}
|
|
215
|
+
async listEdgeSessions() {
|
|
216
|
+
return await this._read('list_edge_sessions', (snapshot)=>snapshot.edges.map((record)=>record.sessionId).sort(compareCodePoint));
|
|
217
|
+
}
|
|
218
|
+
async saveSummaries(sessionId, summaries) {
|
|
219
|
+
const validatedSessionId = asSessionId(sessionId);
|
|
220
|
+
assertSummaryScopes(validatedSessionId, summaries);
|
|
221
|
+
await this._mutate('save_summaries', (snapshot)=>({
|
|
222
|
+
...snapshot,
|
|
223
|
+
summaries: [
|
|
224
|
+
...snapshot.summaries.filter((record)=>record.sessionId !== validatedSessionId),
|
|
225
|
+
...0 === summaries.length ? [] : [
|
|
226
|
+
{
|
|
227
|
+
sessionId: validatedSessionId,
|
|
228
|
+
summaries: [
|
|
229
|
+
...summaries
|
|
230
|
+
]
|
|
231
|
+
}
|
|
232
|
+
]
|
|
233
|
+
]
|
|
234
|
+
}));
|
|
235
|
+
}
|
|
236
|
+
async loadSummaries(sessionId) {
|
|
237
|
+
const validatedSessionId = asSessionId(sessionId);
|
|
238
|
+
return await this._read('load_summaries', (snapshot)=>[
|
|
239
|
+
...snapshot.summaries.find((record)=>record.sessionId === validatedSessionId)?.summaries ?? []
|
|
240
|
+
]);
|
|
241
|
+
}
|
|
242
|
+
async healthy() {
|
|
243
|
+
try {
|
|
244
|
+
await this._writer.run(async (dataDir)=>await this._loadSnapshot(dataDir));
|
|
245
|
+
return true;
|
|
246
|
+
} catch (error) {
|
|
247
|
+
if (error instanceof Error) return false;
|
|
248
|
+
throw error;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
getDataDir() {
|
|
252
|
+
return this._dataDir;
|
|
253
|
+
}
|
|
254
|
+
async getBranchIds() {
|
|
255
|
+
return await this.listBranches();
|
|
256
|
+
}
|
|
257
|
+
async close() {
|
|
258
|
+
await this._writer.close();
|
|
259
|
+
}
|
|
260
|
+
async _read(operation, select) {
|
|
261
|
+
return await this._measure(operation, async ()=>await this._writer.run(async (dataDir)=>select(await this._loadSnapshot(dataDir))));
|
|
262
|
+
}
|
|
263
|
+
async _mutate(operation, mutate) {
|
|
264
|
+
await this._measure(operation, async ()=>{
|
|
265
|
+
await this._writer.run(async (dataDir)=>{
|
|
266
|
+
const snapshotPath = join(dataDir, SNAPSHOT_NAME);
|
|
267
|
+
const updated = mutate(await this._loadSnapshot(dataDir));
|
|
268
|
+
await this._writer.publish(snapshotPath, serializeFileSnapshotV2(updated, snapshotPath));
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
async _loadSnapshot(dataDir) {
|
|
273
|
+
const snapshotPath = join(dataDir, SNAPSHOT_NAME);
|
|
274
|
+
try {
|
|
275
|
+
return parseFileSnapshotV2(await readFile(snapshotPath, 'utf-8'), snapshotPath);
|
|
276
|
+
} catch (error) {
|
|
277
|
+
if (!isFileNotFound(error)) throw error;
|
|
278
|
+
}
|
|
279
|
+
const legacyArtifacts = await this._legacyArtifacts(dataDir);
|
|
280
|
+
if (legacyArtifacts.length > 0) throw new PersistenceImportRequiredError(dataDir, legacyArtifacts);
|
|
281
|
+
return EMPTY_FILE_SNAPSHOT_V2;
|
|
282
|
+
}
|
|
283
|
+
async _legacyArtifacts(dataDir) {
|
|
284
|
+
const artifacts = [];
|
|
285
|
+
try {
|
|
286
|
+
await readFile(join(dataDir, 'history.json'), 'utf-8');
|
|
287
|
+
artifacts.push('history.json');
|
|
288
|
+
} catch (error) {
|
|
289
|
+
if (!isFileNotFound(error)) throw error;
|
|
290
|
+
}
|
|
291
|
+
for (const directory of LEGACY_DIRECTORIES)try {
|
|
292
|
+
const files = await readdir(join(dataDir, directory));
|
|
293
|
+
artifacts.push(...files.filter((file)=>file.endsWith('.json')).map((file)=>`${directory}/${file}`));
|
|
294
|
+
} catch (error) {
|
|
295
|
+
if (!isFileNotFound(error)) throw error;
|
|
296
|
+
}
|
|
297
|
+
return artifacts.sort(compareCodePoint);
|
|
298
|
+
}
|
|
299
|
+
async _measure(operation, action) {
|
|
300
|
+
const startTime = Date.now();
|
|
301
|
+
try {
|
|
302
|
+
return await action();
|
|
303
|
+
} finally{
|
|
304
|
+
this._metrics?.histogram('persistence_op_duration_seconds', (Date.now() - startTime) / 1000, {
|
|
305
|
+
operation
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
export { FilePersistence };
|
|
311
|
+
|
|
312
|
+
//# sourceMappingURL=FilePersistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence/FilePersistence.js","sources":["../../src/persistence/FilePersistence.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { readFile, readdir } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { IMetrics } from '../contracts/interfaces.js';\nimport type {\n\tPersistenceConfig,\n\tSessionScopedPersistenceBackend,\n} from '../contracts/PersistenceBackend.js';\nimport { asSessionId, GLOBAL_SESSION_ID, type BranchId, type SessionId } from '../contracts/ids.js';\nimport type { Summary } from '../core/compression/Summary.js';\nimport type { Edge } from '../core/graph/Edge.js';\nimport type { ThoughtData } from '../core/thought.js';\nimport { PersistenceImportRequiredError } from '../errors.js';\nimport {\n\tEMPTY_FILE_SNAPSHOT_V2,\n\tparseFileSnapshotV2,\n\tserializeFileSnapshotV2,\n\tsessionsInSnapshot,\n} from './FileSnapshotV2.js';\nimport type { FileSnapshotV2 } from './FileSnapshotTypes.js';\nimport { FileWriter, isFileNotFound, type FileWriterOperations } from './FileWriter.js';\nimport {\n\tassertBranchScope,\n\tassertEdgeScopes,\n\tassertPersistableThoughtCollections,\n\tassertPersistableThoughts,\n\tassertSummaryScopes,\n\tassertThoughtScope,\n\tcompareCodePoint,\n\tparsePersistenceBranchId,\n} from './PersistenceScope.js';\n\ntype FilePersistenceOptions = NonNullable<PersistenceConfig['options']> & {\n\treadonly metrics?: IMetrics;\n\treadonly writerOperations?: FileWriterOperations;\n};\n\nconst SNAPSHOT_NAME = 'snapshot.json';\nconst LEGACY_DIRECTORIES = ['branches', 'edges', 'summaries'] as const;\n\nexport class FilePersistence implements SessionScopedPersistenceBackend {\n\tprivate readonly _dataDir: string;\n\tprivate readonly _maxHistorySize: number;\n\tprivate readonly _persistBranches: boolean;\n\tprivate readonly _metrics: IMetrics | undefined;\n\tprivate readonly _writer: FileWriter;\n\n\tconstructor(options?: FilePersistenceOptions) {\n\t\tconst defaultDataDir = existsSync('.claude/data')\n\t\t\t? '.claude/data'\n\t\t\t: join(homedir(), '.claude/data');\n\t\tthis._dataDir = options?.dataDir ?? defaultDataDir;\n\t\tthis._maxHistorySize = options?.maxHistorySize ?? 10000;\n\t\tthis._persistBranches = options?.persistBranches ?? true;\n\t\tthis._metrics = options?.metrics;\n\t\tthis._writer = new FileWriter(this._dataDir, options?.writerOperations);\n\t}\n\n\tpublic static async create(options?: FilePersistenceOptions): Promise<FilePersistence> {\n\t\tconst persistence = new FilePersistence(options);\n\t\ttry {\n\t\t\tawait persistence._writer.ready();\n\t\t\tawait persistence._writer.run(async (dataDir) => await persistence._loadSnapshot(dataDir));\n\t\t\treturn persistence;\n\t\t} catch (error) {\n\t\t\tawait persistence.close();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic async saveThought(thought: ThoughtData): Promise<void> {\n\t\tassertThoughtScope('saveThought', GLOBAL_SESSION_ID, thought);\n\t\tawait this._saveThought(GLOBAL_SESSION_ID, thought);\n\t}\n\n\tpublic async saveThoughtForSession(sessionId: SessionId, thought: ThoughtData): Promise<void> {\n\t\tconst validatedSessionId = asSessionId(sessionId);\n\t\tassertThoughtScope('saveThoughtForSession', validatedSessionId, thought);\n\t\tawait this._saveThought(validatedSessionId, thought);\n\t}\n\n\tprivate async _saveThought(sessionId: SessionId, thought: ThoughtData): Promise<void> {\n\t\tassertPersistableThoughts([thought], `${sessionId}/thoughts`);\n\t\tawait this._mutate('save_thought', (snapshot) => {\n\t\t\tconst current =\n\t\t\t\tsnapshot.thoughts.find((record) => record.sessionId === sessionId)?.thoughts ?? [];\n\t\t\tconst prospective = [...current, thought];\n\t\t\tassertPersistableThoughtCollections(\n\t\t\t\t[\n\t\t\t\t\t{ sessionId, thoughts: prospective },\n\t\t\t\t\t...snapshot.branches\n\t\t\t\t\t\t.filter((record) => record.sessionId === sessionId)\n\t\t\t\t\t\t.map((record) => ({ sessionId, thoughts: record.thoughts })),\n\t\t\t\t],\n\t\t\t\t`${sessionId}/thoughts`\n\t\t\t);\n\t\t\tconst retained =\n\t\t\t\tthis._maxHistorySize > 0 ? prospective.slice(-this._maxHistorySize) : prospective;\n\t\t\treturn {\n\t\t\t\t...snapshot,\n\t\t\t\tthoughts: [\n\t\t\t\t\t...snapshot.thoughts.filter((record) => record.sessionId !== sessionId),\n\t\t\t\t\t{ sessionId, thoughts: retained },\n\t\t\t\t],\n\t\t\t};\n\t\t});\n\t}\n\n\tpublic async loadHistory(): Promise<ThoughtData[]> {\n\t\treturn await this.loadHistoryForSession(GLOBAL_SESSION_ID);\n\t}\n\n\tpublic async loadHistoryForSession(sessionId: SessionId): Promise<ThoughtData[]> {\n\t\tconst validatedSessionId = asSessionId(sessionId);\n\t\treturn await this._read('load_history', (snapshot) => [\n\t\t\t...(snapshot.thoughts.find((record) => record.sessionId === validatedSessionId)?.thoughts ??\n\t\t\t\t[]),\n\t\t]);\n\t}\n\n\tpublic async saveBranch(branchId: BranchId, thoughts: ThoughtData[]): Promise<void> {\n\t\tconst validatedBranchId = parsePersistenceBranchId(branchId, 'global/branches');\n\t\tassertBranchScope('saveBranch', GLOBAL_SESSION_ID, validatedBranchId, thoughts);\n\t\tawait this._saveBranch(GLOBAL_SESSION_ID, validatedBranchId, thoughts);\n\t}\n\n\tpublic async saveBranchForSession(\n\t\tsessionId: SessionId,\n\t\tbranchId: BranchId,\n\t\tthoughts: readonly ThoughtData[]\n\t): Promise<void> {\n\t\tconst validatedSessionId = asSessionId(sessionId);\n\t\tconst validatedBranchId = parsePersistenceBranchId(branchId, `${validatedSessionId}/branches`);\n\t\tassertBranchScope('saveBranchForSession', validatedSessionId, validatedBranchId, thoughts);\n\t\tawait this._saveBranch(validatedSessionId, validatedBranchId, thoughts);\n\t}\n\n\tprivate async _saveBranch(\n\t\tsessionId: SessionId,\n\t\tbranchId: BranchId,\n\t\tthoughts: readonly ThoughtData[]\n\t): Promise<void> {\n\t\tassertPersistableThoughtCollections(\n\t\t\t[{ sessionId, thoughts }],\n\t\t\t`${sessionId}/branches/${branchId}`\n\t\t);\n\t\tif (!this._persistBranches) {\n\t\t\tawait this._writer.run(async (dataDir) => {\n\t\t\t\tconst snapshot = await this._loadSnapshot(dataDir);\n\t\t\t\tassertPersistableThoughtCollections(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\t\tthoughts:\n\t\t\t\t\t\t\t\tsnapshot.thoughts.find((record) => record.sessionId === sessionId)?.thoughts ?? [],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...snapshot.branches\n\t\t\t\t\t\t\t.filter((record) => record.sessionId === sessionId)\n\t\t\t\t\t\t\t.map((record) => ({ sessionId, thoughts: record.thoughts })),\n\t\t\t\t\t\t{ sessionId, thoughts },\n\t\t\t\t\t],\n\t\t\t\t\t`${sessionId}/branches/${branchId}`\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tawait this._mutate('save_branch', (snapshot) => ({\n\t\t\t...snapshot,\n\t\t\tbranches: [\n\t\t\t\t...snapshot.branches.filter(\n\t\t\t\t\t(record) => record.sessionId !== sessionId || record.branchId !== branchId\n\t\t\t\t),\n\t\t\t\t{ sessionId, branchId, thoughts: [...thoughts] },\n\t\t\t],\n\t\t}));\n\t}\n\n\tpublic async deleteBranch(branchId: BranchId): Promise<void> {\n\t\tawait this.deleteBranchForSession(GLOBAL_SESSION_ID, branchId);\n\t}\n\n\tpublic async deleteBranchForSession(sessionId: SessionId, branchId: BranchId): Promise<void> {\n\t\tif (!this._persistBranches) return;\n\t\tconst validatedSessionId = asSessionId(sessionId);\n\t\tconst validatedBranchId = parsePersistenceBranchId(branchId, `${validatedSessionId}/branches`);\n\t\tawait this._mutate('delete_branch', (snapshot) => ({\n\t\t\t...snapshot,\n\t\t\tbranches: snapshot.branches.filter(\n\t\t\t\t(record) => record.sessionId !== validatedSessionId || record.branchId !== validatedBranchId\n\t\t\t),\n\t\t}));\n\t}\n\n\tpublic async loadBranch(branchId: BranchId): Promise<ThoughtData[] | undefined> {\n\t\treturn await this.loadBranchForSession(GLOBAL_SESSION_ID, branchId);\n\t}\n\n\tpublic async loadBranchForSession(\n\t\tsessionId: SessionId,\n\t\tbranchId: BranchId\n\t): Promise<ThoughtData[] | undefined> {\n\t\tif (!this._persistBranches) return undefined;\n\t\tconst validatedSessionId = asSessionId(sessionId);\n\t\tconst validatedBranchId = parsePersistenceBranchId(branchId, `${validatedSessionId}/branches`);\n\t\treturn await this._read('load_branch', (snapshot) => {\n\t\t\tconst thoughts = snapshot.branches.find(\n\t\t\t\t(record) => record.sessionId === validatedSessionId && record.branchId === validatedBranchId\n\t\t\t)?.thoughts;\n\t\t\treturn thoughts === undefined ? undefined : [...thoughts];\n\t\t});\n\t}\n\n\tpublic async listBranches(): Promise<BranchId[]> {\n\t\treturn await this.listBranchesForSession(GLOBAL_SESSION_ID);\n\t}\n\n\tpublic async listBranchesForSession(sessionId: SessionId): Promise<BranchId[]> {\n\t\tif (!this._persistBranches) return [];\n\t\tconst validatedSessionId = asSessionId(sessionId);\n\t\treturn await this._read('list_branches', (snapshot) =>\n\t\t\tsnapshot.branches\n\t\t\t\t.filter((record) => record.sessionId === validatedSessionId)\n\t\t\t\t.map((record) => record.branchId)\n\t\t\t\t.sort(compareCodePoint)\n\t\t);\n\t}\n\n\tpublic async listSessions(): Promise<SessionId[]> {\n\t\treturn await this._read('list_sessions', sessionsInSnapshot);\n\t}\n\n\tpublic async clear(): Promise<void> {\n\t\tawait this._mutate('clear', () => EMPTY_FILE_SNAPSHOT_V2);\n\t}\n\n\tpublic async clearSession(sessionId: SessionId): Promise<void> {\n\t\tconst validatedSessionId = asSessionId(sessionId);\n\t\tawait this._mutate('clear_session', (snapshot) => ({\n\t\t\tversion: 2,\n\t\t\tthoughts: snapshot.thoughts.filter((record) => record.sessionId !== validatedSessionId),\n\t\t\tbranches: snapshot.branches.filter((record) => record.sessionId !== validatedSessionId),\n\t\t\tedges: snapshot.edges.filter((record) => record.sessionId !== validatedSessionId),\n\t\t\tsummaries: snapshot.summaries.filter((record) => record.sessionId !== validatedSessionId),\n\t\t}));\n\t}\n\n\tpublic async saveEdges(sessionId: SessionId, edges: readonly Edge[]): Promise<void> {\n\t\tconst validatedSessionId = asSessionId(sessionId);\n\t\tassertEdgeScopes(validatedSessionId, edges);\n\t\tawait this._mutate('save_edges', (snapshot) => ({\n\t\t\t...snapshot,\n\t\t\tedges: [\n\t\t\t\t...snapshot.edges.filter((record) => record.sessionId !== validatedSessionId),\n\t\t\t\t...(edges.length === 0 ? [] : [{ sessionId: validatedSessionId, edges: [...edges] }]),\n\t\t\t],\n\t\t}));\n\t}\n\n\tpublic async loadEdges(sessionId: SessionId): Promise<Edge[]> {\n\t\tconst validatedSessionId = asSessionId(sessionId);\n\t\treturn await this._read('load_edges', (snapshot) => [\n\t\t\t...(snapshot.edges.find((record) => record.sessionId === validatedSessionId)?.edges ?? []),\n\t\t]);\n\t}\n\n\tpublic async listEdgeSessions(): Promise<SessionId[]> {\n\t\treturn await this._read('list_edge_sessions', (snapshot) =>\n\t\t\tsnapshot.edges.map((record) => record.sessionId).sort(compareCodePoint)\n\t\t);\n\t}\n\n\tpublic async saveSummaries(sessionId: SessionId, summaries: readonly Summary[]): Promise<void> {\n\t\tconst validatedSessionId = asSessionId(sessionId);\n\t\tassertSummaryScopes(validatedSessionId, summaries);\n\t\tawait this._mutate('save_summaries', (snapshot) => ({\n\t\t\t...snapshot,\n\t\t\tsummaries: [\n\t\t\t\t...snapshot.summaries.filter((record) => record.sessionId !== validatedSessionId),\n\t\t\t\t...(summaries.length === 0\n\t\t\t\t\t? []\n\t\t\t\t\t: [{ sessionId: validatedSessionId, summaries: [...summaries] }]),\n\t\t\t],\n\t\t}));\n\t}\n\n\tpublic async loadSummaries(sessionId: SessionId): Promise<Summary[]> {\n\t\tconst validatedSessionId = asSessionId(sessionId);\n\t\treturn await this._read('load_summaries', (snapshot) => [\n\t\t\t...(snapshot.summaries.find((record) => record.sessionId === validatedSessionId)?.summaries ??\n\t\t\t\t[]),\n\t\t]);\n\t}\n\n\tpublic async healthy(): Promise<boolean> {\n\t\ttry {\n\t\t\tawait this._writer.run(async (dataDir) => await this._loadSnapshot(dataDir));\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tif (error instanceof Error) return false;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic getDataDir(): string {\n\t\treturn this._dataDir;\n\t}\n\n\tpublic async getBranchIds(): Promise<string[]> {\n\t\treturn await this.listBranches();\n\t}\n\n\tpublic async close(): Promise<void> {\n\t\tawait this._writer.close();\n\t}\n\n\tprivate async _read<T>(operation: string, select: (snapshot: FileSnapshotV2) => T): Promise<T> {\n\t\treturn await this._measure(\n\t\t\toperation,\n\t\t\tasync () =>\n\t\t\t\tawait this._writer.run(async (dataDir) => select(await this._loadSnapshot(dataDir)))\n\t\t);\n\t}\n\n\tprivate async _mutate(\n\t\toperation: string,\n\t\tmutate: (snapshot: FileSnapshotV2) => FileSnapshotV2\n\t): Promise<void> {\n\t\tawait this._measure(operation, async () => {\n\t\t\tawait this._writer.run(async (dataDir) => {\n\t\t\t\tconst snapshotPath = join(dataDir, SNAPSHOT_NAME);\n\t\t\t\tconst updated = mutate(await this._loadSnapshot(dataDir));\n\t\t\t\tawait this._writer.publish(snapshotPath, serializeFileSnapshotV2(updated, snapshotPath));\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate async _loadSnapshot(dataDir: string): Promise<FileSnapshotV2> {\n\t\tconst snapshotPath = join(dataDir, SNAPSHOT_NAME);\n\t\ttry {\n\t\t\treturn parseFileSnapshotV2(await readFile(snapshotPath, 'utf-8'), snapshotPath);\n\t\t} catch (error) {\n\t\t\tif (!isFileNotFound(error)) throw error;\n\t\t}\n\t\tconst legacyArtifacts = await this._legacyArtifacts(dataDir);\n\t\tif (legacyArtifacts.length > 0) {\n\t\t\tthrow new PersistenceImportRequiredError(dataDir, legacyArtifacts);\n\t\t}\n\t\treturn EMPTY_FILE_SNAPSHOT_V2;\n\t}\n\n\tprivate async _legacyArtifacts(dataDir: string): Promise<string[]> {\n\t\tconst artifacts: string[] = [];\n\t\ttry {\n\t\t\tawait readFile(join(dataDir, 'history.json'), 'utf-8');\n\t\t\tartifacts.push('history.json');\n\t\t} catch (error) {\n\t\t\tif (!isFileNotFound(error)) throw error;\n\t\t}\n\t\tfor (const directory of LEGACY_DIRECTORIES) {\n\t\t\ttry {\n\t\t\t\tconst files = await readdir(join(dataDir, directory));\n\t\t\t\tartifacts.push(\n\t\t\t\t\t...files.filter((file) => file.endsWith('.json')).map((file) => `${directory}/${file}`)\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tif (!isFileNotFound(error)) throw error;\n\t\t\t}\n\t\t}\n\t\treturn artifacts.sort(compareCodePoint);\n\t}\n\n\tprivate async _measure<T>(operation: string, action: () => Promise<T>): Promise<T> {\n\t\tconst startTime = Date.now();\n\t\ttry {\n\t\t\treturn await action();\n\t\t} finally {\n\t\t\tthis._metrics?.histogram('persistence_op_duration_seconds', (Date.now() - startTime) / 1000, {\n\t\t\t\toperation,\n\t\t\t});\n\t\t}\n\t}\n}\n"],"names":["SNAPSHOT_NAME","LEGACY_DIRECTORIES","FilePersistence","options","defaultDataDir","existsSync","join","homedir","FileWriter","persistence","dataDir","error","thought","assertThoughtScope","GLOBAL_SESSION_ID","sessionId","validatedSessionId","asSessionId","assertPersistableThoughts","snapshot","current","record","prospective","assertPersistableThoughtCollections","retained","branchId","thoughts","validatedBranchId","parsePersistenceBranchId","assertBranchScope","undefined","compareCodePoint","sessionsInSnapshot","EMPTY_FILE_SNAPSHOT_V2","edges","assertEdgeScopes","summaries","assertSummaryScopes","Error","operation","select","mutate","snapshotPath","updated","serializeFileSnapshotV2","parseFileSnapshotV2","readFile","isFileNotFound","legacyArtifacts","PersistenceImportRequiredError","artifacts","directory","files","readdir","file","action","startTime","Date"],"mappings":"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"}
|