@iworkforces/tracelattice 2.2.1 → 2.3.1

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.
Files changed (60) hide show
  1. package/README.md +6 -2
  2. package/dist/cli.js +10 -7
  3. package/dist/contracts/reasoning-types.d.ts +3 -3
  4. package/dist/contracts/reasoning-types.d.ts.map +1 -1
  5. package/dist/core/HistoryManager.d.ts +6 -1
  6. package/dist/core/HistoryManager.d.ts.map +1 -1
  7. package/dist/core/HistoryManager.js +38 -6
  8. package/dist/core/HistoryManager.js.map +1 -1
  9. package/dist/core/IHistoryManager.d.ts +2 -0
  10. package/dist/core/IHistoryManager.d.ts.map +1 -1
  11. package/dist/core/SessionErrors.d.ts +4 -0
  12. package/dist/core/SessionErrors.d.ts.map +1 -1
  13. package/dist/core/SessionErrors.js +9 -1
  14. package/dist/core/SessionErrors.js.map +1 -1
  15. package/dist/core/SessionResetCoordinator.d.ts +4 -0
  16. package/dist/core/SessionResetCoordinator.d.ts.map +1 -1
  17. package/dist/core/SessionResetCoordinator.js +6 -0
  18. package/dist/core/SessionResetCoordinator.js.map +1 -1
  19. package/dist/core/ThoughtEvaluator.d.ts +9 -2
  20. package/dist/core/ThoughtEvaluator.d.ts.map +1 -1
  21. package/dist/core/ThoughtEvaluator.js +9 -2
  22. package/dist/core/ThoughtEvaluator.js.map +1 -1
  23. package/dist/core/ThoughtProcessor.d.ts +1 -0
  24. package/dist/core/ThoughtProcessor.d.ts.map +1 -1
  25. package/dist/core/ThoughtProcessor.js +47 -20
  26. package/dist/core/ThoughtProcessor.js.map +1 -1
  27. package/dist/core/evaluator/GraphPatterns.d.ts +8 -0
  28. package/dist/core/evaluator/GraphPatterns.d.ts.map +1 -0
  29. package/dist/core/evaluator/GraphPatterns.js +88 -0
  30. package/dist/core/evaluator/GraphPatterns.js.map +1 -0
  31. package/dist/core/evaluator/GraphSignalComputer.d.ts +12 -0
  32. package/dist/core/evaluator/GraphSignalComputer.d.ts.map +1 -0
  33. package/dist/core/evaluator/GraphSignalComputer.js +17 -0
  34. package/dist/core/evaluator/GraphSignalComputer.js.map +1 -0
  35. package/dist/core/evaluator/PatternDetector.d.ts +4 -1
  36. package/dist/core/evaluator/PatternDetector.d.ts.map +1 -1
  37. package/dist/core/evaluator/PatternDetector.js +8 -2
  38. package/dist/core/evaluator/PatternDetector.js.map +1 -1
  39. package/dist/core/graph/EdgeEmitter.js +1 -1
  40. package/dist/core/graph/EdgeEmitter.js.map +1 -1
  41. package/dist/core/graph/GraphView.d.ts +60 -2
  42. package/dist/core/graph/GraphView.d.ts.map +1 -1
  43. package/dist/core/graph/GraphView.js +127 -11
  44. package/dist/core/graph/GraphView.js.map +1 -1
  45. package/dist/core/reasoning/GraphContext.d.ts +25 -0
  46. package/dist/core/reasoning/GraphContext.d.ts.map +1 -0
  47. package/dist/core/reasoning/GraphContext.js +32 -0
  48. package/dist/core/reasoning/GraphContext.js.map +1 -0
  49. package/dist/core/reasoning.d.ts +10 -0
  50. package/dist/core/reasoning.d.ts.map +1 -1
  51. package/dist/errors.d.ts +1 -0
  52. package/dist/errors.d.ts.map +1 -1
  53. package/dist/errors.js +1 -0
  54. package/dist/errors.js.map +1 -1
  55. package/dist/persistence/FileSnapshotV2.d.ts +6 -6
  56. package/dist/schema.d.ts +3 -3
  57. package/dist/schema.d.ts.map +1 -1
  58. package/dist/schema.js +9 -7
  59. package/dist/schema.js.map +1 -1
  60. package/package.json +12 -12
@@ -1 +1 @@
1
- {"version":3,"file":"core/HistoryManager.js","sources":["../../src/core/HistoryManager.ts"],"sourcesContent":["/**\n * History and branch management for sequential thinking.\n *\n * This module provides the `HistoryManager` class which manages thought history,\n * branching, and optional persistence with per-session state isolation.\n *\n * Internally delegates to three focused collaborators:\n * - `EdgeEmitter` — DAG edge emission\n * - `PersistenceBuffer` — buffered persistence + retry/backoff\n * - `SessionManager` — session lifecycle (TTL/LRU eviction)\n *\n * @module HistoryManager\n */\n\nimport type { IEdgeStore, IMetrics, ISessionLock } from '../contracts/interfaces.js';\nimport { asSessionId, type BranchId, type SessionId, type ThoughtId } from '../contracts/ids.js';\nimport type { ISummaryStore } from '../contracts/summary.js';\nimport {\n\tERROR_CODES,\n\tInvalidBacktrackError,\n\tMaxSessionsReachedError,\n\tSequentialThinkingError,\n\tValidationError,\n} from '../errors.js';\nimport { NullLogger } from '../logger/NullLogger.js';\nimport type { Logger } from '../logger/StructuredLogger.js';\nimport type { PersistenceBackend } from '../contracts/PersistenceBackend.js';\nimport {\n\tDehydrationPolicy,\n\ttype DehydrationOptions,\n\ttype HydratedEntry,\n} from './compression/DehydrationPolicy.js';\nimport type { Summary } from './compression/Summary.js';\nimport { SessionAccessDeniedError } from './SessionErrors.js';\nimport { EdgeEmitter } from './graph/EdgeEmitter.js';\nimport type {\n\tHistorySessionSnapshot,\n\tIHistoryManager,\n\tThoughtAdmissionContext,\n} from './IHistoryManager.js';\nimport { PersistenceBuffer, type PersistenceEventEmitter } from './PersistenceBuffer.js';\nimport { SessionManager } from './SessionManager.js';\nimport { SessionResetCoordinator } from './SessionResetCoordinator.js';\nimport { stagePersistenceRestore, type RestoredSession } from './PersistenceRestore.js';\nimport type { ThoughtData } from './thought.js';\nimport { getOwner } from '../context/RequestContext.js';\nimport { ThoughtReferenceIndex, type ThoughtReferenceResolution } from './ThoughtReferenceIndex.js';\nimport { resolveThoughtReferencesForAdmission } from './CrossReferenceValidator.js';\nimport { SessionLifecycleCoordinator } from './SessionLifecycleCoordinator.js';\nimport { resolvedVerificationTarget } from './evaluator/VerificationLinks.js';\nimport { reconstructVerificationTargets } from './VerificationTargetRestore.js';\n\n/** Absolute maximum history size (~20MB at 2KB/thought). Cannot be overridden. */\nexport const ABSOLUTE_MAX_HISTORY_SIZE = 10_000;\n\ninterface SessionState {\n\tthought_history: ThoughtData[];\n\tbranches: Record<string, ThoughtData[]>;\n\tverificationTargets: Map<ThoughtId, ThoughtId>;\n\tavailableMcpTools: string[] | undefined;\n\tavailableSkills: string[] | undefined;\n\tlastAccessedAt: number;\n\tbranchIdentities: Set<BranchId>;\n\tpendingRestoreBranchDeletes: Set<BranchId>;\n\t/** Owner identifier set on first owner-aware access. Immutable thereafter. */\n\towner?: string;\n\t/** Non-persisted startup provenance used to block unverified network ownership. */\n\tprovenance?: 'restored';\n}\n\nexport interface HistoryManagerConfig {\n\t/** Maximum number of thoughts to keep in main history. @default 1000 */\n\tmaxHistorySize?: number;\n\t/** Maximum number of branches to maintain. @default 50 */\n\tmaxBranches?: number;\n\t/** Maximum size of each branch. @default 100 */\n\tmaxBranchSize?: number;\n\tlogger?: Logger;\n\tpersistence?: PersistenceBackend | null;\n\tmetrics?: IMetrics;\n\t/** Maximum number of thoughts to buffer before flushing. @default 100 */\n\tpersistenceBufferSize?: number;\n\t/** Periodic flush interval in ms. @default 1000 */\n\tpersistenceFlushInterval?: number;\n\t/** Max retries for failed persistence flushes. @default 3 */\n\tpersistenceMaxRetries?: number;\n\tpersistenceHistorySize?: number;\n\tpersistBranches?: boolean;\n\teventEmitter?: PersistenceEventEmitter;\n\tedgeStore?: IEdgeStore;\n\tsummaryStore?: ISummaryStore;\n\t/** Whether to emit DAG edges (gated independently of edgeStore). @default false */\n\tdagEdges?: boolean;\n\t/** Maximum sessions per owner (per-owner LRU bucket). @default 50 */\n\tmaxSessionsPerOwner?: number;\n\t/** Shared processor lock used to serialize session resets. */\n\tsessionLock?: ISessionLock;\n\t/** Shared admission and exclusive lifecycle coordinator. */\n\tlifecycleCoordinator?: SessionLifecycleCoordinator;\n\t/** Clears processor-owned state after a session is actually removed. */\n\tclearSessionAuxiliaryState?: (sessionId: SessionId) => void;\n\t/** Clears all processor-owned state after a successful global lifecycle operation. */\n\tclearAllAuxiliaryState?: () => void;\n}\n\n/**\n * Manages thought history and branching for sequential thinking.\n *\n * Owns the per-session `Map<string, SessionState>`. Delegates DAG edge emission,\n * buffered persistence, and session TTL/LRU eviction to focused collaborators while\n * preserving test-coupled private member names (`_flushTimer`, `_startFlushTimer`,\n * `_flushBuffer`, `_sessions`).\n */\nexport class HistoryManager implements IHistoryManager {\n\tprivate static readonly SESSION_TTL_MS = 30 * 60 * 1000;\n\tprivate static readonly MAX_SESSIONS = 100;\n\tprivate _sessions: Map<SessionId, SessionState> = new Map();\n\tprivate _maxHistorySize: number;\n\tprivate _maxBranches: number;\n\tprivate _maxBranchSize: number;\n\tprivate _logger: Logger;\n\tprivate _persistence: PersistenceBackend | null;\n\tprivate _persistenceEnabled: boolean;\n\tprivate _metrics?: IMetrics;\n\n\tprivate _edgeStore?: IEdgeStore;\n\tprivate _summaryStore?: ISummaryStore;\n\tprivate _dagEdges: boolean;\n\n\tprivate _eventEmitter: PersistenceEventEmitter | null;\n\n\tprivate readonly _edgeEmitter: EdgeEmitter;\n\tprivate _referenceIndex = new ThoughtReferenceIndex();\n\tprivate _persistenceBuffer: PersistenceBuffer | null;\n\tprivate readonly _sessionManager: SessionManager<SessionState>;\n\tprivate readonly _resetCoordinator: SessionResetCoordinator<SessionState>;\n\tprivate readonly _sessionLock?: ISessionLock;\n\tprivate readonly _lifecycle: SessionLifecycleCoordinator;\n\tprivate _shutdownOwner: (() => Promise<void>) | null = null;\n\tprivate readonly _clearSessionAuxiliaryState?: (sessionId: SessionId) => void;\n\tprivate readonly _clearAllAuxiliaryState?: () => void;\n\n\tconstructor(config: HistoryManagerConfig = {}) {\n\t\tthis._logger = config.logger ?? new NullLogger();\n\t\tconst requestedMaxSize = config.maxHistorySize ?? 10000;\n\t\tthis._maxHistorySize = Math.min(requestedMaxSize, ABSOLUTE_MAX_HISTORY_SIZE);\n\t\tif (requestedMaxSize > ABSOLUTE_MAX_HISTORY_SIZE) {\n\t\t\tthis._logger.warn('maxHistorySize exceeds absolute maximum, capped', {\n\t\t\t\trequested: requestedMaxSize,\n\t\t\t\tapplied: ABSOLUTE_MAX_HISTORY_SIZE,\n\t\t\t});\n\t\t}\n\t\tthis._maxBranches = config.maxBranches ?? 50;\n\t\tthis._maxBranchSize = config.maxBranchSize || 100;\n\t\tthis._persistence = config.persistence ?? null;\n\t\tthis._persistenceEnabled = this._persistence !== null;\n\t\tthis._metrics = config.metrics;\n\t\tthis._eventEmitter = config.eventEmitter ?? null;\n\t\tthis._edgeStore = config.edgeStore;\n\t\tthis._summaryStore = config.summaryStore;\n\t\tthis._dagEdges = config.dagEdges ?? true;\n\t\tthis._sessionLock = config.sessionLock;\n\t\tthis._lifecycle = config.lifecycleCoordinator ?? new SessionLifecycleCoordinator();\n\t\tthis._clearSessionAuxiliaryState = config.clearSessionAuxiliaryState;\n\t\tthis._clearAllAuxiliaryState = config.clearAllAuxiliaryState;\n\n\t\t// Wire delegates\n\t\tthis._edgeEmitter = new EdgeEmitter({\n\t\t\tedgeStore: this._edgeStore,\n\t\t\tdagEdges: this._dagEdges,\n\t\t\tlogger: this._logger,\n\t\t});\n\n\t\tthis._sessionManager = new SessionManager<SessionState>({\n\t\t\tsessionTtlMs: HistoryManager.SESSION_TTL_MS,\n\t\t\tcleanupIntervalMs: 5 * 60 * 1000,\n\t\t\tgetMaxSessions: () => HistoryManager.MAX_SESSIONS,\n\t\t\tmaxSessionsPerOwner: config.maxSessionsPerOwner ?? 50,\n\t\t\tlogger: this._logger,\n\t\t});\n\n\t\tthis._persistenceBuffer = null;\n\t\tif (this._persistenceEnabled && this._persistence) {\n\t\t\tthis._persistenceBuffer = new PersistenceBuffer({\n\t\t\t\tpersistence: this._persistence,\n\t\t\t\tbufferSize: config.persistenceBufferSize ?? 100,\n\t\t\t\tflushInterval: config.persistenceFlushInterval ?? 1000,\n\t\t\t\tmaxRetries: config.persistenceMaxRetries ?? 3,\n\t\t\t\tdurableHistorySize: config.persistenceHistorySize ?? ABSOLUTE_MAX_HISTORY_SIZE,\n\t\t\t\tpersistBranches: config.persistBranches ?? true,\n\t\t\t\teventEmitter: this._eventEmitter,\n\t\t\t\tlogger: this._logger,\n\t\t\t});\n\t\t\tthis._startFlushTimer();\n\t\t}\n\t\tconst resetDurability =\n\t\t\tthis._persistence === null || this._persistenceBuffer === null\n\t\t\t\t? { persistence: null, barrier: null }\n\t\t\t\t: { persistence: this._persistence, barrier: this._persistenceBuffer };\n\t\tthis._resetCoordinator = new SessionResetCoordinator({\n\t\t\t...resetDurability,\n\t\t\tedgeStore: this._edgeStore,\n\t\t\tsummaryStore: this._summaryStore,\n\t\t\tsessions: this._sessions,\n\t\t\tcreateSessionState: (owner) => this._createSessionState(owner),\n\t\t\tlogger: this._logger,\n\t\t});\n\n\t\tthis._sessionManager.startCleanupTimer(\n\t\t\tthis._sessions,\n\t\t\t(sessionId) => this._isTtlEvictionEligible(sessionId),\n\t\t\t(sessionIds) => this._evictSessions(sessionIds)\n\t\t);\n\t}\n\n\t// Test-coupled accessors: these private member names must remain reachable\n\t// via `manager as unknown as { _flushTimer; _startFlushTimer }`.\n\tprivate get _flushTimer(): ReturnType<typeof setInterval> | null {\n\t\treturn this._persistenceBuffer?.timer ?? null;\n\t}\n\n\tprivate _startFlushTimer(): void {\n\t\tthis._persistenceBuffer?.startFlushTimer();\n\t}\n\n\tprivate _stopFlushTimer(): void {\n\t\tif (this._flushTimer === null) return;\n\t\tthis._persistenceBuffer?.stopFlushTimer();\n\t}\n\n\t/** @internal Public for test coupling. */\n\tpublic _flushBuffer(): Promise<void> {\n\t\tthis._stageAllRestoreBranchReconciliation();\n\t\treturn this._persistenceBuffer?.flush() ?? Promise.resolve();\n\t}\n\n\t/**\n\t * Drains accepted persistence work and projects terminal failures to one session.\n\t *\n\t * @param sessionId - Authoritative session whose persistence barrier to await.\n\t * @returns A promise that settles when the session's accepted work settles.\n\t */\n\tpublic drainSession(sessionId: SessionId): Promise<void> {\n\t\tconst session = this._sessions.get(sessionId);\n\t\tif (session !== undefined) this._stageRestoreBranchReconciliation(sessionId, session);\n\t\treturn this._persistenceBuffer?.drainSession(sessionId) ?? Promise.resolve();\n\t}\n\n\t/**\n\t * Registers the latest summary snapshot for coordinator-owned persistence.\n\t *\n\t * @param sessionId - Authoritative session that owns the summaries.\n\t * @param summaries - Complete current summary snapshot for the session.\n\t */\n\tpublic bufferSummaries(sessionId: SessionId, summaries: readonly Summary[]): void {\n\t\tthis._lifecycle.runMutation(sessionId, () => {\n\t\t\tthis._persistenceBuffer?.bufferSummaries(sessionId, summaries);\n\t\t\tconst session = this._sessions.get(sessionId);\n\t\t\tif (session !== undefined) this._stageRestoreBranchReconciliation(sessionId, session);\n\t\t});\n\t}\n\n\t/** EdgeStore instance, if configured. Used by ThoughtProcessor for StrategyContext. */\n\tpublic getEdgeStore(): IEdgeStore | undefined {\n\t\treturn this._edgeStore;\n\t}\n\n\tprivate log(message: string, meta?: Record<string, unknown>): void {\n\t\tthis._logger.info(message, meta);\n\t}\n\n\t/** Reads owner from RequestContext (AsyncLocalStorage). Stdio path returns undefined. */\n\tprivate _getCurrentOwner(): string | undefined {\n\t\treturn getOwner();\n\t}\n\n\t/**\n\t * Gets or creates session state; updates lastAccessedAt.\n\t *\n\t * Ownership semantics:\n\t * - `owner === undefined` (stdio path): never rejects, never sets owner.\n\t * - `owner !== undefined`: if session has a different owner, throws\n\t * `SessionAccessDeniedError`. If session was created without an owner\n\t * (e.g. by stdio), the owner is set on first owner-aware access.\n\t */\n\tprivate _getSession(sessionId: string, owner?: string): SessionState {\n\t\tconst key = asSessionId(sessionId);\n\t\tconst existing = this._sessions.get(key);\n\t\tif (existing !== undefined) {\n\t\t\tthis._assertSessionOwner(key, existing, owner);\n\t\t\texisting.lastAccessedAt = Date.now();\n\t\t\treturn existing;\n\t\t}\n\t\treturn this._lifecycle.runMutation(key, () => this._getSessionWithinOperation(key, owner));\n\t}\n\n\tprivate _getSessionWithinOperation(key: SessionId, owner?: string): SessionState {\n\t\tlet session = this._sessions.get(key);\n\t\tif (!session) {\n\t\t\tthis._makeCapacityForSession(owner);\n\t\t\tsession = this._createSessionState(owner);\n\t\t\tthis._sessions.set(key, session);\n\t\t} else {\n\t\t\tthis._assertSessionOwner(key, session, owner);\n\t\t}\n\t\tsession.lastAccessedAt = Date.now();\n\t\treturn session;\n\t}\n\n\tprivate _assertSessionOwner(\n\t\tsessionId: SessionId,\n\t\tsession: SessionState,\n\t\towner: string | undefined\n\t): void {\n\t\tif (owner === undefined) return;\n\t\tif (session.provenance === 'restored') {\n\t\t\tthrow new SessionAccessDeniedError(sessionId, 'unavailable', owner);\n\t\t}\n\t\tif (session.owner !== undefined && session.owner !== owner) {\n\t\t\tthrow new SessionAccessDeniedError(sessionId, session.owner, owner);\n\t\t}\n\t\tif (session.owner === undefined) session.owner = owner;\n\t}\n\n\tprivate _makeCapacityForSession(owner: string | undefined): void {\n\t\tconst victims = this._sessionManager.planProspectiveAdmission(\n\t\t\tthis._sessions,\n\t\t\towner,\n\t\t\t(sessionId) => this._isCapacityEvictionEligible(sessionId)\n\t\t);\n\t\tif (victims === undefined) throw new MaxSessionsReachedError(HistoryManager.MAX_SESSIONS);\n\t\tif (victims.length === 0) return;\n\t\tconst evicted = this._lifecycle.tryEvictIdleSessions(victims, (sessionIds) => {\n\t\t\tif (sessionIds.some((sessionId) => !this._isPersistenceQuiescent(sessionId))) {\n\t\t\t\tthrow new MaxSessionsReachedError(HistoryManager.MAX_SESSIONS);\n\t\t\t}\n\t\t\tfor (const sessionId of sessionIds) this._removeLiveSession(sessionId);\n\t\t});\n\t\tif (!evicted) throw new MaxSessionsReachedError(HistoryManager.MAX_SESSIONS);\n\t}\n\n\tprivate _isCapacityEvictionEligible(sessionId: SessionId): boolean {\n\t\treturn this._lifecycle.isIdle(sessionId) && this._isPersistenceQuiescent(sessionId);\n\t}\n\n\tprivate _isTtlEvictionEligible(sessionId: SessionId): boolean {\n\t\tconst persistenceState =\n\t\t\tthis._persistenceBuffer?.sessionEvictionState(sessionId) ?? 'quiescent';\n\t\treturn (\n\t\t\tthis._lifecycle.isIdle(sessionId) &&\n\t\t\tpersistenceState !== 'failed' &&\n\t\t\tpersistenceState !== 'barrier'\n\t\t);\n\t}\n\n\tprivate _isPersistenceQuiescent(sessionId: SessionId): boolean {\n\t\treturn (\n\t\t\t(this._persistenceBuffer?.sessionEvictionState(sessionId) ?? 'quiescent') === 'quiescent'\n\t\t);\n\t}\n\n\tprivate async _evictSessions(sessionIds: readonly SessionId[]): Promise<void> {\n\t\tconst results = await Promise.allSettled(\n\t\t\tsessionIds.map((sessionId) => this._evictSession(sessionId))\n\t\t);\n\t\tconst failures = results.flatMap((result) =>\n\t\t\tresult.status === 'rejected' ? [result.reason] : []\n\t\t);\n\t\tif (failures.length > 0) throw new AggregateError(failures, 'Session eviction failed');\n\t}\n\n\tprivate _evictSession(sessionId: SessionId): Promise<void> {\n\t\treturn this._lifecycle.withSessionEviction(sessionId, async () => {\n\t\t\tif (this._persistenceBuffer === null) {\n\t\t\t\tthis._removeLiveSession(sessionId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst session = this._sessions.get(sessionId);\n\t\t\tif (session !== undefined) this._stageRestoreBranchReconciliation(sessionId, session);\n\t\t\tawait this._persistenceBuffer.withSessionEvictionBarrier(sessionId, async () => {\n\t\t\t\tthis._removeLiveSession(sessionId);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate _removeLiveSession(sessionId: SessionId): void {\n\t\tthis._clearSessionAuxiliaryState?.(sessionId);\n\t\tthis._edgeStore?.clearSession(sessionId);\n\t\tthis._summaryStore?.clearSession(sessionId);\n\t\tthis._referenceIndex.clearSession(sessionId);\n\t\tthis._sessions.delete(sessionId);\n\t\tthis._persistenceBuffer?.forgetQuiescentSession(sessionId);\n\t}\n\n\tprivate _createSessionState(owner?: string, provenance?: 'restored'): SessionState {\n\t\treturn {\n\t\t\tthought_history: [],\n\t\t\tbranches: {},\n\t\t\tverificationTargets: new Map<ThoughtId, ThoughtId>(),\n\t\t\tavailableMcpTools: undefined,\n\t\t\tavailableSkills: undefined,\n\t\t\tlastAccessedAt: Date.now(),\n\t\t\tbranchIdentities: new Set<BranchId>(),\n\t\t\tpendingRestoreBranchDeletes: new Set<BranchId>(),\n\t\t\towner,\n\t\t\tprovenance,\n\t\t};\n\t}\n\n\tprivate _authorizeExistingSession(\n\t\tsessionId: SessionId,\n\t\towner: string | undefined\n\t): string | undefined {\n\t\tconst sessionOwner = this._sessions.get(sessionId)?.owner;\n\t\tif (owner !== undefined && this._sessions.get(sessionId)?.provenance === 'restored') {\n\t\t\tthrow new SessionAccessDeniedError(sessionId, 'unavailable', owner);\n\t\t}\n\t\tif (owner !== undefined && sessionOwner !== undefined && sessionOwner !== owner) {\n\t\t\tthrow new SessionAccessDeniedError(sessionId, sessionOwner, owner);\n\t\t}\n\t\treturn sessionOwner ?? owner;\n\t}\n\n\tprivate _assertOwnerlessResetAll(): void {\n\t\tconst owner = this._getCurrentOwner();\n\t\tif (owner === undefined) return;\n\t\tconst firstSessionId = this._sessions.keys().next().value;\n\t\tif (firstSessionId !== undefined) {\n\t\t\tthrow new SessionAccessDeniedError(firstSessionId, 'trusted ownerless context', owner);\n\t\t}\n\t\tthrow new SequentialThinkingError(\n\t\t\t`Access denied to all sessions: trusted ownerless context required, accessed by '${owner}'`,\n\t\t\tERROR_CODES.SESSION_ACCESS_DENIED\n\t\t);\n\t}\n\n\t/**\n\t * Adds a thought to the history. Routes per-session, applies retraction for backtrack,\n\t * caches tools/skills, trims, branches, emits DAG edges, and buffers for persistence.\n\t */\n\tpublic addThought(thought: ThoughtData, context?: ThoughtAdmissionContext): void {\n\t\tconst sessionId = asSessionId(thought.session_id);\n\t\tthis._lifecycle.runMutation(sessionId, () =>\n\t\t\tthis._addThoughtWithinOperation(sessionId, thought, context)\n\t\t);\n\t}\n\n\tpublic assertThoughtIdentityAvailable(thought: ThoughtData): void {\n\t\tif (thought.id === undefined) return;\n\t\tconst sessionId = asSessionId(thought.session_id);\n\t\tthis._authorizeExistingSession(sessionId, this._getCurrentOwner());\n\t\tif (\n\t\t\tthis._referenceIndex.has(sessionId, thought.id) ||\n\t\t\tthis._persistenceBuffer?.hasThoughtIdentity(sessionId, thought.id) === true\n\t\t) {\n\t\t\tthrow new ValidationError('id', `Thought id already exists in session: ${thought.id}`);\n\t\t}\n\t}\n\n\tprivate _addThoughtWithinOperation(\n\t\tsessionId: SessionId,\n\t\tthought: ThoughtData,\n\t\tcontext?: ThoughtAdmissionContext\n\t): void {\n\t\tthis._persistenceBuffer?.assertSessionAdmissionOpen(sessionId);\n\t\tconst owner = this._getCurrentOwner();\n\t\tthis._authorizeExistingSession(sessionId, owner);\n\t\tthis.assertThoughtIdentityAvailable(thought);\n\t\tconst resolvedReferences = this._resolveAdmissionReferences(sessionId, thought, context);\n\t\tconst session = this._getSessionWithinOperation(sessionId, owner);\n\t\tthis._metrics?.counter(\n\t\t\t'thought_requests_total',\n\t\t\t1,\n\t\t\t{},\n\t\t\t'Total thought requests added to history'\n\t\t);\n\n\t\tsession.thought_history.push(thought);\n\t\tthis._recordVerificationTarget(session, thought, resolvedReferences);\n\n\t\t// Logical retraction: when a backtrack thought is added, mark its target\n\t\t// as retracted (append-only — target remains in history).\n\t\tif (resolvedReferences.backtrackTargetThoughtId !== undefined) {\n\t\t\tthis._applyRetraction(session, resolvedReferences.backtrackTargetThoughtId);\n\t\t}\n\n\t\t// Cache available_mcp_tools/available_skills for cross-call persistence\n\t\tif (thought.available_mcp_tools) {\n\t\t\tsession.availableMcpTools = thought.available_mcp_tools;\n\t\t}\n\t\tif (thought.available_skills) {\n\t\t\tsession.availableSkills = thought.available_skills;\n\t\t}\n\n\t\tif (thought.branch_from_thought && thought.branch_id) {\n\t\t\tthis._addToSessionBranch(session, thought.branch_id, thought);\n\t\t}\n\n\t\tif (thought.merge_from_thoughts?.length || thought.merge_branch_ids?.length) {\n\t\t\tthis._metrics?.counter(\n\t\t\t\t'thought_merge_operations_total',\n\t\t\t\t1,\n\t\t\t\t{},\n\t\t\t\t'Total merge operations (graph topology)'\n\t\t\t);\n\t\t}\n\n\t\tconst edgeAdded = this._edgeEmitter.emitEdgesForThought(session, thought, {\n\t\t\t...context,\n\t\t\tresolvedReferences,\n\t\t});\n\t\tconst evictedBranchIds = this._enforceRetention(session, thought.branch_id);\n\t\tthis._pruneVerificationTargets(session);\n\t\tthis._rebuildReferenceIndex(sessionId, session);\n\t\tconst prunedEdges = this._pruneUnretainedEdges(sessionId, session);\n\t\tthis._bufferRetainedState(\n\t\t\tsessionId,\n\t\t\tsession,\n\t\t\tthought,\n\t\t\tevictedBranchIds,\n\t\t\tedgeAdded,\n\t\t\tprunedEdges,\n\t\t\tresolvedReferences.backtrackTargetThoughtId\n\t\t);\n\t}\n\n\tprivate _resolveAdmissionReferences(\n\t\tsessionId: SessionId,\n\t\tthought: ThoughtData,\n\t\tcontext?: ThoughtAdmissionContext\n\t): NonNullable<ThoughtAdmissionContext['resolvedReferences']> {\n\t\tconst resolved =\n\t\t\tcontext?.resolvedReferences ??\n\t\t\tresolveThoughtReferencesForAdmission(thought, (thoughtNumber) =>\n\t\t\t\tthis._referenceIndex.resolve(sessionId, thoughtNumber)\n\t\t\t);\n\t\tif (\n\t\t\tthought.thought_type === 'backtrack' &&\n\t\t\tthought.backtrack_target !== undefined &&\n\t\t\tresolved.backtrackTargetThoughtId === undefined\n\t\t) {\n\t\t\tthrow new InvalidBacktrackError(\n\t\t\t\t`backtrack_target ${thought.backtrack_target} is missing in session history`\n\t\t\t);\n\t\t}\n\t\treturn resolved;\n\t}\n\n\tprivate _enforceRetention(\n\t\tsession: SessionState,\n\t\tbranchId: BranchId | undefined\n\t): readonly BranchId[] {\n\t\tif (session.thought_history.length > this._maxHistorySize) {\n\t\t\tsession.thought_history = session.thought_history.slice(-this._maxHistorySize);\n\t\t\tthis.log(`History trimmed to ${this._maxHistorySize} items`, {\n\t\t\t\tmaxSize: this._maxHistorySize,\n\t\t\t});\n\t\t}\n\t\tif (branchId !== undefined) this._trimSessionBranchSize(session, branchId);\n\t\treturn this._cleanupSessionBranches(session);\n\t}\n\n\tprivate _recordVerificationTarget(\n\t\tsession: SessionState,\n\t\tthought: ThoughtData,\n\t\treferences: NonNullable<ThoughtAdmissionContext['resolvedReferences']>\n\t): void {\n\t\tconst targetId = resolvedVerificationTarget(thought, references);\n\t\tif (thought.id !== undefined && targetId !== undefined) {\n\t\t\tsession.verificationTargets.set(thought.id, targetId);\n\t\t}\n\t}\n\n\tprivate _pruneVerificationTargets(session: SessionState): void {\n\t\tconst retainedIds = new Set(\n\t\t\t[session.thought_history, ...Object.values(session.branches)]\n\t\t\t\t.flat()\n\t\t\t\t.flatMap((thought) => (thought.id === undefined ? [] : [thought.id]))\n\t\t);\n\t\tfor (const [verifierId, targetId] of session.verificationTargets) {\n\t\t\tif (!retainedIds.has(verifierId) || !retainedIds.has(targetId)) {\n\t\t\t\tsession.verificationTargets.delete(verifierId);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _pruneUnretainedEdges(sessionId: SessionId, session: SessionState): number {\n\t\tif (this._edgeStore === undefined) return 0;\n\t\tconst retainedIds = new Set<ThoughtId>();\n\t\tconst retainedBranchThoughtIds = new Set<ThoughtId>();\n\t\tfor (const thought of [session.thought_history, ...Object.values(session.branches)].flat()) {\n\t\t\tif (thought.id !== undefined) retainedIds.add(thought.id);\n\t\t}\n\t\tfor (const thought of Object.values(session.branches).flat()) {\n\t\t\tif (thought.id !== undefined) retainedBranchThoughtIds.add(thought.id);\n\t\t}\n\t\treturn this._edgeStore.pruneSession(sessionId, retainedIds, retainedBranchThoughtIds);\n\t}\n\n\tprivate _bufferRetainedState(\n\t\tsessionId: SessionId,\n\t\tsession: SessionState,\n\t\tthought: ThoughtData,\n\t\tevictedBranchIds: readonly BranchId[],\n\t\tedgeAdded: boolean,\n\t\tprunedEdges: number,\n\t\tbacktrackTargetThoughtId?: ThoughtId\n\t): void {\n\t\tconst buffer = this._persistenceBuffer;\n\t\tif (buffer === null) return;\n\t\tif (backtrackTargetThoughtId === undefined) buffer.bufferThought(sessionId, thought);\n\t\telse buffer.bufferBacktrack(sessionId, thought, backtrackTargetThoughtId);\n\t\tif (\n\t\t\tthought.branch_id !== undefined ||\n\t\t\tbacktrackTargetThoughtId !== undefined ||\n\t\t\tevictedBranchIds.length > 0 ||\n\t\t\tsession.pendingRestoreBranchDeletes.size > 0\n\t\t) {\n\t\t\tthis._stageBranchPersistence(sessionId, session, evictedBranchIds);\n\t\t}\n\t\tif (this._edgeStore !== undefined && (edgeAdded || prunedEdges > 0)) {\n\t\t\tbuffer.bufferEdges(sessionId, this._edgeStore.edgesForSession(sessionId));\n\t\t}\n\t}\n\n\tprivate _stageAllRestoreBranchReconciliation(): void {\n\t\tfor (const [sessionId, session] of this._sessions) {\n\t\t\tthis._stageRestoreBranchReconciliation(sessionId, session);\n\t\t}\n\t}\n\n\tprivate _stageRestoreBranchReconciliation(sessionId: SessionId, session: SessionState): void {\n\t\tif (session.pendingRestoreBranchDeletes.size === 0) return;\n\t\tthis._stageBranchPersistence(sessionId, session, []);\n\t}\n\n\tprivate _stageBranchPersistence(\n\t\tsessionId: SessionId,\n\t\tsession: SessionState,\n\t\tordinaryDeletes: readonly BranchId[]\n\t): void {\n\t\tconst buffer = this._persistenceBuffer;\n\t\tif (buffer === null) return;\n\t\tfor (const branchId of session.branchIdentities) {\n\t\t\tconst branch = session.branches[branchId];\n\t\t\tif (branch !== undefined) buffer.bufferBranch(sessionId, branchId, branch);\n\t\t}\n\t\tconst branchIdsToDelete = new Set([...session.pendingRestoreBranchDeletes, ...ordinaryDeletes]);\n\t\tfor (const branchId of branchIdsToDelete) {\n\t\t\tif (session.branches[branchId] === undefined) buffer.deleteBranch(sessionId, branchId);\n\t\t}\n\t\tsession.pendingRestoreBranchDeletes.clear();\n\t}\n\n\t/** Marks the thought as retracted within the session (append-only). */\n\tprivate _applyRetraction(session: SessionState, targetId: ThoughtId): void {\n\t\tfor (const t of session.thought_history) {\n\t\t\tif (t.id === targetId) t.retracted = true;\n\t\t}\n\t\tfor (const branchThoughts of Object.values(session.branches)) {\n\t\t\tfor (const t of branchThoughts) {\n\t\t\t\tif (t.id === targetId) t.retracted = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _rebuildReferenceIndex(sessionId: SessionId, session: SessionState): void {\n\t\tconst retained = [session.thought_history, ...Object.values(session.branches)].flat();\n\t\tthis._referenceIndex.replaceSession(sessionId, retained);\n\t}\n\n\tpublic resolveThoughtReference(\n\t\tsessionId: SessionId,\n\t\tthoughtNumber: number\n\t): ThoughtReferenceResolution {\n\t\tthis._authorizeExistingSession(sessionId, this._getCurrentOwner());\n\t\treturn this._referenceIndex.resolve(sessionId, thoughtNumber);\n\t}\n\n\tprivate _addToSessionBranch(\n\t\tsession: SessionState,\n\t\tbranchId: BranchId,\n\t\tthought: ThoughtData\n\t): void {\n\t\tif (!session.branches[branchId]) {\n\t\t\tsession.branches[branchId] = [];\n\t\t}\n\t\tsession.branchIdentities.add(branchId);\n\t\tsession.branches[branchId].push(thought);\n\t}\n\n\tprivate _cleanupSessionBranches(session: SessionState): readonly BranchId[] {\n\t\tconst branchCount = session.branchIdentities.size;\n\t\tif (branchCount <= this._maxBranches) return [];\n\t\tconst identitiesToRemove = Array.from(session.branchIdentities).slice(\n\t\t\t0,\n\t\t\tbranchCount - this._maxBranches\n\t\t);\n\t\tconst branchesToDelete: BranchId[] = [];\n\t\tfor (const branchId of identitiesToRemove) {\n\t\t\tsession.branchIdentities.delete(branchId);\n\t\t\tif (session.branches[branchId] !== undefined) branchesToDelete.push(branchId);\n\t\t\tdelete session.branches[branchId];\n\t\t\tthis.log(`Removed old branch: ${branchId}`, { branchId });\n\t\t}\n\t\treturn branchesToDelete;\n\t}\n\n\tprivate _trimSessionBranchSize(session: SessionState, branchId: BranchId): void {\n\t\tconst branch = session.branches[branchId];\n\t\tif (branch !== undefined && branch.length > this._maxBranchSize) {\n\t\t\tconst removed = branch.length - this._maxBranchSize;\n\t\t\tsession.branches[branchId] = branch.slice(-this._maxBranchSize);\n\t\t\tthis.log(`Trimmed branch '${branchId}': removed ${removed} old thoughts`, {\n\t\t\t\tbranchId,\n\t\t\t\tremoved,\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic getHistory(sessionId: string): ThoughtData[] {\n\t\treturn this._getSession(sessionId, this._getCurrentOwner()).thought_history;\n\t}\n\n\t/**\n\t * Returns history with optional sliding-window dehydration. Non-mutating: when\n\t * `dagEdges` is off OR no `ISummaryStore` is configured, returns same as getHistory.\n\t */\n\tpublic getHistoryHydrated(sessionId: string, opts?: DehydrationOptions): HydratedEntry[] {\n\t\tconst history = this.getHistory(sessionId);\n\t\tif (!this._dagEdges || !this._summaryStore) {\n\t\t\treturn history.slice();\n\t\t}\n\t\tconst policy = new DehydrationPolicy(this._summaryStore);\n\t\treturn policy.apply(history, asSessionId(sessionId), opts);\n\t}\n\n\tpublic getHistoryLength(sessionId: string): number {\n\t\treturn this._getSession(sessionId, this._getCurrentOwner()).thought_history.length;\n\t}\n\n\tpublic getBranches(sessionId: string): Record<BranchId, ThoughtData[]> {\n\t\treturn this._getSession(sessionId, this._getCurrentOwner()).branches;\n\t}\n\n\tpublic getBranchIds(sessionId: string): BranchId[] {\n\t\treturn Array.from(this._getSession(sessionId, this._getCurrentOwner()).branchIdentities);\n\t}\n\n\t/** Returns validation state without creating a session, binding an owner, or updating LRU data. */\n\tpublic inspectSession(sessionId: string): HistorySessionSnapshot {\n\t\tconst canonicalSessionId = asSessionId(sessionId);\n\t\tthis._authorizeExistingSession(canonicalSessionId, this._getCurrentOwner());\n\t\tconst session = this._sessions.get(canonicalSessionId);\n\t\tif (session === undefined) {\n\t\t\treturn {\n\t\t\t\thistory: [],\n\t\t\t\tbranches: {},\n\t\t\t\tverificationTargets: new Map(),\n\t\t\t\tbranchIds: [],\n\t\t\t\tavailableMcpTools: undefined,\n\t\t\t\tavailableSkills: undefined,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\thistory: [...session.thought_history],\n\t\t\tbranches: Object.fromEntries(\n\t\t\t\tObject.entries(session.branches).map(([branchId, thoughts]) => [branchId, [...thoughts]])\n\t\t\t) as Record<BranchId, readonly ThoughtData[]>,\n\t\t\tverificationTargets: new Map(session.verificationTargets),\n\t\t\tbranchIds: Array.from(session.branchIdentities),\n\t\t\tavailableMcpTools:\n\t\t\t\tsession.availableMcpTools === undefined ? undefined : [...session.availableMcpTools],\n\t\t\tavailableSkills:\n\t\t\t\tsession.availableSkills === undefined ? undefined : [...session.availableSkills],\n\t\t};\n\t}\n\n\t/** @throws {ValidationError} If branchId is empty or already exists. */\n\tpublic registerBranch(sessionId: string, branchId: BranchId): void {\n\t\tif (typeof branchId !== 'string' || branchId.length === 0) {\n\t\t\tthrow new ValidationError('branch_id', 'branch_id must be a non-empty string');\n\t\t}\n\t\tconst canonicalSessionId = asSessionId(sessionId);\n\t\tthis._lifecycle.runMutation(canonicalSessionId, () => {\n\t\t\tthis._persistenceBuffer?.assertSessionAdmissionOpen(canonicalSessionId);\n\t\t\tconst session = this._getSessionWithinOperation(canonicalSessionId, this._getCurrentOwner());\n\t\t\tif (session.branchIdentities.has(branchId)) {\n\t\t\t\tthrow new ValidationError('branch_id', `Branch already exists: ${branchId}`);\n\t\t\t}\n\t\t\tsession.branchIdentities.add(branchId);\n\t\t\tconst evictedBranchIds = this._cleanupSessionBranches(session);\n\t\t\tthis._rebuildReferenceIndex(canonicalSessionId, session);\n\t\t\tconst prunedEdges = this._pruneUnretainedEdges(canonicalSessionId, session);\n\t\t\tif (evictedBranchIds.length > 0 || session.pendingRestoreBranchDeletes.size > 0) {\n\t\t\t\tthis._stageBranchPersistence(canonicalSessionId, session, evictedBranchIds);\n\t\t\t}\n\t\t\tif (this._edgeStore !== undefined && prunedEdges > 0) {\n\t\t\t\tthis._persistenceBuffer?.bufferEdges(\n\t\t\t\t\tcanonicalSessionId,\n\t\t\t\t\tthis._edgeStore.edgesForSession(canonicalSessionId)\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.log('Registered branch', { branchId, sessionId });\n\t\t});\n\t}\n\n\tpublic branchExists(sessionId: string, branchId: BranchId): boolean {\n\t\tconst session = this._getSession(sessionId, this._getCurrentOwner());\n\t\treturn session.branchIdentities.has(branchId);\n\t}\n\n\tpublic getAvailableMcpTools(sessionId: string): string[] | undefined {\n\t\treturn this._getSession(sessionId, this._getCurrentOwner()).availableMcpTools;\n\t}\n\n\tpublic getAvailableSkills(sessionId: string): string[] | undefined {\n\t\treturn this._getSession(sessionId, this._getCurrentOwner()).availableSkills;\n\t}\n\n\tpublic getBranch(branchId: BranchId, sessionId: string): ThoughtData[] | undefined {\n\t\treturn this._getSession(sessionId, this._getCurrentOwner()).branches[branchId];\n\t}\n\n\t/** Awaitably deletes one authorized durable namespace before replacing its live state. */\n\tpublic async resetSession(sessionId: string, clearAuxiliaryState?: () => void): Promise<void> {\n\t\tconst canonicalSessionId = asSessionId(sessionId);\n\t\tthis._authorizeExistingSession(canonicalSessionId, this._getCurrentOwner());\n\t\tawait this._lifecycle.withSessionReset(canonicalSessionId, async () => {\n\t\t\tconst reset = async (): Promise<void> =>\n\t\t\t\tawait this.resetSessionWithinExclusive(canonicalSessionId, clearAuxiliaryState);\n\t\t\tif (this._sessionLock === undefined) return await reset();\n\t\t\tawait this._sessionLock.withLock(canonicalSessionId, reset);\n\t\t});\n\t}\n\n\t/** Performs scoped reset work while its lifecycle exclusive is already owned. */\n\tpublic async resetSessionWithinExclusive(\n\t\tsessionId: SessionId,\n\t\tclearAuxiliaryState?: () => void\n\t): Promise<void> {\n\t\tconst preservedOwner = this._authorizeExistingSession(sessionId, this._getCurrentOwner());\n\t\tawait this._resetCoordinator.resetSession(\n\t\t\tsessionId,\n\t\t\tpreservedOwner,\n\t\t\tclearAuxiliaryState ??\n\t\t\t\t(this._clearSessionAuxiliaryState === undefined\n\t\t\t\t\t? undefined\n\t\t\t\t\t: () => this._clearSessionAuxiliaryState?.(sessionId))\n\t\t);\n\t\tthis._referenceIndex.clearSession(sessionId);\n\t}\n\n\t/** Awaitably deletes all durable namespaces from a trusted ownerless context. */\n\tpublic async resetAll(clearAuxiliaryState?: () => void): Promise<void> {\n\t\tthis._assertOwnerlessResetAll();\n\t\tawait this._lifecycle.withGlobalReset(\n\t\t\tasync () => await this.resetAllWithinExclusive(clearAuxiliaryState)\n\t\t);\n\t}\n\n\t/** Performs global reset work while its lifecycle exclusive is already owned. */\n\tpublic async resetAllWithinExclusive(clearAuxiliaryState?: () => void): Promise<void> {\n\t\tthis._assertOwnerlessResetAll();\n\t\tawait this._resetCoordinator.resetAll(clearAuxiliaryState ?? this._clearAllAuxiliaryState);\n\t\tthis._referenceIndex.clearAll();\n\t}\n\n\tpublic getSessionIds(): string[] {\n\t\treturn Array.from(this._sessions.keys());\n\t}\n\n\tpublic getSessionCount(): number {\n\t\treturn this._sessions.size;\n\t}\n\n\tprivate _restoredState(restored: RestoredSession): SessionState {\n\t\tconst session = this._createSessionState(undefined, 'restored');\n\t\tsession.verificationTargets = reconstructVerificationTargets(\n\t\t\trestored.sessionId,\n\t\t\trestored.history,\n\t\t\trestored.branches\n\t\t);\n\t\tfor (let index = restored.history.length - 1; index >= 0; index--) {\n\t\t\tconst thought = restored.history[index];\n\t\t\tif (thought === undefined) continue;\n\t\t\tif (session.availableMcpTools === undefined && thought.available_mcp_tools !== undefined) {\n\t\t\t\tsession.availableMcpTools = [...thought.available_mcp_tools];\n\t\t\t}\n\t\t\tif (session.availableSkills === undefined && thought.available_skills !== undefined) {\n\t\t\t\tsession.availableSkills = [...thought.available_skills];\n\t\t\t}\n\t\t\tif (session.availableMcpTools !== undefined && session.availableSkills !== undefined) break;\n\t\t}\n\t\tsession.thought_history = restored.history.slice(-this._maxHistorySize);\n\t\tconst retainedStart = Math.max(0, restored.branches.length - this._maxBranches);\n\t\tconst retainedBranches = restored.branches.slice(retainedStart);\n\t\tfor (const branch of restored.branches.slice(0, retainedStart)) {\n\t\t\tsession.pendingRestoreBranchDeletes.add(branch.branchId);\n\t\t}\n\t\tfor (const branch of retainedBranches) {\n\t\t\tsession.branchIdentities.add(branch.branchId);\n\t\t\tsession.branches[branch.branchId] = branch.thoughts.slice(-this._maxBranchSize);\n\t\t}\n\t\tthis._pruneVerificationTargets(session);\n\t\treturn session;\n\t}\n\n\t/** Loads and atomically commits every authoritative persistence namespace. Call at init. */\n\tpublic async loadFromPersistence(): Promise<void> {\n\t\tif (!this._persistenceEnabled || !this._persistence) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst restored = await stagePersistenceRestore(this._persistence);\n\t\tconst sessions = restored.sessions.map(\n\t\t\t(session) => [session.sessionId, this._restoredState(session)] as const\n\t\t);\n\t\tconst referenceIndex = new ThoughtReferenceIndex();\n\t\tconst retainedThoughtIds = new Map<SessionId, ReadonlySet<ThoughtId>>();\n\t\tconst retainedBranchThoughtIds = new Map<SessionId, ReadonlySet<ThoughtId>>();\n\t\tfor (const [sessionId, session] of sessions) {\n\t\t\tconst retained = [session.thought_history, ...Object.values(session.branches)].flat();\n\t\t\treferenceIndex.replaceSession(sessionId, retained);\n\t\t\tretainedThoughtIds.set(\n\t\t\t\tsessionId,\n\t\t\t\tnew Set(retained.flatMap((thought) => (thought.id === undefined ? [] : [thought.id])))\n\t\t\t);\n\t\t\tretainedBranchThoughtIds.set(\n\t\t\t\tsessionId,\n\t\t\t\tnew Set(\n\t\t\t\t\tObject.values(session.branches).flatMap((branch) =>\n\t\t\t\t\t\tbranch.flatMap((thought) => (thought.id === undefined ? [] : [thought.id]))\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tthis._persistenceBuffer?.replaceDurableThoughtIdentities(restored.sessions);\n\n\t\tthis._edgeStore?.clearAll();\n\t\tthis._summaryStore?.clearAll();\n\t\tthis._sessions.clear();\n\t\tfor (const [sessionId, session] of sessions) this._sessions.set(sessionId, session);\n\t\tthis._referenceIndex = referenceIndex;\n\t\tfor (const session of restored.sessions) {\n\t\t\tconst retainedIds = retainedThoughtIds.get(session.sessionId) ?? new Set<ThoughtId>();\n\t\t\tconst retainedBranchIds =\n\t\t\t\tretainedBranchThoughtIds.get(session.sessionId) ?? new Set<ThoughtId>();\n\t\t\tfor (const edge of session.edges) {\n\t\t\t\tif (!retainedIds.has(edge.from) || !retainedIds.has(edge.to)) continue;\n\t\t\t\tif (edge.kind === 'branch' && !retainedBranchIds.has(edge.to)) continue;\n\t\t\t\tthis._edgeStore?.addEdge(edge);\n\t\t\t}\n\t\t\tfor (const summary of session.summaries) this._summaryStore?.add(summary);\n\t\t}\n\t\tthis.log(`Restored ${restored.sessions.length} persistence namespaces`);\n\t}\n\n\tpublic isPersistenceEnabled(): boolean {\n\t\treturn this._persistenceEnabled;\n\t}\n\n\tpublic getPersistenceBackend(): PersistenceBackend | null {\n\t\treturn this._persistence;\n\t}\n\n\t/** Sets the event emitter for persistence error events (post-construction wiring). */\n\tpublic setEventEmitter(emitter: PersistenceEventEmitter): void {\n\t\tthis._eventEmitter = emitter;\n\t\tthis._persistenceBuffer?.setEventEmitter(emitter);\n\t}\n\n\t/**\n\t * Binds shutdown to the resource owner responsible for the complete cleanup sequence.\n\t *\n\t * @internal\n\t * @param owner - Callback returning the owner's memoized shutdown promise.\n\t * @throws {TypeError} When a shutdown owner has already been bound.\n\t */\n\tpublic bindShutdownOwner(owner: () => Promise<void>): void {\n\t\tif (this._shutdownOwner !== null) {\n\t\t\tthrow new TypeError('HistoryManager shutdown owner is already bound');\n\t\t}\n\t\tthis._shutdownOwner = owner;\n\t}\n\n\t/** Stops timers, drains writes, and clears live state under one memoized lifecycle settlement. */\n\tpublic shutdown(): Promise<void> {\n\t\tif (this._shutdownOwner !== null) return this._shutdownOwner();\n\t\treturn this._lifecycle.shutdown(async () => {\n\t\t\tawait this.shutdownWithinLifecycle();\n\t\t\tthis.clearLiveStateAfterShutdown();\n\t\t});\n\t}\n\n\t/** Stops timers and drains writes while the caller owns global shutdown. */\n\tpublic async shutdownWithinLifecycle(): Promise<void> {\n\t\tthis._stopFlushTimer();\n\t\tthis._sessionManager.stopCleanupTimer();\n\t\tawait this._flushBuffer();\n\t}\n\n\t/** Clears non-durable state after every shutdown resource has closed successfully. */\n\tpublic clearLiveStateAfterShutdown(): void {\n\t\tfor (const sessionId of this._sessions.keys()) {\n\t\t\tthis._persistenceBuffer?.forgetQuiescentSession(sessionId);\n\t\t}\n\t\tthis._sessions.clear();\n\t\tthis._referenceIndex.clearAll();\n\t\tthis._edgeStore?.clearAll();\n\t\tthis._summaryStore?.clearAll();\n\t\tthis._clearAllAuxiliaryState?.();\n\t}\n\n\t/** Number of coordinator-owned thought writes not yet acknowledged successful. */\n\tpublic getWriteBufferLength(): number {\n\t\treturn this._persistenceBuffer?.pendingThoughtCount ?? 0;\n\t}\n}\n"],"names":["ABSOLUTE_MAX_HISTORY_SIZE","HistoryManager","Map","ThoughtReferenceIndex","config","NullLogger","requestedMaxSize","Math","SessionLifecycleCoordinator","EdgeEmitter","SessionManager","PersistenceBuffer","resetDurability","SessionResetCoordinator","owner","sessionId","sessionIds","Promise","session","undefined","summaries","message","meta","getOwner","key","asSessionId","existing","Date","SessionAccessDeniedError","victims","MaxSessionsReachedError","evicted","persistenceState","results","failures","result","AggregateError","provenance","Set","sessionOwner","firstSessionId","SequentialThinkingError","ERROR_CODES","thought","context","ValidationError","resolvedReferences","edgeAdded","evictedBranchIds","prunedEdges","resolved","resolveThoughtReferencesForAdmission","thoughtNumber","InvalidBacktrackError","branchId","references","targetId","resolvedVerificationTarget","retainedIds","Object","verifierId","retainedBranchThoughtIds","backtrackTargetThoughtId","buffer","ordinaryDeletes","branch","branchIdsToDelete","t","branchThoughts","retained","branchCount","identitiesToRemove","Array","branchesToDelete","removed","opts","history","policy","DehydrationPolicy","canonicalSessionId","thoughts","clearAuxiliaryState","reset","preservedOwner","restored","reconstructVerificationTargets","index","retainedStart","retainedBranches","stagePersistenceRestore","sessions","referenceIndex","retainedThoughtIds","retainedBranchIds","edge","summary","emitter","TypeError"],"mappings":";;;;;;;;;;;;;;;;AAqDO,MAAMA,4BAA4B;AA4DlC,MAAMC;IACZ,OAAwB,iBAAiB,QAAe;IACxD,OAAwB,eAAe,IAAI;IACnC,YAA0C,IAAIC,MAAM;IACpD,gBAAwB;IACxB,aAAqB;IACrB,eAAuB;IACvB,QAAgB;IAChB,aAAwC;IACxC,oBAA6B;IAC7B,SAAoB;IAEpB,WAAwB;IACxB,cAA8B;IAC9B,UAAmB;IAEnB,cAA8C;IAErC,aAA0B;IACnC,kBAAkB,IAAIC,wBAAwB;IAC9C,mBAA6C;IACpC,gBAA8C;IAC9C,kBAAyD;IACzD,aAA4B;IAC5B,WAAwC;IACjD,iBAA+C,KAAK;IAC3C,4BAA6D;IAC7D,wBAAqC;IAEtD,YAAYC,SAA+B,CAAC,CAAC,CAAE;QAC9C,IAAI,CAAC,OAAO,GAAGA,OAAO,MAAM,IAAI,IAAIC;QACpC,MAAMC,mBAAmBF,OAAO,cAAc,IAAI;QAClD,IAAI,CAAC,eAAe,GAAGG,KAAK,GAAG,CAACD,kBAAkBN;QAClD,IAAIM,mBAAmBN,2BACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,mDAAmD;YACpE,WAAWM;YACX,SAASN;QACV;QAED,IAAI,CAAC,YAAY,GAAGI,OAAO,WAAW,IAAI;QAC1C,IAAI,CAAC,cAAc,GAAGA,OAAO,aAAa,IAAI;QAC9C,IAAI,CAAC,YAAY,GAAGA,OAAO,WAAW,IAAI;QAC1C,IAAI,CAAC,mBAAmB,GAAG,AAAsB,SAAtB,IAAI,CAAC,YAAY;QAC5C,IAAI,CAAC,QAAQ,GAAGA,OAAO,OAAO;QAC9B,IAAI,CAAC,aAAa,GAAGA,OAAO,YAAY,IAAI;QAC5C,IAAI,CAAC,UAAU,GAAGA,OAAO,SAAS;QAClC,IAAI,CAAC,aAAa,GAAGA,OAAO,YAAY;QACxC,IAAI,CAAC,SAAS,GAAGA,OAAO,QAAQ,IAAI;QACpC,IAAI,CAAC,YAAY,GAAGA,OAAO,WAAW;QACtC,IAAI,CAAC,UAAU,GAAGA,OAAO,oBAAoB,IAAI,IAAII;QACrD,IAAI,CAAC,2BAA2B,GAAGJ,OAAO,0BAA0B;QACpE,IAAI,CAAC,uBAAuB,GAAGA,OAAO,sBAAsB;QAG5D,IAAI,CAAC,YAAY,GAAG,IAAIK,YAAY;YACnC,WAAW,IAAI,CAAC,UAAU;YAC1B,UAAU,IAAI,CAAC,SAAS;YACxB,QAAQ,IAAI,CAAC,OAAO;QACrB;QAEA,IAAI,CAAC,eAAe,GAAG,IAAIC,eAA6B;YACvD,cAAcT,eAAe,cAAc;YAC3C,mBAAmB;YACnB,gBAAgB,IAAMA,eAAe,YAAY;YACjD,qBAAqBG,OAAO,mBAAmB,IAAI;YACnD,QAAQ,IAAI,CAAC,OAAO;QACrB;QAEA,IAAI,CAAC,kBAAkB,GAAG;QAC1B,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,YAAY,EAAE;YAClD,IAAI,CAAC,kBAAkB,GAAG,IAAIO,kBAAkB;gBAC/C,aAAa,IAAI,CAAC,YAAY;gBAC9B,YAAYP,OAAO,qBAAqB,IAAI;gBAC5C,eAAeA,OAAO,wBAAwB,IAAI;gBAClD,YAAYA,OAAO,qBAAqB,IAAI;gBAC5C,oBAAoBA,OAAO,sBAAsB,IAAIJ;gBACrD,iBAAiBI,OAAO,eAAe,IAAI;gBAC3C,cAAc,IAAI,CAAC,aAAa;gBAChC,QAAQ,IAAI,CAAC,OAAO;YACrB;YACA,IAAI,CAAC,gBAAgB;QACtB;QACA,MAAMQ,kBACL,AAAsB,SAAtB,IAAI,CAAC,YAAY,IAAa,AAA4B,SAA5B,IAAI,CAAC,kBAAkB,GAClD;YAAE,aAAa;YAAM,SAAS;QAAK,IACnC;YAAE,aAAa,IAAI,CAAC,YAAY;YAAE,SAAS,IAAI,CAAC,kBAAkB;QAAC;QACvE,IAAI,CAAC,iBAAiB,GAAG,IAAIC,wBAAwB;YACpD,GAAGD,eAAe;YAClB,WAAW,IAAI,CAAC,UAAU;YAC1B,cAAc,IAAI,CAAC,aAAa;YAChC,UAAU,IAAI,CAAC,SAAS;YACxB,oBAAoB,CAACE,QAAU,IAAI,CAAC,mBAAmB,CAACA;YACxD,QAAQ,IAAI,CAAC,OAAO;QACrB;QAEA,IAAI,CAAC,eAAe,CAAC,iBAAiB,CACrC,IAAI,CAAC,SAAS,EACd,CAACC,YAAc,IAAI,CAAC,sBAAsB,CAACA,YAC3C,CAACC,aAAe,IAAI,CAAC,cAAc,CAACA;IAEtC;IAIA,IAAY,cAAqD;QAChE,OAAO,IAAI,CAAC,kBAAkB,EAAE,SAAS;IAC1C;IAEQ,mBAAyB;QAChC,IAAI,CAAC,kBAAkB,EAAE;IAC1B;IAEQ,kBAAwB;QAC/B,IAAI,AAAqB,SAArB,IAAI,CAAC,WAAW,EAAW;QAC/B,IAAI,CAAC,kBAAkB,EAAE;IAC1B;IAGO,eAA8B;QACpC,IAAI,CAAC,oCAAoC;QACzC,OAAO,IAAI,CAAC,kBAAkB,EAAE,WAAWC,QAAQ,OAAO;IAC3D;IAQO,aAAaF,SAAoB,EAAiB;QACxD,MAAMG,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAACH;QACnC,IAAIG,AAAYC,WAAZD,SAAuB,IAAI,CAAC,iCAAiC,CAACH,WAAWG;QAC7E,OAAO,IAAI,CAAC,kBAAkB,EAAE,aAAaH,cAAcE,QAAQ,OAAO;IAC3E;IAQO,gBAAgBF,SAAoB,EAAEK,SAA6B,EAAQ;QACjF,IAAI,CAAC,UAAU,CAAC,WAAW,CAACL,WAAW;YACtC,IAAI,CAAC,kBAAkB,EAAE,gBAAgBA,WAAWK;YACpD,MAAMF,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAACH;YACnC,IAAIG,AAAYC,WAAZD,SAAuB,IAAI,CAAC,iCAAiC,CAACH,WAAWG;QAC9E;IACD;IAGO,eAAuC;QAC7C,OAAO,IAAI,CAAC,UAAU;IACvB;IAEQ,IAAIG,OAAe,EAAEC,IAA8B,EAAQ;QAClE,IAAI,CAAC,OAAO,CAAC,IAAI,CAACD,SAASC;IAC5B;IAGQ,mBAAuC;QAC9C,OAAOC;IACR;IAWQ,YAAYR,SAAiB,EAAED,KAAc,EAAgB;QACpE,MAAMU,MAAMC,YAAYV;QACxB,MAAMW,WAAW,IAAI,CAAC,SAAS,CAAC,GAAG,CAACF;QACpC,IAAIE,AAAaP,WAAbO,UAAwB;YAC3B,IAAI,CAAC,mBAAmB,CAACF,KAAKE,UAAUZ;YACxCY,SAAS,cAAc,GAAGC,KAAK,GAAG;YAClC,OAAOD;QACR;QACA,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAACF,KAAK,IAAM,IAAI,CAAC,0BAA0B,CAACA,KAAKV;IACpF;IAEQ,2BAA2BU,GAAc,EAAEV,KAAc,EAAgB;QAChF,IAAII,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAACM;QACjC,IAAKN,SAKJ,IAAI,CAAC,mBAAmB,CAACM,KAAKN,SAASJ;aAL1B;YACb,IAAI,CAAC,uBAAuB,CAACA;YAC7BI,UAAU,IAAI,CAAC,mBAAmB,CAACJ;YACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAACU,KAAKN;QACzB;QAGAA,QAAQ,cAAc,GAAGS,KAAK,GAAG;QACjC,OAAOT;IACR;IAEQ,oBACPH,SAAoB,EACpBG,OAAqB,EACrBJ,KAAyB,EAClB;QACP,IAAIA,AAAUK,WAAVL,OAAqB;QACzB,IAAII,AAAuB,eAAvBA,QAAQ,UAAU,EACrB,MAAM,IAAIU,yBAAyBb,WAAW,eAAeD;QAE9D,IAAII,AAAkBC,WAAlBD,QAAQ,KAAK,IAAkBA,QAAQ,KAAK,KAAKJ,OACpD,MAAM,IAAIc,yBAAyBb,WAAWG,QAAQ,KAAK,EAAEJ;QAE9D,IAAII,AAAkBC,WAAlBD,QAAQ,KAAK,EAAgBA,QAAQ,KAAK,GAAGJ;IAClD;IAEQ,wBAAwBA,KAAyB,EAAQ;QAChE,MAAMe,UAAU,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAC5D,IAAI,CAAC,SAAS,EACdf,OACA,CAACC,YAAc,IAAI,CAAC,2BAA2B,CAACA;QAEjD,IAAIc,AAAYV,WAAZU,SAAuB,MAAM,IAAIC,wBAAwB7B,eAAe,YAAY;QACxF,IAAI4B,AAAmB,MAAnBA,QAAQ,MAAM,EAAQ;QAC1B,MAAME,UAAU,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAACF,SAAS,CAACb;YAC9D,IAAIA,WAAW,IAAI,CAAC,CAACD,YAAc,CAAC,IAAI,CAAC,uBAAuB,CAACA,aAChE,MAAM,IAAIe,wBAAwB7B,eAAe,YAAY;YAE9D,KAAK,MAAMc,aAAaC,WAAY,IAAI,CAAC,kBAAkB,CAACD;QAC7D;QACA,IAAI,CAACgB,SAAS,MAAM,IAAID,wBAAwB7B,eAAe,YAAY;IAC5E;IAEQ,4BAA4Bc,SAAoB,EAAW;QAClE,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAACA,cAAc,IAAI,CAAC,uBAAuB,CAACA;IAC1E;IAEQ,uBAAuBA,SAAoB,EAAW;QAC7D,MAAMiB,mBACL,IAAI,CAAC,kBAAkB,EAAE,qBAAqBjB,cAAc;QAC7D,OACC,IAAI,CAAC,UAAU,CAAC,MAAM,CAACA,cACvBiB,AAAqB,aAArBA,oBACAA,AAAqB,cAArBA;IAEF;IAEQ,wBAAwBjB,SAAoB,EAAW;QAC9D,OACE,KAAI,CAAC,kBAAkB,EAAE,qBAAqBA,cAAc,WAAU,MAAO;IAEhF;IAEA,MAAc,eAAeC,UAAgC,EAAiB;QAC7E,MAAMiB,UAAU,MAAMhB,QAAQ,UAAU,CACvCD,WAAW,GAAG,CAAC,CAACD,YAAc,IAAI,CAAC,aAAa,CAACA;QAElD,MAAMmB,WAAWD,QAAQ,OAAO,CAAC,CAACE,SACjCA,AAAkB,eAAlBA,OAAO,MAAM,GAAkB;gBAACA,OAAO,MAAM;aAAC,GAAG,EAAE;QAEpD,IAAID,SAAS,MAAM,GAAG,GAAG,MAAM,IAAIE,eAAeF,UAAU;IAC7D;IAEQ,cAAcnB,SAAoB,EAAiB;QAC1D,OAAO,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAACA,WAAW;YACrD,IAAI,AAA4B,SAA5B,IAAI,CAAC,kBAAkB,EAAW,YACrC,IAAI,CAAC,kBAAkB,CAACA;YAGzB,MAAMG,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAACH;YACnC,IAAIG,AAAYC,WAAZD,SAAuB,IAAI,CAAC,iCAAiC,CAACH,WAAWG;YAC7E,MAAM,IAAI,CAAC,kBAAkB,CAAC,0BAA0B,CAACH,WAAW;gBACnE,IAAI,CAAC,kBAAkB,CAACA;YACzB;QACD;IACD;IAEQ,mBAAmBA,SAAoB,EAAQ;QACtD,IAAI,CAAC,2BAA2B,GAAGA;QACnC,IAAI,CAAC,UAAU,EAAE,aAAaA;QAC9B,IAAI,CAAC,aAAa,EAAE,aAAaA;QACjC,IAAI,CAAC,eAAe,CAAC,YAAY,CAACA;QAClC,IAAI,CAAC,SAAS,CAAC,MAAM,CAACA;QACtB,IAAI,CAAC,kBAAkB,EAAE,uBAAuBA;IACjD;IAEQ,oBAAoBD,KAAc,EAAEuB,UAAuB,EAAgB;QAClF,OAAO;YACN,iBAAiB,EAAE;YACnB,UAAU,CAAC;YACX,qBAAqB,IAAInC;YACzB,mBAAmBiB;YACnB,iBAAiBA;YACjB,gBAAgBQ,KAAK,GAAG;YACxB,kBAAkB,IAAIW;YACtB,6BAA6B,IAAIA;YACjCxB;YACAuB;QACD;IACD;IAEQ,0BACPtB,SAAoB,EACpBD,KAAyB,EACJ;QACrB,MAAMyB,eAAe,IAAI,CAAC,SAAS,CAAC,GAAG,CAACxB,YAAY;QACpD,IAAID,AAAUK,WAAVL,SAAuB,IAAI,CAAC,SAAS,CAAC,GAAG,CAACC,YAAY,eAAe,YACxE,MAAM,IAAIa,yBAAyBb,WAAW,eAAeD;QAE9D,IAAIA,AAAUK,WAAVL,SAAuByB,AAAiBpB,WAAjBoB,gBAA8BA,iBAAiBzB,OACzE,MAAM,IAAIc,yBAAyBb,WAAWwB,cAAczB;QAE7D,OAAOyB,gBAAgBzB;IACxB;IAEQ,2BAAiC;QACxC,MAAMA,QAAQ,IAAI,CAAC,gBAAgB;QACnC,IAAIA,AAAUK,WAAVL,OAAqB;QACzB,MAAM0B,iBAAiB,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,GAAG,KAAK;QACzD,IAAIA,AAAmBrB,WAAnBqB,gBACH,MAAM,IAAIZ,yBAAyBY,gBAAgB,6BAA6B1B;QAEjF,MAAM,IAAI2B,wBACT,CAAC,gFAAgF,EAAE3B,MAAM,CAAC,CAAC,EAC3F4B,YAAY,qBAAqB;IAEnC;IAMO,WAAWC,OAAoB,EAAEC,OAAiC,EAAQ;QAChF,MAAM7B,YAAYU,YAAYkB,QAAQ,UAAU;QAChD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC5B,WAAW,IACtC,IAAI,CAAC,0BAA0B,CAACA,WAAW4B,SAASC;IAEtD;IAEO,+BAA+BD,OAAoB,EAAQ;QACjE,IAAIA,AAAexB,WAAfwB,QAAQ,EAAE,EAAgB;QAC9B,MAAM5B,YAAYU,YAAYkB,QAAQ,UAAU;QAChD,IAAI,CAAC,yBAAyB,CAAC5B,WAAW,IAAI,CAAC,gBAAgB;QAC/D,IACC,IAAI,CAAC,eAAe,CAAC,GAAG,CAACA,WAAW4B,QAAQ,EAAE,KAC9C,IAAI,CAAC,kBAAkB,EAAE,mBAAmB5B,WAAW4B,QAAQ,EAAE,MAAM,MAEvE,MAAM,IAAIE,gBAAgB,MAAM,CAAC,sCAAsC,EAAEF,QAAQ,EAAE,EAAE;IAEvF;IAEQ,2BACP5B,SAAoB,EACpB4B,OAAoB,EACpBC,OAAiC,EAC1B;QACP,IAAI,CAAC,kBAAkB,EAAE,2BAA2B7B;QACpD,MAAMD,QAAQ,IAAI,CAAC,gBAAgB;QACnC,IAAI,CAAC,yBAAyB,CAACC,WAAWD;QAC1C,IAAI,CAAC,8BAA8B,CAAC6B;QACpC,MAAMG,qBAAqB,IAAI,CAAC,2BAA2B,CAAC/B,WAAW4B,SAASC;QAChF,MAAM1B,UAAU,IAAI,CAAC,0BAA0B,CAACH,WAAWD;QAC3D,IAAI,CAAC,QAAQ,EAAE,QACd,0BACA,GACA,CAAC,GACD;QAGDI,QAAQ,eAAe,CAAC,IAAI,CAACyB;QAC7B,IAAI,CAAC,yBAAyB,CAACzB,SAASyB,SAASG;QAIjD,IAAIA,AAAgD3B,WAAhD2B,mBAAmB,wBAAwB,EAC9C,IAAI,CAAC,gBAAgB,CAAC5B,SAAS4B,mBAAmB,wBAAwB;QAI3E,IAAIH,QAAQ,mBAAmB,EAC9BzB,QAAQ,iBAAiB,GAAGyB,QAAQ,mBAAmB;QAExD,IAAIA,QAAQ,gBAAgB,EAC3BzB,QAAQ,eAAe,GAAGyB,QAAQ,gBAAgB;QAGnD,IAAIA,QAAQ,mBAAmB,IAAIA,QAAQ,SAAS,EACnD,IAAI,CAAC,mBAAmB,CAACzB,SAASyB,QAAQ,SAAS,EAAEA;QAGtD,IAAIA,QAAQ,mBAAmB,EAAE,UAAUA,QAAQ,gBAAgB,EAAE,QACpE,IAAI,CAAC,QAAQ,EAAE,QACd,kCACA,GACA,CAAC,GACD;QAIF,MAAMI,YAAY,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC7B,SAASyB,SAAS;YACzE,GAAGC,OAAO;YACVE;QACD;QACA,MAAME,mBAAmB,IAAI,CAAC,iBAAiB,CAAC9B,SAASyB,QAAQ,SAAS;QAC1E,IAAI,CAAC,yBAAyB,CAACzB;QAC/B,IAAI,CAAC,sBAAsB,CAACH,WAAWG;QACvC,MAAM+B,cAAc,IAAI,CAAC,qBAAqB,CAAClC,WAAWG;QAC1D,IAAI,CAAC,oBAAoB,CACxBH,WACAG,SACAyB,SACAK,kBACAD,WACAE,aACAH,mBAAmB,wBAAwB;IAE7C;IAEQ,4BACP/B,SAAoB,EACpB4B,OAAoB,EACpBC,OAAiC,EAC4B;QAC7D,MAAMM,WACLN,SAAS,sBACTO,qCAAqCR,SAAS,CAACS,gBAC9C,IAAI,CAAC,eAAe,CAAC,OAAO,CAACrC,WAAWqC;QAE1C,IACCT,AAAyB,gBAAzBA,QAAQ,YAAY,IACpBA,AAA6BxB,WAA7BwB,QAAQ,gBAAgB,IACxBO,AAAsC/B,WAAtC+B,SAAS,wBAAwB,EAEjC,MAAM,IAAIG,sBACT,CAAC,iBAAiB,EAAEV,QAAQ,gBAAgB,CAAC,8BAA8B,CAAC;QAG9E,OAAOO;IACR;IAEQ,kBACPhC,OAAqB,EACrBoC,QAA8B,EACR;QACtB,IAAIpC,QAAQ,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE;YAC1DA,QAAQ,eAAe,GAAGA,QAAQ,eAAe,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe;YAC7E,IAAI,CAAC,GAAG,CAAC,CAAC,mBAAmB,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE;gBAC5D,SAAS,IAAI,CAAC,eAAe;YAC9B;QACD;QACA,IAAIoC,AAAanC,WAAbmC,UAAwB,IAAI,CAAC,sBAAsB,CAACpC,SAASoC;QACjE,OAAO,IAAI,CAAC,uBAAuB,CAACpC;IACrC;IAEQ,0BACPA,OAAqB,EACrByB,OAAoB,EACpBY,UAAsE,EAC/D;QACP,MAAMC,WAAWC,2BAA2Bd,SAASY;QACrD,IAAIZ,AAAexB,WAAfwB,QAAQ,EAAE,IAAkBa,AAAarC,WAAbqC,UAC/BtC,QAAQ,mBAAmB,CAAC,GAAG,CAACyB,QAAQ,EAAE,EAAEa;IAE9C;IAEQ,0BAA0BtC,OAAqB,EAAQ;QAC9D,MAAMwC,cAAc,IAAIpB,IACvB;YAACpB,QAAQ,eAAe;eAAKyC,OAAO,MAAM,CAACzC,QAAQ,QAAQ;SAAE,CAC3D,IAAI,GACJ,OAAO,CAAC,CAACyB,UAAaA,AAAexB,WAAfwB,QAAQ,EAAE,GAAiB,EAAE,GAAG;gBAACA,QAAQ,EAAE;aAAC;QAErE,KAAK,MAAM,CAACiB,YAAYJ,SAAS,IAAItC,QAAQ,mBAAmB,CAC/D,IAAI,CAACwC,YAAY,GAAG,CAACE,eAAe,CAACF,YAAY,GAAG,CAACF,WACpDtC,QAAQ,mBAAmB,CAAC,MAAM,CAAC0C;IAGtC;IAEQ,sBAAsB7C,SAAoB,EAAEG,OAAqB,EAAU;QAClF,IAAI,AAAoBC,WAApB,IAAI,CAAC,UAAU,EAAgB,OAAO;QAC1C,MAAMuC,cAAc,IAAIpB;QACxB,MAAMuB,2BAA2B,IAAIvB;QACrC,KAAK,MAAMK,WAAW;YAACzB,QAAQ,eAAe;eAAKyC,OAAO,MAAM,CAACzC,QAAQ,QAAQ;SAAE,CAAC,IAAI,GACvF,IAAIyB,AAAexB,WAAfwB,QAAQ,EAAE,EAAgBe,YAAY,GAAG,CAACf,QAAQ,EAAE;QAEzD,KAAK,MAAMA,WAAWgB,OAAO,MAAM,CAACzC,QAAQ,QAAQ,EAAE,IAAI,GACzD,IAAIyB,AAAexB,WAAfwB,QAAQ,EAAE,EAAgBkB,yBAAyB,GAAG,CAAClB,QAAQ,EAAE;QAEtE,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC5B,WAAW2C,aAAaG;IAC7D;IAEQ,qBACP9C,SAAoB,EACpBG,OAAqB,EACrByB,OAAoB,EACpBK,gBAAqC,EACrCD,SAAkB,EAClBE,WAAmB,EACnBa,wBAAoC,EAC7B;QACP,MAAMC,SAAS,IAAI,CAAC,kBAAkB;QACtC,IAAIA,AAAW,SAAXA,QAAiB;QACrB,IAAID,AAA6B3C,WAA7B2C,0BAAwCC,OAAO,aAAa,CAAChD,WAAW4B;aACvEoB,OAAO,eAAe,CAAChD,WAAW4B,SAASmB;QAChD,IACCnB,AAAsBxB,WAAtBwB,QAAQ,SAAS,IACjBmB,AAA6B3C,WAA7B2C,4BACAd,iBAAiB,MAAM,GAAG,KAC1B9B,QAAQ,2BAA2B,CAAC,IAAI,GAAG,GAE3C,IAAI,CAAC,uBAAuB,CAACH,WAAWG,SAAS8B;QAElD,IAAI,AAAoB7B,WAApB,IAAI,CAAC,UAAU,IAAmB4B,CAAAA,aAAaE,cAAc,IAChEc,OAAO,WAAW,CAAChD,WAAW,IAAI,CAAC,UAAU,CAAC,eAAe,CAACA;IAEhE;IAEQ,uCAA6C;QACpD,KAAK,MAAM,CAACA,WAAWG,QAAQ,IAAI,IAAI,CAAC,SAAS,CAChD,IAAI,CAAC,iCAAiC,CAACH,WAAWG;IAEpD;IAEQ,kCAAkCH,SAAoB,EAAEG,OAAqB,EAAQ;QAC5F,IAAIA,AAA6C,MAA7CA,QAAQ,2BAA2B,CAAC,IAAI,EAAQ;QACpD,IAAI,CAAC,uBAAuB,CAACH,WAAWG,SAAS,EAAE;IACpD;IAEQ,wBACPH,SAAoB,EACpBG,OAAqB,EACrB8C,eAAoC,EAC7B;QACP,MAAMD,SAAS,IAAI,CAAC,kBAAkB;QACtC,IAAIA,AAAW,SAAXA,QAAiB;QACrB,KAAK,MAAMT,YAAYpC,QAAQ,gBAAgB,CAAE;YAChD,MAAM+C,SAAS/C,QAAQ,QAAQ,CAACoC,SAAS;YACzC,IAAIW,AAAW9C,WAAX8C,QAAsBF,OAAO,YAAY,CAAChD,WAAWuC,UAAUW;QACpE;QACA,MAAMC,oBAAoB,IAAI5B,IAAI;eAAIpB,QAAQ,2BAA2B;eAAK8C;SAAgB;QAC9F,KAAK,MAAMV,YAAYY,kBACtB,IAAIhD,AAA+BC,WAA/BD,QAAQ,QAAQ,CAACoC,SAAS,EAAgBS,OAAO,YAAY,CAAChD,WAAWuC;QAE9EpC,QAAQ,2BAA2B,CAAC,KAAK;IAC1C;IAGQ,iBAAiBA,OAAqB,EAAEsC,QAAmB,EAAQ;QAC1E,KAAK,MAAMW,KAAKjD,QAAQ,eAAe,CACtC,IAAIiD,EAAE,EAAE,KAAKX,UAAUW,EAAE,SAAS,GAAG;QAEtC,KAAK,MAAMC,kBAAkBT,OAAO,MAAM,CAACzC,QAAQ,QAAQ,EAC1D,KAAK,MAAMiD,KAAKC,eACf,IAAID,EAAE,EAAE,KAAKX,UAAUW,EAAE,SAAS,GAAG;IAGxC;IAEQ,uBAAuBpD,SAAoB,EAAEG,OAAqB,EAAQ;QACjF,MAAMmD,WAAW;YAACnD,QAAQ,eAAe;eAAKyC,OAAO,MAAM,CAACzC,QAAQ,QAAQ;SAAE,CAAC,IAAI;QACnF,IAAI,CAAC,eAAe,CAAC,cAAc,CAACH,WAAWsD;IAChD;IAEO,wBACNtD,SAAoB,EACpBqC,aAAqB,EACQ;QAC7B,IAAI,CAAC,yBAAyB,CAACrC,WAAW,IAAI,CAAC,gBAAgB;QAC/D,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAACA,WAAWqC;IAChD;IAEQ,oBACPlC,OAAqB,EACrBoC,QAAkB,EAClBX,OAAoB,EACb;QACP,IAAI,CAACzB,QAAQ,QAAQ,CAACoC,SAAS,EAC9BpC,QAAQ,QAAQ,CAACoC,SAAS,GAAG,EAAE;QAEhCpC,QAAQ,gBAAgB,CAAC,GAAG,CAACoC;QAC7BpC,QAAQ,QAAQ,CAACoC,SAAS,CAAC,IAAI,CAACX;IACjC;IAEQ,wBAAwBzB,OAAqB,EAAuB;QAC3E,MAAMoD,cAAcpD,QAAQ,gBAAgB,CAAC,IAAI;QACjD,IAAIoD,eAAe,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE;QAC/C,MAAMC,qBAAqBC,MAAM,IAAI,CAACtD,QAAQ,gBAAgB,EAAE,KAAK,CACpE,GACAoD,cAAc,IAAI,CAAC,YAAY;QAEhC,MAAMG,mBAA+B,EAAE;QACvC,KAAK,MAAMnB,YAAYiB,mBAAoB;YAC1CrD,QAAQ,gBAAgB,CAAC,MAAM,CAACoC;YAChC,IAAIpC,AAA+BC,WAA/BD,QAAQ,QAAQ,CAACoC,SAAS,EAAgBmB,iBAAiB,IAAI,CAACnB;YACpE,OAAOpC,QAAQ,QAAQ,CAACoC,SAAS;YACjC,IAAI,CAAC,GAAG,CAAC,CAAC,oBAAoB,EAAEA,UAAU,EAAE;gBAAEA;YAAS;QACxD;QACA,OAAOmB;IACR;IAEQ,uBAAuBvD,OAAqB,EAAEoC,QAAkB,EAAQ;QAC/E,MAAMW,SAAS/C,QAAQ,QAAQ,CAACoC,SAAS;QACzC,IAAIW,AAAW9C,WAAX8C,UAAwBA,OAAO,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;YAChE,MAAMS,UAAUT,OAAO,MAAM,GAAG,IAAI,CAAC,cAAc;YACnD/C,QAAQ,QAAQ,CAACoC,SAAS,GAAGW,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc;YAC9D,IAAI,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAEX,SAAS,WAAW,EAAEoB,QAAQ,aAAa,CAAC,EAAE;gBACzEpB;gBACAoB;YACD;QACD;IACD;IAEO,WAAW3D,SAAiB,EAAiB;QACnD,OAAO,IAAI,CAAC,WAAW,CAACA,WAAW,IAAI,CAAC,gBAAgB,IAAI,eAAe;IAC5E;IAMO,mBAAmBA,SAAiB,EAAE4D,IAAyB,EAAmB;QACxF,MAAMC,UAAU,IAAI,CAAC,UAAU,CAAC7D;QAChC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,aAAa,EACzC,OAAO6D,QAAQ,KAAK;QAErB,MAAMC,SAAS,IAAIC,kBAAkB,IAAI,CAAC,aAAa;QACvD,OAAOD,OAAO,KAAK,CAACD,SAASnD,YAAYV,YAAY4D;IACtD;IAEO,iBAAiB5D,SAAiB,EAAU;QAClD,OAAO,IAAI,CAAC,WAAW,CAACA,WAAW,IAAI,CAAC,gBAAgB,IAAI,eAAe,CAAC,MAAM;IACnF;IAEO,YAAYA,SAAiB,EAAmC;QACtE,OAAO,IAAI,CAAC,WAAW,CAACA,WAAW,IAAI,CAAC,gBAAgB,IAAI,QAAQ;IACrE;IAEO,aAAaA,SAAiB,EAAc;QAClD,OAAOyD,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAACzD,WAAW,IAAI,CAAC,gBAAgB,IAAI,gBAAgB;IACxF;IAGO,eAAeA,SAAiB,EAA0B;QAChE,MAAMgE,qBAAqBtD,YAAYV;QACvC,IAAI,CAAC,yBAAyB,CAACgE,oBAAoB,IAAI,CAAC,gBAAgB;QACxE,MAAM7D,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC6D;QACnC,IAAI7D,AAAYC,WAAZD,SACH,OAAO;YACN,SAAS,EAAE;YACX,UAAU,CAAC;YACX,qBAAqB,IAAIhB;YACzB,WAAW,EAAE;YACb,mBAAmBiB;YACnB,iBAAiBA;QAClB;QAED,OAAO;YACN,SAAS;mBAAID,QAAQ,eAAe;aAAC;YACrC,UAAUyC,OAAO,WAAW,CAC3BA,OAAO,OAAO,CAACzC,QAAQ,QAAQ,EAAE,GAAG,CAAC,CAAC,CAACoC,UAAU0B,SAAS,GAAK;oBAAC1B;oBAAU;2BAAI0B;qBAAS;iBAAC;YAEzF,qBAAqB,IAAI9E,IAAIgB,QAAQ,mBAAmB;YACxD,WAAWsD,MAAM,IAAI,CAACtD,QAAQ,gBAAgB;YAC9C,mBACCA,AAA8BC,WAA9BD,QAAQ,iBAAiB,GAAiBC,SAAY;mBAAID,QAAQ,iBAAiB;aAAC;YACrF,iBACCA,AAA4BC,WAA5BD,QAAQ,eAAe,GAAiBC,SAAY;mBAAID,QAAQ,eAAe;aAAC;QAClF;IACD;IAGO,eAAeH,SAAiB,EAAEuC,QAAkB,EAAQ;QAClE,IAAI,AAAoB,YAApB,OAAOA,YAAyBA,AAAoB,MAApBA,SAAS,MAAM,EAClD,MAAM,IAAIT,gBAAgB,aAAa;QAExC,MAAMkC,qBAAqBtD,YAAYV;QACvC,IAAI,CAAC,UAAU,CAAC,WAAW,CAACgE,oBAAoB;YAC/C,IAAI,CAAC,kBAAkB,EAAE,2BAA2BA;YACpD,MAAM7D,UAAU,IAAI,CAAC,0BAA0B,CAAC6D,oBAAoB,IAAI,CAAC,gBAAgB;YACzF,IAAI7D,QAAQ,gBAAgB,CAAC,GAAG,CAACoC,WAChC,MAAM,IAAIT,gBAAgB,aAAa,CAAC,uBAAuB,EAAES,UAAU;YAE5EpC,QAAQ,gBAAgB,CAAC,GAAG,CAACoC;YAC7B,MAAMN,mBAAmB,IAAI,CAAC,uBAAuB,CAAC9B;YACtD,IAAI,CAAC,sBAAsB,CAAC6D,oBAAoB7D;YAChD,MAAM+B,cAAc,IAAI,CAAC,qBAAqB,CAAC8B,oBAAoB7D;YACnE,IAAI8B,iBAAiB,MAAM,GAAG,KAAK9B,QAAQ,2BAA2B,CAAC,IAAI,GAAG,GAC7E,IAAI,CAAC,uBAAuB,CAAC6D,oBAAoB7D,SAAS8B;YAE3D,IAAI,AAAoB7B,WAApB,IAAI,CAAC,UAAU,IAAkB8B,cAAc,GAClD,IAAI,CAAC,kBAAkB,EAAE,YACxB8B,oBACA,IAAI,CAAC,UAAU,CAAC,eAAe,CAACA;YAGlC,IAAI,CAAC,GAAG,CAAC,qBAAqB;gBAAEzB;gBAAUvC;YAAU;QACrD;IACD;IAEO,aAAaA,SAAiB,EAAEuC,QAAkB,EAAW;QACnE,MAAMpC,UAAU,IAAI,CAAC,WAAW,CAACH,WAAW,IAAI,CAAC,gBAAgB;QACjE,OAAOG,QAAQ,gBAAgB,CAAC,GAAG,CAACoC;IACrC;IAEO,qBAAqBvC,SAAiB,EAAwB;QACpE,OAAO,IAAI,CAAC,WAAW,CAACA,WAAW,IAAI,CAAC,gBAAgB,IAAI,iBAAiB;IAC9E;IAEO,mBAAmBA,SAAiB,EAAwB;QAClE,OAAO,IAAI,CAAC,WAAW,CAACA,WAAW,IAAI,CAAC,gBAAgB,IAAI,eAAe;IAC5E;IAEO,UAAUuC,QAAkB,EAAEvC,SAAiB,EAA6B;QAClF,OAAO,IAAI,CAAC,WAAW,CAACA,WAAW,IAAI,CAAC,gBAAgB,IAAI,QAAQ,CAACuC,SAAS;IAC/E;IAGA,MAAa,aAAavC,SAAiB,EAAEkE,mBAAgC,EAAiB;QAC7F,MAAMF,qBAAqBtD,YAAYV;QACvC,IAAI,CAAC,yBAAyB,CAACgE,oBAAoB,IAAI,CAAC,gBAAgB;QACxE,MAAM,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAACA,oBAAoB;YAC1D,MAAMG,QAAQ,UACb,MAAM,IAAI,CAAC,2BAA2B,CAACH,oBAAoBE;YAC5D,IAAI,AAAsB9D,WAAtB,IAAI,CAAC,YAAY,EAAgB,OAAO,MAAM+D;YAClD,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAACH,oBAAoBG;QACtD;IACD;IAGA,MAAa,4BACZnE,SAAoB,EACpBkE,mBAAgC,EAChB;QAChB,MAAME,iBAAiB,IAAI,CAAC,yBAAyB,CAACpE,WAAW,IAAI,CAAC,gBAAgB;QACtF,MAAM,IAAI,CAAC,iBAAiB,CAAC,YAAY,CACxCA,WACAoE,gBACAF,uBACE,CAAqC9D,WAArC,IAAI,CAAC,2BAA2B,GAC9BA,SACA,IAAM,IAAI,CAAC,2BAA2B,GAAGJ,UAAS;QAEvD,IAAI,CAAC,eAAe,CAAC,YAAY,CAACA;IACnC;IAGA,MAAa,SAASkE,mBAAgC,EAAiB;QACtE,IAAI,CAAC,wBAAwB;QAC7B,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CACpC,UAAY,MAAM,IAAI,CAAC,uBAAuB,CAACA;IAEjD;IAGA,MAAa,wBAAwBA,mBAAgC,EAAiB;QACrF,IAAI,CAAC,wBAAwB;QAC7B,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAACA,uBAAuB,IAAI,CAAC,uBAAuB;QACzF,IAAI,CAAC,eAAe,CAAC,QAAQ;IAC9B;IAEO,gBAA0B;QAChC,OAAOT,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI;IACtC;IAEO,kBAA0B;QAChC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI;IAC3B;IAEQ,eAAeY,QAAyB,EAAgB;QAC/D,MAAMlE,UAAU,IAAI,CAAC,mBAAmB,CAACC,QAAW;QACpDD,QAAQ,mBAAmB,GAAGmE,+BAC7BD,SAAS,SAAS,EAClBA,SAAS,OAAO,EAChBA,SAAS,QAAQ;QAElB,IAAK,IAAIE,QAAQF,SAAS,OAAO,CAAC,MAAM,GAAG,GAAGE,SAAS,GAAGA,QAAS;YAClE,MAAM3C,UAAUyC,SAAS,OAAO,CAACE,MAAM;YACvC,IAAI3C,AAAYxB,WAAZwB;gBACJ,IAAIzB,AAA8BC,WAA9BD,QAAQ,iBAAiB,IAAkByB,AAAgCxB,WAAhCwB,QAAQ,mBAAmB,EACzEzB,QAAQ,iBAAiB,GAAG;uBAAIyB,QAAQ,mBAAmB;iBAAC;gBAE7D,IAAIzB,AAA4BC,WAA5BD,QAAQ,eAAe,IAAkByB,AAA6BxB,WAA7BwB,QAAQ,gBAAgB,EACpEzB,QAAQ,eAAe,GAAG;uBAAIyB,QAAQ,gBAAgB;iBAAC;gBAExD,IAAIzB,AAA8BC,WAA9BD,QAAQ,iBAAiB,IAAkBA,AAA4BC,WAA5BD,QAAQ,eAAe,EAAgB;;QACvF;QACAA,QAAQ,eAAe,GAAGkE,SAAS,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe;QACtE,MAAMG,gBAAgBhF,KAAK,GAAG,CAAC,GAAG6E,SAAS,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY;QAC9E,MAAMI,mBAAmBJ,SAAS,QAAQ,CAAC,KAAK,CAACG;QACjD,KAAK,MAAMtB,UAAUmB,SAAS,QAAQ,CAAC,KAAK,CAAC,GAAGG,eAC/CrE,QAAQ,2BAA2B,CAAC,GAAG,CAAC+C,OAAO,QAAQ;QAExD,KAAK,MAAMA,UAAUuB,iBAAkB;YACtCtE,QAAQ,gBAAgB,CAAC,GAAG,CAAC+C,OAAO,QAAQ;YAC5C/C,QAAQ,QAAQ,CAAC+C,OAAO,QAAQ,CAAC,GAAGA,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc;QAC/E;QACA,IAAI,CAAC,yBAAyB,CAAC/C;QAC/B,OAAOA;IACR;IAGA,MAAa,sBAAqC;QACjD,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,YAAY,EAClD;QAGD,MAAMkE,WAAW,MAAMK,wBAAwB,IAAI,CAAC,YAAY;QAChE,MAAMC,WAAWN,SAAS,QAAQ,CAAC,GAAG,CACrC,CAAClE,UAAY;gBAACA,QAAQ,SAAS;gBAAE,IAAI,CAAC,cAAc,CAACA;aAAS;QAE/D,MAAMyE,iBAAiB,IAAIxF;QAC3B,MAAMyF,qBAAqB,IAAI1F;QAC/B,MAAM2D,2BAA2B,IAAI3D;QACrC,KAAK,MAAM,CAACa,WAAWG,QAAQ,IAAIwE,SAAU;YAC5C,MAAMrB,WAAW;gBAACnD,QAAQ,eAAe;mBAAKyC,OAAO,MAAM,CAACzC,QAAQ,QAAQ;aAAE,CAAC,IAAI;YACnFyE,eAAe,cAAc,CAAC5E,WAAWsD;YACzCuB,mBAAmB,GAAG,CACrB7E,WACA,IAAIuB,IAAI+B,SAAS,OAAO,CAAC,CAAC1B,UAAaA,AAAexB,WAAfwB,QAAQ,EAAE,GAAiB,EAAE,GAAG;oBAACA,QAAQ,EAAE;iBAAC;YAEpFkB,yBAAyB,GAAG,CAC3B9C,WACA,IAAIuB,IACHqB,OAAO,MAAM,CAACzC,QAAQ,QAAQ,EAAE,OAAO,CAAC,CAAC+C,SACxCA,OAAO,OAAO,CAAC,CAACtB,UAAaA,AAAexB,WAAfwB,QAAQ,EAAE,GAAiB,EAAE,GAAG;wBAACA,QAAQ,EAAE;qBAAC;QAI7E;QACA,IAAI,CAAC,kBAAkB,EAAE,gCAAgCyC,SAAS,QAAQ;QAE1E,IAAI,CAAC,UAAU,EAAE;QACjB,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,SAAS,CAAC,KAAK;QACpB,KAAK,MAAM,CAACrE,WAAWG,QAAQ,IAAIwE,SAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC3E,WAAWG;QAC3E,IAAI,CAAC,eAAe,GAAGyE;QACvB,KAAK,MAAMzE,WAAWkE,SAAS,QAAQ,CAAE;YACxC,MAAM1B,cAAckC,mBAAmB,GAAG,CAAC1E,QAAQ,SAAS,KAAK,IAAIoB;YACrE,MAAMuD,oBACLhC,yBAAyB,GAAG,CAAC3C,QAAQ,SAAS,KAAK,IAAIoB;YACxD,KAAK,MAAMwD,QAAQ5E,QAAQ,KAAK,CAC/B,IAAI,AAACwC,YAAY,GAAG,CAACoC,KAAK,IAAI,KAAMpC,YAAY,GAAG,CAACoC,KAAK,EAAE,GAC3D;gBAAA,IAAIA,AAAc,aAAdA,KAAK,IAAI,IAAkBD,kBAAkB,GAAG,CAACC,KAAK,EAAE,GAC5D,IAAI,CAAC,UAAU,EAAE,QAAQA;YAD8C;YAGxE,KAAK,MAAMC,WAAW7E,QAAQ,SAAS,CAAE,IAAI,CAAC,aAAa,EAAE,IAAI6E;QAClE;QACA,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,EAAEX,SAAS,QAAQ,CAAC,MAAM,CAAC,uBAAuB,CAAC;IACvE;IAEO,uBAAgC;QACtC,OAAO,IAAI,CAAC,mBAAmB;IAChC;IAEO,wBAAmD;QACzD,OAAO,IAAI,CAAC,YAAY;IACzB;IAGO,gBAAgBY,OAAgC,EAAQ;QAC9D,IAAI,CAAC,aAAa,GAAGA;QACrB,IAAI,CAAC,kBAAkB,EAAE,gBAAgBA;IAC1C;IASO,kBAAkBlF,KAA0B,EAAQ;QAC1D,IAAI,AAAwB,SAAxB,IAAI,CAAC,cAAc,EACtB,MAAM,IAAImF,UAAU;QAErB,IAAI,CAAC,cAAc,GAAGnF;IACvB;IAGO,WAA0B;QAChC,IAAI,AAAwB,SAAxB,IAAI,CAAC,cAAc,EAAW,OAAO,IAAI,CAAC,cAAc;QAC5D,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC/B,MAAM,IAAI,CAAC,uBAAuB;YAClC,IAAI,CAAC,2BAA2B;QACjC;IACD;IAGA,MAAa,0BAAyC;QACrD,IAAI,CAAC,eAAe;QACpB,IAAI,CAAC,eAAe,CAAC,gBAAgB;QACrC,MAAM,IAAI,CAAC,YAAY;IACxB;IAGO,8BAAoC;QAC1C,KAAK,MAAMC,aAAa,IAAI,CAAC,SAAS,CAAC,IAAI,GAC1C,IAAI,CAAC,kBAAkB,EAAE,uBAAuBA;QAEjD,IAAI,CAAC,SAAS,CAAC,KAAK;QACpB,IAAI,CAAC,eAAe,CAAC,QAAQ;QAC7B,IAAI,CAAC,UAAU,EAAE;QACjB,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,uBAAuB;IAC7B;IAGO,uBAA+B;QACrC,OAAO,IAAI,CAAC,kBAAkB,EAAE,uBAAuB;IACxD;AACD"}
1
+ {"version":3,"file":"core/HistoryManager.js","sources":["../../src/core/HistoryManager.ts"],"sourcesContent":["/**\n * History and branch management for sequential thinking.\n *\n * This module provides the `HistoryManager` class which manages thought history,\n * branching, and optional persistence with per-session state isolation.\n *\n * Internally delegates to three focused collaborators:\n * - `EdgeEmitter` — DAG edge emission\n * - `PersistenceBuffer` — buffered persistence + retry/backoff\n * - `SessionManager` — session lifecycle (TTL/LRU eviction)\n *\n * @module HistoryManager\n */\n\nimport type { IEdgeStore, IMetrics, ISessionLock } from '../contracts/interfaces.js';\nimport { asSessionId, type BranchId, type SessionId, type ThoughtId } from '../contracts/ids.js';\nimport type { ISummaryStore } from '../contracts/summary.js';\nimport {\n\tERROR_CODES,\n\tInvalidBacktrackError,\n\tMaxSessionsReachedError,\n\tSequentialThinkingError,\n\tValidationError,\n} from '../errors.js';\nimport { NullLogger } from '../logger/NullLogger.js';\nimport type { Logger } from '../logger/StructuredLogger.js';\nimport type { PersistenceBackend } from '../contracts/PersistenceBackend.js';\nimport {\n\tDehydrationPolicy,\n\ttype DehydrationOptions,\n\ttype HydratedEntry,\n} from './compression/DehydrationPolicy.js';\nimport type { Summary } from './compression/Summary.js';\nimport { SessionAccessDeniedError, SessionExpiredError } from './SessionErrors.js';\nimport { EdgeEmitter } from './graph/EdgeEmitter.js';\nimport type {\n\tHistorySessionSnapshot,\n\tIHistoryManager,\n\tThoughtAdmissionContext,\n} from './IHistoryManager.js';\nimport { PersistenceBuffer, type PersistenceEventEmitter } from './PersistenceBuffer.js';\nimport { SessionManager } from './SessionManager.js';\nimport { SessionResetCoordinator } from './SessionResetCoordinator.js';\nimport { stagePersistenceRestore, type RestoredSession } from './PersistenceRestore.js';\nimport type { ThoughtData } from './thought.js';\nimport { getOwner } from '../context/RequestContext.js';\nimport { ThoughtReferenceIndex, type ThoughtReferenceResolution } from './ThoughtReferenceIndex.js';\nimport { resolveThoughtReferencesForAdmission } from './CrossReferenceValidator.js';\nimport { SessionLifecycleCoordinator } from './SessionLifecycleCoordinator.js';\nimport { resolvedVerificationTarget } from './evaluator/VerificationLinks.js';\nimport { reconstructVerificationTargets } from './VerificationTargetRestore.js';\n\n/** Absolute maximum history size (~20MB at 2KB/thought). Cannot be overridden. */\nexport const ABSOLUTE_MAX_HISTORY_SIZE = 10_000;\n\ninterface SessionState {\n\tthought_history: ThoughtData[];\n\tbranches: Record<string, ThoughtData[]>;\n\tverificationTargets: Map<ThoughtId, ThoughtId>;\n\tavailableMcpTools: string[] | undefined;\n\tavailableSkills: string[] | undefined;\n\tlastAccessedAt: number;\n\tbranchIdentities: Set<BranchId>;\n\tpendingRestoreBranchDeletes: Set<BranchId>;\n\t/** Owner identifier set on first owner-aware access. Immutable thereafter. */\n\towner?: string;\n\t/** Non-persisted startup provenance used to block unverified network ownership. */\n\tprovenance?: 'restored';\n}\n\nexport interface HistoryManagerConfig {\n\t/** Maximum number of thoughts to keep in main history. @default 1000 */\n\tmaxHistorySize?: number;\n\t/** Maximum number of branches to maintain. @default 50 */\n\tmaxBranches?: number;\n\t/** Maximum size of each branch. @default 100 */\n\tmaxBranchSize?: number;\n\tlogger?: Logger;\n\tpersistence?: PersistenceBackend | null;\n\tmetrics?: IMetrics;\n\t/** Maximum number of thoughts to buffer before flushing. @default 100 */\n\tpersistenceBufferSize?: number;\n\t/** Periodic flush interval in ms. @default 1000 */\n\tpersistenceFlushInterval?: number;\n\t/** Max retries for failed persistence flushes. @default 3 */\n\tpersistenceMaxRetries?: number;\n\tpersistenceHistorySize?: number;\n\tpersistBranches?: boolean;\n\teventEmitter?: PersistenceEventEmitter;\n\tedgeStore?: IEdgeStore;\n\tsummaryStore?: ISummaryStore;\n\t/** Whether to emit DAG edges (gated independently of edgeStore). @default false */\n\tdagEdges?: boolean;\n\t/** Maximum sessions per owner (per-owner LRU bucket). @default 50 */\n\tmaxSessionsPerOwner?: number;\n\t/** Shared processor lock used to serialize session resets. */\n\tsessionLock?: ISessionLock;\n\t/** Shared admission and exclusive lifecycle coordinator. */\n\tlifecycleCoordinator?: SessionLifecycleCoordinator;\n\t/** Clears processor-owned state after a session is actually removed. */\n\tclearSessionAuxiliaryState?: (sessionId: SessionId) => void;\n\t/** Clears all processor-owned state after a successful global lifecycle operation. */\n\tclearAllAuxiliaryState?: () => void;\n}\n\n/**\n * Manages thought history and branching for sequential thinking.\n *\n * Owns the per-session `Map<string, SessionState>`. Delegates DAG edge emission,\n * buffered persistence, and session TTL/LRU eviction to focused collaborators while\n * preserving test-coupled private member names (`_flushTimer`, `_startFlushTimer`,\n * `_flushBuffer`, `_sessions`).\n */\nexport class HistoryManager implements IHistoryManager {\n\tprivate static readonly SESSION_TTL_MS = 30 * 60 * 1000;\n\tprivate static readonly MAX_SESSIONS = 100;\n\tprivate _sessions: Map<SessionId, SessionState> = new Map();\n\tprivate readonly _expiredSessions = new Map<SessionId, { readonly owner: string | undefined }>();\n\tprivate _maxHistorySize: number;\n\tprivate _maxBranches: number;\n\tprivate _maxBranchSize: number;\n\tprivate _logger: Logger;\n\tprivate _persistence: PersistenceBackend | null;\n\tprivate _persistenceEnabled: boolean;\n\tprivate _metrics?: IMetrics;\n\n\tprivate _edgeStore?: IEdgeStore;\n\tprivate _summaryStore?: ISummaryStore;\n\tprivate _dagEdges: boolean;\n\n\tprivate _eventEmitter: PersistenceEventEmitter | null;\n\n\tprivate readonly _edgeEmitter: EdgeEmitter;\n\tprivate _referenceIndex = new ThoughtReferenceIndex();\n\tprivate _persistenceBuffer: PersistenceBuffer | null;\n\tprivate readonly _sessionManager: SessionManager<SessionState>;\n\tprivate readonly _resetCoordinator: SessionResetCoordinator<SessionState>;\n\tprivate readonly _sessionLock?: ISessionLock;\n\tprivate readonly _lifecycle: SessionLifecycleCoordinator;\n\tprivate _shutdownOwner: (() => Promise<void>) | null = null;\n\tprivate readonly _clearSessionAuxiliaryState?: (sessionId: SessionId) => void;\n\tprivate readonly _clearAllAuxiliaryState?: () => void;\n\n\tconstructor(config: HistoryManagerConfig = {}) {\n\t\tthis._logger = config.logger ?? new NullLogger();\n\t\tconst requestedMaxSize = config.maxHistorySize ?? 10000;\n\t\tthis._maxHistorySize = Math.min(requestedMaxSize, ABSOLUTE_MAX_HISTORY_SIZE);\n\t\tif (requestedMaxSize > ABSOLUTE_MAX_HISTORY_SIZE) {\n\t\t\tthis._logger.warn('maxHistorySize exceeds absolute maximum, capped', {\n\t\t\t\trequested: requestedMaxSize,\n\t\t\t\tapplied: ABSOLUTE_MAX_HISTORY_SIZE,\n\t\t\t});\n\t\t}\n\t\tthis._maxBranches = config.maxBranches ?? 50;\n\t\tthis._maxBranchSize = config.maxBranchSize || 100;\n\t\tthis._persistence = config.persistence ?? null;\n\t\tthis._persistenceEnabled = this._persistence !== null;\n\t\tthis._metrics = config.metrics;\n\t\tthis._eventEmitter = config.eventEmitter ?? null;\n\t\tthis._edgeStore = config.edgeStore;\n\t\tthis._summaryStore = config.summaryStore;\n\t\tthis._dagEdges = config.dagEdges ?? true;\n\t\tthis._sessionLock = config.sessionLock;\n\t\tthis._lifecycle = config.lifecycleCoordinator ?? new SessionLifecycleCoordinator();\n\t\tthis._clearSessionAuxiliaryState = config.clearSessionAuxiliaryState;\n\t\tthis._clearAllAuxiliaryState = config.clearAllAuxiliaryState;\n\n\t\t// Wire delegates\n\t\tthis._edgeEmitter = new EdgeEmitter({\n\t\t\tedgeStore: this._edgeStore,\n\t\t\tdagEdges: this._dagEdges,\n\t\t\tlogger: this._logger,\n\t\t});\n\n\t\tthis._sessionManager = new SessionManager<SessionState>({\n\t\t\tsessionTtlMs: HistoryManager.SESSION_TTL_MS,\n\t\t\tcleanupIntervalMs: 5 * 60 * 1000,\n\t\t\tgetMaxSessions: () => HistoryManager.MAX_SESSIONS,\n\t\t\tmaxSessionsPerOwner: config.maxSessionsPerOwner ?? 50,\n\t\t\tlogger: this._logger,\n\t\t});\n\n\t\tthis._persistenceBuffer = null;\n\t\tif (this._persistenceEnabled && this._persistence) {\n\t\t\tthis._persistenceBuffer = new PersistenceBuffer({\n\t\t\t\tpersistence: this._persistence,\n\t\t\t\tbufferSize: config.persistenceBufferSize ?? 100,\n\t\t\t\tflushInterval: config.persistenceFlushInterval ?? 1000,\n\t\t\t\tmaxRetries: config.persistenceMaxRetries ?? 3,\n\t\t\t\tdurableHistorySize: config.persistenceHistorySize ?? ABSOLUTE_MAX_HISTORY_SIZE,\n\t\t\t\tpersistBranches: config.persistBranches ?? true,\n\t\t\t\teventEmitter: this._eventEmitter,\n\t\t\t\tlogger: this._logger,\n\t\t\t});\n\t\t\tthis._startFlushTimer();\n\t\t}\n\t\tconst resetDurability =\n\t\t\tthis._persistence === null || this._persistenceBuffer === null\n\t\t\t\t? { persistence: null, barrier: null }\n\t\t\t\t: { persistence: this._persistence, barrier: this._persistenceBuffer };\n\t\tthis._resetCoordinator = new SessionResetCoordinator({\n\t\t\t...resetDurability,\n\t\t\tedgeStore: this._edgeStore,\n\t\t\tsummaryStore: this._summaryStore,\n\t\t\tsessions: this._sessions,\n\t\t\tcreateSessionState: (owner) => this._createSessionState(owner),\n\t\t\tassertReplacementCapacity: (sessionId, owner) => {\n\t\t\t\tif (!this._sessions.has(sessionId)) this._planCapacityForSession(owner);\n\t\t\t},\n\t\t\tadmitReplacement: (sessionId, owner) => {\n\t\t\t\tif (!this._sessions.has(sessionId)) this._makeCapacityForSession(owner);\n\t\t\t},\n\t\t\tlogger: this._logger,\n\t\t});\n\n\t\tthis._sessionManager.startCleanupTimer(\n\t\t\tthis._sessions,\n\t\t\t(sessionId) => this._isTtlEvictionEligible(sessionId),\n\t\t\t(sessionIds) => this._evictSessions(sessionIds)\n\t\t);\n\t}\n\n\t// Test-coupled accessors: these private member names must remain reachable\n\t// via `manager as unknown as { _flushTimer; _startFlushTimer }`.\n\tprivate get _flushTimer(): ReturnType<typeof setInterval> | null {\n\t\treturn this._persistenceBuffer?.timer ?? null;\n\t}\n\n\tprivate _startFlushTimer(): void {\n\t\tthis._persistenceBuffer?.startFlushTimer();\n\t}\n\n\tprivate _stopFlushTimer(): void {\n\t\tif (this._flushTimer === null) return;\n\t\tthis._persistenceBuffer?.stopFlushTimer();\n\t}\n\n\t/** @internal Public for test coupling. */\n\tpublic _flushBuffer(): Promise<void> {\n\t\tthis._stageAllRestoreBranchReconciliation();\n\t\treturn this._persistenceBuffer?.flush() ?? Promise.resolve();\n\t}\n\n\t/**\n\t * Drains accepted persistence work and projects terminal failures to one session.\n\t *\n\t * @param sessionId - Authoritative session whose persistence barrier to await.\n\t * @returns A promise that settles when the session's accepted work settles.\n\t */\n\tpublic drainSession(sessionId: SessionId): Promise<void> {\n\t\tconst session = this._sessions.get(sessionId);\n\t\tif (session !== undefined) this._stageRestoreBranchReconciliation(sessionId, session);\n\t\treturn this._persistenceBuffer?.drainSession(sessionId) ?? Promise.resolve();\n\t}\n\n\t/**\n\t * Registers the latest summary snapshot for coordinator-owned persistence.\n\t *\n\t * @param sessionId - Authoritative session that owns the summaries.\n\t * @param summaries - Complete current summary snapshot for the session.\n\t */\n\tpublic bufferSummaries(sessionId: SessionId, summaries: readonly Summary[]): void {\n\t\tthis._authorizeExistingSession(sessionId, this._getCurrentOwner());\n\t\tthis._lifecycle.runMutation(sessionId, () => {\n\t\t\tthis._persistenceBuffer?.bufferSummaries(sessionId, summaries);\n\t\t\tconst session = this._sessions.get(sessionId);\n\t\t\tif (session !== undefined) this._stageRestoreBranchReconciliation(sessionId, session);\n\t\t});\n\t}\n\n\t/** EdgeStore instance, if configured. Used by ThoughtProcessor for StrategyContext. */\n\tpublic getEdgeStore(): IEdgeStore | undefined {\n\t\treturn this._edgeStore;\n\t}\n\n\tprivate log(message: string, meta?: Record<string, unknown>): void {\n\t\tthis._logger.info(message, meta);\n\t}\n\n\t/** Reads owner from RequestContext (AsyncLocalStorage). Stdio path returns undefined. */\n\tprivate _getCurrentOwner(): string | undefined {\n\t\treturn getOwner();\n\t}\n\n\t/**\n\t * Gets or creates session state; updates lastAccessedAt.\n\t *\n\t * Ownership semantics:\n\t * - `owner === undefined` (stdio path): bypasses ownership checks without setting\n\t * owner; expired sessions still reject access.\n\t * - `owner !== undefined`: if session has a different owner, throws\n\t * `SessionAccessDeniedError`. If session was created without an owner\n\t * (e.g. by stdio), the owner is set on first owner-aware access.\n\t */\n\tprivate _getSession(sessionId: string, owner?: string): SessionState {\n\t\tconst key = asSessionId(sessionId);\n\t\tthis._authorizeExistingSession(key, owner);\n\t\tconst existing = this._sessions.get(key);\n\t\tif (existing !== undefined) {\n\t\t\tthis._assertSessionOwner(key, existing, owner);\n\t\t\texisting.lastAccessedAt = Date.now();\n\t\t\treturn existing;\n\t\t}\n\t\treturn this._lifecycle.runMutation(key, () => this._getSessionWithinOperation(key, owner));\n\t}\n\n\tprivate _getSessionWithinOperation(key: SessionId, owner?: string): SessionState {\n\t\tthis._authorizeExistingSession(key, owner);\n\t\tlet session = this._sessions.get(key);\n\t\tif (!session) {\n\t\t\tthis._makeCapacityForSession(owner);\n\t\t\tsession = this._createSessionState(owner);\n\t\t\tthis._sessions.set(key, session);\n\t\t} else {\n\t\t\tthis._assertSessionOwner(key, session, owner);\n\t\t}\n\t\tsession.lastAccessedAt = Date.now();\n\t\treturn session;\n\t}\n\n\tprivate _assertSessionOwner(\n\t\tsessionId: SessionId,\n\t\tsession: SessionState,\n\t\towner: string | undefined\n\t): void {\n\t\tif (owner === undefined) return;\n\t\tif (session.provenance === 'restored') {\n\t\t\tthrow new SessionAccessDeniedError(sessionId, 'unavailable', owner);\n\t\t}\n\t\tif (session.owner !== undefined && session.owner !== owner) {\n\t\t\tthrow new SessionAccessDeniedError(sessionId, session.owner, owner);\n\t\t}\n\t\tif (session.owner === undefined) session.owner = owner;\n\t}\n\n\tprivate _planCapacityForSession(owner: string | undefined): readonly SessionId[] {\n\t\tconst victims = this._sessionManager.planProspectiveAdmission(\n\t\t\tthis._sessions,\n\t\t\towner,\n\t\t\t(sessionId) => this._isCapacityEvictionEligible(sessionId)\n\t\t);\n\t\tif (victims === undefined) throw new MaxSessionsReachedError(HistoryManager.MAX_SESSIONS);\n\t\treturn victims;\n\t}\n\n\tprivate _makeCapacityForSession(owner: string | undefined): void {\n\t\tconst victims = this._planCapacityForSession(owner);\n\t\tif (victims.length === 0) return;\n\t\tconst evicted = this._lifecycle.tryEvictIdleSessions(victims, (sessionIds) => {\n\t\t\tif (sessionIds.some((sessionId) => !this._isPersistenceQuiescent(sessionId))) {\n\t\t\t\tthrow new MaxSessionsReachedError(HistoryManager.MAX_SESSIONS);\n\t\t\t}\n\t\t\tfor (const sessionId of sessionIds) this._removeLiveSession(sessionId);\n\t\t});\n\t\tif (!evicted) throw new MaxSessionsReachedError(HistoryManager.MAX_SESSIONS);\n\t}\n\n\tprivate _isCapacityEvictionEligible(sessionId: SessionId): boolean {\n\t\treturn this._lifecycle.isIdle(sessionId) && this._isPersistenceQuiescent(sessionId);\n\t}\n\n\tprivate _isTtlEvictionEligible(sessionId: SessionId): boolean {\n\t\tconst persistenceState =\n\t\t\tthis._persistenceBuffer?.sessionEvictionState(sessionId) ?? 'quiescent';\n\t\treturn (\n\t\t\tthis._lifecycle.isIdle(sessionId) &&\n\t\t\tpersistenceState !== 'failed' &&\n\t\t\tpersistenceState !== 'barrier'\n\t\t);\n\t}\n\n\tprivate _isPersistenceQuiescent(sessionId: SessionId): boolean {\n\t\treturn (\n\t\t\t(this._persistenceBuffer?.sessionEvictionState(sessionId) ?? 'quiescent') === 'quiescent'\n\t\t);\n\t}\n\n\tprivate async _evictSessions(sessionIds: readonly SessionId[]): Promise<void> {\n\t\tconst results = await Promise.allSettled(\n\t\t\tsessionIds.map((sessionId) => this._evictSession(sessionId))\n\t\t);\n\t\tconst failures = results.flatMap((result) =>\n\t\t\tresult.status === 'rejected' ? [result.reason] : []\n\t\t);\n\t\tif (failures.length > 0) throw new AggregateError(failures, 'Session eviction failed');\n\t}\n\n\tprivate _evictSession(sessionId: SessionId): Promise<void> {\n\t\treturn this._lifecycle.withSessionEviction(sessionId, async () => {\n\t\t\tif (this._persistenceBuffer === null) {\n\t\t\t\tthis._removeLiveSession(sessionId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst session = this._sessions.get(sessionId);\n\t\t\tif (session !== undefined) this._stageRestoreBranchReconciliation(sessionId, session);\n\t\t\tawait this._persistenceBuffer.withSessionEvictionBarrier(sessionId, async () => {\n\t\t\t\tthis._removeLiveSession(sessionId);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate _removeLiveSession(sessionId: SessionId): void {\n\t\tconst session = this._sessions.get(sessionId);\n\t\tthis._clearSessionAuxiliaryState?.(sessionId);\n\t\tthis._edgeStore?.clearSession(sessionId);\n\t\tthis._summaryStore?.clearSession(sessionId);\n\t\tthis._referenceIndex.clearSession(sessionId);\n\t\tthis._sessions.delete(sessionId);\n\t\tthis._persistenceBuffer?.forgetQuiescentSession(sessionId);\n\t\tif (session !== undefined) this._expiredSessions.set(sessionId, { owner: session.owner });\n\t}\n\n\tprivate _createSessionState(owner?: string, provenance?: 'restored'): SessionState {\n\t\treturn {\n\t\t\tthought_history: [],\n\t\t\tbranches: {},\n\t\t\tverificationTargets: new Map<ThoughtId, ThoughtId>(),\n\t\t\tavailableMcpTools: undefined,\n\t\t\tavailableSkills: undefined,\n\t\t\tlastAccessedAt: Date.now(),\n\t\t\tbranchIdentities: new Set<BranchId>(),\n\t\t\tpendingRestoreBranchDeletes: new Set<BranchId>(),\n\t\t\towner,\n\t\t\tprovenance,\n\t\t};\n\t}\n\n\tprivate _authorizeExistingSession(\n\t\tsessionId: SessionId,\n\t\towner: string | undefined\n\t): string | undefined {\n\t\tconst preservedOwner = this._authorizeSessionReset(sessionId, owner);\n\t\tif (this._expiredSessions.has(sessionId)) throw new SessionExpiredError(sessionId);\n\t\treturn preservedOwner;\n\t}\n\n\tprivate _authorizeSessionReset(\n\t\tsessionId: SessionId,\n\t\towner: string | undefined\n\t): string | undefined {\n\t\tconst marker = this._expiredSessions.get(sessionId);\n\t\tconst sessionOwner = marker === undefined ? this._sessions.get(sessionId)?.owner : marker.owner;\n\t\tif (owner !== undefined && this._sessions.get(sessionId)?.provenance === 'restored') {\n\t\t\tthrow new SessionAccessDeniedError(sessionId, 'unavailable', owner);\n\t\t}\n\t\tif (owner !== undefined && sessionOwner !== undefined && sessionOwner !== owner) {\n\t\t\tthrow new SessionAccessDeniedError(sessionId, sessionOwner, owner);\n\t\t}\n\t\treturn sessionOwner ?? owner;\n\t}\n\n\tpublic assertSessionResetAuthorized(sessionId: string): void {\n\t\tthis._authorizeSessionReset(asSessionId(sessionId), this._getCurrentOwner());\n\t}\n\n\tprivate _assertOwnerlessResetAll(): void {\n\t\tconst owner = this._getCurrentOwner();\n\t\tif (owner === undefined) return;\n\t\tconst firstSessionId = this._sessions.keys().next().value;\n\t\tif (firstSessionId !== undefined) {\n\t\t\tthrow new SessionAccessDeniedError(firstSessionId, 'trusted ownerless context', owner);\n\t\t}\n\t\tthrow new SequentialThinkingError(\n\t\t\t`Access denied to all sessions: trusted ownerless context required, accessed by '${owner}'`,\n\t\t\tERROR_CODES.SESSION_ACCESS_DENIED\n\t\t);\n\t}\n\n\t/**\n\t * Adds a thought to the history. Routes per-session, applies retraction for backtrack,\n\t * caches tools/skills, trims, branches, emits DAG edges, and buffers for persistence.\n\t */\n\tpublic addThought(thought: ThoughtData, context?: ThoughtAdmissionContext): void {\n\t\tconst sessionId = asSessionId(thought.session_id);\n\t\tthis._authorizeExistingSession(sessionId, this._getCurrentOwner());\n\t\tthis._lifecycle.runMutation(sessionId, () =>\n\t\t\tthis._addThoughtWithinOperation(sessionId, thought, context)\n\t\t);\n\t}\n\n\tpublic assertThoughtIdentityAvailable(thought: ThoughtData): void {\n\t\tconst sessionId = asSessionId(thought.session_id);\n\t\tthis._authorizeExistingSession(sessionId, this._getCurrentOwner());\n\t\tif (thought.id === undefined) return;\n\t\tif (\n\t\t\tthis._referenceIndex.has(sessionId, thought.id) ||\n\t\t\tthis._persistenceBuffer?.hasThoughtIdentity(sessionId, thought.id) === true\n\t\t) {\n\t\t\tthrow new ValidationError('id', `Thought id already exists in session: ${thought.id}`);\n\t\t}\n\t}\n\n\tprivate _addThoughtWithinOperation(\n\t\tsessionId: SessionId,\n\t\tthought: ThoughtData,\n\t\tcontext?: ThoughtAdmissionContext\n\t): void {\n\t\tthis._persistenceBuffer?.assertSessionAdmissionOpen(sessionId);\n\t\tconst owner = this._getCurrentOwner();\n\t\tthis._authorizeExistingSession(sessionId, owner);\n\t\tthis.assertThoughtIdentityAvailable(thought);\n\t\tconst resolvedReferences = this._resolveAdmissionReferences(sessionId, thought, context);\n\t\tconst session = this._getSessionWithinOperation(sessionId, owner);\n\t\tthis._metrics?.counter(\n\t\t\t'thought_requests_total',\n\t\t\t1,\n\t\t\t{},\n\t\t\t'Total thought requests added to history'\n\t\t);\n\n\t\tsession.thought_history.push(thought);\n\t\tthis._recordVerificationTarget(session, thought, resolvedReferences);\n\n\t\t// Logical retraction: when a backtrack thought is added, mark its target\n\t\t// as retracted (append-only — target remains in history).\n\t\tif (resolvedReferences.backtrackTargetThoughtId !== undefined) {\n\t\t\tthis._applyRetraction(session, resolvedReferences.backtrackTargetThoughtId);\n\t\t}\n\n\t\t// Cache available_mcp_tools/available_skills for cross-call persistence\n\t\tif (thought.available_mcp_tools) {\n\t\t\tsession.availableMcpTools = thought.available_mcp_tools;\n\t\t}\n\t\tif (thought.available_skills) {\n\t\t\tsession.availableSkills = thought.available_skills;\n\t\t}\n\n\t\tif (thought.branch_from_thought && thought.branch_id) {\n\t\t\tthis._addToSessionBranch(session, thought.branch_id, thought);\n\t\t}\n\n\t\tif (thought.merge_from_thoughts?.length || thought.merge_branch_ids?.length) {\n\t\t\tthis._metrics?.counter(\n\t\t\t\t'thought_merge_operations_total',\n\t\t\t\t1,\n\t\t\t\t{},\n\t\t\t\t'Total merge operations (graph topology)'\n\t\t\t);\n\t\t}\n\n\t\tconst edgeAdded = this._edgeEmitter.emitEdgesForThought(session, thought, {\n\t\t\t...context,\n\t\t\tresolvedReferences,\n\t\t});\n\t\tconst evictedBranchIds = this._enforceRetention(session, thought.branch_id);\n\t\tthis._pruneVerificationTargets(session);\n\t\tthis._rebuildReferenceIndex(sessionId, session);\n\t\tconst prunedEdges = this._pruneUnretainedEdges(sessionId, session);\n\t\tthis._bufferRetainedState(\n\t\t\tsessionId,\n\t\t\tsession,\n\t\t\tthought,\n\t\t\tevictedBranchIds,\n\t\t\tedgeAdded,\n\t\t\tprunedEdges,\n\t\t\tresolvedReferences.backtrackTargetThoughtId\n\t\t);\n\t}\n\n\tprivate _resolveAdmissionReferences(\n\t\tsessionId: SessionId,\n\t\tthought: ThoughtData,\n\t\tcontext?: ThoughtAdmissionContext\n\t): NonNullable<ThoughtAdmissionContext['resolvedReferences']> {\n\t\tconst resolved =\n\t\t\tcontext?.resolvedReferences ??\n\t\t\tresolveThoughtReferencesForAdmission(thought, (thoughtNumber) =>\n\t\t\t\tthis._referenceIndex.resolve(sessionId, thoughtNumber)\n\t\t\t);\n\t\tif (\n\t\t\tthought.thought_type === 'backtrack' &&\n\t\t\tthought.backtrack_target !== undefined &&\n\t\t\tresolved.backtrackTargetThoughtId === undefined\n\t\t) {\n\t\t\tthrow new InvalidBacktrackError(\n\t\t\t\t`backtrack_target ${thought.backtrack_target} is missing in session history`\n\t\t\t);\n\t\t}\n\t\treturn resolved;\n\t}\n\n\tprivate _enforceRetention(\n\t\tsession: SessionState,\n\t\tbranchId: BranchId | undefined\n\t): readonly BranchId[] {\n\t\tif (session.thought_history.length > this._maxHistorySize) {\n\t\t\tsession.thought_history = session.thought_history.slice(-this._maxHistorySize);\n\t\t\tthis.log(`History trimmed to ${this._maxHistorySize} items`, {\n\t\t\t\tmaxSize: this._maxHistorySize,\n\t\t\t});\n\t\t}\n\t\tif (branchId !== undefined) this._trimSessionBranchSize(session, branchId);\n\t\treturn this._cleanupSessionBranches(session);\n\t}\n\n\tprivate _recordVerificationTarget(\n\t\tsession: SessionState,\n\t\tthought: ThoughtData,\n\t\treferences: NonNullable<ThoughtAdmissionContext['resolvedReferences']>\n\t): void {\n\t\tconst targetId = resolvedVerificationTarget(thought, references);\n\t\tif (thought.id !== undefined && targetId !== undefined) {\n\t\t\tsession.verificationTargets.set(thought.id, targetId);\n\t\t}\n\t}\n\n\tprivate _pruneVerificationTargets(session: SessionState): void {\n\t\tconst retainedIds = new Set(\n\t\t\t[session.thought_history, ...Object.values(session.branches)]\n\t\t\t\t.flat()\n\t\t\t\t.flatMap((thought) => (thought.id === undefined ? [] : [thought.id]))\n\t\t);\n\t\tfor (const [verifierId, targetId] of session.verificationTargets) {\n\t\t\tif (!retainedIds.has(verifierId) || !retainedIds.has(targetId)) {\n\t\t\t\tsession.verificationTargets.delete(verifierId);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _pruneUnretainedEdges(sessionId: SessionId, session: SessionState): number {\n\t\tif (this._edgeStore === undefined) return 0;\n\t\tconst retainedIds = new Set<ThoughtId>();\n\t\tconst retainedBranchThoughtIds = new Set<ThoughtId>();\n\t\tfor (const thought of [session.thought_history, ...Object.values(session.branches)].flat()) {\n\t\t\tif (thought.id !== undefined) retainedIds.add(thought.id);\n\t\t}\n\t\tfor (const thought of Object.values(session.branches).flat()) {\n\t\t\tif (thought.id !== undefined) retainedBranchThoughtIds.add(thought.id);\n\t\t}\n\t\treturn this._edgeStore.pruneSession(sessionId, retainedIds, retainedBranchThoughtIds);\n\t}\n\n\tprivate _bufferRetainedState(\n\t\tsessionId: SessionId,\n\t\tsession: SessionState,\n\t\tthought: ThoughtData,\n\t\tevictedBranchIds: readonly BranchId[],\n\t\tedgeAdded: boolean,\n\t\tprunedEdges: number,\n\t\tbacktrackTargetThoughtId?: ThoughtId\n\t): void {\n\t\tconst buffer = this._persistenceBuffer;\n\t\tif (buffer === null) return;\n\t\tif (backtrackTargetThoughtId === undefined) buffer.bufferThought(sessionId, thought);\n\t\telse buffer.bufferBacktrack(sessionId, thought, backtrackTargetThoughtId);\n\t\tif (\n\t\t\tthought.branch_id !== undefined ||\n\t\t\tbacktrackTargetThoughtId !== undefined ||\n\t\t\tevictedBranchIds.length > 0 ||\n\t\t\tsession.pendingRestoreBranchDeletes.size > 0\n\t\t) {\n\t\t\tthis._stageBranchPersistence(sessionId, session, evictedBranchIds);\n\t\t}\n\t\tif (this._edgeStore !== undefined && (edgeAdded || prunedEdges > 0)) {\n\t\t\tbuffer.bufferEdges(sessionId, this._edgeStore.edgesForSession(sessionId));\n\t\t}\n\t}\n\n\tprivate _stageAllRestoreBranchReconciliation(): void {\n\t\tfor (const [sessionId, session] of this._sessions) {\n\t\t\tthis._stageRestoreBranchReconciliation(sessionId, session);\n\t\t}\n\t}\n\n\tprivate _stageRestoreBranchReconciliation(sessionId: SessionId, session: SessionState): void {\n\t\tif (session.pendingRestoreBranchDeletes.size === 0) return;\n\t\tthis._stageBranchPersistence(sessionId, session, []);\n\t}\n\n\tprivate _stageBranchPersistence(\n\t\tsessionId: SessionId,\n\t\tsession: SessionState,\n\t\tordinaryDeletes: readonly BranchId[]\n\t): void {\n\t\tconst buffer = this._persistenceBuffer;\n\t\tif (buffer === null) return;\n\t\tfor (const branchId of session.branchIdentities) {\n\t\t\tconst branch = session.branches[branchId];\n\t\t\tif (branch !== undefined) buffer.bufferBranch(sessionId, branchId, branch);\n\t\t}\n\t\tconst branchIdsToDelete = new Set([...session.pendingRestoreBranchDeletes, ...ordinaryDeletes]);\n\t\tfor (const branchId of branchIdsToDelete) {\n\t\t\tif (session.branches[branchId] === undefined) buffer.deleteBranch(sessionId, branchId);\n\t\t}\n\t\tsession.pendingRestoreBranchDeletes.clear();\n\t}\n\n\t/** Marks the thought as retracted within the session (append-only). */\n\tprivate _applyRetraction(session: SessionState, targetId: ThoughtId): void {\n\t\tfor (const t of session.thought_history) {\n\t\t\tif (t.id === targetId) t.retracted = true;\n\t\t}\n\t\tfor (const branchThoughts of Object.values(session.branches)) {\n\t\t\tfor (const t of branchThoughts) {\n\t\t\t\tif (t.id === targetId) t.retracted = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _rebuildReferenceIndex(sessionId: SessionId, session: SessionState): void {\n\t\tconst retained = [session.thought_history, ...Object.values(session.branches)].flat();\n\t\tthis._referenceIndex.replaceSession(sessionId, retained);\n\t}\n\n\tpublic resolveThoughtReference(\n\t\tsessionId: SessionId,\n\t\tthoughtNumber: number\n\t): ThoughtReferenceResolution {\n\t\tthis._authorizeExistingSession(sessionId, this._getCurrentOwner());\n\t\treturn this._referenceIndex.resolve(sessionId, thoughtNumber);\n\t}\n\n\tprivate _addToSessionBranch(\n\t\tsession: SessionState,\n\t\tbranchId: BranchId,\n\t\tthought: ThoughtData\n\t): void {\n\t\tif (!session.branches[branchId]) {\n\t\t\tsession.branches[branchId] = [];\n\t\t}\n\t\tsession.branchIdentities.add(branchId);\n\t\tsession.branches[branchId].push(thought);\n\t}\n\n\tprivate _cleanupSessionBranches(session: SessionState): readonly BranchId[] {\n\t\tconst branchCount = session.branchIdentities.size;\n\t\tif (branchCount <= this._maxBranches) return [];\n\t\tconst identitiesToRemove = Array.from(session.branchIdentities).slice(\n\t\t\t0,\n\t\t\tbranchCount - this._maxBranches\n\t\t);\n\t\tconst branchesToDelete: BranchId[] = [];\n\t\tfor (const branchId of identitiesToRemove) {\n\t\t\tsession.branchIdentities.delete(branchId);\n\t\t\tif (session.branches[branchId] !== undefined) branchesToDelete.push(branchId);\n\t\t\tdelete session.branches[branchId];\n\t\t\tthis.log(`Removed old branch: ${branchId}`, { branchId });\n\t\t}\n\t\treturn branchesToDelete;\n\t}\n\n\tprivate _trimSessionBranchSize(session: SessionState, branchId: BranchId): void {\n\t\tconst branch = session.branches[branchId];\n\t\tif (branch !== undefined && branch.length > this._maxBranchSize) {\n\t\t\tconst removed = branch.length - this._maxBranchSize;\n\t\t\tsession.branches[branchId] = branch.slice(-this._maxBranchSize);\n\t\t\tthis.log(`Trimmed branch '${branchId}': removed ${removed} old thoughts`, {\n\t\t\t\tbranchId,\n\t\t\t\tremoved,\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic getHistory(sessionId: string): ThoughtData[] {\n\t\treturn this._getSession(sessionId, this._getCurrentOwner()).thought_history;\n\t}\n\n\t/**\n\t * Returns history with optional sliding-window dehydration. Non-mutating: when\n\t * `dagEdges` is off OR no `ISummaryStore` is configured, returns same as getHistory.\n\t */\n\tpublic getHistoryHydrated(sessionId: string, opts?: DehydrationOptions): HydratedEntry[] {\n\t\tconst history = this.getHistory(sessionId);\n\t\tif (!this._dagEdges || !this._summaryStore) {\n\t\t\treturn history.slice();\n\t\t}\n\t\tconst policy = new DehydrationPolicy(this._summaryStore);\n\t\treturn policy.apply(history, asSessionId(sessionId), opts);\n\t}\n\n\tpublic getHistoryLength(sessionId: string): number {\n\t\treturn this._getSession(sessionId, this._getCurrentOwner()).thought_history.length;\n\t}\n\n\tpublic getBranches(sessionId: string): Record<BranchId, ThoughtData[]> {\n\t\treturn this._getSession(sessionId, this._getCurrentOwner()).branches;\n\t}\n\n\tpublic getBranchIds(sessionId: string): BranchId[] {\n\t\treturn Array.from(this._getSession(sessionId, this._getCurrentOwner()).branchIdentities);\n\t}\n\n\t/** Returns validation state without creating a session, binding an owner, or updating LRU data. */\n\tpublic inspectSession(sessionId: string): HistorySessionSnapshot {\n\t\tconst canonicalSessionId = asSessionId(sessionId);\n\t\tthis._authorizeExistingSession(canonicalSessionId, this._getCurrentOwner());\n\t\tconst session = this._sessions.get(canonicalSessionId);\n\t\tif (session === undefined) {\n\t\t\treturn {\n\t\t\t\thistory: [],\n\t\t\t\tbranches: {},\n\t\t\t\tverificationTargets: new Map(),\n\t\t\t\tbranchIds: [],\n\t\t\t\tavailableMcpTools: undefined,\n\t\t\t\tavailableSkills: undefined,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\thistory: [...session.thought_history],\n\t\t\tbranches: Object.fromEntries(\n\t\t\t\tObject.entries(session.branches).map(([branchId, thoughts]) => [branchId, [...thoughts]])\n\t\t\t) as Record<BranchId, readonly ThoughtData[]>,\n\t\t\tverificationTargets: new Map(session.verificationTargets),\n\t\t\tbranchIds: Array.from(session.branchIdentities),\n\t\t\tavailableMcpTools:\n\t\t\t\tsession.availableMcpTools === undefined ? undefined : [...session.availableMcpTools],\n\t\t\tavailableSkills:\n\t\t\t\tsession.availableSkills === undefined ? undefined : [...session.availableSkills],\n\t\t};\n\t}\n\n\t/** @throws {ValidationError} If branchId is empty or already exists. */\n\tpublic registerBranch(sessionId: string, branchId: BranchId): void {\n\t\tthis._authorizeExistingSession(asSessionId(sessionId), this._getCurrentOwner());\n\t\tif (typeof branchId !== 'string' || branchId.length === 0) {\n\t\t\tthrow new ValidationError('branch_id', 'branch_id must be a non-empty string');\n\t\t}\n\t\tconst canonicalSessionId = asSessionId(sessionId);\n\t\tthis._lifecycle.runMutation(canonicalSessionId, () => {\n\t\t\tthis._persistenceBuffer?.assertSessionAdmissionOpen(canonicalSessionId);\n\t\t\tconst session = this._getSessionWithinOperation(canonicalSessionId, this._getCurrentOwner());\n\t\t\tif (session.branchIdentities.has(branchId)) {\n\t\t\t\tthrow new ValidationError('branch_id', `Branch already exists: ${branchId}`);\n\t\t\t}\n\t\t\tsession.branchIdentities.add(branchId);\n\t\t\tconst evictedBranchIds = this._cleanupSessionBranches(session);\n\t\t\tthis._rebuildReferenceIndex(canonicalSessionId, session);\n\t\t\tconst prunedEdges = this._pruneUnretainedEdges(canonicalSessionId, session);\n\t\t\tif (evictedBranchIds.length > 0 || session.pendingRestoreBranchDeletes.size > 0) {\n\t\t\t\tthis._stageBranchPersistence(canonicalSessionId, session, evictedBranchIds);\n\t\t\t}\n\t\t\tif (this._edgeStore !== undefined && prunedEdges > 0) {\n\t\t\t\tthis._persistenceBuffer?.bufferEdges(\n\t\t\t\t\tcanonicalSessionId,\n\t\t\t\t\tthis._edgeStore.edgesForSession(canonicalSessionId)\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.log('Registered branch', { branchId, sessionId });\n\t\t});\n\t}\n\n\tpublic branchExists(sessionId: string, branchId: BranchId): boolean {\n\t\tconst session = this._getSession(sessionId, this._getCurrentOwner());\n\t\treturn session.branchIdentities.has(branchId);\n\t}\n\n\tpublic getAvailableMcpTools(sessionId: string): string[] | undefined {\n\t\treturn this._getSession(sessionId, this._getCurrentOwner()).availableMcpTools;\n\t}\n\n\tpublic getAvailableSkills(sessionId: string): string[] | undefined {\n\t\treturn this._getSession(sessionId, this._getCurrentOwner()).availableSkills;\n\t}\n\n\tpublic getBranch(branchId: BranchId, sessionId: string): ThoughtData[] | undefined {\n\t\treturn this._getSession(sessionId, this._getCurrentOwner()).branches[branchId];\n\t}\n\n\t/** Awaitably deletes one authorized durable namespace before replacing its live state. */\n\tpublic async resetSession(sessionId: string, clearAuxiliaryState?: () => void): Promise<void> {\n\t\tconst canonicalSessionId = asSessionId(sessionId);\n\t\tthis.assertSessionResetAuthorized(canonicalSessionId);\n\t\tawait this._lifecycle.withSessionReset(canonicalSessionId, async () => {\n\t\t\tconst reset = async (): Promise<void> =>\n\t\t\t\tawait this.resetSessionWithinExclusive(canonicalSessionId, clearAuxiliaryState);\n\t\t\tif (this._sessionLock === undefined) return await reset();\n\t\t\tawait this._sessionLock.withLock(canonicalSessionId, reset);\n\t\t});\n\t}\n\n\t/** Performs scoped reset work while its lifecycle exclusive is already owned. */\n\tpublic async resetSessionWithinExclusive(\n\t\tsessionId: SessionId,\n\t\tclearAuxiliaryState?: () => void\n\t): Promise<void> {\n\t\tconst preservedOwner = this._authorizeSessionReset(sessionId, this._getCurrentOwner());\n\t\tawait this._resetCoordinator.resetSession(\n\t\t\tsessionId,\n\t\t\tpreservedOwner,\n\t\t\tclearAuxiliaryState ??\n\t\t\t\t(this._clearSessionAuxiliaryState === undefined\n\t\t\t\t\t? undefined\n\t\t\t\t\t: () => this._clearSessionAuxiliaryState?.(sessionId))\n\t\t);\n\t\tthis._referenceIndex.clearSession(sessionId);\n\t\tthis._expiredSessions.delete(sessionId);\n\t}\n\n\t/** Awaitably deletes all durable namespaces from a trusted ownerless context. */\n\tpublic async resetAll(clearAuxiliaryState?: () => void): Promise<void> {\n\t\tthis._assertOwnerlessResetAll();\n\t\tawait this._lifecycle.withGlobalReset(\n\t\t\tasync () => await this.resetAllWithinExclusive(clearAuxiliaryState)\n\t\t);\n\t}\n\n\t/** Performs global reset work while its lifecycle exclusive is already owned. */\n\tpublic async resetAllWithinExclusive(clearAuxiliaryState?: () => void): Promise<void> {\n\t\tthis._assertOwnerlessResetAll();\n\t\tawait this._resetCoordinator.resetAll(clearAuxiliaryState ?? this._clearAllAuxiliaryState);\n\t\tthis._referenceIndex.clearAll();\n\t\tthis._expiredSessions.clear();\n\t}\n\n\tpublic getSessionIds(): string[] {\n\t\treturn Array.from(this._sessions.keys());\n\t}\n\n\tpublic getSessionCount(): number {\n\t\treturn this._sessions.size;\n\t}\n\n\tprivate _restoredState(restored: RestoredSession): SessionState {\n\t\tconst session = this._createSessionState(undefined, 'restored');\n\t\tsession.verificationTargets = reconstructVerificationTargets(\n\t\t\trestored.sessionId,\n\t\t\trestored.history,\n\t\t\trestored.branches\n\t\t);\n\t\tfor (let index = restored.history.length - 1; index >= 0; index--) {\n\t\t\tconst thought = restored.history[index];\n\t\t\tif (thought === undefined) continue;\n\t\t\tif (session.availableMcpTools === undefined && thought.available_mcp_tools !== undefined) {\n\t\t\t\tsession.availableMcpTools = [...thought.available_mcp_tools];\n\t\t\t}\n\t\t\tif (session.availableSkills === undefined && thought.available_skills !== undefined) {\n\t\t\t\tsession.availableSkills = [...thought.available_skills];\n\t\t\t}\n\t\t\tif (session.availableMcpTools !== undefined && session.availableSkills !== undefined) break;\n\t\t}\n\t\tsession.thought_history = restored.history.slice(-this._maxHistorySize);\n\t\tconst retainedStart = Math.max(0, restored.branches.length - this._maxBranches);\n\t\tconst retainedBranches = restored.branches.slice(retainedStart);\n\t\tfor (const branch of restored.branches.slice(0, retainedStart)) {\n\t\t\tsession.pendingRestoreBranchDeletes.add(branch.branchId);\n\t\t}\n\t\tfor (const branch of retainedBranches) {\n\t\t\tsession.branchIdentities.add(branch.branchId);\n\t\t\tsession.branches[branch.branchId] = branch.thoughts.slice(-this._maxBranchSize);\n\t\t}\n\t\tthis._pruneVerificationTargets(session);\n\t\treturn session;\n\t}\n\n\t/** Loads and atomically commits every authoritative persistence namespace. Call at init. */\n\tpublic async loadFromPersistence(): Promise<void> {\n\t\tif (!this._persistenceEnabled || !this._persistence) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst restored = await stagePersistenceRestore(this._persistence);\n\t\tconst sessions = restored.sessions.map(\n\t\t\t(session) => [session.sessionId, this._restoredState(session)] as const\n\t\t);\n\t\tconst referenceIndex = new ThoughtReferenceIndex();\n\t\tconst retainedThoughtIds = new Map<SessionId, ReadonlySet<ThoughtId>>();\n\t\tconst retainedBranchThoughtIds = new Map<SessionId, ReadonlySet<ThoughtId>>();\n\t\tfor (const [sessionId, session] of sessions) {\n\t\t\tconst retained = [session.thought_history, ...Object.values(session.branches)].flat();\n\t\t\treferenceIndex.replaceSession(sessionId, retained);\n\t\t\tretainedThoughtIds.set(\n\t\t\t\tsessionId,\n\t\t\t\tnew Set(retained.flatMap((thought) => (thought.id === undefined ? [] : [thought.id])))\n\t\t\t);\n\t\t\tretainedBranchThoughtIds.set(\n\t\t\t\tsessionId,\n\t\t\t\tnew Set(\n\t\t\t\t\tObject.values(session.branches).flatMap((branch) =>\n\t\t\t\t\t\tbranch.flatMap((thought) => (thought.id === undefined ? [] : [thought.id]))\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tthis._persistenceBuffer?.replaceDurableThoughtIdentities(restored.sessions);\n\n\t\tthis._edgeStore?.clearAll();\n\t\tthis._summaryStore?.clearAll();\n\t\tthis._sessions.clear();\n\t\tfor (const [sessionId, session] of sessions) this._sessions.set(sessionId, session);\n\t\tthis._referenceIndex = referenceIndex;\n\t\tfor (const session of restored.sessions) {\n\t\t\tconst retainedIds = retainedThoughtIds.get(session.sessionId) ?? new Set<ThoughtId>();\n\t\t\tconst retainedBranchIds =\n\t\t\t\tretainedBranchThoughtIds.get(session.sessionId) ?? new Set<ThoughtId>();\n\t\t\tfor (const edge of session.edges) {\n\t\t\t\tif (!retainedIds.has(edge.from) || !retainedIds.has(edge.to)) continue;\n\t\t\t\tif (edge.kind === 'branch' && !retainedBranchIds.has(edge.to)) continue;\n\t\t\t\tthis._edgeStore?.addEdge(edge);\n\t\t\t}\n\t\t\tfor (const summary of session.summaries) this._summaryStore?.add(summary);\n\t\t}\n\t\tthis.log(`Restored ${restored.sessions.length} persistence namespaces`);\n\t}\n\n\tpublic isPersistenceEnabled(): boolean {\n\t\treturn this._persistenceEnabled;\n\t}\n\n\tpublic getPersistenceBackend(): PersistenceBackend | null {\n\t\treturn this._persistence;\n\t}\n\n\t/** Sets the event emitter for persistence error events (post-construction wiring). */\n\tpublic setEventEmitter(emitter: PersistenceEventEmitter): void {\n\t\tthis._eventEmitter = emitter;\n\t\tthis._persistenceBuffer?.setEventEmitter(emitter);\n\t}\n\n\t/**\n\t * Binds shutdown to the resource owner responsible for the complete cleanup sequence.\n\t *\n\t * @internal\n\t * @param owner - Callback returning the owner's memoized shutdown promise.\n\t * @throws {TypeError} When a shutdown owner has already been bound.\n\t */\n\tpublic bindShutdownOwner(owner: () => Promise<void>): void {\n\t\tif (this._shutdownOwner !== null) {\n\t\t\tthrow new TypeError('HistoryManager shutdown owner is already bound');\n\t\t}\n\t\tthis._shutdownOwner = owner;\n\t}\n\n\t/** Stops timers, drains writes, and clears live state under one memoized lifecycle settlement. */\n\tpublic shutdown(): Promise<void> {\n\t\tif (this._shutdownOwner !== null) return this._shutdownOwner();\n\t\treturn this._lifecycle.shutdown(async () => {\n\t\t\tawait this.shutdownWithinLifecycle();\n\t\t\tthis.clearLiveStateAfterShutdown();\n\t\t});\n\t}\n\n\t/** Stops timers and drains writes while the caller owns global shutdown. */\n\tpublic async shutdownWithinLifecycle(): Promise<void> {\n\t\tthis._stopFlushTimer();\n\t\tthis._sessionManager.stopCleanupTimer();\n\t\tawait this._flushBuffer();\n\t}\n\n\t/** Clears non-durable state after every shutdown resource has closed successfully. */\n\tpublic clearLiveStateAfterShutdown(): void {\n\t\tfor (const sessionId of this._sessions.keys()) {\n\t\t\tthis._persistenceBuffer?.forgetQuiescentSession(sessionId);\n\t\t}\n\t\tthis._sessions.clear();\n\t\tthis._referenceIndex.clearAll();\n\t\tthis._edgeStore?.clearAll();\n\t\tthis._summaryStore?.clearAll();\n\t\tthis._clearAllAuxiliaryState?.();\n\t\tthis._expiredSessions.clear();\n\t}\n\n\t/** Number of coordinator-owned thought writes not yet acknowledged successful. */\n\tpublic getWriteBufferLength(): number {\n\t\treturn this._persistenceBuffer?.pendingThoughtCount ?? 0;\n\t}\n}\n"],"names":["ABSOLUTE_MAX_HISTORY_SIZE","HistoryManager","Map","ThoughtReferenceIndex","config","NullLogger","requestedMaxSize","Math","SessionLifecycleCoordinator","EdgeEmitter","SessionManager","PersistenceBuffer","resetDurability","SessionResetCoordinator","owner","sessionId","sessionIds","Promise","session","undefined","summaries","message","meta","getOwner","key","asSessionId","existing","Date","SessionAccessDeniedError","victims","MaxSessionsReachedError","evicted","persistenceState","results","failures","result","AggregateError","provenance","Set","preservedOwner","SessionExpiredError","marker","sessionOwner","firstSessionId","SequentialThinkingError","ERROR_CODES","thought","context","ValidationError","resolvedReferences","edgeAdded","evictedBranchIds","prunedEdges","resolved","resolveThoughtReferencesForAdmission","thoughtNumber","InvalidBacktrackError","branchId","references","targetId","resolvedVerificationTarget","retainedIds","Object","verifierId","retainedBranchThoughtIds","backtrackTargetThoughtId","buffer","ordinaryDeletes","branch","branchIdsToDelete","t","branchThoughts","retained","branchCount","identitiesToRemove","Array","branchesToDelete","removed","opts","history","policy","DehydrationPolicy","canonicalSessionId","thoughts","clearAuxiliaryState","reset","restored","reconstructVerificationTargets","index","retainedStart","retainedBranches","stagePersistenceRestore","sessions","referenceIndex","retainedThoughtIds","retainedBranchIds","edge","summary","emitter","TypeError"],"mappings":";;;;;;;;;;;;;;;;AAqDO,MAAMA,4BAA4B;AA4DlC,MAAMC;IACZ,OAAwB,iBAAiB,QAAe;IACxD,OAAwB,eAAe,IAAI;IACnC,YAA0C,IAAIC,MAAM;IAC3C,mBAAmB,IAAIA,MAAyD;IACzF,gBAAwB;IACxB,aAAqB;IACrB,eAAuB;IACvB,QAAgB;IAChB,aAAwC;IACxC,oBAA6B;IAC7B,SAAoB;IAEpB,WAAwB;IACxB,cAA8B;IAC9B,UAAmB;IAEnB,cAA8C;IAErC,aAA0B;IACnC,kBAAkB,IAAIC,wBAAwB;IAC9C,mBAA6C;IACpC,gBAA8C;IAC9C,kBAAyD;IACzD,aAA4B;IAC5B,WAAwC;IACjD,iBAA+C,KAAK;IAC3C,4BAA6D;IAC7D,wBAAqC;IAEtD,YAAYC,SAA+B,CAAC,CAAC,CAAE;QAC9C,IAAI,CAAC,OAAO,GAAGA,OAAO,MAAM,IAAI,IAAIC;QACpC,MAAMC,mBAAmBF,OAAO,cAAc,IAAI;QAClD,IAAI,CAAC,eAAe,GAAGG,KAAK,GAAG,CAACD,kBAAkBN;QAClD,IAAIM,mBAAmBN,2BACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,mDAAmD;YACpE,WAAWM;YACX,SAASN;QACV;QAED,IAAI,CAAC,YAAY,GAAGI,OAAO,WAAW,IAAI;QAC1C,IAAI,CAAC,cAAc,GAAGA,OAAO,aAAa,IAAI;QAC9C,IAAI,CAAC,YAAY,GAAGA,OAAO,WAAW,IAAI;QAC1C,IAAI,CAAC,mBAAmB,GAAG,AAAsB,SAAtB,IAAI,CAAC,YAAY;QAC5C,IAAI,CAAC,QAAQ,GAAGA,OAAO,OAAO;QAC9B,IAAI,CAAC,aAAa,GAAGA,OAAO,YAAY,IAAI;QAC5C,IAAI,CAAC,UAAU,GAAGA,OAAO,SAAS;QAClC,IAAI,CAAC,aAAa,GAAGA,OAAO,YAAY;QACxC,IAAI,CAAC,SAAS,GAAGA,OAAO,QAAQ,IAAI;QACpC,IAAI,CAAC,YAAY,GAAGA,OAAO,WAAW;QACtC,IAAI,CAAC,UAAU,GAAGA,OAAO,oBAAoB,IAAI,IAAII;QACrD,IAAI,CAAC,2BAA2B,GAAGJ,OAAO,0BAA0B;QACpE,IAAI,CAAC,uBAAuB,GAAGA,OAAO,sBAAsB;QAG5D,IAAI,CAAC,YAAY,GAAG,IAAIK,YAAY;YACnC,WAAW,IAAI,CAAC,UAAU;YAC1B,UAAU,IAAI,CAAC,SAAS;YACxB,QAAQ,IAAI,CAAC,OAAO;QACrB;QAEA,IAAI,CAAC,eAAe,GAAG,IAAIC,eAA6B;YACvD,cAAcT,eAAe,cAAc;YAC3C,mBAAmB;YACnB,gBAAgB,IAAMA,eAAe,YAAY;YACjD,qBAAqBG,OAAO,mBAAmB,IAAI;YACnD,QAAQ,IAAI,CAAC,OAAO;QACrB;QAEA,IAAI,CAAC,kBAAkB,GAAG;QAC1B,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,YAAY,EAAE;YAClD,IAAI,CAAC,kBAAkB,GAAG,IAAIO,kBAAkB;gBAC/C,aAAa,IAAI,CAAC,YAAY;gBAC9B,YAAYP,OAAO,qBAAqB,IAAI;gBAC5C,eAAeA,OAAO,wBAAwB,IAAI;gBAClD,YAAYA,OAAO,qBAAqB,IAAI;gBAC5C,oBAAoBA,OAAO,sBAAsB,IAAIJ;gBACrD,iBAAiBI,OAAO,eAAe,IAAI;gBAC3C,cAAc,IAAI,CAAC,aAAa;gBAChC,QAAQ,IAAI,CAAC,OAAO;YACrB;YACA,IAAI,CAAC,gBAAgB;QACtB;QACA,MAAMQ,kBACL,AAAsB,SAAtB,IAAI,CAAC,YAAY,IAAa,AAA4B,SAA5B,IAAI,CAAC,kBAAkB,GAClD;YAAE,aAAa;YAAM,SAAS;QAAK,IACnC;YAAE,aAAa,IAAI,CAAC,YAAY;YAAE,SAAS,IAAI,CAAC,kBAAkB;QAAC;QACvE,IAAI,CAAC,iBAAiB,GAAG,IAAIC,wBAAwB;YACpD,GAAGD,eAAe;YAClB,WAAW,IAAI,CAAC,UAAU;YAC1B,cAAc,IAAI,CAAC,aAAa;YAChC,UAAU,IAAI,CAAC,SAAS;YACxB,oBAAoB,CAACE,QAAU,IAAI,CAAC,mBAAmB,CAACA;YACxD,2BAA2B,CAACC,WAAWD;gBACtC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAACC,YAAY,IAAI,CAAC,uBAAuB,CAACD;YAClE;YACA,kBAAkB,CAACC,WAAWD;gBAC7B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAACC,YAAY,IAAI,CAAC,uBAAuB,CAACD;YAClE;YACA,QAAQ,IAAI,CAAC,OAAO;QACrB;QAEA,IAAI,CAAC,eAAe,CAAC,iBAAiB,CACrC,IAAI,CAAC,SAAS,EACd,CAACC,YAAc,IAAI,CAAC,sBAAsB,CAACA,YAC3C,CAACC,aAAe,IAAI,CAAC,cAAc,CAACA;IAEtC;IAIA,IAAY,cAAqD;QAChE,OAAO,IAAI,CAAC,kBAAkB,EAAE,SAAS;IAC1C;IAEQ,mBAAyB;QAChC,IAAI,CAAC,kBAAkB,EAAE;IAC1B;IAEQ,kBAAwB;QAC/B,IAAI,AAAqB,SAArB,IAAI,CAAC,WAAW,EAAW;QAC/B,IAAI,CAAC,kBAAkB,EAAE;IAC1B;IAGO,eAA8B;QACpC,IAAI,CAAC,oCAAoC;QACzC,OAAO,IAAI,CAAC,kBAAkB,EAAE,WAAWC,QAAQ,OAAO;IAC3D;IAQO,aAAaF,SAAoB,EAAiB;QACxD,MAAMG,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAACH;QACnC,IAAIG,AAAYC,WAAZD,SAAuB,IAAI,CAAC,iCAAiC,CAACH,WAAWG;QAC7E,OAAO,IAAI,CAAC,kBAAkB,EAAE,aAAaH,cAAcE,QAAQ,OAAO;IAC3E;IAQO,gBAAgBF,SAAoB,EAAEK,SAA6B,EAAQ;QACjF,IAAI,CAAC,yBAAyB,CAACL,WAAW,IAAI,CAAC,gBAAgB;QAC/D,IAAI,CAAC,UAAU,CAAC,WAAW,CAACA,WAAW;YACtC,IAAI,CAAC,kBAAkB,EAAE,gBAAgBA,WAAWK;YACpD,MAAMF,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAACH;YACnC,IAAIG,AAAYC,WAAZD,SAAuB,IAAI,CAAC,iCAAiC,CAACH,WAAWG;QAC9E;IACD;IAGO,eAAuC;QAC7C,OAAO,IAAI,CAAC,UAAU;IACvB;IAEQ,IAAIG,OAAe,EAAEC,IAA8B,EAAQ;QAClE,IAAI,CAAC,OAAO,CAAC,IAAI,CAACD,SAASC;IAC5B;IAGQ,mBAAuC;QAC9C,OAAOC;IACR;IAYQ,YAAYR,SAAiB,EAAED,KAAc,EAAgB;QACpE,MAAMU,MAAMC,YAAYV;QACxB,IAAI,CAAC,yBAAyB,CAACS,KAAKV;QACpC,MAAMY,WAAW,IAAI,CAAC,SAAS,CAAC,GAAG,CAACF;QACpC,IAAIE,AAAaP,WAAbO,UAAwB;YAC3B,IAAI,CAAC,mBAAmB,CAACF,KAAKE,UAAUZ;YACxCY,SAAS,cAAc,GAAGC,KAAK,GAAG;YAClC,OAAOD;QACR;QACA,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAACF,KAAK,IAAM,IAAI,CAAC,0BAA0B,CAACA,KAAKV;IACpF;IAEQ,2BAA2BU,GAAc,EAAEV,KAAc,EAAgB;QAChF,IAAI,CAAC,yBAAyB,CAACU,KAAKV;QACpC,IAAII,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAACM;QACjC,IAAKN,SAKJ,IAAI,CAAC,mBAAmB,CAACM,KAAKN,SAASJ;aAL1B;YACb,IAAI,CAAC,uBAAuB,CAACA;YAC7BI,UAAU,IAAI,CAAC,mBAAmB,CAACJ;YACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAACU,KAAKN;QACzB;QAGAA,QAAQ,cAAc,GAAGS,KAAK,GAAG;QACjC,OAAOT;IACR;IAEQ,oBACPH,SAAoB,EACpBG,OAAqB,EACrBJ,KAAyB,EAClB;QACP,IAAIA,AAAUK,WAAVL,OAAqB;QACzB,IAAII,AAAuB,eAAvBA,QAAQ,UAAU,EACrB,MAAM,IAAIU,yBAAyBb,WAAW,eAAeD;QAE9D,IAAII,AAAkBC,WAAlBD,QAAQ,KAAK,IAAkBA,QAAQ,KAAK,KAAKJ,OACpD,MAAM,IAAIc,yBAAyBb,WAAWG,QAAQ,KAAK,EAAEJ;QAE9D,IAAII,AAAkBC,WAAlBD,QAAQ,KAAK,EAAgBA,QAAQ,KAAK,GAAGJ;IAClD;IAEQ,wBAAwBA,KAAyB,EAAwB;QAChF,MAAMe,UAAU,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAC5D,IAAI,CAAC,SAAS,EACdf,OACA,CAACC,YAAc,IAAI,CAAC,2BAA2B,CAACA;QAEjD,IAAIc,AAAYV,WAAZU,SAAuB,MAAM,IAAIC,wBAAwB7B,eAAe,YAAY;QACxF,OAAO4B;IACR;IAEQ,wBAAwBf,KAAyB,EAAQ;QAChE,MAAMe,UAAU,IAAI,CAAC,uBAAuB,CAACf;QAC7C,IAAIe,AAAmB,MAAnBA,QAAQ,MAAM,EAAQ;QAC1B,MAAME,UAAU,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAACF,SAAS,CAACb;YAC9D,IAAIA,WAAW,IAAI,CAAC,CAACD,YAAc,CAAC,IAAI,CAAC,uBAAuB,CAACA,aAChE,MAAM,IAAIe,wBAAwB7B,eAAe,YAAY;YAE9D,KAAK,MAAMc,aAAaC,WAAY,IAAI,CAAC,kBAAkB,CAACD;QAC7D;QACA,IAAI,CAACgB,SAAS,MAAM,IAAID,wBAAwB7B,eAAe,YAAY;IAC5E;IAEQ,4BAA4Bc,SAAoB,EAAW;QAClE,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAACA,cAAc,IAAI,CAAC,uBAAuB,CAACA;IAC1E;IAEQ,uBAAuBA,SAAoB,EAAW;QAC7D,MAAMiB,mBACL,IAAI,CAAC,kBAAkB,EAAE,qBAAqBjB,cAAc;QAC7D,OACC,IAAI,CAAC,UAAU,CAAC,MAAM,CAACA,cACvBiB,AAAqB,aAArBA,oBACAA,AAAqB,cAArBA;IAEF;IAEQ,wBAAwBjB,SAAoB,EAAW;QAC9D,OACE,KAAI,CAAC,kBAAkB,EAAE,qBAAqBA,cAAc,WAAU,MAAO;IAEhF;IAEA,MAAc,eAAeC,UAAgC,EAAiB;QAC7E,MAAMiB,UAAU,MAAMhB,QAAQ,UAAU,CACvCD,WAAW,GAAG,CAAC,CAACD,YAAc,IAAI,CAAC,aAAa,CAACA;QAElD,MAAMmB,WAAWD,QAAQ,OAAO,CAAC,CAACE,SACjCA,AAAkB,eAAlBA,OAAO,MAAM,GAAkB;gBAACA,OAAO,MAAM;aAAC,GAAG,EAAE;QAEpD,IAAID,SAAS,MAAM,GAAG,GAAG,MAAM,IAAIE,eAAeF,UAAU;IAC7D;IAEQ,cAAcnB,SAAoB,EAAiB;QAC1D,OAAO,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAACA,WAAW;YACrD,IAAI,AAA4B,SAA5B,IAAI,CAAC,kBAAkB,EAAW,YACrC,IAAI,CAAC,kBAAkB,CAACA;YAGzB,MAAMG,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAACH;YACnC,IAAIG,AAAYC,WAAZD,SAAuB,IAAI,CAAC,iCAAiC,CAACH,WAAWG;YAC7E,MAAM,IAAI,CAAC,kBAAkB,CAAC,0BAA0B,CAACH,WAAW;gBACnE,IAAI,CAAC,kBAAkB,CAACA;YACzB;QACD;IACD;IAEQ,mBAAmBA,SAAoB,EAAQ;QACtD,MAAMG,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAACH;QACnC,IAAI,CAAC,2BAA2B,GAAGA;QACnC,IAAI,CAAC,UAAU,EAAE,aAAaA;QAC9B,IAAI,CAAC,aAAa,EAAE,aAAaA;QACjC,IAAI,CAAC,eAAe,CAAC,YAAY,CAACA;QAClC,IAAI,CAAC,SAAS,CAAC,MAAM,CAACA;QACtB,IAAI,CAAC,kBAAkB,EAAE,uBAAuBA;QAChD,IAAIG,AAAYC,WAAZD,SAAuB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAACH,WAAW;YAAE,OAAOG,QAAQ,KAAK;QAAC;IACxF;IAEQ,oBAAoBJ,KAAc,EAAEuB,UAAuB,EAAgB;QAClF,OAAO;YACN,iBAAiB,EAAE;YACnB,UAAU,CAAC;YACX,qBAAqB,IAAInC;YACzB,mBAAmBiB;YACnB,iBAAiBA;YACjB,gBAAgBQ,KAAK,GAAG;YACxB,kBAAkB,IAAIW;YACtB,6BAA6B,IAAIA;YACjCxB;YACAuB;QACD;IACD;IAEQ,0BACPtB,SAAoB,EACpBD,KAAyB,EACJ;QACrB,MAAMyB,iBAAiB,IAAI,CAAC,sBAAsB,CAACxB,WAAWD;QAC9D,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAACC,YAAY,MAAM,IAAIyB,oBAAoBzB;QACxE,OAAOwB;IACR;IAEQ,uBACPxB,SAAoB,EACpBD,KAAyB,EACJ;QACrB,MAAM2B,SAAS,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC1B;QACzC,MAAM2B,eAAeD,AAAWtB,WAAXsB,SAAuB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC1B,YAAY,QAAQ0B,OAAO,KAAK;QAC/F,IAAI3B,AAAUK,WAAVL,SAAuB,IAAI,CAAC,SAAS,CAAC,GAAG,CAACC,YAAY,eAAe,YACxE,MAAM,IAAIa,yBAAyBb,WAAW,eAAeD;QAE9D,IAAIA,AAAUK,WAAVL,SAAuB4B,AAAiBvB,WAAjBuB,gBAA8BA,iBAAiB5B,OACzE,MAAM,IAAIc,yBAAyBb,WAAW2B,cAAc5B;QAE7D,OAAO4B,gBAAgB5B;IACxB;IAEO,6BAA6BC,SAAiB,EAAQ;QAC5D,IAAI,CAAC,sBAAsB,CAACU,YAAYV,YAAY,IAAI,CAAC,gBAAgB;IAC1E;IAEQ,2BAAiC;QACxC,MAAMD,QAAQ,IAAI,CAAC,gBAAgB;QACnC,IAAIA,AAAUK,WAAVL,OAAqB;QACzB,MAAM6B,iBAAiB,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,GAAG,KAAK;QACzD,IAAIA,AAAmBxB,WAAnBwB,gBACH,MAAM,IAAIf,yBAAyBe,gBAAgB,6BAA6B7B;QAEjF,MAAM,IAAI8B,wBACT,CAAC,gFAAgF,EAAE9B,MAAM,CAAC,CAAC,EAC3F+B,YAAY,qBAAqB;IAEnC;IAMO,WAAWC,OAAoB,EAAEC,OAAiC,EAAQ;QAChF,MAAMhC,YAAYU,YAAYqB,QAAQ,UAAU;QAChD,IAAI,CAAC,yBAAyB,CAAC/B,WAAW,IAAI,CAAC,gBAAgB;QAC/D,IAAI,CAAC,UAAU,CAAC,WAAW,CAACA,WAAW,IACtC,IAAI,CAAC,0BAA0B,CAACA,WAAW+B,SAASC;IAEtD;IAEO,+BAA+BD,OAAoB,EAAQ;QACjE,MAAM/B,YAAYU,YAAYqB,QAAQ,UAAU;QAChD,IAAI,CAAC,yBAAyB,CAAC/B,WAAW,IAAI,CAAC,gBAAgB;QAC/D,IAAI+B,AAAe3B,WAAf2B,QAAQ,EAAE,EAAgB;QAC9B,IACC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC/B,WAAW+B,QAAQ,EAAE,KAC9C,IAAI,CAAC,kBAAkB,EAAE,mBAAmB/B,WAAW+B,QAAQ,EAAE,MAAM,MAEvE,MAAM,IAAIE,gBAAgB,MAAM,CAAC,sCAAsC,EAAEF,QAAQ,EAAE,EAAE;IAEvF;IAEQ,2BACP/B,SAAoB,EACpB+B,OAAoB,EACpBC,OAAiC,EAC1B;QACP,IAAI,CAAC,kBAAkB,EAAE,2BAA2BhC;QACpD,MAAMD,QAAQ,IAAI,CAAC,gBAAgB;QACnC,IAAI,CAAC,yBAAyB,CAACC,WAAWD;QAC1C,IAAI,CAAC,8BAA8B,CAACgC;QACpC,MAAMG,qBAAqB,IAAI,CAAC,2BAA2B,CAAClC,WAAW+B,SAASC;QAChF,MAAM7B,UAAU,IAAI,CAAC,0BAA0B,CAACH,WAAWD;QAC3D,IAAI,CAAC,QAAQ,EAAE,QACd,0BACA,GACA,CAAC,GACD;QAGDI,QAAQ,eAAe,CAAC,IAAI,CAAC4B;QAC7B,IAAI,CAAC,yBAAyB,CAAC5B,SAAS4B,SAASG;QAIjD,IAAIA,AAAgD9B,WAAhD8B,mBAAmB,wBAAwB,EAC9C,IAAI,CAAC,gBAAgB,CAAC/B,SAAS+B,mBAAmB,wBAAwB;QAI3E,IAAIH,QAAQ,mBAAmB,EAC9B5B,QAAQ,iBAAiB,GAAG4B,QAAQ,mBAAmB;QAExD,IAAIA,QAAQ,gBAAgB,EAC3B5B,QAAQ,eAAe,GAAG4B,QAAQ,gBAAgB;QAGnD,IAAIA,QAAQ,mBAAmB,IAAIA,QAAQ,SAAS,EACnD,IAAI,CAAC,mBAAmB,CAAC5B,SAAS4B,QAAQ,SAAS,EAAEA;QAGtD,IAAIA,QAAQ,mBAAmB,EAAE,UAAUA,QAAQ,gBAAgB,EAAE,QACpE,IAAI,CAAC,QAAQ,EAAE,QACd,kCACA,GACA,CAAC,GACD;QAIF,MAAMI,YAAY,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAChC,SAAS4B,SAAS;YACzE,GAAGC,OAAO;YACVE;QACD;QACA,MAAME,mBAAmB,IAAI,CAAC,iBAAiB,CAACjC,SAAS4B,QAAQ,SAAS;QAC1E,IAAI,CAAC,yBAAyB,CAAC5B;QAC/B,IAAI,CAAC,sBAAsB,CAACH,WAAWG;QACvC,MAAMkC,cAAc,IAAI,CAAC,qBAAqB,CAACrC,WAAWG;QAC1D,IAAI,CAAC,oBAAoB,CACxBH,WACAG,SACA4B,SACAK,kBACAD,WACAE,aACAH,mBAAmB,wBAAwB;IAE7C;IAEQ,4BACPlC,SAAoB,EACpB+B,OAAoB,EACpBC,OAAiC,EAC4B;QAC7D,MAAMM,WACLN,SAAS,sBACTO,qCAAqCR,SAAS,CAACS,gBAC9C,IAAI,CAAC,eAAe,CAAC,OAAO,CAACxC,WAAWwC;QAE1C,IACCT,AAAyB,gBAAzBA,QAAQ,YAAY,IACpBA,AAA6B3B,WAA7B2B,QAAQ,gBAAgB,IACxBO,AAAsClC,WAAtCkC,SAAS,wBAAwB,EAEjC,MAAM,IAAIG,sBACT,CAAC,iBAAiB,EAAEV,QAAQ,gBAAgB,CAAC,8BAA8B,CAAC;QAG9E,OAAOO;IACR;IAEQ,kBACPnC,OAAqB,EACrBuC,QAA8B,EACR;QACtB,IAAIvC,QAAQ,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE;YAC1DA,QAAQ,eAAe,GAAGA,QAAQ,eAAe,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe;YAC7E,IAAI,CAAC,GAAG,CAAC,CAAC,mBAAmB,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE;gBAC5D,SAAS,IAAI,CAAC,eAAe;YAC9B;QACD;QACA,IAAIuC,AAAatC,WAAbsC,UAAwB,IAAI,CAAC,sBAAsB,CAACvC,SAASuC;QACjE,OAAO,IAAI,CAAC,uBAAuB,CAACvC;IACrC;IAEQ,0BACPA,OAAqB,EACrB4B,OAAoB,EACpBY,UAAsE,EAC/D;QACP,MAAMC,WAAWC,2BAA2Bd,SAASY;QACrD,IAAIZ,AAAe3B,WAAf2B,QAAQ,EAAE,IAAkBa,AAAaxC,WAAbwC,UAC/BzC,QAAQ,mBAAmB,CAAC,GAAG,CAAC4B,QAAQ,EAAE,EAAEa;IAE9C;IAEQ,0BAA0BzC,OAAqB,EAAQ;QAC9D,MAAM2C,cAAc,IAAIvB,IACvB;YAACpB,QAAQ,eAAe;eAAK4C,OAAO,MAAM,CAAC5C,QAAQ,QAAQ;SAAE,CAC3D,IAAI,GACJ,OAAO,CAAC,CAAC4B,UAAaA,AAAe3B,WAAf2B,QAAQ,EAAE,GAAiB,EAAE,GAAG;gBAACA,QAAQ,EAAE;aAAC;QAErE,KAAK,MAAM,CAACiB,YAAYJ,SAAS,IAAIzC,QAAQ,mBAAmB,CAC/D,IAAI,CAAC2C,YAAY,GAAG,CAACE,eAAe,CAACF,YAAY,GAAG,CAACF,WACpDzC,QAAQ,mBAAmB,CAAC,MAAM,CAAC6C;IAGtC;IAEQ,sBAAsBhD,SAAoB,EAAEG,OAAqB,EAAU;QAClF,IAAI,AAAoBC,WAApB,IAAI,CAAC,UAAU,EAAgB,OAAO;QAC1C,MAAM0C,cAAc,IAAIvB;QACxB,MAAM0B,2BAA2B,IAAI1B;QACrC,KAAK,MAAMQ,WAAW;YAAC5B,QAAQ,eAAe;eAAK4C,OAAO,MAAM,CAAC5C,QAAQ,QAAQ;SAAE,CAAC,IAAI,GACvF,IAAI4B,AAAe3B,WAAf2B,QAAQ,EAAE,EAAgBe,YAAY,GAAG,CAACf,QAAQ,EAAE;QAEzD,KAAK,MAAMA,WAAWgB,OAAO,MAAM,CAAC5C,QAAQ,QAAQ,EAAE,IAAI,GACzD,IAAI4B,AAAe3B,WAAf2B,QAAQ,EAAE,EAAgBkB,yBAAyB,GAAG,CAAClB,QAAQ,EAAE;QAEtE,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC/B,WAAW8C,aAAaG;IAC7D;IAEQ,qBACPjD,SAAoB,EACpBG,OAAqB,EACrB4B,OAAoB,EACpBK,gBAAqC,EACrCD,SAAkB,EAClBE,WAAmB,EACnBa,wBAAoC,EAC7B;QACP,MAAMC,SAAS,IAAI,CAAC,kBAAkB;QACtC,IAAIA,AAAW,SAAXA,QAAiB;QACrB,IAAID,AAA6B9C,WAA7B8C,0BAAwCC,OAAO,aAAa,CAACnD,WAAW+B;aACvEoB,OAAO,eAAe,CAACnD,WAAW+B,SAASmB;QAChD,IACCnB,AAAsB3B,WAAtB2B,QAAQ,SAAS,IACjBmB,AAA6B9C,WAA7B8C,4BACAd,iBAAiB,MAAM,GAAG,KAC1BjC,QAAQ,2BAA2B,CAAC,IAAI,GAAG,GAE3C,IAAI,CAAC,uBAAuB,CAACH,WAAWG,SAASiC;QAElD,IAAI,AAAoBhC,WAApB,IAAI,CAAC,UAAU,IAAmB+B,CAAAA,aAAaE,cAAc,IAChEc,OAAO,WAAW,CAACnD,WAAW,IAAI,CAAC,UAAU,CAAC,eAAe,CAACA;IAEhE;IAEQ,uCAA6C;QACpD,KAAK,MAAM,CAACA,WAAWG,QAAQ,IAAI,IAAI,CAAC,SAAS,CAChD,IAAI,CAAC,iCAAiC,CAACH,WAAWG;IAEpD;IAEQ,kCAAkCH,SAAoB,EAAEG,OAAqB,EAAQ;QAC5F,IAAIA,AAA6C,MAA7CA,QAAQ,2BAA2B,CAAC,IAAI,EAAQ;QACpD,IAAI,CAAC,uBAAuB,CAACH,WAAWG,SAAS,EAAE;IACpD;IAEQ,wBACPH,SAAoB,EACpBG,OAAqB,EACrBiD,eAAoC,EAC7B;QACP,MAAMD,SAAS,IAAI,CAAC,kBAAkB;QACtC,IAAIA,AAAW,SAAXA,QAAiB;QACrB,KAAK,MAAMT,YAAYvC,QAAQ,gBAAgB,CAAE;YAChD,MAAMkD,SAASlD,QAAQ,QAAQ,CAACuC,SAAS;YACzC,IAAIW,AAAWjD,WAAXiD,QAAsBF,OAAO,YAAY,CAACnD,WAAW0C,UAAUW;QACpE;QACA,MAAMC,oBAAoB,IAAI/B,IAAI;eAAIpB,QAAQ,2BAA2B;eAAKiD;SAAgB;QAC9F,KAAK,MAAMV,YAAYY,kBACtB,IAAInD,AAA+BC,WAA/BD,QAAQ,QAAQ,CAACuC,SAAS,EAAgBS,OAAO,YAAY,CAACnD,WAAW0C;QAE9EvC,QAAQ,2BAA2B,CAAC,KAAK;IAC1C;IAGQ,iBAAiBA,OAAqB,EAAEyC,QAAmB,EAAQ;QAC1E,KAAK,MAAMW,KAAKpD,QAAQ,eAAe,CACtC,IAAIoD,EAAE,EAAE,KAAKX,UAAUW,EAAE,SAAS,GAAG;QAEtC,KAAK,MAAMC,kBAAkBT,OAAO,MAAM,CAAC5C,QAAQ,QAAQ,EAC1D,KAAK,MAAMoD,KAAKC,eACf,IAAID,EAAE,EAAE,KAAKX,UAAUW,EAAE,SAAS,GAAG;IAGxC;IAEQ,uBAAuBvD,SAAoB,EAAEG,OAAqB,EAAQ;QACjF,MAAMsD,WAAW;YAACtD,QAAQ,eAAe;eAAK4C,OAAO,MAAM,CAAC5C,QAAQ,QAAQ;SAAE,CAAC,IAAI;QACnF,IAAI,CAAC,eAAe,CAAC,cAAc,CAACH,WAAWyD;IAChD;IAEO,wBACNzD,SAAoB,EACpBwC,aAAqB,EACQ;QAC7B,IAAI,CAAC,yBAAyB,CAACxC,WAAW,IAAI,CAAC,gBAAgB;QAC/D,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAACA,WAAWwC;IAChD;IAEQ,oBACPrC,OAAqB,EACrBuC,QAAkB,EAClBX,OAAoB,EACb;QACP,IAAI,CAAC5B,QAAQ,QAAQ,CAACuC,SAAS,EAC9BvC,QAAQ,QAAQ,CAACuC,SAAS,GAAG,EAAE;QAEhCvC,QAAQ,gBAAgB,CAAC,GAAG,CAACuC;QAC7BvC,QAAQ,QAAQ,CAACuC,SAAS,CAAC,IAAI,CAACX;IACjC;IAEQ,wBAAwB5B,OAAqB,EAAuB;QAC3E,MAAMuD,cAAcvD,QAAQ,gBAAgB,CAAC,IAAI;QACjD,IAAIuD,eAAe,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE;QAC/C,MAAMC,qBAAqBC,MAAM,IAAI,CAACzD,QAAQ,gBAAgB,EAAE,KAAK,CACpE,GACAuD,cAAc,IAAI,CAAC,YAAY;QAEhC,MAAMG,mBAA+B,EAAE;QACvC,KAAK,MAAMnB,YAAYiB,mBAAoB;YAC1CxD,QAAQ,gBAAgB,CAAC,MAAM,CAACuC;YAChC,IAAIvC,AAA+BC,WAA/BD,QAAQ,QAAQ,CAACuC,SAAS,EAAgBmB,iBAAiB,IAAI,CAACnB;YACpE,OAAOvC,QAAQ,QAAQ,CAACuC,SAAS;YACjC,IAAI,CAAC,GAAG,CAAC,CAAC,oBAAoB,EAAEA,UAAU,EAAE;gBAAEA;YAAS;QACxD;QACA,OAAOmB;IACR;IAEQ,uBAAuB1D,OAAqB,EAAEuC,QAAkB,EAAQ;QAC/E,MAAMW,SAASlD,QAAQ,QAAQ,CAACuC,SAAS;QACzC,IAAIW,AAAWjD,WAAXiD,UAAwBA,OAAO,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;YAChE,MAAMS,UAAUT,OAAO,MAAM,GAAG,IAAI,CAAC,cAAc;YACnDlD,QAAQ,QAAQ,CAACuC,SAAS,GAAGW,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc;YAC9D,IAAI,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAEX,SAAS,WAAW,EAAEoB,QAAQ,aAAa,CAAC,EAAE;gBACzEpB;gBACAoB;YACD;QACD;IACD;IAEO,WAAW9D,SAAiB,EAAiB;QACnD,OAAO,IAAI,CAAC,WAAW,CAACA,WAAW,IAAI,CAAC,gBAAgB,IAAI,eAAe;IAC5E;IAMO,mBAAmBA,SAAiB,EAAE+D,IAAyB,EAAmB;QACxF,MAAMC,UAAU,IAAI,CAAC,UAAU,CAAChE;QAChC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,aAAa,EACzC,OAAOgE,QAAQ,KAAK;QAErB,MAAMC,SAAS,IAAIC,kBAAkB,IAAI,CAAC,aAAa;QACvD,OAAOD,OAAO,KAAK,CAACD,SAAStD,YAAYV,YAAY+D;IACtD;IAEO,iBAAiB/D,SAAiB,EAAU;QAClD,OAAO,IAAI,CAAC,WAAW,CAACA,WAAW,IAAI,CAAC,gBAAgB,IAAI,eAAe,CAAC,MAAM;IACnF;IAEO,YAAYA,SAAiB,EAAmC;QACtE,OAAO,IAAI,CAAC,WAAW,CAACA,WAAW,IAAI,CAAC,gBAAgB,IAAI,QAAQ;IACrE;IAEO,aAAaA,SAAiB,EAAc;QAClD,OAAO4D,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC5D,WAAW,IAAI,CAAC,gBAAgB,IAAI,gBAAgB;IACxF;IAGO,eAAeA,SAAiB,EAA0B;QAChE,MAAMmE,qBAAqBzD,YAAYV;QACvC,IAAI,CAAC,yBAAyB,CAACmE,oBAAoB,IAAI,CAAC,gBAAgB;QACxE,MAAMhE,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAACgE;QACnC,IAAIhE,AAAYC,WAAZD,SACH,OAAO;YACN,SAAS,EAAE;YACX,UAAU,CAAC;YACX,qBAAqB,IAAIhB;YACzB,WAAW,EAAE;YACb,mBAAmBiB;YACnB,iBAAiBA;QAClB;QAED,OAAO;YACN,SAAS;mBAAID,QAAQ,eAAe;aAAC;YACrC,UAAU4C,OAAO,WAAW,CAC3BA,OAAO,OAAO,CAAC5C,QAAQ,QAAQ,EAAE,GAAG,CAAC,CAAC,CAACuC,UAAU0B,SAAS,GAAK;oBAAC1B;oBAAU;2BAAI0B;qBAAS;iBAAC;YAEzF,qBAAqB,IAAIjF,IAAIgB,QAAQ,mBAAmB;YACxD,WAAWyD,MAAM,IAAI,CAACzD,QAAQ,gBAAgB;YAC9C,mBACCA,AAA8BC,WAA9BD,QAAQ,iBAAiB,GAAiBC,SAAY;mBAAID,QAAQ,iBAAiB;aAAC;YACrF,iBACCA,AAA4BC,WAA5BD,QAAQ,eAAe,GAAiBC,SAAY;mBAAID,QAAQ,eAAe;aAAC;QAClF;IACD;IAGO,eAAeH,SAAiB,EAAE0C,QAAkB,EAAQ;QAClE,IAAI,CAAC,yBAAyB,CAAChC,YAAYV,YAAY,IAAI,CAAC,gBAAgB;QAC5E,IAAI,AAAoB,YAApB,OAAO0C,YAAyBA,AAAoB,MAApBA,SAAS,MAAM,EAClD,MAAM,IAAIT,gBAAgB,aAAa;QAExC,MAAMkC,qBAAqBzD,YAAYV;QACvC,IAAI,CAAC,UAAU,CAAC,WAAW,CAACmE,oBAAoB;YAC/C,IAAI,CAAC,kBAAkB,EAAE,2BAA2BA;YACpD,MAAMhE,UAAU,IAAI,CAAC,0BAA0B,CAACgE,oBAAoB,IAAI,CAAC,gBAAgB;YACzF,IAAIhE,QAAQ,gBAAgB,CAAC,GAAG,CAACuC,WAChC,MAAM,IAAIT,gBAAgB,aAAa,CAAC,uBAAuB,EAAES,UAAU;YAE5EvC,QAAQ,gBAAgB,CAAC,GAAG,CAACuC;YAC7B,MAAMN,mBAAmB,IAAI,CAAC,uBAAuB,CAACjC;YACtD,IAAI,CAAC,sBAAsB,CAACgE,oBAAoBhE;YAChD,MAAMkC,cAAc,IAAI,CAAC,qBAAqB,CAAC8B,oBAAoBhE;YACnE,IAAIiC,iBAAiB,MAAM,GAAG,KAAKjC,QAAQ,2BAA2B,CAAC,IAAI,GAAG,GAC7E,IAAI,CAAC,uBAAuB,CAACgE,oBAAoBhE,SAASiC;YAE3D,IAAI,AAAoBhC,WAApB,IAAI,CAAC,UAAU,IAAkBiC,cAAc,GAClD,IAAI,CAAC,kBAAkB,EAAE,YACxB8B,oBACA,IAAI,CAAC,UAAU,CAAC,eAAe,CAACA;YAGlC,IAAI,CAAC,GAAG,CAAC,qBAAqB;gBAAEzB;gBAAU1C;YAAU;QACrD;IACD;IAEO,aAAaA,SAAiB,EAAE0C,QAAkB,EAAW;QACnE,MAAMvC,UAAU,IAAI,CAAC,WAAW,CAACH,WAAW,IAAI,CAAC,gBAAgB;QACjE,OAAOG,QAAQ,gBAAgB,CAAC,GAAG,CAACuC;IACrC;IAEO,qBAAqB1C,SAAiB,EAAwB;QACpE,OAAO,IAAI,CAAC,WAAW,CAACA,WAAW,IAAI,CAAC,gBAAgB,IAAI,iBAAiB;IAC9E;IAEO,mBAAmBA,SAAiB,EAAwB;QAClE,OAAO,IAAI,CAAC,WAAW,CAACA,WAAW,IAAI,CAAC,gBAAgB,IAAI,eAAe;IAC5E;IAEO,UAAU0C,QAAkB,EAAE1C,SAAiB,EAA6B;QAClF,OAAO,IAAI,CAAC,WAAW,CAACA,WAAW,IAAI,CAAC,gBAAgB,IAAI,QAAQ,CAAC0C,SAAS;IAC/E;IAGA,MAAa,aAAa1C,SAAiB,EAAEqE,mBAAgC,EAAiB;QAC7F,MAAMF,qBAAqBzD,YAAYV;QACvC,IAAI,CAAC,4BAA4B,CAACmE;QAClC,MAAM,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAACA,oBAAoB;YAC1D,MAAMG,QAAQ,UACb,MAAM,IAAI,CAAC,2BAA2B,CAACH,oBAAoBE;YAC5D,IAAI,AAAsBjE,WAAtB,IAAI,CAAC,YAAY,EAAgB,OAAO,MAAMkE;YAClD,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAACH,oBAAoBG;QACtD;IACD;IAGA,MAAa,4BACZtE,SAAoB,EACpBqE,mBAAgC,EAChB;QAChB,MAAM7C,iBAAiB,IAAI,CAAC,sBAAsB,CAACxB,WAAW,IAAI,CAAC,gBAAgB;QACnF,MAAM,IAAI,CAAC,iBAAiB,CAAC,YAAY,CACxCA,WACAwB,gBACA6C,uBACE,CAAqCjE,WAArC,IAAI,CAAC,2BAA2B,GAC9BA,SACA,IAAM,IAAI,CAAC,2BAA2B,GAAGJ,UAAS;QAEvD,IAAI,CAAC,eAAe,CAAC,YAAY,CAACA;QAClC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAACA;IAC9B;IAGA,MAAa,SAASqE,mBAAgC,EAAiB;QACtE,IAAI,CAAC,wBAAwB;QAC7B,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CACpC,UAAY,MAAM,IAAI,CAAC,uBAAuB,CAACA;IAEjD;IAGA,MAAa,wBAAwBA,mBAAgC,EAAiB;QACrF,IAAI,CAAC,wBAAwB;QAC7B,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAACA,uBAAuB,IAAI,CAAC,uBAAuB;QACzF,IAAI,CAAC,eAAe,CAAC,QAAQ;QAC7B,IAAI,CAAC,gBAAgB,CAAC,KAAK;IAC5B;IAEO,gBAA0B;QAChC,OAAOT,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI;IACtC;IAEO,kBAA0B;QAChC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI;IAC3B;IAEQ,eAAeW,QAAyB,EAAgB;QAC/D,MAAMpE,UAAU,IAAI,CAAC,mBAAmB,CAACC,QAAW;QACpDD,QAAQ,mBAAmB,GAAGqE,+BAC7BD,SAAS,SAAS,EAClBA,SAAS,OAAO,EAChBA,SAAS,QAAQ;QAElB,IAAK,IAAIE,QAAQF,SAAS,OAAO,CAAC,MAAM,GAAG,GAAGE,SAAS,GAAGA,QAAS;YAClE,MAAM1C,UAAUwC,SAAS,OAAO,CAACE,MAAM;YACvC,IAAI1C,AAAY3B,WAAZ2B;gBACJ,IAAI5B,AAA8BC,WAA9BD,QAAQ,iBAAiB,IAAkB4B,AAAgC3B,WAAhC2B,QAAQ,mBAAmB,EACzE5B,QAAQ,iBAAiB,GAAG;uBAAI4B,QAAQ,mBAAmB;iBAAC;gBAE7D,IAAI5B,AAA4BC,WAA5BD,QAAQ,eAAe,IAAkB4B,AAA6B3B,WAA7B2B,QAAQ,gBAAgB,EACpE5B,QAAQ,eAAe,GAAG;uBAAI4B,QAAQ,gBAAgB;iBAAC;gBAExD,IAAI5B,AAA8BC,WAA9BD,QAAQ,iBAAiB,IAAkBA,AAA4BC,WAA5BD,QAAQ,eAAe,EAAgB;;QACvF;QACAA,QAAQ,eAAe,GAAGoE,SAAS,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe;QACtE,MAAMG,gBAAgBlF,KAAK,GAAG,CAAC,GAAG+E,SAAS,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY;QAC9E,MAAMI,mBAAmBJ,SAAS,QAAQ,CAAC,KAAK,CAACG;QACjD,KAAK,MAAMrB,UAAUkB,SAAS,QAAQ,CAAC,KAAK,CAAC,GAAGG,eAC/CvE,QAAQ,2BAA2B,CAAC,GAAG,CAACkD,OAAO,QAAQ;QAExD,KAAK,MAAMA,UAAUsB,iBAAkB;YACtCxE,QAAQ,gBAAgB,CAAC,GAAG,CAACkD,OAAO,QAAQ;YAC5ClD,QAAQ,QAAQ,CAACkD,OAAO,QAAQ,CAAC,GAAGA,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc;QAC/E;QACA,IAAI,CAAC,yBAAyB,CAAClD;QAC/B,OAAOA;IACR;IAGA,MAAa,sBAAqC;QACjD,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,YAAY,EAClD;QAGD,MAAMoE,WAAW,MAAMK,wBAAwB,IAAI,CAAC,YAAY;QAChE,MAAMC,WAAWN,SAAS,QAAQ,CAAC,GAAG,CACrC,CAACpE,UAAY;gBAACA,QAAQ,SAAS;gBAAE,IAAI,CAAC,cAAc,CAACA;aAAS;QAE/D,MAAM2E,iBAAiB,IAAI1F;QAC3B,MAAM2F,qBAAqB,IAAI5F;QAC/B,MAAM8D,2BAA2B,IAAI9D;QACrC,KAAK,MAAM,CAACa,WAAWG,QAAQ,IAAI0E,SAAU;YAC5C,MAAMpB,WAAW;gBAACtD,QAAQ,eAAe;mBAAK4C,OAAO,MAAM,CAAC5C,QAAQ,QAAQ;aAAE,CAAC,IAAI;YACnF2E,eAAe,cAAc,CAAC9E,WAAWyD;YACzCsB,mBAAmB,GAAG,CACrB/E,WACA,IAAIuB,IAAIkC,SAAS,OAAO,CAAC,CAAC1B,UAAaA,AAAe3B,WAAf2B,QAAQ,EAAE,GAAiB,EAAE,GAAG;oBAACA,QAAQ,EAAE;iBAAC;YAEpFkB,yBAAyB,GAAG,CAC3BjD,WACA,IAAIuB,IACHwB,OAAO,MAAM,CAAC5C,QAAQ,QAAQ,EAAE,OAAO,CAAC,CAACkD,SACxCA,OAAO,OAAO,CAAC,CAACtB,UAAaA,AAAe3B,WAAf2B,QAAQ,EAAE,GAAiB,EAAE,GAAG;wBAACA,QAAQ,EAAE;qBAAC;QAI7E;QACA,IAAI,CAAC,kBAAkB,EAAE,gCAAgCwC,SAAS,QAAQ;QAE1E,IAAI,CAAC,UAAU,EAAE;QACjB,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,SAAS,CAAC,KAAK;QACpB,KAAK,MAAM,CAACvE,WAAWG,QAAQ,IAAI0E,SAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC7E,WAAWG;QAC3E,IAAI,CAAC,eAAe,GAAG2E;QACvB,KAAK,MAAM3E,WAAWoE,SAAS,QAAQ,CAAE;YACxC,MAAMzB,cAAciC,mBAAmB,GAAG,CAAC5E,QAAQ,SAAS,KAAK,IAAIoB;YACrE,MAAMyD,oBACL/B,yBAAyB,GAAG,CAAC9C,QAAQ,SAAS,KAAK,IAAIoB;YACxD,KAAK,MAAM0D,QAAQ9E,QAAQ,KAAK,CAC/B,IAAI,AAAC2C,YAAY,GAAG,CAACmC,KAAK,IAAI,KAAMnC,YAAY,GAAG,CAACmC,KAAK,EAAE,GAC3D;gBAAA,IAAIA,AAAc,aAAdA,KAAK,IAAI,IAAkBD,kBAAkB,GAAG,CAACC,KAAK,EAAE,GAC5D,IAAI,CAAC,UAAU,EAAE,QAAQA;YAD8C;YAGxE,KAAK,MAAMC,WAAW/E,QAAQ,SAAS,CAAE,IAAI,CAAC,aAAa,EAAE,IAAI+E;QAClE;QACA,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,EAAEX,SAAS,QAAQ,CAAC,MAAM,CAAC,uBAAuB,CAAC;IACvE;IAEO,uBAAgC;QACtC,OAAO,IAAI,CAAC,mBAAmB;IAChC;IAEO,wBAAmD;QACzD,OAAO,IAAI,CAAC,YAAY;IACzB;IAGO,gBAAgBY,OAAgC,EAAQ;QAC9D,IAAI,CAAC,aAAa,GAAGA;QACrB,IAAI,CAAC,kBAAkB,EAAE,gBAAgBA;IAC1C;IASO,kBAAkBpF,KAA0B,EAAQ;QAC1D,IAAI,AAAwB,SAAxB,IAAI,CAAC,cAAc,EACtB,MAAM,IAAIqF,UAAU;QAErB,IAAI,CAAC,cAAc,GAAGrF;IACvB;IAGO,WAA0B;QAChC,IAAI,AAAwB,SAAxB,IAAI,CAAC,cAAc,EAAW,OAAO,IAAI,CAAC,cAAc;QAC5D,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC/B,MAAM,IAAI,CAAC,uBAAuB;YAClC,IAAI,CAAC,2BAA2B;QACjC;IACD;IAGA,MAAa,0BAAyC;QACrD,IAAI,CAAC,eAAe;QACpB,IAAI,CAAC,eAAe,CAAC,gBAAgB;QACrC,MAAM,IAAI,CAAC,YAAY;IACxB;IAGO,8BAAoC;QAC1C,KAAK,MAAMC,aAAa,IAAI,CAAC,SAAS,CAAC,IAAI,GAC1C,IAAI,CAAC,kBAAkB,EAAE,uBAAuBA;QAEjD,IAAI,CAAC,SAAS,CAAC,KAAK;QACpB,IAAI,CAAC,eAAe,CAAC,QAAQ;QAC7B,IAAI,CAAC,UAAU,EAAE;QACjB,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,uBAAuB;QAC5B,IAAI,CAAC,gBAAgB,CAAC,KAAK;IAC5B;IAGO,uBAA+B;QACrC,OAAO,IAAI,CAAC,kBAAkB,EAAE,uBAAuB;IACxD;AACD"}
@@ -111,6 +111,8 @@ export interface IHistoryManager {
111
111
  resetAllWithinExclusive(clearAuxiliaryState?: () => void): Promise<void>;
112
112
  /** Returns a non-mutating session snapshot without creating or binding state. */
113
113
  inspectSession(sessionId: string): HistorySessionSnapshot;
114
+ /** Checks reset authorization without creating or claiming state; permits expired scopes. */
115
+ assertSessionResetAuthorized(sessionId: string): void;
114
116
  /** Returns the currently materialized session identifiers without binding ownership. */
115
117
  getSessionIds(): string[];
116
118
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"IHistoryManager.d.ts","sourceRoot":"","sources":["../../src/core/IHistoryManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IHistoryManager.d.ts","sourceRoot":"","sources":["../../src/core/IHistoryManager.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,10 @@ export declare class LockTimeoutError extends SequentialThinkingError {
16
16
  readonly timeoutMs: number;
17
17
  constructor(sessionId: SessionId, timeoutMs: number);
18
18
  }
19
+ export declare class SessionExpiredError extends SequentialThinkingError {
20
+ readonly sessionId: SessionId;
21
+ constructor(sessionId: SessionId);
22
+ }
19
23
  /** Error thrown when a session is accessed by a non-owner. */
20
24
  export declare class SessionAccessDeniedError extends SequentialThinkingError {
21
25
  readonly sessionId: SessionId;
@@ -1 +1 @@
1
- {"version":3,"file":"SessionErrors.d.ts","sourceRoot":"","sources":["../../src/core/SessionErrors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAe,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEpE,iEAAiE;AACjE,MAAM,MAAM,2BAA2B,GACpC,WAAW,GACX,cAAc,GACd,UAAU,GACV,iBAAiB,GACjB,eAAe,GACf,SAAS,GACT,iBAAiB,CAAC;AAErB,mFAAmF;AACnF,qBAAa,2BAA4B,SAAQ,uBAAuB;IACvE,wFAAwF;IACxF,SAAgB,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;IACjD,+CAA+C;IAC/C,SAAgB,KAAK,EAAE,2BAA2B,CAAC;gBAEhC,SAAS,EAAE,SAAS,GAAG,SAAS,EAAE,KAAK,EAAE,2BAA2B;CAUvF;AAED,6EAA6E;AAC7E,qBAAa,gBAAiB,SAAQ,uBAAuB;IAC5D,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC,SAAgB,SAAS,EAAE,MAAM,CAAC;gBAEtB,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM;CAMnD;AAED,8DAA8D;AAC9D,qBAAa,wBAAyB,SAAQ,uBAAuB;IACpE,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC,SAAgB,aAAa,EAAE,MAAM,CAAC;IACtC,SAAgB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;gBAEpC,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;CAU7E"}
1
+ {"version":3,"file":"SessionErrors.d.ts","sourceRoot":"","sources":["../../src/core/SessionErrors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAe,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEpE,iEAAiE;AACjE,MAAM,MAAM,2BAA2B,GACpC,WAAW,GACX,cAAc,GACd,UAAU,GACV,iBAAiB,GACjB,eAAe,GACf,SAAS,GACT,iBAAiB,CAAC;AAErB,mFAAmF;AACnF,qBAAa,2BAA4B,SAAQ,uBAAuB;IACvE,wFAAwF;IACxF,SAAgB,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;IACjD,+CAA+C;IAC/C,SAAgB,KAAK,EAAE,2BAA2B,CAAC;gBAEhC,SAAS,EAAE,SAAS,GAAG,SAAS,EAAE,KAAK,EAAE,2BAA2B;CAUvF;AAED,6EAA6E;AAC7E,qBAAa,gBAAiB,SAAQ,uBAAuB;IAC5D,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC,SAAgB,SAAS,EAAE,MAAM,CAAC;gBAEtB,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM;CAMnD;AAED,qBAAa,mBAAoB,SAAQ,uBAAuB;IAC/D,SAAgB,SAAS,EAAE,SAAS,CAAC;gBAEzB,SAAS,EAAE,SAAS;CAQhC;AAED,8DAA8D;AAC9D,qBAAa,wBAAyB,SAAQ,uBAAuB;IACpE,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC,SAAgB,aAAa,EAAE,MAAM,CAAC;IACtC,SAAgB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;gBAEpC,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;CAU7E"}
@@ -20,6 +20,14 @@ class LockTimeoutError extends SequentialThinkingError {
20
20
  this.timeoutMs = timeoutMs;
21
21
  }
22
22
  }
23
+ class SessionExpiredError extends SequentialThinkingError {
24
+ sessionId;
25
+ constructor(sessionId){
26
+ super(`Session '${sessionId}' has expired. Use an authorized explicit reset or reset_state: true for a fresh chain, or choose a new session_id.`, ERROR_CODES.SESSION_EXPIRED);
27
+ this.name = 'SessionExpiredError';
28
+ this.sessionId = sessionId;
29
+ }
30
+ }
23
31
  class SessionAccessDeniedError extends SequentialThinkingError {
24
32
  sessionId;
25
33
  expectedOwner;
@@ -32,6 +40,6 @@ class SessionAccessDeniedError extends SequentialThinkingError {
32
40
  this.actualOwner = actualOwner;
33
41
  }
34
42
  }
35
- export { LockTimeoutError, SessionAccessDeniedError, SessionLifecycleClosedError };
43
+ export { LockTimeoutError, SessionAccessDeniedError, SessionExpiredError, SessionLifecycleClosedError };
36
44
 
37
45
  //# sourceMappingURL=SessionErrors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"core/SessionErrors.js","sources":["../../src/core/SessionErrors.ts"],"sourcesContent":["import type { SessionId } from '../contracts/ids.js';\nimport { ERROR_CODES, SequentialThinkingError } from '../errors.js';\n\n/** Lifecycle phase that can close ordinary session admission. */\nexport type SessionLifecycleClosedPhase =\n\t| 'resetting'\n\t| 'reset_failed'\n\t| 'evicting'\n\t| 'eviction_failed'\n\t| 'shutting_down'\n\t| 'stopped'\n\t| 'shutdown_failed';\n\n/** Error thrown when an operation arrives after lifecycle admission has closed. */\nexport class SessionLifecycleClosedError extends SequentialThinkingError {\n\t/** Session whose admission is closed, or `undefined` for a global exclusive request. */\n\tpublic readonly sessionId: SessionId | undefined;\n\t/** Lifecycle phase that rejected admission. */\n\tpublic readonly phase: SessionLifecycleClosedPhase;\n\n\tpublic constructor(sessionId: SessionId | undefined, phase: SessionLifecycleClosedPhase) {\n\t\tconst scope = sessionId === undefined ? 'Global' : `Session '${sessionId}'`;\n\t\tsuper(\n\t\t\t`${scope} lifecycle admission is closed in phase '${phase}'`,\n\t\t\tERROR_CODES.SESSION_LIFECYCLE_CLOSED\n\t\t);\n\t\tthis.name = 'SessionLifecycleClosedError';\n\t\tthis.sessionId = sessionId;\n\t\tthis.phase = phase;\n\t}\n}\n\n/** Error thrown when a per-session async lock cannot be acquired in time. */\nexport class LockTimeoutError extends SequentialThinkingError {\n\tpublic readonly sessionId: SessionId;\n\tpublic readonly timeoutMs: number;\n\n\tconstructor(sessionId: SessionId, timeoutMs: number) {\n\t\tsuper(`Lock timeout for session '${sessionId}' after ${timeoutMs}ms`, ERROR_CODES.LOCK_TIMEOUT);\n\t\tthis.name = 'LockTimeoutError';\n\t\tthis.sessionId = sessionId;\n\t\tthis.timeoutMs = timeoutMs;\n\t}\n}\n\n/** Error thrown when a session is accessed by a non-owner. */\nexport class SessionAccessDeniedError extends SequentialThinkingError {\n\tpublic readonly sessionId: SessionId;\n\tpublic readonly expectedOwner: string;\n\tpublic readonly actualOwner: string | undefined;\n\n\tconstructor(sessionId: SessionId, expectedOwner: string, actualOwner?: string) {\n\t\tsuper(\n\t\t\t`Access denied to session '${sessionId}': owned by '${expectedOwner}', accessed by '${actualOwner ?? 'anonymous'}'`,\n\t\t\tERROR_CODES.SESSION_ACCESS_DENIED\n\t\t);\n\t\tthis.name = 'SessionAccessDeniedError';\n\t\tthis.sessionId = sessionId;\n\t\tthis.expectedOwner = expectedOwner;\n\t\tthis.actualOwner = actualOwner;\n\t}\n}\n"],"names":["SessionLifecycleClosedError","SequentialThinkingError","sessionId","phase","scope","undefined","ERROR_CODES","LockTimeoutError","timeoutMs","SessionAccessDeniedError","expectedOwner","actualOwner"],"mappings":";AAcO,MAAMA,oCAAoCC;IAEhC,UAAiC;IAEjC,MAAmC;IAEnD,YAAmBC,SAAgC,EAAEC,KAAkC,CAAE;QACxF,MAAMC,QAAQF,AAAcG,WAAdH,YAA0B,WAAW,CAAC,SAAS,EAAEA,UAAU,CAAC,CAAC;QAC3E,KAAK,CACJ,GAAGE,MAAM,yCAAyC,EAAED,MAAM,CAAC,CAAC,EAC5DG,YAAY,wBAAwB;QAErC,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,SAAS,GAAGJ;QACjB,IAAI,CAAC,KAAK,GAAGC;IACd;AACD;AAGO,MAAMI,yBAAyBN;IACrB,UAAqB;IACrB,UAAkB;IAElC,YAAYC,SAAoB,EAAEM,SAAiB,CAAE;QACpD,KAAK,CAAC,CAAC,0BAA0B,EAAEN,UAAU,QAAQ,EAAEM,UAAU,EAAE,CAAC,EAAEF,YAAY,YAAY;QAC9F,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,SAAS,GAAGJ;QACjB,IAAI,CAAC,SAAS,GAAGM;IAClB;AACD;AAGO,MAAMC,iCAAiCR;IAC7B,UAAqB;IACrB,cAAsB;IACtB,YAAgC;IAEhD,YAAYC,SAAoB,EAAEQ,aAAqB,EAAEC,WAAoB,CAAE;QAC9E,KAAK,CACJ,CAAC,0BAA0B,EAAET,UAAU,aAAa,EAAEQ,cAAc,gBAAgB,EAAEC,eAAe,YAAY,CAAC,CAAC,EACnHL,YAAY,qBAAqB;QAElC,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,SAAS,GAAGJ;QACjB,IAAI,CAAC,aAAa,GAAGQ;QACrB,IAAI,CAAC,WAAW,GAAGC;IACpB;AACD"}
1
+ {"version":3,"file":"core/SessionErrors.js","sources":["../../src/core/SessionErrors.ts"],"sourcesContent":["import type { SessionId } from '../contracts/ids.js';\nimport { ERROR_CODES, SequentialThinkingError } from '../errors.js';\n\n/** Lifecycle phase that can close ordinary session admission. */\nexport type SessionLifecycleClosedPhase =\n\t| 'resetting'\n\t| 'reset_failed'\n\t| 'evicting'\n\t| 'eviction_failed'\n\t| 'shutting_down'\n\t| 'stopped'\n\t| 'shutdown_failed';\n\n/** Error thrown when an operation arrives after lifecycle admission has closed. */\nexport class SessionLifecycleClosedError extends SequentialThinkingError {\n\t/** Session whose admission is closed, or `undefined` for a global exclusive request. */\n\tpublic readonly sessionId: SessionId | undefined;\n\t/** Lifecycle phase that rejected admission. */\n\tpublic readonly phase: SessionLifecycleClosedPhase;\n\n\tpublic constructor(sessionId: SessionId | undefined, phase: SessionLifecycleClosedPhase) {\n\t\tconst scope = sessionId === undefined ? 'Global' : `Session '${sessionId}'`;\n\t\tsuper(\n\t\t\t`${scope} lifecycle admission is closed in phase '${phase}'`,\n\t\t\tERROR_CODES.SESSION_LIFECYCLE_CLOSED\n\t\t);\n\t\tthis.name = 'SessionLifecycleClosedError';\n\t\tthis.sessionId = sessionId;\n\t\tthis.phase = phase;\n\t}\n}\n\n/** Error thrown when a per-session async lock cannot be acquired in time. */\nexport class LockTimeoutError extends SequentialThinkingError {\n\tpublic readonly sessionId: SessionId;\n\tpublic readonly timeoutMs: number;\n\n\tconstructor(sessionId: SessionId, timeoutMs: number) {\n\t\tsuper(`Lock timeout for session '${sessionId}' after ${timeoutMs}ms`, ERROR_CODES.LOCK_TIMEOUT);\n\t\tthis.name = 'LockTimeoutError';\n\t\tthis.sessionId = sessionId;\n\t\tthis.timeoutMs = timeoutMs;\n\t}\n}\n\nexport class SessionExpiredError extends SequentialThinkingError {\n\tpublic readonly sessionId: SessionId;\n\n\tconstructor(sessionId: SessionId) {\n\t\tsuper(\n\t\t\t`Session '${sessionId}' has expired. Use an authorized explicit reset or reset_state: true for a fresh chain, or choose a new session_id.`,\n\t\t\tERROR_CODES.SESSION_EXPIRED\n\t\t);\n\t\tthis.name = 'SessionExpiredError';\n\t\tthis.sessionId = sessionId;\n\t}\n}\n\n/** Error thrown when a session is accessed by a non-owner. */\nexport class SessionAccessDeniedError extends SequentialThinkingError {\n\tpublic readonly sessionId: SessionId;\n\tpublic readonly expectedOwner: string;\n\tpublic readonly actualOwner: string | undefined;\n\n\tconstructor(sessionId: SessionId, expectedOwner: string, actualOwner?: string) {\n\t\tsuper(\n\t\t\t`Access denied to session '${sessionId}': owned by '${expectedOwner}', accessed by '${actualOwner ?? 'anonymous'}'`,\n\t\t\tERROR_CODES.SESSION_ACCESS_DENIED\n\t\t);\n\t\tthis.name = 'SessionAccessDeniedError';\n\t\tthis.sessionId = sessionId;\n\t\tthis.expectedOwner = expectedOwner;\n\t\tthis.actualOwner = actualOwner;\n\t}\n}\n"],"names":["SessionLifecycleClosedError","SequentialThinkingError","sessionId","phase","scope","undefined","ERROR_CODES","LockTimeoutError","timeoutMs","SessionExpiredError","SessionAccessDeniedError","expectedOwner","actualOwner"],"mappings":";AAcO,MAAMA,oCAAoCC;IAEhC,UAAiC;IAEjC,MAAmC;IAEnD,YAAmBC,SAAgC,EAAEC,KAAkC,CAAE;QACxF,MAAMC,QAAQF,AAAcG,WAAdH,YAA0B,WAAW,CAAC,SAAS,EAAEA,UAAU,CAAC,CAAC;QAC3E,KAAK,CACJ,GAAGE,MAAM,yCAAyC,EAAED,MAAM,CAAC,CAAC,EAC5DG,YAAY,wBAAwB;QAErC,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,SAAS,GAAGJ;QACjB,IAAI,CAAC,KAAK,GAAGC;IACd;AACD;AAGO,MAAMI,yBAAyBN;IACrB,UAAqB;IACrB,UAAkB;IAElC,YAAYC,SAAoB,EAAEM,SAAiB,CAAE;QACpD,KAAK,CAAC,CAAC,0BAA0B,EAAEN,UAAU,QAAQ,EAAEM,UAAU,EAAE,CAAC,EAAEF,YAAY,YAAY;QAC9F,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,SAAS,GAAGJ;QACjB,IAAI,CAAC,SAAS,GAAGM;IAClB;AACD;AAEO,MAAMC,4BAA4BR;IACxB,UAAqB;IAErC,YAAYC,SAAoB,CAAE;QACjC,KAAK,CACJ,CAAC,SAAS,EAAEA,UAAU,mHAAmH,CAAC,EAC1II,YAAY,eAAe;QAE5B,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,SAAS,GAAGJ;IAClB;AACD;AAGO,MAAMQ,iCAAiCT;IAC7B,UAAqB;IACrB,cAAsB;IACtB,YAAgC;IAEhD,YAAYC,SAAoB,EAAES,aAAqB,EAAEC,WAAoB,CAAE;QAC9E,KAAK,CACJ,CAAC,0BAA0B,EAAEV,UAAU,aAAa,EAAES,cAAc,gBAAgB,EAAEC,eAAe,YAAY,CAAC,CAAC,EACnHN,YAAY,qBAAqB;QAElC,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,SAAS,GAAGJ;QACjB,IAAI,CAAC,aAAa,GAAGS;QACrB,IAAI,CAAC,WAAW,GAAGC;IACpB;AACD"}
@@ -12,6 +12,8 @@ interface SessionResetCoordinatorBaseConfig<SessionState> {
12
12
  readonly summaryStore?: ISummaryStore;
13
13
  readonly sessions: Map<SessionId, SessionState>;
14
14
  readonly createSessionState: (owner: string | undefined) => SessionState;
15
+ readonly assertReplacementCapacity: (sessionId: SessionId, owner: string | undefined) => void;
16
+ readonly admitReplacement: (sessionId: SessionId, owner: string | undefined) => void;
15
17
  readonly logger: Logger;
16
18
  }
17
19
  type ResetDurability = {
@@ -29,6 +31,8 @@ export declare class SessionResetCoordinator<SessionState> {
29
31
  private readonly _sessions;
30
32
  private readonly _createSessionState;
31
33
  private readonly _logger;
34
+ private readonly _assertReplacementCapacity;
35
+ private readonly _admitReplacement;
32
36
  constructor(config: SessionResetCoordinatorConfig<SessionState>);
33
37
  resetSession(sessionId: SessionId, preservedOwner: string | undefined, clearAuxiliaryState?: () => void): Promise<void>;
34
38
  resetAll(clearAuxiliaryState?: () => void): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"SessionResetCoordinator.d.ts","sourceRoot":"","sources":["../../src/core/SessionResetCoordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,UAAU,YAAY;IACrB,uBAAuB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7F,sBAAsB,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AAED,UAAU,iCAAiC,CAAC,YAAY;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAChD,QAAQ,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,YAAY,CAAC;IACzE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,KAAK,eAAe,GACjB;IAAE,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,6BAA6B,CAAC,YAAY,IACrD,iCAAiC,CAAC,YAAY,CAAC,GAAG,eAAe,CAAC;AAEnE,qBAAa,uBAAuB,CAAC,YAAY;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkB;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IACzD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA8C;IAClF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,6BAA6B,CAAC,YAAY,CAAC;IASzD,YAAY,CACjB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,mBAAmB,CAAC,EAAE,MAAM,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC;IAcV,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/D,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,kBAAkB;CAM1B"}
1
+ {"version":3,"file":"SessionResetCoordinator.d.ts","sourceRoot":"","sources":["../../src/core/SessionResetCoordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,UAAU,YAAY;IACrB,uBAAuB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7F,sBAAsB,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AAED,UAAU,iCAAiC,CAAC,YAAY;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAChD,QAAQ,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,YAAY,CAAC;IACzE,QAAQ,CAAC,yBAAyB,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC9F,QAAQ,CAAC,gBAAgB,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACrF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,KAAK,eAAe,GACjB;IAAE,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,6BAA6B,CAAC,YAAY,IACrD,iCAAiC,CAAC,YAAY,CAAC,GAAG,eAAe,CAAC;AAEnE,qBAAa,uBAAuB,CAAC,YAAY;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkB;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IACzD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA8C;IAClF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAA+E;IAC1H,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAsE;gBAE5F,MAAM,EAAE,6BAA6B,CAAC,YAAY,CAAC;IAWzD,YAAY,CACjB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,mBAAmB,CAAC,EAAE,MAAM,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC;IAeV,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/D,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,kBAAkB;CAM1B"}
@@ -5,6 +5,8 @@ class SessionResetCoordinator {
5
5
  _sessions;
6
6
  _createSessionState;
7
7
  _logger;
8
+ _assertReplacementCapacity;
9
+ _admitReplacement;
8
10
  constructor(config){
9
11
  this._durability = config;
10
12
  this._edgeStore = config.edgeStore;
@@ -12,8 +14,11 @@ class SessionResetCoordinator {
12
14
  this._sessions = config.sessions;
13
15
  this._createSessionState = config.createSessionState;
14
16
  this._logger = config.logger;
17
+ this._assertReplacementCapacity = config.assertReplacementCapacity;
18
+ this._admitReplacement = config.admitReplacement;
15
19
  }
16
20
  async resetSession(sessionId, preservedOwner, clearAuxiliaryState) {
21
+ this._assertReplacementCapacity(sessionId, preservedOwner);
17
22
  const durability = this._durability;
18
23
  if (null === durability.persistence) {
19
24
  this._replaceLiveSession(sessionId, preservedOwner);
@@ -40,6 +45,7 @@ class SessionResetCoordinator {
40
45
  });
41
46
  }
42
47
  _replaceLiveSession(sessionId, owner) {
48
+ this._admitReplacement(sessionId, owner);
43
49
  this._clearSessionStores(sessionId);
44
50
  this._sessions.set(sessionId, this._createSessionState(owner));
45
51
  this._logger.info('Session reset', {
@@ -1 +1 @@
1
- {"version":3,"file":"core/SessionResetCoordinator.js","sources":["../../src/core/SessionResetCoordinator.ts"],"sourcesContent":["import type { PersistenceBackend } from '../contracts/PersistenceBackend.js';\nimport type { IEdgeStore } from '../contracts/interfaces.js';\nimport type { SessionId } from '../contracts/ids.js';\nimport type { ISummaryStore } from '../contracts/summary.js';\nimport type { Logger } from '../logger/StructuredLogger.js';\ninterface ResetBarrier {\n\twithSessionResetBarrier(sessionId: SessionId, operation: () => Promise<void>): Promise<void>;\n\twithGlobalResetBarrier(operation: () => Promise<void>): Promise<void>;\n}\n\ninterface SessionResetCoordinatorBaseConfig<SessionState> {\n\treadonly edgeStore?: IEdgeStore;\n\treadonly summaryStore?: ISummaryStore;\n\treadonly sessions: Map<SessionId, SessionState>;\n\treadonly createSessionState: (owner: string | undefined) => SessionState;\n\treadonly logger: Logger;\n}\n\ntype ResetDurability =\n\t| { readonly persistence: null; readonly barrier: null }\n\t| { readonly persistence: PersistenceBackend; readonly barrier: ResetBarrier };\n\nexport type SessionResetCoordinatorConfig<SessionState> =\n\tSessionResetCoordinatorBaseConfig<SessionState> & ResetDurability;\n\nexport class SessionResetCoordinator<SessionState> {\n\tprivate readonly _durability: ResetDurability;\n\tprivate readonly _edgeStore?: IEdgeStore;\n\tprivate readonly _summaryStore?: ISummaryStore;\n\tprivate readonly _sessions: Map<SessionId, SessionState>;\n\tprivate readonly _createSessionState: (owner: string | undefined) => SessionState;\n\tprivate readonly _logger: Logger;\n\n\tconstructor(config: SessionResetCoordinatorConfig<SessionState>) {\n\t\tthis._durability = config;\n\t\tthis._edgeStore = config.edgeStore;\n\t\tthis._summaryStore = config.summaryStore;\n\t\tthis._sessions = config.sessions;\n\t\tthis._createSessionState = config.createSessionState;\n\t\tthis._logger = config.logger;\n\t}\n\n\tasync resetSession(\n\t\tsessionId: SessionId,\n\t\tpreservedOwner: string | undefined,\n\t\tclearAuxiliaryState?: () => void\n\t): Promise<void> {\n\t\tconst durability = this._durability;\n\t\tif (durability.persistence === null) {\n\t\t\tthis._replaceLiveSession(sessionId, preservedOwner);\n\t\t\tclearAuxiliaryState?.();\n\t\t\treturn;\n\t\t}\n\t\tawait durability.barrier.withSessionResetBarrier(sessionId, async () => {\n\t\t\tawait durability.persistence.clearSession(sessionId);\n\t\t\tthis._replaceLiveSession(sessionId, preservedOwner);\n\t\t\tclearAuxiliaryState?.();\n\t\t});\n\t}\n\n\tasync resetAll(clearAuxiliaryState?: () => void): Promise<void> {\n\t\tconst durability = this._durability;\n\t\tif (durability.persistence === null) {\n\t\t\tthis._clearAllLiveState();\n\t\t\tclearAuxiliaryState?.();\n\t\t\treturn;\n\t\t}\n\t\tawait durability.barrier.withGlobalResetBarrier(async () => {\n\t\t\tawait durability.persistence.clearAll();\n\t\t\tthis._clearAllLiveState();\n\t\t\tclearAuxiliaryState?.();\n\t\t});\n\t}\n\n\tprivate _replaceLiveSession(sessionId: SessionId, owner: string | undefined): void {\n\t\tthis._clearSessionStores(sessionId);\n\t\tthis._sessions.set(sessionId, this._createSessionState(owner));\n\t\tthis._logger.info('Session reset', { sessionId });\n\t}\n\n\tprivate _clearSessionStores(sessionId: SessionId): void {\n\t\tthis._edgeStore?.clearSession(sessionId);\n\t\tthis._summaryStore?.clearSession(sessionId);\n\t}\n\n\tprivate _clearAllLiveState(): void {\n\t\tthis._edgeStore?.clearAll();\n\t\tthis._summaryStore?.clearAll();\n\t\tthis._sessions.clear();\n\t\tthis._logger.info('History cleared (all sessions)');\n\t}\n}\n"],"names":["SessionResetCoordinator","config","sessionId","preservedOwner","clearAuxiliaryState","durability","owner"],"mappings":"AAyBO,MAAMA;IACK,YAA6B;IAC7B,WAAwB;IACxB,cAA8B;IAC9B,UAAwC;IACxC,oBAAiE;IACjE,QAAgB;IAEjC,YAAYC,MAAmD,CAAE;QAChE,IAAI,CAAC,WAAW,GAAGA;QACnB,IAAI,CAAC,UAAU,GAAGA,OAAO,SAAS;QAClC,IAAI,CAAC,aAAa,GAAGA,OAAO,YAAY;QACxC,IAAI,CAAC,SAAS,GAAGA,OAAO,QAAQ;QAChC,IAAI,CAAC,mBAAmB,GAAGA,OAAO,kBAAkB;QACpD,IAAI,CAAC,OAAO,GAAGA,OAAO,MAAM;IAC7B;IAEA,MAAM,aACLC,SAAoB,EACpBC,cAAkC,EAClCC,mBAAgC,EAChB;QAChB,MAAMC,aAAa,IAAI,CAAC,WAAW;QACnC,IAAIA,AAA2B,SAA3BA,WAAW,WAAW,EAAW;YACpC,IAAI,CAAC,mBAAmB,CAACH,WAAWC;YACpCC;YACA;QACD;QACA,MAAMC,WAAW,OAAO,CAAC,uBAAuB,CAACH,WAAW;YAC3D,MAAMG,WAAW,WAAW,CAAC,YAAY,CAACH;YAC1C,IAAI,CAAC,mBAAmB,CAACA,WAAWC;YACpCC;QACD;IACD;IAEA,MAAM,SAASA,mBAAgC,EAAiB;QAC/D,MAAMC,aAAa,IAAI,CAAC,WAAW;QACnC,IAAIA,AAA2B,SAA3BA,WAAW,WAAW,EAAW;YACpC,IAAI,CAAC,kBAAkB;YACvBD;YACA;QACD;QACA,MAAMC,WAAW,OAAO,CAAC,sBAAsB,CAAC;YAC/C,MAAMA,WAAW,WAAW,CAAC,QAAQ;YACrC,IAAI,CAAC,kBAAkB;YACvBD;QACD;IACD;IAEQ,oBAAoBF,SAAoB,EAAEI,KAAyB,EAAQ;QAClF,IAAI,CAAC,mBAAmB,CAACJ;QACzB,IAAI,CAAC,SAAS,CAAC,GAAG,CAACA,WAAW,IAAI,CAAC,mBAAmB,CAACI;QACvD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB;YAAEJ;QAAU;IAChD;IAEQ,oBAAoBA,SAAoB,EAAQ;QACvD,IAAI,CAAC,UAAU,EAAE,aAAaA;QAC9B,IAAI,CAAC,aAAa,EAAE,aAAaA;IAClC;IAEQ,qBAA2B;QAClC,IAAI,CAAC,UAAU,EAAE;QACjB,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,SAAS,CAAC,KAAK;QACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IACnB;AACD"}
1
+ {"version":3,"file":"core/SessionResetCoordinator.js","sources":["../../src/core/SessionResetCoordinator.ts"],"sourcesContent":["import type { PersistenceBackend } from '../contracts/PersistenceBackend.js';\nimport type { IEdgeStore } from '../contracts/interfaces.js';\nimport type { SessionId } from '../contracts/ids.js';\nimport type { ISummaryStore } from '../contracts/summary.js';\nimport type { Logger } from '../logger/StructuredLogger.js';\ninterface ResetBarrier {\n\twithSessionResetBarrier(sessionId: SessionId, operation: () => Promise<void>): Promise<void>;\n\twithGlobalResetBarrier(operation: () => Promise<void>): Promise<void>;\n}\n\ninterface SessionResetCoordinatorBaseConfig<SessionState> {\n\treadonly edgeStore?: IEdgeStore;\n\treadonly summaryStore?: ISummaryStore;\n\treadonly sessions: Map<SessionId, SessionState>;\n\treadonly createSessionState: (owner: string | undefined) => SessionState;\n\treadonly assertReplacementCapacity: (sessionId: SessionId, owner: string | undefined) => void;\n\treadonly admitReplacement: (sessionId: SessionId, owner: string | undefined) => void;\n\treadonly logger: Logger;\n}\n\ntype ResetDurability =\n\t| { readonly persistence: null; readonly barrier: null }\n\t| { readonly persistence: PersistenceBackend; readonly barrier: ResetBarrier };\n\nexport type SessionResetCoordinatorConfig<SessionState> =\n\tSessionResetCoordinatorBaseConfig<SessionState> & ResetDurability;\n\nexport class SessionResetCoordinator<SessionState> {\n\tprivate readonly _durability: ResetDurability;\n\tprivate readonly _edgeStore?: IEdgeStore;\n\tprivate readonly _summaryStore?: ISummaryStore;\n\tprivate readonly _sessions: Map<SessionId, SessionState>;\n\tprivate readonly _createSessionState: (owner: string | undefined) => SessionState;\n\tprivate readonly _logger: Logger;\n\tprivate readonly _assertReplacementCapacity: SessionResetCoordinatorBaseConfig<SessionState>['assertReplacementCapacity'];\n\tprivate readonly _admitReplacement: SessionResetCoordinatorBaseConfig<SessionState>['admitReplacement'];\n\n\tconstructor(config: SessionResetCoordinatorConfig<SessionState>) {\n\t\tthis._durability = config;\n\t\tthis._edgeStore = config.edgeStore;\n\t\tthis._summaryStore = config.summaryStore;\n\t\tthis._sessions = config.sessions;\n\t\tthis._createSessionState = config.createSessionState;\n\t\tthis._logger = config.logger;\n\t\tthis._assertReplacementCapacity = config.assertReplacementCapacity;\n\t\tthis._admitReplacement = config.admitReplacement;\n\t}\n\n\tasync resetSession(\n\t\tsessionId: SessionId,\n\t\tpreservedOwner: string | undefined,\n\t\tclearAuxiliaryState?: () => void\n\t): Promise<void> {\n\t\tthis._assertReplacementCapacity(sessionId, preservedOwner);\n\t\tconst durability = this._durability;\n\t\tif (durability.persistence === null) {\n\t\t\tthis._replaceLiveSession(sessionId, preservedOwner);\n\t\t\tclearAuxiliaryState?.();\n\t\t\treturn;\n\t\t}\n\t\tawait durability.barrier.withSessionResetBarrier(sessionId, async () => {\n\t\t\tawait durability.persistence.clearSession(sessionId);\n\t\t\tthis._replaceLiveSession(sessionId, preservedOwner);\n\t\t\tclearAuxiliaryState?.();\n\t\t});\n\t}\n\n\tasync resetAll(clearAuxiliaryState?: () => void): Promise<void> {\n\t\tconst durability = this._durability;\n\t\tif (durability.persistence === null) {\n\t\t\tthis._clearAllLiveState();\n\t\t\tclearAuxiliaryState?.();\n\t\t\treturn;\n\t\t}\n\t\tawait durability.barrier.withGlobalResetBarrier(async () => {\n\t\t\tawait durability.persistence.clearAll();\n\t\t\tthis._clearAllLiveState();\n\t\t\tclearAuxiliaryState?.();\n\t\t});\n\t}\n\n\tprivate _replaceLiveSession(sessionId: SessionId, owner: string | undefined): void {\n\t\tthis._admitReplacement(sessionId, owner);\n\t\tthis._clearSessionStores(sessionId);\n\t\tthis._sessions.set(sessionId, this._createSessionState(owner));\n\t\tthis._logger.info('Session reset', { sessionId });\n\t}\n\n\tprivate _clearSessionStores(sessionId: SessionId): void {\n\t\tthis._edgeStore?.clearSession(sessionId);\n\t\tthis._summaryStore?.clearSession(sessionId);\n\t}\n\n\tprivate _clearAllLiveState(): void {\n\t\tthis._edgeStore?.clearAll();\n\t\tthis._summaryStore?.clearAll();\n\t\tthis._sessions.clear();\n\t\tthis._logger.info('History cleared (all sessions)');\n\t}\n}\n"],"names":["SessionResetCoordinator","config","sessionId","preservedOwner","clearAuxiliaryState","durability","owner"],"mappings":"AA2BO,MAAMA;IACK,YAA6B;IAC7B,WAAwB;IACxB,cAA8B;IAC9B,UAAwC;IACxC,oBAAiE;IACjE,QAAgB;IAChB,2BAAyG;IACzG,kBAAuF;IAExG,YAAYC,MAAmD,CAAE;QAChE,IAAI,CAAC,WAAW,GAAGA;QACnB,IAAI,CAAC,UAAU,GAAGA,OAAO,SAAS;QAClC,IAAI,CAAC,aAAa,GAAGA,OAAO,YAAY;QACxC,IAAI,CAAC,SAAS,GAAGA,OAAO,QAAQ;QAChC,IAAI,CAAC,mBAAmB,GAAGA,OAAO,kBAAkB;QACpD,IAAI,CAAC,OAAO,GAAGA,OAAO,MAAM;QAC5B,IAAI,CAAC,0BAA0B,GAAGA,OAAO,yBAAyB;QAClE,IAAI,CAAC,iBAAiB,GAAGA,OAAO,gBAAgB;IACjD;IAEA,MAAM,aACLC,SAAoB,EACpBC,cAAkC,EAClCC,mBAAgC,EAChB;QAChB,IAAI,CAAC,0BAA0B,CAACF,WAAWC;QAC3C,MAAME,aAAa,IAAI,CAAC,WAAW;QACnC,IAAIA,AAA2B,SAA3BA,WAAW,WAAW,EAAW;YACpC,IAAI,CAAC,mBAAmB,CAACH,WAAWC;YACpCC;YACA;QACD;QACA,MAAMC,WAAW,OAAO,CAAC,uBAAuB,CAACH,WAAW;YAC3D,MAAMG,WAAW,WAAW,CAAC,YAAY,CAACH;YAC1C,IAAI,CAAC,mBAAmB,CAACA,WAAWC;YACpCC;QACD;IACD;IAEA,MAAM,SAASA,mBAAgC,EAAiB;QAC/D,MAAMC,aAAa,IAAI,CAAC,WAAW;QACnC,IAAIA,AAA2B,SAA3BA,WAAW,WAAW,EAAW;YACpC,IAAI,CAAC,kBAAkB;YACvBD;YACA;QACD;QACA,MAAMC,WAAW,OAAO,CAAC,sBAAsB,CAAC;YAC/C,MAAMA,WAAW,WAAW,CAAC,QAAQ;YACrC,IAAI,CAAC,kBAAkB;YACvBD;QACD;IACD;IAEQ,oBAAoBF,SAAoB,EAAEI,KAAyB,EAAQ;QAClF,IAAI,CAAC,iBAAiB,CAACJ,WAAWI;QAClC,IAAI,CAAC,mBAAmB,CAACJ;QACzB,IAAI,CAAC,SAAS,CAAC,GAAG,CAACA,WAAW,IAAI,CAAC,mBAAmB,CAACI;QACvD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB;YAAEJ;QAAU;IAChD;IAEQ,oBAAoBA,SAAoB,EAAQ;QACvD,IAAI,CAAC,UAAU,EAAE,aAAaA;QAC9B,IAAI,CAAC,aAAa,EAAE,aAAaA;IAClC;IAEQ,qBAA2B;QAClC,IAAI,CAAC,UAAU,EAAE;QACjB,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,SAAS,CAAC,KAAK;QACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IACnB;AACD"}
@@ -11,11 +11,17 @@ import type { ICalibrator } from '../contracts/calibrator.js';
11
11
  import type { SessionId, ThoughtId } from '../contracts/ids.js';
12
12
  import type { ConfidenceSignals, PatternSignal, ReasoningStats } from './reasoning.js';
13
13
  import type { ThoughtData } from './thought.js';
14
+ import type { ActiveGraphContext } from './evaluator/GraphSignalComputer.js';
14
15
  export interface VerificationLinkContext {
15
16
  readonly verificationTargets?: ReadonlyMap<ThoughtId, ThoughtId>;
16
17
  }
17
18
  /** Explicit thought and canonical session used for response calibration. */
18
- export interface ConfidenceSignalContext extends VerificationLinkContext {
19
+ export interface GraphAwareContext {
20
+ readonly activeGraph?: ActiveGraphContext;
21
+ }
22
+ export interface PatternSignalContext extends VerificationLinkContext, GraphAwareContext {
23
+ }
24
+ export interface ConfidenceSignalContext extends VerificationLinkContext, GraphAwareContext {
19
25
  readonly currentThought: ThoughtData;
20
26
  readonly sessionId: SessionId;
21
27
  }
@@ -40,12 +46,13 @@ export declare class ThoughtEvaluator {
40
46
  private readonly _aggregator;
41
47
  private readonly _patternDetector;
42
48
  private readonly _calibrator;
49
+ private readonly _graphSignalComputer;
43
50
  constructor(calibrator: ICalibrator);
44
51
  /** Compute confidence signals from history context. Pure computation. */
45
52
  computeConfidenceSignals(history: ThoughtData[], branches: Record<string, ThoughtData[]>, context: ConfidenceSignalContext): ConfidenceSignals;
46
53
  /** Compute aggregated reasoning analytics. Pure computation. */
47
54
  computeReasoningStats(history: ThoughtData[], branches: Record<string, ThoughtData[]>, context?: VerificationLinkContext): ReasoningStats;
48
55
  /** Detect reasoning patterns (anti-patterns and positive signals). Pure computation. */
49
- computePatternSignals(history: ThoughtData[], branches: Record<string, ThoughtData[]>, context?: VerificationLinkContext): PatternSignal[];
56
+ computePatternSignals(history: ThoughtData[], branches: Record<string, ThoughtData[]>, context?: PatternSignalContext): PatternSignal[];
50
57
  }
51
58
  //# sourceMappingURL=ThoughtEvaluator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThoughtEvaluator.d.ts","sourceRoot":"","sources":["../../src/core/ThoughtEvaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAMhD,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;CACjE;AAED,4EAA4E;AAC5E,MAAM,WAAW,uBAAwB,SAAQ,uBAAuB;IACvE,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;gBAE9B,UAAU,EAAE,WAAW;IAOnC,yEAAyE;IAClE,wBAAwB,CAC9B,OAAO,EAAE,WAAW,EAAE,EACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,EACvC,OAAO,EAAE,uBAAuB,GAC9B,iBAAiB;IAsBpB,gEAAgE;IACzD,qBAAqB,CAC3B,OAAO,EAAE,WAAW,EAAE,EACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,EACvC,OAAO,GAAE,uBAA4B,GACnC,cAAc;IAMjB,wFAAwF;IACjF,qBAAqB,CAC3B,OAAO,EAAE,WAAW,EAAE,EACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,EACvC,OAAO,GAAE,uBAA4B,GACnC,aAAa,EAAE;CAKlB"}
1
+ {"version":3,"file":"ThoughtEvaluator.d.ts","sourceRoot":"","sources":["../../src/core/ThoughtEvaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAMhD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;CACjE;AAED,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAC1C;AAED,MAAM,WAAW,oBAAqB,SAAQ,uBAAuB,EAAE,iBAAiB;CAAG;AAE3F,MAAM,WAAW,uBAAwB,SAAQ,uBAAuB,EAAE,iBAAiB;IAC1F,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA6B;gBAEtD,UAAU,EAAE,WAAW;IAOnC,yEAAyE;IAClE,wBAAwB,CAC9B,OAAO,EAAE,WAAW,EAAE,EACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,EACvC,OAAO,EAAE,uBAAuB,GAC9B,iBAAiB;IAgCpB,gEAAgE;IACzD,qBAAqB,CAC3B,OAAO,EAAE,WAAW,EAAE,EACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,EACvC,OAAO,GAAE,uBAA4B,GACnC,cAAc;IAMjB,wFAAwF;IACjF,qBAAqB,CAC3B,OAAO,EAAE,WAAW,EAAE,EACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,EACvC,OAAO,GAAE,oBAAyB,GAChC,aAAa,EAAE;CAKlB"}
@@ -2,11 +2,13 @@ import { Aggregator } from "./evaluator/Aggregator.js";
2
2
  import { PatternDetector } from "./evaluator/PatternDetector.js";
3
3
  import { SignalComputer } from "./evaluator/SignalComputer.js";
4
4
  import { resolveVerificationLinks } from "./evaluator/VerificationLinks.js";
5
+ import { GraphSignalComputer } from "./evaluator/GraphSignalComputer.js";
5
6
  class ThoughtEvaluator {
6
7
  _signalComputer;
7
8
  _aggregator;
8
9
  _patternDetector;
9
10
  _calibrator;
11
+ _graphSignalComputer = new GraphSignalComputer();
10
12
  constructor(calibrator){
11
13
  this._signalComputer = new SignalComputer();
12
14
  this._aggregator = new Aggregator();
@@ -16,9 +18,14 @@ class ThoughtEvaluator {
16
18
  computeConfidenceSignals(history, branches, context) {
17
19
  const links = resolveVerificationLinks(history, branches, context.verificationTargets);
18
20
  const { branches: b } = filterRetracted(history, branches);
19
- const signals = this._signalComputer.computeConfidenceSignals([
21
+ const baseSignals = this._signalComputer.computeConfidenceSignals([
20
22
  ...links.thoughts
21
23
  ], b, links);
24
+ const graphSignals = void 0 === context.activeGraph ? void 0 : this._graphSignalComputer.compute(context.activeGraph);
25
+ const signals = void 0 === graphSignals ? baseSignals : {
26
+ ...baseSignals,
27
+ graph_signals: graphSignals
28
+ };
22
29
  if (!this._calibrator.enabled) return signals;
23
30
  const thought = context.currentThought;
24
31
  if (void 0 === thought.confidence) return signals;
@@ -40,7 +47,7 @@ class ThoughtEvaluator {
40
47
  computePatternSignals(history, branches, context = {}) {
41
48
  const { history: h, branches: b } = filterRetracted(history, branches);
42
49
  const links = resolveVerificationLinks(history, branches, context.verificationTargets);
43
- return this._patternDetector.computePatternSignals(h, b, links);
50
+ return this._patternDetector.computePatternSignals(h, b, links, context.activeGraph);
44
51
  }
45
52
  }
46
53
  function filterRetracted(history, branches) {