@fgv/ts-agent-memory 5.1.0-36 → 5.1.0-39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/.rush/temp/{f6a88bfdd66517ccb98c2c7ae1be6e6fe9e15d38.tar.log → b82cf6bdece20481260e6bab946179eeec9d7b46.tar.log} +116 -2
  2. package/.rush/temp/chunked-rush-logs/ts-agent-memory.build.chunks.jsonl +4 -4
  3. package/.rush/temp/operation/build/all.log +4 -4
  4. package/.rush/temp/operation/build/log-chunks.jsonl +4 -4
  5. package/.rush/temp/operation/build/state.json +1 -1
  6. package/.rush/temp/shrinkwrap-deps.json +222 -221
  7. package/config/jest.config.json +1 -1
  8. package/dist/index.js +2 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/packlets/ingest/cycleGuard.js +111 -0
  11. package/dist/packlets/ingest/cycleGuard.js.map +1 -0
  12. package/dist/packlets/ingest/hostStages.js +6 -0
  13. package/dist/packlets/ingest/hostStages.js.map +1 -0
  14. package/dist/packlets/ingest/index.js +9 -0
  15. package/dist/packlets/ingest/index.js.map +1 -0
  16. package/dist/packlets/ingest/model.js +6 -0
  17. package/dist/packlets/ingest/model.js.map +1 -0
  18. package/dist/packlets/ingest/orchestrator.js +438 -0
  19. package/dist/packlets/ingest/orchestrator.js.map +1 -0
  20. package/dist/packlets/retrieve/index.js +1 -0
  21. package/dist/packlets/retrieve/index.js.map +1 -1
  22. package/dist/packlets/retrieve/temporalRetrievers.js +172 -0
  23. package/dist/packlets/retrieve/temporalRetrievers.js.map +1 -0
  24. package/dist/packlets/store/fileTreeMemoryStore.js +323 -41
  25. package/dist/packlets/store/fileTreeMemoryStore.js.map +1 -1
  26. package/dist/packlets/tools/index.js +6 -0
  27. package/dist/packlets/tools/index.js.map +1 -0
  28. package/dist/packlets/tools/memoryTools.js +337 -0
  29. package/dist/packlets/tools/memoryTools.js.map +1 -0
  30. package/dist/packlets/types/identityCodec.js +115 -0
  31. package/dist/packlets/types/identityCodec.js.map +1 -1
  32. package/dist/packlets/types/index.js +1 -0
  33. package/dist/packlets/types/index.js.map +1 -1
  34. package/dist/packlets/types/temporal.js +85 -0
  35. package/dist/packlets/types/temporal.js.map +1 -0
  36. package/dist/packlets/types/writePolicy.js +96 -0
  37. package/dist/packlets/types/writePolicy.js.map +1 -1
  38. package/dist/test/unit/converters/antagonistRoundTrip.test.js +95 -0
  39. package/dist/test/unit/converters/antagonistRoundTrip.test.js.map +1 -0
  40. package/dist/test/unit/ingest/antagonistCycleAndParity.test.js +273 -0
  41. package/dist/test/unit/ingest/antagonistCycleAndParity.test.js.map +1 -0
  42. package/dist/test/unit/ingest/cycleGuard.test.js +54 -0
  43. package/dist/test/unit/ingest/cycleGuard.test.js.map +1 -0
  44. package/dist/test/unit/ingest/orchestrator.test.js +913 -0
  45. package/dist/test/unit/ingest/orchestrator.test.js.map +1 -0
  46. package/dist/test/unit/retrieve/temporalRetrievers.test.js +182 -0
  47. package/dist/test/unit/retrieve/temporalRetrievers.test.js.map +1 -0
  48. package/dist/test/unit/store/antagonistTemporalBoundary.test.js +120 -0
  49. package/dist/test/unit/store/antagonistTemporalBoundary.test.js.map +1 -0
  50. package/dist/test/unit/store/fileTreeMemoryStore.test.js +74 -7
  51. package/dist/test/unit/store/fileTreeMemoryStore.test.js.map +1 -1
  52. package/dist/test/unit/store/temporalStore.test.js +398 -0
  53. package/dist/test/unit/store/temporalStore.test.js.map +1 -0
  54. package/dist/test/unit/tools/memoryTools.test.js +572 -0
  55. package/dist/test/unit/tools/memoryTools.test.js.map +1 -0
  56. package/dist/test/unit/types/temporalCodec.test.js +203 -0
  57. package/dist/test/unit/types/temporalCodec.test.js.map +1 -0
  58. package/dist/test/unit/types/temporalPolicy.test.js +62 -0
  59. package/dist/test/unit/types/temporalPolicy.test.js.map +1 -0
  60. package/dist/ts-agent-memory.d.ts +1042 -10
  61. package/dist/tsdoc-metadata.json +1 -1
  62. package/etc/ts-agent-memory.api.md +284 -0
  63. package/lib/index.d.ts +2 -0
  64. package/lib/index.d.ts.map +1 -1
  65. package/lib/index.js +2 -0
  66. package/lib/index.js.map +1 -1
  67. package/lib/packlets/ingest/cycleGuard.d.ts +41 -0
  68. package/lib/packlets/ingest/cycleGuard.d.ts.map +1 -0
  69. package/lib/packlets/ingest/cycleGuard.js +115 -0
  70. package/lib/packlets/ingest/cycleGuard.js.map +1 -0
  71. package/lib/packlets/ingest/hostStages.d.ts +88 -0
  72. package/lib/packlets/ingest/hostStages.d.ts.map +1 -0
  73. package/lib/packlets/ingest/hostStages.js +7 -0
  74. package/lib/packlets/ingest/hostStages.js.map +1 -0
  75. package/lib/packlets/ingest/index.d.ts +5 -0
  76. package/lib/packlets/ingest/index.d.ts.map +1 -0
  77. package/lib/packlets/ingest/index.js +25 -0
  78. package/lib/packlets/ingest/index.js.map +1 -0
  79. package/lib/packlets/ingest/model.d.ts +177 -0
  80. package/lib/packlets/ingest/model.d.ts.map +1 -0
  81. package/lib/packlets/ingest/model.js +7 -0
  82. package/lib/packlets/ingest/model.js.map +1 -0
  83. package/lib/packlets/ingest/orchestrator.d.ts +206 -0
  84. package/lib/packlets/ingest/orchestrator.d.ts.map +1 -0
  85. package/lib/packlets/ingest/orchestrator.js +442 -0
  86. package/lib/packlets/ingest/orchestrator.js.map +1 -0
  87. package/lib/packlets/retrieve/index.d.ts +1 -0
  88. package/lib/packlets/retrieve/index.d.ts.map +1 -1
  89. package/lib/packlets/retrieve/index.js +1 -0
  90. package/lib/packlets/retrieve/index.js.map +1 -1
  91. package/lib/packlets/retrieve/temporalRetrievers.d.ts +78 -0
  92. package/lib/packlets/retrieve/temporalRetrievers.d.ts.map +1 -0
  93. package/lib/packlets/retrieve/temporalRetrievers.js +178 -0
  94. package/lib/packlets/retrieve/temporalRetrievers.js.map +1 -0
  95. package/lib/packlets/store/fileTreeMemoryStore.d.ts +118 -9
  96. package/lib/packlets/store/fileTreeMemoryStore.d.ts.map +1 -1
  97. package/lib/packlets/store/fileTreeMemoryStore.js +322 -40
  98. package/lib/packlets/store/fileTreeMemoryStore.js.map +1 -1
  99. package/lib/packlets/tools/index.d.ts +2 -0
  100. package/lib/packlets/tools/index.d.ts.map +1 -0
  101. package/lib/packlets/tools/index.js +22 -0
  102. package/lib/packlets/tools/index.js.map +1 -0
  103. package/lib/packlets/tools/memoryTools.d.ts +139 -0
  104. package/lib/packlets/tools/memoryTools.d.ts.map +1 -0
  105. package/lib/packlets/tools/memoryTools.js +341 -0
  106. package/lib/packlets/tools/memoryTools.js.map +1 -0
  107. package/lib/packlets/types/identityCodec.d.ts +86 -0
  108. package/lib/packlets/types/identityCodec.d.ts.map +1 -1
  109. package/lib/packlets/types/identityCodec.js +118 -1
  110. package/lib/packlets/types/identityCodec.js.map +1 -1
  111. package/lib/packlets/types/index.d.ts +1 -0
  112. package/lib/packlets/types/index.d.ts.map +1 -1
  113. package/lib/packlets/types/index.js +1 -0
  114. package/lib/packlets/types/index.js.map +1 -1
  115. package/lib/packlets/types/temporal.d.ts +40 -0
  116. package/lib/packlets/types/temporal.d.ts.map +1 -0
  117. package/lib/packlets/types/temporal.js +92 -0
  118. package/lib/packlets/types/temporal.js.map +1 -0
  119. package/lib/packlets/types/writePolicy.d.ts +49 -0
  120. package/lib/packlets/types/writePolicy.d.ts.map +1 -1
  121. package/lib/packlets/types/writePolicy.js +98 -1
  122. package/lib/packlets/types/writePolicy.js.map +1 -1
  123. package/lib/test/unit/converters/antagonistRoundTrip.test.d.ts +10 -0
  124. package/lib/test/unit/converters/antagonistRoundTrip.test.d.ts.map +1 -0
  125. package/lib/test/unit/converters/antagonistRoundTrip.test.js +97 -0
  126. package/lib/test/unit/converters/antagonistRoundTrip.test.js.map +1 -0
  127. package/lib/test/unit/ingest/antagonistCycleAndParity.test.d.ts +9 -0
  128. package/lib/test/unit/ingest/antagonistCycleAndParity.test.d.ts.map +1 -0
  129. package/lib/test/unit/ingest/antagonistCycleAndParity.test.js +275 -0
  130. package/lib/test/unit/ingest/antagonistCycleAndParity.test.js.map +1 -0
  131. package/lib/test/unit/ingest/cycleGuard.test.d.ts +2 -0
  132. package/lib/test/unit/ingest/cycleGuard.test.d.ts.map +1 -0
  133. package/lib/test/unit/ingest/cycleGuard.test.js +56 -0
  134. package/lib/test/unit/ingest/cycleGuard.test.js.map +1 -0
  135. package/lib/test/unit/ingest/orchestrator.test.d.ts +2 -0
  136. package/lib/test/unit/ingest/orchestrator.test.d.ts.map +1 -0
  137. package/lib/test/unit/ingest/orchestrator.test.js +915 -0
  138. package/lib/test/unit/ingest/orchestrator.test.js.map +1 -0
  139. package/lib/test/unit/retrieve/temporalRetrievers.test.d.ts +2 -0
  140. package/lib/test/unit/retrieve/temporalRetrievers.test.d.ts.map +1 -0
  141. package/lib/test/unit/retrieve/temporalRetrievers.test.js +184 -0
  142. package/lib/test/unit/retrieve/temporalRetrievers.test.js.map +1 -0
  143. package/lib/test/unit/store/antagonistTemporalBoundary.test.d.ts +9 -0
  144. package/lib/test/unit/store/antagonistTemporalBoundary.test.d.ts.map +1 -0
  145. package/lib/test/unit/store/antagonistTemporalBoundary.test.js +122 -0
  146. package/lib/test/unit/store/antagonistTemporalBoundary.test.js.map +1 -0
  147. package/lib/test/unit/store/fileTreeMemoryStore.test.js +74 -7
  148. package/lib/test/unit/store/fileTreeMemoryStore.test.js.map +1 -1
  149. package/lib/test/unit/store/temporalStore.test.d.ts +2 -0
  150. package/lib/test/unit/store/temporalStore.test.d.ts.map +1 -0
  151. package/lib/test/unit/store/temporalStore.test.js +400 -0
  152. package/lib/test/unit/store/temporalStore.test.js.map +1 -0
  153. package/lib/test/unit/tools/memoryTools.test.d.ts +2 -0
  154. package/lib/test/unit/tools/memoryTools.test.d.ts.map +1 -0
  155. package/lib/test/unit/tools/memoryTools.test.js +574 -0
  156. package/lib/test/unit/tools/memoryTools.test.js.map +1 -0
  157. package/lib/test/unit/types/temporalCodec.test.d.ts +2 -0
  158. package/lib/test/unit/types/temporalCodec.test.d.ts.map +1 -0
  159. package/lib/test/unit/types/temporalCodec.test.js +205 -0
  160. package/lib/test/unit/types/temporalCodec.test.js.map +1 -0
  161. package/lib/test/unit/types/temporalPolicy.test.d.ts +2 -0
  162. package/lib/test/unit/types/temporalPolicy.test.d.ts.map +1 -0
  163. package/lib/test/unit/types/temporalPolicy.test.js +64 -0
  164. package/lib/test/unit/types/temporalPolicy.test.js.map +1 -0
  165. package/package.json +19 -19
  166. package/rush-logs/ts-agent-memory.build.cache.log +1 -1
  167. package/rush-logs/ts-agent-memory.build.log +4 -4
  168. package/src/index.ts +2 -0
  169. package/src/packlets/ingest/cycleGuard.ts +142 -0
  170. package/src/packlets/ingest/hostStages.ts +111 -0
  171. package/src/packlets/ingest/index.ts +9 -0
  172. package/src/packlets/ingest/model.ts +184 -0
  173. package/src/packlets/ingest/orchestrator.ts +797 -0
  174. package/src/packlets/retrieve/index.ts +1 -0
  175. package/src/packlets/retrieve/temporalRetrievers.ts +210 -0
  176. package/src/packlets/store/fileTreeMemoryStore.ts +460 -66
  177. package/src/packlets/tools/index.ts +6 -0
  178. package/src/packlets/tools/memoryTools.ts +579 -0
  179. package/src/packlets/types/identityCodec.ts +184 -0
  180. package/src/packlets/types/index.ts +1 -0
  181. package/src/packlets/types/temporal.ts +96 -0
  182. package/src/packlets/types/writePolicy.ts +127 -0
  183. package/src/test/unit/converters/antagonistRoundTrip.test.ts +110 -0
  184. package/src/test/unit/ingest/antagonistCycleAndParity.test.ts +362 -0
  185. package/src/test/unit/ingest/cycleGuard.test.ts +68 -0
  186. package/src/test/unit/ingest/orchestrator.test.ts +1158 -0
  187. package/src/test/unit/retrieve/temporalRetrievers.test.ts +226 -0
  188. package/src/test/unit/store/antagonistTemporalBoundary.test.ts +158 -0
  189. package/src/test/unit/store/fileTreeMemoryStore.test.ts +98 -7
  190. package/src/test/unit/store/temporalStore.test.ts +469 -0
  191. package/src/test/unit/tools/memoryTools.test.ts +771 -0
  192. package/src/test/unit/types/temporalCodec.test.ts +259 -0
  193. package/src/test/unit/types/temporalPolicy.test.ts +96 -0
  194. package/temp/build/lint/_eslint-5eVG3S6w.json +122 -46
  195. package/temp/build/typescript/ts_8nwakTlr.json +1 -1
  196. package/temp/ts-agent-memory.api.json +11984 -6314
  197. package/temp/ts-agent-memory.api.md +284 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.test.js","sourceRoot":"","sources":["../../../../src/test/unit/ingest/orchestrator.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 { Converters, Logging, Result, fail, succeed } from '@fgv/ts-utils';\nimport { FileTree } from '@fgv/ts-json-base';\nimport {\n BodyConverterRegistry,\n CONTRADICTS_LINK_TYPE,\n DEFAULT_SIMILARITY_THRESHOLD,\n DEFAULT_SIMILARITY_TOP_K,\n EntityId,\n FileTreeMemoryStore,\n HOST_INGEST_PROVENANCE_SOURCE,\n IBodyConverterRegistry,\n ICandidateEdge,\n ICandidateRecord,\n IEntityResolutionCandidate,\n IEntityResolver,\n IFactExtractor,\n IIdentityCodec,\n IIngestItem,\n IIngestItemResult,\n InMemoryCosineIndex,\n IMemoryClassification,\n IMemoryClassifier,\n IMemoryEnvelope,\n IMemoryRecord,\n IMemoryStore,\n IProvenance,\n IRelationContext,\n IRelationExtractor,\n IVectorIndex,\n IVectorQueryHit,\n IWritePolicy,\n Kind,\n KnowledgeIdentityCodec,\n LinkType,\n LtmIdentityCodec,\n MemoryEmbedder,\n MemoryId,\n MemoryIngestOrchestrator,\n MemoryScopeKey,\n ResolutionVerdict,\n Tag,\n TemporalIdentityCodec,\n TemporalVersionedPolicy,\n serializeMemoryFile\n} from '../../../index';\n\n// --- kinds --------------------------------------------------------------------\nconst noteKind: Kind = 'note' as Kind;\nconst factKind: Kind = 'fact' as Kind;\nconst numKind: Kind = 'num' as Kind;\nconst orphanKind: Kind = 'orphan' as Kind;\nconst ltmKind: Kind = 'ltm' as Kind;\n\n// --- shared fixtures ----------------------------------------------------------\nlet clockValue: number;\nconst clock = (): number => clockValue;\n\nfunction mutableRoot(\n files: ReadonlyArray<{ path: string; contents: string }> = []\n): FileTree.IMutableFileTreeDirectoryItem {\n const tree = FileTree.inMemory([...files], { 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 registry(): IBodyConverterRegistry {\n const reg = BodyConverterRegistry.create().orThrow();\n reg.register(noteKind, Converters.string);\n reg.register(factKind, Converters.string);\n reg.register(numKind, Converters.number);\n reg.register(orphanKind, Converters.string);\n reg.register(ltmKind, Converters.string);\n return reg;\n}\n\nconst codecs: ReadonlyMap<Kind, IIdentityCodec> = new Map<Kind, IIdentityCodec>([\n [noteKind, new KnowledgeIdentityCodec()],\n [numKind, new KnowledgeIdentityCodec()],\n [ltmKind, new LtmIdentityCodec()],\n [factKind, TemporalIdentityCodec.create('facts').orThrow()]\n]);\n\nconst policies: ReadonlyMap<Kind, IWritePolicy> = new Map<Kind, IWritePolicy>([\n [factKind, TemporalVersionedPolicy.create().orThrow()]\n]);\n\n// A deterministic embedder keyed by body text (three-dimensional vectors so\n// cosine relationships are controllable). Unknown bodies map to a distinct axis.\nconst VECTORS: ReadonlyMap<string, ReadonlyArray<number>> = new Map<string, ReadonlyArray<number>>([\n ['apple pie', [1, 0, 0]],\n ['apple tart', [0.99, 0.14, 0]],\n ['banana bread', [0, 1, 0]]\n]);\nconst embed: MemoryEmbedder = (record) => {\n if (record.body === 'boom') {\n return Promise.resolve(fail('embed boom'));\n }\n const vec: ReadonlyArray<number> = VECTORS.get(record.body as string) ?? [0, 0, 1];\n return Promise.resolve(succeed(Float32Array.from(vec)));\n};\n\n// --- mock host stages ---------------------------------------------------------\nfunction classifier(fn: (item: IIngestItem) => Result<IMemoryClassification>): IMemoryClassifier {\n return { classify: (item) => Promise.resolve(fn(item)) };\n}\nfunction throwingClassifier(): IMemoryClassifier {\n return {\n classify: () => {\n throw new Error('classifier boom');\n }\n };\n}\nfunction extractor(\n fn: (item: IIngestItem, c: IMemoryClassification) => Result<ReadonlyArray<ICandidateRecord>>\n): IFactExtractor {\n return { extract: (item, c) => Promise.resolve(fn(item, c)) };\n}\nfunction resolver(\n fn: (\n candidate: ICandidateRecord,\n similar: ReadonlyArray<IEntityResolutionCandidate>\n ) => Result<ResolutionVerdict>\n): IEntityResolver {\n return { resolve: (candidate, similar) => Promise.resolve(fn(candidate, similar)) };\n}\nfunction relater(fn: (ctx: IRelationContext) => Result<ReadonlyArray<ICandidateEdge>>): IRelationExtractor {\n return { relate: (ctx) => Promise.resolve(fn(ctx)) };\n}\n\nconst noEdges: IRelationExtractor = relater(() => succeed([]));\nconst classifyNote: IMemoryClassifier = classifier(() => succeed({ kind: noteKind, confidence: 0.9 }));\n\n/** Extractor that emits one note candidate per item, body = item.content, entityId = item.id. */\nfunction oneNoteExtractor(): IFactExtractor {\n return extractor((item) => succeed([candidate(noteKind, item.id, item.content as string)]));\n}\n\nfunction candidate(\n kind: Kind,\n entityId: string,\n body: unknown,\n opts: {\n readonly tags?: ReadonlyArray<string>;\n readonly links?: ICandidateRecord['envelope']['links'];\n readonly provenance?: IProvenance;\n readonly temporal?: IMemoryEnvelope['temporal'];\n } = {}\n): ICandidateRecord {\n return {\n envelope: {\n entityId: entityId as EntityId,\n kind,\n tags: (opts.tags ?? []) as ReadonlyArray<Tag>,\n links: opts.links ?? [],\n provenance: opts.provenance ?? { source: 'agent' },\n ...(opts.temporal !== undefined ? { temporal: opts.temporal } : {})\n },\n body\n };\n}\n\nfunction candEdge(source: string, type: string, target: string, confidence?: number): ICandidateEdge {\n return {\n source: source as MemoryId,\n edge: {\n type: type as LinkType,\n target: target as MemoryId,\n ...(confidence !== undefined ? { confidence } : {})\n }\n };\n}\n\ninterface IBuildParams {\n readonly files?: ReadonlyArray<{ path: string; contents: string }>;\n readonly registry?: IBodyConverterRegistry;\n readonly vectorIndex?: IVectorIndex;\n readonly embed?: MemoryEmbedder;\n}\n\nfunction buildStore(params: IBuildParams = {}): FileTreeMemoryStore {\n return FileTreeMemoryStore.create({\n root: mutableRoot(params.files),\n registry: params.registry ?? registry(),\n codecs,\n writePolicies: policies,\n clock,\n vectorIndex: params.vectorIndex,\n embed: params.embed\n }).orThrow();\n}\n\ninterface IOrchestratorParams {\n readonly store: IMemoryStore;\n readonly registry?: IBodyConverterRegistry;\n readonly classifier?: IMemoryClassifier;\n readonly extractor?: IFactExtractor;\n readonly relationExtractor?: IRelationExtractor;\n readonly entityResolver?: IEntityResolver;\n readonly vectorIndex?: IVectorIndex;\n readonly embed?: MemoryEmbedder;\n readonly similarityThreshold?: number;\n readonly cycleGuard?: 'reject' | 'off';\n}\n\nfunction buildOrchestrator(params: IOrchestratorParams): MemoryIngestOrchestrator {\n return MemoryIngestOrchestrator.create({\n store: params.store,\n registry: params.registry ?? registry(),\n codecs,\n classifier: params.classifier ?? classifyNote,\n extractor: params.extractor ?? oneNoteExtractor(),\n relationExtractor: params.relationExtractor ?? noEdges,\n entityResolver: params.entityResolver,\n vectorIndex: params.vectorIndex,\n embed: params.embed,\n similarityThreshold: params.similarityThreshold,\n cycleGuard: params.cycleGuard\n }).orThrow();\n}\n\n/** A seeded note file with only `source` provenance (the additive-provenance baseline). */\nfunction seedNote(\n id: string,\n body: string,\n provenance: Record<string, unknown> = { source: 'agent' }\n): {\n path: string;\n contents: string;\n} {\n const envelope: IMemoryEnvelope = {\n id: id as MemoryId,\n entityId: id as EntityId,\n kind: noteKind,\n tags: [],\n links: [],\n created: 1,\n updated: 1,\n seq: 4,\n contentHash: 'seed',\n provenance: provenance as unknown as IProvenance\n };\n return { path: `knowledge/${id}.md`, contents: serializeMemoryFile(envelope, body).orThrow() };\n}\n\nbeforeEach(() => {\n clockValue = 1000;\n});\n\ndescribe('MemoryIngestOrchestrator', () => {\n describe('create', () => {\n test('constructs via the factory', () => {\n expect(\n MemoryIngestOrchestrator.create({\n store: buildStore(),\n registry: registry(),\n codecs,\n classifier: classifyNote,\n extractor: oneNoteExtractor(),\n relationExtractor: noEdges\n })\n ).toSucceed();\n });\n\n test('exposes the documented similarity defaults', () => {\n expect(DEFAULT_SIMILARITY_THRESHOLD).toBe(0.85);\n expect(DEFAULT_SIMILARITY_TOP_K).toBe(5);\n });\n });\n\n describe('single-item ingest (first-class path)', () => {\n test('classifies, extracts, and writes one record end-to-end with host-ingest provenance + derivedFrom', async () => {\n const store = buildStore();\n const orch = buildOrchestrator({ store });\n const sourceId: MemoryId = 'turn-3' as MemoryId;\n const result = await orch.ingestItem({ id: 'doc-1', content: 'the sky is blue', sourceId });\n expect(result).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.item.id).toBe('doc-1');\n expect(r.records).toHaveLength(1);\n const rec = r.records[0];\n expect(rec.disposition).toBe('written');\n expect(rec.resolution.verdict).toBe('new');\n expect(rec.id).toBe('doc-1');\n expect(rec.record?.envelope.provenance.source).toBe(HOST_INGEST_PROVENANCE_SOURCE);\n expect(rec.record?.envelope.provenance.derivedFrom).toBe('turn-3');\n expect(rec.record?.body).toBe('the sky is blue');\n expect(rec.interlock).toBeUndefined();\n });\n expect(await store.get(noteKind, 'doc-1' as EntityId)).toSucceedAndSatisfy(\n (rec: IMemoryRecord<unknown> | undefined) => {\n expect(rec?.body).toBe('the sky is blue');\n }\n );\n });\n\n test('omits derivedFrom when the item carries no sourceId', async () => {\n const store = buildStore();\n const orch = buildOrchestrator({ store });\n const result = await orch.ingestItem({ id: 'doc-1', content: 'a fact' });\n expect(result).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].record?.envelope.provenance.derivedFrom).toBeUndefined();\n expect(r.records[0].record?.envelope.provenance.source).toBe(HOST_INGEST_PROVENANCE_SOURCE);\n });\n });\n\n test('yields an empty record set when the extractor finds nothing memorable', async () => {\n const store = buildStore();\n const orch = buildOrchestrator({ store, extractor: extractor(() => succeed([])) });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'noise' })).toSucceedAndSatisfy(\n (r: IIngestItemResult) => {\n expect(r.records).toEqual([]);\n }\n );\n });\n });\n\n describe('host-stage failures abort loudly', () => {\n test('classifier failure', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n classifier: classifier(() => fail('cannot classify'))\n });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'x' })).toFailWith(/cannot classify/);\n });\n\n test('classifier throw is captured as a failure', async () => {\n const orch = buildOrchestrator({ store: buildStore(), classifier: throwingClassifier() });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'x' })).toFailWith(\n /classify threw.*classifier boom/\n );\n });\n\n test('extractor failure', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n extractor: extractor(() => fail('extract error'))\n });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'x' })).toFailWith(/extract error/);\n });\n\n test('relation-extractor failure', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n relationExtractor: relater(() => fail('relate error'))\n });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'x' })).toFailWith(/relate error/);\n });\n });\n\n describe('stage 3b — typed validation boundary', () => {\n test('rejects a candidate whose body fails the kind converter', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-1', 42)]))\n });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'x' })).toFailWith(\n /candidate body for kind 'note' is invalid/\n );\n });\n\n test('rejects a non-string body even when the converter accepts it', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n extractor: extractor(() => succeed([candidate(numKind, 'n-1', 42)]))\n });\n expect(await orch.ingestItem({ id: 'n-1', content: 'x' })).toFailWith(/must be a string/);\n });\n\n test('fails when no identity codec is registered for the candidate kind', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n extractor: extractor(() => succeed([candidate(orphanKind, 'o-1', 'body')]))\n });\n expect(await orch.ingestItem({ id: 'o-1', content: 'x' })).toFailWith(/no identity codec/);\n });\n });\n\n describe('stage 4 — exact dedup (layer 1)', () => {\n test('an exact {kind,body} match in scope is duplicate-of (no resolver)', async () => {\n const store = buildStore({ files: [seedNote('doc-a', 'hello')] });\n const orch = buildOrchestrator({\n store,\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'hello')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].disposition).toBe('deduped');\n expect(r.records[0].resolution).toEqual({ verdict: 'duplicate-of', target: 'doc-a' });\n expect(r.records[0].id).toBe('doc-a');\n });\n // doc-b was never written.\n expect(await store.get(noteKind, 'doc-b' as EntityId)).toSucceedWith(undefined);\n });\n\n test('exact dedup takes precedence over the resolver (resolver never called)', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ files: [seedNote('doc-a', 'hello')] });\n const orch = buildOrchestrator({\n store,\n entityResolver: resolver(() => fail('resolver must not be called')),\n vectorIndex,\n embed,\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'hello')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].disposition).toBe('deduped');\n });\n });\n\n test('a distinct body is a fresh write (no resolver → exact-only fall-back)', async () => {\n const store = buildStore({ files: [seedNote('doc-a', 'hello')] });\n const orch = buildOrchestrator({\n store,\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'goodbye')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].disposition).toBe('written');\n expect(r.records[0].resolution.verdict).toBe('new');\n });\n });\n });\n});\n\n// --- similarity + resolver fixtures ------------------------------------------\nconst classifyFact: IMemoryClassifier = classifier(() => succeed({ kind: factKind }));\nfunction oneFactExtractor(): IFactExtractor {\n return extractor((item) => succeed([candidate(factKind, item.id, item.content as string)]));\n}\n\nasync function putNote(store: FileTreeMemoryStore, id: string, body: string): Promise<void> {\n const rec: IMemoryRecord<unknown> = {\n envelope: {\n id: id as MemoryId,\n entityId: id as EntityId,\n kind: noteKind,\n tags: [],\n links: [],\n created: 0,\n updated: 0,\n seq: 0,\n contentHash: '',\n provenance: { source: 'agent' }\n },\n body\n };\n (await store.put(rec)).orThrow();\n}\n\nfunction mockStore(overrides: Partial<IMemoryStore>): IMemoryStore {\n return {\n get:\n overrides.get ??\n ((): Promise<Result<IMemoryRecord<unknown> | undefined>> => Promise.resolve(succeed(undefined))),\n getById:\n overrides.getById ??\n ((): Promise<Result<IMemoryRecord<unknown> | undefined>> => Promise.resolve(succeed(undefined))),\n list:\n overrides.list ??\n ((): Promise<Result<ReadonlyArray<IMemoryRecord<unknown>>>> => Promise.resolve(succeed([]))),\n put: overrides.put ?? ((r): Promise<Result<IMemoryRecord<unknown>>> => Promise.resolve(succeed(r))),\n delete: overrides.delete ?? ((): Promise<Result<MemoryId>> => Promise.resolve(fail('n/a')))\n };\n}\n\ndescribe('MemoryIngestOrchestrator — stage 4 similarity (layer 2)', () => {\n test('resolver verdict new writes the candidate despite a near-duplicate', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver(() => succeed({ verdict: 'new' })),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].disposition).toBe('written');\n expect(r.records[0].resolution.verdict).toBe('new');\n });\n });\n\n test('resolver verdict duplicate-of dedups against the surfaced neighbor', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver((__c, similar) => succeed({ verdict: 'duplicate-of', target: similar[0].id })),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].disposition).toBe('deduped');\n expect(r.records[0].id).toBe('doc-a');\n });\n expect(await store.get(noteKind, 'doc-b' as EntityId)).toSucceedWith(undefined);\n });\n\n test('resolver verdict supersede writes the candidate and records the superseded target', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver((__c, similar) => succeed({ verdict: 'supersede', target: similar[0].id })),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].disposition).toBe('written');\n expect(r.records[0].resolution).toEqual({ verdict: 'supersede', target: 'doc-a' });\n expect(r.records[0].id).toBe('doc-b');\n });\n expect(await store.get(noteKind, 'doc-b' as EntityId)).toSucceedAndSatisfy(\n (rec: IMemoryRecord<unknown> | undefined) => expect(rec?.body).toBe('apple tart')\n );\n });\n\n test('resolver verdict merge-into re-addresses the write to the target entity', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver((__c, similar) => succeed({ verdict: 'merge-into', target: similar[0].id })),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].disposition).toBe('merged');\n expect(r.records[0].id).toBe('doc-a');\n });\n // The merge updated doc-a's body (LWW merge patch) and never minted doc-b.\n expect(await store.get(noteKind, 'doc-a' as EntityId)).toSucceedAndSatisfy(\n (rec: IMemoryRecord<unknown> | undefined) => expect(rec?.body).toBe('apple tart')\n );\n expect(await store.get(noteKind, 'doc-b' as EntityId)).toSucceedWith(undefined);\n });\n\n test('merge-into with a non-existent target fails loudly', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver(() => succeed({ verdict: 'merge-into', target: 'ghost' as MemoryId })),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(\n /merge-into target 'ghost' does not exist/\n );\n });\n\n test('a below-threshold neighbor is not surfaced (resolver not called)', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver(() => fail('resolver must not be called')),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'banana bread')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].resolution.verdict).toBe('new');\n });\n });\n\n test('the candidate self-hit is excluded from surfaced neighbors', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver(() => fail('resolver must not be called')),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-a', 'apple tart')]))\n });\n // Re-ingesting the SAME entity: its own prior vector is the only over-threshold\n // hit, and it is skipped as the self-hit, so no resolver dispatch occurs.\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].resolution.verdict).toBe('new');\n expect(r.records[0].disposition).toBe('written');\n });\n });\n\n test('a surfaced hit with no backing record is skipped', async () => {\n const ghostIndex: IVectorIndex = {\n add: (id) => Promise.resolve(succeed(id as string)),\n remove: (id) => Promise.resolve(succeed(id)),\n query: (): Promise<Result<ReadonlyArray<IVectorQueryHit>>> =>\n Promise.resolve(succeed([{ id: 'ghost' as MemoryId, score: 0.99 }]))\n };\n const orch = buildOrchestrator({\n store: buildStore(),\n vectorIndex: ghostIndex,\n embed,\n entityResolver: resolver(() => fail('resolver must not be called')),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].resolution.verdict).toBe('new');\n });\n });\n\n test('an embedder failure surfaces loudly', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const orch = buildOrchestrator({\n store: buildStore(),\n vectorIndex,\n embed,\n entityResolver: resolver(() => succeed({ verdict: 'new' })),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'boom')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(/embed boom/);\n });\n\n test('a similarity-query failure surfaces loudly', async () => {\n const failingIndex: IVectorIndex = {\n add: (id) => Promise.resolve(succeed(id as string)),\n remove: (id) => Promise.resolve(succeed(id)),\n query: (): Promise<Result<ReadonlyArray<IVectorQueryHit>>> => Promise.resolve(fail('query kaput'))\n };\n const orch = buildOrchestrator({\n store: buildStore(),\n vectorIndex: failingIndex,\n embed,\n entityResolver: resolver(() => succeed({ verdict: 'new' })),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(/query kaput/);\n });\n\n test('a custom similarityThreshold gates the resolver dispatch', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n similarityThreshold: 0.999, // 0.99 neighbor now falls below threshold\n entityResolver: resolver(() => fail('resolver must not be called')),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].resolution.verdict).toBe('new');\n });\n });\n});\n\ndescribe('MemoryIngestOrchestrator — layer-2 wiring gates (exact-only fall-back)', () => {\n const failResolver: IEntityResolver = resolver(() => fail('resolver must not be called'));\n const almostSimilar = extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]));\n\n test('no resolver → exact-only', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({ store, vectorIndex, embed, extractor: almostSimilar });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) =>\n expect(r.records[0].resolution.verdict).toBe('new')\n );\n });\n\n test('resolver + embed but no vector index → exact-only', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n embed,\n entityResolver: failResolver,\n extractor: almostSimilar\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) =>\n expect(r.records[0].resolution.verdict).toBe('new')\n );\n });\n\n test('resolver + vector index but no embedder → exact-only', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const orch = buildOrchestrator({\n store: buildStore(),\n vectorIndex,\n entityResolver: failResolver,\n extractor: almostSimilar\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) =>\n expect(r.records[0].resolution.verdict).toBe('new')\n );\n });\n});\n\ndescribe('MemoryIngestOrchestrator — stage 5 relate + cycle guard', () => {\n test('attaches a valid edge to an existing record', async () => {\n const store = buildStore();\n await putNote(store, 'doc-a', 'anchor');\n const orch = buildOrchestrator({\n store,\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'goodbye')])),\n relationExtractor: relater(() => succeed([candEdge('doc-b', 'mentions', 'doc-a', 0.7)]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].edges).toHaveLength(1);\n expect(r.records[0].record?.envelope.links).toEqual([\n { type: 'mentions', target: 'doc-a', confidence: 0.7 }\n ]);\n });\n });\n\n test('attaches an edge between two sibling candidates', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n extractor: extractor(() =>\n succeed([candidate(noteKind, 'doc-b', 'first'), candidate(noteKind, 'doc-c', 'second')])\n ),\n relationExtractor: relater(() => succeed([candEdge('doc-b', 'rel', 'doc-c')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records).toHaveLength(2);\n expect(r.records[0].record?.envelope.links).toEqual([{ type: 'rel', target: 'doc-c' }]);\n expect(r.records[1].edges).toEqual([]);\n });\n });\n\n test('rejects an edge whose source is not a candidate being written', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'x')])),\n relationExtractor: relater(() => succeed([candEdge('ghost', 'rel', 'doc-b')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(\n /edge source 'ghost' is not a candidate being written/\n );\n });\n\n test('rejects an edge whose target resolves to nothing', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'x')])),\n relationExtractor: relater(() => succeed([candEdge('doc-b', 'rel', 'ghost')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(\n /edge target 'ghost' resolves to neither/\n );\n });\n\n test('rejects a cycle-inducing edge (default guard)', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n extractor: extractor(() =>\n succeed([candidate(noteKind, 'doc-b', 'first'), candidate(noteKind, 'doc-c', 'second')])\n ),\n relationExtractor: relater(() =>\n succeed([candEdge('doc-b', 'rel', 'doc-c'), candEdge('doc-c', 'rel', 'doc-b')])\n )\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(/would create a cycle/);\n });\n\n test('cycleGuard \"off\" admits an otherwise-cyclic edge set', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n cycleGuard: 'off',\n extractor: extractor(() =>\n succeed([candidate(noteKind, 'doc-b', 'first'), candidate(noteKind, 'doc-c', 'second')])\n ),\n relationExtractor: relater(() =>\n succeed([candEdge('doc-b', 'rel', 'doc-c'), candEdge('doc-c', 'rel', 'doc-b')])\n )\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].record?.envelope.links).toEqual([{ type: 'rel', target: 'doc-c' }]);\n expect(r.records[1].record?.envelope.links).toEqual([{ type: 'rel', target: 'doc-b' }]);\n });\n });\n\n test('a contradicts edge on a NON-temporal kind persists as a plain link (no interlock)', async () => {\n const store = buildStore();\n await putNote(store, 'doc-a', 'anchor');\n const orch = buildOrchestrator({\n store,\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'goodbye')])),\n relationExtractor: relater(() => succeed([candEdge('doc-b', 'contradicts', 'doc-a')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].interlock).toBeUndefined();\n expect(r.records[0].record?.envelope.links).toEqual([{ type: 'contradicts', target: 'doc-a' }]);\n });\n });\n});\n\ndescribe('MemoryIngestOrchestrator — contradicts→temporal interlock', () => {\n test('a contradicts edge on a temporal kind invalidates the prior version and writes a new one', async () => {\n const store = buildStore();\n const firstOrch = buildOrchestrator({\n store,\n classifier: classifyFact,\n extractor: oneFactExtractor()\n });\n clockValue = 1000;\n const first = await firstOrch.ingestItem({ id: 'fact-1', content: 'the sky is blue' });\n const v1Id: MemoryId = first.orThrow().records[0].id;\n expect(v1Id).toBe('fact-1-v1');\n\n clockValue = 2000;\n const secondOrch = buildOrchestrator({\n store,\n classifier: classifyFact,\n extractor: extractor(() => succeed([candidate(factKind, 'fact-1', 'the sky is grey')])),\n relationExtractor: relater(() => succeed([candEdge('fact-1', 'contradicts', v1Id)]))\n });\n expect(await secondOrch.ingestItem({ id: 'fact-1', content: 'the sky is grey' })).toSucceedAndSatisfy(\n (r: IIngestItemResult) => {\n expect(r.records[0].interlock).toBe('temporal-versioned');\n expect(r.records[0].disposition).toBe('written');\n expect(r.records[0].record?.envelope.links).toEqual([{ type: CONTRADICTS_LINK_TYPE, target: v1Id }]);\n }\n );\n\n // The current version is the new (contradicting) one.\n expect(await store.get(factKind, 'fact-1' as EntityId)).toSucceedAndSatisfy(\n (rec: IMemoryRecord<unknown> | undefined) => expect(rec?.body).toBe('the sky is grey')\n );\n // The prior version is invalidated (invalidate-don't-delete).\n expect(await store.list()).toSucceedAndSatisfy((all: ReadonlyArray<IMemoryRecord<unknown>>) => {\n const v1 = all.find((rec) => rec.envelope.id === v1Id);\n expect(v1?.envelope.temporal?.invalid_at).toBe(2000);\n });\n });\n\n test('an invalidated version does not exact-dedup a later candidate that repeats its body', async () => {\n const store = buildStore();\n clockValue = 1000;\n const o1 = buildOrchestrator({ store, classifier: classifyFact, extractor: oneFactExtractor() });\n const first = await o1.ingestItem({ id: 'fact-1', content: 'blue' });\n const v1Id: MemoryId = first.orThrow().records[0].id;\n\n clockValue = 2000;\n const o2 = buildOrchestrator({\n store,\n classifier: classifyFact,\n extractor: extractor(() => succeed([candidate(factKind, 'fact-1', 'grey')])),\n relationExtractor: relater(() => succeed([candEdge('fact-1', 'contradicts', v1Id)]))\n });\n (await o2.ingestItem({ id: 'fact-1', content: 'grey' })).orThrow();\n\n // Re-introduce the ORIGINAL body: the invalidated v1 must be skipped by exact\n // dedup, so this is a NEW version, not a duplicate-of.\n clockValue = 3000;\n const o3 = buildOrchestrator({\n store,\n classifier: classifyFact,\n extractor: extractor(() => succeed([candidate(factKind, 'fact-1', 'blue')]))\n });\n expect(await o3.ingestItem({ id: 'fact-1', content: 'blue' })).toSucceedAndSatisfy(\n (r: IIngestItemResult) => {\n expect(r.records[0].resolution.verdict).toBe('new');\n expect(r.records[0].disposition).toBe('written');\n }\n );\n });\n});\n\ndescribe('MemoryIngestOrchestrator — additive-provenance non-regression', () => {\n test('a pre-existing record with only source provenance still loads and validates unchanged', async () => {\n const store = buildStore({ files: [seedNote('legacy', 'old note', { source: 'human' })] });\n // Loads at construction time.\n expect(await store.getById('knowledge' as MemoryScopeKey, 'legacy' as MemoryId)).toSucceedAndSatisfy(\n (rec: IMemoryRecord<unknown> | undefined) => {\n expect(rec?.envelope.provenance).toEqual({ source: 'human' });\n expect(rec?.envelope.provenance.by).toBeUndefined();\n expect(rec?.envelope.provenance.derivedFrom).toBeUndefined();\n }\n );\n // An unrelated ingest does not disturb it.\n const orch = buildOrchestrator({ store });\n (await orch.ingestItem({ id: 'fresh', content: 'new content' })).orThrow();\n expect(await store.getById('knowledge' as MemoryScopeKey, 'legacy' as MemoryId)).toSucceedAndSatisfy(\n (rec: IMemoryRecord<unknown> | undefined) => {\n expect(rec?.envelope.provenance).toEqual({ source: 'human' });\n }\n );\n });\n});\n\ndescribe('MemoryIngestOrchestrator — ingestBatch', () => {\n test('ingests a batch in order', async () => {\n const store = buildStore();\n const orch = buildOrchestrator({ store });\n const result = await orch.ingestBatch([\n { id: 'doc-1', content: 'one' },\n { id: 'doc-2', content: 'two' }\n ]);\n expect(result).toSucceedAndSatisfy((results: ReadonlyArray<IIngestItemResult>) => {\n expect(results).toHaveLength(2);\n expect(results.map((r) => r.item.id)).toEqual(['doc-1', 'doc-2']);\n expect(results.every((r) => r.records[0].disposition === 'written')).toBe(true);\n });\n });\n\n test('aborts the batch on the first item failure', async () => {\n const orch = buildOrchestrator({\n store: buildStore(),\n classifier: classifier((item) =>\n item.id === 'bad' ? fail('classify bad') : succeed({ kind: noteKind })\n )\n });\n expect(\n await orch.ingestBatch([\n { id: 'bad', content: 'one' },\n { id: 'doc-2', content: 'two' }\n ])\n ).toFailWith(/classify bad/);\n });\n});\n\ndescribe('MemoryIngestOrchestrator — store failure paths', () => {\n test('a store snapshot (list) failure aborts the item', async () => {\n const store = mockStore({ list: () => Promise.resolve(fail('list down')) });\n const orch = buildOrchestrator({ store });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'x' })).toFailWith(\n /failed to snapshot store.*list down/\n );\n });\n\n test('a store put failure surfaces as a write failure', async () => {\n const store = mockStore({ put: () => Promise.resolve(fail('put kaput')) });\n const orch = buildOrchestrator({ store });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'x' })).toFailWith(/write failed.*put kaput/);\n });\n});\n\ndescribe('MemoryIngestOrchestrator — optional constructor params', () => {\n test('falls back to defaultCodec when no per-kind codec map is supplied', async () => {\n const store = buildStore();\n const orch = MemoryIngestOrchestrator.create({\n store,\n registry: registry(),\n defaultCodec: new KnowledgeIdentityCodec(),\n classifier: classifyNote,\n extractor: oneNoteExtractor(),\n relationExtractor: noEdges\n }).orThrow();\n expect(await orch.ingestItem({ id: 'doc-1', content: 'hello' })).toSucceedAndSatisfy(\n (r: IIngestItemResult) => expect(r.records[0].disposition).toBe('written')\n );\n });\n\n test('honors an explicit similarityTopK and logs a captured host throw to the supplied logger', async () => {\n const logger = new Logging.InMemoryLogger('detail');\n const orch = MemoryIngestOrchestrator.create({\n store: buildStore(),\n registry: registry(),\n codecs,\n classifier: throwingClassifier(),\n extractor: oneNoteExtractor(),\n relationExtractor: noEdges,\n similarityTopK: 3,\n logger\n }).orThrow();\n expect(await orch.ingestItem({ id: 'doc-1', content: 'x' })).toFailWith(/classifier boom/);\n expect(logger.logged.some((m) => /classifier boom/.test(m))).toBe(true);\n });\n});\n\ndescribe('MemoryIngestOrchestrator — review-punch-list fixes', () => {\n test('a stored record with a non-string body fails the exact-dedup pass loudly', async () => {\n const weird: IMemoryRecord<unknown> = {\n envelope: {\n id: 'weird' as MemoryId,\n entityId: 'weird' as EntityId,\n kind: noteKind,\n tags: [],\n links: [],\n created: 0,\n updated: 0,\n seq: 0,\n contentHash: '',\n provenance: { source: 'agent' }\n },\n body: 42\n };\n const store = mockStore({ list: () => Promise.resolve(succeed([weird])) });\n const orch = buildOrchestrator({ store });\n expect(await orch.ingestItem({ id: 'doc-1', content: 'hello' })).toFailWith(\n /stored record 'weird' has a non-string body/\n );\n });\n\n test('duplicate stage-5 edges are deduped on the written record', async () => {\n const store = buildStore();\n await putNote(store, 'doc-a', 'anchor');\n const orch = buildOrchestrator({\n store,\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'goodbye')])),\n relationExtractor: relater(() =>\n succeed([candEdge('doc-b', 'rel', 'doc-a'), candEdge('doc-b', 'rel', 'doc-a')])\n )\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].record?.envelope.links).toEqual([{ type: 'rel', target: 'doc-a' }]);\n });\n });\n\n test('two candidates merging into the same target do not duplicate a shared edge', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putNote(store, 'doc-a', 'apple pie');\n await putNote(store, 'doc-x', 'target');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver((__c, similar) => succeed({ verdict: 'merge-into', target: similar[0].id })),\n extractor: extractor(() =>\n succeed([candidate(noteKind, 'doc-b', 'apple tart'), candidate(noteKind, 'doc-c', 'apple tart')])\n ),\n relationExtractor: relater(() => succeed([candEdge('doc-a', 'rel', 'doc-x')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceed();\n expect(await store.get(noteKind, 'doc-a' as EntityId)).toSucceedAndSatisfy(\n (rec: IMemoryRecord<unknown> | undefined) => {\n expect(rec?.envelope.links).toEqual([{ type: 'rel', target: 'doc-x' }]);\n }\n );\n });\n});\n\ndescribe('MemoryIngestOrchestrator — merge-into safety (second review)', () => {\n // Seed a record with pre-existing tags + links under a flat codec (id === entityId).\n async function putFull(\n store: FileTreeMemoryStore,\n kind: Kind,\n entityId: string,\n body: string,\n opts: { tags?: ReadonlyArray<string>; links?: IMemoryEnvelope['links'] } = {}\n ): Promise<void> {\n const rec: IMemoryRecord<unknown> = {\n envelope: {\n id: entityId as MemoryId,\n entityId: entityId as EntityId,\n kind,\n tags: (opts.tags ?? []) as ReadonlyArray<Tag>,\n links: opts.links ?? [],\n created: 0,\n updated: 0,\n seq: 0,\n contentHash: '',\n provenance: { source: 'agent' }\n },\n body\n };\n (await store.put(rec)).orThrow();\n }\n\n test('merge-into UNIONs the target’s existing tags + links (never overwrites them)', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putFull(store, noteKind, 'doc-a', 'apple pie', {\n tags: ['old-tag'],\n links: [{ type: 'existing' as LinkType, target: 'doc-z' as MemoryId }]\n });\n await putFull(store, noteKind, 'doc-x', 'target of stage-5');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver((__c, similar) => succeed({ verdict: 'merge-into', target: similar[0].id })),\n extractor: extractor(() =>\n succeed([\n candidate(noteKind, 'doc-b', 'apple tart', {\n tags: ['new-tag'],\n links: [{ type: 'candlink' as LinkType, target: 'doc-z' as MemoryId }]\n })\n ])\n ),\n relationExtractor: relater(() => succeed([candEdge('doc-a', 'stage5', 'doc-x')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toSucceedAndSatisfy((r: IIngestItemResult) => {\n expect(r.records[0].disposition).toBe('merged');\n });\n expect(await store.get(noteKind, 'doc-a' as EntityId)).toSucceedAndSatisfy(\n (rec: IMemoryRecord<unknown> | undefined) => {\n // Original tag preserved AND the candidate's tag gained, each once.\n expect([...(rec?.envelope.tags ?? [])].sort()).toEqual(['new-tag', 'old-tag']);\n // Original link + candidate link + stage-5 edge, each exactly once.\n expect(rec?.envelope.links).toEqual([\n { type: 'existing', target: 'doc-z' },\n { type: 'candlink', target: 'doc-z' },\n { type: 'stage5', target: 'doc-x' }\n ]);\n }\n );\n });\n\n test('merge-into a different-kind target fails loudly', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n // A DIFFERENT-kind (ltm) record embedded so it surfaces as a neighbor of a note candidate.\n await putFull(store, ltmKind, 'conv-1', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver((__c, similar) => succeed({ verdict: 'merge-into', target: similar[0].id })),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(\n /merge-into target 'conv-1' is kind 'ltm' but the candidate is kind 'note'/\n );\n });\n\n test('supersede with a non-existent target fails loudly', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putFull(store, noteKind, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver(() => succeed({ verdict: 'supersede', target: 'ghost' as MemoryId })),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(\n /supersede target 'ghost' does not exist/\n );\n });\n\n test('duplicate-of with a non-existent target fails loudly', async () => {\n const vectorIndex = InMemoryCosineIndex.create().orThrow();\n const store = buildStore({ vectorIndex, embed });\n await putFull(store, noteKind, 'doc-a', 'apple pie');\n const orch = buildOrchestrator({\n store,\n vectorIndex,\n embed,\n entityResolver: resolver(() => succeed({ verdict: 'duplicate-of', target: 'ghost' as MemoryId })),\n extractor: extractor(() => succeed([candidate(noteKind, 'doc-b', 'apple tart')]))\n });\n expect(await orch.ingestItem({ id: 'i', content: 'x' })).toFailWith(\n /duplicate-of target 'ghost' does not exist/\n );\n });\n});\n"]}
@@ -0,0 +1,2 @@
1
+ import '@fgv/ts-utils-jest';
2
+ //# sourceMappingURL=temporalRetrievers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporalRetrievers.test.d.ts","sourceRoot":"","sources":["../../../../src/test/unit/retrieve/temporalRetrievers.test.ts"],"names":[],"mappings":"AAKA,OAAO,oBAAoB,CAAC"}
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2026 Erik Fortune
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ require("@fgv/ts-utils-jest");
8
+ const index_1 = require("../../../index");
9
+ const factKind = 'fact';
10
+ function versionEntry(spec) {
11
+ var _a;
12
+ const temporal = { valid_at: spec.validAt };
13
+ if (spec.invalidAt !== undefined) {
14
+ temporal.invalid_at = spec.invalidAt;
15
+ }
16
+ const record = {
17
+ envelope: index_1.envelopeConverter
18
+ .convert({
19
+ id: `${spec.entityId}-v${spec.seq}`,
20
+ entityId: spec.entityId,
21
+ kind: (_a = spec.kind) !== null && _a !== void 0 ? _a : 'fact',
22
+ tags: [],
23
+ links: [],
24
+ created: spec.validAt,
25
+ updated: spec.validAt,
26
+ seq: spec.seq,
27
+ contentHash: `h-${spec.entityId}-${spec.seq}`,
28
+ provenance: { source: 'agent' },
29
+ temporal
30
+ })
31
+ .orThrow(),
32
+ body: `${spec.entityId} v${spec.seq}`
33
+ };
34
+ return { scope: `facts/entities/${spec.entityId}`, record };
35
+ }
36
+ /** A flat (non-temporal) entry, to prove the temporal retrievers ignore it. */
37
+ function flatEntry(id) {
38
+ const record = {
39
+ envelope: index_1.envelopeConverter
40
+ .convert({
41
+ id,
42
+ entityId: id,
43
+ kind: 'knowledge',
44
+ tags: [],
45
+ links: [],
46
+ created: 0,
47
+ updated: 0,
48
+ seq: 0,
49
+ contentHash: `h-${id}`,
50
+ provenance: { source: 'agent' }
51
+ })
52
+ .orThrow(),
53
+ body: id
54
+ };
55
+ return { scope: 'knowledge', record };
56
+ }
57
+ function ids(records) {
58
+ return records.map((r) => r.envelope.id);
59
+ }
60
+ // fact-1: v1 [100,200), v2 [200,∞) current. fact-2: v1 [150,∞) current. Plus a flat doc.
61
+ function buildIndex() {
62
+ const index = index_1.MemoryIndex.create().orThrow();
63
+ index
64
+ .rebuild([
65
+ versionEntry({ entityId: 'fact-1', seq: 1, validAt: 100, invalidAt: 200 }),
66
+ versionEntry({ entityId: 'fact-1', seq: 2, validAt: 200 }),
67
+ versionEntry({ entityId: 'fact-2', seq: 3, validAt: 150 }),
68
+ flatEntry('doc-a')
69
+ ])
70
+ .orThrow();
71
+ return index;
72
+ }
73
+ describe('temporal retrievers', () => {
74
+ const index = buildIndex();
75
+ describe('CurrentValidRetriever', () => {
76
+ const retriever = index_1.CurrentValidRetriever.create(index).orThrow();
77
+ test('declares supportsTemporalQuery', () => {
78
+ expect(retriever.capabilities.supportsTemporalQuery).toBe(true);
79
+ });
80
+ test('returns the current version per temporal entity, ignoring flat records', async () => {
81
+ expect(await retriever.retrieve({})).toSucceedAndSatisfy((records) => {
82
+ expect(ids(records).sort()).toEqual(['fact-1-v2', 'fact-2-v3']);
83
+ });
84
+ });
85
+ test('honors scope / kind pre-filter and limit', async () => {
86
+ expect(await retriever.retrieve({ kind: factKind, limit: 1 })).toSucceedAndSatisfy((records) => {
87
+ expect(records).toHaveLength(1);
88
+ });
89
+ });
90
+ });
91
+ describe('AsOfRetriever', () => {
92
+ const retriever = index_1.AsOfRetriever.create(index).orThrow();
93
+ test('empty when no asOf axis is supplied', async () => {
94
+ expect(await retriever.retrieve({})).toSucceedWith([]);
95
+ });
96
+ test('returns the version valid at asOf per entity', async () => {
97
+ expect(await retriever.retrieve({ asOf: 150 })).toSucceedAndSatisfy((records) => {
98
+ // fact-1 v1 valid at 150; fact-2 v1 valid at 150.
99
+ expect(ids(records).sort()).toEqual(['fact-1-v1', 'fact-2-v3']);
100
+ });
101
+ expect(await retriever.retrieve({ asOf: 250 })).toSucceedAndSatisfy((records) => {
102
+ expect(ids(records).sort()).toEqual(['fact-1-v2', 'fact-2-v3']);
103
+ });
104
+ expect(await retriever.retrieve({ asOf: 50 })).toSucceedWith([]);
105
+ });
106
+ });
107
+ describe('HistoryRetriever', () => {
108
+ const retriever = index_1.HistoryRetriever.create(index).orThrow();
109
+ test('returns all versions ascending by valid_at', async () => {
110
+ expect(await retriever.retrieve({ kind: factKind })).toSucceedAndSatisfy((records) => {
111
+ expect(ids(records)).toEqual(['fact-1-v1', 'fact-2-v3', 'fact-1-v2']);
112
+ });
113
+ });
114
+ test('applies the limit after ordering', async () => {
115
+ expect(await retriever.retrieve({ kind: factKind, limit: 2 })).toSucceedAndSatisfy((records) => {
116
+ expect(ids(records)).toEqual(['fact-1-v1', 'fact-2-v3']);
117
+ });
118
+ });
119
+ test('orders by created when a version has no valid_at', async () => {
120
+ const idx = index_1.MemoryIndex.create().orThrow();
121
+ const noValidAt = {
122
+ scope: 'facts/entities/nv',
123
+ record: {
124
+ envelope: index_1.envelopeConverter
125
+ .convert({
126
+ id: 'nv-v1',
127
+ entityId: 'nv',
128
+ kind: 'fact',
129
+ tags: [],
130
+ links: [],
131
+ created: 700,
132
+ updated: 700,
133
+ seq: 1,
134
+ contentHash: 'h',
135
+ provenance: { source: 'agent' },
136
+ temporal: {}
137
+ })
138
+ .orThrow(),
139
+ body: 'nv'
140
+ }
141
+ };
142
+ idx.rebuild([noValidAt, versionEntry({ entityId: 'early', seq: 2, validAt: 100 })]).orThrow();
143
+ const r = index_1.HistoryRetriever.create(idx).orThrow();
144
+ // `nv` has no valid_at → its start defaults to created (700), after early (100).
145
+ expect(await r.retrieve({})).toSucceedAndSatisfy((records) => {
146
+ expect(ids(records)).toEqual(['early-v2', 'nv-v1']);
147
+ });
148
+ });
149
+ test('breaks an equal-valid_at tie by ascending seq', async () => {
150
+ // Two versions of one entity sharing a valid_at — the seq tiebreak orders them.
151
+ const tieIndex = index_1.MemoryIndex.create().orThrow();
152
+ tieIndex
153
+ .rebuild([
154
+ versionEntry({ entityId: 'tie', seq: 5, validAt: 500, invalidAt: 500 }),
155
+ versionEntry({ entityId: 'tie', seq: 4, validAt: 500 })
156
+ ])
157
+ .orThrow();
158
+ const tieRetriever = index_1.HistoryRetriever.create(tieIndex).orThrow();
159
+ expect(await tieRetriever.retrieve({})).toSucceedAndSatisfy((records) => {
160
+ expect(ids(records)).toEqual(['tie-v4', 'tie-v5']);
161
+ });
162
+ });
163
+ });
164
+ describe('loud-degrade + Hybrid composite', () => {
165
+ test('a non-temporal retriever loud-degrades on an asOf query', async () => {
166
+ const recency = index_1.RecencyRetriever.create(index).orThrow();
167
+ expect(await recency.retrieve({ asOf: 150 })).toFailWith(/temporal query requires temporal index/i);
168
+ });
169
+ test('a Hybrid of [Recency, AsOf] lights up temporal recall via the temporal child', async () => {
170
+ const recency = index_1.RecencyRetriever.create(index).orThrow();
171
+ const asOf = index_1.AsOfRetriever.create(index).orThrow();
172
+ const hybrid = index_1.HybridRetriever.create([recency, asOf], index_1.ScoreUnionMergeStrategy.create().orThrow()).orThrow();
173
+ // The union supports temporal query, so the guard passes; Recency gets asOf
174
+ // stripped (returns everything), AsOf returns the valid-at versions.
175
+ expect(hybrid.capabilities.supportsTemporalQuery).toBe(true);
176
+ expect(await hybrid.retrieve({ asOf: 250, kind: factKind })).toSucceedAndSatisfy((records) => {
177
+ // fact-1-v2 is surfaced by BOTH (recency all + asOf), so it ranks first.
178
+ expect(ids(records)[0]).toBe('fact-1-v2');
179
+ expect(ids(records)).toContain('fact-2-v3');
180
+ });
181
+ });
182
+ });
183
+ });
184
+ //# sourceMappingURL=temporalRetrievers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporalRetrievers.test.js","sourceRoot":"","sources":["../../../../src/test/unit/retrieve/temporalRetrievers.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 {\n AsOfRetriever,\n CurrentValidRetriever,\n HistoryRetriever,\n HybridRetriever,\n IIndexedMemoryRecord,\n IMemoryRecord,\n Kind,\n MemoryIndex,\n MemoryScopeKey,\n RecencyRetriever,\n ScoreUnionMergeStrategy,\n envelopeConverter\n} from '../../../index';\n\nconst factKind: Kind = 'fact' as Kind;\n\ninterface IVersionSpec {\n readonly entityId: string;\n readonly seq: number;\n readonly validAt: number;\n // eslint-disable-next-line @rushstack/no-new-null -- invalid_at null is the meaningful still-valid sentinel\n readonly invalidAt?: number | null;\n readonly kind?: string;\n}\n\nfunction versionEntry(spec: IVersionSpec): IIndexedMemoryRecord {\n const temporal: Record<string, unknown> = { valid_at: spec.validAt };\n if (spec.invalidAt !== undefined) {\n temporal.invalid_at = spec.invalidAt;\n }\n const record: IMemoryRecord<unknown> = {\n envelope: envelopeConverter\n .convert({\n id: `${spec.entityId}-v${spec.seq}`,\n entityId: spec.entityId,\n kind: spec.kind ?? 'fact',\n tags: [],\n links: [],\n created: spec.validAt,\n updated: spec.validAt,\n seq: spec.seq,\n contentHash: `h-${spec.entityId}-${spec.seq}`,\n provenance: { source: 'agent' },\n temporal\n })\n .orThrow(),\n body: `${spec.entityId} v${spec.seq}`\n };\n return { scope: `facts/entities/${spec.entityId}` as MemoryScopeKey, record };\n}\n\n/** A flat (non-temporal) entry, to prove the temporal retrievers ignore it. */\nfunction flatEntry(id: string): IIndexedMemoryRecord {\n const record: IMemoryRecord<unknown> = {\n envelope: envelopeConverter\n .convert({\n id,\n entityId: id,\n kind: 'knowledge',\n tags: [],\n links: [],\n created: 0,\n updated: 0,\n seq: 0,\n contentHash: `h-${id}`,\n provenance: { source: 'agent' }\n })\n .orThrow(),\n body: id\n };\n return { scope: 'knowledge' as MemoryScopeKey, record };\n}\n\nfunction ids(records: ReadonlyArray<IMemoryRecord<unknown>>): string[] {\n return records.map((r) => r.envelope.id as string);\n}\n\n// fact-1: v1 [100,200), v2 [200,∞) current. fact-2: v1 [150,∞) current. Plus a flat doc.\nfunction buildIndex(): MemoryIndex {\n const index = MemoryIndex.create().orThrow();\n index\n .rebuild([\n versionEntry({ entityId: 'fact-1', seq: 1, validAt: 100, invalidAt: 200 }),\n versionEntry({ entityId: 'fact-1', seq: 2, validAt: 200 }),\n versionEntry({ entityId: 'fact-2', seq: 3, validAt: 150 }),\n flatEntry('doc-a')\n ])\n .orThrow();\n return index;\n}\n\ndescribe('temporal retrievers', () => {\n const index: MemoryIndex = buildIndex();\n\n describe('CurrentValidRetriever', () => {\n const retriever = CurrentValidRetriever.create(index).orThrow();\n\n test('declares supportsTemporalQuery', () => {\n expect(retriever.capabilities.supportsTemporalQuery).toBe(true);\n });\n\n test('returns the current version per temporal entity, ignoring flat records', async () => {\n expect(await retriever.retrieve({})).toSucceedAndSatisfy((records) => {\n expect(ids(records).sort()).toEqual(['fact-1-v2', 'fact-2-v3']);\n });\n });\n\n test('honors scope / kind pre-filter and limit', async () => {\n expect(await retriever.retrieve({ kind: factKind, limit: 1 })).toSucceedAndSatisfy((records) => {\n expect(records).toHaveLength(1);\n });\n });\n });\n\n describe('AsOfRetriever', () => {\n const retriever = AsOfRetriever.create(index).orThrow();\n\n test('empty when no asOf axis is supplied', async () => {\n expect(await retriever.retrieve({})).toSucceedWith([]);\n });\n\n test('returns the version valid at asOf per entity', async () => {\n expect(await retriever.retrieve({ asOf: 150 })).toSucceedAndSatisfy((records) => {\n // fact-1 v1 valid at 150; fact-2 v1 valid at 150.\n expect(ids(records).sort()).toEqual(['fact-1-v1', 'fact-2-v3']);\n });\n expect(await retriever.retrieve({ asOf: 250 })).toSucceedAndSatisfy((records) => {\n expect(ids(records).sort()).toEqual(['fact-1-v2', 'fact-2-v3']);\n });\n expect(await retriever.retrieve({ asOf: 50 })).toSucceedWith([]);\n });\n });\n\n describe('HistoryRetriever', () => {\n const retriever = HistoryRetriever.create(index).orThrow();\n\n test('returns all versions ascending by valid_at', async () => {\n expect(await retriever.retrieve({ kind: factKind })).toSucceedAndSatisfy((records) => {\n expect(ids(records)).toEqual(['fact-1-v1', 'fact-2-v3', 'fact-1-v2']);\n });\n });\n\n test('applies the limit after ordering', async () => {\n expect(await retriever.retrieve({ kind: factKind, limit: 2 })).toSucceedAndSatisfy((records) => {\n expect(ids(records)).toEqual(['fact-1-v1', 'fact-2-v3']);\n });\n });\n\n test('orders by created when a version has no valid_at', async () => {\n const idx = MemoryIndex.create().orThrow();\n const noValidAt: IIndexedMemoryRecord = {\n scope: 'facts/entities/nv' as MemoryScopeKey,\n record: {\n envelope: envelopeConverter\n .convert({\n id: 'nv-v1',\n entityId: 'nv',\n kind: 'fact',\n tags: [],\n links: [],\n created: 700,\n updated: 700,\n seq: 1,\n contentHash: 'h',\n provenance: { source: 'agent' },\n temporal: {}\n })\n .orThrow(),\n body: 'nv'\n }\n };\n idx.rebuild([noValidAt, versionEntry({ entityId: 'early', seq: 2, validAt: 100 })]).orThrow();\n const r = HistoryRetriever.create(idx).orThrow();\n // `nv` has no valid_at → its start defaults to created (700), after early (100).\n expect(await r.retrieve({})).toSucceedAndSatisfy((records) => {\n expect(ids(records)).toEqual(['early-v2', 'nv-v1']);\n });\n });\n\n test('breaks an equal-valid_at tie by ascending seq', async () => {\n // Two versions of one entity sharing a valid_at — the seq tiebreak orders them.\n const tieIndex = MemoryIndex.create().orThrow();\n tieIndex\n .rebuild([\n versionEntry({ entityId: 'tie', seq: 5, validAt: 500, invalidAt: 500 }),\n versionEntry({ entityId: 'tie', seq: 4, validAt: 500 })\n ])\n .orThrow();\n const tieRetriever = HistoryRetriever.create(tieIndex).orThrow();\n expect(await tieRetriever.retrieve({})).toSucceedAndSatisfy((records) => {\n expect(ids(records)).toEqual(['tie-v4', 'tie-v5']);\n });\n });\n });\n\n describe('loud-degrade + Hybrid composite', () => {\n test('a non-temporal retriever loud-degrades on an asOf query', async () => {\n const recency = RecencyRetriever.create(index).orThrow();\n expect(await recency.retrieve({ asOf: 150 })).toFailWith(/temporal query requires temporal index/i);\n });\n\n test('a Hybrid of [Recency, AsOf] lights up temporal recall via the temporal child', async () => {\n const recency = RecencyRetriever.create(index).orThrow();\n const asOf = AsOfRetriever.create(index).orThrow();\n const hybrid = HybridRetriever.create(\n [recency, asOf],\n ScoreUnionMergeStrategy.create().orThrow()\n ).orThrow();\n // The union supports temporal query, so the guard passes; Recency gets asOf\n // stripped (returns everything), AsOf returns the valid-at versions.\n expect(hybrid.capabilities.supportsTemporalQuery).toBe(true);\n expect(await hybrid.retrieve({ asOf: 250, kind: factKind })).toSucceedAndSatisfy((records) => {\n // fact-1-v2 is surfaced by BOTH (recency all + asOf), so it ranks first.\n expect(ids(records)[0]).toBe('fact-1-v2');\n expect(ids(records)).toContain('fact-2-v3');\n });\n });\n });\n});\n"]}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Antagonist torture tests — bi-temporal / two-clock boundary math (target class
3
+ * 2), complementing `temporalCodec.test.ts` (which already covers the
4
+ * `invalid_at`-exclusive boundary and the future-dated-supersede no-gap case).
5
+ * This file targets two remaining gaps: the `valid_at`-inclusive boundary, and
6
+ * an out-of-order sequence of `valid_at` writes.
7
+ */
8
+ import '@fgv/ts-utils-jest';
9
+ //# sourceMappingURL=antagonistTemporalBoundary.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antagonistTemporalBoundary.test.d.ts","sourceRoot":"","sources":["../../../../src/test/unit/store/antagonistTemporalBoundary.test.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AAEH,OAAO,oBAAoB,CAAC"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2026 Erik Fortune
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ /**
8
+ * Antagonist torture tests — bi-temporal / two-clock boundary math (target class
9
+ * 2), complementing `temporalCodec.test.ts` (which already covers the
10
+ * `invalid_at`-exclusive boundary and the future-dated-supersede no-gap case).
11
+ * This file targets two remaining gaps: the `valid_at`-inclusive boundary, and
12
+ * an out-of-order sequence of `valid_at` writes.
13
+ */
14
+ require("@fgv/ts-utils-jest");
15
+ const ts_utils_1 = require("@fgv/ts-utils");
16
+ const ts_json_base_1 = require("@fgv/ts-json-base");
17
+ const index_1 = require("../../../index");
18
+ const factKind = 'fact';
19
+ const factScope = 'facts/entities/fact-1';
20
+ function mutableRoot() {
21
+ const tree = ts_json_base_1.FileTree.inMemory([], { mutable: true }).orThrow();
22
+ const root = tree.getDirectory('/').orThrow();
23
+ if (!ts_json_base_1.FileTree.isMutableDirectoryItem(root)) {
24
+ throw new Error('expected a mutable root directory');
25
+ }
26
+ return root;
27
+ }
28
+ function registry() {
29
+ const reg = index_1.BodyConverterRegistry.create().orThrow();
30
+ reg.register(factKind, ts_utils_1.Converters.string);
31
+ return reg;
32
+ }
33
+ const codecs = new Map([
34
+ [factKind, index_1.TemporalIdentityCodec.create('facts').orThrow()]
35
+ ]);
36
+ const policies = new Map([
37
+ [factKind, index_1.TemporalVersionedPolicy.create().orThrow()]
38
+ ]);
39
+ function factRecordAt(entityId, body, validAt) {
40
+ return {
41
+ envelope: Object.assign({ id: entityId, entityId: entityId, kind: factKind, tags: [], links: [], created: 0, updated: 0, seq: 0, contentHash: '', provenance: { source: 'agent' } }, (validAt !== undefined ? { temporal: { valid_at: validAt } } : {})),
42
+ body
43
+ };
44
+ }
45
+ describe('antagonist — isVersionValidAt: valid_at is INCLUSIVE (start-boundary parity with the exclusive end)', () => {
46
+ // Wrong impl this catches: a `>` (strict) comparison for the start boundary
47
+ // instead of `<=`, which would incorrectly exclude the instant a version FIRST
48
+ // became valid — an asymmetry with the already-tested exclusive end boundary.
49
+ test('a version is valid AT its own valid_at instant, not just strictly after it', () => {
50
+ const v1 = {
51
+ envelope: index_1.envelopeConverter
52
+ .convert({
53
+ id: 'fact-1-v1',
54
+ entityId: 'fact-1',
55
+ kind: 'fact',
56
+ tags: [],
57
+ links: [],
58
+ created: 100,
59
+ updated: 100,
60
+ seq: 1,
61
+ contentHash: 'h1',
62
+ provenance: { source: 'agent' },
63
+ temporal: { valid_at: 100, invalid_at: 200 }
64
+ })
65
+ .orThrow(),
66
+ body: 'v1'
67
+ };
68
+ expect((0, index_1.isVersionValidAt)(v1, 99)).toBe(false); // strictly before
69
+ expect((0, index_1.isVersionValidAt)(v1, 100)).toBe(true); // AT valid_at — inclusive start
70
+ expect((0, index_1.isVersionValidAt)(v1, 199)).toBe(true); // just before invalid_at
71
+ expect((0, index_1.isVersionValidAt)(v1, 200)).toBe(false); // AT invalid_at — exclusive end
72
+ });
73
+ });
74
+ describe('antagonist — out-of-order valid_at sequence (no gap/overlap regardless of write order)', () => {
75
+ let clockValue;
76
+ const clock = () => clockValue;
77
+ function createStore() {
78
+ return index_1.FileTreeMemoryStore.create({
79
+ root: mutableRoot(),
80
+ registry: registry(),
81
+ codecs,
82
+ writePolicies: policies,
83
+ clock
84
+ }).orThrow();
85
+ }
86
+ // Wrong impl this catches: an implementation that assumes valid_at is
87
+ // monotonically increasing with seq (e.g. sorts by valid_at instead of seq for
88
+ // "current" resolution), which breaks the moment a caller backdates a SECOND
89
+ // time after an earlier future-dated write.
90
+ test('two consecutive backdated writes still close each prior interval at the NEW valid_at, not now', async () => {
91
+ const store = createStore();
92
+ clockValue = 1000;
93
+ // v1: valid_at defaults to transaction time (1000).
94
+ expect(await store.put(factRecordAt('fact-1', 'blue'))).toSucceed();
95
+ clockValue = 2000;
96
+ // v2: backdated BEHIND v1's own valid_at (500 < 1000) — a correction asserting
97
+ // "actually, this was already true starting at t=500".
98
+ expect(await store.put(factRecordAt('fact-1', 'grey', 500))).toSucceedAndSatisfy((put) => {
99
+ expect(put.envelope.temporal).toEqual({ valid_at: 500 });
100
+ });
101
+ // v1's interval must close at v2's valid_at (500), not the transaction time (2000).
102
+ expect(await store.getById(factScope, 'fact-1-v1')).toSucceedAndSatisfy((v1) => {
103
+ expect(v1 === null || v1 === void 0 ? void 0 : v1.envelope.temporal).toEqual({ valid_at: 1000, invalid_at: 500 });
104
+ });
105
+ clockValue = 3000;
106
+ // v3: backdated again, even further behind (100 < 500) — a SECOND correction.
107
+ expect(await store.put(factRecordAt('fact-1', 'black', 100))).toSucceedAndSatisfy((put) => {
108
+ expect(put.envelope.temporal).toEqual({ valid_at: 100 });
109
+ });
110
+ // v2's interval must close at v3's valid_at (100), not the transaction time (3000).
111
+ expect(await store.getById(factScope, 'fact-1-v2')).toSucceedAndSatisfy((v2) => {
112
+ expect(v2 === null || v2 === void 0 ? void 0 : v2.envelope.temporal).toEqual({ valid_at: 500, invalid_at: 100 });
113
+ });
114
+ // `selectCurrentVersion` still resolves the newest write by `seq` (v3),
115
+ // regardless of `valid_at` no longer being seq-monotonic.
116
+ expect(await store.get(factKind, 'fact-1')).toSucceedAndSatisfy((cur) => {
117
+ expect(cur === null || cur === void 0 ? void 0 : cur.envelope.id).toBe('fact-1-v3');
118
+ expect(cur === null || cur === void 0 ? void 0 : cur.body).toBe('black');
119
+ });
120
+ });
121
+ });
122
+ //# sourceMappingURL=antagonistTemporalBoundary.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antagonistTemporalBoundary.test.js","sourceRoot":"","sources":["../../../../src/test/unit/store/antagonistTemporalBoundary.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2026 Erik Fortune\n * SPDX-License-Identifier: MIT\n */\n\n/**\n * Antagonist torture tests — bi-temporal / two-clock boundary math (target class\n * 2), complementing `temporalCodec.test.ts` (which already covers the\n * `invalid_at`-exclusive boundary and the future-dated-supersede no-gap case).\n * This file targets two remaining gaps: the `valid_at`-inclusive boundary, and\n * an out-of-order sequence of `valid_at` writes.\n */\n\nimport '@fgv/ts-utils-jest';\nimport { Converters } from '@fgv/ts-utils';\nimport { FileTree } from '@fgv/ts-json-base';\nimport {\n BodyConverterRegistry,\n EntityId,\n FileTreeMemoryStore,\n IBodyConverterRegistry,\n IIdentityCodec,\n IMemoryRecord,\n IWritePolicy,\n Kind,\n MemoryScopeKey,\n TemporalIdentityCodec,\n TemporalVersionedPolicy,\n envelopeConverter,\n isVersionValidAt\n} from '../../../index';\n\nconst factKind: Kind = 'fact' as Kind;\nconst factScope: MemoryScopeKey = 'facts/entities/fact-1' as MemoryScopeKey;\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 registry(): IBodyConverterRegistry {\n const reg = BodyConverterRegistry.create().orThrow();\n reg.register(factKind, Converters.string);\n return reg;\n}\n\nconst codecs: ReadonlyMap<Kind, IIdentityCodec> = new Map<Kind, IIdentityCodec>([\n [factKind, TemporalIdentityCodec.create('facts').orThrow()]\n]);\nconst policies: ReadonlyMap<Kind, IWritePolicy> = new Map<Kind, IWritePolicy>([\n [factKind, TemporalVersionedPolicy.create().orThrow()]\n]);\n\nfunction factRecordAt(entityId: string, body: string, validAt?: number): IMemoryRecord<unknown> {\n return {\n envelope: {\n id: entityId as unknown as IMemoryRecord<unknown>['envelope']['id'],\n entityId: entityId as EntityId,\n kind: factKind,\n tags: [],\n links: [],\n created: 0,\n updated: 0,\n seq: 0,\n contentHash: '',\n provenance: { source: 'agent' },\n ...(validAt !== undefined ? { temporal: { valid_at: validAt } } : {})\n },\n body\n };\n}\n\ndescribe('antagonist — isVersionValidAt: valid_at is INCLUSIVE (start-boundary parity with the exclusive end)', () => {\n // Wrong impl this catches: a `>` (strict) comparison for the start boundary\n // instead of `<=`, which would incorrectly exclude the instant a version FIRST\n // became valid — an asymmetry with the already-tested exclusive end boundary.\n test('a version is valid AT its own valid_at instant, not just strictly after it', () => {\n const v1 = {\n envelope: envelopeConverter\n .convert({\n id: 'fact-1-v1',\n entityId: 'fact-1',\n kind: 'fact',\n tags: [],\n links: [],\n created: 100,\n updated: 100,\n seq: 1,\n contentHash: 'h1',\n provenance: { source: 'agent' },\n temporal: { valid_at: 100, invalid_at: 200 }\n })\n .orThrow(),\n body: 'v1'\n };\n expect(isVersionValidAt(v1, 99)).toBe(false); // strictly before\n expect(isVersionValidAt(v1, 100)).toBe(true); // AT valid_at — inclusive start\n expect(isVersionValidAt(v1, 199)).toBe(true); // just before invalid_at\n expect(isVersionValidAt(v1, 200)).toBe(false); // AT invalid_at — exclusive end\n });\n});\n\ndescribe('antagonist — out-of-order valid_at sequence (no gap/overlap regardless of write order)', () => {\n let clockValue: number;\n const clock = (): number => clockValue;\n\n function createStore(): FileTreeMemoryStore {\n return FileTreeMemoryStore.create({\n root: mutableRoot(),\n registry: registry(),\n codecs,\n writePolicies: policies,\n clock\n }).orThrow();\n }\n\n // Wrong impl this catches: an implementation that assumes valid_at is\n // monotonically increasing with seq (e.g. sorts by valid_at instead of seq for\n // \"current\" resolution), which breaks the moment a caller backdates a SECOND\n // time after an earlier future-dated write.\n test('two consecutive backdated writes still close each prior interval at the NEW valid_at, not now', async () => {\n const store = createStore();\n clockValue = 1000;\n // v1: valid_at defaults to transaction time (1000).\n expect(await store.put(factRecordAt('fact-1', 'blue'))).toSucceed();\n\n clockValue = 2000;\n // v2: backdated BEHIND v1's own valid_at (500 < 1000) — a correction asserting\n // \"actually, this was already true starting at t=500\".\n expect(await store.put(factRecordAt('fact-1', 'grey', 500))).toSucceedAndSatisfy((put) => {\n expect(put.envelope.temporal).toEqual({ valid_at: 500 });\n });\n // v1's interval must close at v2's valid_at (500), not the transaction time (2000).\n expect(await store.getById(factScope, 'fact-1-v1' as never)).toSucceedAndSatisfy((v1) => {\n expect(v1?.envelope.temporal).toEqual({ valid_at: 1000, invalid_at: 500 });\n });\n\n clockValue = 3000;\n // v3: backdated again, even further behind (100 < 500) — a SECOND correction.\n expect(await store.put(factRecordAt('fact-1', 'black', 100))).toSucceedAndSatisfy((put) => {\n expect(put.envelope.temporal).toEqual({ valid_at: 100 });\n });\n // v2's interval must close at v3's valid_at (100), not the transaction time (3000).\n expect(await store.getById(factScope, 'fact-1-v2' as never)).toSucceedAndSatisfy((v2) => {\n expect(v2?.envelope.temporal).toEqual({ valid_at: 500, invalid_at: 100 });\n });\n // `selectCurrentVersion` still resolves the newest write by `seq` (v3),\n // regardless of `valid_at` no longer being seq-monotonic.\n expect(await store.get(factKind, 'fact-1' as EntityId)).toSucceedAndSatisfy((cur) => {\n expect(cur?.envelope.id).toBe('fact-1-v3');\n expect(cur?.body).toBe('black');\n });\n });\n});\n"]}