@iworkforces/tracelattice 2.1.2 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -3
- package/dist/contracts/PersistenceBackend.d.ts +10 -1
- package/dist/contracts/PersistenceBackend.d.ts.map +1 -1
- package/dist/contracts/calibrator.d.ts +9 -6
- package/dist/contracts/calibrator.d.ts.map +1 -1
- package/dist/contracts/interfaces.d.ts +6 -0
- package/dist/contracts/interfaces.d.ts.map +1 -1
- package/dist/contracts/persistence-work.d.ts +13 -1
- package/dist/contracts/persistence-work.d.ts.map +1 -1
- package/dist/contracts/strategy.d.ts +14 -9
- package/dist/contracts/strategy.d.ts.map +1 -1
- package/dist/core/DurableThoughtIdentityIndex.d.ts +35 -0
- package/dist/core/DurableThoughtIdentityIndex.d.ts.map +1 -0
- package/dist/core/DurableThoughtIdentityIndex.js +94 -0
- package/dist/core/DurableThoughtIdentityIndex.js.map +1 -0
- package/dist/core/HistoryManager.d.ts +5 -0
- package/dist/core/HistoryManager.d.ts.map +1 -1
- package/dist/core/HistoryManager.js +37 -4
- package/dist/core/HistoryManager.js.map +1 -1
- package/dist/core/IHistoryManager.d.ts +2 -0
- package/dist/core/IHistoryManager.d.ts.map +1 -1
- package/dist/core/PersistenceBuffer.d.ts +7 -1
- package/dist/core/PersistenceBuffer.d.ts.map +1 -1
- package/dist/core/PersistenceBuffer.js +13 -1
- package/dist/core/PersistenceBuffer.js.map +1 -1
- package/dist/core/PersistenceRestore.d.ts.map +1 -1
- package/dist/core/PersistenceRestore.js +11 -3
- package/dist/core/PersistenceRestore.js.map +1 -1
- package/dist/core/PersistenceWorkQueue.d.ts +13 -1
- package/dist/core/PersistenceWorkQueue.d.ts.map +1 -1
- package/dist/core/PersistenceWorkQueue.js +86 -11
- package/dist/core/PersistenceWorkQueue.js.map +1 -1
- package/dist/core/PersistenceWriter.d.ts.map +1 -1
- package/dist/core/PersistenceWriter.js +3 -0
- package/dist/core/PersistenceWriter.js.map +1 -1
- package/dist/core/ThoughtEvaluator.d.ts +7 -4
- package/dist/core/ThoughtEvaluator.d.ts.map +1 -1
- package/dist/core/ThoughtEvaluator.js +15 -7
- package/dist/core/ThoughtEvaluator.js.map +1 -1
- package/dist/core/ThoughtProcessor.d.ts.map +1 -1
- package/dist/core/ThoughtProcessor.js +19 -7
- package/dist/core/ThoughtProcessor.js.map +1 -1
- package/dist/core/ThoughtReferenceIndex.d.ts +4 -0
- package/dist/core/ThoughtReferenceIndex.d.ts.map +1 -1
- package/dist/core/ThoughtReferenceIndex.js +28 -1
- package/dist/core/ThoughtReferenceIndex.js.map +1 -1
- package/dist/core/VerificationOutcomeAdmission.d.ts +8 -1
- package/dist/core/VerificationOutcomeAdmission.d.ts.map +1 -1
- package/dist/core/VerificationOutcomeAdmission.js.map +1 -1
- package/dist/core/VerificationTargetRestore.d.ts +5 -0
- package/dist/core/VerificationTargetRestore.d.ts.map +1 -0
- package/dist/core/VerificationTargetRestore.js +61 -0
- package/dist/core/VerificationTargetRestore.js.map +1 -0
- package/dist/core/evaluator/Aggregator.d.ts +2 -1
- package/dist/core/evaluator/Aggregator.d.ts.map +1 -1
- package/dist/core/evaluator/Aggregator.js +4 -12
- package/dist/core/evaluator/Aggregator.js.map +1 -1
- package/dist/core/evaluator/Calibrator.d.ts +13 -9
- package/dist/core/evaluator/Calibrator.d.ts.map +1 -1
- package/dist/core/evaluator/Calibrator.js +25 -11
- package/dist/core/evaluator/Calibrator.js.map +1 -1
- package/dist/core/evaluator/PatternDetector.d.ts +2 -1
- package/dist/core/evaluator/PatternDetector.d.ts.map +1 -1
- package/dist/core/evaluator/PatternDetector.js +13 -12
- package/dist/core/evaluator/PatternDetector.js.map +1 -1
- package/dist/core/evaluator/SignalComputer.d.ts +3 -2
- package/dist/core/evaluator/SignalComputer.d.ts.map +1 -1
- package/dist/core/evaluator/SignalComputer.js +4 -9
- package/dist/core/evaluator/SignalComputer.js.map +1 -1
- package/dist/core/evaluator/VerificationLinks.d.ts +19 -0
- package/dist/core/evaluator/VerificationLinks.d.ts.map +1 -0
- package/dist/core/evaluator/VerificationLinks.js +113 -0
- package/dist/core/evaluator/VerificationLinks.js.map +1 -0
- package/dist/core/evaluator/calibration-math.d.ts +12 -2
- package/dist/core/evaluator/calibration-math.d.ts.map +1 -1
- package/dist/core/evaluator/calibration-math.js +11 -2
- package/dist/core/evaluator/calibration-math.js.map +1 -1
- package/dist/core/graph/EdgeEmitter.d.ts.map +1 -1
- package/dist/core/graph/EdgeEmitter.js +2 -1
- package/dist/core/graph/EdgeEmitter.js.map +1 -1
- package/dist/core/graph/GraphView.d.ts +5 -5
- package/dist/core/graph/GraphView.d.ts.map +1 -1
- package/dist/core/graph/GraphView.js +11 -11
- package/dist/core/graph/GraphView.js.map +1 -1
- package/dist/core/reasoning/ActiveEvidenceProjection.d.ts +20 -0
- package/dist/core/reasoning/ActiveEvidenceProjection.d.ts.map +1 -0
- package/dist/core/reasoning/ActiveEvidenceProjection.js +100 -0
- package/dist/core/reasoning/ActiveEvidenceProjection.js.map +1 -0
- package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.d.ts +5 -4
- package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.d.ts.map +1 -1
- package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.js +24 -14
- package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.js.map +1 -1
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +3 -1
- package/dist/lib.js.map +1 -1
- package/dist/persistence/BacktrackPersistence.d.ts +13 -0
- package/dist/persistence/BacktrackPersistence.d.ts.map +1 -0
- package/dist/persistence/BacktrackPersistence.js +90 -0
- package/dist/persistence/BacktrackPersistence.js.map +1 -0
- package/dist/persistence/FilePersistence.d.ts +2 -1
- package/dist/persistence/FilePersistence.d.ts.map +1 -1
- package/dist/persistence/FilePersistence.js +28 -0
- package/dist/persistence/FilePersistence.js.map +1 -1
- package/dist/persistence/FileSnapshotV2.d.ts +2 -0
- package/dist/persistence/FileSnapshotV2.d.ts.map +1 -1
- package/dist/persistence/FileSnapshotV2.js +6 -2
- package/dist/persistence/FileSnapshotV2.js.map +1 -1
- package/dist/persistence/MemoryPersistence.d.ts +2 -1
- package/dist/persistence/MemoryPersistence.d.ts.map +1 -1
- package/dist/persistence/MemoryPersistence.js +21 -1
- package/dist/persistence/MemoryPersistence.js.map +1 -1
- package/dist/persistence/PersistenceCodec.d.ts.map +1 -1
- package/dist/persistence/PersistenceCodec.js +5 -0
- package/dist/persistence/PersistenceCodec.js.map +1 -1
- package/dist/persistence/PersistenceErrors.d.ts +1 -1
- package/dist/persistence/PersistenceErrors.d.ts.map +1 -1
- package/dist/persistence/PersistenceErrors.js.map +1 -1
- package/dist/persistence/PersistenceScope.d.ts +1 -1
- package/dist/persistence/PersistenceScope.d.ts.map +1 -1
- package/dist/persistence/PersistenceScope.js.map +1 -1
- package/dist/persistence/SqlitePersistence.d.ts +2 -1
- package/dist/persistence/SqlitePersistence.d.ts.map +1 -1
- package/dist/persistence/SqlitePersistence.js +18 -0
- package/dist/persistence/SqlitePersistence.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { collectActiveMainThoughts, collectActiveThoughts } from "../evaluator/VerificationLinks.js";
|
|
2
|
+
import { GraphView } from "../graph/GraphView.js";
|
|
3
|
+
class ProjectedGraphStore {
|
|
4
|
+
_edges;
|
|
5
|
+
_nodes;
|
|
6
|
+
_outgoing;
|
|
7
|
+
_incoming;
|
|
8
|
+
_sessionId;
|
|
9
|
+
constructor(sessionId, edges, nodes){
|
|
10
|
+
this._sessionId = sessionId;
|
|
11
|
+
this._edges = Object.freeze(edges.map(copyEdge));
|
|
12
|
+
this._nodes = Object.freeze([
|
|
13
|
+
...nodes
|
|
14
|
+
]);
|
|
15
|
+
this._outgoing = buildAdjacency(this._edges, 'from');
|
|
16
|
+
this._incoming = buildAdjacency(this._edges, 'to');
|
|
17
|
+
}
|
|
18
|
+
outgoing(sessionId, from) {
|
|
19
|
+
return sessionId === this._sessionId ? this._outgoing.get(from) ?? [] : [];
|
|
20
|
+
}
|
|
21
|
+
incoming(sessionId, to) {
|
|
22
|
+
return sessionId === this._sessionId ? this._incoming.get(to) ?? [] : [];
|
|
23
|
+
}
|
|
24
|
+
edgesForSession(sessionId) {
|
|
25
|
+
return sessionId === this._sessionId ? this._edges : [];
|
|
26
|
+
}
|
|
27
|
+
nodesForSession(sessionId) {
|
|
28
|
+
return sessionId === this._sessionId ? this._nodes : [];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function buildActiveEvidenceProjection(input) {
|
|
32
|
+
const mainHistory = freezeThoughts(collectActiveMainThoughts(input.history, input.branches));
|
|
33
|
+
const activeThoughts = freezeThoughts(collectActiveThoughts(input.history, input.branches));
|
|
34
|
+
const graph = input.edgeStore ? projectGraph(input.sessionId, activeThoughts, input.edgeStore) : void 0;
|
|
35
|
+
return Object.freeze({
|
|
36
|
+
mainHistory,
|
|
37
|
+
activeThoughts,
|
|
38
|
+
graph
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function projectGraph(sessionId, activeThoughts, edgeStore) {
|
|
42
|
+
const activeIds = new Set(activeThoughts.flatMap((thought)=>thought.id ? [
|
|
43
|
+
thought.id
|
|
44
|
+
] : []));
|
|
45
|
+
const auditEdges = edgeStore.edgesForSession(sessionId);
|
|
46
|
+
const visibleNodes = new Set();
|
|
47
|
+
for (const edge of auditEdges){
|
|
48
|
+
if (activeIds.has(edge.from)) visibleNodes.add(edge.from);
|
|
49
|
+
if (activeIds.has(edge.to)) visibleNodes.add(edge.to);
|
|
50
|
+
}
|
|
51
|
+
const edges = auditEdges.filter((edge)=>activeIds.has(edge.from) && activeIds.has(edge.to));
|
|
52
|
+
return new GraphView(new ProjectedGraphStore(sessionId, edges, [
|
|
53
|
+
...visibleNodes
|
|
54
|
+
]));
|
|
55
|
+
}
|
|
56
|
+
function freezeThoughts(thoughts) {
|
|
57
|
+
return Object.freeze(thoughts.map((thought)=>Object.freeze(structuredClone(thought))));
|
|
58
|
+
}
|
|
59
|
+
function copyEdge(edge) {
|
|
60
|
+
return Object.freeze({
|
|
61
|
+
...edge,
|
|
62
|
+
...void 0 === edge.metadata ? {} : {
|
|
63
|
+
metadata: copyMetadata(edge.metadata)
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function copyMetadata(metadata) {
|
|
68
|
+
return Object.freeze(Object.fromEntries(Object.entries(metadata).map(([key, value])=>[
|
|
69
|
+
key,
|
|
70
|
+
copyMetadataValue(value)
|
|
71
|
+
])));
|
|
72
|
+
}
|
|
73
|
+
function copyMetadataValue(value) {
|
|
74
|
+
if (Array.isArray(value)) return Object.freeze(value.map(copyMetadataValue));
|
|
75
|
+
if (isMetadataRecord(value)) return copyMetadata(value);
|
|
76
|
+
return value;
|
|
77
|
+
}
|
|
78
|
+
function isMetadataRecord(value) {
|
|
79
|
+
return 'object' == typeof value && null !== value;
|
|
80
|
+
}
|
|
81
|
+
function buildAdjacency(edges, endpoint) {
|
|
82
|
+
const mutable = new Map();
|
|
83
|
+
for (const edge of edges){
|
|
84
|
+
const key = edge[endpoint];
|
|
85
|
+
const bucket = mutable.get(key);
|
|
86
|
+
if (void 0 === bucket) mutable.set(key, [
|
|
87
|
+
edge
|
|
88
|
+
]);
|
|
89
|
+
else bucket.push(edge);
|
|
90
|
+
}
|
|
91
|
+
return new Map([
|
|
92
|
+
...mutable
|
|
93
|
+
].map(([key, bucket])=>[
|
|
94
|
+
key,
|
|
95
|
+
Object.freeze(bucket)
|
|
96
|
+
]));
|
|
97
|
+
}
|
|
98
|
+
export { buildActiveEvidenceProjection };
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=ActiveEvidenceProjection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core/reasoning/ActiveEvidenceProjection.js","sources":["../../../src/core/reasoning/ActiveEvidenceProjection.ts"],"sourcesContent":["import type { IEdgeStore, IGraphViewStore } from '../../contracts/interfaces.js';\nimport type { ActiveEvidenceProjection } from '../../contracts/strategy.js';\nimport type { SessionId, ThoughtId } from '../../contracts/ids.js';\nimport {\n\tcollectActiveMainThoughts,\n\tcollectActiveThoughts,\n\ttype ActiveThoughtBranches,\n} from '../evaluator/VerificationLinks.js';\nimport { GraphView } from '../graph/GraphView.js';\nimport type { Edge } from '../graph/Edge.js';\nimport type { ThoughtData } from '../thought.js';\n\nexport interface ActiveEvidenceProjectionInput {\n\treadonly sessionId: SessionId;\n\treadonly history: readonly ThoughtData[];\n\treadonly branches: ActiveThoughtBranches;\n\treadonly edgeStore: IEdgeStore | undefined;\n}\n\nclass ProjectedGraphStore implements IGraphViewStore {\n\tprivate readonly _edges: readonly Edge[];\n\tprivate readonly _nodes: readonly ThoughtId[];\n\tprivate readonly _outgoing: ReadonlyMap<ThoughtId, readonly Edge[]>;\n\tprivate readonly _incoming: ReadonlyMap<ThoughtId, readonly Edge[]>;\n\tprivate readonly _sessionId: SessionId;\n\n\tconstructor(sessionId: SessionId, edges: readonly Edge[], nodes: readonly ThoughtId[]) {\n\t\tthis._sessionId = sessionId;\n\t\tthis._edges = Object.freeze(edges.map(copyEdge));\n\t\tthis._nodes = Object.freeze([...nodes]);\n\t\tthis._outgoing = buildAdjacency(this._edges, 'from');\n\t\tthis._incoming = buildAdjacency(this._edges, 'to');\n\t}\n\n\toutgoing(sessionId: SessionId, from: ThoughtId): readonly Edge[] {\n\t\treturn sessionId === this._sessionId ? (this._outgoing.get(from) ?? []) : [];\n\t}\n\n\tincoming(sessionId: SessionId, to: ThoughtId): readonly Edge[] {\n\t\treturn sessionId === this._sessionId ? (this._incoming.get(to) ?? []) : [];\n\t}\n\n\tedgesForSession(sessionId: SessionId): readonly Edge[] {\n\t\treturn sessionId === this._sessionId ? this._edges : [];\n\t}\n\n\tnodesForSession(sessionId: SessionId): readonly ThoughtId[] {\n\t\treturn sessionId === this._sessionId ? this._nodes : [];\n\t}\n}\n\n/**\n * Build immutable, deep-copied active evidence for strategy reads.\n *\n * Main history keeps retained main order. Active thoughts include branch-only retained entries.\n * The graph is induced by active endpoints only, without path contraction, and never mutates the\n * audit edge store.\n */\nexport function buildActiveEvidenceProjection(\n\tinput: ActiveEvidenceProjectionInput\n): ActiveEvidenceProjection {\n\tconst mainHistory = freezeThoughts(collectActiveMainThoughts(input.history, input.branches));\n\tconst activeThoughts = freezeThoughts(collectActiveThoughts(input.history, input.branches));\n\tconst graph = input.edgeStore\n\t\t? projectGraph(input.sessionId, activeThoughts, input.edgeStore)\n\t\t: undefined;\n\treturn Object.freeze({ mainHistory, activeThoughts, graph });\n}\n\nfunction projectGraph(\n\tsessionId: SessionId,\n\tactiveThoughts: readonly ThoughtData[],\n\tedgeStore: IEdgeStore\n): GraphView {\n\tconst activeIds = new Set(activeThoughts.flatMap((thought) => (thought.id ? [thought.id] : [])));\n\tconst auditEdges = edgeStore.edgesForSession(sessionId);\n\tconst visibleNodes = new Set<ThoughtId>();\n\tfor (const edge of auditEdges) {\n\t\tif (activeIds.has(edge.from)) visibleNodes.add(edge.from);\n\t\tif (activeIds.has(edge.to)) visibleNodes.add(edge.to);\n\t}\n\tconst edges = auditEdges.filter((edge) => activeIds.has(edge.from) && activeIds.has(edge.to));\n\treturn new GraphView(new ProjectedGraphStore(sessionId, edges, [...visibleNodes]));\n}\n\nfunction freezeThoughts(thoughts: readonly ThoughtData[]): readonly ThoughtData[] {\n\treturn Object.freeze(thoughts.map((thought) => Object.freeze(structuredClone(thought))));\n}\n\nfunction copyEdge(edge: Edge): Edge {\n\treturn Object.freeze({\n\t\t...edge,\n\t\t...(edge.metadata === undefined ? {} : { metadata: copyMetadata(edge.metadata) }),\n\t});\n}\n\nfunction copyMetadata(metadata: Record<string, unknown>): Record<string, unknown> {\n\treturn Object.freeze(\n\t\tObject.fromEntries(\n\t\t\tObject.entries(metadata).map(([key, value]) => [key, copyMetadataValue(value)])\n\t\t)\n\t);\n}\n\nfunction copyMetadataValue(value: unknown): unknown {\n\tif (Array.isArray(value)) return Object.freeze(value.map(copyMetadataValue));\n\tif (isMetadataRecord(value)) return copyMetadata(value);\n\treturn value;\n}\n\nfunction isMetadataRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === 'object' && value !== null;\n}\n\nfunction buildAdjacency(\n\tedges: readonly Edge[],\n\tendpoint: 'from' | 'to'\n): ReadonlyMap<ThoughtId, readonly Edge[]> {\n\tconst mutable = new Map<ThoughtId, Edge[]>();\n\tfor (const edge of edges) {\n\t\tconst key = edge[endpoint];\n\t\tconst bucket = mutable.get(key);\n\t\tif (bucket === undefined) mutable.set(key, [edge]);\n\t\telse bucket.push(edge);\n\t}\n\treturn new Map([...mutable].map(([key, bucket]) => [key, Object.freeze(bucket)]));\n}\n"],"names":["ProjectedGraphStore","sessionId","edges","nodes","Object","copyEdge","buildAdjacency","from","to","buildActiveEvidenceProjection","input","mainHistory","freezeThoughts","collectActiveMainThoughts","activeThoughts","collectActiveThoughts","graph","projectGraph","undefined","edgeStore","activeIds","Set","thought","auditEdges","visibleNodes","edge","GraphView","thoughts","structuredClone","copyMetadata","metadata","key","value","copyMetadataValue","Array","isMetadataRecord","endpoint","mutable","Map","bucket"],"mappings":"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"}
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* Observes the frontier (graph leaves), scores each leaf via
|
|
5
5
|
* {@link scoreThought}, and decides whether to continue, branch (when the
|
|
6
6
|
* current thought falls outside the beam), or terminate (on depth cap,
|
|
7
|
-
* confidence threshold, or score plateau).
|
|
7
|
+
* confidence threshold, or score plateau). It reads only the immutable active evidence projection;
|
|
8
|
+
* the audit history and graph remain unchanged.
|
|
8
9
|
*
|
|
9
10
|
* Pure policy: configuration lives in a module-level {@link WeakMap}, not
|
|
10
11
|
* on the instance, so `Object.getOwnPropertyNames(strategy)` only ever
|
|
@@ -23,7 +24,7 @@ export interface TotConfig {
|
|
|
23
24
|
readonly beamWidth?: number;
|
|
24
25
|
/** Maximum exploration depth before forcing termination (default `8`). */
|
|
25
26
|
readonly depthCap?: number;
|
|
26
|
-
/**
|
|
27
|
+
/** Finite nonnegative score at/above which the chain terminates (default `0.85`; values >1 valid). */
|
|
27
28
|
readonly terminationConfidence?: number;
|
|
28
29
|
/** Window size for plateau detection (default `3`). */
|
|
29
30
|
readonly plateauWindow?: number;
|
|
@@ -46,8 +47,8 @@ export declare class TreeOfThoughtStrategy implements IReasoningStrategy {
|
|
|
46
47
|
/**
|
|
47
48
|
* Compute the next action for the chain.
|
|
48
49
|
*
|
|
49
|
-
* Order of checks: depth cap
|
|
50
|
-
* current thought is outside the beam
|
|
50
|
+
* Order of checks: depth cap, frontier confidence, plateau over retained main-history scores,
|
|
51
|
+
* branch when the current thought is outside the beam, then continue. Missing graphs continue.
|
|
51
52
|
*/
|
|
52
53
|
decide(ctx: StrategyContext): StrategyDecision;
|
|
53
54
|
/** True below the depth cap when the frontier is wider than the beam. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeOfThoughtStrategy.d.ts","sourceRoot":"","sources":["../../../../src/core/reasoning/strategies/TreeOfThoughtStrategy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"TreeOfThoughtStrategy.d.ts","sourceRoot":"","sources":["../../../../src/core/reasoning/strategies/TreeOfThoughtStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EACX,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,MAAM,gCAAgC,CAAC;AAMxC;;;GAGG;AACH,MAAM,WAAW,SAAS;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,sGAAsG;IACtG,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,uDAAuD;IACvD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,8EAA8E;IAC9E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACjC;AAsED;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,YAAW,kBAAkB;IAC/D,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAU;IAE/B,6CAA6C;gBACjC,MAAM,CAAC,EAAE,SAAS;IA8B9B;;;;;OAKG;IACH,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,gBAAgB;IAoC9C,yEAAyE;IACzE,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO;IAQ3C,qEAAqE;IACrE,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO;CAa9C"}
|
|
@@ -43,37 +43,47 @@ function recentScores(history, window) {
|
|
|
43
43
|
return out;
|
|
44
44
|
}
|
|
45
45
|
function isAtDepthCap(ctx, depthCap) {
|
|
46
|
-
const depth = ctx.graph?.depthFromRoots(ctx.sessionId, thoughtKey(ctx.currentThought));
|
|
46
|
+
const depth = ctx.evidence.graph?.depthFromRoots(ctx.sessionId, thoughtKey(ctx.currentThought));
|
|
47
47
|
return void 0 !== depth && depth >= depthCap;
|
|
48
48
|
}
|
|
49
49
|
class TreeOfThoughtStrategy {
|
|
50
50
|
name = 'tot';
|
|
51
51
|
constructor(config){
|
|
52
|
+
const beamWidth = config?.beamWidth ?? DEFAULTS.beamWidth;
|
|
52
53
|
const depthCap = config?.depthCap ?? DEFAULTS.depthCap;
|
|
54
|
+
const terminationConfidence = config?.terminationConfidence ?? DEFAULTS.terminationConfidence;
|
|
55
|
+
const plateauWindow = config?.plateauWindow ?? DEFAULTS.plateauWindow;
|
|
56
|
+
const plateauEpsilon = config?.plateauEpsilon ?? DEFAULTS.plateauEpsilon;
|
|
57
|
+
if (!Number.isFinite(beamWidth) || !Number.isInteger(beamWidth) || beamWidth < 1) throw new TypeError('beamWidth must be a finite positive integer');
|
|
53
58
|
if (!Number.isFinite(depthCap) || !Number.isInteger(depthCap) || depthCap < 0) throw new TypeError('depthCap must be a finite nonnegative integer');
|
|
59
|
+
if (!Number.isFinite(plateauWindow) || !Number.isInteger(plateauWindow) || plateauWindow < 2) throw new TypeError('plateauWindow must be a finite integer of at least 2');
|
|
60
|
+
if (!Number.isFinite(plateauEpsilon) || plateauEpsilon < 0) throw new TypeError('plateauEpsilon must be a finite nonnegative number');
|
|
61
|
+
if (!Number.isFinite(terminationConfidence) || terminationConfidence < 0) throw new TypeError('terminationConfidence must be a finite nonnegative number');
|
|
54
62
|
CONFIGS.set(this, {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
63
|
+
beamWidth,
|
|
64
|
+
depthCap,
|
|
65
|
+
terminationConfidence,
|
|
66
|
+
plateauWindow,
|
|
67
|
+
plateauEpsilon
|
|
58
68
|
});
|
|
59
69
|
}
|
|
60
70
|
decide(ctx) {
|
|
61
71
|
const cfg = configOf(this);
|
|
62
|
-
if (!ctx.graph) return {
|
|
72
|
+
if (!ctx.evidence.graph) return {
|
|
63
73
|
action: 'continue'
|
|
64
74
|
};
|
|
65
75
|
if (isAtDepthCap(ctx, cfg.depthCap)) return {
|
|
66
76
|
action: 'terminate',
|
|
67
77
|
reason: 'depth cap'
|
|
68
78
|
};
|
|
69
|
-
const frontier = ctx.graph.leaves(ctx.sessionId);
|
|
70
|
-
const byKey = indexHistory(ctx.
|
|
79
|
+
const frontier = ctx.evidence.graph.leaves(ctx.sessionId);
|
|
80
|
+
const byKey = indexHistory(ctx.evidence.activeThoughts);
|
|
71
81
|
const scored = scoreFrontier(frontier, byKey);
|
|
72
82
|
if (scored.length > 0 && bestScore(scored) >= cfg.terminationConfidence) return {
|
|
73
83
|
action: 'terminate',
|
|
74
84
|
reason: 'confidence threshold'
|
|
75
85
|
};
|
|
76
|
-
const recent = recentScores(ctx.
|
|
86
|
+
const recent = recentScores(ctx.evidence.mainHistory, cfg.plateauWindow);
|
|
77
87
|
if (detectPlateau(recent, cfg.plateauWindow, cfg.plateauEpsilon)) return {
|
|
78
88
|
action: 'terminate',
|
|
79
89
|
reason: 'plateau'
|
|
@@ -95,20 +105,20 @@ class TreeOfThoughtStrategy {
|
|
|
95
105
|
}
|
|
96
106
|
shouldBranch(ctx) {
|
|
97
107
|
const cfg = configOf(this);
|
|
98
|
-
if (!ctx.graph) return false;
|
|
108
|
+
if (!ctx.evidence.graph) return false;
|
|
99
109
|
if (isAtDepthCap(ctx, cfg.depthCap)) return false;
|
|
100
|
-
const frontier = ctx.graph.leaves(ctx.sessionId);
|
|
110
|
+
const frontier = ctx.evidence.graph.leaves(ctx.sessionId);
|
|
101
111
|
return frontier.length > cfg.beamWidth;
|
|
102
112
|
}
|
|
103
113
|
shouldTerminate(ctx) {
|
|
104
114
|
const cfg = configOf(this);
|
|
105
|
-
if (!ctx.graph) return false;
|
|
115
|
+
if (!ctx.evidence.graph) return false;
|
|
106
116
|
if (isAtDepthCap(ctx, cfg.depthCap)) return true;
|
|
107
|
-
const frontier = ctx.graph.leaves(ctx.sessionId);
|
|
108
|
-
const byKey = indexHistory(ctx.
|
|
117
|
+
const frontier = ctx.evidence.graph.leaves(ctx.sessionId);
|
|
118
|
+
const byKey = indexHistory(ctx.evidence.activeThoughts);
|
|
109
119
|
const scored = scoreFrontier(frontier, byKey);
|
|
110
120
|
if (scored.length > 0 && bestScore(scored) >= cfg.terminationConfidence) return true;
|
|
111
|
-
const recent = recentScores(ctx.
|
|
121
|
+
const recent = recentScores(ctx.evidence.mainHistory, cfg.plateauWindow);
|
|
112
122
|
return detectPlateau(recent, cfg.plateauWindow, cfg.plateauEpsilon);
|
|
113
123
|
}
|
|
114
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core/reasoning/strategies/TreeOfThoughtStrategy.js","sources":["../../../../src/core/reasoning/strategies/TreeOfThoughtStrategy.ts"],"sourcesContent":["/**\n * Tree-of-Thought reasoning strategy — beam search over the thought DAG.\n *\n * Observes the frontier (graph leaves), scores each leaf via\n * {@link scoreThought}, and decides whether to continue, branch (when the\n * current thought falls outside the beam), or terminate (on depth cap,\n * confidence threshold, or score plateau).\n *\n * Pure policy: configuration lives in a module-level {@link WeakMap}, not\n * on the instance, so `Object.getOwnPropertyNames(strategy)` only ever\n * surfaces the readonly `name` discriminator. All other state is derived\n * from the {@link StrategyContext} on every call.\n *\n * @module core/reasoning/strategies/TreeOfThoughtStrategy\n */\n\nimport type {\n\tIReasoningStrategy,\n\tStrategyContext,\n\tStrategyDecision,\n} from '../../../contracts/strategy.js';\nimport { asThoughtId, type ThoughtId } from '../../../contracts/ids.js';\nimport type { ThoughtData } from '../../thought.js';\nimport { scoreThought, selectBeam, type ScoredCandidate } from './totScoring.js';\nimport { detectPlateau } from './plateau.js';\n\n/**\n * Configuration knobs for {@link TreeOfThoughtStrategy}. All fields are\n * optional; defaults are applied in the constructor.\n */\nexport interface TotConfig {\n\t/** Top-K candidates kept on the frontier (default `3`). */\n\treadonly beamWidth?: number;\n\t/** Maximum exploration depth before forcing termination (default `8`). */\n\treadonly depthCap?: number;\n\t/** Score at/above which the chain terminates (default `0.85`). */\n\treadonly terminationConfidence?: number;\n\t/** Window size for plateau detection (default `3`). */\n\treadonly plateauWindow?: number;\n\t/** Minimum meaningful score change for plateau detection (default `0.02`). */\n\treadonly plateauEpsilon?: number;\n}\n\n/** Defaults applied when a {@link TotConfig} field is omitted. */\nconst DEFAULTS: Required<TotConfig> = {\n\tbeamWidth: 3,\n\tdepthCap: 8,\n\tterminationConfidence: 0.85,\n\tplateauWindow: 3,\n\tplateauEpsilon: 0.02,\n};\n\n/**\n * Module-private config storage. Keyed by strategy instance so that no\n * own-properties leak onto `this` (preserving the purity contract).\n */\nconst CONFIGS: WeakMap<TreeOfThoughtStrategy, Required<TotConfig>> = new WeakMap();\n\n/** Resolve the per-instance config (constructor always populates the map). */\nfunction configOf(s: TreeOfThoughtStrategy): Required<TotConfig> {\n\treturn CONFIGS.get(s) ?? DEFAULTS;\n}\n\n/** Stable identifier for a thought: `id` if present, else its sequence number. */\nfunction thoughtKey(t: ThoughtData): ThoughtId {\n\treturn t.id ?? asThoughtId(String(t.thought_number));\n}\n\n/** Index history by stable key for O(1) leaf-id → ThoughtData lookup. */\nfunction indexHistory(history: readonly ThoughtData[]): Map<string, ThoughtData> {\n\tconst out = new Map<string, ThoughtData>();\n\tfor (const t of history) out.set(thoughtKey(t), t);\n\treturn out;\n}\n\n/** Score the frontier (graph leaves), skipping ids absent from history. */\nfunction scoreFrontier(\n\tfrontier: readonly string[],\n\tbyKey: Map<string, ThoughtData>\n): ScoredCandidate[] {\n\tconst out: ScoredCandidate[] = [];\n\tfor (const id of frontier) {\n\t\tconst t = byKey.get(id);\n\t\tif (t !== undefined) out.push({ id, score: scoreThought(t) });\n\t}\n\treturn out;\n}\n\n/** Highest score in a candidate set, or `-Infinity` when empty. */\nfunction bestScore(scored: readonly ScoredCandidate[]): number {\n\tlet best = Number.NEGATIVE_INFINITY;\n\tfor (const c of scored) {\n\t\tif (c.score > best) best = c.score;\n\t}\n\treturn best;\n}\n\n/** Recent per-thought scores, used for plateau detection. */\nfunction recentScores(history: readonly ThoughtData[], window: number): number[] {\n\tconst start = history.length > window ? history.length - window : 0;\n\tconst out: number[] = [];\n\tfor (let i = start; i < history.length; i++) out.push(scoreThought(history[i]!));\n\treturn out;\n}\n\n/** Whether the current graph-visible thought has reached the configured depth cap. */\nfunction isAtDepthCap(ctx: StrategyContext, depthCap: number): boolean {\n\tconst depth = ctx.graph?.depthFromRoots(ctx.sessionId, thoughtKey(ctx.currentThought));\n\treturn depth !== undefined && depth >= depthCap;\n}\n\n/**\n * Tree-of-Thought strategy: beam search over the thought DAG. Pure policy.\n *\n * @example\n * ```typescript\n * const strategy = new TreeOfThoughtStrategy({ beamWidth: 4 });\n * const decision = strategy.decide(ctx);\n * ```\n */\nexport class TreeOfThoughtStrategy implements IReasoningStrategy {\n\treadonly name = 'tot' as const;\n\n\t/** @param config - See {@link TotConfig}. */\n\tconstructor(config?: TotConfig) {\n\t\tconst depthCap = config?.depthCap ?? DEFAULTS.depthCap;\n\t\tif (!Number.isFinite(depthCap) || !Number.isInteger(depthCap) || depthCap < 0) {\n\t\t\tthrow new TypeError('depthCap must be a finite nonnegative integer');\n\t\t}\n\t\tCONFIGS.set(this, { ...DEFAULTS, ...config, depthCap });\n\t}\n\n\t/**\n\t * Compute the next action for the chain.\n\t *\n\t * Order of checks: depth cap → confidence → plateau → branch when the\n\t * current thought is outside the beam → continue. Missing graphs continue.\n\t */\n\tdecide(ctx: StrategyContext): StrategyDecision {\n\t\tconst cfg = configOf(this);\n\t\tif (!ctx.graph) {\n\t\t\treturn { action: 'continue' };\n\t\t}\n\t\tif (isAtDepthCap(ctx, cfg.depthCap)) {\n\t\t\treturn { action: 'terminate', reason: 'depth cap' };\n\t\t}\n\t\tconst frontier = ctx.graph.leaves(ctx.sessionId);\n\t\tconst byKey = indexHistory(ctx.history);\n\t\tconst scored = scoreFrontier(frontier, byKey);\n\t\tif (scored.length > 0 && bestScore(scored) >= cfg.terminationConfidence) {\n\t\t\treturn { action: 'terminate', reason: 'confidence threshold' };\n\t\t}\n\n\t\tconst recent = recentScores(ctx.history, cfg.plateauWindow);\n\t\tif (detectPlateau(recent, cfg.plateauWindow, cfg.plateauEpsilon)) {\n\t\t\treturn { action: 'terminate', reason: 'plateau' };\n\t\t}\n\n\t\tif (scored.length > cfg.beamWidth) {\n\t\t\tconst beam = selectBeam(scored, cfg.beamWidth);\n\t\t\tconst currentKey = thoughtKey(ctx.currentThought);\n\t\t\tif (!beam.includes(currentKey)) {\n\t\t\t\treturn {\n\t\t\t\t\taction: 'branch',\n\t\t\t\t\tbranchId: `tot-${ctx.currentThought.thought_number}`,\n\t\t\t\t\tfromThought: ctx.currentThought.thought_number,\n\t\t\t\t\treason: 'outside beam',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn { action: 'continue', nextHint: 'explore frontier' };\n\t}\n\n\t/** True below the depth cap when the frontier is wider than the beam. */\n\tshouldBranch(ctx: StrategyContext): boolean {\n\t\tconst cfg = configOf(this);\n\t\tif (!ctx.graph) return false;\n\t\tif (isAtDepthCap(ctx, cfg.depthCap)) return false;\n\t\tconst frontier = ctx.graph.leaves(ctx.sessionId);\n\t\treturn frontier.length > cfg.beamWidth;\n\t}\n\n\t/** True at the depth cap, confidence threshold, or score plateau. */\n\tshouldTerminate(ctx: StrategyContext): boolean {\n\t\tconst cfg = configOf(this);\n\t\tif (!ctx.graph) return false;\n\t\tif (isAtDepthCap(ctx, cfg.depthCap)) return true;\n\t\tconst frontier = ctx.graph.leaves(ctx.sessionId);\n\t\tconst byKey = indexHistory(ctx.history);\n\t\tconst scored = scoreFrontier(frontier, byKey);\n\t\tif (scored.length > 0 && bestScore(scored) >= cfg.terminationConfidence) {\n\t\t\treturn true;\n\t\t}\n\t\tconst recent = recentScores(ctx.history, cfg.plateauWindow);\n\t\treturn detectPlateau(recent, cfg.plateauWindow, cfg.plateauEpsilon);\n\t}\n}\n"],"names":["DEFAULTS","CONFIGS","WeakMap","configOf","s","thoughtKey","t","asThoughtId","String","indexHistory","history","out","Map","scoreFrontier","frontier","byKey","id","undefined","scoreThought","bestScore","scored","best","Number","c","recentScores","window","start","i","isAtDepthCap","ctx","depthCap","depth","TreeOfThoughtStrategy","config","TypeError","cfg","recent","detectPlateau","beam","selectBeam","currentKey"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"core/reasoning/strategies/TreeOfThoughtStrategy.js","sources":["../../../../src/core/reasoning/strategies/TreeOfThoughtStrategy.ts"],"sourcesContent":["/**\n * Tree-of-Thought reasoning strategy — beam search over the thought DAG.\n *\n * Observes the frontier (graph leaves), scores each leaf via\n * {@link scoreThought}, and decides whether to continue, branch (when the\n * current thought falls outside the beam), or terminate (on depth cap,\n * confidence threshold, or score plateau). It reads only the immutable active evidence projection;\n * the audit history and graph remain unchanged.\n *\n * Pure policy: configuration lives in a module-level {@link WeakMap}, not\n * on the instance, so `Object.getOwnPropertyNames(strategy)` only ever\n * surfaces the readonly `name` discriminator. All other state is derived\n * from the {@link StrategyContext} on every call.\n *\n * @module core/reasoning/strategies/TreeOfThoughtStrategy\n */\n\nimport type {\n\tIReasoningStrategy,\n\tStrategyContext,\n\tStrategyDecision,\n} from '../../../contracts/strategy.js';\nimport { asThoughtId, type ThoughtId } from '../../../contracts/ids.js';\nimport type { ThoughtData } from '../../thought.js';\nimport { scoreThought, selectBeam, type ScoredCandidate } from './totScoring.js';\nimport { detectPlateau } from './plateau.js';\n\n/**\n * Configuration knobs for {@link TreeOfThoughtStrategy}. All fields are\n * optional; defaults are applied in the constructor.\n */\nexport interface TotConfig {\n\t/** Top-K candidates kept on the frontier (default `3`). */\n\treadonly beamWidth?: number;\n\t/** Maximum exploration depth before forcing termination (default `8`). */\n\treadonly depthCap?: number;\n\t/** Finite nonnegative score at/above which the chain terminates (default `0.85`; values >1 valid). */\n\treadonly terminationConfidence?: number;\n\t/** Window size for plateau detection (default `3`). */\n\treadonly plateauWindow?: number;\n\t/** Minimum meaningful score change for plateau detection (default `0.02`). */\n\treadonly plateauEpsilon?: number;\n}\n\n/** Defaults applied when a {@link TotConfig} field is omitted. */\nconst DEFAULTS: Required<TotConfig> = {\n\tbeamWidth: 3,\n\tdepthCap: 8,\n\tterminationConfidence: 0.85,\n\tplateauWindow: 3,\n\tplateauEpsilon: 0.02,\n};\n\n/**\n * Module-private config storage. Keyed by strategy instance so that no\n * own-properties leak onto `this` (preserving the purity contract).\n */\nconst CONFIGS: WeakMap<TreeOfThoughtStrategy, Required<TotConfig>> = new WeakMap();\n\n/** Resolve the per-instance config (constructor always populates the map). */\nfunction configOf(s: TreeOfThoughtStrategy): Required<TotConfig> {\n\treturn CONFIGS.get(s) ?? DEFAULTS;\n}\n\n/** Stable identifier for a thought: `id` if present, else its sequence number. */\nfunction thoughtKey(t: ThoughtData): ThoughtId {\n\treturn t.id ?? asThoughtId(String(t.thought_number));\n}\n\n/** Index history by stable key for O(1) leaf-id → ThoughtData lookup. */\nfunction indexHistory(history: readonly ThoughtData[]): Map<string, ThoughtData> {\n\tconst out = new Map<string, ThoughtData>();\n\tfor (const t of history) out.set(thoughtKey(t), t);\n\treturn out;\n}\n\n/** Score the frontier (graph leaves), skipping ids absent from history. */\nfunction scoreFrontier(\n\tfrontier: readonly string[],\n\tbyKey: Map<string, ThoughtData>\n): ScoredCandidate[] {\n\tconst out: ScoredCandidate[] = [];\n\tfor (const id of frontier) {\n\t\tconst t = byKey.get(id);\n\t\tif (t !== undefined) out.push({ id, score: scoreThought(t) });\n\t}\n\treturn out;\n}\n\n/** Highest score in a candidate set, or `-Infinity` when empty. */\nfunction bestScore(scored: readonly ScoredCandidate[]): number {\n\tlet best = Number.NEGATIVE_INFINITY;\n\tfor (const c of scored) {\n\t\tif (c.score > best) best = c.score;\n\t}\n\treturn best;\n}\n\n/** Recent per-thought scores, used for plateau detection. */\nfunction recentScores(history: readonly ThoughtData[], window: number): number[] {\n\tconst start = history.length > window ? history.length - window : 0;\n\tconst out: number[] = [];\n\tfor (let i = start; i < history.length; i++) out.push(scoreThought(history[i]!));\n\treturn out;\n}\n\n/** Whether the current graph-visible thought has reached the configured depth cap. */\nfunction isAtDepthCap(ctx: StrategyContext, depthCap: number): boolean {\n\tconst depth = ctx.evidence.graph?.depthFromRoots(ctx.sessionId, thoughtKey(ctx.currentThought));\n\treturn depth !== undefined && depth >= depthCap;\n}\n\n/**\n * Tree-of-Thought strategy: beam search over the thought DAG. Pure policy.\n *\n * @example\n * ```typescript\n * const strategy = new TreeOfThoughtStrategy({ beamWidth: 4 });\n * const decision = strategy.decide(ctx);\n * ```\n */\nexport class TreeOfThoughtStrategy implements IReasoningStrategy {\n\treadonly name = 'tot' as const;\n\n\t/** @param config - See {@link TotConfig}. */\n\tconstructor(config?: TotConfig) {\n\t\tconst beamWidth = config?.beamWidth ?? DEFAULTS.beamWidth;\n\t\tconst depthCap = config?.depthCap ?? DEFAULTS.depthCap;\n\t\tconst terminationConfidence = config?.terminationConfidence ?? DEFAULTS.terminationConfidence;\n\t\tconst plateauWindow = config?.plateauWindow ?? DEFAULTS.plateauWindow;\n\t\tconst plateauEpsilon = config?.plateauEpsilon ?? DEFAULTS.plateauEpsilon;\n\t\tif (!Number.isFinite(beamWidth) || !Number.isInteger(beamWidth) || beamWidth < 1) {\n\t\t\tthrow new TypeError('beamWidth must be a finite positive integer');\n\t\t}\n\t\tif (!Number.isFinite(depthCap) || !Number.isInteger(depthCap) || depthCap < 0) {\n\t\t\tthrow new TypeError('depthCap must be a finite nonnegative integer');\n\t\t}\n\t\tif (!Number.isFinite(plateauWindow) || !Number.isInteger(plateauWindow) || plateauWindow < 2) {\n\t\t\tthrow new TypeError('plateauWindow must be a finite integer of at least 2');\n\t\t}\n\t\tif (!Number.isFinite(plateauEpsilon) || plateauEpsilon < 0) {\n\t\t\tthrow new TypeError('plateauEpsilon must be a finite nonnegative number');\n\t\t}\n\t\tif (!Number.isFinite(terminationConfidence) || terminationConfidence < 0) {\n\t\t\tthrow new TypeError('terminationConfidence must be a finite nonnegative number');\n\t\t}\n\t\tCONFIGS.set(this, {\n\t\t\tbeamWidth,\n\t\t\tdepthCap,\n\t\t\tterminationConfidence,\n\t\t\tplateauWindow,\n\t\t\tplateauEpsilon,\n\t\t});\n\t}\n\n\t/**\n\t * Compute the next action for the chain.\n\t *\n\t * Order of checks: depth cap, frontier confidence, plateau over retained main-history scores,\n\t * branch when the current thought is outside the beam, then continue. Missing graphs continue.\n\t */\n\tdecide(ctx: StrategyContext): StrategyDecision {\n\t\tconst cfg = configOf(this);\n\t\tif (!ctx.evidence.graph) {\n\t\t\treturn { action: 'continue' };\n\t\t}\n\t\tif (isAtDepthCap(ctx, cfg.depthCap)) {\n\t\t\treturn { action: 'terminate', reason: 'depth cap' };\n\t\t}\n\t\tconst frontier = ctx.evidence.graph.leaves(ctx.sessionId);\n\t\tconst byKey = indexHistory(ctx.evidence.activeThoughts);\n\t\tconst scored = scoreFrontier(frontier, byKey);\n\t\tif (scored.length > 0 && bestScore(scored) >= cfg.terminationConfidence) {\n\t\t\treturn { action: 'terminate', reason: 'confidence threshold' };\n\t\t}\n\n\t\tconst recent = recentScores(ctx.evidence.mainHistory, cfg.plateauWindow);\n\t\tif (detectPlateau(recent, cfg.plateauWindow, cfg.plateauEpsilon)) {\n\t\t\treturn { action: 'terminate', reason: 'plateau' };\n\t\t}\n\n\t\tif (scored.length > cfg.beamWidth) {\n\t\t\tconst beam = selectBeam(scored, cfg.beamWidth);\n\t\t\tconst currentKey = thoughtKey(ctx.currentThought);\n\t\t\tif (!beam.includes(currentKey)) {\n\t\t\t\treturn {\n\t\t\t\t\taction: 'branch',\n\t\t\t\t\tbranchId: `tot-${ctx.currentThought.thought_number}`,\n\t\t\t\t\tfromThought: ctx.currentThought.thought_number,\n\t\t\t\t\treason: 'outside beam',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn { action: 'continue', nextHint: 'explore frontier' };\n\t}\n\n\t/** True below the depth cap when the frontier is wider than the beam. */\n\tshouldBranch(ctx: StrategyContext): boolean {\n\t\tconst cfg = configOf(this);\n\t\tif (!ctx.evidence.graph) return false;\n\t\tif (isAtDepthCap(ctx, cfg.depthCap)) return false;\n\t\tconst frontier = ctx.evidence.graph.leaves(ctx.sessionId);\n\t\treturn frontier.length > cfg.beamWidth;\n\t}\n\n\t/** True at the depth cap, confidence threshold, or score plateau. */\n\tshouldTerminate(ctx: StrategyContext): boolean {\n\t\tconst cfg = configOf(this);\n\t\tif (!ctx.evidence.graph) return false;\n\t\tif (isAtDepthCap(ctx, cfg.depthCap)) return true;\n\t\tconst frontier = ctx.evidence.graph.leaves(ctx.sessionId);\n\t\tconst byKey = indexHistory(ctx.evidence.activeThoughts);\n\t\tconst scored = scoreFrontier(frontier, byKey);\n\t\tif (scored.length > 0 && bestScore(scored) >= cfg.terminationConfidence) {\n\t\t\treturn true;\n\t\t}\n\t\tconst recent = recentScores(ctx.evidence.mainHistory, cfg.plateauWindow);\n\t\treturn detectPlateau(recent, cfg.plateauWindow, cfg.plateauEpsilon);\n\t}\n}\n"],"names":["DEFAULTS","CONFIGS","WeakMap","configOf","s","thoughtKey","t","asThoughtId","String","indexHistory","history","out","Map","scoreFrontier","frontier","byKey","id","undefined","scoreThought","bestScore","scored","best","Number","c","recentScores","window","start","i","isAtDepthCap","ctx","depthCap","depth","TreeOfThoughtStrategy","config","beamWidth","terminationConfidence","plateauWindow","plateauEpsilon","TypeError","cfg","recent","detectPlateau","beam","selectBeam","currentKey"],"mappings":"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"}
|
package/dist/lib.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,KAAK,CAAC,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAMzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,
|
|
1
|
+
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"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"}
|
package/dist/lib.js
CHANGED
|
@@ -5,7 +5,7 @@ import { getErrorMessage } from "./errors.js";
|
|
|
5
5
|
import { assertNever } from "./utils.js";
|
|
6
6
|
import { DiscoveryCache } from "./cache/DiscoveryCache.js";
|
|
7
7
|
import { ConfigLoader } from "./config/ConfigLoader.js";
|
|
8
|
-
import { HistoryManager } from "./core/HistoryManager.js";
|
|
8
|
+
import { ABSOLUTE_MAX_HISTORY_SIZE, HistoryManager } from "./core/HistoryManager.js";
|
|
9
9
|
import { EdgeStore } from "./core/graph/EdgeStore.js";
|
|
10
10
|
import { InMemorySummaryStore } from "./core/compression/InMemorySummaryStore.js";
|
|
11
11
|
import { CompressionService } from "./core/compression/CompressionService.js";
|
|
@@ -224,6 +224,8 @@ class ToolAwareSequentialThinkingServer extends EventEmitter {
|
|
|
224
224
|
persistenceBufferSize: cfg.persistenceBufferSize,
|
|
225
225
|
persistenceFlushInterval: cfg.persistenceFlushInterval,
|
|
226
226
|
persistenceMaxRetries: cfg.persistenceMaxRetries,
|
|
227
|
+
persistenceHistorySize: cfg.persistence.options?.maxHistorySize ?? ABSOLUTE_MAX_HISTORY_SIZE,
|
|
228
|
+
persistBranches: cfg.persistence.options?.persistBranches ?? true,
|
|
227
229
|
edgeStore,
|
|
228
230
|
summaryStore,
|
|
229
231
|
dagEdges: cfg.features.dagEdges,
|
package/dist/lib.js.map
CHANGED
|
@@ -1 +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 type * as v from 'valibot';\nimport type { ThoughtData } from './core/thought.js';\nimport { asSessionId, type BranchId } from './contracts/ids.js';\nimport type { SequentialThinkingSchema } from './schema.js';\nimport { SEQUENTIAL_THINKING_TOOL } from './schema.js';\nimport type { IDisposable } from './types/disposable.js';\nimport { getErrorMessage } from './errors.js';\nimport { assertNever } from './utils.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 { EdgeStore } from './core/graph/EdgeStore.js';\nimport { InMemorySummaryStore } from './core/compression/InMemorySummaryStore.js';\nimport { CompressionService } from './core/compression/CompressionService.js';\nimport { InMemorySuspensionStore } from './core/tools/InMemorySuspensionStore.js';\nimport { ThoughtEvaluator } from './core/ThoughtEvaluator.js';\nimport { Calibrator } from './core/evaluator/Calibrator.js';\nimport { OutcomeRecorder } from './core/reasoning/OutcomeRecorder.js';\nimport { createReasoningStrategy } from './core/reasoning/strategies/StrategyFactory.js';\nimport { ThoughtFormatter } from './core/ThoughtFormatter.js';\nimport { ThoughtProcessor, type CallToolResult } from './core/ThoughtProcessor.js';\nimport { SessionLock } from './core/SessionLock.js';\nimport { SessionLifecycleClosedError } from './core/SessionErrors.js';\nimport { SessionLifecycleCoordinator } from './core/SessionLifecycleCoordinator.js';\nimport { Container } from './di/Container.js';\nimport { StructuredLogger } from './logger/StructuredLogger.js';\nimport { Metrics } from './metrics/metrics.impl.js';\nimport type { PersistenceBackend } from './contracts/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 { SkillWatcher } from './watchers/SkillWatcher.js';\nimport { ToolWatcher } from './watchers/ToolWatcher.js';\nimport { HttpTransport, createHttpTransport } from './transport/HttpTransport.js';\nimport type { HttpTransportOptions } from './transport/HttpTransport.js';\nimport type { TransportOptions } from './transport/BaseTransport.js';\nimport type { ITransport, TransportKind } from './contracts/transport.js';\n\nexport { HttpTransport, createHttpTransport };\nexport type { HttpTransportOptions, TransportOptions, ITransport, TransportKind };\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 tool and skill discovery on server startup.\n\t * @default true\n\t */\n\tautoDiscover?: boolean;\n\t/**\n\t * Suppress startup discovery so callers can discover through registry APIs explicitly.\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}\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\ntype CleanupOperation = () => void | Promise<void>;\n\nfunction appendCleanupFailure(failures: unknown[], failure: unknown): void {\n\tif (failure instanceof AggregateError) {\n\t\tfailures.push(...failure.errors);\n\t\treturn;\n\t}\n\tfailures.push(failure);\n}\n\nasync function collectCleanupFailures(operations: readonly CleanupOperation[]): Promise<unknown[]> {\n\tconst failures: unknown[] = [];\n\tfor (const operation of operations) {\n\t\ttry {\n\t\t\tawait operation();\n\t\t} catch (error) {\n\t\t\tappendCleanupFailure(failures, error);\n\t\t}\n\t}\n\treturn failures;\n}\n\n/**\n * Public API contract for the tool-aware sequential thinking server.\n *\n * Extends {@link IDisposable} for resource cleanup. Concrete implementations\n * are expected to also extend Node's `EventEmitter` to support the typed\n * `emit`/`on` overloads.\n */\nexport interface IToolAwareSequentialThinkingServer extends IDisposable {\n\t/** Direct access to the history manager. */\n\treadonly history: HistoryManager;\n\n\t/** Direct access to the tool registry. */\n\treadonly tools: ToolRegistry;\n\n\t/** Direct access to the skill registry. */\n\treadonly skills: SkillRegistry;\n\n\t/** Server configuration. */\n\treadonly config: ServerConfig;\n\n\t/**\n\t * Discover skills asynchronously without blocking server startup.\n\t *\n\t * @returns The number of skills discovered\n\t */\n\tdiscoverSkillsAsync(): Promise<number>;\n\n\t/** Rescan configured tool and skill directories. */\n\trefreshDiscovery(): Promise<{ tools: number; skills: number }>;\n\n\t/**\n\t * Get all branches for one explicit thought session.\n\t *\n\t * @param sessionId - Valid thought-session identifier\n\t * @returns Map of branch IDs to thought arrays\n\t */\n\tgetBranches(sessionId: string): Record<string, ThoughtData[]>;\n\n\t/**\n\t * Process a thought through the configured pipeline.\n\t *\n\t * @param input - Validated thought input matching the schema\n\t * @returns The processing result\n\t */\n\tprocessThought(input: v.InferInput<typeof SequentialThinkingSchema>): Promise<CallToolResult>;\n\n\t/**\n\t * Export the current Prometheus metrics snapshot.\n\t */\n\tgetMetricsSnapshot(): string;\n\n\t/**\n\t * Get the DI container used by this server.\n\t * Useful for testing and advanced customizations.\n\t */\n\tgetContainer(): Container;\n\n\t/**\n\t * Stop the server and clean up watchers, suspension stores, and persistence.\n\t */\n\tstop(): Promise<void>;\n\n\t/** Awaitably reset one session and all matching auxiliary state. */\n\tresetSession(sessionId: string): Promise<void>;\n\n\t/** Awaitably reset all state from a trusted ownerless context. */\n\tresetAll(): Promise<void>;\n\n\t/**\n\t * Dispose of the server and all container services.\n\t */\n\tdispose(): Promise<void>;\n}\n\nexport class ToolAwareSequentialThinkingServer\n\textends EventEmitter\n\timplements IToolAwareSequentialThinkingServer\n{\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\tconst container = await ToolAwareSequentialThinkingServer._createContainerAsyncStatic(options);\n\t\tlet server: ToolAwareSequentialThinkingServer | undefined;\n\t\ttry {\n\t\t\tserver = new ToolAwareSequentialThinkingServer({\n\t\t\t\t...options,\n\t\t\t\tcontainer,\n\t\t\t});\n\t\t\tawait Promise.all([\n\t\t\t\tserver._skillWatcher?.ready() ?? Promise.resolve(),\n\t\t\t\tserver._toolWatcher?.ready() ?? Promise.resolve(),\n\t\t\t]);\n\n\t\t\tif (options.loadFromPersistence !== false) {\n\t\t\t\tawait server.history.loadFromPersistence();\n\t\t\t}\n\n\t\t\tif (options.autoDiscover !== false && options.lazyDiscovery !== true) {\n\t\t\t\tawait Promise.all([server.tools.discoverAsync(), server.discoverSkillsAsync()]);\n\t\t\t}\n\n\t\t\treturn server;\n\t\t} catch (error) {\n\t\t\tconst startedServer = server;\n\t\t\tconst cleanupFailures = await collectCleanupFailures(\n\t\t\t\tstartedServer\n\t\t\t\t\t? [() => startedServer.dispose()]\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\tif (container.has('suspensionStore')) {\n\t\t\t\t\t\t\t\t\tcontainer.resolve('suspensionStore').stop();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t() => container.resolve('Persistence')?.close(),\n\t\t\t\t\t\t\t() => container.dispose(),\n\t\t\t\t\t\t]\n\t\t\t);\n\t\t\tif (cleanupFailures.length > 0) {\n\t\t\t\tthrow new AggregateError(\n\t\t\t\t\t[error, ...cleanupFailures],\n\t\t\t\t\t'Server startup failed and cleanup also failed',\n\t\t\t\t\t{ cause: error }\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\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\tprivate _acceptingDiscoveryRefreshes = true;\n\tprivate _refreshPromise: Promise<{ tools: number; skills: number }> | null = null;\n\tprivate _stopPromise: Promise<void> | null = null;\n\tprivate _disposePromise: Promise<void> | null = null;\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('analysis-session');\n\t * await server.resetAll();\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.add(tool);\n\t * server.tools.get('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.add(skill);\n\t * server.skills.get('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\tif (!options.container) {\n\t\t\tthrow new Error('Container is required. Use createServer() or provide a container.');\n\t\t}\n\t\tthis._container = options.container;\n\n\t\t// Resolve dependencies from container\n\t\tthis._logger = this._container.resolve('Logger');\n\t\tthis._historyManager = this._container.resolve('HistoryManager');\n\t\tthis._historyManager.bindShutdownOwner(() => this.stop());\n\t\tthis._thoughtProcessor = this._container.resolve('ThoughtProcessor');\n\t\tthis._metrics = this._container.resolve('Metrics');\n\t\tthis._config = this._container.resolve('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');\n\t\tthis.skills = this._container.resolve('SkillRegistry');\n\t\tthis.config = this._config;\n\n\t\t// Always include the sequential thinking tool\n\t\tthis.tools.add(SEQUENTIAL_THINKING_TOOL);\n\n\t\t// Initialize watchers if enabled\n\t\tif (options.enableWatcher) {\n\t\t\tthis._skillWatcher = new SkillWatcher(this.skills, this._logger, this.config.skillDirs);\n\t\t\tthis._toolWatcher = new ToolWatcher(this.tools, this._logger, this.config.toolDirs);\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\tconst config = ToolAwareSequentialThinkingServer._resolveEffectiveConfig(options, fileConfig);\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\tToolAwareSequentialThinkingServer._registerDiscoveryRegistries(\n\t\t\tcontainer,\n\t\t\toptions.lazyDiscovery\n\t\t);\n\n\t\t// Register EdgeStore as a lazy singleton (always registered; flag gates writes)\n\t\tcontainer.register('EdgeStore', () => new EdgeStore());\n\n\t\t// Register SummaryStore as a lazy singleton (always registered; flag gates writes)\n\t\tcontainer.register('summaryStore', () => new InMemorySummaryStore());\n\n\t\t// Register SuspensionStore as a lazy singleton (only when toolInterleave flag is on)\n\t\tif (config.features.toolInterleave) {\n\t\t\tcontainer.register('suspensionStore', () => {\n\t\t\t\tconst store = new InMemorySuspensionStore({\n\t\t\t\t\tttlMs: config.toolInterleaveTtlMs,\n\t\t\t\t\tsweepIntervalMs: config.toolInterleaveSweepMs,\n\t\t\t\t\tlogger,\n\t\t\t\t});\n\t\t\t\tstore.start();\n\t\t\t\treturn store;\n\t\t\t});\n\t\t}\n\n\t\t// Register CompressionService as a lazy singleton (always registered; flag gates invocation)\n\t\tcontainer.register('compressionService', () => {\n\t\t\tconst historyManager = container.resolve('HistoryManager');\n\t\t\tconst edgeStore = container.resolve('EdgeStore');\n\t\t\tconst summaryStore = container.resolve('summaryStore');\n\t\t\tconst log = container.resolve('Logger');\n\t\t\treturn new CompressionService({\n\t\t\t\thistoryManager,\n\t\t\t\tedgeStore,\n\t\t\t\tsummaryStore,\n\t\t\t\tonSummaryCreated: (summary) => {\n\t\t\t\t\thistoryManager.bufferSummaries(\n\t\t\t\t\t\tsummary.sessionId,\n\t\t\t\t\t\tsummaryStore.forSession(summary.sessionId)\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tlogger: log,\n\t\t\t});\n\t\t});\n\n\t\t// Register ReasoningStrategy as a lazy singleton (selected via feature flag)\n\t\tcontainer.register('reasoningStrategy', () =>\n\t\t\tcreateReasoningStrategy(config.features.reasoningStrategy)\n\t\t);\n\n\t\t// Register SessionLock as a lazy singleton (always registered;\n\t\t// serializes ThoughtProcessor.process() per-session).\n\t\tcontainer.register('sessionLock', () => new SessionLock());\n\t\tcontainer.register('sessionLifecycle', () => new SessionLifecycleCoordinator());\n\n\t\tToolAwareSequentialThinkingServer._registerHistoryManager(container);\n\t\tToolAwareSequentialThinkingServer._registerThoughtPipeline(container, config);\n\n\t\treturn container;\n\t}\n\n\tprivate static _resolveEffectiveConfig(\n\t\toptions: ServerOptions,\n\t\tfileConfig: ConfigFileOptions | null\n\t): ServerConfig {\n\t\tif (options.config) return options.config;\n\t\tconst loadedOptions = new ConfigLoader().toServerConfigOptions(fileConfig ?? {});\n\t\treturn new ServerConfig({\n\t\t\t...loadedOptions,\n\t\t\tmaxHistorySize: options.maxHistorySize ?? loadedOptions.maxHistorySize,\n\t\t\tmaxBranches: options.maxBranches ?? loadedOptions.maxBranches,\n\t\t\tmaxBranchSize: options.maxBranchSize ?? loadedOptions.maxBranchSize,\n\t\t});\n\t}\n\n\tprivate static _registerDiscoveryRegistries(\n\t\tcontainer: Container,\n\t\tlazyDiscovery: ServerOptions['lazyDiscovery']\n\t): void {\n\t\tconst logger = container.resolve('Logger');\n\t\tconst config = container.resolve('Config');\n\t\tconst metrics = container.resolve('Metrics');\n\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\ttoolDirs: config.toolDirs,\n\t\t\t\t\tlazyDiscovery,\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,\n\t\t\t\t})\n\t\t);\n\t}\n\n\tprivate static _registerHistoryManager(container: Container): void {\n\t\t// Register HistoryManager with lazy initialization\n\t\tcontainer.register('HistoryManager', () => {\n\t\t\tconst cfg = container.resolve('Config');\n\t\t\tconst log = container.resolve('Logger');\n\t\t\tconst pers = container.resolve('Persistence');\n\t\t\tconst componentMetrics = container.resolve('Metrics');\n\t\t\tconst edgeStore = container.resolve('EdgeStore');\n\t\t\tconst summaryStore = container.resolve('summaryStore');\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\tedgeStore,\n\t\t\t\tsummaryStore,\n\t\t\t\tdagEdges: cfg.features.dagEdges,\n\t\t\t\tmaxSessionsPerOwner: cfg.maxSessionsPerOwner,\n\t\t\t\tsessionLock: container.resolve('sessionLock'),\n\t\t\t\tlifecycleCoordinator: container.resolve('sessionLifecycle'),\n\t\t\t\tclearSessionAuxiliaryState: (sessionId) =>\n\t\t\t\t\tcontainer.resolve('ThoughtProcessor').clearSessionAuxiliaryState(sessionId),\n\t\t\t\tclearAllAuxiliaryState: () =>\n\t\t\t\t\tcontainer.resolve('ThoughtProcessor').clearAllAuxiliaryState(),\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate static _registerThoughtPipeline(container: Container, config: ServerConfig): void {\n\t\t// Register ThoughtFormatter (can be transient)\n\t\tcontainer.registerFactory('ThoughtFormatter', () => new ThoughtFormatter());\n\n\t\t// Register OutcomeRecorder as a lazy singleton (gated by feature flag)\n\t\tcontainer.register(\n\t\t\t'outcomeRecorder',\n\t\t\t() => new OutcomeRecorder({ enabled: config.features.outcomeRecording ?? false })\n\t\t);\n\n\t\t// Register Calibrator as a lazy singleton (gated by feature flag)\n\t\tcontainer.register(\n\t\t\t'calibrator',\n\t\t\t() =>\n\t\t\t\tnew Calibrator(container.resolve('outcomeRecorder'), config.features.calibration ?? false)\n\t\t);\n\n\t\t// Register ThoughtEvaluator (stateless, transient) with injected calibrator\n\t\tcontainer.registerFactory(\n\t\t\t'ThoughtEvaluator',\n\t\t\t() => new ThoughtEvaluator(container.resolve('calibrator'))\n\t\t);\n\n\t\t// Register ThoughtProcessor\n\t\tcontainer.register('ThoughtProcessor', () => {\n\t\t\tconst history = container.resolve('HistoryManager');\n\t\t\tconst formatter = container.resolve('ThoughtFormatter');\n\t\t\tconst evaluator = container.resolve('ThoughtEvaluator');\n\t\t\tconst log = container.resolve('Logger');\n\t\t\tconst strategy = container.resolve('reasoningStrategy');\n\t\t\tconst compressionService = config.features.compression\n\t\t\t\t? container.resolve('compressionService')\n\t\t\t\t: undefined;\n\t\t\tconst suspensionStore = config.features.toolInterleave\n\t\t\t\t? container.resolve('suspensionStore')\n\t\t\t\t: undefined;\n\t\t\tconst toolRegistry = container.resolve('ToolRegistry');\n\t\t\tconst sessionLock = container.resolve('sessionLock');\n\t\t\treturn new ThoughtProcessor(\n\t\t\t\thistory,\n\t\t\t\tformatter,\n\t\t\t\tevaluator,\n\t\t\t\tlog,\n\t\t\t\tstrategy,\n\t\t\t\tcompressionService,\n\t\t\t\tsuspensionStore,\n\t\t\t\ttoolRegistry,\n\t\t\t\tconfig.features,\n\t\t\t\tsessionLock,\n\t\t\t\tcontainer.resolve('outcomeRecorder'),\n\t\t\t\tcontainer.resolve('sessionLifecycle'),\n\t\t\t\tcontainer.resolve('calibrator')\n\t\t\t);\n\t\t});\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\tlet fileConfig: ConfigFileOptions | null;\n\t\tlet config: ServerConfig;\n\t\tif (options.config) {\n\t\t\tfileConfig = options.fileConfig ?? null;\n\t\t\tconfig = options.config;\n\t\t} else {\n\t\t\tconst configLoader = new ConfigLoader();\n\t\t\tfileConfig =\n\t\t\t\toptions.fileConfig === undefined\n\t\t\t\t\t? configLoader.load()\n\t\t\t\t\t: configLoader.applyEnvironmentOverrides(options.fileConfig);\n\t\t\tconfig = ToolAwareSequentialThinkingServer._resolveEffectiveConfig(options, fileConfig);\n\t\t}\n\n\t\tlet persistence: PersistenceBackend | null = null;\n\t\ttry {\n\t\t\tpersistence = await createPersistenceBackend(config.persistence);\n\t\t\treturn ToolAwareSequentialThinkingServer._createContainerCore(\n\t\t\t\t{ ...options, config },\n\t\t\t\tfileConfig,\n\t\t\t\tpersistence\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconst acquiredPersistence = persistence;\n\t\t\tconst cleanupFailures =\n\t\t\t\tacquiredPersistence === null\n\t\t\t\t\t? []\n\t\t\t\t\t: await collectCleanupFailures([() => acquiredPersistence.close()]);\n\t\t\tif (cleanupFailures.length > 0) {\n\t\t\t\tthrow new AggregateError(\n\t\t\t\t\t[error, ...cleanupFailures],\n\t\t\t\t\t'Container construction failed and cleanup also failed',\n\t\t\t\t\t{ cause: error }\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\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/** Rescan configured tool and skill directories. */\n\tpublic refreshDiscovery(): Promise<{ tools: number; skills: number }> {\n\t\tif (!this._acceptingDiscoveryRefreshes) {\n\t\t\treturn Promise.reject(new SessionLifecycleClosedError(undefined, 'shutting_down'));\n\t\t}\n\t\tif (this._refreshPromise !== null) return this._refreshPromise;\n\n\t\tconst refreshPromise = Promise.allSettled([\n\t\t\tthis.tools.refreshAsync(),\n\t\t\tthis.skills.refreshAsync(),\n\t\t]).then(([toolResult, skillResult]) => {\n\t\t\tif (toolResult.status === 'rejected') {\n\t\t\t\tif (skillResult.status === 'rejected') {\n\t\t\t\t\tthrow new AggregateError(\n\t\t\t\t\t\t[toolResult.reason, skillResult.reason],\n\t\t\t\t\t\t'Failed to refresh tool and skill discovery'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow toolResult.reason;\n\t\t\t}\n\t\t\tif (skillResult.status === 'rejected') throw skillResult.reason;\n\t\t\treturn { tools: toolResult.value, skills: skillResult.value };\n\t\t});\n\t\tthis._refreshPromise = refreshPromise;\n\t\tconst clearRefreshPromise = (): void => {\n\t\t\tif (this._refreshPromise === refreshPromise) this._refreshPromise = null;\n\t\t};\n\t\tvoid refreshPromise.then(clearRefreshPromise, clearRefreshPromise);\n\t\treturn refreshPromise;\n\t}\n\n\t/**\n\t * Get all branches for one explicit thought session.\n\t * @param sessionId - Valid thought-session identifier\n\t * @returns Record<string, ThoughtData[]> - Map of branch IDs to thought arrays\n\t */\n\tpublic getBranches(sessionId: string): Record<BranchId, ThoughtData[]> {\n\t\treturn this._historyManager.getBranches(asSessionId(sessionId));\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 result = await this._thoughtProcessor.process(input as ThoughtData);\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 stop(): Promise<void> {\n\t\tthis._acceptingDiscoveryRefreshes = false;\n\t\tif (this._stopPromise) return this._stopPromise;\n\t\tconst acceptedRefresh = this._refreshPromise;\n\t\tthis._stopPromise = this._container.resolve('sessionLifecycle').shutdown(async () => {\n\t\t\tconst failures: unknown[] = [];\n\t\t\tconst [skillWatcherResult, toolWatcherResult, refreshResult] = await Promise.allSettled([\n\t\t\t\tthis._skillWatcher?.stop() ?? Promise.resolve(),\n\t\t\t\tthis._toolWatcher?.stop() ?? Promise.resolve(),\n\t\t\t\tacceptedRefresh ?? Promise.resolve(),\n\t\t\t]);\n\t\t\tfor (const result of [skillWatcherResult, toolWatcherResult]) {\n\t\t\t\tswitch (result.status) {\n\t\t\t\t\tcase 'fulfilled':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'rejected':\n\t\t\t\t\t\tappendCleanupFailure(failures, result.reason);\n\t\t\t\t\t\tthis._logger.error('Error stopping watcher', {\n\t\t\t\t\t\t\terror: getErrorMessage(result.reason),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tassertNever(result);\n\t\t\t\t}\n\t\t\t}\n\t\t\tswitch (refreshResult.status) {\n\t\t\t\tcase 'fulfilled':\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'rejected':\n\t\t\t\t\tappendCleanupFailure(failures, refreshResult.reason);\n\t\t\t\t\tthis._logger.error('Error refreshing discovery during shutdown', {\n\t\t\t\t\t\terror: getErrorMessage(refreshResult.reason),\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(refreshResult);\n\t\t\t}\n\n\t\t\t// Stop suspension store sweeper if registered\n\t\t\tif (this._config.features.toolInterleave && this._container.has('suspensionStore')) {\n\t\t\t\ttry {\n\t\t\t\t\tconst suspensionStore = this._container.resolve('suspensionStore');\n\t\t\t\t\tsuspensionStore.stop();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tappendCleanupFailure(failures, error);\n\t\t\t\t\tthis._logger.error('Error stopping suspension store', {\n\t\t\t\t\t\terror: getErrorMessage(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Flush any buffered writes before closing persistence\n\t\t\ttry {\n\t\t\t\tawait this._historyManager.shutdownWithinLifecycle();\n\t\t\t} catch (error) {\n\t\t\t\tappendCleanupFailure(failures, error);\n\t\t\t\tthis._logger.error('Error flushing write buffer during shutdown', {\n\t\t\t\t\terror: getErrorMessage(error),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Close persistence backend if available\n\t\t\tconst persistence = this._container.resolve('Persistence');\n\t\t\tif (persistence) {\n\t\t\t\ttry {\n\t\t\t\t\tawait persistence.close();\n\t\t\t\t\tthis._logger.info('Persistence backend closed');\n\t\t\t\t} catch (error) {\n\t\t\t\t\tappendCleanupFailure(failures, error);\n\t\t\t\t\tthis._logger.error('Error closing persistence backend', {\n\t\t\t\t\t\terror: getErrorMessage(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (failures.length > 0) {\n\t\t\t\tthrow new AggregateError(failures, 'Failed to stop server cleanly');\n\t\t\t}\n\t\t\tthis._historyManager.clearLiveStateAfterShutdown();\n\t\t\tthis._logger.info('Server stopped, watchers cleaned up');\n\t\t});\n\t\treturn this._stopPromise;\n\t}\n\n\t/** Awaitably resets one session and matching processor-owned state. */\n\tpublic async resetSession(sessionId: string): Promise<void> {\n\t\tawait this._thoughtProcessor.resetSession(sessionId);\n\t\tthis._logger.info('Server session reset', { sessionId });\n\t}\n\n\t/** Awaitably resets all server state from a trusted ownerless context. */\n\tpublic async resetAll(): Promise<void> {\n\t\tawait this._thoughtProcessor.resetAll();\n\t\tthis._logger.info('All server sessions reset');\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 dispose(): Promise<void> {\n\t\tif (this._disposePromise) return this._disposePromise;\n\t\tthis._disposePromise = (async () => {\n\t\t\tconst failures = await collectCleanupFailures([\n\t\t\t\t() => this.stop(),\n\t\t\t\t() => this._container.dispose(),\n\t\t\t]);\n\t\t\tif (failures.length > 0) {\n\t\t\t\tthrow new AggregateError(failures, 'Failed to dispose server cleanly');\n\t\t\t}\n\t\t\tthis._logger.info('Server disposed, all resources released');\n\t\t})();\n\t\treturn this._disposePromise;\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 * import { createServer } from '@iworkforces/tracelattice';\n *\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 */\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\tconst config = new ServerConfig(configLoader.toServerConfigOptions(fileConfig));\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\tconfig,\n\t\tfileConfig,\n\t});\n\n\tlogger.info('Server initialized successfully');\n\treturn thinkingServer;\n}\n"],"names":["appendCleanupFailure","failures","failure","AggregateError","collectCleanupFailures","operations","operation","error","ToolAwareSequentialThinkingServer","EventEmitter","options","container","server","Promise","startedServer","cleanupFailures","event","payload","listener","Error","SEQUENTIAL_THINKING_TOOL","SkillWatcher","ToolWatcher","fileConfig","persistence","Container","metrics","Metrics","config","logger","StructuredLogger","EdgeStore","InMemorySummaryStore","store","InMemorySuspensionStore","historyManager","edgeStore","summaryStore","log","CompressionService","summary","createReasoningStrategy","SessionLock","SessionLifecycleCoordinator","loadedOptions","ConfigLoader","ServerConfig","lazyDiscovery","ToolRegistry","DiscoveryCache","undefined","SkillRegistry","cfg","pers","componentMetrics","HistoryManager","sessionId","ThoughtFormatter","OutcomeRecorder","Calibrator","ThoughtEvaluator","history","formatter","evaluator","strategy","compressionService","suspensionStore","toolRegistry","sessionLock","ThoughtProcessor","configLoader","createPersistenceBackend","acquiredPersistence","discovered","SessionLifecycleClosedError","refreshPromise","toolResult","skillResult","clearRefreshPromise","asSessionId","input","startTime","Date","result","durationSeconds","acceptedRefresh","skillWatcherResult","toolWatcherResult","refreshResult","getErrorMessage","assertNever","createServer","initializeServer","thinkingServer"],"mappings":"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"}
|
|
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 type * as v from 'valibot';\nimport type { ThoughtData } from './core/thought.js';\nimport { asSessionId, type BranchId } from './contracts/ids.js';\nimport type { SequentialThinkingSchema } from './schema.js';\nimport { SEQUENTIAL_THINKING_TOOL } from './schema.js';\nimport type { IDisposable } from './types/disposable.js';\nimport { getErrorMessage } from './errors.js';\nimport { assertNever } from './utils.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 { ABSOLUTE_MAX_HISTORY_SIZE, HistoryManager } from './core/HistoryManager.js';\nimport { EdgeStore } from './core/graph/EdgeStore.js';\nimport { InMemorySummaryStore } from './core/compression/InMemorySummaryStore.js';\nimport { CompressionService } from './core/compression/CompressionService.js';\nimport { InMemorySuspensionStore } from './core/tools/InMemorySuspensionStore.js';\nimport { ThoughtEvaluator } from './core/ThoughtEvaluator.js';\nimport { Calibrator } from './core/evaluator/Calibrator.js';\nimport { OutcomeRecorder } from './core/reasoning/OutcomeRecorder.js';\nimport { createReasoningStrategy } from './core/reasoning/strategies/StrategyFactory.js';\nimport { ThoughtFormatter } from './core/ThoughtFormatter.js';\nimport { ThoughtProcessor, type CallToolResult } from './core/ThoughtProcessor.js';\nimport { SessionLock } from './core/SessionLock.js';\nimport { SessionLifecycleClosedError } from './core/SessionErrors.js';\nimport { SessionLifecycleCoordinator } from './core/SessionLifecycleCoordinator.js';\nimport { Container } from './di/Container.js';\nimport { StructuredLogger } from './logger/StructuredLogger.js';\nimport { Metrics } from './metrics/metrics.impl.js';\nimport type { PersistenceBackend } from './contracts/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 { SkillWatcher } from './watchers/SkillWatcher.js';\nimport { ToolWatcher } from './watchers/ToolWatcher.js';\nimport { HttpTransport, createHttpTransport } from './transport/HttpTransport.js';\nimport type { HttpTransportOptions } from './transport/HttpTransport.js';\nimport type { TransportOptions } from './transport/BaseTransport.js';\nimport type { ITransport, TransportKind } from './contracts/transport.js';\n\nexport { HttpTransport, createHttpTransport };\nexport type { HttpTransportOptions, TransportOptions, ITransport, TransportKind };\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 tool and skill discovery on server startup.\n\t * @default true\n\t */\n\tautoDiscover?: boolean;\n\t/**\n\t * Suppress startup discovery so callers can discover through registry APIs explicitly.\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}\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\ntype CleanupOperation = () => void | Promise<void>;\n\nfunction appendCleanupFailure(failures: unknown[], failure: unknown): void {\n\tif (failure instanceof AggregateError) {\n\t\tfailures.push(...failure.errors);\n\t\treturn;\n\t}\n\tfailures.push(failure);\n}\n\nasync function collectCleanupFailures(operations: readonly CleanupOperation[]): Promise<unknown[]> {\n\tconst failures: unknown[] = [];\n\tfor (const operation of operations) {\n\t\ttry {\n\t\t\tawait operation();\n\t\t} catch (error) {\n\t\t\tappendCleanupFailure(failures, error);\n\t\t}\n\t}\n\treturn failures;\n}\n\n/**\n * Public API contract for the tool-aware sequential thinking server.\n *\n * Extends {@link IDisposable} for resource cleanup. Concrete implementations\n * are expected to also extend Node's `EventEmitter` to support the typed\n * `emit`/`on` overloads.\n */\nexport interface IToolAwareSequentialThinkingServer extends IDisposable {\n\t/** Direct access to the history manager. */\n\treadonly history: HistoryManager;\n\n\t/** Direct access to the tool registry. */\n\treadonly tools: ToolRegistry;\n\n\t/** Direct access to the skill registry. */\n\treadonly skills: SkillRegistry;\n\n\t/** Server configuration. */\n\treadonly config: ServerConfig;\n\n\t/**\n\t * Discover skills asynchronously without blocking server startup.\n\t *\n\t * @returns The number of skills discovered\n\t */\n\tdiscoverSkillsAsync(): Promise<number>;\n\n\t/** Rescan configured tool and skill directories. */\n\trefreshDiscovery(): Promise<{ tools: number; skills: number }>;\n\n\t/**\n\t * Get all branches for one explicit thought session.\n\t *\n\t * @param sessionId - Valid thought-session identifier\n\t * @returns Map of branch IDs to thought arrays\n\t */\n\tgetBranches(sessionId: string): Record<string, ThoughtData[]>;\n\n\t/**\n\t * Process a thought through the configured pipeline.\n\t *\n\t * @param input - Validated thought input matching the schema\n\t * @returns The processing result\n\t */\n\tprocessThought(input: v.InferInput<typeof SequentialThinkingSchema>): Promise<CallToolResult>;\n\n\t/**\n\t * Export the current Prometheus metrics snapshot.\n\t */\n\tgetMetricsSnapshot(): string;\n\n\t/**\n\t * Get the DI container used by this server.\n\t * Useful for testing and advanced customizations.\n\t */\n\tgetContainer(): Container;\n\n\t/**\n\t * Stop the server and clean up watchers, suspension stores, and persistence.\n\t */\n\tstop(): Promise<void>;\n\n\t/** Awaitably reset one session and all matching auxiliary state. */\n\tresetSession(sessionId: string): Promise<void>;\n\n\t/** Awaitably reset all state from a trusted ownerless context. */\n\tresetAll(): Promise<void>;\n\n\t/**\n\t * Dispose of the server and all container services.\n\t */\n\tdispose(): Promise<void>;\n}\n\nexport class ToolAwareSequentialThinkingServer\n\textends EventEmitter\n\timplements IToolAwareSequentialThinkingServer\n{\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\tconst container = await ToolAwareSequentialThinkingServer._createContainerAsyncStatic(options);\n\t\tlet server: ToolAwareSequentialThinkingServer | undefined;\n\t\ttry {\n\t\t\tserver = new ToolAwareSequentialThinkingServer({\n\t\t\t\t...options,\n\t\t\t\tcontainer,\n\t\t\t});\n\t\t\tawait Promise.all([\n\t\t\t\tserver._skillWatcher?.ready() ?? Promise.resolve(),\n\t\t\t\tserver._toolWatcher?.ready() ?? Promise.resolve(),\n\t\t\t]);\n\n\t\t\tif (options.loadFromPersistence !== false) {\n\t\t\t\tawait server.history.loadFromPersistence();\n\t\t\t}\n\n\t\t\tif (options.autoDiscover !== false && options.lazyDiscovery !== true) {\n\t\t\t\tawait Promise.all([server.tools.discoverAsync(), server.discoverSkillsAsync()]);\n\t\t\t}\n\n\t\t\treturn server;\n\t\t} catch (error) {\n\t\t\tconst startedServer = server;\n\t\t\tconst cleanupFailures = await collectCleanupFailures(\n\t\t\t\tstartedServer\n\t\t\t\t\t? [() => startedServer.dispose()]\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\tif (container.has('suspensionStore')) {\n\t\t\t\t\t\t\t\t\tcontainer.resolve('suspensionStore').stop();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t() => container.resolve('Persistence')?.close(),\n\t\t\t\t\t\t\t() => container.dispose(),\n\t\t\t\t\t\t]\n\t\t\t);\n\t\t\tif (cleanupFailures.length > 0) {\n\t\t\t\tthrow new AggregateError(\n\t\t\t\t\t[error, ...cleanupFailures],\n\t\t\t\t\t'Server startup failed and cleanup also failed',\n\t\t\t\t\t{ cause: error }\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\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\tprivate _acceptingDiscoveryRefreshes = true;\n\tprivate _refreshPromise: Promise<{ tools: number; skills: number }> | null = null;\n\tprivate _stopPromise: Promise<void> | null = null;\n\tprivate _disposePromise: Promise<void> | null = null;\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('analysis-session');\n\t * await server.resetAll();\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.add(tool);\n\t * server.tools.get('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.add(skill);\n\t * server.skills.get('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\tif (!options.container) {\n\t\t\tthrow new Error('Container is required. Use createServer() or provide a container.');\n\t\t}\n\t\tthis._container = options.container;\n\n\t\t// Resolve dependencies from container\n\t\tthis._logger = this._container.resolve('Logger');\n\t\tthis._historyManager = this._container.resolve('HistoryManager');\n\t\tthis._historyManager.bindShutdownOwner(() => this.stop());\n\t\tthis._thoughtProcessor = this._container.resolve('ThoughtProcessor');\n\t\tthis._metrics = this._container.resolve('Metrics');\n\t\tthis._config = this._container.resolve('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');\n\t\tthis.skills = this._container.resolve('SkillRegistry');\n\t\tthis.config = this._config;\n\n\t\t// Always include the sequential thinking tool\n\t\tthis.tools.add(SEQUENTIAL_THINKING_TOOL);\n\n\t\t// Initialize watchers if enabled\n\t\tif (options.enableWatcher) {\n\t\t\tthis._skillWatcher = new SkillWatcher(this.skills, this._logger, this.config.skillDirs);\n\t\t\tthis._toolWatcher = new ToolWatcher(this.tools, this._logger, this.config.toolDirs);\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\tconst config = ToolAwareSequentialThinkingServer._resolveEffectiveConfig(options, fileConfig);\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\tToolAwareSequentialThinkingServer._registerDiscoveryRegistries(\n\t\t\tcontainer,\n\t\t\toptions.lazyDiscovery\n\t\t);\n\n\t\t// Register EdgeStore as a lazy singleton (always registered; flag gates writes)\n\t\tcontainer.register('EdgeStore', () => new EdgeStore());\n\n\t\t// Register SummaryStore as a lazy singleton (always registered; flag gates writes)\n\t\tcontainer.register('summaryStore', () => new InMemorySummaryStore());\n\n\t\t// Register SuspensionStore as a lazy singleton (only when toolInterleave flag is on)\n\t\tif (config.features.toolInterleave) {\n\t\t\tcontainer.register('suspensionStore', () => {\n\t\t\t\tconst store = new InMemorySuspensionStore({\n\t\t\t\t\tttlMs: config.toolInterleaveTtlMs,\n\t\t\t\t\tsweepIntervalMs: config.toolInterleaveSweepMs,\n\t\t\t\t\tlogger,\n\t\t\t\t});\n\t\t\t\tstore.start();\n\t\t\t\treturn store;\n\t\t\t});\n\t\t}\n\n\t\t// Register CompressionService as a lazy singleton (always registered; flag gates invocation)\n\t\tcontainer.register('compressionService', () => {\n\t\t\tconst historyManager = container.resolve('HistoryManager');\n\t\t\tconst edgeStore = container.resolve('EdgeStore');\n\t\t\tconst summaryStore = container.resolve('summaryStore');\n\t\t\tconst log = container.resolve('Logger');\n\t\t\treturn new CompressionService({\n\t\t\t\thistoryManager,\n\t\t\t\tedgeStore,\n\t\t\t\tsummaryStore,\n\t\t\t\tonSummaryCreated: (summary) => {\n\t\t\t\t\thistoryManager.bufferSummaries(\n\t\t\t\t\t\tsummary.sessionId,\n\t\t\t\t\t\tsummaryStore.forSession(summary.sessionId)\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tlogger: log,\n\t\t\t});\n\t\t});\n\n\t\t// Register ReasoningStrategy as a lazy singleton (selected via feature flag)\n\t\tcontainer.register('reasoningStrategy', () =>\n\t\t\tcreateReasoningStrategy(config.features.reasoningStrategy)\n\t\t);\n\n\t\t// Register SessionLock as a lazy singleton (always registered;\n\t\t// serializes ThoughtProcessor.process() per-session).\n\t\tcontainer.register('sessionLock', () => new SessionLock());\n\t\tcontainer.register('sessionLifecycle', () => new SessionLifecycleCoordinator());\n\n\t\tToolAwareSequentialThinkingServer._registerHistoryManager(container);\n\t\tToolAwareSequentialThinkingServer._registerThoughtPipeline(container, config);\n\n\t\treturn container;\n\t}\n\n\tprivate static _resolveEffectiveConfig(\n\t\toptions: ServerOptions,\n\t\tfileConfig: ConfigFileOptions | null\n\t): ServerConfig {\n\t\tif (options.config) return options.config;\n\t\tconst loadedOptions = new ConfigLoader().toServerConfigOptions(fileConfig ?? {});\n\t\treturn new ServerConfig({\n\t\t\t...loadedOptions,\n\t\t\tmaxHistorySize: options.maxHistorySize ?? loadedOptions.maxHistorySize,\n\t\t\tmaxBranches: options.maxBranches ?? loadedOptions.maxBranches,\n\t\t\tmaxBranchSize: options.maxBranchSize ?? loadedOptions.maxBranchSize,\n\t\t});\n\t}\n\n\tprivate static _registerDiscoveryRegistries(\n\t\tcontainer: Container,\n\t\tlazyDiscovery: ServerOptions['lazyDiscovery']\n\t): void {\n\t\tconst logger = container.resolve('Logger');\n\t\tconst config = container.resolve('Config');\n\t\tconst metrics = container.resolve('Metrics');\n\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\ttoolDirs: config.toolDirs,\n\t\t\t\t\tlazyDiscovery,\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,\n\t\t\t\t})\n\t\t);\n\t}\n\n\tprivate static _registerHistoryManager(container: Container): void {\n\t\t// Register HistoryManager with lazy initialization\n\t\tcontainer.register('HistoryManager', () => {\n\t\t\tconst cfg = container.resolve('Config');\n\t\t\tconst log = container.resolve('Logger');\n\t\t\tconst pers = container.resolve('Persistence');\n\t\t\tconst componentMetrics = container.resolve('Metrics');\n\t\t\tconst edgeStore = container.resolve('EdgeStore');\n\t\t\tconst summaryStore = container.resolve('summaryStore');\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\tpersistenceHistorySize:\n\t\t\t\t\tcfg.persistence.options?.maxHistorySize ?? ABSOLUTE_MAX_HISTORY_SIZE,\n\t\t\t\tpersistBranches: cfg.persistence.options?.persistBranches ?? true,\n\t\t\t\tedgeStore,\n\t\t\t\tsummaryStore,\n\t\t\t\tdagEdges: cfg.features.dagEdges,\n\t\t\t\tmaxSessionsPerOwner: cfg.maxSessionsPerOwner,\n\t\t\t\tsessionLock: container.resolve('sessionLock'),\n\t\t\t\tlifecycleCoordinator: container.resolve('sessionLifecycle'),\n\t\t\t\tclearSessionAuxiliaryState: (sessionId) =>\n\t\t\t\t\tcontainer.resolve('ThoughtProcessor').clearSessionAuxiliaryState(sessionId),\n\t\t\t\tclearAllAuxiliaryState: () =>\n\t\t\t\t\tcontainer.resolve('ThoughtProcessor').clearAllAuxiliaryState(),\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate static _registerThoughtPipeline(container: Container, config: ServerConfig): void {\n\t\t// Register ThoughtFormatter (can be transient)\n\t\tcontainer.registerFactory('ThoughtFormatter', () => new ThoughtFormatter());\n\n\t\t// Register OutcomeRecorder as a lazy singleton (gated by feature flag)\n\t\tcontainer.register(\n\t\t\t'outcomeRecorder',\n\t\t\t() => new OutcomeRecorder({ enabled: config.features.outcomeRecording ?? false })\n\t\t);\n\n\t\t// Register Calibrator as a lazy singleton (gated by feature flag)\n\t\tcontainer.register(\n\t\t\t'calibrator',\n\t\t\t() =>\n\t\t\t\tnew Calibrator(container.resolve('outcomeRecorder'), config.features.calibration ?? false)\n\t\t);\n\n\t\t// Register ThoughtEvaluator (stateless, transient) with injected calibrator\n\t\tcontainer.registerFactory(\n\t\t\t'ThoughtEvaluator',\n\t\t\t() => new ThoughtEvaluator(container.resolve('calibrator'))\n\t\t);\n\n\t\t// Register ThoughtProcessor\n\t\tcontainer.register('ThoughtProcessor', () => {\n\t\t\tconst history = container.resolve('HistoryManager');\n\t\t\tconst formatter = container.resolve('ThoughtFormatter');\n\t\t\tconst evaluator = container.resolve('ThoughtEvaluator');\n\t\t\tconst log = container.resolve('Logger');\n\t\t\tconst strategy = container.resolve('reasoningStrategy');\n\t\t\tconst compressionService = config.features.compression\n\t\t\t\t? container.resolve('compressionService')\n\t\t\t\t: undefined;\n\t\t\tconst suspensionStore = config.features.toolInterleave\n\t\t\t\t? container.resolve('suspensionStore')\n\t\t\t\t: undefined;\n\t\t\tconst toolRegistry = container.resolve('ToolRegistry');\n\t\t\tconst sessionLock = container.resolve('sessionLock');\n\t\t\treturn new ThoughtProcessor(\n\t\t\t\thistory,\n\t\t\t\tformatter,\n\t\t\t\tevaluator,\n\t\t\t\tlog,\n\t\t\t\tstrategy,\n\t\t\t\tcompressionService,\n\t\t\t\tsuspensionStore,\n\t\t\t\ttoolRegistry,\n\t\t\t\tconfig.features,\n\t\t\t\tsessionLock,\n\t\t\t\tcontainer.resolve('outcomeRecorder'),\n\t\t\t\tcontainer.resolve('sessionLifecycle'),\n\t\t\t\tcontainer.resolve('calibrator')\n\t\t\t);\n\t\t});\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\tlet fileConfig: ConfigFileOptions | null;\n\t\tlet config: ServerConfig;\n\t\tif (options.config) {\n\t\t\tfileConfig = options.fileConfig ?? null;\n\t\t\tconfig = options.config;\n\t\t} else {\n\t\t\tconst configLoader = new ConfigLoader();\n\t\t\tfileConfig =\n\t\t\t\toptions.fileConfig === undefined\n\t\t\t\t\t? configLoader.load()\n\t\t\t\t\t: configLoader.applyEnvironmentOverrides(options.fileConfig);\n\t\t\tconfig = ToolAwareSequentialThinkingServer._resolveEffectiveConfig(options, fileConfig);\n\t\t}\n\n\t\tlet persistence: PersistenceBackend | null = null;\n\t\ttry {\n\t\t\tpersistence = await createPersistenceBackend(config.persistence);\n\t\t\treturn ToolAwareSequentialThinkingServer._createContainerCore(\n\t\t\t\t{ ...options, config },\n\t\t\t\tfileConfig,\n\t\t\t\tpersistence\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconst acquiredPersistence = persistence;\n\t\t\tconst cleanupFailures =\n\t\t\t\tacquiredPersistence === null\n\t\t\t\t\t? []\n\t\t\t\t\t: await collectCleanupFailures([() => acquiredPersistence.close()]);\n\t\t\tif (cleanupFailures.length > 0) {\n\t\t\t\tthrow new AggregateError(\n\t\t\t\t\t[error, ...cleanupFailures],\n\t\t\t\t\t'Container construction failed and cleanup also failed',\n\t\t\t\t\t{ cause: error }\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\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/** Rescan configured tool and skill directories. */\n\tpublic refreshDiscovery(): Promise<{ tools: number; skills: number }> {\n\t\tif (!this._acceptingDiscoveryRefreshes) {\n\t\t\treturn Promise.reject(new SessionLifecycleClosedError(undefined, 'shutting_down'));\n\t\t}\n\t\tif (this._refreshPromise !== null) return this._refreshPromise;\n\n\t\tconst refreshPromise = Promise.allSettled([\n\t\t\tthis.tools.refreshAsync(),\n\t\t\tthis.skills.refreshAsync(),\n\t\t]).then(([toolResult, skillResult]) => {\n\t\t\tif (toolResult.status === 'rejected') {\n\t\t\t\tif (skillResult.status === 'rejected') {\n\t\t\t\t\tthrow new AggregateError(\n\t\t\t\t\t\t[toolResult.reason, skillResult.reason],\n\t\t\t\t\t\t'Failed to refresh tool and skill discovery'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow toolResult.reason;\n\t\t\t}\n\t\t\tif (skillResult.status === 'rejected') throw skillResult.reason;\n\t\t\treturn { tools: toolResult.value, skills: skillResult.value };\n\t\t});\n\t\tthis._refreshPromise = refreshPromise;\n\t\tconst clearRefreshPromise = (): void => {\n\t\t\tif (this._refreshPromise === refreshPromise) this._refreshPromise = null;\n\t\t};\n\t\tvoid refreshPromise.then(clearRefreshPromise, clearRefreshPromise);\n\t\treturn refreshPromise;\n\t}\n\n\t/**\n\t * Get all branches for one explicit thought session.\n\t * @param sessionId - Valid thought-session identifier\n\t * @returns Record<string, ThoughtData[]> - Map of branch IDs to thought arrays\n\t */\n\tpublic getBranches(sessionId: string): Record<BranchId, ThoughtData[]> {\n\t\treturn this._historyManager.getBranches(asSessionId(sessionId));\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 result = await this._thoughtProcessor.process(input as ThoughtData);\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 stop(): Promise<void> {\n\t\tthis._acceptingDiscoveryRefreshes = false;\n\t\tif (this._stopPromise) return this._stopPromise;\n\t\tconst acceptedRefresh = this._refreshPromise;\n\t\tthis._stopPromise = this._container.resolve('sessionLifecycle').shutdown(async () => {\n\t\t\tconst failures: unknown[] = [];\n\t\t\tconst [skillWatcherResult, toolWatcherResult, refreshResult] = await Promise.allSettled([\n\t\t\t\tthis._skillWatcher?.stop() ?? Promise.resolve(),\n\t\t\t\tthis._toolWatcher?.stop() ?? Promise.resolve(),\n\t\t\t\tacceptedRefresh ?? Promise.resolve(),\n\t\t\t]);\n\t\t\tfor (const result of [skillWatcherResult, toolWatcherResult]) {\n\t\t\t\tswitch (result.status) {\n\t\t\t\t\tcase 'fulfilled':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'rejected':\n\t\t\t\t\t\tappendCleanupFailure(failures, result.reason);\n\t\t\t\t\t\tthis._logger.error('Error stopping watcher', {\n\t\t\t\t\t\t\terror: getErrorMessage(result.reason),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tassertNever(result);\n\t\t\t\t}\n\t\t\t}\n\t\t\tswitch (refreshResult.status) {\n\t\t\t\tcase 'fulfilled':\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'rejected':\n\t\t\t\t\tappendCleanupFailure(failures, refreshResult.reason);\n\t\t\t\t\tthis._logger.error('Error refreshing discovery during shutdown', {\n\t\t\t\t\t\terror: getErrorMessage(refreshResult.reason),\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(refreshResult);\n\t\t\t}\n\n\t\t\t// Stop suspension store sweeper if registered\n\t\t\tif (this._config.features.toolInterleave && this._container.has('suspensionStore')) {\n\t\t\t\ttry {\n\t\t\t\t\tconst suspensionStore = this._container.resolve('suspensionStore');\n\t\t\t\t\tsuspensionStore.stop();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tappendCleanupFailure(failures, error);\n\t\t\t\t\tthis._logger.error('Error stopping suspension store', {\n\t\t\t\t\t\terror: getErrorMessage(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Flush any buffered writes before closing persistence\n\t\t\ttry {\n\t\t\t\tawait this._historyManager.shutdownWithinLifecycle();\n\t\t\t} catch (error) {\n\t\t\t\tappendCleanupFailure(failures, error);\n\t\t\t\tthis._logger.error('Error flushing write buffer during shutdown', {\n\t\t\t\t\terror: getErrorMessage(error),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Close persistence backend if available\n\t\t\tconst persistence = this._container.resolve('Persistence');\n\t\t\tif (persistence) {\n\t\t\t\ttry {\n\t\t\t\t\tawait persistence.close();\n\t\t\t\t\tthis._logger.info('Persistence backend closed');\n\t\t\t\t} catch (error) {\n\t\t\t\t\tappendCleanupFailure(failures, error);\n\t\t\t\t\tthis._logger.error('Error closing persistence backend', {\n\t\t\t\t\t\terror: getErrorMessage(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (failures.length > 0) {\n\t\t\t\tthrow new AggregateError(failures, 'Failed to stop server cleanly');\n\t\t\t}\n\t\t\tthis._historyManager.clearLiveStateAfterShutdown();\n\t\t\tthis._logger.info('Server stopped, watchers cleaned up');\n\t\t});\n\t\treturn this._stopPromise;\n\t}\n\n\t/** Awaitably resets one session and matching processor-owned state. */\n\tpublic async resetSession(sessionId: string): Promise<void> {\n\t\tawait this._thoughtProcessor.resetSession(sessionId);\n\t\tthis._logger.info('Server session reset', { sessionId });\n\t}\n\n\t/** Awaitably resets all server state from a trusted ownerless context. */\n\tpublic async resetAll(): Promise<void> {\n\t\tawait this._thoughtProcessor.resetAll();\n\t\tthis._logger.info('All server sessions reset');\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 dispose(): Promise<void> {\n\t\tif (this._disposePromise) return this._disposePromise;\n\t\tthis._disposePromise = (async () => {\n\t\t\tconst failures = await collectCleanupFailures([\n\t\t\t\t() => this.stop(),\n\t\t\t\t() => this._container.dispose(),\n\t\t\t]);\n\t\t\tif (failures.length > 0) {\n\t\t\t\tthrow new AggregateError(failures, 'Failed to dispose server cleanly');\n\t\t\t}\n\t\t\tthis._logger.info('Server disposed, all resources released');\n\t\t})();\n\t\treturn this._disposePromise;\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 * import { createServer } from '@iworkforces/tracelattice';\n *\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 */\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\tconst config = new ServerConfig(configLoader.toServerConfigOptions(fileConfig));\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\tconfig,\n\t\tfileConfig,\n\t});\n\n\tlogger.info('Server initialized successfully');\n\treturn thinkingServer;\n}\n"],"names":["appendCleanupFailure","failures","failure","AggregateError","collectCleanupFailures","operations","operation","error","ToolAwareSequentialThinkingServer","EventEmitter","options","container","server","Promise","startedServer","cleanupFailures","event","payload","listener","Error","SEQUENTIAL_THINKING_TOOL","SkillWatcher","ToolWatcher","fileConfig","persistence","Container","metrics","Metrics","config","logger","StructuredLogger","EdgeStore","InMemorySummaryStore","store","InMemorySuspensionStore","historyManager","edgeStore","summaryStore","log","CompressionService","summary","createReasoningStrategy","SessionLock","SessionLifecycleCoordinator","loadedOptions","ConfigLoader","ServerConfig","lazyDiscovery","ToolRegistry","DiscoveryCache","undefined","SkillRegistry","cfg","pers","componentMetrics","HistoryManager","ABSOLUTE_MAX_HISTORY_SIZE","sessionId","ThoughtFormatter","OutcomeRecorder","Calibrator","ThoughtEvaluator","history","formatter","evaluator","strategy","compressionService","suspensionStore","toolRegistry","sessionLock","ThoughtProcessor","configLoader","createPersistenceBackend","acquiredPersistence","discovered","SessionLifecycleClosedError","refreshPromise","toolResult","skillResult","clearRefreshPromise","asSessionId","input","startTime","Date","result","durationSeconds","acceptedRefresh","skillWatcherResult","toolWatcherResult","refreshResult","getErrorMessage","assertNever","createServer","initializeServer","thinkingServer"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BranchId, SessionId, ThoughtId } from '../contracts/ids.js';
|
|
2
|
+
import type { ThoughtData } from '../core/thought.js';
|
|
3
|
+
export type PersistedBranchSnapshot = {
|
|
4
|
+
readonly branchId: BranchId;
|
|
5
|
+
readonly thoughts: readonly ThoughtData[];
|
|
6
|
+
};
|
|
7
|
+
export type StagedThoughtState = {
|
|
8
|
+
readonly history: readonly ThoughtData[];
|
|
9
|
+
readonly branches: readonly PersistedBranchSnapshot[];
|
|
10
|
+
};
|
|
11
|
+
export declare function stageBacktrackPersistence(sessionId: SessionId, history: readonly ThoughtData[], branches: readonly PersistedBranchSnapshot[], thought: ThoughtData, targetThoughtId: ThoughtId, maxHistorySize: number): StagedThoughtState;
|
|
12
|
+
export declare function repairRetainedBacktracks(sessionId: SessionId, history: readonly ThoughtData[], branches: readonly PersistedBranchSnapshot[]): StagedThoughtState;
|
|
13
|
+
//# sourceMappingURL=BacktrackPersistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BacktrackPersistence.d.ts","sourceRoot":"","sources":["../../src/persistence/BacktrackPersistence.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAStD,MAAM,MAAM,uBAAuB,GAAG;IACrC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,SAAS,uBAAuB,EAAE,CAAC;CACtD,CAAC;AA0BF,wBAAgB,yBAAyB,CACxC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,SAAS,WAAW,EAAE,EAC/B,QAAQ,EAAE,SAAS,uBAAuB,EAAE,EAC5C,OAAO,EAAE,WAAW,EACpB,eAAe,EAAE,SAAS,EAC1B,cAAc,EAAE,MAAM,GACpB,kBAAkB,CA2CpB;AAED,wBAAgB,wBAAwB,CACvC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,SAAS,WAAW,EAAE,EAC/B,QAAQ,EAAE,SAAS,uBAAuB,EAAE,GAC1C,kBAAkB,CAiDpB"}
|