/** * Memory provider registry for the evolution family. * Service Definition role; concrete providers register here. * @module @lmzhen/dsh-memory */ import { Context, Service } from '@deepseek-ai/cordis'; import type Schema from '@deepseek-ai/schemastery'; export type MemoryTarget = 'memory' | 'user'; /** Service config (V27 G6.3): pin one provider by name. */ export interface Config { /** Provider to use; empty = first registered provider (row order). */ provider?: string; } export interface MemoryOperation { action: 'add' | 'replace' | 'remove'; facts?: string | undefined; /** PLAN-R2 P2-6 (2026-09-16): content is an accepted alias honored by the * reference store (applyBatchCore resolves the pair through core's * `payloadText`, T3-06/A34); third-party providers may normalize it to their * own field. */ content?: string | undefined; old_text?: string | undefined; } export interface MemoryApplyResult { ok: boolean; message: string; entries: string[]; chars: number; limit: number; } /** Fired after ANY successful memory write (P2 fix): the snapshot refresh * moved to the registry sink so bypass paths (`/graph memory:`, background * review direct writes) also refresh the model-visible snapshot — not only * the foreground `memory` tool's write callback. */ export interface EvolutionMemoryAppliedEvent { target: MemoryTarget; chars: number; entries: number; } declare module '@deepseek-ai/cordis' { interface Events { /** * A memory write succeeded, on the registry's single sink (so bypass paths are covered). An * ANNOUNCEMENT: it reports the resulting size, it decides nothing (A98 / O-1). * @param event - the target that was written and its resulting char/entry counts. * @mode emit */ 'evolution/memory-applied'(event: EvolutionMemoryAppliedEvent): void; } } export interface MemorySnapshot { version: number; sha256: string; memory: string[]; user: string[]; } export interface MemoryProvider { readonly name: string; read(target: MemoryTarget): Promise; applyBatch(target: MemoryTarget, operations: MemoryOperation[]): Promise; snapshot(): Promise; renderContext(): Promise; } declare module '@deepseek-ai/cordis' { interface Context { memory: MemoryRegistry; } } export declare class MemoryRegistry extends Service { /** * V27 G6.3: the same provider-pin contract the io/state seams use. Before * this, every delegation called `provider()` with no name, so with two * providers mounted the session-visible store was decided by ROW ORDER while * `memory-files.providerName` renamed a registration nothing selected — a * config no consumer read. Empty keeps the old behavior (first registered). */ static Config: Schema; private readonly providers; /** Dispose handles by provider name, so a stale handle cannot remove a newer registration. */ private readonly disposals; private readonly providerName; private pinWarned; constructor(ctx: Context, config?: Config); registerProvider(provider: MemoryProvider): () => void; /** Configured provider: the pinned name, or the first registered one. */ private selected; /** 0.3.17 (E-73): named lookup like the io/state-storage registries; no * name = first registered (backward compatible). A named miss throws (F-333, * 0.3.23) instead of silently falling back to the first provider, so a wrong * name surfaces rather than writing to the wrong memory store. */ provider(name?: string): MemoryProvider; read(target: MemoryTarget): Promise; applyBatch(target: MemoryTarget, operations: MemoryOperation[]): Promise; /** V6-44 (0.3.37): test-support API — production consumers read the * model-visible context via `renderContext()`; snapshot() has no production * consumer (tests inspect the raw snapshot, kept by declaration). * @internal Exported for this package's own tests only. */ snapshot(): Promise; renderContext(): Promise; } export default MemoryRegistry; //# sourceMappingURL=index.d.ts.map