@danielsimonjr/memoryjs 2.8.0 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { z, ZodError, ZodSchema } from 'zod';
2
- import workerpool, { PoolStats, Pool } from '@danielsimonjr/workerpool';
2
+ import { PoolStats, Pool } from '@danielsimonjr/workerpool';
3
3
  import { Database } from 'better-sqlite3';
4
4
  import { EventEmitter } from 'events';
5
5
  import { EventEmitter as EventEmitter$1 } from 'node:events';
@@ -221,6 +221,225 @@ declare class QueryTraceBuilder {
221
221
  complete(resultCount: number, metadata?: Record<string, unknown>): QueryTrace;
222
222
  }
223
223
 
224
+ /**
225
+ * Graph Event Emitter
226
+ *
227
+ * Phase 10 Sprint 2: Provides event-based notifications for graph changes.
228
+ * Enables loose coupling between graph operations and dependent systems
229
+ * like search indexes, analytics, and external integrations.
230
+ *
231
+ * @module core/GraphEventEmitter
232
+ */
233
+
234
+ /**
235
+ * Phase 10 Sprint 2: Event emitter for graph change notifications.
236
+ *
237
+ * Provides a type-safe event system for subscribing to and emitting
238
+ * graph change events. Supports wildcard listeners for all events.
239
+ *
240
+ * @example
241
+ * ```typescript
242
+ * const emitter = new GraphEventEmitter();
243
+ *
244
+ * // Listen to specific event types
245
+ * emitter.on('entity:created', (event) => {
246
+ * console.log(`Entity ${event.entity.name} created`);
247
+ * });
248
+ *
249
+ * // Listen to all events
250
+ * emitter.onAny((event) => {
251
+ * console.log(`Event: ${event.type}`);
252
+ * });
253
+ *
254
+ * // Emit an event
255
+ * emitter.emitEntityCreated(entity);
256
+ *
257
+ * // Remove listener
258
+ * const unsubscribe = emitter.on('entity:deleted', handler);
259
+ * unsubscribe();
260
+ * ```
261
+ */
262
+ declare class GraphEventEmitter {
263
+ /**
264
+ * Map of event types to their registered listeners. The Set stores
265
+ * listeners typed for different specific event subtypes (one Set per
266
+ * GraphEventType key). TS can't express this dependent-key relationship
267
+ * without `any` due to function-parameter contravariance.
268
+ */
269
+ private listeners;
270
+ /**
271
+ * Listeners that receive all events regardless of type.
272
+ */
273
+ private wildcardListeners;
274
+ /**
275
+ * Whether to suppress errors from listeners (default: true).
276
+ * When true, listener errors are logged but don't stop event propagation.
277
+ */
278
+ private suppressListenerErrors;
279
+ /**
280
+ * Create a new GraphEventEmitter instance.
281
+ *
282
+ * @param options - Optional configuration
283
+ */
284
+ constructor(options?: {
285
+ suppressListenerErrors?: boolean;
286
+ });
287
+ /**
288
+ * Subscribe to a specific event type.
289
+ *
290
+ * @template K - The event type key
291
+ * @param eventType - The event type to listen for
292
+ * @param listener - Callback function to invoke when event occurs
293
+ * @returns Unsubscribe function to remove the listener
294
+ *
295
+ * @example
296
+ * ```typescript
297
+ * const unsubscribe = emitter.on('entity:created', (event) => {
298
+ * console.log(`Created: ${event.entity.name}`);
299
+ * });
300
+ *
301
+ * // Later: unsubscribe();
302
+ * ```
303
+ */
304
+ on<K extends GraphEventType>(eventType: K, listener: GraphEventListener<GraphEventMap[K]>): () => void;
305
+ /**
306
+ * Unsubscribe from a specific event type.
307
+ *
308
+ * @template K - The event type key
309
+ * @param eventType - The event type to unsubscribe from
310
+ * @param listener - The listener function to remove
311
+ */
312
+ off<K extends GraphEventType>(eventType: K, listener: GraphEventListener<GraphEventMap[K]>): void;
313
+ /**
314
+ * Subscribe to all event types.
315
+ *
316
+ * @param listener - Callback function to invoke for any event
317
+ * @returns Unsubscribe function to remove the listener
318
+ *
319
+ * @example
320
+ * ```typescript
321
+ * emitter.onAny((event) => {
322
+ * console.log(`Event: ${event.type} at ${event.timestamp}`);
323
+ * });
324
+ * ```
325
+ */
326
+ onAny(listener: GraphEventListener<GraphEvent>): () => void;
327
+ /**
328
+ * Unsubscribe from all events.
329
+ *
330
+ * @param listener - The listener function to remove
331
+ */
332
+ offAny(listener: GraphEventListener<GraphEvent>): void;
333
+ /**
334
+ * Subscribe to an event type, but only receive the first occurrence.
335
+ *
336
+ * @template K - The event type key
337
+ * @param eventType - The event type to listen for once
338
+ * @param listener - Callback function to invoke once
339
+ * @returns Unsubscribe function to cancel before event occurs
340
+ */
341
+ once<K extends GraphEventType>(eventType: K, listener: GraphEventListener<GraphEventMap[K]>): () => void;
342
+ /**
343
+ * Remove all listeners for all event types.
344
+ */
345
+ removeAllListeners(): void;
346
+ /**
347
+ * Get the count of listeners for a specific event type.
348
+ *
349
+ * @param eventType - The event type to count listeners for
350
+ * @returns Number of listeners registered
351
+ */
352
+ listenerCount(eventType?: GraphEventType): number;
353
+ /**
354
+ * Emit an event to all registered listeners.
355
+ *
356
+ * @param event - The event to emit
357
+ */
358
+ emit(event: GraphEvent): void;
359
+ /**
360
+ * Emit an entity:created event.
361
+ *
362
+ * @param entity - The entity that was created
363
+ */
364
+ emitEntityCreated(entity: Entity): void;
365
+ /**
366
+ * Emit an entity:updated event.
367
+ *
368
+ * @param entityName - Name of the updated entity
369
+ * @param changes - The changes that were applied
370
+ * @param previousValues - Optional previous values before update
371
+ */
372
+ emitEntityUpdated(entityName: string, changes: Partial<Entity>, previousValues?: Partial<Entity>): void;
373
+ /**
374
+ * Emit an entity:deleted event.
375
+ *
376
+ * @param entityName - Name of the deleted entity
377
+ * @param entity - Optional entity data before deletion
378
+ */
379
+ emitEntityDeleted(entityName: string, entity?: Entity): void;
380
+ /**
381
+ * Emit an entity:renamed event.
382
+ *
383
+ * Note: `EntityManager.renameEntity` also emits `entity:deleted` (old
384
+ * name) + `entity:created` (renamed entity) immediately after this event
385
+ * so create/delete-only derived views stay consistent.
386
+ *
387
+ * @param oldName - Entity name before the rename
388
+ * @param newName - Entity name after the rename
389
+ * @param entity - The renamed entity (name === newName)
390
+ */
391
+ emitEntityRenamed(oldName: string, newName: string, entity: Entity): void;
392
+ /**
393
+ * Emit a relation:created event.
394
+ *
395
+ * @param relation - The relation that was created
396
+ */
397
+ emitRelationCreated(relation: Relation): void;
398
+ /**
399
+ * Emit a relation:deleted event.
400
+ *
401
+ * @param from - Source entity name
402
+ * @param to - Target entity name
403
+ * @param relationType - Type of the deleted relation
404
+ */
405
+ emitRelationDeleted(from: string, to: string, relationType: string): void;
406
+ /**
407
+ * Emit an observation:added event.
408
+ *
409
+ * @param entityName - Name of the entity
410
+ * @param observations - Observations that were added
411
+ */
412
+ emitObservationAdded(entityName: string, observations: string[]): void;
413
+ /**
414
+ * Emit an observation:deleted event.
415
+ *
416
+ * @param entityName - Name of the entity
417
+ * @param observations - Observations that were deleted
418
+ */
419
+ emitObservationDeleted(entityName: string, observations: string[]): void;
420
+ /**
421
+ * Emit a graph:saved event.
422
+ *
423
+ * @param entityCount - Number of entities in the saved graph
424
+ * @param relationCount - Number of relations in the saved graph
425
+ */
426
+ emitGraphSaved(entityCount: number, relationCount: number): void;
427
+ /**
428
+ * Emit a graph:loaded event.
429
+ *
430
+ * @param entityCount - Number of entities in the loaded graph
431
+ * @param relationCount - Number of relations in the loaded graph
432
+ */
433
+ emitGraphLoaded(entityCount: number, relationCount: number): void;
434
+ /**
435
+ * Safely invoke a listener, optionally catching errors. Listener is
436
+ * typed `<any>` to match the heterogeneous storage in `this.listeners`
437
+ * (see field-level comment).
438
+ * @private
439
+ */
440
+ private invokeListener;
441
+ }
442
+
224
443
  /**
225
444
  * Task Scheduler
226
445
  *
@@ -358,13 +577,10 @@ declare class TaskQueue {
358
577
  private queue;
359
578
  private running;
360
579
  private completed;
361
- private pool;
362
580
  private concurrency;
363
- private defaultTimeout;
364
581
  private isProcessing;
365
582
  private totalExecutionTime;
366
583
  private totalProcessed;
367
- private useWorkerPool;
368
584
  private static readonly MAX_COMPLETED;
369
585
  private static readonly MAX_QUEUE;
370
586
  constructor(options?: {
@@ -372,10 +588,6 @@ declare class TaskQueue {
372
588
  timeout?: number;
373
589
  useWorkerPool?: boolean;
374
590
  });
375
- /**
376
- * Get or create the worker pool.
377
- */
378
- private getPool;
379
591
  /**
380
592
  * Add a task to the queue.
381
593
  *
@@ -571,6 +783,14 @@ declare const ENTITY_STATUS_TRANSITIONS: ReadonlyArray<readonly [EntityStatus, E
571
783
  interface Entity {
572
784
  /** Unique name identifying the entity */
573
785
  name: string;
786
+ /**
787
+ * Stable opaque identifier (UUID), assigned at creation by
788
+ * `EntityManager.createEntities` and preserved across renames
789
+ * (`renameEntity` never touches it). NOT yet used as a reference key —
790
+ * `name` remains the public primary key; `id` is forward-compat
791
+ * infrastructure for v2 stable-id references.
792
+ */
793
+ id?: string;
574
794
  /** Type/category of the entity (e.g., "person", "project", "concept") */
575
795
  entityType: string;
576
796
  /** Array of observation strings describing facts about the entity */
@@ -1628,6 +1848,40 @@ interface IGraphStorage {
1628
1848
  * @returns Promise resolving to true if found and updated
1629
1849
  */
1630
1850
  updateEntity(entityName: string, updates: Partial<Entity>): Promise<boolean>;
1851
+ /**
1852
+ * Atomically rename an entity, rewriting every stored reference to the
1853
+ * old name: `Relation.from`/`Relation.to`, other entities' `parentId`,
1854
+ * and the version-chain fields (`parentEntityName`, `rootEntityName`,
1855
+ * `supersededBy`). The entity's `id`, `createdAt`, and all other fields
1856
+ * are preserved; `lastModified` is updated.
1857
+ *
1858
+ * OPTIONAL member: kept optional so pre-existing third-party / test
1859
+ * implementations of this interface remain valid without changes.
1860
+ * Both first-party backends (`GraphStorage`, `SQLiteStorage`)
1861
+ * implement it; `EntityManager.renameEntity` requires it.
1862
+ *
1863
+ * @param oldName - Current entity name (must exist)
1864
+ * @param newName - New entity name (must not exist)
1865
+ * @returns Promise resolving to the renamed entity
1866
+ * @throws EntityNotFoundError if `oldName` does not exist
1867
+ * @throws DuplicateEntityError if `newName` already exists
1868
+ */
1869
+ renameEntity?(oldName: string, newName: string): Promise<Entity>;
1870
+ /**
1871
+ * Graph event emitter powering event-driven derived views (TF-IDF sync,
1872
+ * rank priors, embedding caches, columnar observation mirroring).
1873
+ *
1874
+ * OPTIONAL member: kept optional so pre-existing third-party / test
1875
+ * implementations of this interface remain valid without changes (same
1876
+ * precedent as `renameEntity`). Both first-party backends
1877
+ * (`GraphStorage`, `SQLiteStorage`) expose one; derived views no-op
1878
+ * gracefully when it is absent.
1879
+ *
1880
+ * Typed via an inline type-only import: `types.ts` is the root of the
1881
+ * module layering (zero imports), so a top-level import from core would
1882
+ * invert it; `import()` in type position is erased at compile time.
1883
+ */
1884
+ readonly events?: GraphEventEmitter;
1631
1885
  /**
1632
1886
  * Compact the storage by removing duplicates.
1633
1887
  *
@@ -2152,7 +2406,7 @@ interface BatchOptions {
2152
2406
  *
2153
2407
  * Used by GraphEventEmitter to categorize graph changes.
2154
2408
  */
2155
- type GraphEventType = 'entity:created' | 'entity:updated' | 'entity:deleted' | 'relation:created' | 'relation:deleted' | 'observation:added' | 'observation:deleted' | 'graph:saved' | 'graph:loaded';
2409
+ type GraphEventType = 'entity:created' | 'entity:updated' | 'entity:deleted' | 'entity:renamed' | 'relation:created' | 'relation:deleted' | 'observation:added' | 'observation:deleted' | 'graph:saved' | 'graph:loaded';
2156
2410
  /**
2157
2411
  * Phase 10 Sprint 2: Base interface for all graph events.
2158
2412
  *
@@ -2210,6 +2464,30 @@ interface EntityDeletedEvent extends GraphEventBase {
2210
2464
  entityName: string;
2211
2465
  entity?: Entity;
2212
2466
  }
2467
+ /**
2468
+ * Event emitted when an entity is renamed via `renameEntity`.
2469
+ *
2470
+ * Note for listeners: a rename ALSO emits `entity:deleted` (for the old
2471
+ * name) followed by `entity:created` (for the renamed entity) so derived
2472
+ * views that only understand create/delete (TF-IDF sync, rank priors,
2473
+ * embedding caches) stay consistent without learning this event. Listeners
2474
+ * therefore observe the sequence: `entity:renamed`, `entity:deleted`,
2475
+ * `entity:created`.
2476
+ *
2477
+ * @example
2478
+ * ```typescript
2479
+ * emitter.on('entity:renamed', (event) => {
2480
+ * console.log(`${event.oldName} -> ${event.newName}`);
2481
+ * });
2482
+ * ```
2483
+ */
2484
+ interface EntityRenamedEvent extends GraphEventBase {
2485
+ type: 'entity:renamed';
2486
+ oldName: string;
2487
+ newName: string;
2488
+ /** The entity after the rename (name === newName). */
2489
+ entity: Entity;
2490
+ }
2213
2491
  /**
2214
2492
  * Phase 10 Sprint 2: Event emitted when a relation is created.
2215
2493
  *
@@ -2305,7 +2583,7 @@ interface GraphLoadedEvent extends GraphEventBase {
2305
2583
  *
2306
2584
  * Use this when handling any type of graph event.
2307
2585
  */
2308
- type GraphEvent = EntityCreatedEvent | EntityUpdatedEvent | EntityDeletedEvent | RelationCreatedEvent | RelationDeletedEvent | ObservationAddedEvent | ObservationDeletedEvent | GraphSavedEvent | GraphLoadedEvent;
2586
+ type GraphEvent = EntityCreatedEvent | EntityUpdatedEvent | EntityDeletedEvent | EntityRenamedEvent | RelationCreatedEvent | RelationDeletedEvent | ObservationAddedEvent | ObservationDeletedEvent | GraphSavedEvent | GraphLoadedEvent;
2309
2587
  /**
2310
2588
  * Phase 10 Sprint 2: Listener function type for graph events.
2311
2589
  *
@@ -2321,6 +2599,7 @@ interface GraphEventMap {
2321
2599
  'entity:created': EntityCreatedEvent;
2322
2600
  'entity:updated': EntityUpdatedEvent;
2323
2601
  'entity:deleted': EntityDeletedEvent;
2602
+ 'entity:renamed': EntityRenamedEvent;
2324
2603
  'relation:created': RelationCreatedEvent;
2325
2604
  'relation:deleted': RelationDeletedEvent;
2326
2605
  'observation:added': ObservationAddedEvent;
@@ -2483,7 +2762,7 @@ interface HybridSearchResult {
2483
2762
  symbolic: number;
2484
2763
  combined: number;
2485
2764
  };
2486
- matchedLayers: ('semantic' | 'lexical' | 'symbolic')[];
2765
+ matchedLayers: ('semantic' | 'lexical' | 'symbolic' | 'graph')[];
2487
2766
  }
2488
2767
  /**
2489
2768
  * An extracted entity from query analysis.
@@ -2882,6 +3161,25 @@ interface DecayEngineConfig {
2882
3161
  * Enable to make low-confidence memories decay faster in importance.
2883
3162
  */
2884
3163
  applyConfidenceToImportance?: boolean;
3164
+ /**
3165
+ * Connectivity protection strength in [0, 1] (default: 0 = off).
3166
+ * Well-connected entities decay slower:
3167
+ * `effectiveDecayFactor = decayFactor + (1 - decayFactor) × connectivityProtection × normalizedDegree`
3168
+ * where `normalizedDegree` is the entity's relation degree divided by
3169
+ * the maximum degree in the graph. At protection 1 a max-degree entity
3170
+ * does not decay at all; at 0 behavior is unchanged. Values outside
3171
+ * [0, 1] are clamped. Applies only to the legacy
3172
+ * `calculateEffectiveImportance` path, never to
3173
+ * `calculatePrdEffectiveImportance`.
3174
+ *
3175
+ * Because `calculateEffectiveImportance` is synchronous, degrees are
3176
+ * read from a cached snapshot that is refreshed by the batch
3177
+ * operations (`applyDecay`, `getDecayedMemories`, `getMemoriesAtRisk`,
3178
+ * `forgetWeakMemories`) or explicitly via
3179
+ * `refreshConnectivitySnapshot()`. Before the first refresh no
3180
+ * protection is applied.
3181
+ */
3182
+ connectivityProtection?: number;
2885
3183
  /**
2886
3184
  * PRD `decay_rate`: exponential decay rate per second for the recency
2887
3185
  * term in `calculatePrdEffectiveImportance`. When absent, derived from
@@ -2952,6 +3250,8 @@ declare class DecayEngine {
2952
3250
  private readonly accessTracker;
2953
3251
  private readonly config;
2954
3252
  private readonly freshnessManager;
3253
+ /** Degree snapshot for connectivity protection (see refreshConnectivitySnapshot). */
3254
+ private _connectivityDegrees;
2955
3255
  constructor(storage: IGraphStorage, accessTracker: AccessTracker, config?: DecayEngineConfig);
2956
3256
  /**
2957
3257
  * Calculate decay factor based on time since last access.
@@ -3000,7 +3300,9 @@ declare class DecayEngine {
3000
3300
  * Formula: base_importance * decay_factor * strength_multiplier * confidence_factor
3001
3301
  *
3002
3302
  * - base_importance: Entity's stated importance (0-10)
3003
- * - decay_factor: Time-based decay (0-1), accelerated for past-TTL entities
3303
+ * - decay_factor: Time-based decay (0-1), accelerated for past-TTL entities;
3304
+ * when `connectivityProtection` > 0 and a degree snapshot is available,
3305
+ * lifted toward 1 for well-connected entities (see DecayEngineConfig)
3004
3306
  * - strength_multiplier: Boost from confirmations and accesses
3005
3307
  * - confidence_factor: Decayed confidence based on entity age
3006
3308
  *
@@ -3027,6 +3329,23 @@ declare class DecayEngine {
3027
3329
  * Exposed for callers that need freshness calculations alongside decay.
3028
3330
  */
3029
3331
  getFreshnessManager(): FreshnessManager;
3332
+ /**
3333
+ * Refresh the degree snapshot used for connectivity protection.
3334
+ *
3335
+ * `calculateEffectiveImportance` is synchronous, so it reads entity
3336
+ * degrees from this cached snapshot. The batch operations
3337
+ * (`applyDecay`, `getDecayedMemories`, `getMemoriesAtRisk`,
3338
+ * `forgetWeakMemories`) refresh it automatically from the graph they
3339
+ * already load; call this method directly before ad-hoc single-entity
3340
+ * scoring when relations may have changed. No-op cost when
3341
+ * `connectivityProtection` is 0 apart from the graph load.
3342
+ */
3343
+ refreshConnectivitySnapshot(): Promise<void>;
3344
+ /**
3345
+ * Refresh the degree snapshot from an already-loaded graph.
3346
+ * Skipped entirely when connectivity protection is disabled.
3347
+ */
3348
+ private maybeRefreshConnectivity;
3030
3349
  /**
3031
3350
  * Calculate effective importance using the Context Engine PRD formula.
3032
3351
  *
@@ -3173,6 +3492,13 @@ interface SalienceEngineConfig {
3173
3492
  * The freshness factor is subtracted from the final score proportionally.
3174
3493
  */
3175
3494
  freshnessWeight?: number;
3495
+ /**
3496
+ * Weight for graph connectivity boost (default: 0 = disabled).
3497
+ * The connectivity signal is an entity's relation degree normalized
3498
+ * by the maximum degree in the graph, in [0, 1]. With the default
3499
+ * weight of 0 the signal is never computed and scores are unchanged.
3500
+ */
3501
+ connectivityWeight?: number;
3176
3502
  }
3177
3503
  /**
3178
3504
  * Calculates multi-factor salience scores for memories.
@@ -3203,6 +3529,7 @@ declare class SalienceEngine {
3203
3529
  private readonly freshnessManager;
3204
3530
  private readonly config;
3205
3531
  private _cachedMaxAccessCount;
3532
+ private _cachedDegreeMap;
3206
3533
  constructor(storage: IGraphStorage, accessTracker: AccessTracker, decayEngine: DecayEngine, config?: SalienceEngineConfig);
3207
3534
  /**
3208
3535
  * Calculate salience score for an entity in the given context.
@@ -3213,6 +3540,7 @@ declare class SalienceEngine {
3213
3540
  * - Frequency: Log-normalized access count relative to max
3214
3541
  * - Context: Text similarity to current task/session/query
3215
3542
  * - Novelty: Inverse of recency (rewards less recently accessed)
3543
+ * - Connectivity: Relation degree normalized by max degree (opt-in, weight 0 by default)
3216
3544
  *
3217
3545
  * @param entity - AgentEntity to calculate salience for
3218
3546
  * @param context - Context information for relevance scoring
@@ -3337,6 +3665,21 @@ declare class SalienceEngine {
3337
3665
  * @returns Score between 0 and 1
3338
3666
  */
3339
3667
  private calculateObservationUniqueness;
3668
+ /**
3669
+ * Calculate connectivity boost component.
3670
+ * Relation degree of the entity normalized by the maximum degree
3671
+ * in the graph. Well-connected (hub) entities score closer to 1;
3672
+ * isolated entities score 0.
3673
+ *
3674
+ * @param entity - Entity to calculate for
3675
+ * @returns Score between 0 and 1
3676
+ */
3677
+ private calculateConnectivityBoost;
3678
+ /**
3679
+ * Compute the relation degree map for the current graph.
3680
+ * Used for normalizing connectivity scores.
3681
+ */
3682
+ private getDegreeMap;
3340
3683
  /**
3341
3684
  * Get the maximum access count across all entities.
3342
3685
  * Used for normalizing frequency scores.
@@ -4651,6 +4994,12 @@ interface SalienceComponents {
4651
4994
  contextRelevance: number;
4652
4995
  /** Novelty contribution */
4653
4996
  noveltyBoost: number;
4997
+ /**
4998
+ * Graph connectivity contribution (relation degree normalized by max
4999
+ * degree). Optional for backwards compatibility; 0 when the
5000
+ * connectivity signal is disabled (connectivityWeight = 0).
5001
+ */
5002
+ connectivityBoost?: number;
4654
5003
  }
4655
5004
  /**
4656
5005
  * Entity with calculated salience score.
@@ -6059,12 +6408,185 @@ declare function createDetailedProgressReporter(total: number, callback?: Progre
6059
6408
  };
6060
6409
 
6061
6410
  /**
6062
- * Result<T, E> discriminated-union return type for operations with
6063
- * *expected* domain failures.
6411
+ * Types for the Cue–Tag–Content associative memory graph and active memory
6412
+ * reconstruction, implementing the MRAgent design from
6413
+ * "Memory is Reconstructed, Not Retrieved: Graph Memory for LLM Agents"
6414
+ * (Ji, Li & Hooi, ICML 2026).
6064
6415
  *
6065
- * Per the MemoryJS error-handling policy (see CONTRIBUTING.md > Error
6066
- * Handling):
6067
- * - **throw** for programmer errorsbad arguments, invariant violations,
6416
+ * The memory system is modelled as a heterogeneous graph `M = (C, V, R)`:
6417
+ * - Cues `c ∈ C` — fine-grained keywords (entities, attributes, descriptors)
6418
+ * - Contents `v V`memory items, organised into multi-granular layers
6419
+ * - Relations `R ⊆ C × G × V` — typed `(cue, tag, content)` triples where the
6420
+ * associative **tag** `g ∈ G` is the semantic bridge between cue and content.
6421
+ *
6422
+ * @module types/reconstruction
6423
+ * @experimental
6424
+ */
6425
+ /**
6426
+ * Multi-granular memory layers (paper §3.2).
6427
+ *
6428
+ * - `episodic` — event-specific units grounded in a particular time/context.
6429
+ * - `semantic` — stable knowledge (attributes, preferences, facts) anchored to
6430
+ * an entity-level cue via an aspect-level tag.
6431
+ * - `topic` — higher-level abstractions summarising recurring patterns across a
6432
+ * coherent set of episodes.
6433
+ */
6434
+ type ContentLayer = 'episodic' | 'semantic' | 'topic';
6435
+ /** A fine-grained retrieval cue (entity, attribute, or salient descriptor). */
6436
+ interface CueNode {
6437
+ /** Stable identifier (normalised cue text). */
6438
+ id: string;
6439
+ /** Human-readable cue surface form. */
6440
+ text: string;
6441
+ }
6442
+ /**
6443
+ * An associative tag — a short phrase summarising the relational pattern that
6444
+ * links a cue to memory content. Tags are the controllable intermediate that
6445
+ * lets the agent prune traversal branches before touching expensive content.
6446
+ */
6447
+ interface TagNode {
6448
+ /** Stable identifier (normalised tag text). */
6449
+ id: string;
6450
+ /** Human-readable tag surface form (≤ ~2 words). */
6451
+ text: string;
6452
+ }
6453
+ /** A memory content node — an episode, a semantic fact, or a topic abstraction. */
6454
+ interface ContentNode {
6455
+ /** Stable identifier (e.g. `e1`, `s2`, `t3`). */
6456
+ id: string;
6457
+ /** Which multi-granular layer this content belongs to. */
6458
+ layer: ContentLayer;
6459
+ /** The content text (episode description, fact, or topic summary). */
6460
+ text: string;
6461
+ /** ISO `YYYY-MM-DD` conversation timestamp (episodic layer). */
6462
+ timestamp?: string;
6463
+ /** Topic ids this episode belongs to (episodic → topic links). */
6464
+ topicIds?: string[];
6465
+ /** Entity-level anchor for semantic content (the person/subject the fact is about). */
6466
+ person?: string;
6467
+ /** Free-form provenance (e.g. originating dialogue id). */
6468
+ origin?: string;
6469
+ /**
6470
+ * Name of the persisted MemoryJS entity backing this content node, set when the
6471
+ * graph is bridged to the live store (episodic→`EpisodicMemoryManager` timeline,
6472
+ * semantic→entity/observation graph, topic→topic entity). Absent when running
6473
+ * the self-contained in-memory graph.
6474
+ */
6475
+ entityName?: string;
6476
+ }
6477
+ /** A `(cue, tag, content)` association — one edge of the relation set `R`. */
6478
+ interface CTCTriple {
6479
+ /** Cue id. */
6480
+ cue: string;
6481
+ /** Tag id. */
6482
+ tag: string;
6483
+ /** Content id. */
6484
+ content: string;
6485
+ }
6486
+ /** Serialisable snapshot of a {@link CueTagContentGraph}. */
6487
+ interface CTCGraphSnapshot {
6488
+ cues: CueNode[];
6489
+ tags: TagNode[];
6490
+ contents: ContentNode[];
6491
+ triples: CTCTriple[];
6492
+ }
6493
+ /** A single processed/rewritten dialogue sentence produced by distillation. */
6494
+ interface DistilledSentence {
6495
+ /** Sentence id (e.g. `D1:1-1`). */
6496
+ id: string;
6497
+ /** Rewritten, self-contained text (pronouns resolved, time normalised). */
6498
+ text: string;
6499
+ /** Short associative tag (≤ ~2 words). */
6500
+ tag: string;
6501
+ /** Originating raw sentence id. */
6502
+ origin?: string;
6503
+ /** Topic ids this sentence belongs to. */
6504
+ topics?: string[];
6505
+ /** ISO `YYYY-MM-DD` timestamp. */
6506
+ time?: string;
6507
+ }
6508
+ /** A person-anchored semantic fact extracted during distillation. */
6509
+ interface PersonalFact {
6510
+ /** Fact id (e.g. `p1`). */
6511
+ id: string;
6512
+ /** Normalised fact text. */
6513
+ text: string;
6514
+ /** Aspect-level tag (e.g. `preference`, `occupation`). */
6515
+ tag: string;
6516
+ /** The person/entity the fact is about. */
6517
+ person: string;
6518
+ /** Originating raw sentence id. */
6519
+ origin?: string;
6520
+ }
6521
+ /** Result of running the LLM distillation pipeline over a dialogue. */
6522
+ interface DistillationResult$1 {
6523
+ /** Conversation reference date (ISO `YYYY-MM-DD`). */
6524
+ conversationTime?: string;
6525
+ /** Rewritten episodic sentences. */
6526
+ sentences: DistilledSentence[];
6527
+ /** topic-id → topic description. */
6528
+ topics: Record<string, string>;
6529
+ /** Extracted person-anchored semantic facts. */
6530
+ personalFacts: PersonalFact[];
6531
+ /** sentence-id → extracted cue surface forms. */
6532
+ keywords: Record<string, string[]>;
6533
+ }
6534
+ /** Raw dialogue input accepted by the distiller. */
6535
+ interface DialogueTurn {
6536
+ /** Stable id for the turn (e.g. `D1:1`). */
6537
+ id: string;
6538
+ /** Speaker name, if known. */
6539
+ speaker?: string;
6540
+ /** Raw utterance text. */
6541
+ text: string;
6542
+ /** ISO timestamp for the turn, if known. */
6543
+ timestamp?: string;
6544
+ }
6545
+ /** A traversal action the agent may take over the memory graph (paper §4.1). */
6546
+ type TraversalActionType = 'cue->tag' | 'cuetag->content' | 'content->cuetag' | 'topic->episode';
6547
+ /** One executed traversal action and the candidates it produced. */
6548
+ interface TraversalStep {
6549
+ /** 0-based reconstruction step index. */
6550
+ step: number;
6551
+ /** The action(s) the policy selected this step. */
6552
+ actions: TraversalActionType[];
6553
+ /** Content nodes routed into the reconstructed context this step. */
6554
+ routed: ContentNode[];
6555
+ /** Short rationale for the step (policy- or LLM-supplied). */
6556
+ rationale?: string;
6557
+ }
6558
+ /** Final output of an active reconstruction run (Algorithm 1). */
6559
+ interface ReconstructionResult {
6560
+ /** The query that was reconstructed against. */
6561
+ query: string;
6562
+ /** Final answer, when an answering policy is supplied. */
6563
+ answer?: string;
6564
+ /** Confidence in `[0, 1]`, when available. */
6565
+ confidence?: number;
6566
+ /** Accumulated evidence (the reconstructed context `H`). */
6567
+ evidence: ContentNode[];
6568
+ /** The step-by-step traversal trajectory. */
6569
+ trajectory: TraversalStep[];
6570
+ /** Whether the loop stopped on a satisfied stopping condition (vs. budget). */
6571
+ stoppedEarly: boolean;
6572
+ }
6573
+ /** Tunables for the reconstruction loop. */
6574
+ interface ReconstructionOptions {
6575
+ /** Max reasoning turns `T` (paper caps at 8). Default 8. */
6576
+ maxSteps?: number;
6577
+ /** Max content nodes routed per step (per-turn retrieval budget `K`). Default 10. */
6578
+ perStepBudget?: number;
6579
+ /** Stop once this many distinct evidence items are accumulated. Default 12. */
6580
+ evidenceTarget?: number;
6581
+ }
6582
+
6583
+ /**
6584
+ * Result<T, E> — discriminated-union return type for operations with
6585
+ * *expected* domain failures.
6586
+ *
6587
+ * Per the MemoryJS error-handling policy (see CONTRIBUTING.md > Error
6588
+ * Handling):
6589
+ * - **throw** for programmer errors — bad arguments, invariant violations,
6068
6590
  * "this should never happen" states;
6069
6591
  * - **return `Result<T, E>`** for expected, recoverable failures the caller
6070
6592
  * is meant to branch on (not found, validation failed, conflict, ...);
@@ -6970,6 +7492,18 @@ declare function levenshteinDistance(str1: string, str2: string): number;
6970
7492
  * @returns Term frequency (0.0 to 1.0)
6971
7493
  */
6972
7494
  declare function calculateTF(term: string, document: string): number;
7495
+ /**
7496
+ * Calculate Term Frequency (TF) from pre-tokenized documents.
7497
+ *
7498
+ * TF = (Number of times term appears in document) / (Total terms in document)
7499
+ *
7500
+ * **Optimized**: Avoids re-tokenizing the document text for each term.
7501
+ *
7502
+ * @param term - The search term (should already be lowercase if possible)
7503
+ * @param tokens - Pre-tokenized lowercase tokens for the document
7504
+ * @returns Term frequency (0.0 to 1.0)
7505
+ */
7506
+ declare function calculateTFFromTokens(term: string, tokens: string[]): number;
6973
7507
  /**
6974
7508
  * Calculate Inverse Document Frequency (IDF) for a term across documents.
6975
7509
  *
@@ -7206,6 +7740,7 @@ declare function cleanupAllCaches(): void;
7206
7740
  * Used for validating full entity objects including timestamps.
7207
7741
  */
7208
7742
  declare const EntitySchema: z.ZodObject<{
7743
+ id: z.ZodOptional<z.ZodString>;
7209
7744
  name: z.ZodString;
7210
7745
  entityType: z.ZodString;
7211
7746
  observations: z.ZodArray<z.ZodString>;
@@ -7222,6 +7757,7 @@ declare const EntitySchema: z.ZodObject<{
7222
7757
  * Timestamps are optional and will be auto-generated if not provided.
7223
7758
  */
7224
7759
  declare const CreateEntitySchema: z.ZodObject<{
7760
+ id: z.ZodOptional<z.ZodString>;
7225
7761
  name: z.ZodString;
7226
7762
  entityType: z.ZodString;
7227
7763
  observations: z.ZodArray<z.ZodString>;
@@ -7348,6 +7884,7 @@ declare const ExportFormatSchema: z.ZodEnum<{
7348
7884
  * Empty arrays are allowed (no-op).
7349
7885
  */
7350
7886
  declare const BatchCreateEntitiesSchema: z.ZodArray<z.ZodObject<{
7887
+ id: z.ZodOptional<z.ZodString>;
7351
7888
  name: z.ZodString;
7352
7889
  entityType: z.ZodString;
7353
7890
  observations: z.ZodArray<z.ZodString>;
@@ -7636,6 +8173,10 @@ declare function validateRelation(relation: unknown): ValidationResult$1;
7636
8173
  declare function validateImportance(importance: number): boolean;
7637
8174
  /** Validate an array of tags. */
7638
8175
  declare function validateTags(tags: unknown): ValidationResult$1;
8176
+ /** Validate a non-empty string with detailed error reporting. */
8177
+ declare function validateNonEmpty(value: unknown, fieldName: string, contextName?: string): void;
8178
+ /** Validate a non-empty array with detailed error reporting. */
8179
+ declare function validateNonEmptyArray(value: unknown, fieldName: string, contextName?: string): void;
7639
8180
 
7640
8181
  /**
7641
8182
  * Response and Pagination Formatters
@@ -8167,16 +8708,15 @@ declare function ensureMemoryFilePath(): Promise<string>;
8167
8708
  /**
8168
8709
  * Parallel Utilities
8169
8710
  *
8170
- * Utilities for parallel array operations using workerpool.
8711
+ * Utilities for parallel array operations.
8171
8712
  * Phase 8 Sprint 3: Parallel array operations for improved performance.
8172
8713
  *
8173
- * **SECURITY WARNING:** These functions use `new Function()` internally for worker serialization.
8174
- * The `fn` parameter MUST be a real function object, never a user-provided string.
8175
- * Runtime validation ensures only function objects are accepted.
8714
+ * Note: Actual multiprocessing capabilities have been removed for security reasons
8715
+ * (preventing dynamic function execution) and to use the unified WorkerTaskManager.
8716
+ * These utilities now execute sequentially but asynchronously via Promise.all.
8176
8717
  *
8177
8718
  * @module utils/parallelUtils
8178
8719
  */
8179
-
8180
8720
  /**
8181
8721
  * Shutdown the shared worker pool and clean up resources.
8182
8722
  * Should be called when parallel utilities are no longer needed.
@@ -8207,7 +8747,7 @@ declare function shutdownParallelUtils(): Promise<void>;
8207
8747
  * // Result: [1, 4, 9, 16, 25]
8208
8748
  * ```
8209
8749
  */
8210
- declare function parallelMap<T, R>(items: T[], fn: (item: T) => R, chunkSize?: number): Promise<R[]>;
8750
+ declare function parallelMap<T, R>(items: T[], fn: (item: T) => R | Promise<R>, _chunkSize?: number): Promise<R[]>;
8211
8751
  /**
8212
8752
  * Filter items in parallel using workerpool.
8213
8753
  *
@@ -8232,13 +8772,19 @@ declare function parallelMap<T, R>(items: T[], fn: (item: T) => R, chunkSize?: n
8232
8772
  * // Result: [2, 4, 6]
8233
8773
  * ```
8234
8774
  */
8235
- declare function parallelFilter<T>(items: T[], predicate: (item: T) => boolean, chunkSize?: number): Promise<T[]>;
8775
+ declare function parallelFilter<T>(items: T[], predicate: (item: T) => boolean | Promise<boolean>, _chunkSize?: number): Promise<T[]>;
8236
8776
  /**
8237
8777
  * Get statistics about the worker pool.
8238
8778
  *
8239
8779
  * @returns Pool statistics or null if pool is not initialized
8240
8780
  */
8241
- declare function getPoolStats(): workerpool.PoolStats | null;
8781
+ declare function getPoolStats(): {
8782
+ totalWorkers: number;
8783
+ busyWorkers: number;
8784
+ idleWorkers: number;
8785
+ pendingTasks: number;
8786
+ activeTasks: number;
8787
+ } | null;
8242
8788
 
8243
8789
  /**
8244
8790
  * Operation Utilities
@@ -8480,10 +9026,13 @@ interface TaskSubmitOptions {
8480
9026
  }
8481
9027
  /**
8482
9028
  * Handle returned by `submitWithHandle`. The `result` promise settles when
8483
- * the task finishes; `cancel()` evicts a still-pending task from the queue
8484
- * (returns `true`) or signals a request-cancellation flag on a running task
8485
- * (returns `false` `workerpool` itself doesn't support hard-cancel and
8486
- * terminating mid-task is destructive).
9029
+ * the task finishes; `cancel()` performs two-tier cancellation:
9030
+ *
9031
+ * - If still pending in the queue: evict cleanly. Returns `true`.
9032
+ * - If already dispatched: propagate to the underlying
9033
+ * `WorkerpoolPromise.cancel()` so the running worker rejects with
9034
+ * `CancellationError`. Returns `true` if the workerpool promise was
9035
+ * still pending at the moment of cancel; `false` if it already settled.
8487
9036
  */
8488
9037
  interface TaskHandle<R> {
8489
9038
  id: string;
@@ -8534,6 +9083,7 @@ declare class WorkerTaskManager {
8534
9083
  private readonly touchedPoolIds;
8535
9084
  private readonly cancelledTaskIds;
8536
9085
  private readonly handleStatus;
9086
+ private readonly liveExecPromises;
8537
9087
  constructor(opts?: {
8538
9088
  /** Max concurrent tasks across the queue. Default: cpus − 1. */
8539
9089
  concurrency?: number;
@@ -9814,213 +10364,6 @@ declare class BatchTransaction {
9814
10364
  private applyBatchOperation;
9815
10365
  }
9816
10366
 
9817
- /**
9818
- * Graph Event Emitter
9819
- *
9820
- * Phase 10 Sprint 2: Provides event-based notifications for graph changes.
9821
- * Enables loose coupling between graph operations and dependent systems
9822
- * like search indexes, analytics, and external integrations.
9823
- *
9824
- * @module core/GraphEventEmitter
9825
- */
9826
-
9827
- /**
9828
- * Phase 10 Sprint 2: Event emitter for graph change notifications.
9829
- *
9830
- * Provides a type-safe event system for subscribing to and emitting
9831
- * graph change events. Supports wildcard listeners for all events.
9832
- *
9833
- * @example
9834
- * ```typescript
9835
- * const emitter = new GraphEventEmitter();
9836
- *
9837
- * // Listen to specific event types
9838
- * emitter.on('entity:created', (event) => {
9839
- * console.log(`Entity ${event.entity.name} created`);
9840
- * });
9841
- *
9842
- * // Listen to all events
9843
- * emitter.onAny((event) => {
9844
- * console.log(`Event: ${event.type}`);
9845
- * });
9846
- *
9847
- * // Emit an event
9848
- * emitter.emitEntityCreated(entity);
9849
- *
9850
- * // Remove listener
9851
- * const unsubscribe = emitter.on('entity:deleted', handler);
9852
- * unsubscribe();
9853
- * ```
9854
- */
9855
- declare class GraphEventEmitter {
9856
- /**
9857
- * Map of event types to their registered listeners. The Set stores
9858
- * listeners typed for different specific event subtypes (one Set per
9859
- * GraphEventType key). TS can't express this dependent-key relationship
9860
- * without `any` due to function-parameter contravariance.
9861
- */
9862
- private listeners;
9863
- /**
9864
- * Listeners that receive all events regardless of type.
9865
- */
9866
- private wildcardListeners;
9867
- /**
9868
- * Whether to suppress errors from listeners (default: true).
9869
- * When true, listener errors are logged but don't stop event propagation.
9870
- */
9871
- private suppressListenerErrors;
9872
- /**
9873
- * Create a new GraphEventEmitter instance.
9874
- *
9875
- * @param options - Optional configuration
9876
- */
9877
- constructor(options?: {
9878
- suppressListenerErrors?: boolean;
9879
- });
9880
- /**
9881
- * Subscribe to a specific event type.
9882
- *
9883
- * @template K - The event type key
9884
- * @param eventType - The event type to listen for
9885
- * @param listener - Callback function to invoke when event occurs
9886
- * @returns Unsubscribe function to remove the listener
9887
- *
9888
- * @example
9889
- * ```typescript
9890
- * const unsubscribe = emitter.on('entity:created', (event) => {
9891
- * console.log(`Created: ${event.entity.name}`);
9892
- * });
9893
- *
9894
- * // Later: unsubscribe();
9895
- * ```
9896
- */
9897
- on<K extends GraphEventType>(eventType: K, listener: GraphEventListener<GraphEventMap[K]>): () => void;
9898
- /**
9899
- * Unsubscribe from a specific event type.
9900
- *
9901
- * @template K - The event type key
9902
- * @param eventType - The event type to unsubscribe from
9903
- * @param listener - The listener function to remove
9904
- */
9905
- off<K extends GraphEventType>(eventType: K, listener: GraphEventListener<GraphEventMap[K]>): void;
9906
- /**
9907
- * Subscribe to all event types.
9908
- *
9909
- * @param listener - Callback function to invoke for any event
9910
- * @returns Unsubscribe function to remove the listener
9911
- *
9912
- * @example
9913
- * ```typescript
9914
- * emitter.onAny((event) => {
9915
- * console.log(`Event: ${event.type} at ${event.timestamp}`);
9916
- * });
9917
- * ```
9918
- */
9919
- onAny(listener: GraphEventListener<GraphEvent>): () => void;
9920
- /**
9921
- * Unsubscribe from all events.
9922
- *
9923
- * @param listener - The listener function to remove
9924
- */
9925
- offAny(listener: GraphEventListener<GraphEvent>): void;
9926
- /**
9927
- * Subscribe to an event type, but only receive the first occurrence.
9928
- *
9929
- * @template K - The event type key
9930
- * @param eventType - The event type to listen for once
9931
- * @param listener - Callback function to invoke once
9932
- * @returns Unsubscribe function to cancel before event occurs
9933
- */
9934
- once<K extends GraphEventType>(eventType: K, listener: GraphEventListener<GraphEventMap[K]>): () => void;
9935
- /**
9936
- * Remove all listeners for all event types.
9937
- */
9938
- removeAllListeners(): void;
9939
- /**
9940
- * Get the count of listeners for a specific event type.
9941
- *
9942
- * @param eventType - The event type to count listeners for
9943
- * @returns Number of listeners registered
9944
- */
9945
- listenerCount(eventType?: GraphEventType): number;
9946
- /**
9947
- * Emit an event to all registered listeners.
9948
- *
9949
- * @param event - The event to emit
9950
- */
9951
- emit(event: GraphEvent): void;
9952
- /**
9953
- * Emit an entity:created event.
9954
- *
9955
- * @param entity - The entity that was created
9956
- */
9957
- emitEntityCreated(entity: Entity): void;
9958
- /**
9959
- * Emit an entity:updated event.
9960
- *
9961
- * @param entityName - Name of the updated entity
9962
- * @param changes - The changes that were applied
9963
- * @param previousValues - Optional previous values before update
9964
- */
9965
- emitEntityUpdated(entityName: string, changes: Partial<Entity>, previousValues?: Partial<Entity>): void;
9966
- /**
9967
- * Emit an entity:deleted event.
9968
- *
9969
- * @param entityName - Name of the deleted entity
9970
- * @param entity - Optional entity data before deletion
9971
- */
9972
- emitEntityDeleted(entityName: string, entity?: Entity): void;
9973
- /**
9974
- * Emit a relation:created event.
9975
- *
9976
- * @param relation - The relation that was created
9977
- */
9978
- emitRelationCreated(relation: Relation): void;
9979
- /**
9980
- * Emit a relation:deleted event.
9981
- *
9982
- * @param from - Source entity name
9983
- * @param to - Target entity name
9984
- * @param relationType - Type of the deleted relation
9985
- */
9986
- emitRelationDeleted(from: string, to: string, relationType: string): void;
9987
- /**
9988
- * Emit an observation:added event.
9989
- *
9990
- * @param entityName - Name of the entity
9991
- * @param observations - Observations that were added
9992
- */
9993
- emitObservationAdded(entityName: string, observations: string[]): void;
9994
- /**
9995
- * Emit an observation:deleted event.
9996
- *
9997
- * @param entityName - Name of the entity
9998
- * @param observations - Observations that were deleted
9999
- */
10000
- emitObservationDeleted(entityName: string, observations: string[]): void;
10001
- /**
10002
- * Emit a graph:saved event.
10003
- *
10004
- * @param entityCount - Number of entities in the saved graph
10005
- * @param relationCount - Number of relations in the saved graph
10006
- */
10007
- emitGraphSaved(entityCount: number, relationCount: number): void;
10008
- /**
10009
- * Emit a graph:loaded event.
10010
- *
10011
- * @param entityCount - Number of entities in the loaded graph
10012
- * @param relationCount - Number of relations in the loaded graph
10013
- */
10014
- emitGraphLoaded(entityCount: number, relationCount: number): void;
10015
- /**
10016
- * Safely invoke a listener, optionally catching errors. Listener is
10017
- * typed `<any>` to match the heterogeneous storage in `this.listeners`
10018
- * (see field-level comment).
10019
- * @private
10020
- */
10021
- private invokeListener;
10022
- }
10023
-
10024
10367
  /**
10025
10368
  * Graph Storage
10026
10369
  *
@@ -10351,6 +10694,41 @@ declare class GraphStorage implements IGraphStorage {
10351
10694
  * @returns Promise resolving to true if entity was found and updated, false otherwise
10352
10695
  */
10353
10696
  updateEntity(entityName: string, updates: Partial<Entity>): Promise<boolean>;
10697
+ /**
10698
+ * Atomically rename an entity, rewriting every stored reference to the
10699
+ * old name:
10700
+ * - `Relation.from` / `Relation.to`
10701
+ * - other entities' `parentId`
10702
+ * - version-chain fields on all entities (`parentEntityName`,
10703
+ * `rootEntityName`, `supersededBy`) — including self-references on
10704
+ * the renamed entity itself.
10705
+ *
10706
+ * The entity's `id`, `createdAt`, and all other fields are preserved;
10707
+ * only `lastModified` is bumped. Referencing entities/relations keep
10708
+ * their own timestamps (a rename is a pure reference rewrite, their
10709
+ * content did not change).
10710
+ *
10711
+ * Implementation: load-mutate-save via `saveGraphInternal`, which fully
10712
+ * rewrites the file and rebuilds every in-memory index (NameIndex /
10713
+ * TypeIndex / LowercaseCache / RelationIndex / ObservationIndex) — the
10714
+ * same pattern other bulk mutations use. This also makes segment mode
10715
+ * (`MEMORY_STORAGE_SEGMENT_COUNT >= 2`) correct for free: `saveAll`
10716
+ * re-routes every entity through `fnv1a32(name) % N`, so the renamed
10717
+ * entity migrates to its new owning segment atomically (manifest-based
10718
+ * multi-file commit).
10719
+ *
10720
+ * Does NOT emit entity events itself — `EntityManager.renameEntity`
10721
+ * emits `entity:renamed` + `entity:deleted` + `entity:created` after
10722
+ * the storage write succeeds. (`saveGraphInternal` still emits its
10723
+ * usual `graph:saved`.)
10724
+ *
10725
+ * @param oldName - Current entity name (must exist)
10726
+ * @param newName - New entity name (must not exist)
10727
+ * @returns The renamed entity
10728
+ * @throws {EntityNotFoundError} If `oldName` does not exist
10729
+ * @throws {DuplicateEntityError} If `newName` already exists
10730
+ */
10731
+ renameEntity(oldName: string, newName: string): Promise<Entity>;
10354
10732
  /**
10355
10733
  * Manually clear the cache.
10356
10734
  *
@@ -10653,6 +11031,15 @@ declare class SQLiteStorage implements IGraphStorage {
10653
11031
  * to protect our in-memory cache and index operations.
10654
11032
  */
10655
11033
  private mutex;
11034
+ /**
11035
+ * Application-level mutex for managers to serialize validate+mutate+save.
11036
+ * Mirrors `GraphStorage.graphMutex` — `EntityManager` / `RelationManager` /
11037
+ * `ObservationManager` acquire it around their read-modify-write cycles,
11038
+ * so it must exist on every backend those managers can be handed.
11039
+ * (Previously missing here, which made manager-level batch mutations
11040
+ * crash on the SQLite backend.)
11041
+ */
11042
+ readonly graphMutex: AsyncMutex;
10656
11043
  /**
10657
11044
  * SQLite database instance for writes and write-transaction reads.
10658
11045
  */
@@ -10723,6 +11110,14 @@ declare class SQLiteStorage implements IGraphStorage {
10723
11110
  * Maps entity name -> all relations involving that entity (both incoming and outgoing).
10724
11111
  */
10725
11112
  private bidirectionalRelationCache;
11113
+ /**
11114
+ * Event emitter for graph change notifications. Mirrors
11115
+ * `GraphStorage.eventEmitter` so event-driven derived views
11116
+ * (`TFIDFEventSync`, `GraphRankPrior`, embedding caches, the columnar
11117
+ * observation shadow store, `TransitionLedger`) work identically on the
11118
+ * SQLite backend.
11119
+ */
11120
+ private eventEmitter;
10726
11121
  /**
10727
11122
  * Validated database file path (after path traversal checks).
10728
11123
  */
@@ -10734,6 +11129,33 @@ declare class SQLiteStorage implements IGraphStorage {
10734
11129
  * @throws {FileOperationError} If path traversal is detected
10735
11130
  */
10736
11131
  constructor(dbFilePath: string);
11132
+ /**
11133
+ * Get the event emitter for subscribing to graph changes.
11134
+ *
11135
+ * Emission parity with `GraphStorage` (one-for-one at the equivalent
11136
+ * mutation points):
11137
+ * - `graph:loaded` — after `loadCache()` populates the in-memory cache
11138
+ * - `graph:saved` — after `saveGraph()` commits a full-graph write
11139
+ * - `entity:created` — `appendEntity()`
11140
+ * - `relation:created` — `appendRelation()`
11141
+ * - `entity:updated` — `updateEntity()` (with `previousValues`)
11142
+ * - rename events (`entity:renamed` → `entity:deleted` → `entity:created`)
11143
+ * are emitted by `EntityManager.renameEntity` (manager level, same as
11144
+ * the JSONL path) — `renameEntity()` here intentionally emits nothing
11145
+ * so each event fires exactly once.
11146
+ *
11147
+ * @returns GraphEventEmitter instance
11148
+ *
11149
+ * @example
11150
+ * ```typescript
11151
+ * const storage = new SQLiteStorage('/data/memory.db');
11152
+ *
11153
+ * storage.events.on('entity:created', (event) => {
11154
+ * console.log(`Entity ${event.entity.name} created`);
11155
+ * });
11156
+ * ```
11157
+ */
11158
+ get events(): GraphEventEmitter;
10737
11159
  /**
10738
11160
  * Initialize the database connection and schema.
10739
11161
  */
@@ -10847,6 +11269,43 @@ declare class SQLiteStorage implements IGraphStorage {
10847
11269
  * @returns Promise resolving to true if found and updated
10848
11270
  */
10849
11271
  updateEntity(entityName: string, updates: Partial<Entity>): Promise<boolean>;
11272
+ /**
11273
+ * Atomically rename an entity, rewriting every stored reference to the
11274
+ * old name inside a single SQLite transaction:
11275
+ * - `entities.name` (+ `lastModified` bump on the renamed row)
11276
+ * - `relations.fromEntity` / `relations.toEntity`
11277
+ * - other entities' `parentId`
11278
+ * - version-chain columns (`parentEntityName`, `rootEntityName`,
11279
+ * `supersededBy` — all native columns, not JSON fields)
11280
+ * - `embeddings.entityName` (when the embeddings table exists)
11281
+ *
11282
+ * FTS5 stays in sync automatically: the `entities_au` AFTER UPDATE
11283
+ * trigger re-indexes each touched row (delete old values / insert new).
11284
+ *
11285
+ * Foreign keys are toggled OFF around the transaction (same pattern as
11286
+ * `saveGraph`): `relations.fromEntity/toEntity` and `entities.parentId`
11287
+ * reference `entities(name)` with no ON UPDATE action, so renaming the
11288
+ * parent key first would otherwise fail the FK check mid-flight.
11289
+ *
11290
+ * Referencing rows keep their own timestamps (a rename is a pure
11291
+ * reference rewrite; their content did not change).
11292
+ *
11293
+ * Does NOT emit entity events itself — `EntityManager.renameEntity`
11294
+ * emits `entity:renamed` + `entity:deleted` + `entity:created` after
11295
+ * the storage write succeeds (same division of responsibility as the
11296
+ * JSONL path). Emitting here as well would double-fire those events.
11297
+ * Unlike `GraphStorage.renameEntity` (which routes through
11298
+ * `saveGraphInternal` and therefore also emits `graph:saved` as an
11299
+ * implementation artifact of the full-file rewrite), this targeted SQL
11300
+ * transaction emits no `graph:saved` — no full-graph write happens.
11301
+ *
11302
+ * @param oldName - Current entity name (must exist)
11303
+ * @param newName - New entity name (must not exist)
11304
+ * @returns The renamed entity
11305
+ * @throws {EntityNotFoundError} If `oldName` does not exist
11306
+ * @throws {DuplicateEntityError} If `newName` already exists
11307
+ */
11308
+ renameEntity(oldName: string, newName: string): Promise<Entity>;
10850
11309
  /**
10851
11310
  * Compact the storage (runs VACUUM to reclaim space).
10852
11311
  *
@@ -11158,6 +11617,17 @@ declare class RefIndex {
11158
11617
  * @returns Number of refs removed
11159
11618
  */
11160
11619
  purgeEntity(entityName: string): Promise<number>;
11620
+ /**
11621
+ * Remap every alias pointing at `oldName` to point at `newName`.
11622
+ * Called by `EntityManager.renameEntity` so registered refs survive
11623
+ * entity renames (the reason this index exists). Silent no-op when no
11624
+ * refs point at `oldName`.
11625
+ *
11626
+ * @param oldName - Entity name before the rename
11627
+ * @param newName - Entity name after the rename
11628
+ * @returns Number of refs remapped
11629
+ */
11630
+ renameEntity(oldName: string, newName: string): Promise<number>;
11161
11631
  /**
11162
11632
  * Batch {@link purgeEntity} — rewrites the JSONL sidecar once for the
11163
11633
  * whole set instead of once per name.
@@ -11392,6 +11862,39 @@ declare class EntityManager {
11392
11862
  * ```
11393
11863
  */
11394
11864
  getEntity(name: string, options?: GetEntityOptions): Promise<Entity | null>;
11865
+ /**
11866
+ * List all entities in the graph, optionally filtered by entity type.
11867
+ *
11868
+ * This is the public bulk-enumeration API — use it instead of reaching
11869
+ * into the storage layer (`entityManager['storage'].loadGraph()`).
11870
+ *
11871
+ * Performance: when an `entityType` filter is given, the storage layer's
11872
+ * TypeIndex fast path (`getEntitiesByType`) resolves matches in O(k) for
11873
+ * k matching entities. Without a filter the full graph is loaded — O(n)
11874
+ * in graph size — so avoid unfiltered calls in hot paths on large graphs.
11875
+ *
11876
+ * The returned array is always a fresh copy (safe to sort/mutate), but
11877
+ * the Entity objects inside are the storage layer's live references —
11878
+ * treat them as read-only, same as `getEntity` results.
11879
+ *
11880
+ * @param filter - Optional filter. `entityType` matches case-insensitively
11881
+ * (TypeIndex semantics, same as `storage.getEntitiesByType`).
11882
+ * @returns Array of matching entities (empty when nothing matches)
11883
+ *
11884
+ * @example
11885
+ * ```typescript
11886
+ * const manager = new EntityManager(storage);
11887
+ *
11888
+ * // All entities
11889
+ * const all = await manager.listEntities();
11890
+ *
11891
+ * // Only procedures (O(k) via TypeIndex)
11892
+ * const procedures = await manager.listEntities({ entityType: 'procedure' });
11893
+ * ```
11894
+ */
11895
+ listEntities(filter?: {
11896
+ entityType?: string;
11897
+ }): Promise<Entity[]>;
11395
11898
  /**
11396
11899
  * List all distinct project IDs in the graph (excluding global entities).
11397
11900
  *
@@ -11501,6 +12004,55 @@ declare class EntityManager {
11501
12004
  updateEntity(name: string, updates: Partial<Entity>, options?: {
11502
12005
  expectedVersion?: number;
11503
12006
  }): Promise<Entity>;
12007
+ /**
12008
+ * Rename an entity, atomically rewriting every core-graph reference to
12009
+ * the old name.
12010
+ *
12011
+ * Delegates to the storage-level `renameEntity` primitive (implemented
12012
+ * by both `GraphStorage` and `SQLiteStorage`), which rewrites:
12013
+ * - `Relation.from` / `Relation.to`
12014
+ * - other entities' `parentId`
12015
+ * - version-chain fields (`parentEntityName`, `rootEntityName`,
12016
+ * `supersededBy`)
12017
+ *
12018
+ * The entity's `id`, `createdAt`, and all other fields are preserved;
12019
+ * `lastModified` is bumped. Registered `RefIndex` aliases pointing at
12020
+ * the old name are remapped to the new name (when a RefIndex is
12021
+ * configured via `setRefIndex` — `ManagerContext` wires this
12022
+ * automatically).
12023
+ *
12024
+ * **Events**: on backends with an event emitter (JSONL `GraphStorage`),
12025
+ * emits a typed `entity:renamed` event, followed by `entity:deleted`
12026
+ * (old name) and `entity:created` (renamed entity) so create/delete-only
12027
+ * derived views (TF-IDF event sync, rank priors, embedding caches) stay
12028
+ * consistent without learning the new event type. Listeners therefore
12029
+ * observe: `entity:renamed`, `entity:deleted`, `entity:created`.
12030
+ * Both first-party backends expose an emitter (`storage.events`), so
12031
+ * this sequence fires on JSONL and SQLite alike; the guard below only
12032
+ * protects third-party storage implementations without one.
12033
+ *
12034
+ * **Known limitations (intentionally out of scope)**:
12035
+ * - Archived snapshots (`ArchiveManager` compressed archives) keep the
12036
+ * old name — they are point-in-time exports, not live references.
12037
+ * - The audit log is immutable by design; historical records keep the
12038
+ * old name.
12039
+ * - Agent-memory soft references stored inside `agentMetadata` blobs or
12040
+ * observation text (e.g. `promotedFrom`, `previousSessionId`,
12041
+ * free-text mentions) are not rewritten.
12042
+ * - JSONL-backend vector-store sidecars are not rewritten; the emitted
12043
+ * delete+create events let embedding caches re-index the new name.
12044
+ *
12045
+ * @param oldName - Current entity name (must exist)
12046
+ * @param newName - New entity name (must not exist; must pass the same
12047
+ * validation as `createEntities`, including the reserved `profile-` /
12048
+ * `diary-` namespace rules)
12049
+ * @returns The renamed entity
12050
+ * @throws {ValidationError} If `newName` fails name validation or
12051
+ * violates a reserved namespace
12052
+ * @throws {EntityNotFoundError} If `oldName` does not exist
12053
+ * @throws {DuplicateEntityError} If `newName` already exists
12054
+ */
12055
+ renameEntity(oldName: string, newName: string): Promise<Entity>;
11504
12056
  /**
11505
12057
  * Update multiple entities in a single batch operation.
11506
12058
  *
@@ -14355,6 +14907,137 @@ declare class BasicSearch {
14355
14907
  searchByDateRange(startDate?: string, endDate?: string, entityType?: string, tags?: string[], offset?: number, limit?: number): Promise<KnowledgeGraph>;
14356
14908
  }
14357
14909
 
14910
+ /**
14911
+ * Graph Rank Prior
14912
+ *
14913
+ * Cached graph-connectivity signal provider for search ranking. Exposes
14914
+ * PageRank and degree centrality as ranking priors so that well-connected
14915
+ * entities can be boosted over isolated ones. The full-graph computation is
14916
+ * cached and lazily invalidated on graph mutation via GraphEventEmitter
14917
+ * subscription (entity created/updated/deleted, relation created/deleted,
14918
+ * and graph saved — the latter covers manager-level batch mutations like
14919
+ * `EntityManager.createEntities` / `RelationManager.createRelations`,
14920
+ * which persist via `storage.saveGraph` and emit only `graph:saved`) —
14921
+ * recomputation happens on next access, not eagerly per event.
14922
+ *
14923
+ * Cost guard: when the graph exceeds `maxPageRankEntities` (default 50 000),
14924
+ * PageRank is skipped and the normalized signal falls back to degree
14925
+ * centrality, which is a single O(V + E) pass.
14926
+ *
14927
+ * @module search/GraphRankPrior
14928
+ * @experimental
14929
+ */
14930
+
14931
+ /**
14932
+ * Options for {@link GraphRankPrior}.
14933
+ */
14934
+ interface GraphRankPriorOptions {
14935
+ /**
14936
+ * Entity-count threshold above which the PageRank computation is skipped
14937
+ * and the normalized connectivity signal falls back to degree centrality.
14938
+ * Default: 50 000.
14939
+ */
14940
+ maxPageRankEntities?: number;
14941
+ /** PageRank damping factor (default: 0.85). */
14942
+ dampingFactor?: number;
14943
+ /**
14944
+ * Event emitter to subscribe to for cache invalidation. When provided,
14945
+ * entity:created/updated/deleted, relation:created/deleted, and
14946
+ * graph:saved events mark the cached scores stale (lazy recompute on
14947
+ * next access). graph:saved matters because manager-level batch
14948
+ * mutations (create/delete entities and relations) persist via a full
14949
+ * `saveGraph` and emit no per-item events.
14950
+ */
14951
+ events?: GraphEventEmitter;
14952
+ }
14953
+ /** Default entity-count threshold for skipping PageRank. */
14954
+ declare const DEFAULT_MAX_PAGERANK_ENTITIES = 50000;
14955
+ /**
14956
+ * Provides cached graph-connectivity ranking signals (PageRank + degree).
14957
+ *
14958
+ * @example
14959
+ * ```typescript
14960
+ * const prior = new GraphRankPrior(ctx.graphTraversal, { events: storage.events });
14961
+ * const scores = await prior.getScores(['Alice', 'Bob']); // normalized [0, 1]
14962
+ * prior.dispose(); // unsubscribe from events when done
14963
+ * ```
14964
+ */
14965
+ declare class GraphRankPrior {
14966
+ private readonly traversal;
14967
+ private readonly maxPageRankEntities;
14968
+ private readonly dampingFactor;
14969
+ /** Cached scores, or null when stale/uncomputed. */
14970
+ private cache;
14971
+ /** In-flight computation, deduplicating concurrent accesses. */
14972
+ private pending;
14973
+ private unsubscribers;
14974
+ /**
14975
+ * Create a new GraphRankPrior.
14976
+ *
14977
+ * @param source - A GraphTraversal instance (preferred — reuses its
14978
+ * PageRank/degree implementations) or a GraphStorage, which is wrapped
14979
+ * in a private GraphTraversal.
14980
+ * @param options - Threshold, damping, and event-subscription options
14981
+ */
14982
+ constructor(source: GraphTraversal | GraphStorage, options?: GraphRankPriorOptions);
14983
+ /**
14984
+ * Get the raw PageRank score for an entity.
14985
+ *
14986
+ * Returns 0 for unknown entities, and 0 for all entities when the graph
14987
+ * exceeded `maxPageRankEntities` (degree-only fallback — use
14988
+ * {@link getScores} for the fallback-aware normalized signal).
14989
+ */
14990
+ getPageRank(entityName: string): Promise<number>;
14991
+ /**
14992
+ * Get the raw degree (incident relation count, both directions) for an
14993
+ * entity. Returns 0 for unknown entities.
14994
+ */
14995
+ getDegree(entityName: string): Promise<number>;
14996
+ /**
14997
+ * Get min-max-normalized connectivity scores (in [0, 1], normalized over
14998
+ * the whole graph) for the given entity names. Uses PageRank when the
14999
+ * graph is within `maxPageRankEntities`, degree centrality otherwise.
15000
+ * Unknown entities map to 0.
15001
+ */
15002
+ getScores(names: string[]): Promise<Map<string, number>>;
15003
+ /**
15004
+ * Get the unique one-hop neighbor names of an entity (both directions).
15005
+ * Reads the live relation index — not part of the cached computation.
15006
+ */
15007
+ neighbors(entityName: string): string[];
15008
+ /**
15009
+ * Whether the last computed signal used the degree-only fallback
15010
+ * (graph exceeded `maxPageRankEntities`). Undefined before first compute.
15011
+ */
15012
+ isDegreeFallback(): boolean | undefined;
15013
+ /**
15014
+ * Mark the cached scores stale. The next access recomputes lazily.
15015
+ */
15016
+ invalidate(): void;
15017
+ /**
15018
+ * Unsubscribe from all graph events and drop cached scores. The instance
15019
+ * remains usable (scores recompute on demand) but no longer auto-invalidates.
15020
+ */
15021
+ dispose(): void;
15022
+ /**
15023
+ * Return the cached scores, computing them if stale. Concurrent callers
15024
+ * share a single in-flight computation.
15025
+ * @internal
15026
+ */
15027
+ private ensureComputed;
15028
+ /**
15029
+ * Run the full-graph connectivity computation.
15030
+ * @internal
15031
+ */
15032
+ private compute;
15033
+ /**
15034
+ * Min-max normalize scores to [0, 1]. All-equal non-zero scores map to 1;
15035
+ * all-zero scores stay 0 (mirrors HybridScorer.minMaxNormalize semantics).
15036
+ * @internal
15037
+ */
15038
+ private minMaxNormalize;
15039
+ }
15040
+
14358
15041
  /**
14359
15042
  * Ranked Search
14360
15043
  *
@@ -14369,6 +15052,12 @@ declare class BasicSearch {
14369
15052
  declare class RankedSearch {
14370
15053
  private storage;
14371
15054
  private indexManager;
15055
+ /**
15056
+ * Optional graph-connectivity prior. When set with a positive boost, final
15057
+ * scores are multiplied by `(1 + boost * normalizedPageRank)`. Default off.
15058
+ */
15059
+ private graphPrior;
15060
+ private graphBoost;
14372
15061
  /**
14373
15062
  * Phase 4 Sprint 2: Fallback token cache for entities.
14374
15063
  * Maps entity name -> pre-tokenized entity data.
@@ -14378,6 +15067,18 @@ declare class RankedSearch {
14378
15067
  private cachedEntityCount;
14379
15068
  private cachedEntityNames;
14380
15069
  constructor(storage: GraphStorage, storageDir?: string);
15070
+ /**
15071
+ * Attach (or detach) a graph-connectivity prior for score boosting.
15072
+ *
15073
+ * When both a prior and a positive boost are set, `searchNodesRanked`
15074
+ * multiplies each result's score by `(1 + boost * normalizedPageRank)`
15075
+ * and re-sorts. A boost of 0 (the default) disables the behavior entirely.
15076
+ *
15077
+ * @param prior - GraphRankPrior instance, or null to detach
15078
+ * @param boost - Multiplicative boost factor (default 0 = off)
15079
+ * @experimental
15080
+ */
15081
+ setGraphPrior(prior: GraphRankPrior | null, boost?: number): void;
14381
15082
  /**
14382
15083
  * Phase 4 Sprint 2: Clear the fallback token cache.
14383
15084
  * Called when graph changes are detected or explicitly by external code.
@@ -14418,6 +15119,11 @@ declare class RankedSearch {
14418
15119
  * @returns Array of search results sorted by relevance
14419
15120
  */
14420
15121
  searchNodesRanked(query: string, tags?: string[], minImportance?: number, maxImportance?: number, limit?: number, projectId?: string): Promise<SearchResult[]>;
15122
+ /**
15123
+ * Multiply each result's score by `(1 + boost * normalizedPageRank)` and
15124
+ * re-sort. No-op when no prior/boost is configured (the default).
15125
+ */
15126
+ private applyGraphBoost;
14421
15127
  /**
14422
15128
  * Search using pre-calculated TF-IDF index (fast path).
14423
15129
  */
@@ -15443,31 +16149,184 @@ declare class SearchManager {
15443
16149
  /** Get cost estimates for all search methods. */
15444
16150
  getSearchCostEstimates(query: string): Promise<QueryCostEstimate[]>;
15445
16151
  /**
15446
- * Phase 10 Sprint 4: Get the query cost estimator instance.
15447
- *
15448
- * @returns The QueryCostEstimator instance
16152
+ * Phase 10 Sprint 4: Get the query cost estimator instance.
16153
+ *
16154
+ * @returns The QueryCostEstimator instance
16155
+ */
16156
+ getQueryEstimator(): QueryCostEstimator;
16157
+ /**
16158
+ * Feature 3 (Must-Have): Search entities by a natural language time expression.
16159
+ *
16160
+ * Parses the query using chrono-node and returns entities whose
16161
+ * `createdAt` or `lastModified` timestamp falls within the resolved range.
16162
+ *
16163
+ * Returns an empty array if the expression cannot be parsed.
16164
+ *
16165
+ * @param query - Natural language temporal expression, e.g. "last hour", "since yesterday"
16166
+ * @param options - Optional field and undated-entity configuration
16167
+ * @returns Entities matching the time range, sorted oldest-first
16168
+ *
16169
+ * @example
16170
+ * ```typescript
16171
+ * const recentEntities = await manager.searchByTime('last 10 minutes');
16172
+ * const todayEntities = await manager.searchByTime('today');
16173
+ * const rangedEntities = await manager.searchByTime('between Monday and Wednesday');
16174
+ * ```
16175
+ */
16176
+ searchByTime(query: string, options?: TemporalSearchOptions): Promise<Entity[]>;
16177
+ }
16178
+
16179
+ /**
16180
+ * Symbolic Search Layer - metadata-based filtering using structured predicates.
16181
+ * @module search/SymbolicSearch
16182
+ */
16183
+
16184
+ /**
16185
+ * Result from symbolic search with match score.
16186
+ */
16187
+ interface SymbolicResult {
16188
+ entity: Entity;
16189
+ score: number;
16190
+ matchedFilters: string[];
16191
+ }
16192
+ /** Filters entities using structured metadata predicates (tags, types, dates, importance, hierarchy). */
16193
+ declare class SymbolicSearch {
16194
+ /** Filter entities using AND-combined metadata predicates. */
16195
+ search(entities: readonly Entity[], filters: SymbolicFilters): SymbolicResult[];
16196
+ /** @internal Evaluate all filters against an entity. */
16197
+ private evaluateFilters;
16198
+ /** Get entities matching a specific tag. */
16199
+ byTag(entities: readonly Entity[], tag: string): Entity[];
16200
+ /** Get entities of a specific type. */
16201
+ byType(entities: readonly Entity[], entityType: string): Entity[];
16202
+ /** Get entities within importance range. */
16203
+ byImportance(entities: readonly Entity[], min: number, max: number): Entity[];
16204
+ }
16205
+
16206
+ /**
16207
+ * Hybrid Search Manager - orchestrates semantic, lexical, symbolic, and
16208
+ * (optionally) graph-connectivity search layers.
16209
+ * @module search/HybridSearchManager
16210
+ */
16211
+
16212
+ declare const DEFAULT_HYBRID_WEIGHTS: {
16213
+ semantic: number;
16214
+ lexical: number;
16215
+ symbolic: number;
16216
+ };
16217
+ /** Default number of top results whose neighbors are expanded. */
16218
+ declare const DEFAULT_NEIGHBOR_TOP_K = 10;
16219
+ /** Default damping applied to a neighbor's inherited combined score. */
16220
+ declare const DEFAULT_NEIGHBOR_DAMPING = 0.3;
16221
+ /**
16222
+ * Matched-layer union including the graph-connectivity channel.
16223
+ *
16224
+ * @deprecated The canonical `HybridSearchResult['matchedLayers']` union
16225
+ * (src/types) now includes `'graph'`. Use
16226
+ * `HybridSearchResult['matchedLayers'][number]` instead. Kept as an alias
16227
+ * for back-compat (exported from the search barrel).
16228
+ */
16229
+ type HybridSearchLayer = HybridSearchResult['matchedLayers'][number];
16230
+ /**
16231
+ * HybridSearchResult variant whose scores may carry the normalized
16232
+ * graph-connectivity score. Now that the canonical `matchedLayers` union
16233
+ * includes `'graph'`, this type differs from HybridSearchResult only by
16234
+ * the optional `scores.graph` field, so every GraphHybridSearchResult is a
16235
+ * valid HybridSearchResult (and vice versa when the graph layer did not
16236
+ * run). Results produced with the graph channel enabled conform to this
16237
+ * shape.
16238
+ */
16239
+ interface GraphHybridSearchResult extends HybridSearchResult {
16240
+ scores: HybridSearchResult['scores'] & {
16241
+ /** Normalized graph-connectivity score. Present when the graph layer ran. */
16242
+ graph?: number;
16243
+ };
16244
+ }
16245
+ /** One-hop neighbor expansion options (only a single hop is supported). */
16246
+ interface NeighborExpansionOptions {
16247
+ /** Number of hops to expand. Only 1 is supported. */
16248
+ hops: 1;
16249
+ /** Number of top-ranked results to expand from (default: 10). */
16250
+ topK?: number;
16251
+ /** Damping factor applied to the parent's combined score (default: 0.3). */
16252
+ damping?: number;
16253
+ }
16254
+ /** Additive graph-channel options for hybrid search. All default off. */
16255
+ interface GraphHybridOptions {
16256
+ /**
16257
+ * Weight for the graph-connectivity channel (normalized PageRank via
16258
+ * GraphRankPrior). Default 0 = channel disabled. Requires a GraphRankPrior
16259
+ * to have been passed to the constructor.
16260
+ */
16261
+ graphWeight?: number;
16262
+ /**
16263
+ * One-hop neighbor expansion: after scoring, neighbors of the top-K
16264
+ * results are appended with a damped combined score and re-sorted.
16265
+ * Requires a GraphRankPrior. Off unless provided.
16266
+ */
16267
+ expandNeighbors?: NeighborExpansionOptions;
16268
+ }
16269
+ /**
16270
+ * Combines semantic, lexical, symbolic, and (optionally) graph-connectivity
16271
+ * search layers with configurable weights.
16272
+ */
16273
+ declare class HybridSearchManager {
16274
+ private semanticSearch;
16275
+ private rankedSearch;
16276
+ private graphPrior;
16277
+ private defaults;
16278
+ private symbolicSearch;
16279
+ /**
16280
+ * @param semanticSearch - Semantic layer (null = layer disabled)
16281
+ * @param rankedSearch - Lexical layer (TF-IDF/BM25)
16282
+ * @param graphPrior - Optional graph-connectivity signal provider; when
16283
+ * absent, the graph channel and neighbor expansion are inert
16284
+ * @param defaults - Default per-search graph options (e.g. env-configured
16285
+ * graphWeight); per-call options override these
16286
+ */
16287
+ constructor(semanticSearch: SemanticSearch | null, rankedSearch: RankedSearch, graphPrior?: GraphRankPrior | null, defaults?: GraphHybridOptions);
16288
+ /**
16289
+ * Perform hybrid search combining all layers.
16290
+ *
16291
+ * When the graph channel or expandNeighbors is enabled, matchedLayers may
16292
+ * include 'graph' and results additionally conform to
16293
+ * GraphHybridSearchResult (`scores.graph` carries the normalized
16294
+ * graph-connectivity score).
16295
+ */
16296
+ search(graph: ReadonlyKnowledgeGraph, query: string, options?: Partial<HybridSearchOptions> & GraphHybridOptions): Promise<HybridSearchResult[]>;
16297
+ /**
16298
+ * Execute semantic search layer.
16299
+ */
16300
+ private executeSemanticSearch;
16301
+ /**
16302
+ * Execute lexical search layer (TF-IDF/BM25).
16303
+ */
16304
+ private executeLexicalSearch;
16305
+ /**
16306
+ * Execute symbolic search layer.
16307
+ */
16308
+ private executeSymbolicSearch;
16309
+ /**
16310
+ * Merge results from all layers.
15449
16311
  */
15450
- getQueryEstimator(): QueryCostEstimator;
16312
+ private mergeResults;
15451
16313
  /**
15452
- * Feature 3 (Must-Have): Search entities by a natural language time expression.
15453
- *
15454
- * Parses the query using chrono-node and returns entities whose
15455
- * `createdAt` or `lastModified` timestamp falls within the resolved range.
15456
- *
15457
- * Returns an empty array if the expression cannot be parsed.
15458
- *
15459
- * @param query - Natural language temporal expression, e.g. "last hour", "since yesterday"
15460
- * @param options - Optional field and undated-entity configuration
15461
- * @returns Entities matching the time range, sorted oldest-first
16314
+ * One-hop neighbor expansion: append unseen neighbors of the top-K results
16315
+ * with a damped combined score (`damping * parent.combined`), tagged with
16316
+ * matchedLayers ['graph'], then re-sort and re-apply the limit.
15462
16317
  *
15463
- * @example
15464
- * ```typescript
15465
- * const recentEntities = await manager.searchByTime('last 10 minutes');
15466
- * const todayEntities = await manager.searchByTime('today');
15467
- * const rangedEntities = await manager.searchByTime('between Monday and Wednesday');
15468
- * ```
16318
+ * Neighbors already present in the result set are never duplicated.
15469
16319
  */
15470
- searchByTime(query: string, options?: TemporalSearchOptions): Promise<Entity[]>;
16320
+ private expandOneHop;
16321
+ /**
16322
+ * Search with full entity resolution.
16323
+ * Alias for search() since we now always resolve entities.
16324
+ */
16325
+ searchWithEntities(graph: ReadonlyKnowledgeGraph, query: string, options?: Partial<HybridSearchOptions> & GraphHybridOptions): Promise<HybridSearchResult[]>;
16326
+ /**
16327
+ * Get the symbolic search instance for direct access.
16328
+ */
16329
+ getSymbolicSearch(): SymbolicSearch;
15471
16330
  }
15472
16331
 
15473
16332
  /**
@@ -16748,78 +17607,6 @@ declare class TFIDFEventSync {
16748
17607
  private handleEntityDeleted;
16749
17608
  }
16750
17609
 
16751
- /**
16752
- * Symbolic Search Layer - metadata-based filtering using structured predicates.
16753
- * @module search/SymbolicSearch
16754
- */
16755
-
16756
- /**
16757
- * Result from symbolic search with match score.
16758
- */
16759
- interface SymbolicResult {
16760
- entity: Entity;
16761
- score: number;
16762
- matchedFilters: string[];
16763
- }
16764
- /** Filters entities using structured metadata predicates (tags, types, dates, importance, hierarchy). */
16765
- declare class SymbolicSearch {
16766
- /** Filter entities using AND-combined metadata predicates. */
16767
- search(entities: readonly Entity[], filters: SymbolicFilters): SymbolicResult[];
16768
- /** @internal Evaluate all filters against an entity. */
16769
- private evaluateFilters;
16770
- /** Get entities matching a specific tag. */
16771
- byTag(entities: readonly Entity[], tag: string): Entity[];
16772
- /** Get entities of a specific type. */
16773
- byType(entities: readonly Entity[], entityType: string): Entity[];
16774
- /** Get entities within importance range. */
16775
- byImportance(entities: readonly Entity[], min: number, max: number): Entity[];
16776
- }
16777
-
16778
- /**
16779
- * Hybrid Search Manager - orchestrates semantic, lexical, and symbolic search.
16780
- * @module search/HybridSearchManager
16781
- */
16782
-
16783
- declare const DEFAULT_HYBRID_WEIGHTS: {
16784
- semantic: number;
16785
- lexical: number;
16786
- symbolic: number;
16787
- };
16788
- /** Combines semantic, lexical, and symbolic search layers with configurable weights. */
16789
- declare class HybridSearchManager {
16790
- private semanticSearch;
16791
- private rankedSearch;
16792
- private symbolicSearch;
16793
- constructor(semanticSearch: SemanticSearch | null, rankedSearch: RankedSearch);
16794
- /** Perform hybrid search combining all three layers. */
16795
- search(graph: ReadonlyKnowledgeGraph, query: string, options?: Partial<HybridSearchOptions>): Promise<HybridSearchResult[]>;
16796
- /**
16797
- * Execute semantic search layer.
16798
- */
16799
- private executeSemanticSearch;
16800
- /**
16801
- * Execute lexical search layer (TF-IDF/BM25).
16802
- */
16803
- private executeLexicalSearch;
16804
- /**
16805
- * Execute symbolic search layer.
16806
- */
16807
- private executeSymbolicSearch;
16808
- /**
16809
- * Merge results from all three layers.
16810
- */
16811
- private mergeResults;
16812
- /**
16813
- * Search with full entity resolution.
16814
- * Alias for search() since we now always resolve entities.
16815
- */
16816
- searchWithEntities(graph: ReadonlyKnowledgeGraph, query: string, options?: Partial<HybridSearchOptions>): Promise<HybridSearchResult[]>;
16817
- /**
16818
- * Get the symbolic search instance for direct access.
16819
- */
16820
- getSymbolicSearch(): SymbolicSearch;
16821
- }
16822
-
16823
17610
  /**
16824
17611
  * Query Analyzer
16825
17612
  *
@@ -17422,6 +18209,11 @@ interface SymbolicSearchResult {
17422
18209
  score: number;
17423
18210
  entity?: Entity;
17424
18211
  }
18212
+ /**
18213
+ * Result from the graph-connectivity layer (e.g. normalized PageRank from
18214
+ * GraphRankPrior). Same shape as the symbolic layer results.
18215
+ */
18216
+ type GraphLayerResult = SymbolicSearchResult;
17425
18217
  interface ScoredResult {
17426
18218
  entityName: string;
17427
18219
  entity: Entity;
@@ -17429,19 +18221,23 @@ interface ScoredResult {
17429
18221
  semantic: number;
17430
18222
  lexical: number;
17431
18223
  symbolic: number;
18224
+ graph: number;
17432
18225
  combined: number;
17433
18226
  };
17434
- matchedLayers: ('semantic' | 'lexical' | 'symbolic')[];
18227
+ matchedLayers: ('semantic' | 'lexical' | 'symbolic' | 'graph')[];
17435
18228
  rawScores: {
17436
18229
  semantic?: number;
17437
18230
  lexical?: number;
17438
18231
  symbolic?: number;
18232
+ graph?: number;
17439
18233
  };
17440
18234
  }
17441
18235
  interface HybridWeights {
17442
18236
  semantic: number;
17443
18237
  lexical: number;
17444
18238
  symbolic: number;
18239
+ /** Graph-connectivity channel weight. Default 0 = disabled (legacy behavior). */
18240
+ graph: number;
17445
18241
  }
17446
18242
  declare const DEFAULT_SCORER_WEIGHTS: HybridWeights;
17447
18243
  interface HybridScorerOptions {
@@ -17461,14 +18257,23 @@ declare class HybridScorer {
17461
18257
  setWeights(weights: Partial<HybridWeights>): void;
17462
18258
  /** Min-max normalize scores to 0-1 range. */
17463
18259
  minMaxNormalize(scores: Map<string, number>): Map<string, number>;
17464
- /** Combine results from all three search layers. */
17465
- combine(semanticResults: SemanticLayerResult[], lexicalResults: LexicalSearchResult[], symbolicResults: SymbolicSearchResult[], entityMap: Map<string, Entity>): ScoredResult[];
18260
+ /**
18261
+ * Combine results from all search layers.
18262
+ *
18263
+ * @param semanticResults - Semantic similarity layer results
18264
+ * @param lexicalResults - Lexical (TF-IDF/BM25) layer results
18265
+ * @param symbolicResults - Symbolic/metadata layer results
18266
+ * @param entityMap - Entity lookup map by name
18267
+ * @param graphResults - Optional graph-connectivity layer results
18268
+ * (default: empty — legacy three-layer behavior)
18269
+ */
18270
+ combine(semanticResults: SemanticLayerResult[], lexicalResults: LexicalSearchResult[], symbolicResults: SymbolicSearchResult[], entityMap: Map<string, Entity>, graphResults?: GraphLayerResult[]): ScoredResult[];
17466
18271
  /** Get weights normalized to sum to 1, redistributing for missing layers. */
17467
- getNormalizedWeights(hasSemantic: boolean, hasLexical: boolean, hasSymbolic: boolean): HybridWeights;
18272
+ getNormalizedWeights(hasSemantic: boolean, hasLexical: boolean, hasSymbolic: boolean, hasGraph?: boolean): HybridWeights;
17468
18273
  /** Combine scores from maps directly (alternative interface). */
17469
- combineFromMaps(semanticScores: Map<string, number>, lexicalScores: Map<string, number>, symbolicScores: Map<string, number>, entityMap: Map<string, Entity>): ScoredResult[];
18274
+ combineFromMaps(semanticScores: Map<string, number>, lexicalScores: Map<string, number>, symbolicScores: Map<string, number>, entityMap: Map<string, Entity>, graphScores?: Map<string, number>): ScoredResult[];
17470
18275
  /** Calculate combined score for a single entity. */
17471
- calculateScore(semanticScore: number, lexicalScore: number, symbolicScore: number): number;
18276
+ calculateScore(semanticScore: number, lexicalScore: number, symbolicScore: number, graphScore?: number): number;
17472
18277
  }
17473
18278
 
17474
18279
  /**
@@ -20456,6 +21261,16 @@ declare class PatternDetector {
20456
21261
  * @module agent/RuleEvaluator
20457
21262
  */
20458
21263
 
21264
+ /**
21265
+ * Simple rule interface for demonstration.
21266
+ */
21267
+ interface Rule$1 {
21268
+ condition: {
21269
+ type: string;
21270
+ field: string;
21271
+ value: unknown;
21272
+ };
21273
+ }
20459
21274
  /**
20460
21275
  * Evaluates rule conditions against entities.
20461
21276
  *
@@ -20495,6 +21310,14 @@ declare class RuleEvaluator {
20495
21310
  * Get cache size for monitoring.
20496
21311
  */
20497
21312
  getCacheSize(): number;
21313
+ /**
21314
+ * Evaluates a simple rule against a set of facts.
21315
+ *
21316
+ * @param rule - Rule to evaluate
21317
+ * @param facts - Facts to check against
21318
+ * @returns True if the rule evaluates to true
21319
+ */
21320
+ evaluateRule(rule: Rule$1, facts: Record<string, unknown>): boolean;
20498
21321
  }
20499
21322
 
20500
21323
  /**
@@ -22785,9 +23608,37 @@ declare class MultiAgentMemoryManager extends EventEmitter {
22785
23608
  * Session Checkpoint Manager
22786
23609
  *
22787
23610
  * Provides session checkpointing, crash recovery, and sleep/wake
22788
- * functionality for agent memory sessions. Checkpoints capture
22789
- * working memory state and decay snapshots, stored as observations
22790
- * on the session entity.
23611
+ * functionality for agent memory sessions. Checkpoints are persisted as
23612
+ * real graph structure instead of JSON blobs, so checkpoint content is
23613
+ * queryable and traversable:
23614
+ *
23615
+ * - Each checkpoint is its own `entityType: 'session-checkpoint'` entity
23616
+ * (name = checkpoint id `checkpoint_{sessionId}_{timestamp}`), with
23617
+ * `parentId` set to the session entity for hierarchy integration.
23618
+ * - Scalar fields are human-readable observation lines:
23619
+ * `[session-id]: <id>`, `[label]: <name>` (when present), and
23620
+ * `[created-at]: <ISO timestamp>`.
23621
+ * - The working-memory snapshot is one line per memory:
23622
+ * `[working-memory]: <JSON-name>` for membership (order-preserving) and
23623
+ * `[decay]: <JSON-name>=<importance>` for the importance snapshot —
23624
+ * names are JSON-encoded so arbitrary strings (equals signs, newlines,
23625
+ * unicode) roundtrip.
23626
+ * - Arbitrary metadata roundtrips via `[meta]: <JSON-key>=<JSON-value>`
23627
+ * lines (key and value JSON-encoded separately).
23628
+ * - Relations wire it together: session —`has_checkpoint`→ checkpoint,
23629
+ * and checkpoint —`snapshots`→ each working-memory entity that still
23630
+ * exists at write time. Observation lines remain the source of truth
23631
+ * for the snapshot content (so a checkpoint survives working-memory
23632
+ * deletion, whose cascade drops the `snapshots` relation).
23633
+ *
23634
+ * Ordering: `listCheckpoints` sorts by the `[created-at]` scalar (newest
23635
+ * first, ties broken by the numeric id suffix) — the module only ever
23636
+ * needs "latest checkpoint", so no `precedes` chain is maintained.
23637
+ *
23638
+ * Legacy `[CHECKPOINT] {json}` observations on session entities remain
23639
+ * decodable via `decodeLegacyCheckpoint` and are auto-migrated to the
23640
+ * decomposed shape on read; use `migrateLegacySessionCheckpoints` for
23641
+ * bulk migration.
22791
23642
  *
22792
23643
  * @module agent/SessionCheckpoint
22793
23644
  */
@@ -22814,16 +23665,26 @@ interface SessionCheckpointData {
22814
23665
  metadata: Record<string, unknown>;
22815
23666
  };
22816
23667
  }
23668
+ /** Entity type for decomposed checkpoint entities. */
23669
+ declare const SESSION_CHECKPOINT_ENTITY_TYPE = "session-checkpoint";
23670
+ /** Relation type: session —has_checkpoint→ checkpoint entity. */
23671
+ declare const HAS_CHECKPOINT_RELATION = "has_checkpoint";
23672
+ /** Relation type: checkpoint —snapshots→ working-memory entity. */
23673
+ declare const SNAPSHOTS_RELATION = "snapshots";
22817
23674
  /**
22818
23675
  * Manages session checkpoints for crash recovery and sleep/wake.
22819
23676
  *
22820
- * Stores checkpoint data as JSON-serialized observations on the
22821
- * session entity, prefixed with `[CHECKPOINT]`. This avoids
22822
- * requiring a separate storage mechanism.
23677
+ * Persists each checkpoint as a dedicated `session-checkpoint` entity
23678
+ * linked to its session via a `has_checkpoint` relation (see the module
23679
+ * doc for the full decomposed schema). Legacy JSON-blob checkpoints
23680
+ * stored as `[CHECKPOINT]` observations on session entities are
23681
+ * auto-migrated on read.
22823
23682
  *
22824
23683
  * @example
22825
23684
  * ```typescript
22826
- * const mgr = new SessionCheckpointManager(storage, workingMemory, decayEngine);
23685
+ * const mgr = new SessionCheckpointManager(
23686
+ * storage, workingMemory, decayEngine, entityManager, relationManager
23687
+ * );
22827
23688
  *
22828
23689
  * // Create a checkpoint
22829
23690
  * const cp = await mgr.checkpoint('session_123', 'before-experiment');
@@ -22842,13 +23703,15 @@ declare class SessionCheckpointManager {
22842
23703
  private readonly storage;
22843
23704
  private readonly workingMemoryManager;
22844
23705
  private readonly decayEngine;
22845
- constructor(storage: IGraphStorage, workingMemoryManager: WorkingMemoryManager, decayEngine: DecayEngine);
23706
+ private readonly entityManager;
23707
+ private readonly relationManager;
23708
+ constructor(storage: IGraphStorage, workingMemoryManager: WorkingMemoryManager, decayEngine: DecayEngine, entityManager: EntityManager, relationManager: RelationManager);
22846
23709
  /**
22847
23710
  * Create a checkpoint for a session.
22848
23711
  *
22849
23712
  * Captures the current working memory entity names and their
22850
- * importance values, storing the data as a JSON-serialized
22851
- * observation on the session entity.
23713
+ * importance values, persisting them as a dedicated
23714
+ * `session-checkpoint` entity plus linking relations.
22852
23715
  *
22853
23716
  * @param sessionId - Session to checkpoint
22854
23717
  * @param name - Optional user-provided label
@@ -22871,8 +23734,10 @@ declare class SessionCheckpointManager {
22871
23734
  /**
22872
23735
  * List all checkpoints for a session.
22873
23736
  *
22874
- * Parses checkpoint observations from the session entity and
22875
- * returns them sorted by timestamp (newest first).
23737
+ * Collects `session-checkpoint` entities linked to the session via
23738
+ * `has_checkpoint` relations and returns them sorted by creation time
23739
+ * (newest first). Legacy `[CHECKPOINT]` blob observations found on the
23740
+ * session entity are auto-migrated to the decomposed shape first.
22876
23741
  *
22877
23742
  * @param sessionId - Session to list checkpoints for
22878
23743
  * @returns Array of checkpoint data, newest first
@@ -22919,24 +23784,71 @@ declare class SessionCheckpointManager {
22919
23784
  */
22920
23785
  private getSessionEntity;
22921
23786
  /**
22922
- * Parse checkpoint observations from a session entity.
22923
- * Returns checkpoints sorted newest first.
23787
+ * Collect decomposed checkpoint entities for a session via its
23788
+ * `has_checkpoint` relations. Returns checkpoints sorted newest first.
23789
+ * @internal
23790
+ */
23791
+ private collectCheckpoints;
23792
+ /**
23793
+ * Auto-migrate any legacy `[CHECKPOINT]` blob observations on the given
23794
+ * session entity to the decomposed shape, stripping the migrated blobs
23795
+ * from the session's observations. Malformed blobs are left in place
23796
+ * (they were already skipped by the legacy parser). Returns the
23797
+ * migrated checkpoints (empty when nothing was migrated).
22924
23798
  * @internal
22925
23799
  */
22926
- private parseCheckpoints;
23800
+ private migrateSessionLegacyCheckpoints;
22927
23801
  /**
22928
- * Find a checkpoint by ID across all sessions.
23802
+ * Find a checkpoint by ID. Checkpoint IDs double as entity names, so
23803
+ * the decomposed lookup is O(1); when the entity is missing, sessions
23804
+ * still carrying legacy blobs are migrated and re-checked.
22929
23805
  * @internal
22930
23806
  */
22931
23807
  private findCheckpointById;
22932
23808
  }
23809
+ /**
23810
+ * Scan every session entity and migrate any legacy `[CHECKPOINT] {json}`
23811
+ * blob observations to the decomposed graph shape (checkpoint entities +
23812
+ * `has_checkpoint` / `snapshots` relations), mirroring
23813
+ * `migrateLegacyProcedures`.
23814
+ *
23815
+ * @returns Number of checkpoints migrated.
23816
+ */
23817
+ declare function migrateLegacySessionCheckpoints(entityManager: EntityManager, relationManager: RelationManager): Promise<number>;
23818
+ /**
23819
+ * Pure decoder for a single legacy `[CHECKPOINT] {json}` observation
23820
+ * line. Returns null when the line is not a well-formed legacy blob.
23821
+ *
23822
+ * @deprecated Legacy decoder — kept for reading pre-decomposition
23823
+ * observations. `SessionCheckpointManager` auto-migrates such blobs on
23824
+ * read; new code should go through `SessionCheckpointManager`.
23825
+ */
23826
+ declare function decodeLegacyCheckpoint(observation: string): SessionCheckpointData | null;
22933
23827
 
22934
23828
  /**
22935
23829
  * Work Thread Manager
22936
23830
  *
22937
- * Manages work threads for coordinating tasks across agents.
22938
- * Threads are stored as entities with entityType 'work_thread',
22939
- * using relations for parent-child and blocking relationships.
23831
+ * Manages work threads for coordinating tasks across agents. Threads are
23832
+ * persisted as real graph structure instead of JSON blobs, so thread
23833
+ * content is queryable and traversable:
23834
+ *
23835
+ * - Each thread is an `entityType: 'work_thread'` entity (name =
23836
+ * `thread.id`). Its observations carry human-readable scalar lines
23837
+ * (`[title]: Ship feature X`, `[status]: active`, `[owner]: agent_1`,
23838
+ * `[priority]: 8`, `[created-at]: …`, `[updated-at]: …`) plus the
23839
+ * free-text description as a plain observation.
23840
+ * - Custom metadata encodes one `[meta]: <JSON-key>=<JSON-value>` line per
23841
+ * entry — key and value are JSON-encoded separately so arbitrary strings
23842
+ * (equals signs, newlines, unicode) roundtrip.
23843
+ * - Cross-thread references are real relations, not payload fields:
23844
+ * thread —`child_of`→ parent thread, and thread —`blocked_by`→ each
23845
+ * blocker thread. `load()` rehydrates `parentId` / `blockedBy` from
23846
+ * those relations.
23847
+ *
23848
+ * Legacy single-JSON-observation threads (the pre-decomposition shape)
23849
+ * remain decodable via `decodeLegacyWorkThread` and are auto-migrated to
23850
+ * the decomposed shape on `load()`; use `migrateLegacyWorkThreads` for
23851
+ * bulk migration.
22940
23852
  *
22941
23853
  * @module agent/WorkThreadManager
22942
23854
  */
@@ -23001,6 +23913,12 @@ interface CreateWorkThreadOptions {
23001
23913
  /** Custom metadata */
23002
23914
  metadata?: Record<string, unknown>;
23003
23915
  }
23916
+ /** Relation type for parent-child thread relationships */
23917
+ declare const CHILD_OF_RELATION = "child_of";
23918
+ /** Relation type for blocking relationships */
23919
+ declare const BLOCKED_BY_RELATION = "blocked_by";
23920
+ /** Entity type for work thread entities */
23921
+ declare const WORK_THREAD_ENTITY_TYPE = "work_thread";
23004
23922
  /**
23005
23923
  * Manages work thread lifecycle and coordination.
23006
23924
  *
@@ -23027,8 +23945,15 @@ declare class WorkThreadManager {
23027
23945
  * Load existing work threads from storage into memory.
23028
23946
  *
23029
23947
  * Scans the graph for entities with entityType 'work_thread' and
23030
- * rehydrates the in-memory Map from their serialized observations.
23031
- * Must be called after construction to restore state from a previous session.
23948
+ * rehydrates the in-memory Map from their scalar observation lines,
23949
+ * deriving `parentId` / `blockedBy` from `child_of` / `blocked_by`
23950
+ * relations. Must be called after construction to restore state from a
23951
+ * previous session.
23952
+ *
23953
+ * **Side effect (auto-migration):** threads still stored in the legacy
23954
+ * single-JSON-observation shape are decoded with the legacy decoder and
23955
+ * rewritten in place to the decomposed shape (scalar lines + relations)
23956
+ * before returning.
23032
23957
  *
23033
23958
  * @returns Number of threads loaded
23034
23959
  */
@@ -23132,14 +24057,30 @@ declare class WorkThreadManager {
23132
24057
  */
23133
24058
  private detectCycles;
23134
24059
  /**
23135
- * Persist a thread's state to storage by updating its entity observation.
24060
+ * Persist a thread's state to storage by rewriting its scalar
24061
+ * observation lines. Relations (`child_of` / `blocked_by`) are managed
24062
+ * by `create` / `block` / `unblock`, not here.
23136
24063
  */
23137
24064
  private persistThread;
23138
- /**
23139
- * Serialize a thread to a plain object for JSON storage.
23140
- */
23141
- private serializeThread;
23142
24065
  }
24066
+ /**
24067
+ * Scan every `entityType: 'work_thread'` entity and migrate any that
24068
+ * still use the legacy single-JSON-observation encoding to the
24069
+ * decomposed shape (scalar observation lines + `child_of` / `blocked_by`
24070
+ * relations). Mirrors `migrateLegacyProcedures`.
24071
+ *
24072
+ * @returns Number of threads migrated.
24073
+ */
24074
+ declare function migrateLegacyWorkThreads(storage: IGraphStorage): Promise<number>;
24075
+ /**
24076
+ * Pure decoder for the legacy single-JSON-observation thread shape
24077
+ * (`JSON.stringify({ title, status, … })` in `observations[0]`).
24078
+ *
24079
+ * @deprecated Legacy decoder — kept for reading pre-decomposition
24080
+ * entities. `WorkThreadManager.load()` auto-migrates such entities; new
24081
+ * code should go through `WorkThreadManager`.
24082
+ */
24083
+ declare function decodeLegacyWorkThread(id: string, observations: string[]): WorkThread | null;
23143
24084
 
23144
24085
  /**
23145
24086
  * Collaborative Memory Synthesis
@@ -23316,6 +24257,13 @@ declare class CollaborativeSynthesis {
23316
24257
  * Manages user profiles stored as Entity instances with entityType 'profile'.
23317
24258
  * Observations are tagged [static] or [dynamic] to classify facts.
23318
24259
  *
24260
+ * **Contract (graph-core):** the `[static]`/`[dynamic]` prefixes are the
24261
+ * accepted line-per-observation format — one human-readable fact per
24262
+ * observation, individually indexable and searchable. This is NOT the
24263
+ * JSON-blob antipattern that ProcedureStore/WorkThreadManager/
24264
+ * SessionCheckpoint were migrated away from (a whole structured record
24265
+ * serialized into a single opaque observation); no decomposition needed.
24266
+ *
23319
24267
  * @module agent/ProfileManager
23320
24268
  */
23321
24269
 
@@ -23650,6 +24598,7 @@ declare class AgentMemoryManager extends EventEmitter {
23650
24598
  private _profileManager?;
23651
24599
  private _entityManager?;
23652
24600
  private _observationManager?;
24601
+ private _relationManager?;
23653
24602
  private _workThreadManager?;
23654
24603
  private _checkpointManager?;
23655
24604
  constructor(storage: IGraphStorage, config?: AgentMemoryConfig);
@@ -23678,6 +24627,10 @@ declare class AgentMemoryManager extends EventEmitter {
23678
24627
  * Internal ObservationManager, created on demand from the underlying storage.
23679
24628
  */
23680
24629
  private get observationManager();
24630
+ /**
24631
+ * Internal RelationManager, created on demand from the underlying storage.
24632
+ */
24633
+ private get relationManager();
23681
24634
  /** Profile manager for persistent user/agent profile facts */
23682
24635
  get profileManager(): ProfileManager;
23683
24636
  /**
@@ -24823,7 +25776,10 @@ declare class ToolCallObserver {
24823
25776
  * First-class type definitions for stored, executable procedures —
24824
25777
  * skills / how-to sequences distinct from semantic facts and episodic
24825
25778
  * events. Procedures are persisted as `entityType: 'procedure'` entities
24826
- * with the step list encoded in `observations` as JSON.
25779
+ * whose steps are decomposed into `entityType: 'procedure-step'` child
25780
+ * entities linked via `has_step` / `precedes` / `has_fallback` relations
25781
+ * (see `agent/procedural/ProcedureStore`); step fields are stored as
25782
+ * one human-readable observation line each, not JSON blobs.
24827
25783
  *
24828
25784
  * @module types/procedure
24829
25785
  */
@@ -24973,7 +25929,7 @@ type InvocationResult = {
24973
25929
  declare class ProcedureManager {
24974
25930
  private readonly store;
24975
25931
  private readonly successRateAlpha;
24976
- constructor(entityManager: EntityManager, config?: ProcedureManagerConfig);
25932
+ constructor(entityManager: EntityManager, relationManager: RelationManager, config?: ProcedureManagerConfig);
24977
25933
  /**
24978
25934
  * Persist a new procedure. Auto-generates `id` (and falls back to it
24979
25935
  * for `name`) when caller omits them. Throws if the id collides — the
@@ -25967,6 +26923,417 @@ declare class ActiveRetrievalController {
25967
26923
  private estimateCoverage;
25968
26924
  }
25969
26925
 
26926
+ /**
26927
+ * Cue–Tag–Content (CTC) associative memory graph.
26928
+ *
26929
+ * Implements the heterogeneous memory graph `M = (C, V, R)` of MRAgent
26930
+ * ("Memory is Reconstructed, Not Retrieved", §3.1). Cues and contents are nodes;
26931
+ * associations are typed `(cue, tag, content)` triples where the **tag** mediates
26932
+ * retrieval. The class exposes the paper's induced mapping operators (Eq. 5/8/9)
26933
+ * that the active reconstruction loop composes into traversal actions.
26934
+ *
26935
+ * @module agent/reconstruction/CueTagContentGraph
26936
+ * @experimental
26937
+ */
26938
+
26939
+ /** Normalise cue/tag surface text into a stable lookup id. */
26940
+ declare function normalizeKey(text: string): string;
26941
+ /**
26942
+ * In-memory associative memory graph with O(1) mapping operators.
26943
+ *
26944
+ * Indexes are maintained incrementally on `addTriple`, so traversal operators
26945
+ * never scan the full relation set.
26946
+ */
26947
+ declare class CueTagContentGraph {
26948
+ private readonly cues;
26949
+ private readonly tags;
26950
+ private readonly contents;
26951
+ private readonly tripleSet;
26952
+ /** φ_{c→g}: cue id → set of associated tag ids. */
26953
+ private readonly cueTags;
26954
+ /** φ_{(c,g)→v}: (cue,tag) key → set of content ids. */
26955
+ private readonly cueTagContents;
26956
+ /** φ_{v→(c,g)}: content id → list of (cue,tag) pairs (reverse traversal). */
26957
+ private readonly contentCueTags;
26958
+ /** φ_{τ→e}: topic content id → set of episode content ids. */
26959
+ private readonly topicEpisodes;
26960
+ /** Insert (or fetch) a cue node, returning its id. */
26961
+ addCue(text: string): string;
26962
+ /** Insert (or fetch) a tag node, returning its id. */
26963
+ addTag(text: string): string;
26964
+ /**
26965
+ * Insert (or replace) a content node. The caller supplies a stable id so that
26966
+ * episodic/semantic/topic nodes can be cross-referenced (timeline, topic links).
26967
+ */
26968
+ addContent(node: ContentNode): ContentNode;
26969
+ /** Connect a topic node to one of its constituent episodes (topic → episode). */
26970
+ linkTopicEpisode(topicId: string, episodeId: string): void;
26971
+ /**
26972
+ * Add a `(cue, tag, content)` association. Cue and tag are created on demand;
26973
+ * the content node must already exist (added via {@link addContent}).
26974
+ */
26975
+ addTriple(cueText: string, tagText: string, contentId: string): void;
26976
+ /**
26977
+ * φ_{c→g}(c) — activate candidate associative tags from a cue.
26978
+ * Accepts a cue surface form or id.
26979
+ */
26980
+ tagsForCue(cue: string): TagNode[];
26981
+ /**
26982
+ * φ_{(c,g)→v}(c, g) — retrieve content conditioned on a cue and a selected tag.
26983
+ * Optionally restrict to a single memory layer.
26984
+ */
26985
+ contentsForCueTag(cue: string, tag: string, layer?: ContentLayer): ContentNode[];
26986
+ /**
26987
+ * φ_{v→(c,g)}(v) — reverse traversal: surface the cues and tags associated with
26988
+ * a retrieved content node, enabling the agent to redirect its trajectory.
26989
+ */
26990
+ cueTagsForContent(contentId: string): Array<{
26991
+ cue: CueNode;
26992
+ tag: TagNode;
26993
+ }>;
26994
+ /** φ_{τ→e}(τ) — descend from a topic node to its constituent episodes. */
26995
+ episodesForTopic(topicId: string): ContentNode[];
26996
+ /** Fetch a content node by id. */
26997
+ getContent(id: string): ContentNode | undefined;
26998
+ /** Look up a cue node by surface form or id. */
26999
+ getCue(text: string): CueNode | undefined;
27000
+ /** All content nodes in a given layer (timeline order for episodic). */
27001
+ contentsByLayer(layer: ContentLayer): ContentNode[];
27002
+ /**
27003
+ * Match a free-form cue phrase against the stored cue set, returning ids of
27004
+ * cues whose surface form exactly equals or contains the (normalised) phrase.
27005
+ * Used to build the initial active set `Z(0)` from a query.
27006
+ */
27007
+ matchCues(phrase: string): CueNode[];
27008
+ /** Number of cues / tags / contents / triples currently stored. */
27009
+ stats(): {
27010
+ cues: number;
27011
+ tags: number;
27012
+ contents: number;
27013
+ triples: number;
27014
+ };
27015
+ /** Export a structural snapshot (e.g. to persist alongside JSONL storage). */
27016
+ toSnapshot(): CTCGraphSnapshot;
27017
+ /** Rebuild a graph from a snapshot produced by {@link toSnapshot}. */
27018
+ static fromSnapshot(snap: CTCGraphSnapshot): CueTagContentGraph;
27019
+ }
27020
+
27021
+ /**
27022
+ * Memory toolkit for controlled traversal of the Cue–Tag–Content graph.
27023
+ *
27024
+ * Implements the seven typed traversal operators of MRAgent (paper Table 4).
27025
+ * Each tool corresponds to a typed mapping between memory components, letting an
27026
+ * agent (LLM- or heuristic-driven) explicitly control the direction and
27027
+ * granularity of memory access rather than retrieving a fixed similarity set.
27028
+ *
27029
+ * @module agent/reconstruction/MemoryToolkit
27030
+ * @experimental
27031
+ */
27032
+
27033
+ /** Result of the keyword/context introspection tools. */
27034
+ interface EventKeywords {
27035
+ cues: string[];
27036
+ tags: string[];
27037
+ }
27038
+ /**
27039
+ * The MRAgent traversal toolkit. Stateless over the graph — each call is a pure
27040
+ * mapping operator invocation, which keeps memory access interpretable.
27041
+ */
27042
+ declare class MemoryToolkit {
27043
+ private readonly graph;
27044
+ constructor(graph: CueTagContentGraph);
27045
+ /**
27046
+ * `query_tag_events` — φ_{(c,g)→e}: retrieve episodic events associated with a
27047
+ * cue–tag pair. The workhorse for multi-hop questions (paper Table 6).
27048
+ */
27049
+ queryTagEvents(cue: string, tag: string): ContentNode[];
27050
+ /**
27051
+ * `query_conversation_time` — φ_{e→t}: return the conversation timestamp of an
27052
+ * episodic event. Primary operator for temporal questions.
27053
+ */
27054
+ queryConversationTime(eventId: string): string | undefined;
27055
+ /**
27056
+ * `query_event_keywords` — φ_{e→(c,g)}: extract the cues and tags associated
27057
+ * with an episodic event (reverse traversal to discover new retrieval paths).
27058
+ */
27059
+ queryEventKeywords(eventId: string): EventKeywords;
27060
+ /**
27061
+ * `query_event_context` — φ_{e→ctx}: retrieve the textual context surrounding
27062
+ * an episodic event (the event's own text plus its temporal neighbours on the
27063
+ * unified timeline).
27064
+ */
27065
+ queryEventContext(eventId: string, window?: number): string;
27066
+ /**
27067
+ * `query_personal_information` — φ_{cs→gs}: return the semantic aspects (tags)
27068
+ * associated with a person entity, e.g. `preference`, `occupation`.
27069
+ */
27070
+ queryPersonalInformation(person: string): TagNode[];
27071
+ /**
27072
+ * `query_personal_aspect` — φ_{(cs,gs)→vs}: retrieve the semantic content for a
27073
+ * `(person, aspect)` pair without scanning long episodic histories.
27074
+ */
27075
+ queryPersonalAspect(person: string, aspect: string): ContentNode[];
27076
+ /**
27077
+ * `query_topic_events` — φ_{τ→e}: retrieve episodic events associated with a
27078
+ * topic node, enabling efficient top-down localisation.
27079
+ */
27080
+ queryTopicEvents(topicId: string): ContentNode[];
27081
+ }
27082
+
27083
+ /**
27084
+ * Memory distillation pipeline — populates the Cue–Tag–Content graph from raw
27085
+ * dialogue (MRAgent §3.3 / Appendix B.1).
27086
+ *
27087
+ * The pipeline mirrors the paper's element-generation phase:
27088
+ * 1. **Rewrite** raw turns into self-contained sentences — pronoun resolution,
27089
+ * temporal normalisation (`YYYY-MM-DD`), and episodic segmentation.
27090
+ * 2. **Tag** each episode with a short associative phrase (`T_LLM`).
27091
+ * 3. **Cue** extraction — fine-grained entities/attributes (`K_LLM`).
27092
+ * 4. **Semantic** extraction — person-anchored stable facts (`S_LLM`).
27093
+ * 5. **Topic** abstraction — recurring patterns across episodes (`A_LLM`).
27094
+ *
27095
+ * When an {@link LLMProvider} is supplied the pipeline uses the paper's prompts
27096
+ * (Appendix E); otherwise it falls back to deterministic heuristics so the
27097
+ * feature works with zero configuration — matching the LLM-optional pattern used
27098
+ * elsewhere in the codebase (e.g. `LLMQueryPlanner`).
27099
+ *
27100
+ * @module agent/reconstruction/MemoryDistiller
27101
+ * @experimental
27102
+ */
27103
+
27104
+ declare class MemoryDistiller {
27105
+ private readonly llm?;
27106
+ private readonly keywords;
27107
+ constructor(llm?: LLMProvider | undefined);
27108
+ /** Run the full distillation pipeline over a dialogue. */
27109
+ distill(turns: DialogueTurn[]): Promise<DistillationResult$1>;
27110
+ /**
27111
+ * Build (or extend) a {@link CueTagContentGraph} from a distillation result.
27112
+ * Episodic, semantic and topic layers are populated in one pass.
27113
+ */
27114
+ buildGraph(result: DistillationResult$1, graph?: CueTagContentGraph): CueTagContentGraph;
27115
+ private distillWithLLM;
27116
+ private distillHeuristic;
27117
+ /** Cluster episodes by their most salient shared cue into topic nodes. */
27118
+ private deriveTopics;
27119
+ }
27120
+ /** Extract the first JSON object/array from a possibly noisy LLM completion. */
27121
+ declare function extractJson<T>(raw: string): T | undefined;
27122
+
27123
+ /**
27124
+ * Active memory reconstruction (MRAgent §4 / Algorithm 1).
27125
+ *
27126
+ * Rather than a one-shot "retrieve-then-reason" lookup, the reconstructor
27127
+ * formulates memory access as a stateful, multi-step process over the
27128
+ * Cue–Tag–Content graph. It maintains a reconstruction state `S(t) = (Z(t),
27129
+ * H(t))` — an active set of candidate elements `Z` and the accumulated
27130
+ * reconstructed context `H` — and iterates:
27131
+ *
27132
+ * 1. **Action selection** `f_select(x, H, Z)` — choose promising traversal
27133
+ * directions (forward cue→tag / (cue,tag)→content, reverse content→(cue,tag),
27134
+ * top-down topic→episode), reducing noise vs. exhaustive expansion.
27135
+ * 2. **Controlled traversal** — execute the selected actions to produce
27136
+ * candidates `Z̃(t+1)`.
27137
+ * 3. **Routing + state update** `f_route(x, H, Z̃)` — keep the candidates most
27138
+ * relevant to the query and prune the rest, then fold them into `H`.
27139
+ * 4. **Stopping** — terminate once accumulated evidence suffices.
27140
+ *
27141
+ * The default policy is a deterministic, embedding-free heuristic so the feature
27142
+ * works with zero configuration. When an {@link LLMProvider} is supplied the
27143
+ * final answer is synthesised by the LLM under the paper's QA prompt (Appendix E),
27144
+ * and routing is LLM-assisted; otherwise an extractive answer is returned.
27145
+ *
27146
+ * @module agent/reconstruction/MemoryReconstructor
27147
+ * @experimental
27148
+ */
27149
+
27150
+ declare class MemoryReconstructor {
27151
+ private readonly graph;
27152
+ private readonly llm?;
27153
+ /**
27154
+ * Optional semantic similarity in `[0, 1]` (e.g. `SemanticSearch`), used to
27155
+ * rank candidates during routing/answer when a live-store backing supplies
27156
+ * it. Falls back to lexical overlap when absent.
27157
+ */
27158
+ private readonly similarityFn?;
27159
+ private readonly toolkit;
27160
+ private readonly keywords;
27161
+ constructor(graph: CueTagContentGraph, llm?: LLMProvider | undefined,
27162
+ /**
27163
+ * Optional semantic similarity in `[0, 1]` (e.g. `SemanticSearch`), used to
27164
+ * rank candidates during routing/answer when a live-store backing supplies
27165
+ * it. Falls back to lexical overlap when absent.
27166
+ */
27167
+ similarityFn?: ((query: string, text: string) => Promise<number>) | undefined);
27168
+ /** Run active reconstruction for a query (Algorithm 1). */
27169
+ reconstruct(query: string, options?: ReconstructionOptions): Promise<ReconstructionResult>;
27170
+ private extractQueryCues;
27171
+ /**
27172
+ * Select promising traversal directions from the current active set. The
27173
+ * heuristic prefers to advance cues → tags → content, expands retrieved
27174
+ * content both reverse (new cues/tags) and top-down (topic → episode).
27175
+ */
27176
+ private selectActions;
27177
+ private traverse;
27178
+ /**
27179
+ * Rank candidate content by lexical relevance to the query, drop already-seen
27180
+ * nodes, and keep the top `budget`. This is the noise-pruning step that keeps
27181
+ * the reconstructed context focused.
27182
+ */
27183
+ private route;
27184
+ /**
27185
+ * Relevance of a candidate to the query. Uses semantic similarity when a
27186
+ * backing supplies it (embedding-based, captures paraphrase), otherwise falls
27187
+ * back to lexical keyword overlap.
27188
+ */
27189
+ private relevance;
27190
+ private shouldStop;
27191
+ private answer;
27192
+ }
27193
+
27194
+ /**
27195
+ * Bridge between the Cue–Tag–Content graph and MemoryJS's live memory modules.
27196
+ *
27197
+ * The paper organises memory into multi-granular layers (episodic / semantic /
27198
+ * topic) that mirror cognitive memory types (§3.2). MemoryJS already implements
27199
+ * those types, so the bridge persists each CTC content node into the
27200
+ * corresponding module so reconstructed memory is durable and visible to the
27201
+ * rest of the stack:
27202
+ *
27203
+ * - **Episodic** → first-class `memoryType: 'episodic'` entities stamped with
27204
+ * the conversation timestamp, so they land on the
27205
+ * {@link EpisodicMemoryManager} timeline and are temporally linked
27206
+ * (`precedes`/`follows`).
27207
+ * - **Semantic** → `memoryType: 'semantic'` fact entities anchored to their
27208
+ * person entity via a typed relation, and indexed for `SemanticSearch`.
27209
+ * - **Topic** → topic entities linked to their constituent episodes via a
27210
+ * `summarizes` relation (queryable through `GraphTraversal`).
27211
+ *
27212
+ * The bridge writes through narrow structural interfaces so it can be driven by
27213
+ * the real `ManagerContext` managers or by fakes in tests.
27214
+ *
27215
+ * @module agent/reconstruction/MemoryGraphBridge
27216
+ * @experimental
27217
+ */
27218
+
27219
+ /** Relation type connecting a topic entity to one of its episodes. */
27220
+ declare const TOPIC_SUMMARIZES = "summarizes";
27221
+ /**
27222
+ * The live-store dependencies the bridge writes through. Satisfied by the
27223
+ * `ManagerContext` managers (`entityManager`, `relationManager`,
27224
+ * `semanticSearch`) or by test doubles.
27225
+ */
27226
+ interface ReconstructiveBacking {
27227
+ /** Persist entities (existing names are skipped by `EntityManager`). */
27228
+ createEntities(entities: Entity[]): Promise<unknown>;
27229
+ /** Persist relations. */
27230
+ createRelations(relations: Relation[]): Promise<unknown>;
27231
+ /** Optional semantic similarity in `[0, 1]` for routing/answer ranking. */
27232
+ similarity?(a: string, b: string): Promise<number>;
27233
+ /** Optional: index a freshly-created entity for semantic search. */
27234
+ indexEntity?(entity: Entity): Promise<unknown>;
27235
+ /** Session id used to scope episodes onto the timeline. Default `mragent`. */
27236
+ sessionId?: string;
27237
+ }
27238
+ /** Summary of what a {@link MemoryGraphBridge.persist} call wrote. */
27239
+ interface BridgePersistResult {
27240
+ episodes: number;
27241
+ semanticFacts: number;
27242
+ topics: number;
27243
+ relations: number;
27244
+ }
27245
+ declare class MemoryGraphBridge {
27246
+ private readonly backing;
27247
+ private readonly sessionId;
27248
+ constructor(backing: ReconstructiveBacking);
27249
+ /** The session id episodes are written under (use with `getTimeline`). */
27250
+ get session(): string;
27251
+ /**
27252
+ * Persist a distillation result into the live store and annotate the in-memory
27253
+ * graph's content nodes with their backing entity names.
27254
+ */
27255
+ persist(result: DistillationResult$1, graph: CueTagContentGraph): Promise<BridgePersistResult>;
27256
+ }
27257
+
27258
+ /**
27259
+ * Reconstructive memory facade — the public entry point for the MRAgent-style
27260
+ * Cue–Tag–Content associative memory and active reconstruction.
27261
+ *
27262
+ * Wraps the construction pipeline ({@link MemoryDistiller}), the associative
27263
+ * graph ({@link CueTagContentGraph}), the traversal {@link MemoryToolkit}, and
27264
+ * the active {@link MemoryReconstructor} behind one cohesive API:
27265
+ *
27266
+ * ```typescript
27267
+ * const rm = new ReconstructiveMemory();
27268
+ * await rm.ingest([
27269
+ * { id: 'D1:1', speaker: 'Nate', text: "I won a video game tournament in July." },
27270
+ * { id: 'D1:2', speaker: 'Caroline', text: "I started a new painting class that month." },
27271
+ * ]);
27272
+ * const result = await rm.reconstruct("What did Caroline do in July?");
27273
+ * console.log(result.answer, result.evidence);
27274
+ * ```
27275
+ *
27276
+ * **Contract (graph-core):** the in-memory {@link CueTagContentGraph} is a
27277
+ * specialized associative *index*, not a second system-of-record. Durability
27278
+ * and graph queryability come from persisting through
27279
+ * {@link MemoryGraphBridge} into the Entity/Relation graph — which is the
27280
+ * default when constructed via `ctx.reconstructiveMemory()` (the context
27281
+ * wires its own `entityManager`/`relationManager`/`semanticSearch` as the
27282
+ * backing). Passing `backing: undefined` opts out and makes the instance
27283
+ * ephemeral; treat that as a testing/short-lived-process mode.
27284
+ *
27285
+ * @module agent/reconstruction/ReconstructiveMemory
27286
+ * @experimental
27287
+ */
27288
+
27289
+ /** Configuration for {@link ReconstructiveMemory}. */
27290
+ interface ReconstructiveMemoryConfig {
27291
+ /** Optional LLM provider for distillation + answer synthesis. */
27292
+ llmProvider?: LLMProvider;
27293
+ /** Pre-existing graph snapshot to restore from. */
27294
+ snapshot?: CTCGraphSnapshot;
27295
+ /**
27296
+ * Optional live-store backing. When supplied, ingested memory is persisted
27297
+ * into MemoryJS's episodic / semantic / topic modules (durable + searchable),
27298
+ * and semantic similarity is reused for reconstruction routing. When absent,
27299
+ * the facade runs the self-contained in-memory graph.
27300
+ */
27301
+ backing?: ReconstructiveBacking;
27302
+ }
27303
+ declare class ReconstructiveMemory {
27304
+ private graph;
27305
+ private readonly distiller;
27306
+ private readonly llm?;
27307
+ private readonly bridge?;
27308
+ private lastPersist?;
27309
+ constructor(config?: ReconstructiveMemoryConfig);
27310
+ private readonly backing?;
27311
+ /**
27312
+ * Construction phase: distil raw dialogue into Cue–Tag–Content structure and
27313
+ * merge it into the in-memory graph. When a live-store backing is configured,
27314
+ * the episodic / semantic / topic layers are also persisted into the
27315
+ * corresponding MemoryJS modules. Multiple `ingest` calls accumulate.
27316
+ */
27317
+ ingest(turns: DialogueTurn[]): Promise<DistillationResult$1>;
27318
+ /** Summary of what the most recent `ingest` persisted to the live store. */
27319
+ get lastPersistResult(): BridgePersistResult | undefined;
27320
+ /**
27321
+ * Reconstruction phase: answer a query via active, multi-step traversal of the
27322
+ * memory graph (Algorithm 1).
27323
+ */
27324
+ reconstruct(query: string, options?: ReconstructionOptions): Promise<ReconstructionResult>;
27325
+ /** Direct access to the traversal toolkit for manual graph exploration. */
27326
+ get toolkit(): MemoryToolkit;
27327
+ /** The underlying associative graph (read/inspect cues, tags, contents). */
27328
+ get memoryGraph(): CueTagContentGraph;
27329
+ /** Graph size statistics. */
27330
+ stats(): ReturnType<CueTagContentGraph['stats']>;
27331
+ /** Serialise the current graph (e.g. to persist alongside the knowledge base). */
27332
+ toSnapshot(): CTCGraphSnapshot;
27333
+ /** Replace the current graph with a restored snapshot. */
27334
+ loadSnapshot(snapshot: CTCGraphSnapshot): void;
27335
+ }
27336
+
25970
27337
  /**
25971
27338
  * Options for constructing a ManagerContext.
25972
27339
  */
@@ -26005,6 +27372,8 @@ declare class ManagerContext {
26005
27372
  private _graphTraversal?;
26006
27373
  private _searchManager?;
26007
27374
  private _rankedSearch?;
27375
+ private _graphRankPrior?;
27376
+ private _hybridSearchManager?;
26008
27377
  private _ioManager?;
26009
27378
  private _tagManager?;
26010
27379
  private _analyticsManager?;
@@ -26051,6 +27420,7 @@ declare class ManagerContext {
26051
27420
  private _roleAssignmentStore?;
26052
27421
  private _worldModelManager?;
26053
27422
  private _activeRetrieval?;
27423
+ private _reconstructiveMemory?;
26054
27424
  private _accessTracker?;
26055
27425
  private _decayEngine?;
26056
27426
  private _decayScheduler?;
@@ -26174,6 +27544,19 @@ declare class ManagerContext {
26174
27544
  get searchManager(): SearchManager;
26175
27545
  /** RankedSearch - TF-IDF/BM25 ranked search */
26176
27546
  get rankedSearch(): RankedSearch;
27547
+ /**
27548
+ * GraphRankPrior — cached graph-connectivity ranking signal (normalized
27549
+ * PageRank with degree fallback). Built over the existing GraphTraversal
27550
+ * and auto-invalidated via the storage GraphEventEmitter.
27551
+ * @experimental
27552
+ */
27553
+ get graphRankPrior(): GraphRankPrior;
27554
+ /**
27555
+ * HybridSearchManager — semantic + lexical + symbolic (+ optional graph)
27556
+ * layered search. Reads MEMORY_HYBRID_GRAPH_WEIGHT at first access; when
27557
+ * 0/unset (the default), the GraphRankPrior is not attached — zero overhead.
27558
+ */
27559
+ get hybridSearchManager(): HybridSearchManager;
26177
27560
  /**
26178
27561
  * Materialised search views — pre-computed result sets for repeated
26179
27562
  * filter-based queries. Lazy: only constructed on first access (which
@@ -26445,6 +27828,25 @@ declare class ManagerContext {
26445
27828
  * LLM-driven decomposition use `ctx.llmQueryPlanner`.
26446
27829
  */
26447
27830
  get activeRetrieval(): ActiveRetrievalController;
27831
+ /**
27832
+ * `ReconstructiveMemory` — MRAgent-style associative memory ("Memory is
27833
+ * Reconstructed, Not Retrieved"). Builds a Cue–Tag–Content graph from
27834
+ * dialogue (`ingest`) and answers queries via active, multi-step memory
27835
+ * reconstruction (`reconstruct`). Lazy; works zero-config with heuristic
27836
+ * distillation/reconstruction, or pass an `LLMProvider` for the paper's
27837
+ * LLM-driven distillation and answer synthesis.
27838
+ *
27839
+ * @param config Optional LLM provider / restored graph snapshot. Passing a
27840
+ * config re-instantiates the facade (invalidates the cached instance).
27841
+ */
27842
+ reconstructiveMemory(config?: ReconstructiveMemoryConfig): ReconstructiveMemory;
27843
+ /**
27844
+ * Build a {@link ReconstructiveBacking} that bridges the Cue–Tag–Content
27845
+ * layers to this context's live modules: episodic episodes onto the
27846
+ * `EpisodicMemoryManager` timeline, semantic facts into the entity graph +
27847
+ * `SemanticSearch`, and topic links as relations.
27848
+ */
27849
+ private buildReconstructiveBacking;
26448
27850
  /**
26449
27851
  * TransitionLedger - Append-only audit trail for state changes.
26450
27852
  * Returns null if not enabled via MEMORY_TRANSITION_LEDGER env var.
@@ -26508,6 +27910,7 @@ declare class ManagerContext {
26508
27910
  * - MEMORY_SALIENCE_FREQUENCY_WEIGHT (default: 0.2)
26509
27911
  * - MEMORY_SALIENCE_CONTEXT_WEIGHT (default: 0.2)
26510
27912
  * - MEMORY_SALIENCE_NOVELTY_WEIGHT (default: 0.1)
27913
+ * - MEMORY_SALIENCE_CONNECTIVITY_WEIGHT (default: 0 = disabled)
26511
27914
  */
26512
27915
  get salienceEngine(): SalienceEngine;
26513
27916
  /**
@@ -27842,6 +29245,14 @@ declare class VisibilityResolver {
27842
29245
  * persistence. Suitable as the default backend when no SQLite/Postgres
27843
29246
  * configuration exists, and as the fast/clean fixture in unit tests.
27844
29247
  *
29248
+ * **Contract (graph-core):** this backend is *ephemeral by design* — it is
29249
+ * an in-process turn buffer, not part of the knowledge graph's
29250
+ * system-of-record. Anything that must survive the process or be
29251
+ * queryable/traversable as graph content belongs in `SQLiteBackend`,
29252
+ * which routes through `MemoryEngine` into the Entity/Relation graph.
29253
+ * Do not extend this class with durability features; swap backends
29254
+ * instead (`MEMORY_BACKEND=sqlite`).
29255
+ *
27845
29256
  * Scoring delegates to `DecayEngine.calculatePrdEffectiveImportance` so
27846
29257
  * `get_weighted` returns the same PRD-formula scores that
27847
29258
  * `SQLiteBackend` (T13) will produce.
@@ -28001,11 +29412,29 @@ declare class QueryRewriter {
28001
29412
  /**
28002
29413
  * Procedure Store (3B.4)
28003
29414
  *
28004
- * Persists `Procedure` records as memoryjs entities (`entityType:
28005
- * 'procedure'`). Steps + metadata live in `observations` as a single
28006
- * JSON-encoded line; the rest of the entity carries triggers/successRate
28007
- * via observations and tags. This shape lets procedures roundtrip
28008
- * through both the JSONL and SQLite backends without schema changes.
29415
+ * Persists `Procedure` records as real graph structure instead of JSON
29416
+ * blobs, so procedure content is queryable and traversable:
29417
+ *
29418
+ * - The procedure itself is an `entityType: 'procedure'` entity (name =
29419
+ * `procedure.id`). Its observations carry the description plus
29420
+ * human-readable scalar lines (`[success-rate]: 0.85`,
29421
+ * `[execution-count]: 12`). Tags = `['procedure', ...triggers]`.
29422
+ * - Every step is its own `entityType: 'procedure-step'` entity named
29423
+ * `${procedureId}::step-${order}` (fallbacks: `${parentStepName}::fallback`,
29424
+ * recursively). Step observations encode one field per line:
29425
+ * `[order]: <n>`, `[action]: <action>`, `[timeout]: <ms>`, and one
29426
+ * `[param]: <JSON-key>=<JSON-value>` line per parameter — key and value
29427
+ * are JSON-encoded separately so arbitrary strings (equals signs,
29428
+ * newlines, unicode) roundtrip.
29429
+ * - Relations wire it together: procedure —`has_step`→ each top-level
29430
+ * step, step —`precedes`→ the next step in sequence, and step
29431
+ * —`has_fallback`→ its fallback step. Step entities set `parentId` to
29432
+ * the procedure id for hierarchy integration.
29433
+ *
29434
+ * Legacy JSON-blob procedures (`[procedure-steps]:` / `[procedure-meta]:`
29435
+ * observations) remain decodable via `decodeProcedure` and are
29436
+ * auto-migrated to the decomposed shape on `load()`; use
29437
+ * `migrateLegacyProcedures` for bulk migration.
28009
29438
  *
28010
29439
  * @module agent/procedural/ProcedureStore
28011
29440
  */
@@ -28013,28 +29442,61 @@ declare class QueryRewriter {
28013
29442
  declare const PROCEDURE_ENTITY_TYPE = "procedure";
28014
29443
  declare class ProcedureStore {
28015
29444
  private readonly entityManager;
28016
- constructor(entityManager: EntityManager);
29445
+ private readonly relationManager;
29446
+ constructor(entityManager: EntityManager, relationManager: RelationManager);
28017
29447
  /**
28018
- * Persist a new procedure. The entity name = `procedure.id`. Steps and
28019
- * metadata are encoded as JSON observations alongside any caller-supplied
28020
- * description observation. Idempotent on duplicate id (relies on
28021
- * `EntityManager.createEntities` semantics).
29448
+ * Persist a new procedure. The entity name = `procedure.id`; each step
29449
+ * (and recursive fallback) becomes its own `procedure-step` entity
29450
+ * linked via `has_step` / `precedes` / `has_fallback` relations.
29451
+ * Idempotent on duplicate id (relies on `EntityManager.createEntities`
29452
+ * skip-duplicate semantics). Step `order` values are assumed unique
29453
+ * within a procedure (they name the step entities).
28022
29454
  */
28023
29455
  save(procedure: Procedure): Promise<void>;
28024
29456
  /**
28025
- * Load a procedure by id, or undefined if not found. Tolerant of partial
28026
- * encodings — steps default to `[]`, meta to zeroed fields.
29457
+ * Load a procedure by id, or undefined if not found. Tolerant of
29458
+ * partial encodings — steps default to `[]`, scalars to zero.
29459
+ *
29460
+ * **Side effect (auto-migration):** when the entity still uses the
29461
+ * legacy JSON-blob encoding (`[procedure-steps]:` observation), it is
29462
+ * decoded with the legacy decoder and then rewritten in place to the
29463
+ * decomposed graph shape (step entities + relations) before returning.
28027
29464
  */
28028
29465
  load(id: string): Promise<Procedure | undefined>;
28029
29466
  /**
28030
- * Replace an existing procedure's steps + metadata. Throws if the
28031
- * entity doesn't exist or isn't a procedure.
29467
+ * Replace an existing procedure's steps + metadata. Deletes the
29468
+ * procedure's current step entities (cascading their relations — see
29469
+ * `EntityManager.deleteEntities`) and recreates the step graph from
29470
+ * `procedure.steps`. Throws if the entity doesn't exist.
28032
29471
  */
28033
29472
  update(procedure: Procedure): Promise<void>;
29473
+ /** Create step entities + linking relations for `procedure.steps`. */
29474
+ private createStepGraph;
29475
+ /**
29476
+ * All step entity names reachable from the procedure via `has_step`
29477
+ * then recursive `has_fallback` edges.
29478
+ */
29479
+ private collectStepEntityNames;
29480
+ /**
29481
+ * Load top-level steps via `has_step`, ordered by the `precedes` chain
29482
+ * (preserving the original array order); falls back to a numeric sort
29483
+ * on `[order]` when the chain is incomplete.
29484
+ */
29485
+ private loadSteps;
29486
+ /**
29487
+ * Load one step entity plus its recursive fallback chain. Records the
29488
+ * step's `precedes` successor (among `topSet`) into `successor` when
29489
+ * provided. Returns null when the entity is missing or not a step.
29490
+ */
29491
+ private loadStepTree;
28034
29492
  }
28035
29493
  /**
28036
- * Pure decoder: extracts `Procedure` shape from the observation list.
28037
- * Exported for tests and for callers wanting to introspect raw entities.
29494
+ * Pure decoder for the legacy JSON-blob observation shape
29495
+ * (`[procedure-steps]:` / `[procedure-meta]:` lines).
29496
+ *
29497
+ * @deprecated Legacy decoder — kept for reading pre-decomposition
29498
+ * entities. `ProcedureStore.load()` auto-migrates such entities; new
29499
+ * code should go through `ProcedureStore`.
28038
29500
  */
28039
29501
  declare function decodeProcedure(id: string, observations: string[]): Procedure;
28040
29502
 
@@ -28735,4 +30197,4 @@ declare class LangChainMemoryAdapter {
28735
30197
  clear(): Promise<void>;
28736
30198
  }
28737
30199
 
28738
- export { type ABACCondition, type ABACContext, type ABACDecision, type ABACEffect, type ABACOp, ABACPolicy, type ABACRule, APIKeyStore, type ValidationResult as APIKeyValidationResult, type AcceptDecisionResult, type AccessContext, AccessContextBuilder, type AccessPattern, type AccessStats, AccessTracker, type AccessTrackerConfig, type Action, type ActiveRetrievalConfig, ActiveRetrievalController, type AdaptiveDepthConfig, type AdaptiveReductionResult, type AdaptiveResult, type AddExclusionRuleInput, type AddHeuristicOptions, type AddObservationInput, AddObservationInputSchema, AddObservationsInputSchema, type AddTurnOptions, type AddTurnResult, type AdequacyCheck, type AgentEntity, type AgentMemoryConfig, AgentMemoryManager, type AgentObservation, type AgentRole, AnalyticsManager, type ArchiveCriteria, type ArchiveCriteriaInput, ArchiveCriteriaSchema, ArchiveManager, type ArchiveOptions, type ArchiveReflectionResult, type ArchiveResult, type ArchiveResultExtended, type ArtifactEntity, type ArtifactFilter, ArtifactManager, type ArtifactType, AsyncMutex, type AsyncMutexOptions, type AttributionMode, type AuditEntry, type AuditFilter, AuditLog, type AuditOperation, type AuditStats, type AutoLinkOptions, type AutoLinkResult, AutoLinker, type AutoSearchResult, type BM25Config, type BM25DocumentEntry, type BM25Index, BM25Search, type BackupInfo, type BackupInfoExtended, type BackupMetadata, type BackupMetadataExtended, type BackupOptions, type BackupResult, BasicSearch, BatchCreateEntitiesSchema, BatchCreateRelationsSchema, type BatchItemResult, type BatchOperation, type BatchOperationType, type BatchOptions, type BatchProcessResult, BatchProcessor, type BatchProcessorOptions, type BatchProgress, type BatchProgressCallback, type BatchResult, BatchTransaction, type BidirectionalRelation, type BooleanCacheEntry, type BooleanOpNode, type BooleanQueryNode, BooleanSearch, COMPRESSION_CONFIG, type CacheCompressionStats, type CacheStats, type CachedQueryEntry, type CausalChain, type CausalCycle, CausalReasoner, type CausalReasonerConfig, type CausalRelationType, type CentralityResult, type ClusterMethod, CognitiveLoadAnalyzer, type CognitiveLoadConfig, type CognitiveLoadMetrics, CollaborationAuditEnforcer, type CollaborationAuditEnforcerOptions, CollaborativeSynthesis, type CollaborativeSynthesisConfig, type CommonSearchFilters, type ComponentMemoryUsage, CompositeDistillationPolicy, CompressedCache, type CompressedCacheOptions, type CompressedCacheStats, type CompressedMemory, CompressionManager, type CompressionMetadata, type CompressionOptions, type CompressionQuality, type CompressionResult, type ConfirmationResult, type ConflictInfo, ConflictResolver, type ConflictResolverConfig, type ConflictStrategy, type ConnectedComponentsResult, type ConsolidateOptions, type ConsolidationAction, type ConsolidationCycleResult, ConsolidationPipeline, type ConsolidationPipelineConfig, type ConsolidationResult, type ConsolidationRule, ConsolidationScheduler, type ConsolidationSchedulerConfig, type ConsolidationTrigger, type ContextPackage, type ContextProfile, ContextProfileManager, type ContextRetrievalOptions, ContextWindowManager, type ContextWindowManagerConfig, type Contradiction$1 as Contradiction, ContradictionDetector, type CreateArtifactOptions, type CreateEntityInput, CreateEntitySchema, type CreateEpisodeOptions, type CreateMemoryOptions, type CreatePlanOptions, type CreateRelationInput, CreateRelationSchema, type CreateWorkThreadOptions, CycleDetectedError, DEFAULT_BASE_DIR, DEFAULT_BM25_CONFIG, DEFAULT_CAUSAL_RELATION_TYPES, DEFAULT_DUPLICATE_THRESHOLD, DEFAULT_EMBEDDING_CACHE_OPTIONS, DEFAULT_FILE_NAMES, DEFAULT_HYBRID_WEIGHTS, DEFAULT_INDEXER_OPTIONS, DEFAULT_PERMISSION_MATRIX, DEFAULT_PII_PATTERNS, DEFAULT_SCORER_WEIGHTS, DOCUMENT_PREFIX, type DateRange, DateRangeSchema, type DecayCycleResult, DecayEngine, type DecayEngineConfig, type DecayOperationOptions, type DecayOptions, type DecayResult, DecayScheduler, type DecaySchedulerConfig, type DecisionEntityOptions, type DecisionInput, DecisionManager, type DecisionRule, type DedupTier, type DeduplicationOptions, DefaultDistillationPolicy, type DeleteObservationInput, DeleteObservationInputSchema, DeleteObservationsInputSchema, DeleteRelationsSchema, type DistillOptions, type DistillationConfig, DistillationPipeline, type DistillationResult, type DistillationStats, type DistilledLesson, type DistilledMemory, type DocumentVector, type DreamCycleResult, DreamEngine, type DreamEngineCallbacks, type DreamEngineConfig, type DreamPhaseConfig, type DreamPhaseResult, type DuplicateCheckResult, DuplicateEntityError, type DuplicateObservationGroup, type DuplicateObservationOccurrence, type DuplicatePair, ENTITY_STATUS_TRANSITIONS, ENV_VARS, EarlyTerminationManager, type EarlyTerminationOptions, type EarlyTerminationResult, EmbeddingCache, type EmbeddingCacheOptions, type EmbeddingCacheStats, type EmbeddingConfig, type EmbeddingMode, type EmbeddingProgressCallback, type EmbeddingService, type EndSessionResult, type Entity, type EntityCreatedEvent, type EntityDeletedEvent, type EntityInput, EntityManager, type EntityManagerOptions, EntityNamesSchema, EntityNotFoundError, type EntityRuleResult, EntitySchema, type EntityStatus, type EntityUpdatedEvent, type EntityValidationIssue, type EntityValidationResult, type EntityValidationRule, EntityValidator, type EntityValidatorConfig, type EntityWithContext, type EntropyFilterConfig, EntropyFilterStage, type EpisodicMemoryConfig, type EpisodicMemoryEntity, EpisodicMemoryManager, EpisodicRelations, ErrorCode, type ErrorOptions, type ExcludedEntity, type ExclusionCheckResult, ExclusionManager, type Experience, ExperienceExtractor, type ExperienceExtractorConfig, type ExperienceType, type ExplainedSearchResult, ExportError, type ExportFilter, type ExportFilterInput, ExportFilterSchema, type ExportFormat, ExportFormatSchema, type ExportOptions, type ExportResult, type ExtendedExportFormatInput, ExtendedExportFormatSchema, type ExtendedPoolStats, type ExtendedQueryCostEstimate, type ExtractedEntity, type ExtractedFact, FILE_EXTENSIONS, FILE_SUFFIXES, type FactExtractionOptions, type FactExtractionResult, FactExtractor, FailureDistillation, type FailureDistillationConfig, type FailureDistillationResult, type FailureEntityOptions, type GetAllOptions as FailureGetAllOptions, type FailureInput, type LookupOptions as FailureLookupOptions, FailureManager, type FailureManagerConfig, type FieldNode, FileOperationError, type FlushResult, type ForContextOptions, type ForgetOptions, type ForgetResult, FreshnessManager, type FreshnessManagerConfig, type FreshnessReport, type FuzzyCacheKey, FuzzySearch, type FuzzySearchOptions, GRAPH_LIMITS, type GetWeightedOptions, GovernanceManager, type GovernanceOperationOptions, type GovernancePolicy, GovernanceTransaction, type Granularity, type GraphCompressionResult, type GraphEvent, type GraphEventBase, GraphEventEmitter, type GraphEventListener, type GraphEventMap, type GraphEventType, type GraphLoadedEvent, type GraphProjection, type GraphSavedEvent, type GraphStats, GraphStorage, GraphTraversal, type GroupMembership, type GroupingResult, type HeuristicConflict, HeuristicExtractionStage, type HeuristicExtractionStageConfig, type HeuristicGuideline, HeuristicManager, type HeuristicMatch, type HeuristicUpdateResult, HierarchyManager, HybridScorer, type HybridScorerOptions, HybridSearchManager, type HybridSearchOptions, type HybridSearchResult, type HybridWeights, type IDistillationPolicy, type IGraphStorage, IMPORTANCE_RANGE, type IMemoryBackend, IOManager, type ISummarizationProvider, type IVectorStore, ImportError, type ImportFormat, type ImportFormatInput, ImportFormatSchema, type ImportResult, ImportanceScorer, type ImportanceScorerConfig, InMemoryBackend, InMemoryVectorStore, IncrementalIndexer, type IncrementalIndexerOptions, type IndexMemoryUsage, type IndexOperation, type IndexOperationType, type IngestInput, type IngestOptions, type IngestResult, InsufficientEntitiesError, InvalidImportanceError, type IssueOptions, type IssueResult, type JSONValue, type JsonSchema, type KeyRecord, KeywordExtractor, type KnowledgeGraph, KnowledgeGraphError, ManagerContext as KnowledgeGraphManager, type LLMProvider, LLMQueryPlanner, type LLMQueryPlannerConfig, LLMSearchExecutor, type LLMSearchExecutorOptions, LOG_PREFIXES, LangChainMemoryAdapter, type LayerRecommendationOptions, type LayerTiming, type LexicalSearchResult, type ListDecisionsOptions, type ListPlansOptions, type ListReflectionsOptions, LocalEmbeddingService, type LogLevel, type LongRunningOperationOptions, LowEntropyContentError, LowercaseCache, type LowercaseData, MCPToolObserverAdapter, MEMORY_TYPES, ManagerContext, type ManagerContextOptions, type MatchedTerm, type MemoryAcquisitionMethod, type MemoryAlert, type MemoryChangeCallback, MemoryEngine, type MemoryEngineConfig, type MemoryEngineEventName, MemoryFormatter, type MemoryFormatterConfig, type MemoryMergeStrategy, MemoryMonitor, type MemorySource, type MemoryThresholds, type MemoryTurn, type MemoryType, type MemoryUsageStats, type MemoryValidationIssue, type MemoryValidationResult, MemoryValidator, type MemoryValidatorConfig, type Contradiction as MemoryValidatorContradiction, type MemoryVisibility, type MergeResult, type MergeStrategy, type MergeStrategyInput, MergeStrategySchema, MockEmbeddingService, type MultiAgentConfig, MultiAgentMemoryManager, NGramIndex, type NGramIndexStats, NameIndex, NoOpDistillationPolicy, type NormalizationOptions, type NormalizationResult, type ObservableDataModelAdapterOptions, type ObservableDataModelShape, type ObservationAddedEvent, type ObservationDedupFilter, ObservationDedupManager, type ObservationDedupManagerConfig, ObservationDedupReportStage, type ObservationDedupReportStageConfig, type ObservationDeletedEvent, ObservationManager, ObservationNormalizer, type ObservationScore, type ObservationSource, ObserverPipeline, type ObserverPipelineOptions, type ObserverPipelineStats, OpenAIEmbeddingService, OperationCancelledError, type OperationResult, OperationType, OptimizedInvertedIndex, OptionalEntityNamesSchema, OptionalTagsSchema, type Outcome, PROCEDURE_ENTITY_TYPE, type PaginatedCacheEntry, type PaginatedResult, type PaginationParams, ParallelSearchExecutor, type ParallelSearchOptions, type ParallelSearchResult, type ParsePaginationOptions, type ParsedTemporalRange, type PathResult, PatternDetector, type PatternResult, type Permission, type PermissionMatrix, type PermissionMatrixRow, type PhaseDefinition, type PhraseNode, type PiiPattern, PiiRedactor, type PiiRedactorOptions, type PipelineStage, PlanManager, type PlanManagerConfig, type PoolEventCallback, type PostingListResult, type PreparedEntity, type ProceduralMemoryEntity, type ProcedureInvoker, ProcedureManager, type ProcedureManagerConfig, ProcedureStore, type ProfileConfig, type ProfileEntity, ProfileManager, type ProfileManagerConfig, type ProfileOptions, type ProfileResponse, type ProgressCallback, type ProgressInfo, type ProgressInfoCallback, type ProgressOptions, ProjectContextManager, type ProjectContextManagerConfig, type ProjectContextUpsertInput, type PromotionCriteria, type PromotionMarkOptions, type PromotionResult, type ProspectiveMemoryConfig, ProspectiveMemoryManager, ProspectivePromotionStage, type ProximityMatch, type ProximityMatchLocation, type ProximityNode, ProximitySearch, type PushSubGoalOptions, QUERY_LIMITS, QUERY_PREFIX, type QuantizationParams, type QuantizedSearchResult, QuantizedVectorStore, type QuantizedVectorStoreOptions, type QuantizedVectorStoreStats, type QueryAnalysis, QueryAnalyzer, type QueryCostEstimate, QueryCostEstimator, type QueryCostEstimatorOptions, type QueryLogEntry, QueryLogger, type QueryLoggerConfig, type QueryNode, QueryParser, type QueryPlan, QueryPlanCache, type QueryPlanCacheOptions, type QueryPlanCacheStats, QueryPlanner, QueryRewriter, type QueryStage, type QueryTrace, QueryTraceBuilder, type QueueStats, RankedSearch, type RateLimitVerdict, RateLimiter, type RateLimiterConfig, RbacMiddleware, type RbacMiddlewareOptions, type RbacPolicy, ReadOnlyMemoryGraphDataError, type ReadonlyKnowledgeGraph, type RecordOutcomeInput, type RedactionResult, type RedactionStats, type RedundancyGroup, RefConflictError, type RefEntry, RefIndex, type RefIndexStats, RefNotFoundError, type RefinementHistoryEntry, type ReflectionEntityOptions, type ReflectionInput, ReflectionManager$1 as ReflectionManager, ReflectionManager as ReflectionMemoryManager, type ReflectionManagerConfig as ReflectionMemoryManagerConfig, type ReflectionOptions, type ReflectionResult, ReflectionStage, type ReflectionStageConfig, type ReinforcementOptions, type RejectDecisionResult, type Relation, RelationBuilder, type RelationCreatedEvent, type RelationDeletedEvent, RelationIndex, type RelationInput, RelationManager, RelationNotFoundError, type RelationProperties, RelationSchema, type RelationValidationError, type RelationValidationResult, type RelationValidationWarning, type RelevanceOptions, type ResolutionResult, type ResourcePermissionOverrides, type ResourceType, type RestHandler, type RestMethod, type RestRequest, type RestResponse, RestRouter, type RestoreResult, type Result, type RetrievalContext, type RetrievalDecision, type RetrievalRound, type RetrieveContextOptions, type RewriteResult, type Role, type RoleAssignment, RoleAssignmentStore, type RoleAssignmentStoreOptions, type RoleProfile, type RouteDefinition, RowLevelFilter, type RowPredicate, type Rule, type RuleConditions, type RuleEvaluationResult, RuleEvaluator, SEARCH_LIMITS, SIMILARITY_WEIGHTS, SQLiteBackend, type SQLiteBackendOptions, SQLiteStorage, type SQLiteStorageWithEmbeddings, SQLiteVectorStore, STOPWORDS, STREAMING_CONFIG, type SalienceComponents, type SalienceContext, SalienceEngine, type SalienceEngineConfig, type SalienceWeights, type SavedSearch, type SavedSearchInput, SavedSearchInputSchema, SavedSearchManager, type SavedSearchUpdateInput, SavedSearchUpdateSchema, type ScheduleOptions, SchemaValidator, type ScoreBoost, type ScoreOptions, type ScoredEntity, type ScoredKeyword, type ScoredResult, type ScoringSignal, SearchCache, type SearchExplanation, SearchFilterChain, type SearchFilters, type SearchFunction, type SearchLayer, SearchManager, type SearchMethod, type SearchQuery, SearchQuerySchema, type SearchResult, SearchSuggestions, SemanticForget, type SemanticForgetOptions, type SemanticForgetResult, type SemanticIndexOptions, type SemanticLayerResult, type SemanticMemoryEntity, SemanticSearch, type SemanticSearchResult, type SessionCheckpointData, SessionCheckpointManager, type SessionConfig, type SessionEntity, type SessionHistoryOptions, SessionManager, type SessionMemoryFilter, type SessionOutcome, SessionQueryBuilder, type SessionSearchOptions, type SessionStatus, SpellChecker, type SpellCheckerConfig, type SpellSuggestion, type SpilloverResult, type SplitOptions, type SplitResult, type StageResult, type StartSessionOptions, StepSequencer, type StorageConfig, type StreamResult, StreamingExporter, type StructuredQuery, type SubQuery, type SuggestOptions, type SuggestToolOptions, type SummarizationConfig, type SummarizationResult, SummarizationService, type SupersedeDecisionResult, type SymbolicFilters, type SymbolicResult, SymbolicSearch, type SymbolicSearchResult, type SynthesisResult, TFIDFEventSync, type TFIDFIndex, TFIDFIndexManager, type TagAlias, type TagAliasInput, TagAliasSchema, TagManager, type Task, type TaskBatchOptions, type TaskHandle, TaskPriority, TaskQueue, type TaskResult, TaskStatus, type TaskSubmitOptions, type TemporalFilterField, type TemporalFocus, TemporalQueryParser, type TemporalRange, type TemporalRelation, TemporalSearch, type TemporalSearchOptions, type TermNode, type TimelineOptions, type TokenBreakdown, type TokenEstimationOptions, type TokenizedEntity, ToolAffordanceManager, type ToolAffordanceManagerConfig, type ToolAffordanceStats, type ToolCallEvent, ToolCallObserver, type ToolResponse, type ToolSuggestion, type Trajectory, type TrajectoryCluster, TrajectoryCompressor, type TrajectoryCompressorConfig, type TrajectoryMergeStrategy, TransactionManager, type TransactionOperation, type TransactionResult, type TransitionEvent, type TransitionFilter, TransitionLedger, type TraversalOptions, type TraversalResult, TypeIndex, type UpdateEntityInput, UpdateEntitySchema, type ValidatedPagination, ValidationError, type ValidationIssue, type ValidationReport, type ValidationResult$1 as ValidationResult, type ValidationWarning, type VectorSearchResult, VisibilityResolver, type VisualizeOptions, type WakeUpOptions, type WakeUpResult, type WeightedRelation, type WeightedTurn, type WildcardNode, type WorkThread, type WorkThreadFilter, WorkThreadManager, type WorkThreadStatus, type WorkerPoolConfig, WorkerPoolManager, WorkerTaskManager, type WorkerTaskManagerStats, type WorkingMemoryConfig, type WorkingMemoryEntity, WorkingMemoryManager, type WorkingMemoryOptions, WorldModelManager, type WorldModelManagerOptions, type WorldStateChange, type WorldStateEntity, WorldStateSnapshot, addUniqueTags, all, allRelationsValidMetadata, applyPagination, asWarning, batchProcess, batchProcessViaWorkers, buildTFVector, calculateIDF, calculateIDFFromTokenSets, calculateTF, calculateTFIDF, calculateTextSimilarity, checkCancellation, chunkArray, cleanupAllCaches, clearAllSearchCaches, compress, compressFile, compressToBase64, computeEntropy, cosineSimilarity, createCustomProfile, createDetailedProgressReporter, createEmbeddingService, createMetadata, createObservableDataModelFromGraph, createProgress, createProgressInfo, createProgressReporter, createStorage, createStorageFromPath, createThrottledProgress, createUncompressedMetadata, createVectorStore, custom, customSync, debounce, decodeProcedure, decompress, decompressFile, decompressFromBase64, defaultMemoryPath, email, ensureMemoryFilePath, entityExists, entityPassesFilters, entityToText, err, escapeCsvFormula, executeWithPhases, extractToolName, filterByCreatedDate, filterByEntityType, filterByImportance, filterByModifiedDate, filterByTags, filterParallel, findEntitiesByNames, findEntityByName, fnv1aHash, formatErrorResponse, formatRawResponse, formatTextResponse, formatToolResponse, formatZodErrors, generateSuggestions, getAllCacheStats, getCompressionRatio, getCurrentTimestamp, getEntityIndex, getEntityNameSet, getPaginationMeta, getPoolStats, getQuickHint, getRoleProfile, getWorkerPoolManager, getWorkerTaskManager, globalMemoryMonitor, groupEntitiesByType, hasAllTags, hasBrotliExtension, hasConfidence, hasMatchingTag, isAgentEntity, isArtifactEntity, isBidirectionalRelation, isCurrentlyValid, isEpisodicMemory, isErr, isOk, isPrefixPattern, isProceduralMemory, isProfileEntity, isSemanticMemory, isSessionEntity, isTemporalRelation, isValidISODate, isWeightedRelation, isWithinDateRange, isWithinImportanceRange, isWorkingMemory, isoDate, l2Normalize, levenshteinDistance, listRoleProfiles, loadConfigFromEnv, logger, mapOk, mapParallel, matchesPhrase, matchesPrefix, max, maxItems, maxLength, mergeConfig, min, minItems, minLength, normalizeTag, normalizeTags, ok, oneOf, paginate, paginateArray, parallelFilter, parallelLimit, parallelMap, parseDateRange, parsePaginationParams, passesEntropyFilter, pattern, permissionsForRole, processBatch, processBatchesWithProgress, processWithRetry, range, rateLimitedProcess, removeEntityByName, removeTags, required, resolveRoleProfile, sanitizeObject, searchCaches, shutdownParallelUtils, cosineSimilarity$1 as textCosineSimilarity, tokenize as textTokenize, throttle, tokenize$1 as tokenize, touchEntity, typeOf, unwrap, unwrapOr, url, validateArrayWithSchema, validateConfig, validateEntity, validateFilePath, validateImportance, validatePagination, validateRelation, validateRelationMetadata, validateRelationsMetadata, validateSafe, validateTags, validateWithSchema, when, withRetry };
30200
+ export { type ABACCondition, type ABACContext, type ABACDecision, type ABACEffect, type ABACOp, ABACPolicy, type ABACRule, APIKeyStore, type ValidationResult as APIKeyValidationResult, type AcceptDecisionResult, type AccessContext, AccessContextBuilder, type AccessPattern, type AccessStats, AccessTracker, type AccessTrackerConfig, type Action, type ActiveRetrievalConfig, ActiveRetrievalController, type AdaptiveDepthConfig, type AdaptiveReductionResult, type AdaptiveResult, type AddExclusionRuleInput, type AddHeuristicOptions, type AddObservationInput, AddObservationInputSchema, AddObservationsInputSchema, type AddTurnOptions, type AddTurnResult, type AdequacyCheck, type AgentEntity, type AgentMemoryConfig, AgentMemoryManager, type AgentObservation, type AgentRole, AnalyticsManager, type ArchiveCriteria, type ArchiveCriteriaInput, ArchiveCriteriaSchema, ArchiveManager, type ArchiveOptions, type ArchiveReflectionResult, type ArchiveResult, type ArchiveResultExtended, type ArtifactEntity, type ArtifactFilter, ArtifactManager, type ArtifactType, AsyncMutex, type AsyncMutexOptions, type AttributionMode, type AuditEntry, type AuditFilter, AuditLog, type AuditOperation, type AuditStats, type AutoLinkOptions, type AutoLinkResult, AutoLinker, type AutoSearchResult, BLOCKED_BY_RELATION, type BM25Config, type BM25DocumentEntry, type BM25Index, BM25Search, type BackupInfo, type BackupInfoExtended, type BackupMetadata, type BackupMetadataExtended, type BackupOptions, type BackupResult, BasicSearch, BatchCreateEntitiesSchema, BatchCreateRelationsSchema, type BatchItemResult, type BatchOperation, type BatchOperationType, type BatchOptions, type BatchProcessResult, BatchProcessor, type BatchProcessorOptions, type BatchProgress, type BatchProgressCallback, type BatchResult, BatchTransaction, type BidirectionalRelation, type BooleanCacheEntry, type BooleanOpNode, type BooleanQueryNode, BooleanSearch, type BridgePersistResult, CHILD_OF_RELATION, COMPRESSION_CONFIG, type CTCGraphSnapshot, type CTCTriple, type CacheCompressionStats, type CacheStats, type CachedQueryEntry, type CausalChain, type CausalCycle, CausalReasoner, type CausalReasonerConfig, type CausalRelationType, type CentralityResult, type ClusterMethod, CognitiveLoadAnalyzer, type CognitiveLoadConfig, type CognitiveLoadMetrics, CollaborationAuditEnforcer, type CollaborationAuditEnforcerOptions, CollaborativeSynthesis, type CollaborativeSynthesisConfig, type CommonSearchFilters, type ComponentMemoryUsage, CompositeDistillationPolicy, CompressedCache, type CompressedCacheOptions, type CompressedCacheStats, type CompressedMemory, CompressionManager, type CompressionMetadata, type CompressionOptions, type CompressionQuality, type CompressionResult, type ConfirmationResult, type ConflictInfo, ConflictResolver, type ConflictResolverConfig, type ConflictStrategy, type ConnectedComponentsResult, type ConsolidateOptions, type ConsolidationAction, type ConsolidationCycleResult, ConsolidationPipeline, type ConsolidationPipelineConfig, type ConsolidationResult, type ConsolidationRule, ConsolidationScheduler, type ConsolidationSchedulerConfig, type ConsolidationTrigger, type ContentLayer, type ContentNode, type ContextPackage, type ContextProfile, ContextProfileManager, type ContextRetrievalOptions, ContextWindowManager, type ContextWindowManagerConfig, type Contradiction$1 as Contradiction, ContradictionDetector, type CreateArtifactOptions, type CreateEntityInput, CreateEntitySchema, type CreateEpisodeOptions, type CreateMemoryOptions, type CreatePlanOptions, type CreateRelationInput, CreateRelationSchema, type CreateWorkThreadOptions, type CueNode, CueTagContentGraph, CycleDetectedError, DEFAULT_BASE_DIR, DEFAULT_BM25_CONFIG, DEFAULT_CAUSAL_RELATION_TYPES, DEFAULT_DUPLICATE_THRESHOLD, DEFAULT_EMBEDDING_CACHE_OPTIONS, DEFAULT_FILE_NAMES, DEFAULT_HYBRID_WEIGHTS, DEFAULT_INDEXER_OPTIONS, DEFAULT_MAX_PAGERANK_ENTITIES, DEFAULT_NEIGHBOR_DAMPING, DEFAULT_NEIGHBOR_TOP_K, DEFAULT_PERMISSION_MATRIX, DEFAULT_PII_PATTERNS, DEFAULT_SCORER_WEIGHTS, DOCUMENT_PREFIX, type DateRange, DateRangeSchema, type DecayCycleResult, DecayEngine, type DecayEngineConfig, type DecayOperationOptions, type DecayOptions, type DecayResult, DecayScheduler, type DecaySchedulerConfig, type DecisionEntityOptions, type DecisionInput, DecisionManager, type DecisionRule, type DedupTier, type DeduplicationOptions, DefaultDistillationPolicy, type DeleteObservationInput, DeleteObservationInputSchema, DeleteObservationsInputSchema, DeleteRelationsSchema, type DialogueTurn, type DistillOptions, type DistillationConfig, DistillationPipeline, type DistillationResult, type DistillationStats, type DistilledLesson, type DistilledMemory, type DistilledSentence, type DocumentVector, type DreamCycleResult, DreamEngine, type DreamEngineCallbacks, type DreamEngineConfig, type DreamPhaseConfig, type DreamPhaseResult, type DuplicateCheckResult, DuplicateEntityError, type DuplicateObservationGroup, type DuplicateObservationOccurrence, type DuplicatePair, ENTITY_STATUS_TRANSITIONS, ENV_VARS, EarlyTerminationManager, type EarlyTerminationOptions, type EarlyTerminationResult, EmbeddingCache, type EmbeddingCacheOptions, type EmbeddingCacheStats, type EmbeddingConfig, type EmbeddingMode, type EmbeddingProgressCallback, type EmbeddingService, type EndSessionResult, type Entity, type EntityCreatedEvent, type EntityDeletedEvent, type EntityInput, EntityManager, type EntityManagerOptions, EntityNamesSchema, EntityNotFoundError, type EntityRenamedEvent, type EntityRuleResult, EntitySchema, type EntityStatus, type EntityUpdatedEvent, type EntityValidationIssue, type EntityValidationResult, type EntityValidationRule, EntityValidator, type EntityValidatorConfig, type EntityWithContext, type EntropyFilterConfig, EntropyFilterStage, type EpisodicMemoryConfig, type EpisodicMemoryEntity, EpisodicMemoryManager, EpisodicRelations, ErrorCode, type ErrorOptions, type EventKeywords, type ExcludedEntity, type ExclusionCheckResult, ExclusionManager, type Experience, ExperienceExtractor, type ExperienceExtractorConfig, type ExperienceType, type ExplainedSearchResult, ExportError, type ExportFilter, type ExportFilterInput, ExportFilterSchema, type ExportFormat, ExportFormatSchema, type ExportOptions, type ExportResult, type ExtendedExportFormatInput, ExtendedExportFormatSchema, type ExtendedPoolStats, type ExtendedQueryCostEstimate, type ExtractedEntity, type ExtractedFact, FILE_EXTENSIONS, FILE_SUFFIXES, type FactExtractionOptions, type FactExtractionResult, FactExtractor, FailureDistillation, type FailureDistillationConfig, type FailureDistillationResult, type FailureEntityOptions, type GetAllOptions as FailureGetAllOptions, type FailureInput, type LookupOptions as FailureLookupOptions, FailureManager, type FailureManagerConfig, type FieldNode, FileOperationError, type FlushResult, type ForContextOptions, type ForgetOptions, type ForgetResult, FreshnessManager, type FreshnessManagerConfig, type FreshnessReport, type FuzzyCacheKey, FuzzySearch, type FuzzySearchOptions, GRAPH_LIMITS, type GetWeightedOptions, GovernanceManager, type GovernanceOperationOptions, type GovernancePolicy, GovernanceTransaction, type Granularity, type GraphCompressionResult, type GraphEvent, type GraphEventBase, GraphEventEmitter, type GraphEventListener, type GraphEventMap, type GraphEventType, type GraphHybridOptions, type GraphHybridSearchResult, type GraphLayerResult, type GraphLoadedEvent, type GraphProjection, GraphRankPrior, type GraphRankPriorOptions, type GraphSavedEvent, type GraphStats, GraphStorage, GraphTraversal, type GroupMembership, type GroupingResult, HAS_CHECKPOINT_RELATION, type HeuristicConflict, HeuristicExtractionStage, type HeuristicExtractionStageConfig, type HeuristicGuideline, HeuristicManager, type HeuristicMatch, type HeuristicUpdateResult, HierarchyManager, HybridScorer, type HybridScorerOptions, type HybridSearchLayer, HybridSearchManager, type HybridSearchOptions, type HybridSearchResult, type HybridWeights, type IDistillationPolicy, type IGraphStorage, IMPORTANCE_RANGE, type IMemoryBackend, IOManager, type ISummarizationProvider, type IVectorStore, ImportError, type ImportFormat, type ImportFormatInput, ImportFormatSchema, type ImportResult, ImportanceScorer, type ImportanceScorerConfig, InMemoryBackend, InMemoryVectorStore, IncrementalIndexer, type IncrementalIndexerOptions, type IndexMemoryUsage, type IndexOperation, type IndexOperationType, type IngestInput, type IngestOptions, type IngestResult, InsufficientEntitiesError, InvalidImportanceError, type IssueOptions, type IssueResult, type JSONValue, type JsonSchema, type KeyRecord, KeywordExtractor, type KnowledgeGraph, KnowledgeGraphError, ManagerContext as KnowledgeGraphManager, type LLMProvider, LLMQueryPlanner, type LLMQueryPlannerConfig, LLMSearchExecutor, type LLMSearchExecutorOptions, LOG_PREFIXES, LangChainMemoryAdapter, type LayerRecommendationOptions, type LayerTiming, type LexicalSearchResult, type ListDecisionsOptions, type ListPlansOptions, type ListReflectionsOptions, LocalEmbeddingService, type LogLevel, type LongRunningOperationOptions, LowEntropyContentError, LowercaseCache, type LowercaseData, MCPToolObserverAdapter, MEMORY_TYPES, ManagerContext, type ManagerContextOptions, type MatchedTerm, type MemoryAcquisitionMethod, type MemoryAlert, type MemoryChangeCallback, MemoryDistiller, MemoryEngine, type MemoryEngineConfig, type MemoryEngineEventName, MemoryFormatter, type MemoryFormatterConfig, MemoryGraphBridge, type MemoryMergeStrategy, MemoryMonitor, MemoryReconstructor, type MemorySource, type MemoryThresholds, MemoryToolkit, type MemoryTurn, type MemoryType, type MemoryUsageStats, type MemoryValidationIssue, type MemoryValidationResult, MemoryValidator, type MemoryValidatorConfig, type Contradiction as MemoryValidatorContradiction, type MemoryVisibility, type MergeResult, type MergeStrategy, type MergeStrategyInput, MergeStrategySchema, MockEmbeddingService, type MultiAgentConfig, MultiAgentMemoryManager, NGramIndex, type NGramIndexStats, NameIndex, type NeighborExpansionOptions, NoOpDistillationPolicy, type NormalizationOptions, type NormalizationResult, type ObservableDataModelAdapterOptions, type ObservableDataModelShape, type ObservationAddedEvent, type ObservationDedupFilter, ObservationDedupManager, type ObservationDedupManagerConfig, ObservationDedupReportStage, type ObservationDedupReportStageConfig, type ObservationDeletedEvent, ObservationManager, ObservationNormalizer, type ObservationScore, type ObservationSource, ObserverPipeline, type ObserverPipelineOptions, type ObserverPipelineStats, OpenAIEmbeddingService, OperationCancelledError, type OperationResult, OperationType, OptimizedInvertedIndex, OptionalEntityNamesSchema, OptionalTagsSchema, type Outcome, PROCEDURE_ENTITY_TYPE, type PaginatedCacheEntry, type PaginatedResult, type PaginationParams, ParallelSearchExecutor, type ParallelSearchOptions, type ParallelSearchResult, type ParsePaginationOptions, type ParsedTemporalRange, type PathResult, PatternDetector, type PatternResult, type Permission, type PermissionMatrix, type PermissionMatrixRow, type PersonalFact, type PhaseDefinition, type PhraseNode, type PiiPattern, PiiRedactor, type PiiRedactorOptions, type PipelineStage, PlanManager, type PlanManagerConfig, type PoolEventCallback, type PostingListResult, type PreparedEntity, type ProceduralMemoryEntity, type ProcedureInvoker, ProcedureManager, type ProcedureManagerConfig, ProcedureStore, type ProfileConfig, type ProfileEntity, ProfileManager, type ProfileManagerConfig, type ProfileOptions, type ProfileResponse, type ProgressCallback, type ProgressInfo, type ProgressInfoCallback, type ProgressOptions, ProjectContextManager, type ProjectContextManagerConfig, type ProjectContextUpsertInput, type PromotionCriteria, type PromotionMarkOptions, type PromotionResult, type ProspectiveMemoryConfig, ProspectiveMemoryManager, ProspectivePromotionStage, type ProximityMatch, type ProximityMatchLocation, type ProximityNode, ProximitySearch, type PushSubGoalOptions, QUERY_LIMITS, QUERY_PREFIX, type QuantizationParams, type QuantizedSearchResult, QuantizedVectorStore, type QuantizedVectorStoreOptions, type QuantizedVectorStoreStats, type QueryAnalysis, QueryAnalyzer, type QueryCostEstimate, QueryCostEstimator, type QueryCostEstimatorOptions, type QueryLogEntry, QueryLogger, type QueryLoggerConfig, type QueryNode, QueryParser, type QueryPlan, QueryPlanCache, type QueryPlanCacheOptions, type QueryPlanCacheStats, QueryPlanner, QueryRewriter, type QueryStage, type QueryTrace, QueryTraceBuilder, type QueueStats, RankedSearch, type RateLimitVerdict, RateLimiter, type RateLimiterConfig, RbacMiddleware, type RbacMiddlewareOptions, type RbacPolicy, ReadOnlyMemoryGraphDataError, type ReadonlyKnowledgeGraph, type DistillationResult$1 as ReconstructionDistillationResult, type ReconstructionOptions, type ReconstructionResult, type ReconstructiveBacking, ReconstructiveMemory, type ReconstructiveMemoryConfig, type RecordOutcomeInput, type RedactionResult, type RedactionStats, type RedundancyGroup, RefConflictError, type RefEntry, RefIndex, type RefIndexStats, RefNotFoundError, type RefinementHistoryEntry, type ReflectionEntityOptions, type ReflectionInput, ReflectionManager$1 as ReflectionManager, ReflectionManager as ReflectionMemoryManager, type ReflectionManagerConfig as ReflectionMemoryManagerConfig, type ReflectionOptions, type ReflectionResult, ReflectionStage, type ReflectionStageConfig, type ReinforcementOptions, type RejectDecisionResult, type Relation, RelationBuilder, type RelationCreatedEvent, type RelationDeletedEvent, RelationIndex, type RelationInput, RelationManager, RelationNotFoundError, type RelationProperties, RelationSchema, type RelationValidationError, type RelationValidationResult, type RelationValidationWarning, type RelevanceOptions, type ResolutionResult, type ResourcePermissionOverrides, type ResourceType, type RestHandler, type RestMethod, type RestRequest, type RestResponse, RestRouter, type RestoreResult, type Result, type RetrievalContext, type RetrievalDecision, type RetrievalRound, type RetrieveContextOptions, type RewriteResult, type Role, type RoleAssignment, RoleAssignmentStore, type RoleAssignmentStoreOptions, type RoleProfile, type RouteDefinition, RowLevelFilter, type RowPredicate, type Rule, type RuleConditions, type RuleEvaluationResult, RuleEvaluator, SEARCH_LIMITS, SESSION_CHECKPOINT_ENTITY_TYPE, SIMILARITY_WEIGHTS, SNAPSHOTS_RELATION, SQLiteBackend, type SQLiteBackendOptions, SQLiteStorage, type SQLiteStorageWithEmbeddings, SQLiteVectorStore, STOPWORDS, STREAMING_CONFIG, type SalienceComponents, type SalienceContext, SalienceEngine, type SalienceEngineConfig, type SalienceWeights, type SavedSearch, type SavedSearchInput, SavedSearchInputSchema, SavedSearchManager, type SavedSearchUpdateInput, SavedSearchUpdateSchema, type ScheduleOptions, SchemaValidator, type ScoreBoost, type ScoreOptions, type ScoredEntity, type ScoredKeyword, type ScoredResult, type ScoringSignal, SearchCache, type SearchExplanation, SearchFilterChain, type SearchFilters, type SearchFunction, type SearchLayer, SearchManager, type SearchMethod, type SearchQuery, SearchQuerySchema, type SearchResult, SearchSuggestions, SemanticForget, type SemanticForgetOptions, type SemanticForgetResult, type SemanticIndexOptions, type SemanticLayerResult, type SemanticMemoryEntity, SemanticSearch, type SemanticSearchResult, type SessionCheckpointData, SessionCheckpointManager, type SessionConfig, type SessionEntity, type SessionHistoryOptions, SessionManager, type SessionMemoryFilter, type SessionOutcome, SessionQueryBuilder, type SessionSearchOptions, type SessionStatus, SpellChecker, type SpellCheckerConfig, type SpellSuggestion, type SpilloverResult, type SplitOptions, type SplitResult, type StageResult, type StartSessionOptions, StepSequencer, type StorageConfig, type StreamResult, StreamingExporter, type StructuredQuery, type SubQuery, type SuggestOptions, type SuggestToolOptions, type SummarizationConfig, type SummarizationResult, SummarizationService, type SupersedeDecisionResult, type SymbolicFilters, type SymbolicResult, SymbolicSearch, type SymbolicSearchResult, type SynthesisResult, TFIDFEventSync, type TFIDFIndex, TFIDFIndexManager, TOPIC_SUMMARIZES, type TagAlias, type TagAliasInput, TagAliasSchema, TagManager, type TagNode, type Task, type TaskBatchOptions, type TaskHandle, TaskPriority, TaskQueue, type TaskResult, TaskStatus, type TaskSubmitOptions, type TemporalFilterField, type TemporalFocus, TemporalQueryParser, type TemporalRange, type TemporalRelation, TemporalSearch, type TemporalSearchOptions, type TermNode, type TimelineOptions, type TokenBreakdown, type TokenEstimationOptions, type TokenizedEntity, ToolAffordanceManager, type ToolAffordanceManagerConfig, type ToolAffordanceStats, type ToolCallEvent, ToolCallObserver, type ToolResponse, type ToolSuggestion, type Trajectory, type TrajectoryCluster, TrajectoryCompressor, type TrajectoryCompressorConfig, type TrajectoryMergeStrategy, TransactionManager, type TransactionOperation, type TransactionResult, type TransitionEvent, type TransitionFilter, TransitionLedger, type TraversalActionType, type TraversalOptions, type TraversalResult, type TraversalStep, TypeIndex, type UpdateEntityInput, UpdateEntitySchema, type ValidatedPagination, ValidationError, type ValidationIssue, type ValidationReport, type ValidationResult$1 as ValidationResult, type ValidationWarning, type VectorSearchResult, VisibilityResolver, type VisualizeOptions, WORK_THREAD_ENTITY_TYPE, type WakeUpOptions, type WakeUpResult, type WeightedRelation, type WeightedTurn, type WildcardNode, type WorkThread, type WorkThreadFilter, WorkThreadManager, type WorkThreadStatus, type WorkerPoolConfig, WorkerPoolManager, WorkerTaskManager, type WorkerTaskManagerStats, type WorkingMemoryConfig, type WorkingMemoryEntity, WorkingMemoryManager, type WorkingMemoryOptions, WorldModelManager, type WorldModelManagerOptions, type WorldStateChange, type WorldStateEntity, WorldStateSnapshot, addUniqueTags, all, allRelationsValidMetadata, applyPagination, asWarning, batchProcess, batchProcessViaWorkers, buildTFVector, calculateIDF, calculateIDFFromTokenSets, calculateTF, calculateTFFromTokens, calculateTFIDF, calculateTextSimilarity, checkCancellation, chunkArray, cleanupAllCaches, clearAllSearchCaches, compress, compressFile, compressToBase64, computeEntropy, cosineSimilarity, createCustomProfile, createDetailedProgressReporter, createEmbeddingService, createMetadata, createObservableDataModelFromGraph, createProgress, createProgressInfo, createProgressReporter, createStorage, createStorageFromPath, createThrottledProgress, createUncompressedMetadata, createVectorStore, custom, customSync, debounce, decodeLegacyCheckpoint, decodeLegacyWorkThread, decodeProcedure, decompress, decompressFile, decompressFromBase64, defaultMemoryPath, email, ensureMemoryFilePath, entityExists, entityPassesFilters, entityToText, err, escapeCsvFormula, executeWithPhases, extractJson, extractToolName, filterByCreatedDate, filterByEntityType, filterByImportance, filterByModifiedDate, filterByTags, filterParallel, findEntitiesByNames, findEntityByName, fnv1aHash, formatErrorResponse, formatRawResponse, formatTextResponse, formatToolResponse, formatZodErrors, generateSuggestions, getAllCacheStats, getCompressionRatio, getCurrentTimestamp, getEntityIndex, getEntityNameSet, getPaginationMeta, getPoolStats, getQuickHint, getRoleProfile, getWorkerPoolManager, getWorkerTaskManager, globalMemoryMonitor, groupEntitiesByType, hasAllTags, hasBrotliExtension, hasConfidence, hasMatchingTag, isAgentEntity, isArtifactEntity, isBidirectionalRelation, isCurrentlyValid, isEpisodicMemory, isErr, isOk, isPrefixPattern, isProceduralMemory, isProfileEntity, isSemanticMemory, isSessionEntity, isTemporalRelation, isValidISODate, isWeightedRelation, isWithinDateRange, isWithinImportanceRange, isWorkingMemory, isoDate, l2Normalize, levenshteinDistance, listRoleProfiles, loadConfigFromEnv, logger, mapOk, mapParallel, matchesPhrase, matchesPrefix, max, maxItems, maxLength, mergeConfig, migrateLegacySessionCheckpoints, migrateLegacyWorkThreads, min, minItems, minLength, normalizeKey, normalizeTag, normalizeTags, ok, oneOf, paginate, paginateArray, parallelFilter, parallelLimit, parallelMap, parseDateRange, parsePaginationParams, passesEntropyFilter, pattern, permissionsForRole, processBatch, processBatchesWithProgress, processWithRetry, range, rateLimitedProcess, removeEntityByName, removeTags, required, resolveRoleProfile, sanitizeObject, searchCaches, shutdownParallelUtils, cosineSimilarity$1 as textCosineSimilarity, tokenize as textTokenize, throttle, tokenize$1 as tokenize, touchEntity, typeOf, unwrap, unwrapOr, url, validateArrayWithSchema, validateConfig, validateEntity, validateFilePath, validateImportance, validateNonEmpty, validateNonEmptyArray, validatePagination, validateRelation, validateRelationMetadata, validateRelationsMetadata, validateSafe, validateTags, validateWithSchema, when, withRetry };