@fgv/ts-agent-memory 5.1.0-46 → 5.1.0-47
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/.rush/temp/{6e1299d1cebb080772163a532c221cd181b54f9f.tar.log → 5667e36f1c0cc503a5c20a3ebff76e7b9a702d41.tar.log} +8 -2
- package/.rush/temp/chunked-rush-logs/ts-agent-memory.build.chunks.jsonl +2 -2
- package/.rush/temp/operation/build/all.log +2 -2
- package/.rush/temp/operation/build/log-chunks.jsonl +2 -2
- package/.rush/temp/operation/build/state.json +1 -1
- package/README.md +55 -0
- package/dist/packlets/ingest/orchestrator.js +104 -19
- package/dist/packlets/ingest/orchestrator.js.map +1 -1
- package/dist/packlets/store/fileTreeMemoryStore.js +11 -4
- package/dist/packlets/store/fileTreeMemoryStore.js.map +1 -1
- package/dist/test/unit/ingest/dedupScope.test.js +434 -0
- package/dist/test/unit/ingest/dedupScope.test.js.map +1 -0
- package/dist/test/unit/ingest/orchestrator.test.js +7 -4
- package/dist/test/unit/ingest/orchestrator.test.js.map +1 -1
- package/dist/test/unit/tools/memoryTools.test.js +1 -0
- package/dist/test/unit/tools/memoryTools.test.js.map +1 -1
- package/dist/ts-agent-memory.d.ts +92 -5
- package/etc/ts-agent-memory.api.md +2 -0
- package/lib/packlets/ingest/orchestrator.d.ts +62 -5
- package/lib/packlets/ingest/orchestrator.d.ts.map +1 -1
- package/lib/packlets/ingest/orchestrator.js +104 -19
- package/lib/packlets/ingest/orchestrator.js.map +1 -1
- package/lib/packlets/store/fileTreeMemoryStore.d.ts +31 -1
- package/lib/packlets/store/fileTreeMemoryStore.d.ts.map +1 -1
- package/lib/packlets/store/fileTreeMemoryStore.js +11 -4
- package/lib/packlets/store/fileTreeMemoryStore.js.map +1 -1
- package/lib/test/unit/ingest/dedupScope.test.d.ts +2 -0
- package/lib/test/unit/ingest/dedupScope.test.d.ts.map +1 -0
- package/lib/test/unit/ingest/dedupScope.test.js +436 -0
- package/lib/test/unit/ingest/dedupScope.test.js.map +1 -0
- package/lib/test/unit/ingest/orchestrator.test.js +7 -4
- package/lib/test/unit/ingest/orchestrator.test.js.map +1 -1
- package/lib/test/unit/tools/memoryTools.test.js +1 -0
- package/lib/test/unit/tools/memoryTools.test.js.map +1 -1
- package/package.json +7 -7
- package/rush-logs/ts-agent-memory.build.cache.log +1 -1
- package/rush-logs/ts-agent-memory.build.log +2 -2
- package/src/packlets/ingest/orchestrator.ts +116 -21
- package/src/packlets/store/fileTreeMemoryStore.ts +40 -2
- package/src/test/unit/ingest/dedupScope.test.ts +542 -0
- package/src/test/unit/ingest/orchestrator.test.ts +4 -0
- package/src/test/unit/tools/memoryTools.test.ts +1 -0
- package/temp/build/lint/_eslint-5eVG3S6w.json +9 -5
- package/temp/build/typescript/ts_8nwakTlr.json +1 -1
- package/temp/ts-agent-memory.api.json +97 -0
- package/temp/ts-agent-memory.api.md +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memoryTools.test.js","sourceRoot":"","sources":["../../../../src/test/unit/tools/memoryTools.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2026 Erik Fortune\n * SPDX-License-Identifier: MIT\n */\n\nimport '@fgv/ts-utils-jest';\nimport { Converter, Converters, Result, fail, succeed } from '@fgv/ts-utils';\nimport { FileTree, JsonObject } from '@fgv/ts-json-base';\nimport { AiAssist } from '@fgv/ts-extras';\nimport {\n AdmissionDecision,\n BodyConverterRegistry,\n DEFAULT_MEMORY_TOOLS,\n EntityId,\n FileTreeMemoryStore,\n HybridRetriever,\n IBodyConverterRegistry,\n IEdgeTarget,\n IIdentityCodec,\n IIndexedMemoryRecord,\n IMemoryRecord,\n IMemoryStore,\n IMemoryToolResultItem,\n IMemoryWriteResult,\n IWritePolicy,\n Kind,\n KnowledgeIdentityCodec,\n LinkTraversalRetriever,\n MemoryIndex,\n IIdentityCodecResult,\n MemoryScopeKey,\n MemoryToolName,\n MtmIdentityCodec,\n RecencyRetriever,\n ScoreUnionMergeStrategy,\n StructuredFilterRetriever,\n TagRetriever,\n createMemoryTools,\n envelopeConverter\n} from '../../../index';\n\nconst knowledgeKind: Kind = 'knowledge' as Kind;\nconst mtmKind: Kind = 'mtm' as Kind;\n\n// ---------------------------------------------------------------------------\n// Fixtures\n// ---------------------------------------------------------------------------\n\nfunction mutableRoot(): FileTree.IMutableFileTreeDirectoryItem {\n const tree = FileTree.inMemory([], { mutable: true }).orThrow();\n const root = tree.getDirectory('/').orThrow();\n if (!FileTree.isMutableDirectoryItem(root)) {\n throw new Error('expected a mutable root directory');\n }\n return root;\n}\n\nfunction registryWith(\n entries: ReadonlyArray<{ kind: Kind; converter?: Converter<string> }>\n): IBodyConverterRegistry {\n const registry = BodyConverterRegistry.create().orThrow();\n for (const entry of entries) {\n registry.register(entry.kind, entry.converter ?? Converters.string);\n }\n return registry;\n}\n\nconst codecs: ReadonlyMap<Kind, IIdentityCodec> = new Map<Kind, IIdentityCodec>([\n [knowledgeKind, new KnowledgeIdentityCodec()],\n [mtmKind, new MtmIdentityCodec()]\n]);\n\n/** A write policy that always rejects — exercises the admit-reject → fail path. */\nclass RejectingPolicy implements IWritePolicy {\n public readonly mutableFields: ReadonlyArray<string> = ['body'];\n public admit(): Result<AdmissionDecision> {\n return succeed({ decision: 'reject', reason: 'blocked by test policy' });\n }\n public applyUpdate(existing: IMemoryRecord<unknown>): Result<IMemoryRecord<unknown>> {\n return succeed(existing);\n }\n}\n\nfunction makeStore(\n params: {\n registry?: IBodyConverterRegistry;\n writePolicies?: ReadonlyMap<Kind, IWritePolicy>;\n } = {}\n): FileTreeMemoryStore {\n return FileTreeMemoryStore.create({\n root: mutableRoot(),\n registry: params.registry ?? registryWith([{ kind: knowledgeKind }, { kind: mtmKind }]),\n codecs,\n writePolicies: params.writePolicies\n }).orThrow();\n}\n\ninterface IEntrySpec {\n readonly id: string;\n readonly scope?: string;\n readonly kind?: string;\n readonly entityId?: string;\n readonly tags?: ReadonlyArray<string>;\n readonly updated?: number;\n readonly links?: ReadonlyArray<string>;\n}\n\nfunction makeEntry(spec: IEntrySpec): IIndexedMemoryRecord {\n const record: IMemoryRecord<unknown> = {\n envelope: envelopeConverter\n .convert({\n id: spec.id,\n entityId: spec.entityId ?? spec.id,\n kind: spec.kind ?? 'knowledge',\n tags: spec.tags ?? [],\n links: (spec.links ?? []).map((target) => ({\n type: 'rel',\n target: { scope: spec.scope ?? 'knowledge', id: target }\n })),\n created: 0,\n updated: spec.updated ?? 0,\n seq: 0,\n contentHash: 'h',\n provenance: { source: 'agent' }\n })\n .orThrow(),\n body: `body-${spec.id}`\n };\n return { scope: (spec.scope ?? 'knowledge') as MemoryScopeKey, record };\n}\n\nfunction makeIndex(specs: ReadonlyArray<IEntrySpec>): MemoryIndex {\n const index = MemoryIndex.create().orThrow();\n index.rebuild(specs.map(makeEntry)).orThrow();\n return index;\n}\n\n/**\n * A HybridRetriever (structured + tag) over the given entries — the seedless\n * `memory_search` backing. A bare `LinkTraversalRetriever` is intentionally NOT\n * composed here: it hard-fails a seedless query, so link traversal is the\n * separate `memory_context` retriever.\n */\nfunction makeRetriever(specs: ReadonlyArray<IEntrySpec>): HybridRetriever {\n const index = makeIndex(specs);\n return HybridRetriever.create(\n [\n RecencyRetriever.create(index).orThrow(),\n StructuredFilterRetriever.create(index).orThrow(),\n TagRetriever.create(index).orThrow()\n ],\n ScoreUnionMergeStrategy.create().orThrow()\n ).orThrow();\n}\n\n/** A LinkTraversalRetriever over the given entries — the `memory_context` backing. */\nfunction makeLinkRetriever(specs: ReadonlyArray<IEntrySpec>): LinkTraversalRetriever {\n return LinkTraversalRetriever.create(makeIndex(specs)).orThrow();\n}\n\n/** Build the full five-tool suite for structural / annotation inspection. */\nfunction allTools(\n overrides: Partial<Parameters<typeof createMemoryTools>[0]> = {}\n): ReadonlyArray<AiAssist.IAiClientTool> {\n return createMemoryTools({\n store: overrides.store ?? makeStore(),\n retriever: overrides.retriever ?? makeRetriever([]),\n registry: overrides.registry ?? registryWith([{ kind: knowledgeKind }, { kind: mtmKind }]),\n codecs,\n tools: ['memory_write', 'memory_read', 'memory_search', 'memory_context', 'memory_delete'],\n ...overrides\n });\n}\n\nfunction toolByName(\n tools: ReadonlyArray<AiAssist.IAiClientTool>,\n name: MemoryToolName\n): AiAssist.IAiClientTool {\n const tool = tools.find((t) => t.config.name === name);\n if (tool === undefined) {\n throw new Error(`tool '${name}' not found`);\n }\n return tool;\n}\n\n/** The property names declared by a tool's JSON-schema. */\nfunction schemaProperties(tool: AiAssist.IAiClientTool): string[] {\n const json = tool.config.parametersSchema.toJson() as JsonObject;\n return Object.keys((json.properties as JsonObject) ?? {});\n}\n\n// ---------------------------------------------------------------------------\n// Tests\n// ---------------------------------------------------------------------------\n\ndescribe('createMemoryTools', () => {\n describe('tool subset selection', () => {\n test('defaults to the read-only set (excludes memory_write / memory_delete)', () => {\n const tools = createMemoryTools({\n store: makeStore(),\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }])\n });\n expect(tools.map((t) => t.config.name)).toEqual(['memory_search', 'memory_context']);\n expect(DEFAULT_MEMORY_TOOLS).toEqual(['memory_search', 'memory_context']);\n });\n\n test('includes memory_write / memory_delete only when named', () => {\n const tools = createMemoryTools({\n store: makeStore(),\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_write', 'memory_delete']\n });\n expect(tools.map((t) => t.config.name)).toEqual(['memory_write', 'memory_delete']);\n });\n\n test('returns tools in a stable builder order regardless of selection order', () => {\n const tools = createMemoryTools({\n store: makeStore(),\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_delete', 'memory_search', 'memory_write']\n });\n expect(tools.map((t) => t.config.name)).toEqual(['memory_write', 'memory_search', 'memory_delete']);\n });\n\n test('an empty selection yields no tools', () => {\n const tools = createMemoryTools({\n store: makeStore(),\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n tools: []\n });\n expect(tools).toEqual([]);\n });\n });\n\n describe('scope isolation (adoption gate)', () => {\n test('NO tool schema declares a scope (or scope-widening) property', () => {\n const tools = allTools();\n expect(tools).toHaveLength(5);\n for (const tool of tools) {\n const props = schemaProperties(tool);\n expect(props.length).toBeGreaterThan(0);\n for (const prop of props) {\n expect(prop.toLowerCase()).not.toContain('scope');\n }\n }\n });\n });\n\n describe('behavior annotations (Component 4)', () => {\n test('read-only tools are readOnlyHint with openWorldHint false', () => {\n const tools = allTools();\n for (const name of ['memory_search', 'memory_context', 'memory_read'] as const) {\n expect(toolByName(tools, name).config.annotations).toEqual({\n readOnlyHint: true,\n openWorldHint: false\n });\n }\n });\n\n test('memory_write is non-destructive, non-idempotent, closed-world', () => {\n expect(toolByName(allTools(), 'memory_write').config.annotations).toEqual({\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: false\n });\n });\n\n test('memory_delete is destructive, idempotent, closed-world', () => {\n expect(toolByName(allTools(), 'memory_delete').config.annotations).toEqual({\n destructiveHint: true,\n idempotentHint: true,\n openWorldHint: false\n });\n });\n });\n\n describe('parametersSchema validation', () => {\n test('memory_write accepts a well-formed record and rejects a missing body', () => {\n const schema = toolByName(allTools(), 'memory_write').config.parametersSchema;\n expect(schema.convert({ kind: 'knowledge', entityId: 'doc-1', body: 'hello' })).toSucceed();\n expect(\n schema.convert({\n kind: 'knowledge',\n entityId: 'doc-1',\n body: 'hello',\n tags: ['a'],\n links: [{ type: 'rel', target: { id: 'doc-2' }, confidence: 0.5 }]\n })\n ).toSucceed();\n expect(\n schema.convert({\n kind: 'knowledge',\n entityId: 'doc-1',\n body: 'hello',\n links: [{ type: 'rel', target: { scope: 'conversations/other', id: 'turn-1' } }]\n })\n ).toSucceed();\n expect(schema.convert({ kind: 'knowledge', entityId: 'doc-1' })).toFail();\n // A bare-string target (the pre-scoped format) is rejected at the schema.\n expect(\n schema.convert({\n kind: 'knowledge',\n entityId: 'doc-1',\n body: 'x',\n links: [{ type: 'rel', target: 'doc-2' }]\n })\n ).toFail();\n });\n\n test('memory_read / memory_delete require kind and entityId', () => {\n for (const name of ['memory_read', 'memory_delete'] as const) {\n const schema = toolByName(allTools(), name).config.parametersSchema;\n expect(schema.convert({ kind: 'knowledge', entityId: 'doc-1' })).toSucceed();\n expect(schema.convert({ kind: 'knowledge' })).toFail();\n }\n });\n\n test('memory_search rejects a non-integer limit and accepts an all-optional query', () => {\n const schema = toolByName(allTools(), 'memory_search').config.parametersSchema;\n expect(schema.convert({})).toSucceed();\n expect(schema.convert({ tag: 'x', limit: 3 })).toSucceed();\n expect(schema.convert({ limit: 'three' })).toFail();\n });\n\n test('memory_context requires a from seed with a REQUIRED scope (nested { id, scope })', () => {\n const schema = toolByName(allTools(), 'memory_context').config.parametersSchema;\n expect(schema.convert({ from: { id: 'doc-1', scope: 'knowledge' } })).toSucceed();\n // scope is schema-REQUIRED (unlike a write link target) — the wire schema must\n // not advertise an optionality the tool does not honor. Omitting it fails.\n expect(schema.convert({ from: { id: 'doc-1' } })).toFail();\n expect(schema.convert({ hops: 2 })).toFail();\n // A bare-string seed (the pre-scoped format) is rejected at the schema.\n expect(schema.convert({ from: 'doc-1' })).toFail();\n });\n\n test('the memory_context wire schema marks from.scope as required', () => {\n // Guards the schema-accuracy contract at the wire level: an LLM reading the\n // tool's `parameters` sees scope in the seed's `required` array.\n const schema = toolByName(allTools(), 'memory_context').config.parametersSchema;\n const wire = schema.toJson() as unknown as {\n properties: { from: { required?: ReadonlyArray<string> } };\n };\n expect(wire.properties.from.required).toContain('scope');\n });\n });\n\n describe('memory_write', () => {\n async function write(\n tool: AiAssist.IAiClientTool,\n args: Record<string, unknown>\n ): Promise<Result<unknown>> {\n return tool.execute(args);\n }\n\n test('writes a new record (outcome: written) and round-trips through memory_read', async () => {\n const store = makeStore();\n const tools = createMemoryTools({\n store,\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_write', 'memory_read']\n });\n const writeTool = toolByName(tools, 'memory_write');\n expect(\n await write(writeTool, { kind: 'knowledge', entityId: 'doc-1', body: 'first', tags: ['t'] })\n ).toSucceedAndSatisfy((value) => {\n const result = value as IMemoryWriteResult;\n expect(result.outcome).toBe('written');\n expect(result.id).toBe('doc-1');\n expect(result.entityId).toBe('doc-1');\n });\n expect(\n await toolByName(tools, 'memory_read').execute({ kind: 'knowledge', entityId: 'doc-1' })\n ).toSucceedAndSatisfy((value) => {\n const read = value as { found: boolean; item: IMemoryToolResultItem };\n expect(read.found).toBe(true);\n expect(read.item.body).toBe('first');\n expect(read.item.tags).toEqual(['t']);\n });\n });\n\n test('persists authored links (with confidence) on the written record', async () => {\n const store = makeStore();\n const tools = createMemoryTools({\n store,\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_write', 'memory_read']\n });\n expect(\n await toolByName(tools, 'memory_write').execute({\n kind: 'knowledge',\n entityId: 'doc-1',\n body: 'linked',\n links: [\n // scope omitted → defaults to the writing record's own scope (knowledge)\n { type: 'rel', target: { id: 'doc-2' }, confidence: 0.9 },\n { type: 'rel', target: { id: 'doc-3' } }\n ]\n })\n ).toSucceedAndSatisfy((v) => expect((v as IMemoryWriteResult).outcome).toBe('written'));\n // The persisted links carry the writing record's scope on each target.\n expect(await store.get(knowledgeKind, 'doc-1' as EntityId)).toSucceedAndSatisfy((rec) => {\n expect(rec?.envelope.links).toEqual([\n { type: 'rel', target: { scope: 'knowledge', id: 'doc-2' }, confidence: 0.9 },\n { type: 'rel', target: { scope: 'knowledge', id: 'doc-3' } }\n ]);\n });\n });\n\n test('an authored link with an EXPLICIT scope is honored verbatim (cross-scope edge)', async () => {\n const store = makeStore();\n const tools = createMemoryTools({\n store,\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_write']\n });\n expect(\n await toolByName(tools, 'memory_write').execute({\n kind: 'knowledge',\n entityId: 'doc-1',\n body: 'cross',\n links: [{ type: 'mtm-ref', target: { scope: 'conversations/conv-a', id: 'turn-3' } }]\n })\n ).toSucceed();\n expect(await store.get(knowledgeKind, 'doc-1' as EntityId)).toSucceedAndSatisfy((rec) => {\n expect(rec?.envelope.links).toEqual([\n { type: 'mtm-ref', target: { scope: 'conversations/conv-a', id: 'turn-3' } }\n ]);\n });\n });\n\n test('an identical re-put of the same entity is a dedup no-op (outcome: deduped)', async () => {\n const store = makeStore();\n const tool = toolByName(allTools({ store }), 'memory_write');\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'same' })).toSucceedAndSatisfy(\n (v) => expect((v as IMemoryWriteResult).outcome).toBe('written')\n );\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'same' })).toSucceedAndSatisfy(\n (v) => expect((v as IMemoryWriteResult).outcome).toBe('deduped')\n );\n });\n\n test('content-scope dedup under a different entity reports deduped', async () => {\n const store = makeStore();\n const tool = toolByName(allTools({ store }), 'memory_write');\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-a', body: 'shared' })).toSucceed();\n // Knowledge dedups scope-wide: identical body under a different docId is a no-op\n // that returns the existing (different-entity) record.\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-b', body: 'shared' })).toSucceedAndSatisfy(\n (v) => expect((v as IMemoryWriteResult).outcome).toBe('deduped')\n );\n });\n\n test('an update with new content reports written', async () => {\n const store = makeStore();\n const tool = toolByName(allTools({ store }), 'memory_write');\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'v1' })).toSucceed();\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'v2' })).toSucceedAndSatisfy(\n (v) => expect((v as IMemoryWriteResult).outcome).toBe('written')\n );\n });\n\n test('maps an MTM composite entityId to its turn stem', async () => {\n const store = makeStore();\n const tools = createMemoryTools({\n store,\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }, { kind: mtmKind }]),\n codecs,\n tools: ['memory_write', 'memory_read']\n });\n expect(\n await toolByName(tools, 'memory_write').execute({\n kind: 'mtm',\n entityId: 'conv-1:7',\n body: 'turn body'\n })\n ).toSucceedAndSatisfy((value) => {\n const result = value as IMemoryWriteResult;\n expect(result.id).toBe('turn-7');\n expect(result.entityId).toBe('conv-1:7');\n });\n // Read back via the same composite entityId.\n expect(\n await toolByName(tools, 'memory_read').execute({ kind: 'mtm', entityId: 'conv-1:7' })\n ).toSucceedAndSatisfy((value) => {\n expect((value as { found: boolean }).found).toBe(true);\n });\n });\n\n test('a body the kind converter rejects fails the write', async () => {\n const rejectBad: Converter<string> = Converters.string.map((s) =>\n s === 'BAD' ? fail('body not allowed') : succeed(s)\n );\n const registry = registryWith([{ kind: knowledgeKind, converter: rejectBad }]);\n const store = makeStore({ registry });\n const tool = toolByName(allTools({ store, registry }), 'memory_write');\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'BAD' })).toFailWith(\n /invalid body|body not allowed/i\n );\n });\n\n test('a policy admit-reject surfaces as a failure', async () => {\n const store = makeStore({\n writePolicies: new Map<Kind, IWritePolicy>([[knowledgeKind, new RejectingPolicy()]])\n });\n const tool = toolByName(allTools({ store }), 'memory_write');\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'x' })).toFailWith(\n /rejected by policy|blocked by test policy/i\n );\n });\n\n test('fails when no codec is available for the kind', async () => {\n const store = makeStore();\n const tool = toolByName(\n createMemoryTools({\n store,\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n tools: ['memory_write'] // no codecs / defaultCodec supplied\n }),\n 'memory_write'\n );\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'x' })).toFailWith(\n /no identity codec available/i\n );\n });\n\n test('rejects a kind with no registered converter', async () => {\n const tool = toolByName(allTools(), 'memory_write');\n expect(await write(tool, { kind: 'unregistered', entityId: 'doc-1', body: 'x' })).toFailWith(\n /no registered body converter/i\n );\n });\n\n test('rejects a kind outside the kinds whitelist', async () => {\n const tool = toolByName(allTools({ kinds: [mtmKind] }), 'memory_write');\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'x' })).toFailWith(\n /not enabled for memory tools/i\n );\n });\n\n test('propagates a store.get failure (does not mask a real fault as a fresh write)', async () => {\n const failingStore: IMemoryStore = {\n get: async () => fail('disk fault'),\n getById: async () => fail('unused'),\n list: async () => succeed([]),\n listScoped: async () => succeed([]),\n asRecordSource: () => ({ list: async () => succeed([]) }),\n put: async (record) => succeed(record),\n delete: async () => fail('unused')\n };\n const tool = toolByName(\n createMemoryTools({\n store: failingStore,\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_write']\n }),\n 'memory_write'\n );\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'x' })).toFailWith(\n /disk fault/i\n );\n });\n\n test('rejects a versioned/temporal kind', async () => {\n const versionedCodec: IIdentityCodec = {\n encode: (entityId): Result<IIdentityCodecResult> =>\n succeed({ scope: 'knowledge' as MemoryScopeKey, idStem: entityId as string, isVersioned: true }),\n decode: (): Result<never> => fail('unused'),\n verifyRoundTrip: (): Result<true> => succeed(true)\n };\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs: new Map<Kind, IIdentityCodec>([[knowledgeKind, versionedCodec]]),\n tools: ['memory_write']\n }),\n 'memory_write'\n );\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'x' })).toFailWith(\n /versioned\\/temporal kind .* is not supported/i\n );\n });\n\n test('rejects malformed arguments', async () => {\n const tool = toolByName(allTools(), 'memory_write');\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1' })).toFailWith(/invalid arguments/i);\n });\n });\n\n describe('memory_read', () => {\n test('returns found:false when the record is absent', async () => {\n const tool = toolByName(allTools(), 'memory_read');\n expect(await tool.execute({ kind: 'knowledge', entityId: 'missing' })).toSucceedWith({ found: false });\n });\n\n test('applies the handleFor hook to the returned item', async () => {\n const store = makeStore();\n const tools = createMemoryTools({\n store,\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_write', 'memory_read'],\n handleFor: (r) => `mnemonic:${r.envelope.id}`\n });\n await toolByName(tools, 'memory_write').execute({ kind: 'knowledge', entityId: 'doc-1', body: 'b' });\n expect(\n await toolByName(tools, 'memory_read').execute({ kind: 'knowledge', entityId: 'doc-1' })\n ).toSucceedAndSatisfy((value) => {\n const read = value as { found: boolean; item: IMemoryToolResultItem };\n expect(read.item.handle).toBe('mnemonic:doc-1');\n });\n });\n\n test('propagates a store failure (bad entityId)', async () => {\n const tool = toolByName(allTools(), 'memory_read');\n expect(await tool.execute({ kind: 'knowledge', entityId: ' ' })).toFail();\n });\n });\n\n describe('memory_search', () => {\n test('returns projected results keyed by raw MemoryId when no handleFor is supplied', async () => {\n const retriever = makeRetriever([\n { id: 'doc-1', tags: ['topic'] },\n { id: 'doc-2', tags: ['topic'] }\n ]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }])\n }),\n 'memory_search'\n );\n expect(await tool.execute({ tag: 'topic' })).toSucceedAndSatisfy((value) => {\n const out = value as { count: number; results: ReadonlyArray<IMemoryToolResultItem> };\n expect(out.count).toBe(2);\n expect(out.results.map((r) => r.handle).sort()).toEqual(['doc-1', 'doc-2']);\n });\n });\n\n test('uses the host handle (mnemonic) as the agent-visible key when handleFor is supplied', async () => {\n const retriever = makeRetriever([{ id: 'doc-1', tags: ['topic'] }]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }]),\n handleFor: (r) => `@${r.envelope.id}`\n }),\n 'memory_search'\n );\n expect(await tool.execute({ tag: 'topic', limit: 5 })).toSucceedAndSatisfy((value) => {\n const out = value as { results: ReadonlyArray<IMemoryToolResultItem> };\n expect(out.results[0].handle).toBe('@doc-1');\n });\n });\n\n test('falls back to the raw id when a throwing handleFor would otherwise escape', async () => {\n const retriever = makeRetriever([{ id: 'doc-1', tags: ['topic'] }]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }]),\n handleFor: () => {\n throw new Error('host handle hook blew up');\n }\n }),\n 'memory_search'\n );\n // A throwing host callback must not crash the search; the item degrades to the raw id.\n expect(await tool.execute({ tag: 'topic', limit: 5 })).toSucceedAndSatisfy((value) => {\n const out = value as { results: ReadonlyArray<IMemoryToolResultItem> };\n expect(out.results[0].handle).toBe('doc-1');\n });\n });\n\n test('loud-degrades on the unwired semantic axis', async () => {\n const retriever = makeRetriever([{ id: 'doc-1' }]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }])\n }),\n 'memory_search'\n );\n expect(await tool.execute({ semantic: 'find me' })).toFailWith(\n /semantic recall requires a vector index/i\n );\n });\n\n test('rejects a kind outside the kinds whitelist', async () => {\n const retriever = makeRetriever([{ id: 'doc-1' }]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }]),\n kinds: [knowledgeKind]\n }),\n 'memory_search'\n );\n expect(await tool.execute({ kind: 'mtm' })).toFailWith(/no registered body converter|not enabled/i);\n });\n\n test('filters by a validated kind', async () => {\n const retriever = makeRetriever([\n { id: 'doc-1', kind: 'knowledge' },\n { id: 'turn-0', kind: 'mtm', scope: 'conversations/conv-1' }\n ]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }, { kind: mtmKind }])\n }),\n 'memory_search'\n );\n expect(await tool.execute({ kind: 'knowledge' })).toSucceedAndSatisfy((value) => {\n const out = value as { results: ReadonlyArray<IMemoryToolResultItem> };\n expect(out.results.map((r) => r.handle)).toEqual(['doc-1']);\n });\n });\n\n test('rejects malformed arguments', async () => {\n const tool = toolByName(allTools(), 'memory_search');\n expect(await tool.execute({ limit: 'nope' })).toFailWith(/invalid arguments/i);\n });\n });\n\n describe('memory_context', () => {\n test('returns the neighbors reachable from a seed', async () => {\n const retriever = makeLinkRetriever([\n { id: 'a', links: ['b', 'c'] },\n { id: 'b', updated: 20 },\n { id: 'c', updated: 10 }\n ]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }])\n }),\n 'memory_context'\n );\n expect(await tool.execute({ from: { id: 'a', scope: 'knowledge' } })).toSucceedAndSatisfy((value) => {\n const out = value as {\n seed: IEdgeTarget;\n count: number;\n results: ReadonlyArray<IMemoryToolResultItem>;\n };\n expect(out.seed).toEqual({ scope: 'knowledge', id: 'a' });\n expect(out.results.map((r) => r.handle)).toEqual(['b', 'c']);\n });\n });\n\n test('honors hops, kind, tag, and limit filters', async () => {\n const retriever = makeLinkRetriever([\n { id: 'a', links: ['b'] },\n { id: 'b', links: ['c'], tags: ['keep'] },\n { id: 'c', tags: ['keep'] }\n ]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }])\n }),\n 'memory_context'\n );\n expect(\n await tool.execute({\n from: { id: 'a', scope: 'knowledge' },\n hops: 2,\n tag: 'keep',\n kind: 'knowledge',\n limit: 5\n })\n ).toSucceedAndSatisfy((value) => {\n const out = value as { results: ReadonlyArray<IMemoryToolResultItem> };\n expect(out.results.map((r) => r.handle).sort()).toEqual(['b', 'c']);\n });\n });\n\n test('rejects an invalid seed id', async () => {\n const tool = toolByName(allTools(), 'memory_context');\n expect(await tool.execute({ from: { id: 'a/b', scope: 'knowledge' } })).toFail();\n });\n\n test('fails at the schema when the seed omits its required scope', async () => {\n // scope is schema-required, so an omitted scope is rejected as an invalid\n // argument (the wire schema and the runtime contract agree — no lie).\n const tool = toolByName(allTools(), 'memory_context');\n expect(await tool.execute({ from: { id: 'a' } })).toFailWith(/invalid arguments/i);\n });\n\n test('a scoped seed reaches ONLY the correctly-scoped graph', async () => {\n // Two conversations reuse the stem `turn-0`; each links a same-scope `turn-1`.\n // Seeding conv-a must reach conv-a's turn-1 and NEVER conv-b's.\n const retriever = makeLinkRetriever([\n { id: 'turn-0', scope: 'conversations/conv-a', links: ['turn-1'] },\n { id: 'turn-1', scope: 'conversations/conv-a', tags: ['in-a'] },\n { id: 'turn-0', scope: 'conversations/conv-b', links: ['turn-1'] },\n { id: 'turn-1', scope: 'conversations/conv-b', tags: ['in-b'] }\n ]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }])\n }),\n 'memory_context'\n );\n expect(\n await tool.execute({ from: { id: 'turn-0', scope: 'conversations/conv-a' } })\n ).toSucceedAndSatisfy((value) => {\n const out = value as { results: ReadonlyArray<IMemoryToolResultItem> };\n expect(out.results).toHaveLength(1);\n expect(out.results[0].tags).toEqual(['in-a']);\n });\n });\n\n test('rejects malformed arguments', async () => {\n const tool = toolByName(allTools(), 'memory_context');\n expect(await tool.execute({ hops: 1 })).toFailWith(/invalid arguments/i);\n });\n });\n\n describe('memory_delete', () => {\n test('deletes an existing record', async () => {\n const store = makeStore();\n const tools = createMemoryTools({\n store,\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_write', 'memory_delete', 'memory_read']\n });\n await toolByName(tools, 'memory_write').execute({ kind: 'knowledge', entityId: 'doc-1', body: 'b' });\n expect(\n await toolByName(tools, 'memory_delete').execute({ kind: 'knowledge', entityId: 'doc-1' })\n ).toSucceedWith({ deleted: true, id: 'doc-1', entityId: 'doc-1', kind: 'knowledge' });\n expect(\n await toolByName(tools, 'memory_read').execute({ kind: 'knowledge', entityId: 'doc-1' })\n ).toSucceedWith({ found: false });\n });\n\n test('propagates a store failure when the record is absent', async () => {\n const tool = toolByName(allTools(), 'memory_delete');\n expect(await tool.execute({ kind: 'knowledge', entityId: 'missing' })).toFailWith(/no record found/i);\n });\n\n test('rejects a kind outside the whitelist', async () => {\n const tool = toolByName(allTools({ kinds: [knowledgeKind] }), 'memory_delete');\n expect(await tool.execute({ kind: 'mtm', entityId: 'conv-1:0' })).toFailWith(/not enabled/i);\n });\n\n test('rejects malformed arguments', async () => {\n const tool = toolByName(allTools(), 'memory_delete');\n expect(await tool.execute({ kind: 'knowledge' })).toFailWith(/invalid arguments/i);\n });\n });\n});\n\ndescribe('result projection (projectItem host projector + detail tier)', () => {\n interface ISearchOut {\n readonly count: number;\n readonly results: ReadonlyArray<IMemoryToolResultItem>;\n }\n\n /**\n * A host projector that bounds the `'gist'` body to a sentinel and passes the\n * full body through only for `'full'` — the shape a real host uses to keep the\n * default (gist) path bounded.\n */\n const boundingProjector = (\n record: IMemoryRecord<unknown>,\n detail: 'gist' | 'full'\n ): IMemoryToolResultItem => ({\n handle: `h:${record.envelope.id}`,\n kind: record.envelope.kind,\n entityId: record.envelope.entityId,\n tags: record.envelope.tags,\n body: detail === 'full' ? record.body : '<<gist>>'\n });\n\n function searchToolWith(\n overrides: Partial<Parameters<typeof createMemoryTools>[0]>\n ): AiAssist.IAiClientTool {\n return toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever: makeRetriever([{ id: 'doc-1', tags: ['topic'] }]),\n registry: registryWith([{ kind: knowledgeKind }]),\n ...overrides\n }),\n 'memory_search'\n );\n }\n\n describe('schema surface', () => {\n test('memory_search declares optional detail + offset properties', () => {\n const props = schemaProperties(toolByName(allTools(), 'memory_search'));\n expect(props).toContain('detail');\n expect(props).toContain('offset');\n });\n\n test('memory_context declares an optional detail property', () => {\n const props = schemaProperties(toolByName(allTools(), 'memory_context'));\n expect(props).toContain('detail');\n });\n\n test('memory_read declares an optional detail property', () => {\n const props = schemaProperties(toolByName(allTools(), 'memory_read'));\n expect(props).toContain('detail');\n });\n\n test('memory_search accepts detail and offset, and rejects an out-of-enum detail', () => {\n const schema = toolByName(allTools(), 'memory_search').config.parametersSchema;\n expect(schema.convert({ detail: 'full', offset: 2 })).toSucceed();\n expect(schema.convert({ detail: 'gist' })).toSucceed();\n expect(schema.convert({ offset: 'nope' })).toFail();\n // detail is now an enum ('gist' | 'full') at the wire-schema level.\n expect(schema.convert({ detail: 'verbose' })).toFail();\n });\n });\n\n describe('absent projector = byte-identical default projection', () => {\n test('returns the full body and the default handle (raw id) when no projector is supplied', async () => {\n const tool = searchToolWith({});\n expect(await tool.execute({ tag: 'topic' })).toSucceedAndSatisfy((value) => {\n const out = value as ISearchOut;\n expect(out.results[0].handle).toBe('doc-1');\n expect(out.results[0].body).toBe('body-doc-1');\n });\n });\n\n test('the detail tier is inert without a projector (gist and full both yield the full body)', async () => {\n const tool = searchToolWith({});\n for (const detail of ['gist', 'full'] as const) {\n expect(await tool.execute({ tag: 'topic', detail })).toSucceedAndSatisfy((value) => {\n expect((value as ISearchOut).results[0].body).toBe('body-doc-1');\n });\n }\n });\n });\n\n describe('host projector + detail tier', () => {\n test('defaults to the bounded gist projection when detail is absent', async () => {\n const tool = searchToolWith({ projectItem: boundingProjector });\n expect(await tool.execute({ tag: 'topic' })).toSucceedAndSatisfy((value) => {\n const out = value as ISearchOut;\n expect(out.results[0].handle).toBe('h:doc-1');\n expect(out.results[0].body).toBe('<<gist>>');\n });\n });\n\n test('opts into the full body only when detail=full is requested', async () => {\n const tool = searchToolWith({ projectItem: boundingProjector });\n expect(await tool.execute({ tag: 'topic', detail: 'full' })).toSucceedAndSatisfy((value) => {\n expect((value as ISearchOut).results[0].body).toBe('body-doc-1');\n });\n });\n\n test('an out-of-enum detail is rejected at the schema boundary', async () => {\n // detail is a JsonSchema.enumOf(['gist','full']); the tool re-validates args\n // on execute, so an out-of-enum value fails loudly rather than reaching the projector.\n const tool = searchToolWith({ projectItem: boundingProjector });\n expect(await tool.execute({ tag: 'topic', detail: 'verbose' })).toFailWith(/invalid arguments/i);\n });\n\n test('an explicit detail=gist stays bounded (the non-full branch)', async () => {\n const tool = searchToolWith({ projectItem: boundingProjector });\n expect(await tool.execute({ tag: 'topic', detail: 'gist' })).toSucceedAndSatisfy((value) => {\n expect((value as ISearchOut).results[0].body).toBe('<<gist>>');\n });\n });\n\n test('memory_context routes its results through the host projector', async () => {\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever: makeLinkRetriever([{ id: 'a', links: ['b'] }, { id: 'b' }]),\n registry: registryWith([{ kind: knowledgeKind }]),\n projectItem: boundingProjector\n }),\n 'memory_context'\n );\n expect(\n await tool.execute({ from: { id: 'a', scope: 'knowledge' }, detail: 'full' })\n ).toSucceedAndSatisfy((value) => {\n const out = value as { results: ReadonlyArray<IMemoryToolResultItem> };\n expect(out.results.map((r) => r.handle)).toEqual(['h:b']);\n expect(out.results[0].body).toBe('body-b');\n });\n });\n\n test('a throwing host projector degrades to the default full-body projection (does not crash search)', async () => {\n const tool = searchToolWith({\n projectItem: () => {\n throw new Error('host projector blew up');\n }\n });\n expect(await tool.execute({ tag: 'topic' })).toSucceedAndSatisfy((value) => {\n const out = value as ISearchOut;\n // Degraded to the built-in default: raw-id handle + full body.\n expect(out.results[0].handle).toBe('doc-1');\n expect(out.results[0].body).toBe('body-doc-1');\n });\n });\n\n test('a throwing projector still honors the handleFor hook in the fallback path', async () => {\n const tool = searchToolWith({\n handleFor: (r) => `@${r.envelope.id}`,\n projectItem: () => {\n throw new Error('nope');\n }\n });\n expect(await tool.execute({ tag: 'topic' })).toSucceedAndSatisfy((value) => {\n expect((value as ISearchOut).results[0].handle).toBe('@doc-1');\n });\n });\n });\n\n describe('offset threading (memory_search)', () => {\n test('threads offset into the query to page the ordered result window', async () => {\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever: makeRetriever([\n { id: 'doc-1', tags: ['topic'], updated: 30 },\n { id: 'doc-2', tags: ['topic'], updated: 20 },\n { id: 'doc-3', tags: ['topic'], updated: 10 }\n ]),\n registry: registryWith([{ kind: knowledgeKind }])\n }),\n 'memory_search'\n );\n // Recency-ordered [doc-1, doc-2, doc-3]; offset 1 + limit 1 → [doc-2].\n expect(await tool.execute({ tag: 'topic', offset: 1, limit: 1 })).toSucceedAndSatisfy((value) => {\n const out = value as ISearchOut;\n expect(out.count).toBe(1);\n expect(out.results.map((r) => r.handle)).toEqual(['doc-2']);\n });\n });\n });\n\n describe('memory_read detail (explicit drill-in defaults to FULL)', () => {\n interface IReadOut {\n readonly found: boolean;\n readonly item: IMemoryToolResultItem;\n }\n\n async function readToolWith(\n projector?: (record: IMemoryRecord<unknown>, detail: 'gist' | 'full') => IMemoryToolResultItem\n ): Promise<AiAssist.IAiClientTool> {\n const tools = createMemoryTools({\n store: makeStore(),\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_write', 'memory_read'],\n ...(projector !== undefined ? { projectItem: projector } : {})\n });\n await toolByName(tools, 'memory_write').execute({\n kind: 'knowledge',\n entityId: 'doc-1',\n body: 'FULLBODY'\n });\n return toolByName(tools, 'memory_read');\n }\n\n test('defaults to the FULL body (drill-in) with a bounding projector', async () => {\n const tool = await readToolWith(boundingProjector);\n expect(await tool.execute({ kind: 'knowledge', entityId: 'doc-1' })).toSucceedAndSatisfy((value) => {\n expect((value as IReadOut).item.body).toBe('FULLBODY');\n });\n });\n\n test('opts down to gist only when detail=gist is requested', async () => {\n const tool = await readToolWith(boundingProjector);\n expect(\n await tool.execute({ kind: 'knowledge', entityId: 'doc-1', detail: 'gist' })\n ).toSucceedAndSatisfy((value) => {\n expect((value as IReadOut).item.body).toBe('<<gist>>');\n });\n });\n\n test('is byte-identical for a no-projector consumer (full body regardless of detail)', async () => {\n const tool = await readToolWith(undefined);\n for (const args of [\n { kind: 'knowledge', entityId: 'doc-1' },\n { kind: 'knowledge', entityId: 'doc-1', detail: 'gist' }\n ]) {\n expect(await tool.execute(args)).toSucceedAndSatisfy((value) => {\n expect((value as IReadOut).item.body).toBe('FULLBODY');\n });\n }\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"memoryTools.test.js","sourceRoot":"","sources":["../../../../src/test/unit/tools/memoryTools.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2026 Erik Fortune\n * SPDX-License-Identifier: MIT\n */\n\nimport '@fgv/ts-utils-jest';\nimport { Converter, Converters, Result, fail, succeed } from '@fgv/ts-utils';\nimport { FileTree, JsonObject } from '@fgv/ts-json-base';\nimport { AiAssist } from '@fgv/ts-extras';\nimport {\n AdmissionDecision,\n BodyConverterRegistry,\n DEFAULT_MEMORY_TOOLS,\n EntityId,\n FileTreeMemoryStore,\n HybridRetriever,\n IBodyConverterRegistry,\n IEdgeTarget,\n IIdentityCodec,\n IIndexedMemoryRecord,\n IMemoryRecord,\n IMemoryStore,\n IMemoryToolResultItem,\n IMemoryWriteResult,\n IWritePolicy,\n Kind,\n KnowledgeIdentityCodec,\n LinkTraversalRetriever,\n MemoryIndex,\n IIdentityCodecResult,\n MemoryScopeKey,\n MemoryToolName,\n MtmIdentityCodec,\n RecencyRetriever,\n ScoreUnionMergeStrategy,\n StructuredFilterRetriever,\n TagRetriever,\n createMemoryTools,\n envelopeConverter\n} from '../../../index';\n\nconst knowledgeKind: Kind = 'knowledge' as Kind;\nconst mtmKind: Kind = 'mtm' as Kind;\n\n// ---------------------------------------------------------------------------\n// Fixtures\n// ---------------------------------------------------------------------------\n\nfunction mutableRoot(): FileTree.IMutableFileTreeDirectoryItem {\n const tree = FileTree.inMemory([], { mutable: true }).orThrow();\n const root = tree.getDirectory('/').orThrow();\n if (!FileTree.isMutableDirectoryItem(root)) {\n throw new Error('expected a mutable root directory');\n }\n return root;\n}\n\nfunction registryWith(\n entries: ReadonlyArray<{ kind: Kind; converter?: Converter<string> }>\n): IBodyConverterRegistry {\n const registry = BodyConverterRegistry.create().orThrow();\n for (const entry of entries) {\n registry.register(entry.kind, entry.converter ?? Converters.string);\n }\n return registry;\n}\n\nconst codecs: ReadonlyMap<Kind, IIdentityCodec> = new Map<Kind, IIdentityCodec>([\n [knowledgeKind, new KnowledgeIdentityCodec()],\n [mtmKind, new MtmIdentityCodec()]\n]);\n\n/** A write policy that always rejects — exercises the admit-reject → fail path. */\nclass RejectingPolicy implements IWritePolicy {\n public readonly mutableFields: ReadonlyArray<string> = ['body'];\n public admit(): Result<AdmissionDecision> {\n return succeed({ decision: 'reject', reason: 'blocked by test policy' });\n }\n public applyUpdate(existing: IMemoryRecord<unknown>): Result<IMemoryRecord<unknown>> {\n return succeed(existing);\n }\n}\n\nfunction makeStore(\n params: {\n registry?: IBodyConverterRegistry;\n writePolicies?: ReadonlyMap<Kind, IWritePolicy>;\n } = {}\n): FileTreeMemoryStore {\n return FileTreeMemoryStore.create({\n root: mutableRoot(),\n registry: params.registry ?? registryWith([{ kind: knowledgeKind }, { kind: mtmKind }]),\n codecs,\n writePolicies: params.writePolicies\n }).orThrow();\n}\n\ninterface IEntrySpec {\n readonly id: string;\n readonly scope?: string;\n readonly kind?: string;\n readonly entityId?: string;\n readonly tags?: ReadonlyArray<string>;\n readonly updated?: number;\n readonly links?: ReadonlyArray<string>;\n}\n\nfunction makeEntry(spec: IEntrySpec): IIndexedMemoryRecord {\n const record: IMemoryRecord<unknown> = {\n envelope: envelopeConverter\n .convert({\n id: spec.id,\n entityId: spec.entityId ?? spec.id,\n kind: spec.kind ?? 'knowledge',\n tags: spec.tags ?? [],\n links: (spec.links ?? []).map((target) => ({\n type: 'rel',\n target: { scope: spec.scope ?? 'knowledge', id: target }\n })),\n created: 0,\n updated: spec.updated ?? 0,\n seq: 0,\n contentHash: 'h',\n provenance: { source: 'agent' }\n })\n .orThrow(),\n body: `body-${spec.id}`\n };\n return { scope: (spec.scope ?? 'knowledge') as MemoryScopeKey, record };\n}\n\nfunction makeIndex(specs: ReadonlyArray<IEntrySpec>): MemoryIndex {\n const index = MemoryIndex.create().orThrow();\n index.rebuild(specs.map(makeEntry)).orThrow();\n return index;\n}\n\n/**\n * A HybridRetriever (structured + tag) over the given entries — the seedless\n * `memory_search` backing. A bare `LinkTraversalRetriever` is intentionally NOT\n * composed here: it hard-fails a seedless query, so link traversal is the\n * separate `memory_context` retriever.\n */\nfunction makeRetriever(specs: ReadonlyArray<IEntrySpec>): HybridRetriever {\n const index = makeIndex(specs);\n return HybridRetriever.create(\n [\n RecencyRetriever.create(index).orThrow(),\n StructuredFilterRetriever.create(index).orThrow(),\n TagRetriever.create(index).orThrow()\n ],\n ScoreUnionMergeStrategy.create().orThrow()\n ).orThrow();\n}\n\n/** A LinkTraversalRetriever over the given entries — the `memory_context` backing. */\nfunction makeLinkRetriever(specs: ReadonlyArray<IEntrySpec>): LinkTraversalRetriever {\n return LinkTraversalRetriever.create(makeIndex(specs)).orThrow();\n}\n\n/** Build the full five-tool suite for structural / annotation inspection. */\nfunction allTools(\n overrides: Partial<Parameters<typeof createMemoryTools>[0]> = {}\n): ReadonlyArray<AiAssist.IAiClientTool> {\n return createMemoryTools({\n store: overrides.store ?? makeStore(),\n retriever: overrides.retriever ?? makeRetriever([]),\n registry: overrides.registry ?? registryWith([{ kind: knowledgeKind }, { kind: mtmKind }]),\n codecs,\n tools: ['memory_write', 'memory_read', 'memory_search', 'memory_context', 'memory_delete'],\n ...overrides\n });\n}\n\nfunction toolByName(\n tools: ReadonlyArray<AiAssist.IAiClientTool>,\n name: MemoryToolName\n): AiAssist.IAiClientTool {\n const tool = tools.find((t) => t.config.name === name);\n if (tool === undefined) {\n throw new Error(`tool '${name}' not found`);\n }\n return tool;\n}\n\n/** The property names declared by a tool's JSON-schema. */\nfunction schemaProperties(tool: AiAssist.IAiClientTool): string[] {\n const json = tool.config.parametersSchema.toJson() as JsonObject;\n return Object.keys((json.properties as JsonObject) ?? {});\n}\n\n// ---------------------------------------------------------------------------\n// Tests\n// ---------------------------------------------------------------------------\n\ndescribe('createMemoryTools', () => {\n describe('tool subset selection', () => {\n test('defaults to the read-only set (excludes memory_write / memory_delete)', () => {\n const tools = createMemoryTools({\n store: makeStore(),\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }])\n });\n expect(tools.map((t) => t.config.name)).toEqual(['memory_search', 'memory_context']);\n expect(DEFAULT_MEMORY_TOOLS).toEqual(['memory_search', 'memory_context']);\n });\n\n test('includes memory_write / memory_delete only when named', () => {\n const tools = createMemoryTools({\n store: makeStore(),\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_write', 'memory_delete']\n });\n expect(tools.map((t) => t.config.name)).toEqual(['memory_write', 'memory_delete']);\n });\n\n test('returns tools in a stable builder order regardless of selection order', () => {\n const tools = createMemoryTools({\n store: makeStore(),\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_delete', 'memory_search', 'memory_write']\n });\n expect(tools.map((t) => t.config.name)).toEqual(['memory_write', 'memory_search', 'memory_delete']);\n });\n\n test('an empty selection yields no tools', () => {\n const tools = createMemoryTools({\n store: makeStore(),\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n tools: []\n });\n expect(tools).toEqual([]);\n });\n });\n\n describe('scope isolation (adoption gate)', () => {\n test('NO tool schema declares a scope (or scope-widening) property', () => {\n const tools = allTools();\n expect(tools).toHaveLength(5);\n for (const tool of tools) {\n const props = schemaProperties(tool);\n expect(props.length).toBeGreaterThan(0);\n for (const prop of props) {\n expect(prop.toLowerCase()).not.toContain('scope');\n }\n }\n });\n });\n\n describe('behavior annotations (Component 4)', () => {\n test('read-only tools are readOnlyHint with openWorldHint false', () => {\n const tools = allTools();\n for (const name of ['memory_search', 'memory_context', 'memory_read'] as const) {\n expect(toolByName(tools, name).config.annotations).toEqual({\n readOnlyHint: true,\n openWorldHint: false\n });\n }\n });\n\n test('memory_write is non-destructive, non-idempotent, closed-world', () => {\n expect(toolByName(allTools(), 'memory_write').config.annotations).toEqual({\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: false\n });\n });\n\n test('memory_delete is destructive, idempotent, closed-world', () => {\n expect(toolByName(allTools(), 'memory_delete').config.annotations).toEqual({\n destructiveHint: true,\n idempotentHint: true,\n openWorldHint: false\n });\n });\n });\n\n describe('parametersSchema validation', () => {\n test('memory_write accepts a well-formed record and rejects a missing body', () => {\n const schema = toolByName(allTools(), 'memory_write').config.parametersSchema;\n expect(schema.convert({ kind: 'knowledge', entityId: 'doc-1', body: 'hello' })).toSucceed();\n expect(\n schema.convert({\n kind: 'knowledge',\n entityId: 'doc-1',\n body: 'hello',\n tags: ['a'],\n links: [{ type: 'rel', target: { id: 'doc-2' }, confidence: 0.5 }]\n })\n ).toSucceed();\n expect(\n schema.convert({\n kind: 'knowledge',\n entityId: 'doc-1',\n body: 'hello',\n links: [{ type: 'rel', target: { scope: 'conversations/other', id: 'turn-1' } }]\n })\n ).toSucceed();\n expect(schema.convert({ kind: 'knowledge', entityId: 'doc-1' })).toFail();\n // A bare-string target (the pre-scoped format) is rejected at the schema.\n expect(\n schema.convert({\n kind: 'knowledge',\n entityId: 'doc-1',\n body: 'x',\n links: [{ type: 'rel', target: 'doc-2' }]\n })\n ).toFail();\n });\n\n test('memory_read / memory_delete require kind and entityId', () => {\n for (const name of ['memory_read', 'memory_delete'] as const) {\n const schema = toolByName(allTools(), name).config.parametersSchema;\n expect(schema.convert({ kind: 'knowledge', entityId: 'doc-1' })).toSucceed();\n expect(schema.convert({ kind: 'knowledge' })).toFail();\n }\n });\n\n test('memory_search rejects a non-integer limit and accepts an all-optional query', () => {\n const schema = toolByName(allTools(), 'memory_search').config.parametersSchema;\n expect(schema.convert({})).toSucceed();\n expect(schema.convert({ tag: 'x', limit: 3 })).toSucceed();\n expect(schema.convert({ limit: 'three' })).toFail();\n });\n\n test('memory_context requires a from seed with a REQUIRED scope (nested { id, scope })', () => {\n const schema = toolByName(allTools(), 'memory_context').config.parametersSchema;\n expect(schema.convert({ from: { id: 'doc-1', scope: 'knowledge' } })).toSucceed();\n // scope is schema-REQUIRED (unlike a write link target) — the wire schema must\n // not advertise an optionality the tool does not honor. Omitting it fails.\n expect(schema.convert({ from: { id: 'doc-1' } })).toFail();\n expect(schema.convert({ hops: 2 })).toFail();\n // A bare-string seed (the pre-scoped format) is rejected at the schema.\n expect(schema.convert({ from: 'doc-1' })).toFail();\n });\n\n test('the memory_context wire schema marks from.scope as required', () => {\n // Guards the schema-accuracy contract at the wire level: an LLM reading the\n // tool's `parameters` sees scope in the seed's `required` array.\n const schema = toolByName(allTools(), 'memory_context').config.parametersSchema;\n const wire = schema.toJson() as unknown as {\n properties: { from: { required?: ReadonlyArray<string> } };\n };\n expect(wire.properties.from.required).toContain('scope');\n });\n });\n\n describe('memory_write', () => {\n async function write(\n tool: AiAssist.IAiClientTool,\n args: Record<string, unknown>\n ): Promise<Result<unknown>> {\n return tool.execute(args);\n }\n\n test('writes a new record (outcome: written) and round-trips through memory_read', async () => {\n const store = makeStore();\n const tools = createMemoryTools({\n store,\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_write', 'memory_read']\n });\n const writeTool = toolByName(tools, 'memory_write');\n expect(\n await write(writeTool, { kind: 'knowledge', entityId: 'doc-1', body: 'first', tags: ['t'] })\n ).toSucceedAndSatisfy((value) => {\n const result = value as IMemoryWriteResult;\n expect(result.outcome).toBe('written');\n expect(result.id).toBe('doc-1');\n expect(result.entityId).toBe('doc-1');\n });\n expect(\n await toolByName(tools, 'memory_read').execute({ kind: 'knowledge', entityId: 'doc-1' })\n ).toSucceedAndSatisfy((value) => {\n const read = value as { found: boolean; item: IMemoryToolResultItem };\n expect(read.found).toBe(true);\n expect(read.item.body).toBe('first');\n expect(read.item.tags).toEqual(['t']);\n });\n });\n\n test('persists authored links (with confidence) on the written record', async () => {\n const store = makeStore();\n const tools = createMemoryTools({\n store,\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_write', 'memory_read']\n });\n expect(\n await toolByName(tools, 'memory_write').execute({\n kind: 'knowledge',\n entityId: 'doc-1',\n body: 'linked',\n links: [\n // scope omitted → defaults to the writing record's own scope (knowledge)\n { type: 'rel', target: { id: 'doc-2' }, confidence: 0.9 },\n { type: 'rel', target: { id: 'doc-3' } }\n ]\n })\n ).toSucceedAndSatisfy((v) => expect((v as IMemoryWriteResult).outcome).toBe('written'));\n // The persisted links carry the writing record's scope on each target.\n expect(await store.get(knowledgeKind, 'doc-1' as EntityId)).toSucceedAndSatisfy((rec) => {\n expect(rec?.envelope.links).toEqual([\n { type: 'rel', target: { scope: 'knowledge', id: 'doc-2' }, confidence: 0.9 },\n { type: 'rel', target: { scope: 'knowledge', id: 'doc-3' } }\n ]);\n });\n });\n\n test('an authored link with an EXPLICIT scope is honored verbatim (cross-scope edge)', async () => {\n const store = makeStore();\n const tools = createMemoryTools({\n store,\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_write']\n });\n expect(\n await toolByName(tools, 'memory_write').execute({\n kind: 'knowledge',\n entityId: 'doc-1',\n body: 'cross',\n links: [{ type: 'mtm-ref', target: { scope: 'conversations/conv-a', id: 'turn-3' } }]\n })\n ).toSucceed();\n expect(await store.get(knowledgeKind, 'doc-1' as EntityId)).toSucceedAndSatisfy((rec) => {\n expect(rec?.envelope.links).toEqual([\n { type: 'mtm-ref', target: { scope: 'conversations/conv-a', id: 'turn-3' } }\n ]);\n });\n });\n\n test('an identical re-put of the same entity is a dedup no-op (outcome: deduped)', async () => {\n const store = makeStore();\n const tool = toolByName(allTools({ store }), 'memory_write');\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'same' })).toSucceedAndSatisfy(\n (v) => expect((v as IMemoryWriteResult).outcome).toBe('written')\n );\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'same' })).toSucceedAndSatisfy(\n (v) => expect((v as IMemoryWriteResult).outcome).toBe('deduped')\n );\n });\n\n test('content-scope dedup under a different entity reports deduped', async () => {\n const store = makeStore();\n const tool = toolByName(allTools({ store }), 'memory_write');\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-a', body: 'shared' })).toSucceed();\n // Knowledge dedups scope-wide: identical body under a different docId is a no-op\n // that returns the existing (different-entity) record.\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-b', body: 'shared' })).toSucceedAndSatisfy(\n (v) => expect((v as IMemoryWriteResult).outcome).toBe('deduped')\n );\n });\n\n test('an update with new content reports written', async () => {\n const store = makeStore();\n const tool = toolByName(allTools({ store }), 'memory_write');\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'v1' })).toSucceed();\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'v2' })).toSucceedAndSatisfy(\n (v) => expect((v as IMemoryWriteResult).outcome).toBe('written')\n );\n });\n\n test('maps an MTM composite entityId to its turn stem', async () => {\n const store = makeStore();\n const tools = createMemoryTools({\n store,\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }, { kind: mtmKind }]),\n codecs,\n tools: ['memory_write', 'memory_read']\n });\n expect(\n await toolByName(tools, 'memory_write').execute({\n kind: 'mtm',\n entityId: 'conv-1:7',\n body: 'turn body'\n })\n ).toSucceedAndSatisfy((value) => {\n const result = value as IMemoryWriteResult;\n expect(result.id).toBe('turn-7');\n expect(result.entityId).toBe('conv-1:7');\n });\n // Read back via the same composite entityId.\n expect(\n await toolByName(tools, 'memory_read').execute({ kind: 'mtm', entityId: 'conv-1:7' })\n ).toSucceedAndSatisfy((value) => {\n expect((value as { found: boolean }).found).toBe(true);\n });\n });\n\n test('a body the kind converter rejects fails the write', async () => {\n const rejectBad: Converter<string> = Converters.string.map((s) =>\n s === 'BAD' ? fail('body not allowed') : succeed(s)\n );\n const registry = registryWith([{ kind: knowledgeKind, converter: rejectBad }]);\n const store = makeStore({ registry });\n const tool = toolByName(allTools({ store, registry }), 'memory_write');\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'BAD' })).toFailWith(\n /invalid body|body not allowed/i\n );\n });\n\n test('a policy admit-reject surfaces as a failure', async () => {\n const store = makeStore({\n writePolicies: new Map<Kind, IWritePolicy>([[knowledgeKind, new RejectingPolicy()]])\n });\n const tool = toolByName(allTools({ store }), 'memory_write');\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'x' })).toFailWith(\n /rejected by policy|blocked by test policy/i\n );\n });\n\n test('fails when no codec is available for the kind', async () => {\n const store = makeStore();\n const tool = toolByName(\n createMemoryTools({\n store,\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n tools: ['memory_write'] // no codecs / defaultCodec supplied\n }),\n 'memory_write'\n );\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'x' })).toFailWith(\n /no identity codec available/i\n );\n });\n\n test('rejects a kind with no registered converter', async () => {\n const tool = toolByName(allTools(), 'memory_write');\n expect(await write(tool, { kind: 'unregistered', entityId: 'doc-1', body: 'x' })).toFailWith(\n /no registered body converter/i\n );\n });\n\n test('rejects a kind outside the kinds whitelist', async () => {\n const tool = toolByName(allTools({ kinds: [mtmKind] }), 'memory_write');\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'x' })).toFailWith(\n /not enabled for memory tools/i\n );\n });\n\n test('propagates a store.get failure (does not mask a real fault as a fresh write)', async () => {\n const failingStore: IMemoryStore = {\n get: async () => fail('disk fault'),\n getById: async () => fail('unused'),\n list: async () => succeed([]),\n listScoped: async () => succeed([]),\n asRecordSource: () => ({ list: async () => succeed([]) }),\n dedupScopeFor: () => 'content',\n put: async (record) => succeed(record),\n delete: async () => fail('unused')\n };\n const tool = toolByName(\n createMemoryTools({\n store: failingStore,\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_write']\n }),\n 'memory_write'\n );\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'x' })).toFailWith(\n /disk fault/i\n );\n });\n\n test('rejects a versioned/temporal kind', async () => {\n const versionedCodec: IIdentityCodec = {\n encode: (entityId): Result<IIdentityCodecResult> =>\n succeed({ scope: 'knowledge' as MemoryScopeKey, idStem: entityId as string, isVersioned: true }),\n decode: (): Result<never> => fail('unused'),\n verifyRoundTrip: (): Result<true> => succeed(true)\n };\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs: new Map<Kind, IIdentityCodec>([[knowledgeKind, versionedCodec]]),\n tools: ['memory_write']\n }),\n 'memory_write'\n );\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1', body: 'x' })).toFailWith(\n /versioned\\/temporal kind .* is not supported/i\n );\n });\n\n test('rejects malformed arguments', async () => {\n const tool = toolByName(allTools(), 'memory_write');\n expect(await write(tool, { kind: 'knowledge', entityId: 'doc-1' })).toFailWith(/invalid arguments/i);\n });\n });\n\n describe('memory_read', () => {\n test('returns found:false when the record is absent', async () => {\n const tool = toolByName(allTools(), 'memory_read');\n expect(await tool.execute({ kind: 'knowledge', entityId: 'missing' })).toSucceedWith({ found: false });\n });\n\n test('applies the handleFor hook to the returned item', async () => {\n const store = makeStore();\n const tools = createMemoryTools({\n store,\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_write', 'memory_read'],\n handleFor: (r) => `mnemonic:${r.envelope.id}`\n });\n await toolByName(tools, 'memory_write').execute({ kind: 'knowledge', entityId: 'doc-1', body: 'b' });\n expect(\n await toolByName(tools, 'memory_read').execute({ kind: 'knowledge', entityId: 'doc-1' })\n ).toSucceedAndSatisfy((value) => {\n const read = value as { found: boolean; item: IMemoryToolResultItem };\n expect(read.item.handle).toBe('mnemonic:doc-1');\n });\n });\n\n test('propagates a store failure (bad entityId)', async () => {\n const tool = toolByName(allTools(), 'memory_read');\n expect(await tool.execute({ kind: 'knowledge', entityId: ' ' })).toFail();\n });\n });\n\n describe('memory_search', () => {\n test('returns projected results keyed by raw MemoryId when no handleFor is supplied', async () => {\n const retriever = makeRetriever([\n { id: 'doc-1', tags: ['topic'] },\n { id: 'doc-2', tags: ['topic'] }\n ]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }])\n }),\n 'memory_search'\n );\n expect(await tool.execute({ tag: 'topic' })).toSucceedAndSatisfy((value) => {\n const out = value as { count: number; results: ReadonlyArray<IMemoryToolResultItem> };\n expect(out.count).toBe(2);\n expect(out.results.map((r) => r.handle).sort()).toEqual(['doc-1', 'doc-2']);\n });\n });\n\n test('uses the host handle (mnemonic) as the agent-visible key when handleFor is supplied', async () => {\n const retriever = makeRetriever([{ id: 'doc-1', tags: ['topic'] }]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }]),\n handleFor: (r) => `@${r.envelope.id}`\n }),\n 'memory_search'\n );\n expect(await tool.execute({ tag: 'topic', limit: 5 })).toSucceedAndSatisfy((value) => {\n const out = value as { results: ReadonlyArray<IMemoryToolResultItem> };\n expect(out.results[0].handle).toBe('@doc-1');\n });\n });\n\n test('falls back to the raw id when a throwing handleFor would otherwise escape', async () => {\n const retriever = makeRetriever([{ id: 'doc-1', tags: ['topic'] }]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }]),\n handleFor: () => {\n throw new Error('host handle hook blew up');\n }\n }),\n 'memory_search'\n );\n // A throwing host callback must not crash the search; the item degrades to the raw id.\n expect(await tool.execute({ tag: 'topic', limit: 5 })).toSucceedAndSatisfy((value) => {\n const out = value as { results: ReadonlyArray<IMemoryToolResultItem> };\n expect(out.results[0].handle).toBe('doc-1');\n });\n });\n\n test('loud-degrades on the unwired semantic axis', async () => {\n const retriever = makeRetriever([{ id: 'doc-1' }]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }])\n }),\n 'memory_search'\n );\n expect(await tool.execute({ semantic: 'find me' })).toFailWith(\n /semantic recall requires a vector index/i\n );\n });\n\n test('rejects a kind outside the kinds whitelist', async () => {\n const retriever = makeRetriever([{ id: 'doc-1' }]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }]),\n kinds: [knowledgeKind]\n }),\n 'memory_search'\n );\n expect(await tool.execute({ kind: 'mtm' })).toFailWith(/no registered body converter|not enabled/i);\n });\n\n test('filters by a validated kind', async () => {\n const retriever = makeRetriever([\n { id: 'doc-1', kind: 'knowledge' },\n { id: 'turn-0', kind: 'mtm', scope: 'conversations/conv-1' }\n ]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }, { kind: mtmKind }])\n }),\n 'memory_search'\n );\n expect(await tool.execute({ kind: 'knowledge' })).toSucceedAndSatisfy((value) => {\n const out = value as { results: ReadonlyArray<IMemoryToolResultItem> };\n expect(out.results.map((r) => r.handle)).toEqual(['doc-1']);\n });\n });\n\n test('rejects malformed arguments', async () => {\n const tool = toolByName(allTools(), 'memory_search');\n expect(await tool.execute({ limit: 'nope' })).toFailWith(/invalid arguments/i);\n });\n });\n\n describe('memory_context', () => {\n test('returns the neighbors reachable from a seed', async () => {\n const retriever = makeLinkRetriever([\n { id: 'a', links: ['b', 'c'] },\n { id: 'b', updated: 20 },\n { id: 'c', updated: 10 }\n ]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }])\n }),\n 'memory_context'\n );\n expect(await tool.execute({ from: { id: 'a', scope: 'knowledge' } })).toSucceedAndSatisfy((value) => {\n const out = value as {\n seed: IEdgeTarget;\n count: number;\n results: ReadonlyArray<IMemoryToolResultItem>;\n };\n expect(out.seed).toEqual({ scope: 'knowledge', id: 'a' });\n expect(out.results.map((r) => r.handle)).toEqual(['b', 'c']);\n });\n });\n\n test('honors hops, kind, tag, and limit filters', async () => {\n const retriever = makeLinkRetriever([\n { id: 'a', links: ['b'] },\n { id: 'b', links: ['c'], tags: ['keep'] },\n { id: 'c', tags: ['keep'] }\n ]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }])\n }),\n 'memory_context'\n );\n expect(\n await tool.execute({\n from: { id: 'a', scope: 'knowledge' },\n hops: 2,\n tag: 'keep',\n kind: 'knowledge',\n limit: 5\n })\n ).toSucceedAndSatisfy((value) => {\n const out = value as { results: ReadonlyArray<IMemoryToolResultItem> };\n expect(out.results.map((r) => r.handle).sort()).toEqual(['b', 'c']);\n });\n });\n\n test('rejects an invalid seed id', async () => {\n const tool = toolByName(allTools(), 'memory_context');\n expect(await tool.execute({ from: { id: 'a/b', scope: 'knowledge' } })).toFail();\n });\n\n test('fails at the schema when the seed omits its required scope', async () => {\n // scope is schema-required, so an omitted scope is rejected as an invalid\n // argument (the wire schema and the runtime contract agree — no lie).\n const tool = toolByName(allTools(), 'memory_context');\n expect(await tool.execute({ from: { id: 'a' } })).toFailWith(/invalid arguments/i);\n });\n\n test('a scoped seed reaches ONLY the correctly-scoped graph', async () => {\n // Two conversations reuse the stem `turn-0`; each links a same-scope `turn-1`.\n // Seeding conv-a must reach conv-a's turn-1 and NEVER conv-b's.\n const retriever = makeLinkRetriever([\n { id: 'turn-0', scope: 'conversations/conv-a', links: ['turn-1'] },\n { id: 'turn-1', scope: 'conversations/conv-a', tags: ['in-a'] },\n { id: 'turn-0', scope: 'conversations/conv-b', links: ['turn-1'] },\n { id: 'turn-1', scope: 'conversations/conv-b', tags: ['in-b'] }\n ]);\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever,\n registry: registryWith([{ kind: knowledgeKind }])\n }),\n 'memory_context'\n );\n expect(\n await tool.execute({ from: { id: 'turn-0', scope: 'conversations/conv-a' } })\n ).toSucceedAndSatisfy((value) => {\n const out = value as { results: ReadonlyArray<IMemoryToolResultItem> };\n expect(out.results).toHaveLength(1);\n expect(out.results[0].tags).toEqual(['in-a']);\n });\n });\n\n test('rejects malformed arguments', async () => {\n const tool = toolByName(allTools(), 'memory_context');\n expect(await tool.execute({ hops: 1 })).toFailWith(/invalid arguments/i);\n });\n });\n\n describe('memory_delete', () => {\n test('deletes an existing record', async () => {\n const store = makeStore();\n const tools = createMemoryTools({\n store,\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_write', 'memory_delete', 'memory_read']\n });\n await toolByName(tools, 'memory_write').execute({ kind: 'knowledge', entityId: 'doc-1', body: 'b' });\n expect(\n await toolByName(tools, 'memory_delete').execute({ kind: 'knowledge', entityId: 'doc-1' })\n ).toSucceedWith({ deleted: true, id: 'doc-1', entityId: 'doc-1', kind: 'knowledge' });\n expect(\n await toolByName(tools, 'memory_read').execute({ kind: 'knowledge', entityId: 'doc-1' })\n ).toSucceedWith({ found: false });\n });\n\n test('propagates a store failure when the record is absent', async () => {\n const tool = toolByName(allTools(), 'memory_delete');\n expect(await tool.execute({ kind: 'knowledge', entityId: 'missing' })).toFailWith(/no record found/i);\n });\n\n test('rejects a kind outside the whitelist', async () => {\n const tool = toolByName(allTools({ kinds: [knowledgeKind] }), 'memory_delete');\n expect(await tool.execute({ kind: 'mtm', entityId: 'conv-1:0' })).toFailWith(/not enabled/i);\n });\n\n test('rejects malformed arguments', async () => {\n const tool = toolByName(allTools(), 'memory_delete');\n expect(await tool.execute({ kind: 'knowledge' })).toFailWith(/invalid arguments/i);\n });\n });\n});\n\ndescribe('result projection (projectItem host projector + detail tier)', () => {\n interface ISearchOut {\n readonly count: number;\n readonly results: ReadonlyArray<IMemoryToolResultItem>;\n }\n\n /**\n * A host projector that bounds the `'gist'` body to a sentinel and passes the\n * full body through only for `'full'` — the shape a real host uses to keep the\n * default (gist) path bounded.\n */\n const boundingProjector = (\n record: IMemoryRecord<unknown>,\n detail: 'gist' | 'full'\n ): IMemoryToolResultItem => ({\n handle: `h:${record.envelope.id}`,\n kind: record.envelope.kind,\n entityId: record.envelope.entityId,\n tags: record.envelope.tags,\n body: detail === 'full' ? record.body : '<<gist>>'\n });\n\n function searchToolWith(\n overrides: Partial<Parameters<typeof createMemoryTools>[0]>\n ): AiAssist.IAiClientTool {\n return toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever: makeRetriever([{ id: 'doc-1', tags: ['topic'] }]),\n registry: registryWith([{ kind: knowledgeKind }]),\n ...overrides\n }),\n 'memory_search'\n );\n }\n\n describe('schema surface', () => {\n test('memory_search declares optional detail + offset properties', () => {\n const props = schemaProperties(toolByName(allTools(), 'memory_search'));\n expect(props).toContain('detail');\n expect(props).toContain('offset');\n });\n\n test('memory_context declares an optional detail property', () => {\n const props = schemaProperties(toolByName(allTools(), 'memory_context'));\n expect(props).toContain('detail');\n });\n\n test('memory_read declares an optional detail property', () => {\n const props = schemaProperties(toolByName(allTools(), 'memory_read'));\n expect(props).toContain('detail');\n });\n\n test('memory_search accepts detail and offset, and rejects an out-of-enum detail', () => {\n const schema = toolByName(allTools(), 'memory_search').config.parametersSchema;\n expect(schema.convert({ detail: 'full', offset: 2 })).toSucceed();\n expect(schema.convert({ detail: 'gist' })).toSucceed();\n expect(schema.convert({ offset: 'nope' })).toFail();\n // detail is now an enum ('gist' | 'full') at the wire-schema level.\n expect(schema.convert({ detail: 'verbose' })).toFail();\n });\n });\n\n describe('absent projector = byte-identical default projection', () => {\n test('returns the full body and the default handle (raw id) when no projector is supplied', async () => {\n const tool = searchToolWith({});\n expect(await tool.execute({ tag: 'topic' })).toSucceedAndSatisfy((value) => {\n const out = value as ISearchOut;\n expect(out.results[0].handle).toBe('doc-1');\n expect(out.results[0].body).toBe('body-doc-1');\n });\n });\n\n test('the detail tier is inert without a projector (gist and full both yield the full body)', async () => {\n const tool = searchToolWith({});\n for (const detail of ['gist', 'full'] as const) {\n expect(await tool.execute({ tag: 'topic', detail })).toSucceedAndSatisfy((value) => {\n expect((value as ISearchOut).results[0].body).toBe('body-doc-1');\n });\n }\n });\n });\n\n describe('host projector + detail tier', () => {\n test('defaults to the bounded gist projection when detail is absent', async () => {\n const tool = searchToolWith({ projectItem: boundingProjector });\n expect(await tool.execute({ tag: 'topic' })).toSucceedAndSatisfy((value) => {\n const out = value as ISearchOut;\n expect(out.results[0].handle).toBe('h:doc-1');\n expect(out.results[0].body).toBe('<<gist>>');\n });\n });\n\n test('opts into the full body only when detail=full is requested', async () => {\n const tool = searchToolWith({ projectItem: boundingProjector });\n expect(await tool.execute({ tag: 'topic', detail: 'full' })).toSucceedAndSatisfy((value) => {\n expect((value as ISearchOut).results[0].body).toBe('body-doc-1');\n });\n });\n\n test('an out-of-enum detail is rejected at the schema boundary', async () => {\n // detail is a JsonSchema.enumOf(['gist','full']); the tool re-validates args\n // on execute, so an out-of-enum value fails loudly rather than reaching the projector.\n const tool = searchToolWith({ projectItem: boundingProjector });\n expect(await tool.execute({ tag: 'topic', detail: 'verbose' })).toFailWith(/invalid arguments/i);\n });\n\n test('an explicit detail=gist stays bounded (the non-full branch)', async () => {\n const tool = searchToolWith({ projectItem: boundingProjector });\n expect(await tool.execute({ tag: 'topic', detail: 'gist' })).toSucceedAndSatisfy((value) => {\n expect((value as ISearchOut).results[0].body).toBe('<<gist>>');\n });\n });\n\n test('memory_context routes its results through the host projector', async () => {\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever: makeLinkRetriever([{ id: 'a', links: ['b'] }, { id: 'b' }]),\n registry: registryWith([{ kind: knowledgeKind }]),\n projectItem: boundingProjector\n }),\n 'memory_context'\n );\n expect(\n await tool.execute({ from: { id: 'a', scope: 'knowledge' }, detail: 'full' })\n ).toSucceedAndSatisfy((value) => {\n const out = value as { results: ReadonlyArray<IMemoryToolResultItem> };\n expect(out.results.map((r) => r.handle)).toEqual(['h:b']);\n expect(out.results[0].body).toBe('body-b');\n });\n });\n\n test('a throwing host projector degrades to the default full-body projection (does not crash search)', async () => {\n const tool = searchToolWith({\n projectItem: () => {\n throw new Error('host projector blew up');\n }\n });\n expect(await tool.execute({ tag: 'topic' })).toSucceedAndSatisfy((value) => {\n const out = value as ISearchOut;\n // Degraded to the built-in default: raw-id handle + full body.\n expect(out.results[0].handle).toBe('doc-1');\n expect(out.results[0].body).toBe('body-doc-1');\n });\n });\n\n test('a throwing projector still honors the handleFor hook in the fallback path', async () => {\n const tool = searchToolWith({\n handleFor: (r) => `@${r.envelope.id}`,\n projectItem: () => {\n throw new Error('nope');\n }\n });\n expect(await tool.execute({ tag: 'topic' })).toSucceedAndSatisfy((value) => {\n expect((value as ISearchOut).results[0].handle).toBe('@doc-1');\n });\n });\n });\n\n describe('offset threading (memory_search)', () => {\n test('threads offset into the query to page the ordered result window', async () => {\n const tool = toolByName(\n createMemoryTools({\n store: makeStore(),\n retriever: makeRetriever([\n { id: 'doc-1', tags: ['topic'], updated: 30 },\n { id: 'doc-2', tags: ['topic'], updated: 20 },\n { id: 'doc-3', tags: ['topic'], updated: 10 }\n ]),\n registry: registryWith([{ kind: knowledgeKind }])\n }),\n 'memory_search'\n );\n // Recency-ordered [doc-1, doc-2, doc-3]; offset 1 + limit 1 → [doc-2].\n expect(await tool.execute({ tag: 'topic', offset: 1, limit: 1 })).toSucceedAndSatisfy((value) => {\n const out = value as ISearchOut;\n expect(out.count).toBe(1);\n expect(out.results.map((r) => r.handle)).toEqual(['doc-2']);\n });\n });\n });\n\n describe('memory_read detail (explicit drill-in defaults to FULL)', () => {\n interface IReadOut {\n readonly found: boolean;\n readonly item: IMemoryToolResultItem;\n }\n\n async function readToolWith(\n projector?: (record: IMemoryRecord<unknown>, detail: 'gist' | 'full') => IMemoryToolResultItem\n ): Promise<AiAssist.IAiClientTool> {\n const tools = createMemoryTools({\n store: makeStore(),\n retriever: makeRetriever([]),\n registry: registryWith([{ kind: knowledgeKind }]),\n codecs,\n tools: ['memory_write', 'memory_read'],\n ...(projector !== undefined ? { projectItem: projector } : {})\n });\n await toolByName(tools, 'memory_write').execute({\n kind: 'knowledge',\n entityId: 'doc-1',\n body: 'FULLBODY'\n });\n return toolByName(tools, 'memory_read');\n }\n\n test('defaults to the FULL body (drill-in) with a bounding projector', async () => {\n const tool = await readToolWith(boundingProjector);\n expect(await tool.execute({ kind: 'knowledge', entityId: 'doc-1' })).toSucceedAndSatisfy((value) => {\n expect((value as IReadOut).item.body).toBe('FULLBODY');\n });\n });\n\n test('opts down to gist only when detail=gist is requested', async () => {\n const tool = await readToolWith(boundingProjector);\n expect(\n await tool.execute({ kind: 'knowledge', entityId: 'doc-1', detail: 'gist' })\n ).toSucceedAndSatisfy((value) => {\n expect((value as IReadOut).item.body).toBe('<<gist>>');\n });\n });\n\n test('is byte-identical for a no-projector consumer (full body regardless of detail)', async () => {\n const tool = await readToolWith(undefined);\n for (const args of [\n { kind: 'knowledge', entityId: 'doc-1' },\n { kind: 'knowledge', entityId: 'doc-1', detail: 'gist' }\n ]) {\n expect(await tool.execute(args)).toSucceedAndSatisfy((value) => {\n expect((value as IReadOut).item.body).toBe('FULLBODY');\n });\n }\n });\n });\n});\n"]}
|
|
@@ -649,6 +649,8 @@ export declare class FileTreeMemoryStore implements IMemoryStore {
|
|
|
649
649
|
private _stampRank;
|
|
650
650
|
private _codecFor;
|
|
651
651
|
private _policyFor;
|
|
652
|
+
/** {@inheritDoc IMemoryStore.dedupScopeFor} */
|
|
653
|
+
dedupScopeFor(kind: Kind): DedupScope;
|
|
652
654
|
/**
|
|
653
655
|
* Read and validate the record at `<scope>/<idStem>.md`, returning `undefined`
|
|
654
656
|
* when the scope directory or file is absent. Verifies the on-disk id ↔
|
|
@@ -2087,6 +2089,34 @@ export declare interface IMemoryStore {
|
|
|
2087
2089
|
* seam's `list()` returns scope-qualified records.
|
|
2088
2090
|
*/
|
|
2089
2091
|
asRecordSource(): IMemoryRecordSource;
|
|
2092
|
+
/**
|
|
2093
|
+
* The EFFECTIVE {@link DedupScope} for `kind` — the granularity at which a
|
|
2094
|
+
* write for this kind deduplicates against the existing vault.
|
|
2095
|
+
*
|
|
2096
|
+
* @remarks
|
|
2097
|
+
* This is a **read accessor over the store's already-injected write policies**,
|
|
2098
|
+
* and it is the single place any caller — the store's own write path included —
|
|
2099
|
+
* asks what a kind's dedup granularity is. It resolves the full chain the store
|
|
2100
|
+
* applies on write: the kind's registered {@link IWritePolicy}, falling back to
|
|
2101
|
+
* the store's default policy, then that policy's
|
|
2102
|
+
* {@link IWritePolicy.dedupScope | dedupScope}, falling back to
|
|
2103
|
+
* {@link DEFAULT_DEDUP_SCOPE}. Note the store's default policy is a
|
|
2104
|
+
* {@link KnowledgeLwwPolicy}, which declares `'content'` — so a kind with NO
|
|
2105
|
+
* registered policy resolves to `'content'`, not to `DEFAULT_DEDUP_SCOPE`.
|
|
2106
|
+
*
|
|
2107
|
+
* It exists so a caller that must agree with the store about dedup granularity
|
|
2108
|
+
* — notably the ingest orchestrator's stage-4 layer-1 exact match — can read the
|
|
2109
|
+
* declaration through this seam instead of being handed a second copy of the
|
|
2110
|
+
* policy map. A second declaration site is precisely the defect this accessor
|
|
2111
|
+
* was added to remove.
|
|
2112
|
+
*
|
|
2113
|
+
* Deliberately synchronous, total, and NOT `Result`-returning: it reads
|
|
2114
|
+
* constructor-injected configuration, touches no I/O, and cannot fail (every
|
|
2115
|
+
* link in the fallback chain has a total default). It exposes only the scope,
|
|
2116
|
+
* never the {@link IWritePolicy} itself, so it can never become a back door for
|
|
2117
|
+
* invoking admission or merge logic out of band.
|
|
2118
|
+
*/
|
|
2119
|
+
dedupScopeFor(kind: Kind): DedupScope;
|
|
2090
2120
|
/**
|
|
2091
2121
|
* Write a record. Validates the body, computes a content hash, deduplicates
|
|
2092
2122
|
* (scope-wide, before policy), applies the kind's {@link IWritePolicy}, stamps
|
|
@@ -3143,7 +3173,9 @@ export declare class MemoryIngestOrchestrator implements IMemoryIngestOrchestrat
|
|
|
3143
3173
|
private _planFromVerdict;
|
|
3144
3174
|
/**
|
|
3145
3175
|
* Stage 4 — resolve a dedup verdict. Layer 1: an exact `{ kind, body }` match in
|
|
3146
|
-
* the candidate's scope is a `duplicate-of
|
|
3176
|
+
* the candidate's scope is a `duplicate-of`, at the granularity the kind's
|
|
3177
|
+
* {@link DedupScope} declares — scope-wide for `'content'`, restricted to the
|
|
3178
|
+
* candidate's own entity for `'entity'` (design note §1). Layer 2 (only when
|
|
3147
3179
|
* a resolver + vector index + embedder are all wired): embed the candidate,
|
|
3148
3180
|
* surface over-threshold neighbors, and dispatch to the {@link IEntityResolver}.
|
|
3149
3181
|
* Otherwise the verdict is `new` (the exact-only fall-back path).
|
|
@@ -3154,9 +3186,26 @@ export declare class MemoryIngestOrchestrator implements IMemoryIngestOrchestrat
|
|
|
3154
3186
|
/** Layer-2 continuation once the candidate has a provisional record to embed. */
|
|
3155
3187
|
private _resolveViaSimilarityEmbedded;
|
|
3156
3188
|
/**
|
|
3157
|
-
* Find an existing record
|
|
3158
|
-
*
|
|
3159
|
-
* — only a live (non-temporal or current) record deduplicates a
|
|
3189
|
+
* Find an existing record whose `{ kind, body }` hash matches the candidate's
|
|
3190
|
+
* (layer-1 exact dedup, design note §1). Invalidated temporal versions are
|
|
3191
|
+
* excluded — only a live (non-temporal or current) record deduplicates a
|
|
3192
|
+
* candidate.
|
|
3193
|
+
*
|
|
3194
|
+
* @remarks
|
|
3195
|
+
* The cohort's granularity is the kind's DECLARED {@link DedupScope}, read
|
|
3196
|
+
* through {@link IMemoryStore.dedupScopeFor} so this layer and the store's own
|
|
3197
|
+
* write path can never disagree:
|
|
3198
|
+
*
|
|
3199
|
+
* - `'content'` — every live same-kind record in the candidate's scope,
|
|
3200
|
+
* regardless of entity. A cross-id body collision IS a duplicate (the
|
|
3201
|
+
* knowledge family; unchanged behavior).
|
|
3202
|
+
* - `'entity'` — only records at the candidate's OWN entity address. Two
|
|
3203
|
+
* distinct entities with byte-identical bodies never collapse into one
|
|
3204
|
+
* another, which is what the declaration has always meant on the direct-put
|
|
3205
|
+
* path and now means here too.
|
|
3206
|
+
*
|
|
3207
|
+
* The same-id collapse itself remains the store's job — this layer only decides
|
|
3208
|
+
* whether a cross-id body collision is eligible to be a `duplicate-of` at all.
|
|
3160
3209
|
*/
|
|
3161
3210
|
private _findExactMatch;
|
|
3162
3211
|
/**
|
|
@@ -3168,8 +3217,46 @@ export declare class MemoryIngestOrchestrator implements IMemoryIngestOrchestrat
|
|
|
3168
3217
|
private static _recordBodyString;
|
|
3169
3218
|
/** The stage-4 exact-dedup key over `{ kind, body }` (design note §1). */
|
|
3170
3219
|
private _exactKey;
|
|
3171
|
-
/** Stage 5 — relate (host), validate edges, and run the write-time cycle guard. */
|
|
3220
|
+
/** Stage 5 — relate (host), redirect collapsed targets, validate edges, and run the write-time cycle guard. */
|
|
3172
3221
|
private _relate;
|
|
3222
|
+
/**
|
|
3223
|
+
* The stage-5 edge-target redirect map for this pass: every `duplicate-of`
|
|
3224
|
+
* candidate's OWN scoped address, mapped to the address of the record its
|
|
3225
|
+
* verdict collapsed it into (design note §3).
|
|
3226
|
+
*
|
|
3227
|
+
* @remarks
|
|
3228
|
+
* A `duplicate-of` verdict means "this candidate IS that record". The candidate
|
|
3229
|
+
* is therefore not written, and its address never becomes a live reference — so
|
|
3230
|
+
* a sibling edge built against it in the same pass would resolve to neither a
|
|
3231
|
+
* written candidate nor an existing record and would fail the WHOLE ingest item.
|
|
3232
|
+
* That is a second-order hazard of collapsing, not a defect in the edge: the
|
|
3233
|
+
* host related two candidates it was correctly told about, and one of them
|
|
3234
|
+
* turned out to already exist.
|
|
3235
|
+
*
|
|
3236
|
+
* Redirecting is the honest repair, and it is independent of {@link DedupScope}
|
|
3237
|
+
* — it applies equally to a `'content'` kind, where the collapse is exactly
|
|
3238
|
+
* right and the ingest still must not fail.
|
|
3239
|
+
*
|
|
3240
|
+
* The map cannot chain: {@link MemoryIngestOrchestrator._planFromVerdict}
|
|
3241
|
+
* requires every target-bearing verdict's target to already exist in the store
|
|
3242
|
+
* snapshot, so a redirect destination is always a persisted record and never
|
|
3243
|
+
* another collapsed candidate. One pass is sufficient by construction.
|
|
3244
|
+
*/
|
|
3245
|
+
private static _collapseRedirects;
|
|
3246
|
+
/**
|
|
3247
|
+
* Rewrite each edge whose TARGET names a collapsed candidate to point at the
|
|
3248
|
+
* record that candidate collapsed into.
|
|
3249
|
+
*
|
|
3250
|
+
* @remarks
|
|
3251
|
+
* Only the target is redirected. An edge whose SOURCE is a collapsed candidate
|
|
3252
|
+
* stays untouched and is still rejected by {@link
|
|
3253
|
+
* MemoryIngestOrchestrator._validateEdges}: sources are the records an edge is
|
|
3254
|
+
* written ONTO, a collapsed candidate is never written, and the relation
|
|
3255
|
+
* extractor is only ever offered writable candidates as edge sources in the
|
|
3256
|
+
* first place. Silently relocating such an edge onto an existing record would
|
|
3257
|
+
* attribute a link the host never asked for — the loud failure is correct there.
|
|
3258
|
+
*/
|
|
3259
|
+
private static _redirectEdges;
|
|
3173
3260
|
/**
|
|
3174
3261
|
* Validate stage-5 edges: each `source` must be a candidate being written; each
|
|
3175
3262
|
* `target` must resolve to a sibling candidate or an existing store record. All
|
|
@@ -118,6 +118,7 @@ export const envelopeYamlConverter: Converter<IMemoryEnvelope>;
|
|
|
118
118
|
export class FileTreeMemoryStore implements IMemoryStore {
|
|
119
119
|
asRecordSource(): IMemoryRecordSource;
|
|
120
120
|
static create(params: IFileTreeMemoryStoreCreateParams): Result<FileTreeMemoryStore>;
|
|
121
|
+
dedupScopeFor(kind: Kind): DedupScope;
|
|
121
122
|
delete(kind: Kind, entityId: EntityId): Promise<Result<MemoryId>>;
|
|
122
123
|
get(kind: Kind, entityId: EntityId): Promise<Result<IMemoryRecord<unknown> | undefined>>;
|
|
123
124
|
getById(scope: MemoryScopeKey, id: MemoryId): Promise<Result<IMemoryRecord<unknown> | undefined>>;
|
|
@@ -505,6 +506,7 @@ export interface IMemoryRetrieverCapabilities {
|
|
|
505
506
|
// @public
|
|
506
507
|
export interface IMemoryStore {
|
|
507
508
|
asRecordSource(): IMemoryRecordSource;
|
|
509
|
+
dedupScopeFor(kind: Kind): DedupScope;
|
|
508
510
|
delete(kind: Kind, entityId: EntityId): Promise<Result<MemoryId>>;
|
|
509
511
|
get(kind: Kind, entityId: EntityId): Promise<Result<IMemoryRecord<unknown> | undefined>>;
|
|
510
512
|
getById(scope: MemoryScopeKey, id: MemoryId): Promise<Result<IMemoryRecord<unknown> | undefined>>;
|