@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
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@ An MCP server that gives AI agents structured sequential thinking with tool and
|
|
|
10
10
|
- DAG-based thought graph with 8 edge kinds (sequence, branch, merge, verifies, critiques, derives_from, tool_invocation, revises) and topological traversal
|
|
11
11
|
- Pluggable reasoning strategies. Sequential by default, or Tree-of-Thought with BFS/beam search and plateau detection
|
|
12
12
|
- Tool interleave: suspend a thinking chain, run a tool call, then resume where you left off
|
|
13
|
-
- Confidence calibration
|
|
13
|
+
- Confidence calibration with raw-prior shrinkage, plus Brier score and Expected Calibration Error (ECE) for recorded raw predictions
|
|
14
14
|
- Branch compression: cold branches get rolled into summaries automatically, with a sliding-window dehydration policy
|
|
15
15
|
- Outcome recording for tool_call/tool_observation results with metadata
|
|
16
16
|
- Tool and skill recommendations with confidence scores, rationales, and automatic discovery
|
|
@@ -164,7 +164,7 @@ All feature flags default to enabled in `ServerConfig`. Set a boolean flag to `f
|
|
|
164
164
|
| Variable | Description |
|
|
165
165
|
| ------------------------------------------ | ------------------------------------------------------------------------ |
|
|
166
166
|
| `TRACELATTICE_FEATURES_DAG_EDGES` | Enable DAG edges for thought relationships |
|
|
167
|
-
| `TRACELATTICE_FEATURES_CALIBRATION` | Enable confidence calibration
|
|
167
|
+
| `TRACELATTICE_FEATURES_CALIBRATION` | Enable raw-prior confidence calibration |
|
|
168
168
|
| `TRACELATTICE_FEATURES_COMPRESSION` | Enable branch compression for cold branches |
|
|
169
169
|
| `TRACELATTICE_FEATURES_TOOL_INTERLEAVE` | Enable suspend/resume for tool calls |
|
|
170
170
|
| `TRACELATTICE_FEATURES_NEW_THOUGHT_TYPES` | Enable tool_call, tool_observation, assumption, decomposition, backtrack |
|
|
@@ -254,7 +254,23 @@ TraceLattice exposes only the current API and persistence contract. There are no
|
|
|
254
254
|
| Partial server cleanup | Await `dispose()` to release the server and all container-owned resources |
|
|
255
255
|
| Unprefixed environment variables | The `TRACELATTICE_*` variables documented above |
|
|
256
256
|
|
|
257
|
-
File persistence accepts the strict v2 `snapshot.json` document. SQLite persistence accepts the exact v2 schema with its authoritative `schema_version` row. Invalid, unknown, or differently versioned storage fails closed; startup does not rewrite it.
|
|
257
|
+
File persistence accepts the strict v2 `snapshot.json` document. SQLite persistence accepts the exact v2 schema with its authoritative `schema_version` row. Invalid, unknown, or differently versioned storage fails closed; startup does not rewrite it. Backtrack support did not change File or SQLite from v2 and requires no migration or version bump.
|
|
258
|
+
|
|
259
|
+
## Precision behavior
|
|
260
|
+
|
|
261
|
+
### Calibration and evaluation limits
|
|
262
|
+
|
|
263
|
+
Calibration blends a raw confidence with the empirical outcome mean for its thought type. For `n` recorded outcomes of that type, `priorWeight = 10 / (10 + n)` and the blended value is `priorWeight * raw + (1 - priorWeight) * perTypeMean`. With no outcomes for a type, the empirical component has zero weight and calibration returns the raw confidence exactly.
|
|
264
|
+
|
|
265
|
+
Temperature fitting begins at 10 outcomes. It uses per-type leave-one-out blends, the fixed grid `[0.5, 0.75, 1, 1.25, 1.5, 2]`, and deterministic ties that retain `1` before grid order. Temperature is applied after the blend. Brier and ECE reported by `Calibrator.metrics()` always score the stored raw predictions and outcomes, not transformed holdout outputs.
|
|
266
|
+
|
|
267
|
+
The checked evaluation report separates deterministic structural validation and controlled raw and calibrated probability metrics. `natural_language_accuracy` is unmeasured. These checks do not judge factuality, guarantee better calibration, or promise that every individual confidence changes in one direction.
|
|
268
|
+
|
|
269
|
+
### Persistence, recovery, and backtracking
|
|
270
|
+
|
|
271
|
+
`PersistenceBackend` requires `saveBacktrackForSession(sessionId, thought, targetThoughtId)`. Every custom backend must implement it. The operation atomically corrects every retained stable-ID copy of the target, appends the backtrack thought, and applies retention. There is no capability fallback; the ordinary persistence methods retain their existing contracts.
|
|
272
|
+
|
|
273
|
+
Restore reads retained records only. It repairs retained backtrack copies without writing the snapshot, ignores an absent retained target, and rejects an ambiguous retained numeric target. Evidence already pruned by retention or eviction cannot be recovered.
|
|
258
274
|
|
|
259
275
|
## Development
|
|
260
276
|
|
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
import type { ThoughtData } from '../core/thought.js';
|
|
2
2
|
import type { Edge } from '../core/graph/Edge.js';
|
|
3
3
|
import type { Summary } from '../core/compression/Summary.js';
|
|
4
|
-
import type { BranchId, SessionId } from './ids.js';
|
|
4
|
+
import type { BranchId, SessionId, ThoughtId } from './ids.js';
|
|
5
5
|
export interface PersistenceBackend {
|
|
6
6
|
saveThoughtForSession(sessionId: SessionId, thought: ThoughtData): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Atomically persist a backtrack correction for one session.
|
|
9
|
+
*
|
|
10
|
+
* Implementations must retract every retained stable-ID copy of `targetThoughtId`, append
|
|
11
|
+
* `thought`, and apply retention as one all-or-none operation. This is a required contract,
|
|
12
|
+
* including for custom backends: callers do not probe for it or fall back to ordinary writes.
|
|
13
|
+
* The ordinary persistence methods keep their existing contracts.
|
|
14
|
+
*/
|
|
15
|
+
saveBacktrackForSession(sessionId: SessionId, thought: ThoughtData, targetThoughtId: ThoughtId): Promise<void>;
|
|
7
16
|
loadHistoryForSession(sessionId: SessionId): Promise<ThoughtData[]>;
|
|
8
17
|
saveBranchForSession(sessionId: SessionId, branchId: BranchId, thoughts: readonly ThoughtData[]): Promise<void>;
|
|
9
18
|
deleteBranchForSession(sessionId: SessionId, branchId: BranchId): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PersistenceBackend.d.ts","sourceRoot":"","sources":["../../src/contracts/PersistenceBackend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"PersistenceBackend.d.ts","sourceRoot":"","sources":["../../src/contracts/PersistenceBackend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE/D,MAAM,WAAW,kBAAkB;IAClC,qBAAqB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF;;;;;;;OAOG;IACH,uBAAuB,CACtB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,WAAW,EACpB,eAAe,EAAE,SAAS,GACxB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,qBAAqB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACpE,oBAAoB,CACnB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,SAAS,WAAW,EAAE,GAC9B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,sBAAsB,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,oBAAoB,CACnB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,CAAC;IACtC,sBAAsB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClE,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACrC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClF,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACvC,OAAO,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,OAAO,CAAC;KAC1B,CAAC;CACF"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Calibrator contracts — interfaces for confidence calibration.
|
|
3
3
|
*
|
|
4
4
|
* Defines the shape of calibration metrics, results, and the calibrator
|
|
5
|
-
* service that maps raw model confidence to calibrated probabilities.
|
|
5
|
+
* service that maps raw model confidence to calibrated probabilities. It does not guarantee
|
|
6
|
+
* factuality, universal improvement, or monotonic change for each example.
|
|
6
7
|
*
|
|
7
8
|
* @module contracts/calibrator
|
|
8
9
|
*/
|
|
@@ -18,9 +19,9 @@ import type { ThoughtType } from './reasoning-types.js';
|
|
|
18
19
|
* ```
|
|
19
20
|
*/
|
|
20
21
|
export interface CalibrationMetrics {
|
|
21
|
-
/** Brier score across
|
|
22
|
+
/** Brier score across stored raw predictions and outcomes (lower is better). `null` if empty. */
|
|
22
23
|
readonly brierScore: number | null;
|
|
23
|
-
/**
|
|
24
|
+
/** ECE across stored raw predictions and outcomes (lower is better). `null` if empty. */
|
|
24
25
|
readonly ece: number | null;
|
|
25
26
|
/** Number of (prediction, outcome) samples backing the metrics. */
|
|
26
27
|
readonly sampleCount: number;
|
|
@@ -43,7 +44,7 @@ export interface CalibrationResult {
|
|
|
43
44
|
readonly calibrated: number;
|
|
44
45
|
/** Temperature used in the calibration mapping (1.0 = identity). */
|
|
45
46
|
readonly temperature: number;
|
|
46
|
-
/** Weight applied to the prior when blending with
|
|
47
|
+
/** Weight applied to the raw confidence prior when blending with empirical evidence. */
|
|
47
48
|
readonly priorWeight: number;
|
|
48
49
|
}
|
|
49
50
|
/**
|
|
@@ -51,7 +52,9 @@ export interface CalibrationResult {
|
|
|
51
52
|
* probabilities and reports calibration quality.
|
|
52
53
|
*
|
|
53
54
|
* Implementations should be deterministic for the same `(raw, type, sessionId)`
|
|
54
|
-
* triple given a fixed internal state.
|
|
55
|
+
* triple given a fixed internal state. They blend raw confidence with the per-type empirical
|
|
56
|
+
* outcome mean using `priorWeight = 10 / (10 + n)`. At `n = 0`, the empirical component has
|
|
57
|
+
* zero weight and the result is raw exactly. Temperature, when fitted, is applied after blending.
|
|
55
58
|
*
|
|
56
59
|
* @example
|
|
57
60
|
* ```typescript
|
|
@@ -61,7 +64,7 @@ export interface CalibrationResult {
|
|
|
61
64
|
* ```
|
|
62
65
|
*/
|
|
63
66
|
export interface ICalibrator {
|
|
64
|
-
/** Whether calibration is enabled. When `false`, `calibrate()` returns
|
|
67
|
+
/** Whether calibration is enabled. When `false`, `calibrate()` returns raw unchanged. */
|
|
65
68
|
readonly enabled: boolean;
|
|
66
69
|
/**
|
|
67
70
|
* Map a raw confidence value to a calibrated value.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calibrator.d.ts","sourceRoot":"","sources":["../../src/contracts/calibrator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"calibrator.d.ts","sourceRoot":"","sources":["../../src/contracts/calibrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IAClC,iGAAiG;IACjG,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,yFAAyF;IACzF,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CAC1D;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IACjC,2CAA2C;IAC3C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wFAAwF;IACxF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,WAAW;IAC3B,yFAAyF;IACzF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,GAAG,iBAAiB,CAAC;IAC7F;;;;;OAKG;IACH,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,kBAAkB,CAAC;IACnD;;;;OAIG;IACH,KAAK,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IACzC,8CAA8C;IAC9C,QAAQ,IAAI,IAAI,CAAC;CACjB"}
|
|
@@ -205,6 +205,12 @@ export interface IEdgeStore {
|
|
|
205
205
|
*/
|
|
206
206
|
size(sessionId?: SessionId): number;
|
|
207
207
|
}
|
|
208
|
+
export interface IGraphViewStore {
|
|
209
|
+
outgoing(sessionId: SessionId, from: ThoughtId): readonly Edge[];
|
|
210
|
+
incoming(sessionId: SessionId, to: ThoughtId): readonly Edge[];
|
|
211
|
+
edgesForSession(sessionId: SessionId): readonly Edge[];
|
|
212
|
+
nodesForSession?(sessionId: SessionId): readonly ThoughtId[];
|
|
213
|
+
}
|
|
208
214
|
/**
|
|
209
215
|
* Tool registry interface used for tool_name allowlisting in ThoughtProcessor.
|
|
210
216
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/contracts/interfaces.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/contracts/interfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import type { Summary } from '../core/compression/Summary.js';
|
|
7
7
|
import type { Edge } from '../core/graph/Edge.js';
|
|
8
8
|
import type { ThoughtData } from '../core/thought.js';
|
|
9
|
-
import type { BranchId, SessionId } from './ids.js';
|
|
9
|
+
import type { BranchId, SessionId, ThoughtId } from './ids.js';
|
|
10
10
|
/** Stable queue-assigned identity for one accepted persistence unit. */
|
|
11
11
|
export type PersistenceWorkToken = string;
|
|
12
12
|
/**
|
|
@@ -20,6 +20,12 @@ export type PersistenceWork = {
|
|
|
20
20
|
readonly token: PersistenceWorkToken;
|
|
21
21
|
readonly sessionId: SessionId;
|
|
22
22
|
readonly thought: ThoughtData;
|
|
23
|
+
} | {
|
|
24
|
+
readonly kind: 'backtrack';
|
|
25
|
+
readonly token: PersistenceWorkToken;
|
|
26
|
+
readonly sessionId: SessionId;
|
|
27
|
+
readonly thought: ThoughtData;
|
|
28
|
+
readonly targetThoughtId: ThoughtId;
|
|
23
29
|
} | {
|
|
24
30
|
readonly kind: 'branch';
|
|
25
31
|
readonly operation: 'save';
|
|
@@ -62,6 +68,12 @@ export type PersistenceWorkFailure = {
|
|
|
62
68
|
readonly sessionId: SessionId;
|
|
63
69
|
readonly attempts: number;
|
|
64
70
|
readonly cause: unknown;
|
|
71
|
+
} | {
|
|
72
|
+
readonly kind: 'backtrack';
|
|
73
|
+
readonly token: PersistenceWorkToken;
|
|
74
|
+
readonly sessionId: SessionId;
|
|
75
|
+
readonly attempts: number;
|
|
76
|
+
readonly cause: unknown;
|
|
65
77
|
} | {
|
|
66
78
|
readonly kind: 'branch';
|
|
67
79
|
readonly operation: 'save' | 'delete';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence-work.d.ts","sourceRoot":"","sources":["../../src/contracts/persistence-work.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"persistence-work.d.ts","sourceRoot":"","sources":["../../src/contracts/persistence-work.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,18 +12,26 @@ import type { SessionId } from './ids.js';
|
|
|
12
12
|
import type { ThoughtData } from '../core/thought.js';
|
|
13
13
|
import type { ReasoningStats } from '../core/reasoning.js';
|
|
14
14
|
import type { GraphView } from '../core/graph/GraphView.js';
|
|
15
|
+
export interface ActiveEvidenceProjection {
|
|
16
|
+
/** Active, immutable deep-copied main-history evidence in retained main order. */
|
|
17
|
+
readonly mainHistory: readonly ThoughtData[];
|
|
18
|
+
/** Active, immutable deep-copied thoughts, including branch-only retained evidence. */
|
|
19
|
+
readonly activeThoughts: readonly ThoughtData[];
|
|
20
|
+
/** Graph induced only by active endpoints, without path contraction or audit-store mutation. */
|
|
21
|
+
readonly graph: GraphView | undefined;
|
|
22
|
+
}
|
|
15
23
|
/**
|
|
16
24
|
* Read-only snapshot of session state passed to a reasoning strategy.
|
|
17
25
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
26
|
+
* Evidence is a first-class active projection. Its thoughts and graph are immutable deep copies;
|
|
27
|
+
* `mainHistory` preserves retained main order, `activeThoughts` permits branch-only lookup, and
|
|
28
|
+
* its graph includes only active endpoints. It never contracts paths or mutates the audit store.
|
|
20
29
|
*
|
|
21
30
|
* @example
|
|
22
31
|
* ```ts
|
|
23
32
|
* const ctx: StrategyContext = {
|
|
24
33
|
* sessionId: 'sess_42',
|
|
25
|
-
*
|
|
26
|
-
* graph: new GraphView(edgeStore, 'sess_42'),
|
|
34
|
+
* evidence: buildActiveEvidenceProjection(...),
|
|
27
35
|
* stats: evaluator.computeStats(history),
|
|
28
36
|
* currentThought: latestThought,
|
|
29
37
|
* };
|
|
@@ -33,10 +41,7 @@ import type { GraphView } from '../core/graph/GraphView.js';
|
|
|
33
41
|
export interface StrategyContext {
|
|
34
42
|
/** Session identifier this context belongs to. */
|
|
35
43
|
readonly sessionId: SessionId;
|
|
36
|
-
|
|
37
|
-
readonly history: readonly ThoughtData[];
|
|
38
|
-
/** Read-only graph view for traversal (ancestors, descendants, etc.). Undefined when DAG edges are disabled. */
|
|
39
|
-
readonly graph: GraphView | undefined;
|
|
44
|
+
readonly evidence: ActiveEvidenceProjection;
|
|
40
45
|
/** Aggregated reasoning analytics for the session. */
|
|
41
46
|
readonly stats: ReasoningStats;
|
|
42
47
|
/** The thought that just triggered the strategy decision. */
|
|
@@ -89,7 +94,7 @@ export type StrategyDecision = {
|
|
|
89
94
|
* }
|
|
90
95
|
* shouldBranch(_ctx: StrategyContext): boolean { return false; }
|
|
91
96
|
* shouldTerminate(ctx: StrategyContext): boolean {
|
|
92
|
-
* return ctx.
|
|
97
|
+
* return ctx.evidence.mainHistory.length >= 50;
|
|
93
98
|
* }
|
|
94
99
|
* }
|
|
95
100
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../../src/contracts/strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../../src/contracts/strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,WAAW,wBAAwB;IACxC,kFAAkF;IAClF,QAAQ,CAAC,WAAW,EAAE,SAAS,WAAW,EAAE,CAAC;IAC7C,uFAAuF;IACvF,QAAQ,CAAC,cAAc,EAAE,SAAS,WAAW,EAAE,CAAC;IAChD,gGAAgG;IAChG,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,eAAe;IAC/B,kDAAkD;IAClD,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;IAC5C,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,6DAA6D;IAC7D,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;CACrC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,gBAAgB,GACzB;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5E;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,kBAAkB;IAClC,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,gBAAgB,CAAC;IAC/C,oDAAoD;IACpD,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC;IAC5C,uDAAuD;IACvD,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC;CAC/C"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { BranchId, SessionId, ThoughtId } from '../contracts/ids.js';
|
|
2
|
+
import type { ThoughtData } from './thought.js';
|
|
3
|
+
export type DurableHistoryRetention = {
|
|
4
|
+
readonly kind: 'bounded';
|
|
5
|
+
readonly maxHistorySize: number;
|
|
6
|
+
} | {
|
|
7
|
+
readonly kind: 'unlimited';
|
|
8
|
+
};
|
|
9
|
+
export declare function normalizeDurableHistoryRetention(maxHistorySize: number): DurableHistoryRetention;
|
|
10
|
+
export type DurableIdentityBranch = {
|
|
11
|
+
readonly branchId: BranchId;
|
|
12
|
+
readonly thoughts: readonly ThoughtData[];
|
|
13
|
+
};
|
|
14
|
+
export type DurableIdentitySession = {
|
|
15
|
+
readonly sessionId: SessionId;
|
|
16
|
+
readonly history: readonly ThoughtData[];
|
|
17
|
+
readonly branches: readonly DurableIdentityBranch[];
|
|
18
|
+
};
|
|
19
|
+
export declare class DurableThoughtIdentityIndex {
|
|
20
|
+
private readonly _historyRetention;
|
|
21
|
+
private readonly _sessions;
|
|
22
|
+
constructor(_historyRetention: DurableHistoryRetention);
|
|
23
|
+
has(sessionId: SessionId, thoughtId: ThoughtId): boolean;
|
|
24
|
+
appendThought(sessionId: SessionId, thought: ThoughtData): void;
|
|
25
|
+
replaceBranch(sessionId: SessionId, branchId: BranchId, thoughts: readonly ThoughtData[]): void;
|
|
26
|
+
deleteBranch(sessionId: SessionId, branchId: BranchId): void;
|
|
27
|
+
replaceAll(sessions: readonly DurableIdentitySession[]): void;
|
|
28
|
+
clearSession(sessionId: SessionId): void;
|
|
29
|
+
clearAll(): void;
|
|
30
|
+
private _session;
|
|
31
|
+
private _add;
|
|
32
|
+
private _remove;
|
|
33
|
+
private _deleteEmptySession;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=DurableThoughtIdentityIndex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DurableThoughtIdentityIndex.d.ts","sourceRoot":"","sources":["../../src/core/DurableThoughtIdentityIndex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,MAAM,uBAAuB,GAClC;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC;AAEhG,wBAAgB,gCAAgC,CAAC,cAAc,EAAE,MAAM,GAAG,uBAAuB,CAEhG;AAED,MAAM,MAAM,qBAAqB,GAAG;IACnC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACpC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,SAAS,qBAAqB,EAAE,CAAC;CACpD,CAAC;AAQF,qBAAa,2BAA2B;IAGpB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAFrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2C;gBAEjC,iBAAiB,EAAE,uBAAuB;IAEvE,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO;IAIxD,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAmB/D,aAAa,CACnB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,SAAS,WAAW,EAAE,GAC9B,IAAI;IAYA,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAQ5D,UAAU,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,GAAG,IAAI;IAU7D,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAIxC,QAAQ,IAAI,IAAI;IAIvB,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,mBAAmB;CAK3B"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { assertNever } from "../utils.js";
|
|
2
|
+
function normalizeDurableHistoryRetention(maxHistorySize) {
|
|
3
|
+
return maxHistorySize > 0 ? {
|
|
4
|
+
kind: 'bounded',
|
|
5
|
+
maxHistorySize
|
|
6
|
+
} : {
|
|
7
|
+
kind: 'unlimited'
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
class DurableThoughtIdentityIndex {
|
|
11
|
+
_historyRetention;
|
|
12
|
+
_sessions = new Map();
|
|
13
|
+
constructor(_historyRetention){
|
|
14
|
+
this._historyRetention = _historyRetention;
|
|
15
|
+
}
|
|
16
|
+
has(sessionId, thoughtId) {
|
|
17
|
+
return this._sessions.get(sessionId)?.counts.has(thoughtId) === true;
|
|
18
|
+
}
|
|
19
|
+
appendThought(sessionId, thought) {
|
|
20
|
+
if (void 0 === thought.id) return;
|
|
21
|
+
const session = this._session(sessionId);
|
|
22
|
+
session.history.push(thought.id);
|
|
23
|
+
this._add(session, thought.id);
|
|
24
|
+
switch(this._historyRetention.kind){
|
|
25
|
+
case 'unlimited':
|
|
26
|
+
return;
|
|
27
|
+
case 'bounded':
|
|
28
|
+
while(session.history.length > this._historyRetention.maxHistorySize){
|
|
29
|
+
const removed = session.history.shift();
|
|
30
|
+
if (void 0 !== removed) this._remove(session, removed);
|
|
31
|
+
}
|
|
32
|
+
return;
|
|
33
|
+
default:
|
|
34
|
+
assertNever(this._historyRetention);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
replaceBranch(sessionId, branchId, thoughts) {
|
|
38
|
+
const session = this._session(sessionId);
|
|
39
|
+
for (const thoughtId of session.branches.get(branchId) ?? [])this._remove(session, thoughtId);
|
|
40
|
+
const replacement = thoughts.flatMap((thought)=>void 0 === thought.id ? [] : [
|
|
41
|
+
thought.id
|
|
42
|
+
]);
|
|
43
|
+
if (0 === replacement.length) session.branches.delete(branchId);
|
|
44
|
+
else session.branches.set(branchId, replacement);
|
|
45
|
+
for (const thoughtId of replacement)this._add(session, thoughtId);
|
|
46
|
+
this._deleteEmptySession(sessionId, session);
|
|
47
|
+
}
|
|
48
|
+
deleteBranch(sessionId, branchId) {
|
|
49
|
+
const session = this._sessions.get(sessionId);
|
|
50
|
+
if (void 0 === session) return;
|
|
51
|
+
for (const thoughtId of session.branches.get(branchId) ?? [])this._remove(session, thoughtId);
|
|
52
|
+
session.branches.delete(branchId);
|
|
53
|
+
this._deleteEmptySession(sessionId, session);
|
|
54
|
+
}
|
|
55
|
+
replaceAll(sessions) {
|
|
56
|
+
this._sessions.clear();
|
|
57
|
+
for (const session of sessions){
|
|
58
|
+
for (const thought of session.history)this.appendThought(session.sessionId, thought);
|
|
59
|
+
for (const branch of session.branches)this.replaceBranch(session.sessionId, branch.branchId, branch.thoughts);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
clearSession(sessionId) {
|
|
63
|
+
this._sessions.delete(sessionId);
|
|
64
|
+
}
|
|
65
|
+
clearAll() {
|
|
66
|
+
this._sessions.clear();
|
|
67
|
+
}
|
|
68
|
+
_session(sessionId) {
|
|
69
|
+
const existing = this._sessions.get(sessionId);
|
|
70
|
+
if (void 0 !== existing) return existing;
|
|
71
|
+
const created = {
|
|
72
|
+
history: [],
|
|
73
|
+
branches: new Map(),
|
|
74
|
+
counts: new Map()
|
|
75
|
+
};
|
|
76
|
+
this._sessions.set(sessionId, created);
|
|
77
|
+
return created;
|
|
78
|
+
}
|
|
79
|
+
_add(session, thoughtId) {
|
|
80
|
+
session.counts.set(thoughtId, (session.counts.get(thoughtId) ?? 0) + 1);
|
|
81
|
+
}
|
|
82
|
+
_remove(session, thoughtId) {
|
|
83
|
+
const count = session.counts.get(thoughtId);
|
|
84
|
+
if (void 0 === count) return;
|
|
85
|
+
if (count > 1) session.counts.set(thoughtId, count - 1);
|
|
86
|
+
else session.counts.delete(thoughtId);
|
|
87
|
+
}
|
|
88
|
+
_deleteEmptySession(sessionId, session) {
|
|
89
|
+
if (0 === session.history.length && 0 === session.branches.size) this._sessions.delete(sessionId);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export { DurableThoughtIdentityIndex, normalizeDurableHistoryRetention };
|
|
93
|
+
|
|
94
|
+
//# sourceMappingURL=DurableThoughtIdentityIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core/DurableThoughtIdentityIndex.js","sources":["../../src/core/DurableThoughtIdentityIndex.ts"],"sourcesContent":["import type { BranchId, SessionId, ThoughtId } from '../contracts/ids.js';\nimport { assertNever } from '../utils.js';\nimport type { ThoughtData } from './thought.js';\n\nexport type DurableHistoryRetention =\n\t{ readonly kind: 'bounded'; readonly maxHistorySize: number } | { readonly kind: 'unlimited' };\n\nexport function normalizeDurableHistoryRetention(maxHistorySize: number): DurableHistoryRetention {\n\treturn maxHistorySize > 0 ? { kind: 'bounded', maxHistorySize } : { kind: 'unlimited' };\n}\n\nexport type DurableIdentityBranch = {\n\treadonly branchId: BranchId;\n\treadonly thoughts: readonly ThoughtData[];\n};\n\nexport type DurableIdentitySession = {\n\treadonly sessionId: SessionId;\n\treadonly history: readonly ThoughtData[];\n\treadonly branches: readonly DurableIdentityBranch[];\n};\n\ntype SessionIdentities = {\n\treadonly history: ThoughtId[];\n\treadonly branches: Map<BranchId, readonly ThoughtId[]>;\n\treadonly counts: Map<ThoughtId, number>;\n};\n\nexport class DurableThoughtIdentityIndex {\n\tprivate readonly _sessions = new Map<SessionId, SessionIdentities>();\n\n\tpublic constructor(private readonly _historyRetention: DurableHistoryRetention) {}\n\n\tpublic has(sessionId: SessionId, thoughtId: ThoughtId): boolean {\n\t\treturn this._sessions.get(sessionId)?.counts.has(thoughtId) === true;\n\t}\n\n\tpublic appendThought(sessionId: SessionId, thought: ThoughtData): void {\n\t\tif (thought.id === undefined) return;\n\t\tconst session = this._session(sessionId);\n\t\tsession.history.push(thought.id);\n\t\tthis._add(session, thought.id);\n\t\tswitch (this._historyRetention.kind) {\n\t\t\tcase 'unlimited':\n\t\t\t\treturn;\n\t\t\tcase 'bounded':\n\t\t\t\twhile (session.history.length > this._historyRetention.maxHistorySize) {\n\t\t\t\t\tconst removed = session.history.shift();\n\t\t\t\t\tif (removed !== undefined) this._remove(session, removed);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\tassertNever(this._historyRetention);\n\t\t}\n\t}\n\n\tpublic replaceBranch(\n\t\tsessionId: SessionId,\n\t\tbranchId: BranchId,\n\t\tthoughts: readonly ThoughtData[]\n\t): void {\n\t\tconst session = this._session(sessionId);\n\t\tfor (const thoughtId of session.branches.get(branchId) ?? []) this._remove(session, thoughtId);\n\t\tconst replacement = thoughts.flatMap((thought) =>\n\t\t\tthought.id === undefined ? [] : [thought.id]\n\t\t);\n\t\tif (replacement.length === 0) session.branches.delete(branchId);\n\t\telse session.branches.set(branchId, replacement);\n\t\tfor (const thoughtId of replacement) this._add(session, thoughtId);\n\t\tthis._deleteEmptySession(sessionId, session);\n\t}\n\n\tpublic deleteBranch(sessionId: SessionId, branchId: BranchId): void {\n\t\tconst session = this._sessions.get(sessionId);\n\t\tif (session === undefined) return;\n\t\tfor (const thoughtId of session.branches.get(branchId) ?? []) this._remove(session, thoughtId);\n\t\tsession.branches.delete(branchId);\n\t\tthis._deleteEmptySession(sessionId, session);\n\t}\n\n\tpublic replaceAll(sessions: readonly DurableIdentitySession[]): void {\n\t\tthis._sessions.clear();\n\t\tfor (const session of sessions) {\n\t\t\tfor (const thought of session.history) this.appendThought(session.sessionId, thought);\n\t\t\tfor (const branch of session.branches) {\n\t\t\t\tthis.replaceBranch(session.sessionId, branch.branchId, branch.thoughts);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic clearSession(sessionId: SessionId): void {\n\t\tthis._sessions.delete(sessionId);\n\t}\n\n\tpublic clearAll(): void {\n\t\tthis._sessions.clear();\n\t}\n\n\tprivate _session(sessionId: SessionId): SessionIdentities {\n\t\tconst existing = this._sessions.get(sessionId);\n\t\tif (existing !== undefined) return existing;\n\t\tconst created: SessionIdentities = {\n\t\t\thistory: [],\n\t\t\tbranches: new Map(),\n\t\t\tcounts: new Map(),\n\t\t};\n\t\tthis._sessions.set(sessionId, created);\n\t\treturn created;\n\t}\n\n\tprivate _add(session: SessionIdentities, thoughtId: ThoughtId): void {\n\t\tsession.counts.set(thoughtId, (session.counts.get(thoughtId) ?? 0) + 1);\n\t}\n\n\tprivate _remove(session: SessionIdentities, thoughtId: ThoughtId): void {\n\t\tconst count = session.counts.get(thoughtId);\n\t\tif (count === undefined) return;\n\t\tif (count > 1) session.counts.set(thoughtId, count - 1);\n\t\telse session.counts.delete(thoughtId);\n\t}\n\n\tprivate _deleteEmptySession(sessionId: SessionId, session: SessionIdentities): void {\n\t\tif (session.history.length === 0 && session.branches.size === 0) {\n\t\t\tthis._sessions.delete(sessionId);\n\t\t}\n\t}\n}\n"],"names":["normalizeDurableHistoryRetention","maxHistorySize","DurableThoughtIdentityIndex","Map","_historyRetention","sessionId","thoughtId","thought","undefined","session","removed","assertNever","branchId","thoughts","replacement","sessions","branch","existing","created","count"],"mappings":"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"}
|
|
@@ -41,6 +41,8 @@ export interface HistoryManagerConfig {
|
|
|
41
41
|
persistenceFlushInterval?: number;
|
|
42
42
|
/** Max retries for failed persistence flushes. @default 3 */
|
|
43
43
|
persistenceMaxRetries?: number;
|
|
44
|
+
persistenceHistorySize?: number;
|
|
45
|
+
persistBranches?: boolean;
|
|
44
46
|
eventEmitter?: PersistenceEventEmitter;
|
|
45
47
|
edgeStore?: IEdgeStore;
|
|
46
48
|
summaryStore?: ISummaryStore;
|
|
@@ -142,9 +144,12 @@ export declare class HistoryManager implements IHistoryManager {
|
|
|
142
144
|
* caches tools/skills, trims, branches, emits DAG edges, and buffers for persistence.
|
|
143
145
|
*/
|
|
144
146
|
addThought(thought: ThoughtData, context?: ThoughtAdmissionContext): void;
|
|
147
|
+
assertThoughtIdentityAvailable(thought: ThoughtData): void;
|
|
145
148
|
private _addThoughtWithinOperation;
|
|
146
149
|
private _resolveAdmissionReferences;
|
|
147
150
|
private _enforceRetention;
|
|
151
|
+
private _recordVerificationTarget;
|
|
152
|
+
private _pruneVerificationTargets;
|
|
148
153
|
private _pruneUnretainedEdges;
|
|
149
154
|
private _bufferRetainedState;
|
|
150
155
|
private _stageAllRestoreBranchReconciliation;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HistoryManager.d.ts","sourceRoot":"","sources":["../../src/core/HistoryManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAAe,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAkB,MAAM,qBAAqB,CAAC;AACjG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAS7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAEN,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAGxD,OAAO,KAAK,EACX,sBAAsB,EACtB,eAAe,EACf,uBAAuB,EACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAqB,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAIzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAyB,KAAK,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAEpG,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"HistoryManager.d.ts","sourceRoot":"","sources":["../../src/core/HistoryManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,8 @@ import { getOwner } from "../context/RequestContext.js";
|
|
|
12
12
|
import { ThoughtReferenceIndex } from "./ThoughtReferenceIndex.js";
|
|
13
13
|
import { resolveThoughtReferencesForAdmission } from "./CrossReferenceValidator.js";
|
|
14
14
|
import { SessionLifecycleCoordinator } from "./SessionLifecycleCoordinator.js";
|
|
15
|
+
import { resolvedVerificationTarget } from "./evaluator/VerificationLinks.js";
|
|
16
|
+
import { reconstructVerificationTargets } from "./VerificationTargetRestore.js";
|
|
15
17
|
const ABSOLUTE_MAX_HISTORY_SIZE = 10000;
|
|
16
18
|
class HistoryManager {
|
|
17
19
|
static SESSION_TTL_MS = 1800000;
|
|
@@ -78,6 +80,8 @@ class HistoryManager {
|
|
|
78
80
|
bufferSize: config.persistenceBufferSize ?? 100,
|
|
79
81
|
flushInterval: config.persistenceFlushInterval ?? 1000,
|
|
80
82
|
maxRetries: config.persistenceMaxRetries ?? 3,
|
|
83
|
+
durableHistorySize: config.persistenceHistorySize ?? ABSOLUTE_MAX_HISTORY_SIZE,
|
|
84
|
+
persistBranches: config.persistBranches ?? true,
|
|
81
85
|
eventEmitter: this._eventEmitter,
|
|
82
86
|
logger: this._logger
|
|
83
87
|
});
|
|
@@ -211,6 +215,7 @@ class HistoryManager {
|
|
|
211
215
|
return {
|
|
212
216
|
thought_history: [],
|
|
213
217
|
branches: {},
|
|
218
|
+
verificationTargets: new Map(),
|
|
214
219
|
availableMcpTools: void 0,
|
|
215
220
|
availableSkills: void 0,
|
|
216
221
|
lastAccessedAt: Date.now(),
|
|
@@ -237,14 +242,22 @@ class HistoryManager {
|
|
|
237
242
|
const sessionId = asSessionId(thought.session_id);
|
|
238
243
|
this._lifecycle.runMutation(sessionId, ()=>this._addThoughtWithinOperation(sessionId, thought, context));
|
|
239
244
|
}
|
|
245
|
+
assertThoughtIdentityAvailable(thought) {
|
|
246
|
+
if (void 0 === thought.id) return;
|
|
247
|
+
const sessionId = asSessionId(thought.session_id);
|
|
248
|
+
this._authorizeExistingSession(sessionId, this._getCurrentOwner());
|
|
249
|
+
if (this._referenceIndex.has(sessionId, thought.id) || this._persistenceBuffer?.hasThoughtIdentity(sessionId, thought.id) === true) throw new ValidationError('id', `Thought id already exists in session: ${thought.id}`);
|
|
250
|
+
}
|
|
240
251
|
_addThoughtWithinOperation(sessionId, thought, context) {
|
|
241
252
|
this._persistenceBuffer?.assertSessionAdmissionOpen(sessionId);
|
|
242
253
|
const owner = this._getCurrentOwner();
|
|
243
254
|
this._authorizeExistingSession(sessionId, owner);
|
|
255
|
+
this.assertThoughtIdentityAvailable(thought);
|
|
244
256
|
const resolvedReferences = this._resolveAdmissionReferences(sessionId, thought, context);
|
|
245
257
|
const session = this._getSessionWithinOperation(sessionId, owner);
|
|
246
258
|
this._metrics?.counter('thought_requests_total', 1, {}, 'Total thought requests added to history');
|
|
247
259
|
session.thought_history.push(thought);
|
|
260
|
+
this._recordVerificationTarget(session, thought, resolvedReferences);
|
|
248
261
|
if (void 0 !== resolvedReferences.backtrackTargetThoughtId) this._applyRetraction(session, resolvedReferences.backtrackTargetThoughtId);
|
|
249
262
|
if (thought.available_mcp_tools) session.availableMcpTools = thought.available_mcp_tools;
|
|
250
263
|
if (thought.available_skills) session.availableSkills = thought.available_skills;
|
|
@@ -255,9 +268,10 @@ class HistoryManager {
|
|
|
255
268
|
resolvedReferences
|
|
256
269
|
});
|
|
257
270
|
const evictedBranchIds = this._enforceRetention(session, thought.branch_id);
|
|
271
|
+
this._pruneVerificationTargets(session);
|
|
258
272
|
this._rebuildReferenceIndex(sessionId, session);
|
|
259
273
|
const prunedEdges = this._pruneUnretainedEdges(sessionId, session);
|
|
260
|
-
this._bufferRetainedState(sessionId, session, thought, evictedBranchIds, edgeAdded, prunedEdges);
|
|
274
|
+
this._bufferRetainedState(sessionId, session, thought, evictedBranchIds, edgeAdded, prunedEdges, resolvedReferences.backtrackTargetThoughtId);
|
|
261
275
|
}
|
|
262
276
|
_resolveAdmissionReferences(sessionId, thought, context) {
|
|
263
277
|
const resolved = context?.resolvedReferences ?? resolveThoughtReferencesForAdmission(thought, (thoughtNumber)=>this._referenceIndex.resolve(sessionId, thoughtNumber));
|
|
@@ -274,6 +288,19 @@ class HistoryManager {
|
|
|
274
288
|
if (void 0 !== branchId) this._trimSessionBranchSize(session, branchId);
|
|
275
289
|
return this._cleanupSessionBranches(session);
|
|
276
290
|
}
|
|
291
|
+
_recordVerificationTarget(session, thought, references) {
|
|
292
|
+
const targetId = resolvedVerificationTarget(thought, references);
|
|
293
|
+
if (void 0 !== thought.id && void 0 !== targetId) session.verificationTargets.set(thought.id, targetId);
|
|
294
|
+
}
|
|
295
|
+
_pruneVerificationTargets(session) {
|
|
296
|
+
const retainedIds = new Set([
|
|
297
|
+
session.thought_history,
|
|
298
|
+
...Object.values(session.branches)
|
|
299
|
+
].flat().flatMap((thought)=>void 0 === thought.id ? [] : [
|
|
300
|
+
thought.id
|
|
301
|
+
]));
|
|
302
|
+
for (const [verifierId, targetId] of session.verificationTargets)if (!retainedIds.has(verifierId) || !retainedIds.has(targetId)) session.verificationTargets.delete(verifierId);
|
|
303
|
+
}
|
|
277
304
|
_pruneUnretainedEdges(sessionId, session) {
|
|
278
305
|
if (void 0 === this._edgeStore) return 0;
|
|
279
306
|
const retainedIds = new Set();
|
|
@@ -285,11 +312,12 @@ class HistoryManager {
|
|
|
285
312
|
for (const thought of Object.values(session.branches).flat())if (void 0 !== thought.id) retainedBranchThoughtIds.add(thought.id);
|
|
286
313
|
return this._edgeStore.pruneSession(sessionId, retainedIds, retainedBranchThoughtIds);
|
|
287
314
|
}
|
|
288
|
-
_bufferRetainedState(sessionId, session, thought, evictedBranchIds, edgeAdded, prunedEdges) {
|
|
315
|
+
_bufferRetainedState(sessionId, session, thought, evictedBranchIds, edgeAdded, prunedEdges, backtrackTargetThoughtId) {
|
|
289
316
|
const buffer = this._persistenceBuffer;
|
|
290
317
|
if (null === buffer) return;
|
|
291
|
-
buffer.bufferThought(sessionId, thought);
|
|
292
|
-
|
|
318
|
+
if (void 0 === backtrackTargetThoughtId) buffer.bufferThought(sessionId, thought);
|
|
319
|
+
else buffer.bufferBacktrack(sessionId, thought, backtrackTargetThoughtId);
|
|
320
|
+
if (void 0 !== thought.branch_id || void 0 !== backtrackTargetThoughtId || evictedBranchIds.length > 0 || session.pendingRestoreBranchDeletes.size > 0) this._stageBranchPersistence(sessionId, session, evictedBranchIds);
|
|
293
321
|
if (void 0 !== this._edgeStore && (edgeAdded || prunedEdges > 0)) buffer.bufferEdges(sessionId, this._edgeStore.edgesForSession(sessionId));
|
|
294
322
|
}
|
|
295
323
|
_stageAllRestoreBranchReconciliation() {
|
|
@@ -384,6 +412,7 @@ class HistoryManager {
|
|
|
384
412
|
if (void 0 === session) return {
|
|
385
413
|
history: [],
|
|
386
414
|
branches: {},
|
|
415
|
+
verificationTargets: new Map(),
|
|
387
416
|
branchIds: [],
|
|
388
417
|
availableMcpTools: void 0,
|
|
389
418
|
availableSkills: void 0
|
|
@@ -398,6 +427,7 @@ class HistoryManager {
|
|
|
398
427
|
...thoughts
|
|
399
428
|
]
|
|
400
429
|
])),
|
|
430
|
+
verificationTargets: new Map(session.verificationTargets),
|
|
401
431
|
branchIds: Array.from(session.branchIdentities),
|
|
402
432
|
availableMcpTools: void 0 === session.availableMcpTools ? void 0 : [
|
|
403
433
|
...session.availableMcpTools
|
|
@@ -470,6 +500,7 @@ class HistoryManager {
|
|
|
470
500
|
}
|
|
471
501
|
_restoredState(restored) {
|
|
472
502
|
const session = this._createSessionState(void 0, 'restored');
|
|
503
|
+
session.verificationTargets = reconstructVerificationTargets(restored.sessionId, restored.history, restored.branches);
|
|
473
504
|
for(let index = restored.history.length - 1; index >= 0; index--){
|
|
474
505
|
const thought = restored.history[index];
|
|
475
506
|
if (void 0 !== thought) {
|
|
@@ -490,6 +521,7 @@ class HistoryManager {
|
|
|
490
521
|
session.branchIdentities.add(branch.branchId);
|
|
491
522
|
session.branches[branch.branchId] = branch.thoughts.slice(-this._maxBranchSize);
|
|
492
523
|
}
|
|
524
|
+
this._pruneVerificationTargets(session);
|
|
493
525
|
return session;
|
|
494
526
|
}
|
|
495
527
|
async loadFromPersistence() {
|
|
@@ -515,6 +547,7 @@ class HistoryManager {
|
|
|
515
547
|
thought.id
|
|
516
548
|
]))));
|
|
517
549
|
}
|
|
550
|
+
this._persistenceBuffer?.replaceDurableThoughtIdentities(restored.sessions);
|
|
518
551
|
this._edgeStore?.clearAll();
|
|
519
552
|
this._summaryStore?.clearAll();
|
|
520
553
|
this._sessions.clear();
|