tracelattice 1.2.5
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 +112 -0
- package/dist/ServerConfig.d.ts +229 -0
- package/dist/ServerConfig.d.ts.map +1 -0
- package/dist/ServerConfig.js +121 -0
- package/dist/ServerConfig.js.map +1 -0
- package/dist/__tests__/base-registry.test.d.ts +2 -0
- package/dist/__tests__/base-registry.test.d.ts.map +1 -0
- package/dist/__tests__/base-transport-cov.test.d.ts +2 -0
- package/dist/__tests__/base-transport-cov.test.d.ts.map +1 -0
- package/dist/__tests__/base-transport.test.d.ts +2 -0
- package/dist/__tests__/base-transport.test.d.ts.map +1 -0
- package/dist/__tests__/config-loader.test.d.ts +2 -0
- package/dist/__tests__/config-loader.test.d.ts.map +1 -0
- package/dist/__tests__/connection-pool-cov.test.d.ts +2 -0
- package/dist/__tests__/connection-pool-cov.test.d.ts.map +1 -0
- package/dist/__tests__/connection-pool.test.d.ts +2 -0
- package/dist/__tests__/connection-pool.test.d.ts.map +1 -0
- package/dist/__tests__/container.test.d.ts +2 -0
- package/dist/__tests__/container.test.d.ts.map +1 -0
- package/dist/__tests__/crud.test.d.ts +2 -0
- package/dist/__tests__/crud.test.d.ts.map +1 -0
- package/dist/__tests__/discovery-cache.test.d.ts +2 -0
- package/dist/__tests__/discovery-cache.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/factories.test.d.ts +2 -0
- package/dist/__tests__/factories.test.d.ts.map +1 -0
- package/dist/__tests__/health-checker-cov.test.d.ts +2 -0
- package/dist/__tests__/health-checker-cov.test.d.ts.map +1 -0
- package/dist/__tests__/health-checker.test.d.ts +2 -0
- package/dist/__tests__/health-checker.test.d.ts.map +1 -0
- package/dist/__tests__/helpers/factories.d.ts +36 -0
- package/dist/__tests__/helpers/factories.d.ts.map +1 -0
- package/dist/__tests__/helpers/index.d.ts +3 -0
- package/dist/__tests__/helpers/index.d.ts.map +1 -0
- package/dist/__tests__/helpers/timers.d.ts +4 -0
- package/dist/__tests__/helpers/timers.d.ts.map +1 -0
- package/dist/__tests__/history-manager.test.d.ts +2 -0
- package/dist/__tests__/history-manager.test.d.ts.map +1 -0
- package/dist/__tests__/http-helpers-cov.test.d.ts +2 -0
- package/dist/__tests__/http-helpers-cov.test.d.ts.map +1 -0
- package/dist/__tests__/http-transport-cov.test.d.ts +2 -0
- package/dist/__tests__/http-transport-cov.test.d.ts.map +1 -0
- package/dist/__tests__/http-transport.test.d.ts +2 -0
- package/dist/__tests__/http-transport.test.d.ts.map +1 -0
- package/dist/__tests__/input-normalizer.test.d.ts +8 -0
- package/dist/__tests__/input-normalizer.test.d.ts.map +1 -0
- package/dist/__tests__/integration.test.d.ts +2 -0
- package/dist/__tests__/integration.test.d.ts.map +1 -0
- package/dist/__tests__/lib-server.test.d.ts +2 -0
- package/dist/__tests__/lib-server.test.d.ts.map +1 -0
- package/dist/__tests__/memory-persistence.test.d.ts +2 -0
- package/dist/__tests__/memory-persistence.test.d.ts.map +1 -0
- package/dist/__tests__/metrics-integration.test.d.ts +2 -0
- package/dist/__tests__/metrics-integration.test.d.ts.map +1 -0
- package/dist/__tests__/persistence.test.d.ts +2 -0
- package/dist/__tests__/persistence.test.d.ts.map +1 -0
- package/dist/__tests__/reasoning-integration.test.d.ts +11 -0
- package/dist/__tests__/reasoning-integration.test.d.ts.map +1 -0
- package/dist/__tests__/reasoning-types.test.d.ts +2 -0
- package/dist/__tests__/reasoning-types.test.d.ts.map +1 -0
- package/dist/__tests__/request-context.test.d.ts +2 -0
- package/dist/__tests__/request-context.test.d.ts.map +1 -0
- package/dist/__tests__/sanitize.test.d.ts +2 -0
- package/dist/__tests__/sanitize.test.d.ts.map +1 -0
- package/dist/__tests__/schema.test.d.ts +2 -0
- package/dist/__tests__/schema.test.d.ts.map +1 -0
- package/dist/__tests__/sequentialthinking-tools.test.d.ts +2 -0
- package/dist/__tests__/sequentialthinking-tools.test.d.ts.map +1 -0
- package/dist/__tests__/server-config.test.d.ts +2 -0
- package/dist/__tests__/server-config.test.d.ts.map +1 -0
- package/dist/__tests__/skill-discovery.test.d.ts +2 -0
- package/dist/__tests__/skill-discovery.test.d.ts.map +1 -0
- package/dist/__tests__/skill-registry.test.d.ts +2 -0
- package/dist/__tests__/skill-registry.test.d.ts.map +1 -0
- package/dist/__tests__/skill-watcher.test.d.ts +2 -0
- package/dist/__tests__/skill-watcher.test.d.ts.map +1 -0
- package/dist/__tests__/sqlite-persistence.test.d.ts +2 -0
- package/dist/__tests__/sqlite-persistence.test.d.ts.map +1 -0
- package/dist/__tests__/sse-transport-cov.test.d.ts +2 -0
- package/dist/__tests__/sse-transport-cov.test.d.ts.map +1 -0
- package/dist/__tests__/sse-transport.test.d.ts +2 -0
- package/dist/__tests__/sse-transport.test.d.ts.map +1 -0
- package/dist/__tests__/streamable-http-cov.test.d.ts +2 -0
- package/dist/__tests__/streamable-http-cov.test.d.ts.map +1 -0
- package/dist/__tests__/streamable-http-transport.test.d.ts +2 -0
- package/dist/__tests__/streamable-http-transport.test.d.ts.map +1 -0
- package/dist/__tests__/structured-logger.test.d.ts +2 -0
- package/dist/__tests__/structured-logger.test.d.ts.map +1 -0
- package/dist/__tests__/thought-evaluator.test.d.ts +2 -0
- package/dist/__tests__/thought-evaluator.test.d.ts.map +1 -0
- package/dist/__tests__/thought-formatter.test.d.ts +2 -0
- package/dist/__tests__/thought-formatter.test.d.ts.map +1 -0
- package/dist/__tests__/thought-processor.test.d.ts +8 -0
- package/dist/__tests__/thought-processor.test.d.ts.map +1 -0
- package/dist/__tests__/tool-registry-cov.test.d.ts +2 -0
- package/dist/__tests__/tool-registry-cov.test.d.ts.map +1 -0
- package/dist/__tests__/tool-registry.test.d.ts +2 -0
- package/dist/__tests__/tool-registry.test.d.ts.map +1 -0
- package/dist/__tests__/tool-watcher.test.d.ts +2 -0
- package/dist/__tests__/tool-watcher.test.d.ts.map +1 -0
- package/dist/__tests__/worker-manager-cov.test.d.ts +2 -0
- package/dist/__tests__/worker-manager-cov.test.d.ts.map +1 -0
- package/dist/__tests__/worker-manager.test.d.ts +2 -0
- package/dist/__tests__/worker-manager.test.d.ts.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 +100 -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 +114 -0
- package/dist/cli.js.map +1 -0
- package/dist/cluster/WorkerManager.d.ts +166 -0
- package/dist/cluster/WorkerManager.d.ts.map +1 -0
- package/dist/cluster/WorkerManager.js +202 -0
- package/dist/cluster/WorkerManager.js.map +1 -0
- package/dist/cluster/worker.d.ts +11 -0
- package/dist/cluster/worker.d.ts.map +1 -0
- package/dist/cluster/worker.js +36 -0
- package/dist/cluster/worker.js.map +1 -0
- package/dist/config/ConfigLoader.d.ts +224 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +85 -0
- package/dist/config/ConfigLoader.js.map +1 -0
- package/dist/context/RequestContext.d.ts +61 -0
- package/dist/context/RequestContext.d.ts.map +1 -0
- package/dist/context/RequestContext.js +17 -0
- package/dist/context/RequestContext.js.map +1 -0
- package/dist/contracts/index.d.ts +10 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +1 -0
- package/dist/contracts/interfaces.d.ts +107 -0
- package/dist/contracts/interfaces.d.ts.map +1 -0
- package/dist/contracts/interfaces.js +1 -0
- package/dist/core/HistoryManager.d.ts +514 -0
- package/dist/core/HistoryManager.d.ts.map +1 -0
- package/dist/core/HistoryManager.js +331 -0
- package/dist/core/HistoryManager.js.map +1 -0
- package/dist/core/IHistoryManager.d.ts +100 -0
- package/dist/core/IHistoryManager.d.ts.map +1 -0
- package/dist/core/IHistoryManager.js +1 -0
- package/dist/core/InputNormalizer.d.ts +139 -0
- package/dist/core/InputNormalizer.d.ts.map +1 -0
- package/dist/core/InputNormalizer.js +101 -0
- package/dist/core/InputNormalizer.js.map +1 -0
- package/dist/core/ThoughtEvaluator.d.ts +127 -0
- package/dist/core/ThoughtEvaluator.d.ts.map +1 -0
- package/dist/core/ThoughtEvaluator.js +346 -0
- package/dist/core/ThoughtEvaluator.js.map +1 -0
- package/dist/core/ThoughtFormatter.d.ts +133 -0
- package/dist/core/ThoughtFormatter.d.ts.map +1 -0
- package/dist/core/ThoughtFormatter.js +70 -0
- package/dist/core/ThoughtFormatter.js.map +1 -0
- package/dist/core/ThoughtProcessor.d.ts +218 -0
- package/dist/core/ThoughtProcessor.d.ts.map +1 -0
- package/dist/core/ThoughtProcessor.js +205 -0
- package/dist/core/ThoughtProcessor.js.map +1 -0
- package/dist/core/reasoning.d.ts +169 -0
- package/dist/core/reasoning.d.ts.map +1 -0
- package/dist/core/reasoning.js +1 -0
- package/dist/core/step.d.ts +45 -0
- package/dist/core/step.d.ts.map +1 -0
- package/dist/core/step.js +1 -0
- package/dist/core/thought.d.ts +190 -0
- package/dist/core/thought.d.ts.map +1 -0
- package/dist/core/thought.js +1 -0
- package/dist/di/Container.d.ts +226 -0
- package/dist/di/Container.d.ts.map +1 -0
- package/dist/di/Container.js +96 -0
- package/dist/di/Container.js.map +1 -0
- package/dist/di/ServiceRegistry.d.ts +32 -0
- package/dist/di/ServiceRegistry.d.ts.map +1 -0
- package/dist/di/ServiceRegistry.js +1 -0
- package/dist/errors.d.ts +482 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +108 -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 +69 -0
- package/dist/health/HealthChecker.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/lib.d.ts +205 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +219 -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/__tests__/metrics.test.d.ts +2 -0
- package/dist/metrics/__tests__/metrics.test.d.ts.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/FilePersistence.d.ts +66 -0
- package/dist/persistence/FilePersistence.d.ts.map +1 -0
- package/dist/persistence/FilePersistence.js +132 -0
- package/dist/persistence/FilePersistence.js.map +1 -0
- package/dist/persistence/MemoryPersistence.d.ts +68 -0
- package/dist/persistence/MemoryPersistence.d.ts.map +1 -0
- package/dist/persistence/MemoryPersistence.js +51 -0
- package/dist/persistence/MemoryPersistence.js.map +1 -0
- package/dist/persistence/PersistenceBackend.d.ts +69 -0
- package/dist/persistence/PersistenceBackend.d.ts.map +1 -0
- package/dist/persistence/PersistenceBackend.js +1 -0
- package/dist/persistence/PersistenceFactory.d.ts +21 -0
- package/dist/persistence/PersistenceFactory.d.ts.map +1 -0
- package/dist/persistence/PersistenceFactory.js +25 -0
- package/dist/persistence/PersistenceFactory.js.map +1 -0
- package/dist/persistence/SqlitePersistence.d.ts +60 -0
- package/dist/persistence/SqlitePersistence.d.ts.map +1 -0
- package/dist/persistence/SqlitePersistence.js +136 -0
- package/dist/persistence/SqlitePersistence.js.map +1 -0
- package/dist/pool/ConnectionPool.d.ts +215 -0
- package/dist/pool/ConnectionPool.d.ts.map +1 -0
- package/dist/pool/ConnectionPool.js +187 -0
- package/dist/pool/ConnectionPool.js.map +1 -0
- package/dist/registry/BaseRegistry.d.ts +203 -0
- package/dist/registry/BaseRegistry.d.ts.map +1 -0
- package/dist/registry/BaseRegistry.js +165 -0
- package/dist/registry/BaseRegistry.js.map +1 -0
- package/dist/registry/SkillRegistry.d.ts +69 -0
- package/dist/registry/SkillRegistry.d.ts.map +1 -0
- package/dist/registry/SkillRegistry.js +88 -0
- package/dist/registry/SkillRegistry.js.map +1 -0
- package/dist/registry/ToolRegistry.d.ts +69 -0
- package/dist/registry/ToolRegistry.d.ts.map +1 -0
- package/dist/registry/ToolRegistry.js +93 -0
- package/dist/registry/ToolRegistry.js.map +1 -0
- package/dist/sanitize.d.ts +63 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +14 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/schema.d.ts +531 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +204 -0
- package/dist/schema.js.map +1 -0
- package/dist/telemetry/Telemetry.d.ts +36 -0
- package/dist/telemetry/Telemetry.d.ts.map +1 -0
- package/dist/telemetry/Telemetry.js +68 -0
- package/dist/telemetry/Telemetry.js.map +1 -0
- package/dist/telemetry/__tests__/Telemetry.test.d.ts +2 -0
- package/dist/telemetry/__tests__/Telemetry.test.d.ts.map +1 -0
- package/dist/transport/BaseTransport.d.ts +184 -0
- package/dist/transport/BaseTransport.d.ts.map +1 -0
- package/dist/transport/BaseTransport.js +200 -0
- package/dist/transport/BaseTransport.js.map +1 -0
- package/dist/transport/HttpHelpers.d.ts +60 -0
- package/dist/transport/HttpHelpers.d.ts.map +1 -0
- package/dist/transport/HttpHelpers.js +50 -0
- package/dist/transport/HttpHelpers.js.map +1 -0
- package/dist/transport/HttpTransport.d.ts +134 -0
- package/dist/transport/HttpTransport.d.ts.map +1 -0
- package/dist/transport/HttpTransport.js +175 -0
- package/dist/transport/HttpTransport.js.map +1 -0
- package/dist/transport/SseTransport.d.ts +133 -0
- package/dist/transport/SseTransport.d.ts.map +1 -0
- package/dist/transport/SseTransport.js +318 -0
- package/dist/transport/SseTransport.js.map +1 -0
- package/dist/transport/StreamableHttpTransport.d.ts +224 -0
- package/dist/transport/StreamableHttpTransport.d.ts.map +1 -0
- package/dist/transport/StreamableHttpTransport.js +407 -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 +69 -0
- package/dist/types/skill.d.ts.map +1 -0
- package/dist/types/skill.js +1 -0
- package/dist/types/tool.d.ts +68 -0
- package/dist/types/tool.d.ts.map +1 -0
- package/dist/types/tool.js +1 -0
- package/dist/watchers/SkillWatcher.d.ts +132 -0
- package/dist/watchers/SkillWatcher.d.ts.map +1 -0
- package/dist/watchers/SkillWatcher.js +73 -0
- package/dist/watchers/SkillWatcher.js.map +1 -0
- package/dist/watchers/ToolWatcher.d.ts +109 -0
- package/dist/watchers/ToolWatcher.d.ts.map +1 -0
- package/dist/watchers/ToolWatcher.js +71 -0
- package/dist/watchers/ToolWatcher.js.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aggregate health checking system.
|
|
3
|
+
*
|
|
4
|
+
* Provides liveness and readiness checks by aggregating the health
|
|
5
|
+
* status of registered backend components (persistence, pool, etc.).
|
|
6
|
+
*
|
|
7
|
+
* @module health
|
|
8
|
+
*/
|
|
9
|
+
import type { Logger } from '../logger/StructuredLogger.js';
|
|
10
|
+
import type { PersistenceBackend } from '../persistence/PersistenceBackend.js';
|
|
11
|
+
/**
|
|
12
|
+
* Health status of an individual component.
|
|
13
|
+
*/
|
|
14
|
+
export interface HealthComponent {
|
|
15
|
+
name: string;
|
|
16
|
+
healthy: boolean;
|
|
17
|
+
details?: string;
|
|
18
|
+
latencyMs?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Aggregate health check result.
|
|
22
|
+
*/
|
|
23
|
+
export interface HealthCheckResult {
|
|
24
|
+
status: 'ok' | 'degraded' | 'unhealthy';
|
|
25
|
+
timestamp: string;
|
|
26
|
+
components: Record<string, HealthComponent>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Options for constructing a HealthChecker.
|
|
30
|
+
*/
|
|
31
|
+
export interface HealthCheckerOptions {
|
|
32
|
+
persistence?: PersistenceBackend | null;
|
|
33
|
+
logger?: Logger;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Aggregates component health into liveness and readiness checks.
|
|
37
|
+
*
|
|
38
|
+
* - `checkLiveness()` always returns 'ok' if the process is running.
|
|
39
|
+
* - `checkReadiness()` checks all registered backends and returns an aggregate status.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* const checker = new HealthChecker({ persistence: myBackend });
|
|
44
|
+
* const readiness = await checker.checkReadiness();
|
|
45
|
+
* // { status: 'ok', timestamp: '...', components: { persistence: { ... } } }
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare class HealthChecker {
|
|
49
|
+
private _persistence;
|
|
50
|
+
private _logger;
|
|
51
|
+
constructor(options?: HealthCheckerOptions);
|
|
52
|
+
/**
|
|
53
|
+
* Liveness check — returns 'ok' if the process is alive.
|
|
54
|
+
*
|
|
55
|
+
* This is a synchronous check that always succeeds; if this code
|
|
56
|
+
* can execute, the process is alive.
|
|
57
|
+
*/
|
|
58
|
+
checkLiveness(): HealthCheckResult;
|
|
59
|
+
/**
|
|
60
|
+
* Readiness check — aggregates health of all registered backends.
|
|
61
|
+
*
|
|
62
|
+
* Checks each component and returns:
|
|
63
|
+
* - 'ok' if all components are healthy (or no components registered)
|
|
64
|
+
* - 'degraded' if some components are unhealthy
|
|
65
|
+
* - 'unhealthy' if all components are unhealthy
|
|
66
|
+
*/
|
|
67
|
+
checkReadiness(): Promise<HealthCheckResult>;
|
|
68
|
+
/**
|
|
69
|
+
* Check persistence backend health with latency measurement.
|
|
70
|
+
*/
|
|
71
|
+
private _checkPersistence;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=HealthChecker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HealthChecker.d.ts","sourceRoot":"","sources":["../../src/health/HealthChecker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAE/E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,WAAW,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,WAAW,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAYD;;;;;;;;;;;;GAYG;AACH,qBAAa,aAAa;IACzB,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,OAAO,CAAoD;gBAEvD,OAAO,GAAE,oBAAyB;IAK9C;;;;;OAKG;IACH,aAAa,IAAI,iBAAiB;IAQlC;;;;;;;OAOG;IACG,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAyClD;;OAEG;YACW,iBAAiB;CAsB/B"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
class NoopLogger {
|
|
2
|
+
info() {}
|
|
3
|
+
warn() {}
|
|
4
|
+
error() {}
|
|
5
|
+
debug() {}
|
|
6
|
+
}
|
|
7
|
+
class HealthChecker {
|
|
8
|
+
_persistence;
|
|
9
|
+
_logger;
|
|
10
|
+
constructor(options = {}){
|
|
11
|
+
this._persistence = options.persistence ?? null;
|
|
12
|
+
this._logger = options.logger ?? new NoopLogger();
|
|
13
|
+
}
|
|
14
|
+
checkLiveness() {
|
|
15
|
+
return {
|
|
16
|
+
status: 'ok',
|
|
17
|
+
timestamp: new Date().toISOString(),
|
|
18
|
+
components: {}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
async checkReadiness() {
|
|
22
|
+
const components = {};
|
|
23
|
+
let healthyCount = 0;
|
|
24
|
+
let totalCount = 0;
|
|
25
|
+
if (this._persistence) {
|
|
26
|
+
totalCount++;
|
|
27
|
+
const component = await this._checkPersistence();
|
|
28
|
+
components['persistence'] = component;
|
|
29
|
+
if (component.healthy) healthyCount++;
|
|
30
|
+
}
|
|
31
|
+
let status;
|
|
32
|
+
status = 0 === totalCount || healthyCount === totalCount ? 'ok' : 0 === healthyCount ? 'unhealthy' : 'degraded';
|
|
33
|
+
const result = {
|
|
34
|
+
status,
|
|
35
|
+
timestamp: new Date().toISOString(),
|
|
36
|
+
components
|
|
37
|
+
};
|
|
38
|
+
if ('ok' !== status) this._logger.warn('Readiness check returned non-ok status', {
|
|
39
|
+
status,
|
|
40
|
+
components
|
|
41
|
+
});
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
async _checkPersistence() {
|
|
45
|
+
const start = Date.now();
|
|
46
|
+
try {
|
|
47
|
+
const healthy = await this._persistence.healthy();
|
|
48
|
+
return {
|
|
49
|
+
name: 'persistence',
|
|
50
|
+
healthy,
|
|
51
|
+
latencyMs: Date.now() - start,
|
|
52
|
+
details: healthy ? 'Backend is responsive' : 'Backend reported unhealthy'
|
|
53
|
+
};
|
|
54
|
+
} catch (error) {
|
|
55
|
+
this._logger.error('Persistence health check failed', {
|
|
56
|
+
error: error instanceof Error ? error.message : String(error)
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
name: 'persistence',
|
|
60
|
+
healthy: false,
|
|
61
|
+
latencyMs: Date.now() - start,
|
|
62
|
+
details: `Health check error: ${error instanceof Error ? error.message : String(error)}`
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export { HealthChecker };
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=HealthChecker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health/HealthChecker.js","sources":["../../src/health/HealthChecker.ts"],"sourcesContent":["/**\n * Aggregate health checking system.\n *\n * Provides liveness and readiness checks by aggregating the health\n * status of registered backend components (persistence, pool, etc.).\n *\n * @module health\n */\n\nimport type { Logger } from '../logger/StructuredLogger.js';\nimport type { PersistenceBackend } from '../persistence/PersistenceBackend.js';\n\n/**\n * Health status of an individual component.\n */\nexport interface HealthComponent {\n\tname: string;\n\thealthy: boolean;\n\tdetails?: string;\n\tlatencyMs?: number;\n}\n\n/**\n * Aggregate health check result.\n */\nexport interface HealthCheckResult {\n\tstatus: 'ok' | 'degraded' | 'unhealthy';\n\ttimestamp: string;\n\tcomponents: Record<string, HealthComponent>;\n}\n\n/**\n * Options for constructing a HealthChecker.\n */\nexport interface HealthCheckerOptions {\n\tpersistence?: PersistenceBackend | null;\n\tlogger?: Logger;\n}\n\n/**\n * No-op logger used when none is provided.\n */\nclass NoopLogger implements Pick<Logger, 'info' | 'warn' | 'error' | 'debug'> {\n\tinfo(): void {}\n\twarn(): void {}\n\terror(): void {}\n\tdebug(): void {}\n}\n\n/**\n * Aggregates component health into liveness and readiness checks.\n *\n * - `checkLiveness()` always returns 'ok' if the process is running.\n * - `checkReadiness()` checks all registered backends and returns an aggregate status.\n *\n * @example\n * ```typescript\n * const checker = new HealthChecker({ persistence: myBackend });\n * const readiness = await checker.checkReadiness();\n * // { status: 'ok', timestamp: '...', components: { persistence: { ... } } }\n * ```\n */\nexport class HealthChecker {\n\tprivate _persistence: PersistenceBackend | null;\n\tprivate _logger: Pick<Logger, 'info' | 'warn' | 'error' | 'debug'>;\n\n\tconstructor(options: HealthCheckerOptions = {}) {\n\t\tthis._persistence = options.persistence ?? null;\n\t\tthis._logger = options.logger ?? new NoopLogger();\n\t}\n\n\t/**\n\t * Liveness check — returns 'ok' if the process is alive.\n\t *\n\t * This is a synchronous check that always succeeds; if this code\n\t * can execute, the process is alive.\n\t */\n\tcheckLiveness(): HealthCheckResult {\n\t\treturn {\n\t\t\tstatus: 'ok',\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tcomponents: {},\n\t\t};\n\t}\n\n\t/**\n\t * Readiness check — aggregates health of all registered backends.\n\t *\n\t * Checks each component and returns:\n\t * - 'ok' if all components are healthy (or no components registered)\n\t * - 'degraded' if some components are unhealthy\n\t * - 'unhealthy' if all components are unhealthy\n\t */\n\tasync checkReadiness(): Promise<HealthCheckResult> {\n\t\tconst components: Record<string, HealthComponent> = {};\n\t\tlet healthyCount = 0;\n\t\tlet totalCount = 0;\n\n\t\t// Check persistence backend\n\t\tif (this._persistence) {\n\t\t\ttotalCount++;\n\t\t\tconst component = await this._checkPersistence();\n\t\t\tcomponents['persistence'] = component;\n\t\t\tif (component.healthy) {\n\t\t\t\thealthyCount++;\n\t\t\t}\n\t\t}\n\n\t\t// Determine aggregate status\n\t\tlet status: 'ok' | 'degraded' | 'unhealthy';\n\t\tif (totalCount === 0 || healthyCount === totalCount) {\n\t\t\tstatus = 'ok';\n\t\t} else if (healthyCount === 0) {\n\t\t\tstatus = 'unhealthy';\n\t\t} else {\n\t\t\tstatus = 'degraded';\n\t\t}\n\n\t\tconst result: HealthCheckResult = {\n\t\t\tstatus,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tcomponents,\n\t\t};\n\n\t\tif (status !== 'ok') {\n\t\t\tthis._logger.warn('Readiness check returned non-ok status', {\n\t\t\t\tstatus,\n\t\t\t\tcomponents,\n\t\t\t});\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Check persistence backend health with latency measurement.\n\t */\n\tprivate async _checkPersistence(): Promise<HealthComponent> {\n\t\tconst start = Date.now();\n\t\ttry {\n\t\t\tconst healthy = await this._persistence!.healthy();\n\t\t\treturn {\n\t\t\t\tname: 'persistence',\n\t\t\t\thealthy,\n\t\t\t\tlatencyMs: Date.now() - start,\n\t\t\t\tdetails: healthy ? 'Backend is responsive' : 'Backend reported unhealthy',\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthis._logger.error('Persistence health check failed', {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tname: 'persistence',\n\t\t\t\thealthy: false,\n\t\t\t\tlatencyMs: Date.now() - start,\n\t\t\t\tdetails: `Health check error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t};\n\t\t}\n\t}\n}\n"],"names":["NoopLogger","HealthChecker","options","Date","components","healthyCount","totalCount","component","status","result","start","healthy","error","Error","String"],"mappings":"AA0CA,MAAMA;IACL,OAAa,CAAC;IACd,OAAa,CAAC;IACd,QAAc,CAAC;IACf,QAAc,CAAC;AAChB;AAeO,MAAMC;IACJ,aAAwC;IACxC,QAA2D;IAEnE,YAAYC,UAAgC,CAAC,CAAC,CAAE;QAC/C,IAAI,CAAC,YAAY,GAAGA,QAAQ,WAAW,IAAI;QAC3C,IAAI,CAAC,OAAO,GAAGA,QAAQ,MAAM,IAAI,IAAIF;IACtC;IAQA,gBAAmC;QAClC,OAAO;YACN,QAAQ;YACR,WAAW,IAAIG,OAAO,WAAW;YACjC,YAAY,CAAC;QACd;IACD;IAUA,MAAM,iBAA6C;QAClD,MAAMC,aAA8C,CAAC;QACrD,IAAIC,eAAe;QACnB,IAAIC,aAAa;QAGjB,IAAI,IAAI,CAAC,YAAY,EAAE;YACtBA;YACA,MAAMC,YAAY,MAAM,IAAI,CAAC,iBAAiB;YAC9CH,UAAU,CAAC,cAAc,GAAGG;YAC5B,IAAIA,UAAU,OAAO,EACpBF;QAEF;QAGA,IAAIG;QAEHA,SADGF,AAAe,MAAfA,cAAoBD,iBAAiBC,aAC/B,OACCD,AAAiB,MAAjBA,eACD,cAEA;QAGV,MAAMI,SAA4B;YACjCD;YACA,WAAW,IAAIL,OAAO,WAAW;YACjCC;QACD;QAEA,IAAII,AAAW,SAAXA,QACH,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,0CAA0C;YAC3DA;YACAJ;QACD;QAGD,OAAOK;IACR;IAKA,MAAc,oBAA8C;QAC3D,MAAMC,QAAQP,KAAK,GAAG;QACtB,IAAI;YACH,MAAMQ,UAAU,MAAM,IAAI,CAAC,YAAY,CAAE,OAAO;YAChD,OAAO;gBACN,MAAM;gBACNA;gBACA,WAAWR,KAAK,GAAG,KAAKO;gBACxB,SAASC,UAAU,0BAA0B;YAC9C;QACD,EAAE,OAAOC,OAAO;YACf,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,mCAAmC;gBACrD,OAAOA,iBAAiBC,QAAQD,MAAM,OAAO,GAAGE,OAAOF;YACxD;YACA,OAAO;gBACN,MAAM;gBACN,SAAS;gBACT,WAAWT,KAAK,GAAG,KAAKO;gBACxB,SAAS,CAAC,oBAAoB,EAAEE,iBAAiBC,QAAQD,MAAM,OAAO,GAAGE,OAAOF,QAAQ;YACzF;QACD;IACD;AACD"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./lib.js";
|
package/dist/lib.d.ts
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import * as v from 'valibot';
|
|
3
|
+
import { ThoughtData } from './core/thought.js';
|
|
4
|
+
import { SequentialThinkingSchema } from './schema.js';
|
|
5
|
+
import { IDisposable } from './types/disposable.js';
|
|
6
|
+
import type { ConfigFileOptions } from './config/ConfigLoader.js';
|
|
7
|
+
import { HistoryManager } from './core/HistoryManager.js';
|
|
8
|
+
import { Container } from './di/Container.js';
|
|
9
|
+
import { StructuredLogger } from './logger/StructuredLogger.js';
|
|
10
|
+
import { SkillRegistry } from './registry/SkillRegistry.js';
|
|
11
|
+
import { ToolRegistry } from './registry/ToolRegistry.js';
|
|
12
|
+
import { ServerConfig } from './ServerConfig.js';
|
|
13
|
+
import type { SseTransportOptions } from './transport/SseTransport.js';
|
|
14
|
+
export interface ServerOptions {
|
|
15
|
+
maxHistorySize?: number;
|
|
16
|
+
maxBranches?: number;
|
|
17
|
+
maxBranchSize?: number;
|
|
18
|
+
logger?: StructuredLogger;
|
|
19
|
+
enableWatcher?: boolean;
|
|
20
|
+
config?: ServerConfig;
|
|
21
|
+
fileConfig?: ConfigFileOptions;
|
|
22
|
+
container?: Container;
|
|
23
|
+
/**
|
|
24
|
+
* Enable automatic skill discovery on server startup
|
|
25
|
+
* @default true
|
|
26
|
+
*/
|
|
27
|
+
autoDiscover?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Enable lazy discovery (discover on first access instead of startup)
|
|
30
|
+
* @default false
|
|
31
|
+
*/
|
|
32
|
+
lazyDiscovery?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Load history from persistence on initialization
|
|
35
|
+
* @default true
|
|
36
|
+
*/
|
|
37
|
+
loadFromPersistence?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Transport type to use
|
|
40
|
+
* @default 'stdio'
|
|
41
|
+
*/
|
|
42
|
+
transport?: 'stdio' | 'sse';
|
|
43
|
+
/**
|
|
44
|
+
* SSE transport options (used when transport: 'sse')
|
|
45
|
+
*/
|
|
46
|
+
sseTransportOptions?: SseTransportOptions;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Server error events for event-driven error handling
|
|
50
|
+
*/
|
|
51
|
+
interface ServerEvents {
|
|
52
|
+
persistenceError: {
|
|
53
|
+
operation: string;
|
|
54
|
+
error: Error;
|
|
55
|
+
};
|
|
56
|
+
discoveryError: {
|
|
57
|
+
directory: string;
|
|
58
|
+
error: Error;
|
|
59
|
+
};
|
|
60
|
+
transportError: {
|
|
61
|
+
transport: string;
|
|
62
|
+
error: Error;
|
|
63
|
+
};
|
|
64
|
+
thoughtProcessed: {
|
|
65
|
+
thoughtNumber: number;
|
|
66
|
+
duration: number;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export declare class ToolAwareSequentialThinkingServer extends EventEmitter implements IDisposable {
|
|
70
|
+
/**
|
|
71
|
+
* Factory method to create a new server instance with async initialization.
|
|
72
|
+
* This is the recommended way to create server instances.
|
|
73
|
+
*
|
|
74
|
+
* @param options - Server configuration options
|
|
75
|
+
* @returns A Promise that resolves to a configured server instance
|
|
76
|
+
*/
|
|
77
|
+
static create(options?: ServerOptions): Promise<ToolAwareSequentialThinkingServer>;
|
|
78
|
+
emit<K extends keyof ServerEvents>(event: K, payload: ServerEvents[K]): boolean;
|
|
79
|
+
on<K extends keyof ServerEvents>(event: K, listener: (payload: ServerEvents[K]) => void): this;
|
|
80
|
+
private _container;
|
|
81
|
+
private _logger;
|
|
82
|
+
private _historyManager;
|
|
83
|
+
private _thoughtProcessor;
|
|
84
|
+
private _metrics;
|
|
85
|
+
private _skillWatcher;
|
|
86
|
+
private _toolWatcher;
|
|
87
|
+
private _config;
|
|
88
|
+
/**
|
|
89
|
+
* Direct access to the history manager
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* server.history.getHistory();
|
|
93
|
+
* server.history.clear();
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
readonly history: HistoryManager;
|
|
97
|
+
/**
|
|
98
|
+
* Direct access to the tool registry
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* server.tools.addTool(tool);
|
|
102
|
+
* server.tools.getTool('my-tool');
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
readonly tools: ToolRegistry;
|
|
106
|
+
/**
|
|
107
|
+
* Direct access to the skill registry
|
|
108
|
+
* @example
|
|
109
|
+
* ```typescript
|
|
110
|
+
* server.skills.addSkill(skill);
|
|
111
|
+
* server.skills.getSkill('my-skill');
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
readonly skills: SkillRegistry;
|
|
115
|
+
/**
|
|
116
|
+
* Server configuration
|
|
117
|
+
* @example
|
|
118
|
+
* ```typescript
|
|
119
|
+
* console.log(server.config.maxHistorySize);
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
readonly config: ServerConfig;
|
|
123
|
+
constructor(options?: ServerOptions);
|
|
124
|
+
/**
|
|
125
|
+
* Shared core logic for container creation.
|
|
126
|
+
* This method contains all common initialization logic between sync and async paths.
|
|
127
|
+
*/
|
|
128
|
+
private static _createContainerCore;
|
|
129
|
+
/**
|
|
130
|
+
* Create and configure the DI container synchronously (without persistence)
|
|
131
|
+
* This is used for backward compatibility when createServer is not used.
|
|
132
|
+
*/
|
|
133
|
+
private _createContainerSync;
|
|
134
|
+
/**
|
|
135
|
+
* Create and configure the DI container with async persistence initialization.
|
|
136
|
+
* This is used internally by the static create() factory.
|
|
137
|
+
*/
|
|
138
|
+
private static _createContainerAsyncStatic;
|
|
139
|
+
/**
|
|
140
|
+
* Get the DI container used by this server
|
|
141
|
+
* Useful for testing and advanced customizations
|
|
142
|
+
*/
|
|
143
|
+
getContainer(): Container;
|
|
144
|
+
/**
|
|
145
|
+
* Discover skills asynchronously without blocking server startup.
|
|
146
|
+
* This is the recommended method for skill discovery.
|
|
147
|
+
* @returns Promise<number> - The number of skills discovered
|
|
148
|
+
*/
|
|
149
|
+
discoverSkillsAsync(): Promise<number>;
|
|
150
|
+
/**
|
|
151
|
+
* Get all branches from the history manager
|
|
152
|
+
* @returns Record<string, ThoughtData[]> - Map of branch IDs to thought arrays
|
|
153
|
+
*/
|
|
154
|
+
getBranches(): Record<string, ThoughtData[]>;
|
|
155
|
+
processThought(input: v.InferInput<typeof SequentialThinkingSchema>): Promise<import("./core/ThoughtProcessor.js").CallToolResult>;
|
|
156
|
+
getMetricsSnapshot(): string;
|
|
157
|
+
/**
|
|
158
|
+
* Stop the server and clean up watchers.
|
|
159
|
+
* Closes persistence backend gracefully to ensure data is flushed.
|
|
160
|
+
*/
|
|
161
|
+
stop(): Promise<void>;
|
|
162
|
+
/**
|
|
163
|
+
* Clear all server state (history, tools, skills)
|
|
164
|
+
* Useful for testing to reset state between tests
|
|
165
|
+
*/
|
|
166
|
+
clear(): void;
|
|
167
|
+
/**
|
|
168
|
+
* Dispose of the server and all container services.
|
|
169
|
+
* Implements the IDisposable interface.
|
|
170
|
+
* Calls stop() for existing cleanup, then disposes the DI container.
|
|
171
|
+
*/
|
|
172
|
+
dispose(): Promise<void>;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Factory function to create a new server instance with async initialization.
|
|
176
|
+
*
|
|
177
|
+
* This is the recommended way to create server instances, especially for testing,
|
|
178
|
+
* as it allows for proper async initialization, dependency injection, and persistence.
|
|
179
|
+
*
|
|
180
|
+
* @param options - Server configuration options
|
|
181
|
+
* @returns A Promise that resolves to a configured server instance
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* ```typescript
|
|
185
|
+
* // Basic usage (with async discovery and persistence)
|
|
186
|
+
* const server = await createServer();
|
|
187
|
+
*
|
|
188
|
+
* // With custom options
|
|
189
|
+
* const server = await createServer({
|
|
190
|
+
* autoDiscover: false,
|
|
191
|
+
* lazyDiscovery: true,
|
|
192
|
+
* maxHistorySize: 500,
|
|
193
|
+
* loadFromPersistence: true
|
|
194
|
+
* });
|
|
195
|
+
*
|
|
196
|
+
* // With custom container for testing
|
|
197
|
+
* const mockContainer = new Container();
|
|
198
|
+
* mockContainer.registerInstance('Logger', mockLogger);
|
|
199
|
+
* const server = await createServer({ container: mockContainer });
|
|
200
|
+
* ```
|
|
201
|
+
*/
|
|
202
|
+
export declare function createServer(options?: ServerOptions): Promise<ToolAwareSequentialThinkingServer>;
|
|
203
|
+
export declare function initializeServer(): Promise<ToolAwareSequentialThinkingServer>;
|
|
204
|
+
export {};
|
|
205
|
+
//# sourceMappingURL=lib.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"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"}
|
package/dist/lib.js
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import { SEQUENTIAL_THINKING_TOOL } from "./schema.js";
|
|
3
|
+
import { DiscoveryCache } from "./cache/DiscoveryCache.js";
|
|
4
|
+
import { ConfigLoader } from "./config/ConfigLoader.js";
|
|
5
|
+
import { HistoryManager } from "./core/HistoryManager.js";
|
|
6
|
+
import { ThoughtEvaluator } from "./core/ThoughtEvaluator.js";
|
|
7
|
+
import { ThoughtFormatter } from "./core/ThoughtFormatter.js";
|
|
8
|
+
import { ThoughtProcessor } from "./core/ThoughtProcessor.js";
|
|
9
|
+
import { Container } from "./di/Container.js";
|
|
10
|
+
import { StructuredLogger } from "./logger/StructuredLogger.js";
|
|
11
|
+
import { Metrics } from "./metrics/metrics.impl.js";
|
|
12
|
+
import { createPersistenceBackend } from "./persistence/PersistenceFactory.js";
|
|
13
|
+
import { SkillRegistry } from "./registry/SkillRegistry.js";
|
|
14
|
+
import { ToolRegistry } from "./registry/ToolRegistry.js";
|
|
15
|
+
import { ServerConfig } from "./ServerConfig.js";
|
|
16
|
+
import { SkillWatcher } from "./watchers/SkillWatcher.js";
|
|
17
|
+
import { ToolWatcher } from "./watchers/ToolWatcher.js";
|
|
18
|
+
class ToolAwareSequentialThinkingServer extends EventEmitter {
|
|
19
|
+
static async create(options = {}) {
|
|
20
|
+
const container = await ToolAwareSequentialThinkingServer._createContainerAsyncStatic(options);
|
|
21
|
+
const server = new ToolAwareSequentialThinkingServer({
|
|
22
|
+
...options,
|
|
23
|
+
container
|
|
24
|
+
});
|
|
25
|
+
if (false !== options.loadFromPersistence) await server.history.loadFromPersistence();
|
|
26
|
+
if (false !== options.autoDiscover) await server.discoverSkillsAsync();
|
|
27
|
+
return server;
|
|
28
|
+
}
|
|
29
|
+
emit(event, payload) {
|
|
30
|
+
return super.emit(event, payload);
|
|
31
|
+
}
|
|
32
|
+
on(event, listener) {
|
|
33
|
+
return super.on(event, listener);
|
|
34
|
+
}
|
|
35
|
+
_container;
|
|
36
|
+
_logger;
|
|
37
|
+
_historyManager;
|
|
38
|
+
_thoughtProcessor;
|
|
39
|
+
_metrics;
|
|
40
|
+
_skillWatcher = null;
|
|
41
|
+
_toolWatcher = null;
|
|
42
|
+
_config;
|
|
43
|
+
history;
|
|
44
|
+
tools;
|
|
45
|
+
skills;
|
|
46
|
+
config;
|
|
47
|
+
constructor(options = {}){
|
|
48
|
+
super();
|
|
49
|
+
this._container = options.container ?? this._createContainerSync(options);
|
|
50
|
+
this._logger = this._container.resolve('Logger');
|
|
51
|
+
this._historyManager = this._container.resolve('HistoryManager');
|
|
52
|
+
this._thoughtProcessor = this._container.resolve('ThoughtProcessor');
|
|
53
|
+
this._metrics = this._container.resolve('Metrics');
|
|
54
|
+
this._config = this._container.resolve('Config');
|
|
55
|
+
this.history = this._historyManager;
|
|
56
|
+
this._historyManager.setEventEmitter(this);
|
|
57
|
+
this.tools = this._container.resolve('ToolRegistry');
|
|
58
|
+
this.skills = this._container.resolve('SkillRegistry');
|
|
59
|
+
this.config = this._config;
|
|
60
|
+
this.tools.addTool(SEQUENTIAL_THINKING_TOOL);
|
|
61
|
+
false !== options.autoDiscover && options.lazyDiscovery;
|
|
62
|
+
if (options.enableWatcher) {
|
|
63
|
+
this._skillWatcher = new SkillWatcher(this.skills);
|
|
64
|
+
this._toolWatcher = new ToolWatcher(this.tools);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
static _createContainerCore(options, fileConfig, persistence) {
|
|
68
|
+
const container = new Container();
|
|
69
|
+
const metrics = new Metrics({
|
|
70
|
+
prefix: 'sequentialthinking'
|
|
71
|
+
});
|
|
72
|
+
const config = new ServerConfig({
|
|
73
|
+
maxHistorySize: options.maxHistorySize ?? fileConfig?.maxHistorySize,
|
|
74
|
+
maxBranches: options.maxBranches ?? fileConfig?.maxBranches,
|
|
75
|
+
maxBranchSize: options.maxBranchSize ?? fileConfig?.maxBranchSize,
|
|
76
|
+
skillDirs: fileConfig?.skillDirs,
|
|
77
|
+
discoveryCache: fileConfig?.discoveryCache,
|
|
78
|
+
persistence: fileConfig?.persistence
|
|
79
|
+
});
|
|
80
|
+
const logger = options.logger ?? new StructuredLogger({
|
|
81
|
+
level: fileConfig?.logLevel ?? 'info',
|
|
82
|
+
context: 'SequentialThinking',
|
|
83
|
+
pretty: fileConfig?.prettyLog ?? true
|
|
84
|
+
});
|
|
85
|
+
container.registerInstance('Logger', logger);
|
|
86
|
+
container.registerInstance('Config', config);
|
|
87
|
+
container.registerInstance('FileConfig', fileConfig || {});
|
|
88
|
+
container.registerInstance('Persistence', persistence);
|
|
89
|
+
container.registerInstance('Metrics', metrics);
|
|
90
|
+
container.register('ToolRegistry', ()=>new ToolRegistry({
|
|
91
|
+
logger,
|
|
92
|
+
cache: config.discoveryCache ? new DiscoveryCache({
|
|
93
|
+
...config.discoveryCache,
|
|
94
|
+
metrics
|
|
95
|
+
}) : void 0
|
|
96
|
+
}));
|
|
97
|
+
container.register('SkillRegistry', ()=>new SkillRegistry({
|
|
98
|
+
logger,
|
|
99
|
+
cache: config.discoveryCache ? new DiscoveryCache({
|
|
100
|
+
...config.discoveryCache,
|
|
101
|
+
metrics
|
|
102
|
+
}) : void 0,
|
|
103
|
+
skillDirs: config.skillDirs,
|
|
104
|
+
lazyDiscovery: options.lazyDiscovery
|
|
105
|
+
}));
|
|
106
|
+
container.register('HistoryManager', ()=>{
|
|
107
|
+
const cfg = container.resolve('Config');
|
|
108
|
+
const log = container.resolve('Logger');
|
|
109
|
+
const pers = container.resolve('Persistence');
|
|
110
|
+
const componentMetrics = container.resolve('Metrics');
|
|
111
|
+
return new HistoryManager({
|
|
112
|
+
maxHistorySize: cfg.maxHistorySize,
|
|
113
|
+
maxBranches: cfg.maxBranches,
|
|
114
|
+
maxBranchSize: cfg.maxBranchSize,
|
|
115
|
+
logger: log,
|
|
116
|
+
persistence: pers,
|
|
117
|
+
metrics: componentMetrics,
|
|
118
|
+
persistenceBufferSize: cfg.persistenceBufferSize,
|
|
119
|
+
persistenceFlushInterval: cfg.persistenceFlushInterval,
|
|
120
|
+
persistenceMaxRetries: cfg.persistenceMaxRetries
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
container.registerFactory('ThoughtFormatter', ()=>new ThoughtFormatter());
|
|
124
|
+
container.registerFactory('ThoughtEvaluator', ()=>new ThoughtEvaluator());
|
|
125
|
+
container.register('ThoughtProcessor', ()=>{
|
|
126
|
+
const history = container.resolve('HistoryManager');
|
|
127
|
+
const formatter = container.resolve('ThoughtFormatter');
|
|
128
|
+
const evaluator = container.resolve('ThoughtEvaluator');
|
|
129
|
+
const log = container.resolve('Logger');
|
|
130
|
+
return new ThoughtProcessor(history, formatter, evaluator, log);
|
|
131
|
+
});
|
|
132
|
+
return container;
|
|
133
|
+
}
|
|
134
|
+
_createContainerSync(options) {
|
|
135
|
+
const configLoader = new ConfigLoader();
|
|
136
|
+
const fileConfig = configLoader.load();
|
|
137
|
+
return ToolAwareSequentialThinkingServer._createContainerCore(options, fileConfig, null);
|
|
138
|
+
}
|
|
139
|
+
static async _createContainerAsyncStatic(options) {
|
|
140
|
+
const configLoader = new ConfigLoader();
|
|
141
|
+
const fileConfig = configLoader.load();
|
|
142
|
+
const persistence = await createPersistenceBackend(fileConfig?.persistence ?? {
|
|
143
|
+
enabled: false
|
|
144
|
+
});
|
|
145
|
+
return ToolAwareSequentialThinkingServer._createContainerCore(options, fileConfig, persistence);
|
|
146
|
+
}
|
|
147
|
+
getContainer() {
|
|
148
|
+
return this._container;
|
|
149
|
+
}
|
|
150
|
+
async discoverSkillsAsync() {
|
|
151
|
+
const discovered = await this.skills.discoverAsync();
|
|
152
|
+
return discovered;
|
|
153
|
+
}
|
|
154
|
+
getBranches() {
|
|
155
|
+
return this._historyManager.getBranches();
|
|
156
|
+
}
|
|
157
|
+
async processThought(input) {
|
|
158
|
+
const startTime = Date.now();
|
|
159
|
+
const thoughtInput = input;
|
|
160
|
+
const result = await this._thoughtProcessor.process(thoughtInput);
|
|
161
|
+
const durationSeconds = (Date.now() - startTime) / 1000;
|
|
162
|
+
this._metrics.histogram('thought_processing_duration_seconds', durationSeconds, {});
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
getMetricsSnapshot() {
|
|
166
|
+
return this._metrics.export();
|
|
167
|
+
}
|
|
168
|
+
async stop() {
|
|
169
|
+
this._skillWatcher?.stop();
|
|
170
|
+
this._toolWatcher?.stop();
|
|
171
|
+
try {
|
|
172
|
+
await this._historyManager.shutdown();
|
|
173
|
+
} catch (error) {
|
|
174
|
+
this._logger.error('Error flushing write buffer during shutdown', {
|
|
175
|
+
error: error instanceof Error ? error.message : String(error)
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
const persistence = this._container.resolve('Persistence');
|
|
179
|
+
if (persistence) try {
|
|
180
|
+
await persistence.close();
|
|
181
|
+
this._logger.info('Persistence backend closed');
|
|
182
|
+
} catch (error) {
|
|
183
|
+
this._logger.error('Error closing persistence backend', {
|
|
184
|
+
error: error instanceof Error ? error.message : String(error)
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
this._logger.info('Server stopped, watchers cleaned up');
|
|
188
|
+
}
|
|
189
|
+
clear() {
|
|
190
|
+
this._historyManager.clear();
|
|
191
|
+
this._logger.info('Server state cleared');
|
|
192
|
+
}
|
|
193
|
+
async dispose() {
|
|
194
|
+
await this.stop();
|
|
195
|
+
await this._container.dispose();
|
|
196
|
+
this._logger.info('Server disposed, all resources released');
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
async function createServer(options = {}) {
|
|
200
|
+
return ToolAwareSequentialThinkingServer.create(options);
|
|
201
|
+
}
|
|
202
|
+
async function initializeServer() {
|
|
203
|
+
const configLoader = new ConfigLoader();
|
|
204
|
+
const fileConfig = configLoader.load();
|
|
205
|
+
const logger = new StructuredLogger({
|
|
206
|
+
level: fileConfig?.logLevel ?? 'info',
|
|
207
|
+
context: 'SequentialThinking',
|
|
208
|
+
pretty: fileConfig?.prettyLog ?? true
|
|
209
|
+
});
|
|
210
|
+
const thinkingServer = await createServer({
|
|
211
|
+
logger,
|
|
212
|
+
enableWatcher: true
|
|
213
|
+
});
|
|
214
|
+
logger.info('Server initialized successfully');
|
|
215
|
+
return thinkingServer;
|
|
216
|
+
}
|
|
217
|
+
export { ToolAwareSequentialThinkingServer, createServer, initializeServer };
|
|
218
|
+
|
|
219
|
+
//# sourceMappingURL=lib.js.map
|
package/dist/lib.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib.js","sources":["../src/lib.ts"],"sourcesContent":["// Library exports for tracelattice\n// This module contains all public API exports with NO CLI side effects.\n// For the CLI entry point, see cli.ts.\n\nimport { EventEmitter } from 'node:events';\nimport * as v from 'valibot';\nimport { ThoughtData } from './core/thought.js';\nimport { SEQUENTIAL_THINKING_TOOL, SequentialThinkingSchema } from './schema.js';\nimport { IDisposable } from './types/disposable.js';\n\n// New component imports\nimport { DiscoveryCache } from './cache/DiscoveryCache.js';\nimport type { ConfigFileOptions } from './config/ConfigLoader.js';\nimport { ConfigLoader } from './config/ConfigLoader.js';\nimport { HistoryManager } from './core/HistoryManager.js';\nimport { ThoughtEvaluator } from './core/ThoughtEvaluator.js';\nimport { ThoughtFormatter } from './core/ThoughtFormatter.js';\nimport { ThoughtProcessor } from './core/ThoughtProcessor.js';\nimport { Container } from './di/Container.js';\nimport { StructuredLogger } from './logger/StructuredLogger.js';\nimport { Metrics } from './metrics/metrics.impl.js';\nimport type { PersistenceBackend } from './persistence/PersistenceBackend.js';\nimport { createPersistenceBackend } from './persistence/PersistenceFactory.js';\nimport { SkillRegistry } from './registry/SkillRegistry.js';\nimport { ToolRegistry } from './registry/ToolRegistry.js';\nimport { ServerConfig } from './ServerConfig.js';\nimport type { SseTransportOptions } from './transport/SseTransport.js';\nimport { SkillWatcher } from './watchers/SkillWatcher.js';\nimport { ToolWatcher } from './watchers/ToolWatcher.js';\n\nexport interface ServerOptions {\n\tmaxHistorySize?: number;\n\tmaxBranches?: number;\n\tmaxBranchSize?: number;\n\tlogger?: StructuredLogger;\n\tenableWatcher?: boolean;\n\tconfig?: ServerConfig;\n\tfileConfig?: ConfigFileOptions;\n\tcontainer?: Container;\n\t/**\n\t * Enable automatic skill discovery on server startup\n\t * @default true\n\t */\n\tautoDiscover?: boolean;\n\t/**\n\t * Enable lazy discovery (discover on first access instead of startup)\n\t * @default false\n\t */\n\tlazyDiscovery?: boolean;\n\t/**\n\t * Load history from persistence on initialization\n\t * @default true\n\t */\n\tloadFromPersistence?: boolean;\n\t/**\n\t * Transport type to use\n\t * @default 'stdio'\n\t */\n\ttransport?: 'stdio' | 'sse';\n\t/**\n\t * SSE transport options (used when transport: 'sse')\n\t */\n\tsseTransportOptions?: SseTransportOptions;\n}\n\n/**\n * Server error events for event-driven error handling\n */\ninterface ServerEvents {\n\tpersistenceError: { operation: string; error: Error };\n\tdiscoveryError: { directory: string; error: Error };\n\ttransportError: { transport: string; error: Error };\n\tthoughtProcessed: { thoughtNumber: number; duration: number };\n}\n\nexport class ToolAwareSequentialThinkingServer extends EventEmitter implements IDisposable {\n\t/**\n\t * Factory method to create a new server instance with async initialization.\n\t * This is the recommended way to create server instances.\n\t *\n\t * @param options - Server configuration options\n\t * @returns A Promise that resolves to a configured server instance\n\t */\n\tstatic async create(options: ServerOptions = {}): Promise<ToolAwareSequentialThinkingServer> {\n\t\t// Create the async container first\n\t\tconst container = await ToolAwareSequentialThinkingServer._createContainerAsyncStatic(options);\n\n\t\t// Create a minimal server with the container\n\t\tconst server = new ToolAwareSequentialThinkingServer({\n\t\t\t...options,\n\t\t\tcontainer,\n\t\t});\n\n\t\t// Load from persistence if enabled (default: true)\n\t\tif (options.loadFromPersistence !== false) {\n\t\t\tawait server.history.loadFromPersistence();\n\t\t}\n\n\t\t// Perform async discovery if enabled (default: true)\n\t\tif (options.autoDiscover !== false) {\n\t\t\tawait server.discoverSkillsAsync();\n\t\t}\n\n\t\treturn server;\n\t}\n\n\t// Type-safe event emission\n\toverride emit<K extends keyof ServerEvents>(event: K, payload: ServerEvents[K]): boolean {\n\t\treturn super.emit(event, payload);\n\t}\n\n\toverride on<K extends keyof ServerEvents>(\n\t\tevent: K,\n\t\tlistener: (payload: ServerEvents[K]) => void\n\t): this {\n\t\treturn super.on(event, listener);\n\t}\n\n\t// DI Container for managing dependencies\n\tprivate _container: Container;\n\n\t// Component instances (private)\n\tprivate _logger: StructuredLogger;\n\tprivate _historyManager: HistoryManager;\n\tprivate _thoughtProcessor: ThoughtProcessor;\n\tprivate _metrics: Metrics;\n\tprivate _skillWatcher: SkillWatcher | null = null;\n\tprivate _toolWatcher: ToolWatcher | null = null;\n\tprivate _config: ServerConfig;\n\n\t// Public manager properties (recommended API)\n\t/**\n\t * Direct access to the history manager\n\t * @example\n\t * ```typescript\n\t * server.history.getHistory();\n\t * server.history.clear();\n\t * ```\n\t */\n\tpublic readonly history: HistoryManager;\n\n\t/**\n\t * Direct access to the tool registry\n\t * @example\n\t * ```typescript\n\t * server.tools.addTool(tool);\n\t * server.tools.getTool('my-tool');\n\t * ```\n\t */\n\tpublic readonly tools: ToolRegistry;\n\n\t/**\n\t * Direct access to the skill registry\n\t * @example\n\t * ```typescript\n\t * server.skills.addSkill(skill);\n\t * server.skills.getSkill('my-skill');\n\t * ```\n\t */\n\tpublic readonly skills: SkillRegistry;\n\n\t/**\n\t * Server configuration\n\t * @example\n\t * ```typescript\n\t * console.log(server.config.maxHistorySize);\n\t * ```\n\t */\n\tpublic readonly config: ServerConfig;\n\n\tconstructor(options: ServerOptions = {}) {\n\t\t// Use provided container or create a new one\n\t\tsuper();\n\t\tthis._container = options.container ?? this._createContainerSync(options);\n\n\t\t// Resolve dependencies from container\n\t\tthis._logger = this._container.resolve<StructuredLogger>('Logger');\n\t\tthis._historyManager = this._container.resolve<HistoryManager>('HistoryManager');\n\t\tthis._thoughtProcessor = this._container.resolve<ThoughtProcessor>('ThoughtProcessor');\n\t\tthis._metrics = this._container.resolve<Metrics>('Metrics');\n\t\tthis._config = this._container.resolve<ServerConfig>('Config');\n\n\t\t// Expose managers as public properties (recommended API)\n\t\tthis.history = this._historyManager;\n\n\t\t// Wire up persistence error event emitter\n\t\tthis._historyManager.setEventEmitter(this);\n\t\tthis.tools = this._container.resolve<ToolRegistry>('ToolRegistry');\n\t\tthis.skills = this._container.resolve<SkillRegistry>('SkillRegistry');\n\t\tthis.config = this._config;\n\n\t\t// Always include the sequential thinking tool\n\t\tthis.tools.addTool(SEQUENTIAL_THINKING_TOOL);\n\n\t\t// Note: For async discovery, users should call discoverSkillsAsync() after construction\n\t\tif (options.autoDiscover !== false && !options.lazyDiscovery) {\n\t\t\t// Synchronous discovery has been removed - use discoverSkillsAsync() instead\n\t\t\t// TODO: Update to use await this.skills.discoverAsync() instead\n\t\t\t// For now, comment out to prevent breaking\n\t\t\t// this.skills.discover();\n\t\t}\n\n\t\t// Initialize watchers if enabled\n\t\tif (options.enableWatcher) {\n\t\t\tthis._skillWatcher = new SkillWatcher(this.skills);\n\t\t\tthis._toolWatcher = new ToolWatcher(this.tools);\n\t\t}\n\t}\n\n\t/**\n\t * Shared core logic for container creation.\n\t * This method contains all common initialization logic between sync and async paths.\n\t */\n\tprivate static _createContainerCore(\n\t\toptions: ServerOptions,\n\t\tfileConfig: ConfigFileOptions | null,\n\t\tpersistence: PersistenceBackend | null\n\t): Container {\n\t\tconst container = new Container();\n\t\tconst metrics = new Metrics({\n\t\t\tprefix: 'sequentialthinking',\n\t\t});\n\n\t\t// Initialize config with file defaults overridden by constructor options\n\t\tconst config = new ServerConfig({\n\t\t\tmaxHistorySize: options.maxHistorySize ?? fileConfig?.maxHistorySize,\n\t\t\tmaxBranches: options.maxBranches ?? fileConfig?.maxBranches,\n\t\t\tmaxBranchSize: options.maxBranchSize ?? fileConfig?.maxBranchSize,\n\t\t\tskillDirs: fileConfig?.skillDirs,\n\t\t\tdiscoveryCache: fileConfig?.discoveryCache,\n\t\t\tpersistence: fileConfig?.persistence,\n\t\t});\n\n\t\t// Initialize logger\n\t\tconst logger =\n\t\t\toptions.logger ??\n\t\t\tnew StructuredLogger({\n\t\t\t\tlevel: fileConfig?.logLevel ?? 'info',\n\t\t\t\tcontext: 'SequentialThinking',\n\t\t\t\tpretty: fileConfig?.prettyLog ?? true,\n\t\t\t});\n\n\t\t// Register all services in the container\n\t\tcontainer.registerInstance('Logger', logger);\n\t\tcontainer.registerInstance('Config', config);\n\t\tcontainer.registerInstance('FileConfig', fileConfig || {});\n\t\tcontainer.registerInstance('Persistence', persistence);\n\t\tcontainer.registerInstance('Metrics', metrics);\n\t\tcontainer.register(\n\t\t\t'ToolRegistry',\n\t\t\t() =>\n\t\t\t\tnew ToolRegistry({\n\t\t\t\t\tlogger,\n\t\t\t\t\tcache: config.discoveryCache\n\t\t\t\t\t\t? new DiscoveryCache({ ...config.discoveryCache, metrics })\n\t\t\t\t\t\t: undefined,\n\t\t\t\t})\n\t\t);\n\t\tcontainer.register(\n\t\t\t'SkillRegistry',\n\t\t\t() =>\n\t\t\t\tnew SkillRegistry({\n\t\t\t\t\tlogger,\n\t\t\t\t\tcache: config.discoveryCache\n\t\t\t\t\t\t? new DiscoveryCache({ ...config.discoveryCache, metrics })\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tskillDirs: config.skillDirs,\n\t\t\t\t\tlazyDiscovery: options.lazyDiscovery,\n\t\t\t\t})\n\t\t);\n\n\t\t// Register HistoryManager with lazy initialization\n\t\tcontainer.register('HistoryManager', () => {\n\t\t\tconst cfg = container.resolve<ServerConfig>('Config');\n\t\t\tconst log = container.resolve<StructuredLogger>('Logger');\n\t\t\tconst pers = container.resolve('Persistence') as PersistenceBackend | null;\n\t\t\tconst componentMetrics = container.resolve<Metrics>('Metrics');\n\t\t\treturn new HistoryManager({\n\t\t\t\tmaxHistorySize: cfg.maxHistorySize,\n\t\t\t\tmaxBranches: cfg.maxBranches,\n\t\t\t\tmaxBranchSize: cfg.maxBranchSize,\n\t\t\t\tlogger: log,\n\t\t\t\tpersistence: pers,\n\t\t\t\tmetrics: componentMetrics,\n\t\t\t\tpersistenceBufferSize: cfg.persistenceBufferSize,\n\t\t\t\tpersistenceFlushInterval: cfg.persistenceFlushInterval,\n\t\t\t\tpersistenceMaxRetries: cfg.persistenceMaxRetries,\n\t\t\t});\n\t\t});\n\n\t\t// Register ThoughtFormatter (can be transient)\n\t\tcontainer.registerFactory('ThoughtFormatter', () => new ThoughtFormatter());\n\n\t\t// Register ThoughtEvaluator (stateless, transient)\n\t\tcontainer.registerFactory('ThoughtEvaluator', () => new ThoughtEvaluator());\n\n\t\t// Register ThoughtProcessor\n\t\tcontainer.register('ThoughtProcessor', () => {\n\t\t\tconst history = container.resolve<HistoryManager>('HistoryManager');\n\t\t\tconst formatter = container.resolve<ThoughtFormatter>('ThoughtFormatter');\n\t\t\tconst evaluator = container.resolve<ThoughtEvaluator>('ThoughtEvaluator');\n\t\t\tconst log = container.resolve<StructuredLogger>('Logger');\n\t\t\treturn new ThoughtProcessor(history, formatter, evaluator, log);\n\t\t});\n\n\t\treturn container;\n\t}\n\n\t/**\n\t * Create and configure the DI container synchronously (without persistence)\n\t * This is used for backward compatibility when createServer is not used.\n\t */\n\tprivate _createContainerSync(options: ServerOptions): Container {\n\t\tconst configLoader = new ConfigLoader();\n\t\tconst fileConfig = configLoader.load();\n\n\t\treturn ToolAwareSequentialThinkingServer._createContainerCore(options, fileConfig, null);\n\t}\n\n\t/**\n\t * Create and configure the DI container with async persistence initialization.\n\t * This is used internally by the static create() factory.\n\t */\n\tprivate static async _createContainerAsyncStatic(options: ServerOptions): Promise<Container> {\n\t\tconst configLoader = new ConfigLoader();\n\t\tconst fileConfig = configLoader.load();\n\n\t\t// Initialize persistence backend (async)\n\t\tconst persistence = await createPersistenceBackend(\n\t\t\tfileConfig?.persistence ?? { enabled: false }\n\t\t);\n\n\t\treturn ToolAwareSequentialThinkingServer._createContainerCore(options, fileConfig, persistence);\n\t}\n\n\t/**\n\t * Get the DI container used by this server\n\t * Useful for testing and advanced customizations\n\t */\n\tpublic getContainer(): Container {\n\t\treturn this._container;\n\t}\n\n\t/**\n\t * Discover skills asynchronously without blocking server startup.\n\t * This is the recommended method for skill discovery.\n\t * @returns Promise<number> - The number of skills discovered\n\t */\n\tpublic async discoverSkillsAsync(): Promise<number> {\n\t\tconst discovered = await this.skills.discoverAsync();\n\t\treturn discovered;\n\t}\n\n\t/**\n\t * Get all branches from the history manager\n\t * @returns Record<string, ThoughtData[]> - Map of branch IDs to thought arrays\n\t */\n\tpublic getBranches(): Record<string, ThoughtData[]> {\n\t\treturn this._historyManager.getBranches();\n\t}\n\n\t// Main processing method - delegate to ThoughtProcessor\n\tpublic async processThought(input: v.InferInput<typeof SequentialThinkingSchema>) {\n\t\tconst startTime = Date.now();\n\t\tconst thoughtInput = input as ThoughtData;\n\t\tconst result = await this._thoughtProcessor.process(thoughtInput);\n\t\tconst durationSeconds = (Date.now() - startTime) / 1000;\n\t\tthis._metrics.histogram('thought_processing_duration_seconds', durationSeconds, {});\n\t\treturn result;\n\t}\n\n\tpublic getMetricsSnapshot(): string {\n\t\treturn this._metrics.export();\n\t}\n\n\t/**\n\t * Stop the server and clean up watchers.\n\t * Closes persistence backend gracefully to ensure data is flushed.\n\t */\n\tpublic async stop(): Promise<void> {\n\t\tthis._skillWatcher?.stop();\n\t\tthis._toolWatcher?.stop();\n\n\t\t// Flush any buffered writes before closing persistence\n\t\ttry {\n\t\t\tawait this._historyManager.shutdown();\n\t\t} catch (error) {\n\t\t\tthis._logger.error('Error flushing write buffer during shutdown', {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t}\n\n\t\t// Close persistence backend if available\n\t\tconst persistence = this._container.resolve<PersistenceBackend | null>('Persistence');\n\t\tif (persistence) {\n\t\t\ttry {\n\t\t\t\tawait persistence.close();\n\t\t\t\tthis._logger.info('Persistence backend closed');\n\t\t\t} catch (error) {\n\t\t\t\tthis._logger.error('Error closing persistence backend', {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis._logger.info('Server stopped, watchers cleaned up');\n\t}\n\n\t/**\n\t * Clear all server state (history, tools, skills)\n\t * Useful for testing to reset state between tests\n\t */\n\tpublic clear(): void {\n\t\tthis._historyManager.clear();\n\t\tthis._logger.info('Server state cleared');\n\t}\n\n\t/**\n\t * Dispose of the server and all container services.\n\t * Implements the IDisposable interface.\n\t * Calls stop() for existing cleanup, then disposes the DI container.\n\t */\n\tpublic async dispose(): Promise<void> {\n\t\tawait this.stop();\n\t\tawait this._container.dispose();\n\t\tthis._logger.info('Server disposed, all resources released');\n\t}\n}\n\n/**\n * Factory function to create a new server instance with async initialization.\n *\n * This is the recommended way to create server instances, especially for testing,\n * as it allows for proper async initialization, dependency injection, and persistence.\n *\n * @param options - Server configuration options\n * @returns A Promise that resolves to a configured server instance\n *\n * @example\n * ```typescript\n * // Basic usage (with async discovery and persistence)\n * const server = await createServer();\n *\n * // With custom options\n * const server = await createServer({\n * autoDiscover: false,\n * lazyDiscovery: true,\n * maxHistorySize: 500,\n * loadFromPersistence: true\n * });\n *\n * // With custom container for testing\n * const mockContainer = new Container();\n * mockContainer.registerInstance('Logger', mockLogger);\n * const server = await createServer({ container: mockContainer });\n * ```\n */\nexport async function createServer(\n\toptions: ServerOptions = {}\n): Promise<ToolAwareSequentialThinkingServer> {\n\treturn ToolAwareSequentialThinkingServer.create(options);\n}\n\n// Initialize server\nexport async function initializeServer(): Promise<ToolAwareSequentialThinkingServer> {\n\t// Create logger for initialization\n\tconst configLoader = new ConfigLoader();\n\tconst fileConfig = configLoader.load();\n\n\tconst logger = new StructuredLogger({\n\t\tlevel: fileConfig?.logLevel ?? 'info',\n\t\tcontext: 'SequentialThinking',\n\t\tpretty: fileConfig?.prettyLog ?? true,\n\t});\n\n\t// Create server instance\n\tconst thinkingServer = await createServer({\n\t\tlogger,\n\t\tenableWatcher: true,\n\t});\n\n\tlogger.info('Server initialized successfully');\n\treturn thinkingServer;\n}\n"],"names":["ToolAwareSequentialThinkingServer","EventEmitter","options","container","server","event","payload","listener","SEQUENTIAL_THINKING_TOOL","SkillWatcher","ToolWatcher","fileConfig","persistence","Container","metrics","Metrics","config","ServerConfig","logger","StructuredLogger","ToolRegistry","DiscoveryCache","undefined","SkillRegistry","cfg","log","pers","componentMetrics","HistoryManager","ThoughtFormatter","ThoughtEvaluator","history","formatter","evaluator","ThoughtProcessor","configLoader","ConfigLoader","createPersistenceBackend","discovered","input","startTime","Date","thoughtInput","result","durationSeconds","error","Error","String","createServer","initializeServer","thinkingServer"],"mappings":"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"}
|