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

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 (210) hide show
  1. package/.rush/temp/{b82cf6bdece20481260e6bab946179eeec9d7b46.tar.log → cbbdbe09515171b4eba8f2592be2dace1e4e8142.tar.log} +14 -2
  2. package/.rush/temp/chunked-rush-logs/ts-agent-memory.build.chunks.jsonl +2 -2
  3. package/.rush/temp/operation/build/all.log +2 -2
  4. package/.rush/temp/operation/build/log-chunks.jsonl +2 -2
  5. package/.rush/temp/operation/build/state.json +1 -1
  6. package/dist/packlets/converters/envelopeConverter.js +17 -3
  7. package/dist/packlets/converters/envelopeConverter.js.map +1 -1
  8. package/dist/packlets/index/memoryIndex.js +58 -10
  9. package/dist/packlets/index/memoryIndex.js.map +1 -1
  10. package/dist/packlets/ingest/cycleGuard.js +13 -6
  11. package/dist/packlets/ingest/cycleGuard.js.map +1 -1
  12. package/dist/packlets/ingest/hostStages.js.map +1 -1
  13. package/dist/packlets/ingest/model.js.map +1 -1
  14. package/dist/packlets/ingest/orchestrator.js +94 -49
  15. package/dist/packlets/ingest/orchestrator.js.map +1 -1
  16. package/dist/packlets/retrieve/hybridRetriever.js +13 -2
  17. package/dist/packlets/retrieve/hybridRetriever.js.map +1 -1
  18. package/dist/packlets/retrieve/linkTraversalRetriever.js +46 -57
  19. package/dist/packlets/retrieve/linkTraversalRetriever.js.map +1 -1
  20. package/dist/packlets/retrieve/recencyRetriever.js +3 -3
  21. package/dist/packlets/retrieve/recencyRetriever.js.map +1 -1
  22. package/dist/packlets/retrieve/retriever.js +50 -7
  23. package/dist/packlets/retrieve/retriever.js.map +1 -1
  24. package/dist/packlets/retrieve/semanticRetriever.js +9 -3
  25. package/dist/packlets/retrieve/semanticRetriever.js.map +1 -1
  26. package/dist/packlets/retrieve/structuredFilterRetriever.js +3 -3
  27. package/dist/packlets/retrieve/structuredFilterRetriever.js.map +1 -1
  28. package/dist/packlets/retrieve/tagRetriever.js +3 -3
  29. package/dist/packlets/retrieve/tagRetriever.js.map +1 -1
  30. package/dist/packlets/retrieve/temporalRetrievers.js +3 -3
  31. package/dist/packlets/retrieve/temporalRetrievers.js.map +1 -1
  32. package/dist/packlets/store/fileTreeMemoryStore.js +72 -16
  33. package/dist/packlets/store/fileTreeMemoryStore.js.map +1 -1
  34. package/dist/packlets/tools/memoryTools.js +104 -21
  35. package/dist/packlets/tools/memoryTools.js.map +1 -1
  36. package/dist/packlets/types/envelope.js +13 -1
  37. package/dist/packlets/types/envelope.js.map +1 -1
  38. package/dist/packlets/vector/inMemoryCosineIndex.js +22 -17
  39. package/dist/packlets/vector/inMemoryCosineIndex.js.map +1 -1
  40. package/dist/packlets/vector/vectorIndex.js.map +1 -1
  41. package/dist/test/unit/converters/antagonistRoundTrip.test.js +3 -3
  42. package/dist/test/unit/converters/antagonistRoundTrip.test.js.map +1 -1
  43. package/dist/test/unit/converters/envelopeConverter.test.js +125 -8
  44. package/dist/test/unit/converters/envelopeConverter.test.js.map +1 -1
  45. package/dist/test/unit/index/memoryIndex.test.js +87 -25
  46. package/dist/test/unit/index/memoryIndex.test.js.map +1 -1
  47. package/dist/test/unit/ingest/antagonistCycleAndParity.test.js +20 -16
  48. package/dist/test/unit/ingest/antagonistCycleAndParity.test.js.map +1 -1
  49. package/dist/test/unit/ingest/cycleGuard.test.js +28 -1
  50. package/dist/test/unit/ingest/cycleGuard.test.js.map +1 -1
  51. package/dist/test/unit/ingest/orchestrator.test.js +187 -45
  52. package/dist/test/unit/ingest/orchestrator.test.js.map +1 -1
  53. package/dist/test/unit/retrieve/linkTraversalRetriever.test.js +106 -31
  54. package/dist/test/unit/retrieve/linkTraversalRetriever.test.js.map +1 -1
  55. package/dist/test/unit/retrieve/retrievers.test.js +299 -37
  56. package/dist/test/unit/retrieve/retrievers.test.js.map +1 -1
  57. package/dist/test/unit/store/embedOnWrite.test.js +69 -12
  58. package/dist/test/unit/store/embedOnWrite.test.js.map +1 -1
  59. package/dist/test/unit/store/listScoped.test.js +109 -0
  60. package/dist/test/unit/store/listScoped.test.js.map +1 -0
  61. package/dist/test/unit/store/rankAxis.test.js +254 -0
  62. package/dist/test/unit/store/rankAxis.test.js.map +1 -0
  63. package/dist/test/unit/tools/memoryTools.test.js +280 -11
  64. package/dist/test/unit/tools/memoryTools.test.js.map +1 -1
  65. package/dist/test/unit/types/writePolicy.test.js +9 -2
  66. package/dist/test/unit/types/writePolicy.test.js.map +1 -1
  67. package/dist/test/unit/vector/inMemoryCosineIndex.test.js +95 -35
  68. package/dist/test/unit/vector/inMemoryCosineIndex.test.js.map +1 -1
  69. package/dist/test/unit/vector/vectorIndex.test.js +24 -15
  70. package/dist/test/unit/vector/vectorIndex.test.js.map +1 -1
  71. package/dist/ts-agent-memory.d.ts +384 -97
  72. package/etc/ts-agent-memory.api.md +64 -22
  73. package/lib/packlets/converters/envelopeConverter.d.ts +8 -1
  74. package/lib/packlets/converters/envelopeConverter.d.ts.map +1 -1
  75. package/lib/packlets/converters/envelopeConverter.js +18 -4
  76. package/lib/packlets/converters/envelopeConverter.js.map +1 -1
  77. package/lib/packlets/index/memoryIndex.d.ts +42 -10
  78. package/lib/packlets/index/memoryIndex.d.ts.map +1 -1
  79. package/lib/packlets/index/memoryIndex.js +58 -10
  80. package/lib/packlets/index/memoryIndex.js.map +1 -1
  81. package/lib/packlets/ingest/cycleGuard.d.ts +5 -5
  82. package/lib/packlets/ingest/cycleGuard.d.ts.map +1 -1
  83. package/lib/packlets/ingest/cycleGuard.js +13 -6
  84. package/lib/packlets/ingest/cycleGuard.js.map +1 -1
  85. package/lib/packlets/ingest/hostStages.d.ts +3 -3
  86. package/lib/packlets/ingest/hostStages.d.ts.map +1 -1
  87. package/lib/packlets/ingest/hostStages.js.map +1 -1
  88. package/lib/packlets/ingest/model.d.ts +25 -14
  89. package/lib/packlets/ingest/model.d.ts.map +1 -1
  90. package/lib/packlets/ingest/model.js.map +1 -1
  91. package/lib/packlets/ingest/orchestrator.d.ts +18 -4
  92. package/lib/packlets/ingest/orchestrator.d.ts.map +1 -1
  93. package/lib/packlets/ingest/orchestrator.js +93 -48
  94. package/lib/packlets/ingest/orchestrator.js.map +1 -1
  95. package/lib/packlets/retrieve/hybridRetriever.d.ts.map +1 -1
  96. package/lib/packlets/retrieve/hybridRetriever.js +12 -1
  97. package/lib/packlets/retrieve/hybridRetriever.js.map +1 -1
  98. package/lib/packlets/retrieve/linkTraversalRetriever.d.ts +18 -23
  99. package/lib/packlets/retrieve/linkTraversalRetriever.d.ts.map +1 -1
  100. package/lib/packlets/retrieve/linkTraversalRetriever.js +45 -56
  101. package/lib/packlets/retrieve/linkTraversalRetriever.js.map +1 -1
  102. package/lib/packlets/retrieve/recencyRetriever.js +2 -2
  103. package/lib/packlets/retrieve/recencyRetriever.js.map +1 -1
  104. package/lib/packlets/retrieve/retriever.d.ts +70 -11
  105. package/lib/packlets/retrieve/retriever.d.ts.map +1 -1
  106. package/lib/packlets/retrieve/retriever.js +52 -7
  107. package/lib/packlets/retrieve/retriever.js.map +1 -1
  108. package/lib/packlets/retrieve/semanticRetriever.d.ts.map +1 -1
  109. package/lib/packlets/retrieve/semanticRetriever.js +9 -3
  110. package/lib/packlets/retrieve/semanticRetriever.js.map +1 -1
  111. package/lib/packlets/retrieve/structuredFilterRetriever.js +2 -2
  112. package/lib/packlets/retrieve/structuredFilterRetriever.js.map +1 -1
  113. package/lib/packlets/retrieve/tagRetriever.js +2 -2
  114. package/lib/packlets/retrieve/tagRetriever.js.map +1 -1
  115. package/lib/packlets/retrieve/temporalRetrievers.js +3 -3
  116. package/lib/packlets/retrieve/temporalRetrievers.js.map +1 -1
  117. package/lib/packlets/store/fileTreeMemoryStore.d.ts +57 -3
  118. package/lib/packlets/store/fileTreeMemoryStore.d.ts.map +1 -1
  119. package/lib/packlets/store/fileTreeMemoryStore.js +72 -16
  120. package/lib/packlets/store/fileTreeMemoryStore.js.map +1 -1
  121. package/lib/packlets/tools/memoryTools.d.ts +24 -0
  122. package/lib/packlets/tools/memoryTools.d.ts.map +1 -1
  123. package/lib/packlets/tools/memoryTools.js +104 -21
  124. package/lib/packlets/tools/memoryTools.js.map +1 -1
  125. package/lib/packlets/types/envelope.d.ts +61 -8
  126. package/lib/packlets/types/envelope.d.ts.map +1 -1
  127. package/lib/packlets/types/envelope.js +14 -0
  128. package/lib/packlets/types/envelope.js.map +1 -1
  129. package/lib/packlets/vector/inMemoryCosineIndex.d.ts +9 -5
  130. package/lib/packlets/vector/inMemoryCosineIndex.d.ts.map +1 -1
  131. package/lib/packlets/vector/inMemoryCosineIndex.js +22 -17
  132. package/lib/packlets/vector/inMemoryCosineIndex.js.map +1 -1
  133. package/lib/packlets/vector/vectorIndex.d.ts +46 -20
  134. package/lib/packlets/vector/vectorIndex.d.ts.map +1 -1
  135. package/lib/packlets/vector/vectorIndex.js.map +1 -1
  136. package/lib/test/unit/converters/antagonistRoundTrip.test.js +3 -3
  137. package/lib/test/unit/converters/antagonistRoundTrip.test.js.map +1 -1
  138. package/lib/test/unit/converters/envelopeConverter.test.js +124 -7
  139. package/lib/test/unit/converters/envelopeConverter.test.js.map +1 -1
  140. package/lib/test/unit/index/memoryIndex.test.js +86 -24
  141. package/lib/test/unit/index/memoryIndex.test.js.map +1 -1
  142. package/lib/test/unit/ingest/antagonistCycleAndParity.test.js +20 -16
  143. package/lib/test/unit/ingest/antagonistCycleAndParity.test.js.map +1 -1
  144. package/lib/test/unit/ingest/cycleGuard.test.js +28 -1
  145. package/lib/test/unit/ingest/cycleGuard.test.js.map +1 -1
  146. package/lib/test/unit/ingest/orchestrator.test.js +186 -44
  147. package/lib/test/unit/ingest/orchestrator.test.js.map +1 -1
  148. package/lib/test/unit/retrieve/linkTraversalRetriever.test.js +106 -31
  149. package/lib/test/unit/retrieve/linkTraversalRetriever.test.js.map +1 -1
  150. package/lib/test/unit/retrieve/retrievers.test.js +298 -36
  151. package/lib/test/unit/retrieve/retrievers.test.js.map +1 -1
  152. package/lib/test/unit/store/embedOnWrite.test.js +68 -11
  153. package/lib/test/unit/store/embedOnWrite.test.js.map +1 -1
  154. package/lib/test/unit/store/listScoped.test.d.ts +2 -0
  155. package/lib/test/unit/store/listScoped.test.d.ts.map +1 -0
  156. package/lib/test/unit/store/listScoped.test.js +111 -0
  157. package/lib/test/unit/store/listScoped.test.js.map +1 -0
  158. package/lib/test/unit/store/rankAxis.test.d.ts +2 -0
  159. package/lib/test/unit/store/rankAxis.test.d.ts.map +1 -0
  160. package/lib/test/unit/store/rankAxis.test.js +256 -0
  161. package/lib/test/unit/store/rankAxis.test.js.map +1 -0
  162. package/lib/test/unit/tools/memoryTools.test.js +280 -11
  163. package/lib/test/unit/tools/memoryTools.test.js.map +1 -1
  164. package/lib/test/unit/types/writePolicy.test.js +9 -2
  165. package/lib/test/unit/types/writePolicy.test.js.map +1 -1
  166. package/lib/test/unit/vector/inMemoryCosineIndex.test.js +95 -35
  167. package/lib/test/unit/vector/inMemoryCosineIndex.test.js.map +1 -1
  168. package/lib/test/unit/vector/vectorIndex.test.js +24 -15
  169. package/lib/test/unit/vector/vectorIndex.test.js.map +1 -1
  170. package/package.json +7 -7
  171. package/rush-logs/ts-agent-memory.build.cache.log +1 -1
  172. package/rush-logs/ts-agent-memory.build.log +2 -2
  173. package/src/packlets/converters/envelopeConverter.ts +27 -4
  174. package/src/packlets/index/memoryIndex.ts +86 -22
  175. package/src/packlets/ingest/cycleGuard.ts +22 -11
  176. package/src/packlets/ingest/hostStages.ts +3 -3
  177. package/src/packlets/ingest/model.ts +25 -14
  178. package/src/packlets/ingest/orchestrator.ts +143 -67
  179. package/src/packlets/retrieve/hybridRetriever.ts +14 -1
  180. package/src/packlets/retrieve/linkTraversalRetriever.ts +51 -62
  181. package/src/packlets/retrieve/recencyRetriever.ts +3 -3
  182. package/src/packlets/retrieve/retriever.ts +97 -13
  183. package/src/packlets/retrieve/semanticRetriever.ts +10 -5
  184. package/src/packlets/retrieve/structuredFilterRetriever.ts +3 -3
  185. package/src/packlets/retrieve/tagRetriever.ts +3 -3
  186. package/src/packlets/retrieve/temporalRetrievers.ts +3 -3
  187. package/src/packlets/store/fileTreeMemoryStore.ts +117 -12
  188. package/src/packlets/tools/memoryTools.ts +152 -25
  189. package/src/packlets/types/envelope.ts +66 -8
  190. package/src/packlets/vector/inMemoryCosineIndex.ts +45 -22
  191. package/src/packlets/vector/vectorIndex.ts +47 -20
  192. package/src/test/unit/converters/antagonistRoundTrip.test.ts +3 -3
  193. package/src/test/unit/converters/envelopeConverter.test.ts +168 -11
  194. package/src/test/unit/index/memoryIndex.test.ts +99 -14
  195. package/src/test/unit/ingest/antagonistCycleAndParity.test.ts +23 -18
  196. package/src/test/unit/ingest/cycleGuard.test.ts +44 -2
  197. package/src/test/unit/ingest/orchestrator.test.ts +234 -41
  198. package/src/test/unit/retrieve/linkTraversalRetriever.test.ts +134 -35
  199. package/src/test/unit/retrieve/retrievers.test.ts +381 -25
  200. package/src/test/unit/store/embedOnWrite.test.ts +83 -11
  201. package/src/test/unit/store/listScoped.test.ts +138 -0
  202. package/src/test/unit/store/rankAxis.test.ts +349 -0
  203. package/src/test/unit/tools/memoryTools.test.ts +362 -13
  204. package/src/test/unit/types/writePolicy.test.ts +11 -2
  205. package/src/test/unit/vector/inMemoryCosineIndex.test.ts +115 -39
  206. package/src/test/unit/vector/vectorIndex.test.ts +33 -17
  207. package/temp/build/lint/_eslint-5eVG3S6w.json +41 -33
  208. package/temp/build/typescript/ts_8nwakTlr.json +1 -1
  209. package/temp/ts-agent-memory.api.json +1080 -136
  210. package/temp/ts-agent-memory.api.md +64 -22
@@ -6,13 +6,21 @@
6
6
  import '@fgv/ts-utils-jest';
7
7
  import { Result, fail, succeed } from '@fgv/ts-utils';
8
8
  import {
9
+ IEdgeTarget,
9
10
  IMemoryRecord,
10
11
  IMemoryRecordSource,
12
+ IScopedMemoryRecord,
11
13
  IVectorQueryHit,
12
14
  InMemoryCosineIndex,
13
- MemoryId
15
+ MemoryId,
16
+ MemoryScopeKey
14
17
  } from '../../../index';
15
18
 
19
+ /** A scope-qualified target from a `(scope, id)` pair. */
20
+ function target(scope: string, id: string): IEdgeTarget {
21
+ return { scope: scope as MemoryScopeKey, id: id as MemoryId };
22
+ }
23
+
16
24
  /** A trivial record carrying just the id + a marker body, for rebuild tests. */
17
25
  function record(id: string, body: string = `body-${id}`): IMemoryRecord<unknown> {
18
26
  return {
@@ -22,30 +30,37 @@ function record(id: string, body: string = `body-${id}`): IMemoryRecord<unknown>
22
30
  };
23
31
  }
24
32
 
33
+ /** A scope-qualified record entry for a rebuild source. */
34
+ function scoped(scope: string, id: string, body?: string): IScopedMemoryRecord {
35
+ return { target: target(scope, id), record: record(id, body) };
36
+ }
37
+
25
38
  /** A scripted record source for `rebuild`. */
26
39
  class FakeSource implements IMemoryRecordSource {
27
- private readonly _result: Result<ReadonlyArray<IMemoryRecord<unknown>>>;
28
- public constructor(result: Result<ReadonlyArray<IMemoryRecord<unknown>>>) {
40
+ private readonly _result: Result<ReadonlyArray<IScopedMemoryRecord>>;
41
+ public constructor(result: Result<ReadonlyArray<IScopedMemoryRecord>>) {
29
42
  this._result = result;
30
43
  }
31
- public list(): Promise<Result<ReadonlyArray<IMemoryRecord<unknown>>>> {
44
+ public list(): Promise<Result<ReadonlyArray<IScopedMemoryRecord>>> {
32
45
  return Promise.resolve(this._result);
33
46
  }
34
47
  }
35
48
 
36
49
  describe('InMemoryCosineIndex', () => {
37
50
  describe('add', () => {
38
- test('returns the id as the embedding ref and tracks size', async () => {
51
+ test('returns the scoped-target key as the embedding ref and tracks size', async () => {
39
52
  const index = InMemoryCosineIndex.create().orThrow();
40
53
  expect(index.size).toBe(0);
41
- expect(await index.add('a' as MemoryId, Float32Array.from([1, 0]))).toSucceedWith('a');
54
+ const t = target('conv-a', 'turn-1');
55
+ expect(await index.add(t, Float32Array.from([1, 0]))).toSucceedWith(`conv-a\0turn-1`);
42
56
  expect(index.size).toBe(1);
43
57
  });
44
58
 
45
- test('replaces the vector on a same-id add', async () => {
59
+ test('replaces the vector on a same-target add', async () => {
46
60
  const index = InMemoryCosineIndex.create().orThrow();
47
- expect(await index.add('a' as MemoryId, Float32Array.from([1, 0]))).toSucceed();
48
- expect(await index.add('a' as MemoryId, Float32Array.from([0, 1]))).toSucceed();
61
+ const t = target('conv-a', 'turn-1');
62
+ expect(await index.add(t, Float32Array.from([1, 0]))).toSucceed();
63
+ expect(await index.add(t, Float32Array.from([0, 1]))).toSucceed();
49
64
  expect(index.size).toBe(1);
50
65
  // The query now matches the replacement vector ([0,1]) not the original.
51
66
  expect(await index.query(Float32Array.from([0, 1]), 1)).toSucceedAndSatisfy(
@@ -55,15 +70,37 @@ describe('InMemoryCosineIndex', () => {
55
70
  );
56
71
  });
57
72
 
73
+ test('same stem in different scopes are distinct entries — the second add does NOT clobber the first', async () => {
74
+ const index = InMemoryCosineIndex.create().orThrow();
75
+ const a = target('conv-a', 'turn-3');
76
+ const b = target('conv-b', 'turn-3');
77
+ // Two records with the identical stem, orthogonal embeddings.
78
+ expect(await index.add(a, Float32Array.from([1, 0]))).toSucceed();
79
+ expect(await index.add(b, Float32Array.from([0, 1]))).toSucceed();
80
+ // The bug: a bare-id index would have collapsed these to one entry.
81
+ expect(index.size).toBe(2);
82
+ // A query surfaces BOTH as distinct hits carrying distinct scoped targets.
83
+ expect(await index.query(Float32Array.from([1, 1]), 5)).toSucceedAndSatisfy(
84
+ (hits: ReadonlyArray<IVectorQueryHit>) => {
85
+ expect(hits).toHaveLength(2);
86
+ expect(hits.map((h) => h.target)).toEqual(expect.arrayContaining([a, b]));
87
+ // Each retains its OWN embedding: a matches [1,0], b matches [0,1].
88
+ const byScope = new Map(hits.map((h) => [h.target.scope, h.score]));
89
+ expect(byScope.get('conv-a' as MemoryScopeKey)).toBeCloseTo(1 / Math.sqrt(2));
90
+ expect(byScope.get('conv-b' as MemoryScopeKey)).toBeCloseTo(1 / Math.sqrt(2));
91
+ }
92
+ );
93
+ });
94
+
58
95
  test('fails loudly on an empty vector', async () => {
59
96
  const index = InMemoryCosineIndex.create().orThrow();
60
- expect(await index.add('a' as MemoryId, new Float32Array(0))).toFailWith(/empty vector/i);
97
+ expect(await index.add(target('conv-a', 'turn-1'), new Float32Array(0))).toFailWith(/empty vector/i);
61
98
  });
62
99
 
63
100
  test('stores a defensive copy — mutating the caller buffer after add does not corrupt the index', async () => {
64
101
  const index = InMemoryCosineIndex.create().orThrow();
65
102
  const buffer = Float32Array.from([1, 0]);
66
- (await index.add('a' as MemoryId, buffer)).orThrow();
103
+ (await index.add(target('conv-a', 'turn-1'), buffer)).orThrow();
67
104
  // Mutate the caller's buffer after the add; the stored vector must be unaffected.
68
105
  buffer[0] = 0;
69
106
  buffer[1] = 1;
@@ -77,8 +114,8 @@ describe('InMemoryCosineIndex', () => {
77
114
 
78
115
  test('fails loudly on a dimension mismatch against the established dimension', async () => {
79
116
  const index = InMemoryCosineIndex.create().orThrow();
80
- expect(await index.add('a' as MemoryId, Float32Array.from([1, 0]))).toSucceed();
81
- expect(await index.add('b' as MemoryId, Float32Array.from([1, 0, 0]))).toFailWith(
117
+ expect(await index.add(target('conv-a', 'a'), Float32Array.from([1, 0]))).toSucceed();
118
+ expect(await index.add(target('conv-a', 'b'), Float32Array.from([1, 0, 0]))).toFailWith(
82
119
  /dimension 3 does not match index dimension 2/i
83
120
  );
84
121
  });
@@ -87,9 +124,9 @@ describe('InMemoryCosineIndex', () => {
87
124
  describe('query', () => {
88
125
  async function seeded(): Promise<InMemoryCosineIndex> {
89
126
  const index = InMemoryCosineIndex.create().orThrow();
90
- (await index.add('a' as MemoryId, Float32Array.from([1, 0]))).orThrow();
91
- (await index.add('b' as MemoryId, Float32Array.from([0, 1]))).orThrow();
92
- (await index.add('c' as MemoryId, Float32Array.from([1, 1]))).orThrow();
127
+ (await index.add(target('s', 'a'), Float32Array.from([1, 0]))).orThrow();
128
+ (await index.add(target('s', 'b'), Float32Array.from([0, 1]))).orThrow();
129
+ (await index.add(target('s', 'c'), Float32Array.from([1, 1]))).orThrow();
93
130
  return index;
94
131
  }
95
132
 
@@ -97,7 +134,7 @@ describe('InMemoryCosineIndex', () => {
97
134
  const index = await seeded();
98
135
  expect(await index.query(Float32Array.from([1, 0]), 3)).toSucceedAndSatisfy(
99
136
  (hits: ReadonlyArray<IVectorQueryHit>) => {
100
- expect(hits.map((h) => h.id)).toEqual(['a', 'c', 'b']);
137
+ expect(hits.map((h) => h.target.id)).toEqual(['a', 'c', 'b']);
101
138
  expect(hits[0].score).toBeCloseTo(1);
102
139
  expect(hits[1].score).toBeCloseTo(1 / Math.sqrt(2));
103
140
  expect(hits[2].score).toBeCloseTo(0);
@@ -109,7 +146,7 @@ describe('InMemoryCosineIndex', () => {
109
146
  const index = await seeded();
110
147
  expect(await index.query(Float32Array.from([1, 0]), 2)).toSucceedAndSatisfy(
111
148
  (hits: ReadonlyArray<IVectorQueryHit>) => {
112
- expect(hits.map((h) => h.id)).toEqual(['a', 'c']);
149
+ expect(hits.map((h) => h.target.id)).toEqual(['a', 'c']);
113
150
  }
114
151
  );
115
152
  });
@@ -134,11 +171,11 @@ describe('InMemoryCosineIndex', () => {
134
171
 
135
172
  test('scores a degenerate (zero-magnitude) stored vector as 0 rather than NaN', async () => {
136
173
  const index = InMemoryCosineIndex.create().orThrow();
137
- (await index.add('zero' as MemoryId, Float32Array.from([0, 0]))).orThrow();
138
- (await index.add('unit' as MemoryId, Float32Array.from([1, 0]))).orThrow();
174
+ (await index.add(target('s', 'zero'), Float32Array.from([0, 0]))).orThrow();
175
+ (await index.add(target('s', 'unit'), Float32Array.from([1, 0]))).orThrow();
139
176
  expect(await index.query(Float32Array.from([1, 0]), 2)).toSucceedAndSatisfy(
140
177
  (hits: ReadonlyArray<IVectorQueryHit>) => {
141
- expect(hits.map((h) => h.id)).toEqual(['unit', 'zero']);
178
+ expect(hits.map((h) => h.target.id)).toEqual(['unit', 'zero']);
142
179
  expect(hits[1].score).toBe(0);
143
180
  }
144
181
  );
@@ -146,7 +183,7 @@ describe('InMemoryCosineIndex', () => {
146
183
 
147
184
  test('scores against a degenerate (zero-magnitude) query as 0 rather than NaN', async () => {
148
185
  const index = InMemoryCosineIndex.create().orThrow();
149
- (await index.add('unit' as MemoryId, Float32Array.from([1, 0]))).orThrow();
186
+ (await index.add(target('s', 'unit'), Float32Array.from([1, 0]))).orThrow();
150
187
  expect(await index.query(Float32Array.from([0, 0]), 1)).toSucceedAndSatisfy(
151
188
  (hits: ReadonlyArray<IVectorQueryHit>) => {
152
189
  expect(hits[0].score).toBe(0);
@@ -158,20 +195,41 @@ describe('InMemoryCosineIndex', () => {
158
195
  describe('remove', () => {
159
196
  test('removes a vector and is reflected in subsequent queries', async () => {
160
197
  const index = InMemoryCosineIndex.create().orThrow();
161
- (await index.add('a' as MemoryId, Float32Array.from([1, 0]))).orThrow();
162
- (await index.add('b' as MemoryId, Float32Array.from([0, 1]))).orThrow();
163
- expect(await index.remove('a' as MemoryId)).toSucceedWith('a' as MemoryId);
198
+ const a = target('s', 'a');
199
+ const b = target('s', 'b');
200
+ (await index.add(a, Float32Array.from([1, 0]))).orThrow();
201
+ (await index.add(b, Float32Array.from([0, 1]))).orThrow();
202
+ expect(await index.remove(a)).toSucceedWith(a);
164
203
  expect(index.size).toBe(1);
165
204
  expect(await index.query(Float32Array.from([1, 0]), 5)).toSucceedAndSatisfy(
166
205
  (hits: ReadonlyArray<IVectorQueryHit>) => {
167
- expect(hits.map((h) => h.id)).toEqual(['b']);
206
+ expect(hits.map((h) => h.target.id)).toEqual(['b']);
168
207
  }
169
208
  );
170
209
  });
171
210
 
172
- test('is idempotentremoving an absent id still succeeds', async () => {
211
+ test('removes only the scoped target a same-stem record in another scope is left intact', async () => {
173
212
  const index = InMemoryCosineIndex.create().orThrow();
174
- expect(await index.remove('missing' as MemoryId)).toSucceedWith('missing' as MemoryId);
213
+ const a = target('conv-a', 'turn-3');
214
+ const b = target('conv-b', 'turn-3');
215
+ (await index.add(a, Float32Array.from([1, 0]))).orThrow();
216
+ (await index.add(b, Float32Array.from([0, 1]))).orThrow();
217
+ expect(await index.remove(a)).toSucceedWith(a);
218
+ expect(index.size).toBe(1);
219
+ // conv-b's embedding survives untouched.
220
+ expect(await index.query(Float32Array.from([0, 1]), 5)).toSucceedAndSatisfy(
221
+ (hits: ReadonlyArray<IVectorQueryHit>) => {
222
+ expect(hits).toHaveLength(1);
223
+ expect(hits[0].target).toEqual(b);
224
+ expect(hits[0].score).toBeCloseTo(1);
225
+ }
226
+ );
227
+ });
228
+
229
+ test('is idempotent — removing an absent target still succeeds', async () => {
230
+ const index = InMemoryCosineIndex.create().orThrow();
231
+ const t = target('s', 'missing');
232
+ expect(await index.remove(t)).toSucceedWith(t);
175
233
  });
176
234
  });
177
235
 
@@ -182,15 +240,30 @@ describe('InMemoryCosineIndex', () => {
182
240
  return Promise.resolve(succeed(Float32Array.from([code, 1])));
183
241
  };
184
242
 
185
- test('re-embeds every record from the source and reports the count', async () => {
243
+ test('re-embeds every scoped record from the source and reports the count', async () => {
186
244
  const index = InMemoryCosineIndex.create().orThrow();
187
- const source = new FakeSource(succeed([record('a'), record('b'), record('c')]));
245
+ const source = new FakeSource(succeed([scoped('s', 'a'), scoped('s', 'b'), scoped('s', 'c')]));
188
246
  expect(await index.rebuild(source, embed)).toSucceedWith(3);
189
247
  expect(index.size).toBe(3);
190
248
  expect(await index.query(Float32Array.from([99, 1]), 1)).toSucceedAndSatisfy(
191
249
  (hits: ReadonlyArray<IVectorQueryHit>) => {
192
250
  // 'c' = char code 99, the closest to the query vector.
193
- expect(hits[0].id).toBe('c');
251
+ expect(hits[0].target.id).toBe('c');
252
+ }
253
+ );
254
+ });
255
+
256
+ test('keeps same-stem records under different scopes distinct across a rebuild', async () => {
257
+ const index = InMemoryCosineIndex.create().orThrow();
258
+ const source = new FakeSource(succeed([scoped('conv-a', 'turn-3'), scoped('conv-b', 'turn-3')]));
259
+ // The embedder keys only off the (shared) id, so a bare-id rebuild would
260
+ // index just one entry; the scoped rebuild indexes both.
261
+ expect(await index.rebuild(source, embed)).toSucceedWith(2);
262
+ expect(index.size).toBe(2);
263
+ expect(await index.query(Float32Array.from([116, 1]), 5)).toSucceedAndSatisfy(
264
+ (hits: ReadonlyArray<IVectorQueryHit>) => {
265
+ expect(hits).toHaveLength(2);
266
+ expect(hits.map((h) => h.target.scope).sort()).toEqual(['conv-a', 'conv-b']);
194
267
  }
195
268
  );
196
269
  });
@@ -198,8 +271,8 @@ describe('InMemoryCosineIndex', () => {
198
271
  test('clears prior contents and re-establishes the dimension', async () => {
199
272
  const index = InMemoryCosineIndex.create().orThrow();
200
273
  // Seed a 3-dim vector, then rebuild with a 2-dim embedder.
201
- (await index.add('old' as MemoryId, Float32Array.from([1, 2, 3]))).orThrow();
202
- const source = new FakeSource(succeed([record('a')]));
274
+ (await index.add(target('s', 'old'), Float32Array.from([1, 2, 3]))).orThrow();
275
+ const source = new FakeSource(succeed([scoped('s', 'a')]));
203
276
  expect(await index.rebuild(source, embed)).toSucceedWith(1);
204
277
  expect(index.size).toBe(1);
205
278
  // The 2-dim query now succeeds (dimension was reset by rebuild).
@@ -209,7 +282,7 @@ describe('InMemoryCosineIndex', () => {
209
282
  test('fails loudly when the source list fails', async () => {
210
283
  const index = InMemoryCosineIndex.create().orThrow();
211
284
  // Seed an entry so the reset-before-list rollback is observable, not just "stayed empty".
212
- (await index.add('seed' as MemoryId, Float32Array.from([1, 1]))).orThrow();
285
+ (await index.add(target('s', 'seed'), Float32Array.from([1, 1]))).orThrow();
213
286
  const source = new FakeSource(fail('disk gone'));
214
287
  expect(await index.rebuild(source, embed)).toFailWith(/failed to list records: disk gone/i);
215
288
  expect(index.size).toBe(0);
@@ -218,22 +291,25 @@ describe('InMemoryCosineIndex', () => {
218
291
  test('fails loudly and rolls back to empty when an embedding fails mid-rebuild', async () => {
219
292
  const index = InMemoryCosineIndex.create().orThrow();
220
293
  // Seed an existing entry so the rollback (not merely "stayed empty") is observable.
221
- (await index.add('seed' as MemoryId, Float32Array.from([1, 1]))).orThrow();
294
+ (await index.add(target('s', 'seed'), Float32Array.from([1, 1]))).orThrow();
222
295
  // First record embeds fine, the second fails — so a naive impl would leave
223
296
  // record 'a' indexed; the rollback must clear it.
224
297
  let calls: number = 0;
225
- const flakyEmbed = (r: IMemoryRecord<unknown>): Promise<Result<Float32Array>> => {
298
+ const flakyEmbed = (): Promise<Result<Float32Array>> => {
226
299
  calls += 1;
227
300
  return Promise.resolve(calls === 1 ? succeed(Float32Array.from([1, 1])) : fail('no model'));
228
301
  };
229
- const source = new FakeSource(succeed([record('a'), record('b')]));
230
- expect(await index.rebuild(source, flakyEmbed)).toFailWith(/embedding 'b' failed: no model/i);
302
+ const source = new FakeSource(succeed([scoped('conv-a', 'turn-1'), scoped('conv-b', 'turn-1')]));
303
+ // The failing record's error names its scope-qualified key.
304
+ expect(await index.rebuild(source, flakyEmbed)).toFailWith(
305
+ /embedding 'conv-b\0turn-1' failed: no model/i
306
+ );
231
307
  expect(index.size).toBe(0);
232
308
  });
233
309
 
234
310
  test('fails loudly and rolls back to empty when adding an embedded vector fails', async () => {
235
311
  const index = InMemoryCosineIndex.create().orThrow();
236
- const source = new FakeSource(succeed([record('a')]));
312
+ const source = new FakeSource(succeed([scoped('s', 'a')]));
237
313
  const emptyEmbed = (): Promise<Result<Float32Array>> => Promise.resolve(succeed(new Float32Array(0)));
238
314
  expect(await index.rebuild(source, emptyEmbed)).toFailWith(/empty vector/i);
239
315
  expect(index.size).toBe(0);
@@ -5,44 +5,60 @@
5
5
 
6
6
  import '@fgv/ts-utils-jest';
7
7
  import { Result, succeed } from '@fgv/ts-utils';
8
- import { IVectorIndex, IVectorQueryHit, MemoryId } from '../../../index';
8
+ import {
9
+ IEdgeTarget,
10
+ IVectorIndex,
11
+ IVectorQueryHit,
12
+ MemoryId,
13
+ MemoryScopeKey,
14
+ edgeTargetKey
15
+ } from '../../../index';
16
+
17
+ function target(scope: string, id: string): IEdgeTarget {
18
+ return { scope: scope as MemoryScopeKey, id: id as MemoryId };
19
+ }
9
20
 
10
21
  /**
11
22
  * A trivial conforming implementation, present to verify the {@link IVectorIndex}
12
- * seam is usable end-to-end (the in-package cosine impl is a post-v1 fast-follow).
23
+ * seam is usable end-to-end with scope-qualified targets.
13
24
  */
14
25
  class StubVectorIndex implements IVectorIndex {
15
- private readonly _vectors: Map<MemoryId, Float32Array> = new Map();
26
+ private readonly _vectors: Map<string, IEdgeTarget> = new Map();
16
27
 
17
- public add(id: MemoryId, vector: Float32Array): Promise<Result<string>> {
18
- this._vectors.set(id, vector);
19
- return Promise.resolve(succeed(`ref-${id}`));
28
+ public add(t: IEdgeTarget, vector: Float32Array): Promise<Result<string>> {
29
+ const key: string = edgeTargetKey(t);
30
+ this._vectors.set(key, t);
31
+ return Promise.resolve(succeed(`ref-${key}`));
20
32
  }
21
33
 
22
- public remove(id: MemoryId): Promise<Result<MemoryId>> {
23
- this._vectors.delete(id);
24
- return Promise.resolve(succeed(id));
34
+ public remove(t: IEdgeTarget): Promise<Result<IEdgeTarget>> {
35
+ this._vectors.delete(edgeTargetKey(t));
36
+ return Promise.resolve(succeed(t));
25
37
  }
26
38
 
27
39
  public query(vector: Float32Array, topK: number): Promise<Result<ReadonlyArray<IVectorQueryHit>>> {
28
- const hits: IVectorQueryHit[] = Array.from(this._vectors.keys())
29
- .map((id) => ({ id, score: vector.length }))
40
+ const hits: IVectorQueryHit[] = Array.from(this._vectors.values())
41
+ .map((t) => ({ target: t, score: vector.length }))
30
42
  .slice(0, topK);
31
43
  return Promise.resolve(succeed(hits));
32
44
  }
33
45
  }
34
46
 
35
47
  describe('IVectorIndex seam', () => {
36
- test('a conforming implementation supports add / query / remove', async () => {
48
+ test('a conforming implementation supports add / query / remove on scoped targets', async () => {
37
49
  const index = new StubVectorIndex();
38
- expect(await index.add('a' as MemoryId, Float32Array.from([1, 2, 3]))).toSucceedWith('ref-a');
39
- expect(await index.add('b' as MemoryId, Float32Array.from([4, 5, 6]))).toSucceedWith('ref-b');
40
- expect(await index.query(Float32Array.from([0.1, 0.2]), 1)).toSucceedAndSatisfy(
50
+ const a = target('conv-a', 'turn-3');
51
+ const b = target('conv-b', 'turn-3');
52
+ expect(await index.add(a, Float32Array.from([1, 2, 3]))).toSucceedWith(`ref-${edgeTargetKey(a)}`);
53
+ expect(await index.add(b, Float32Array.from([4, 5, 6]))).toSucceedWith(`ref-${edgeTargetKey(b)}`);
54
+ expect(await index.query(Float32Array.from([0.1, 0.2]), 2)).toSucceedAndSatisfy(
41
55
  (hits: ReadonlyArray<IVectorQueryHit>) => {
42
- expect(hits).toHaveLength(1);
56
+ // Both same-stem-different-scope targets are distinct entries.
57
+ expect(hits).toHaveLength(2);
58
+ expect(hits.map((h) => h.target)).toEqual(expect.arrayContaining([a, b]));
43
59
  expect(hits[0].score).toBe(2);
44
60
  }
45
61
  );
46
- expect(await index.remove('a' as MemoryId)).toSucceedWith('a' as MemoryId);
62
+ expect(await index.remove(a)).toSucceedWith(a);
47
63
  });
48
64
  });
@@ -11,7 +11,7 @@
11
11
  ],
12
12
  [
13
13
  "packlets/types/envelope.ts",
14
- "6b2ca3800b4abe70537b4ee72d24e5a391209dd692e7eaaaa84ed4bcfedd1e69_5FxNr7n+qjkV58wA2j2YZUqKABE="
14
+ "b577527722f9fbcf55aae9ab5c3dd58ec06e43567c327626a91aa7b8536f2876_5FxNr7n+qjkV58wA2j2YZUqKABE="
15
15
  ],
16
16
  [
17
17
  "packlets/types/identityCodec.ts",
@@ -35,7 +35,7 @@
35
35
  ],
36
36
  [
37
37
  "packlets/converters/envelopeConverter.ts",
38
- "a39cb2d72541fb757ec2d6eff49d346b2ba1117509b520b476db55f58cb97b02_5FxNr7n+qjkV58wA2j2YZUqKABE="
38
+ "7904ff7ab8e4eb5a3a51bafc7ac540ae8e754441e3b8c31bfdf8cb11f51a7ae5_5FxNr7n+qjkV58wA2j2YZUqKABE="
39
39
  ],
40
40
  [
41
41
  "packlets/converters/index.ts",
@@ -43,7 +43,7 @@
43
43
  ],
44
44
  [
45
45
  "packlets/index/memoryIndex.ts",
46
- "1fb0c0ebfc5d9df50f352a3509417e2a5fe56ac73651fbc8e85d61c6c495b170_5FxNr7n+qjkV58wA2j2YZUqKABE="
46
+ "66f10dda4070267a4d4fa00fd8907caa6c60a221fa3e487a4b2bd9a677e8a301_5FxNr7n+qjkV58wA2j2YZUqKABE="
47
47
  ],
48
48
  [
49
49
  "packlets/index/index.ts",
@@ -63,11 +63,11 @@
63
63
  ],
64
64
  [
65
65
  "packlets/vector/vectorIndex.ts",
66
- "88b2f13d5e4bab4bec20fc37b04665a8fe238acc673aaa597f96c76fa6de6fc8_5FxNr7n+qjkV58wA2j2YZUqKABE="
66
+ "80f85adb4c3207cdb63231d5effe72b8004803399d2c438ca47f00b66d7f02ca_5FxNr7n+qjkV58wA2j2YZUqKABE="
67
67
  ],
68
68
  [
69
69
  "packlets/vector/inMemoryCosineIndex.ts",
70
- "b4702bbe7d33bf72737f32a83454dc17ab0a52bd6b9f3f2c9eb32dd9f2462d72_5FxNr7n+qjkV58wA2j2YZUqKABE="
70
+ "a38638516326b44f98e6bd65e2bd1a9cd515d5ffbe3acbecfb9e255a8d22dbc9_5FxNr7n+qjkV58wA2j2YZUqKABE="
71
71
  ],
72
72
  [
73
73
  "packlets/vector/index.ts",
@@ -79,7 +79,7 @@
79
79
  ],
80
80
  [
81
81
  "packlets/store/fileTreeMemoryStore.ts",
82
- "75746b65d0cde19462c3f6809a59fd60985864bf5fa1a66c7a59795115b49b8b_5FxNr7n+qjkV58wA2j2YZUqKABE="
82
+ "749eeff65789b45015b19993c41ff79fa124f314d34b3a9dd6f63edd77059e4c_5FxNr7n+qjkV58wA2j2YZUqKABE="
83
83
  ],
84
84
  [
85
85
  "packlets/store/index.ts",
@@ -87,35 +87,35 @@
87
87
  ],
88
88
  [
89
89
  "packlets/retrieve/retriever.ts",
90
- "68efaa8d1690fbb0d372e72128443aba31de4192bf2a822c232e931b95f89990_5FxNr7n+qjkV58wA2j2YZUqKABE="
90
+ "f8bf85cf7e3fe260eebd79f87e1429acbea25d6dc53af31c8d16c76032afb199_5FxNr7n+qjkV58wA2j2YZUqKABE="
91
91
  ],
92
92
  [
93
93
  "packlets/retrieve/recencyRetriever.ts",
94
- "730ec08c1c3b66909d5405319e3f1e5f525b24b4497f50858aa1652e103aa88c_5FxNr7n+qjkV58wA2j2YZUqKABE="
94
+ "3feaaf34e69c0b507af7bf3a6a63d475013b57bed2d749a8aa03d5c8ed595fbb_5FxNr7n+qjkV58wA2j2YZUqKABE="
95
95
  ],
96
96
  [
97
97
  "packlets/retrieve/linkTraversalRetriever.ts",
98
- "ee874393402426e67b7cf3596fa82cdb3ec2fe1e37c3f9730d40334851eb3610_5FxNr7n+qjkV58wA2j2YZUqKABE="
98
+ "5a99e5cd1f5cbf3d1984bee2d08614f33801c24e8c3d3e9f501fe949f1c631f8_5FxNr7n+qjkV58wA2j2YZUqKABE="
99
99
  ],
100
100
  [
101
101
  "packlets/retrieve/tagRetriever.ts",
102
- "11518f70b70b25c353c8eec337753648c53f80ad5b7c5d00031209c8d77f9174_5FxNr7n+qjkV58wA2j2YZUqKABE="
102
+ "405161979ed404331933acef3c131ec1ae177d052037336ef62851a09b328865_5FxNr7n+qjkV58wA2j2YZUqKABE="
103
103
  ],
104
104
  [
105
105
  "packlets/retrieve/structuredFilterRetriever.ts",
106
- "519bbdc0c54349a3a4fd4c87f07fe7431cf01e0844fe8b4210a0a6195ce08a79_5FxNr7n+qjkV58wA2j2YZUqKABE="
106
+ "c1286d14929b84afddeaf6e03a6b19b466363ef2fd901df98a241b4415857311_5FxNr7n+qjkV58wA2j2YZUqKABE="
107
107
  ],
108
108
  [
109
109
  "packlets/retrieve/semanticRetriever.ts",
110
- "30b52f854d7ccf395e03278e3889f7512ea825a489d31966736cef9a143bf991_5FxNr7n+qjkV58wA2j2YZUqKABE="
110
+ "f272c8908bc0ad788d215443bd693edac99ccac8c108f03c44b6a01d7211cdaf_5FxNr7n+qjkV58wA2j2YZUqKABE="
111
111
  ],
112
112
  [
113
113
  "packlets/retrieve/temporalRetrievers.ts",
114
- "0131f13f335eca903bd94e2e8c793ca7af52e0cf60d63d83a6c12365ea530472_5FxNr7n+qjkV58wA2j2YZUqKABE="
114
+ "a46e192e8e1c697184c125f6869aa841ec28acfb6351416e901689a15c032ae2_5FxNr7n+qjkV58wA2j2YZUqKABE="
115
115
  ],
116
116
  [
117
117
  "packlets/retrieve/hybridRetriever.ts",
118
- "a3a6deccf2f8fff2a1863b31835780d8b1fa2a85af5db6639c38b2a5bc34a806_5FxNr7n+qjkV58wA2j2YZUqKABE="
118
+ "f8f855df0a352d6c938fd787a46cce299b3cadb47766966de053aa5def982551_5FxNr7n+qjkV58wA2j2YZUqKABE="
119
119
  ],
120
120
  [
121
121
  "packlets/retrieve/index.ts",
@@ -123,7 +123,7 @@
123
123
  ],
124
124
  [
125
125
  "packlets/tools/memoryTools.ts",
126
- "5593b178cee4f05bae54292130f5bc0bbb6858d7b10e5a4602ebbc22e29b8cbc_5FxNr7n+qjkV58wA2j2YZUqKABE="
126
+ "8dce5a256b1b33e342dee762a4b2ac2c08285d1faaafb1b3bd37105379a4f9da_5FxNr7n+qjkV58wA2j2YZUqKABE="
127
127
  ],
128
128
  [
129
129
  "packlets/tools/index.ts",
@@ -131,19 +131,19 @@
131
131
  ],
132
132
  [
133
133
  "packlets/ingest/model.ts",
134
- "666b14530d8ffcd51cd1d13ad46d1616c87f75e4ce28fd0db8ebacc434714cfe_5FxNr7n+qjkV58wA2j2YZUqKABE="
134
+ "56eba4b5ec0a705af8df262b18955cce35acd8cf84cd81820edc7fcb80f4269b_5FxNr7n+qjkV58wA2j2YZUqKABE="
135
135
  ],
136
136
  [
137
137
  "packlets/ingest/hostStages.ts",
138
- "2b848556ea7d94a9f9247a6780428585e56e5d281364e16ff9cefad465ff05e1_5FxNr7n+qjkV58wA2j2YZUqKABE="
138
+ "77545a186e3b50a34f7196e366e29c3215de787dec48420b80ae313a836de67b_5FxNr7n+qjkV58wA2j2YZUqKABE="
139
139
  ],
140
140
  [
141
141
  "packlets/ingest/cycleGuard.ts",
142
- "c2c969319313740b5a861ffede25512e843cdc4a62d2ed81d6ada3bfea3c6bcf_5FxNr7n+qjkV58wA2j2YZUqKABE="
142
+ "bdb6bc770953cf562f68c4920c01524ac18b9f02766598bca443fc2c6d479ba6_5FxNr7n+qjkV58wA2j2YZUqKABE="
143
143
  ],
144
144
  [
145
145
  "packlets/ingest/orchestrator.ts",
146
- "f821fe8bc363157124a991a4dff62a2c96c1fefe14db54993147a00f5b522e8b_5FxNr7n+qjkV58wA2j2YZUqKABE="
146
+ "c22f7ca57bbb5945fd82e0f1d85b34e6dc227b1d8d4bbd0bf2aa554eb99c948a_5FxNr7n+qjkV58wA2j2YZUqKABE="
147
147
  ],
148
148
  [
149
149
  "packlets/ingest/index.ts",
@@ -155,7 +155,7 @@
155
155
  ],
156
156
  [
157
157
  "test/unit/converters/antagonistRoundTrip.test.ts",
158
- "716259d8068e73fd8444a306835881f9cff709e043dde61578bb2a061decdfb7_fnTnCS8rja7DE6jB0bKRna1pZAg="
158
+ "c797f3e6e3718d9d91dd407d14d1c229dbd847cc8c4940c9313d1ed1f6c39533_fnTnCS8rja7DE6jB0bKRna1pZAg="
159
159
  ],
160
160
  [
161
161
  "test/unit/converters/bodyConverterRegistry.test.ts",
@@ -163,23 +163,23 @@
163
163
  ],
164
164
  [
165
165
  "test/unit/converters/envelopeConverter.test.ts",
166
- "c9bb42bfaa1008e41eb5253a7705b757f6b44de4f7a66fbe9e2a1e932cc2ce92_fnTnCS8rja7DE6jB0bKRna1pZAg="
166
+ "e7b53bb59b48fee358e6a288dd3df326ee5f8b3116559f55d57b3112bd008517_fnTnCS8rja7DE6jB0bKRna1pZAg="
167
167
  ],
168
168
  [
169
169
  "test/unit/index/memoryIndex.test.ts",
170
- "a9f1894d8e8ab4430709fcd6addb003ecd6ff98baebf855ace88f39427e30593_fnTnCS8rja7DE6jB0bKRna1pZAg="
170
+ "0046e5ae00cbbf8f8163911a30f62603c8f93cafd47aceb44c2f4adf6b65ce10_fnTnCS8rja7DE6jB0bKRna1pZAg="
171
171
  ],
172
172
  [
173
173
  "test/unit/ingest/antagonistCycleAndParity.test.ts",
174
- "af7b769809b92543b0a9cd32ddcb1de8bcb4db102d7997b71be7a84d9b1fbb09_fnTnCS8rja7DE6jB0bKRna1pZAg="
174
+ "cc97c550aea40ba89678400d6a1274aaaf224eddb847d2a941b0f8346417f1a8_fnTnCS8rja7DE6jB0bKRna1pZAg="
175
175
  ],
176
176
  [
177
177
  "test/unit/ingest/cycleGuard.test.ts",
178
- "ffb8024c01a769482c7abcc057c2e4ad798ffc50f010081a9283f1cf1209d56e_fnTnCS8rja7DE6jB0bKRna1pZAg="
178
+ "f0096fa558b1ab01e2b291b826dc413086a83530e033828133e2e231f055d14c_fnTnCS8rja7DE6jB0bKRna1pZAg="
179
179
  ],
180
180
  [
181
181
  "test/unit/ingest/orchestrator.test.ts",
182
- "945eb0d45fa417bcb4a88eb7bfb5ee8b51fbd16099925b9dc1888c69fc02d236_fnTnCS8rja7DE6jB0bKRna1pZAg="
182
+ "8b1b204058d334502fd296c073b885d6c4dca00cd7902d41dc9e1139d1d63d00_fnTnCS8rja7DE6jB0bKRna1pZAg="
183
183
  ],
184
184
  [
185
185
  "test/unit/observe/memoryObservationStore.test.ts",
@@ -187,11 +187,11 @@
187
187
  ],
188
188
  [
189
189
  "test/unit/retrieve/linkTraversalRetriever.test.ts",
190
- "a9e88d9d4ebb8a69bad645c0f774b43668e02cfd10b79680200b5a91374264b7_fnTnCS8rja7DE6jB0bKRna1pZAg="
190
+ "18ea5e3a48853535bf102fa514049c15b1dbc87bc28dc7f09832b3f4cbd22e24_fnTnCS8rja7DE6jB0bKRna1pZAg="
191
191
  ],
192
192
  [
193
193
  "test/unit/retrieve/retrievers.test.ts",
194
- "e4a7ba604ec7c481d2a491358d1c42d9e1eecdb77fa3e3a804c10fe72e5506df_fnTnCS8rja7DE6jB0bKRna1pZAg="
194
+ "e22843463cb9f624506487522d6e6d8a6f17ad42b3a2c9ca9215c20ae6a168ba_fnTnCS8rja7DE6jB0bKRna1pZAg="
195
195
  ],
196
196
  [
197
197
  "test/unit/retrieve/temporalRetrievers.test.ts",
@@ -203,16 +203,24 @@
203
203
  ],
204
204
  [
205
205
  "test/unit/store/embedOnWrite.test.ts",
206
- "9bdab98d1e0cb73f16a5d18daf0bd7e4da02db28d05e82424d1c42e9fc0b2c45_fnTnCS8rja7DE6jB0bKRna1pZAg="
206
+ "3d23876462a4eeaa8679f1f3ed9700e380a63a37dd8ded7499b7097adc39a77f_fnTnCS8rja7DE6jB0bKRna1pZAg="
207
207
  ],
208
208
  [
209
209
  "test/unit/store/fileTreeMemoryStore.test.ts",
210
210
  "06407be1a2dc1b914cecefe63766ea4a597c132cc04e87d8b2a373d582be435f_fnTnCS8rja7DE6jB0bKRna1pZAg="
211
211
  ],
212
+ [
213
+ "test/unit/store/listScoped.test.ts",
214
+ "fca2cf52018d3b5fef0c9c0b438242b557fffa91526055b489942b23a4457e87_fnTnCS8rja7DE6jB0bKRna1pZAg="
215
+ ],
212
216
  [
213
217
  "test/unit/store/observations.test.ts",
214
218
  "538814a51e9a09b566e24e98824ed281562becf4d8f56d5ec88aa33f6c6b0e2f_fnTnCS8rja7DE6jB0bKRna1pZAg="
215
219
  ],
220
+ [
221
+ "test/unit/store/rankAxis.test.ts",
222
+ "cf19c29a28f1ad6475a49bc0b3dc6decdeb3a7804887540e6e9e0d49a525860d_fnTnCS8rja7DE6jB0bKRna1pZAg="
223
+ ],
216
224
  [
217
225
  "test/unit/store/scopeEncoding.test.ts",
218
226
  "5ea0364489c7424bbfcae0b85f71a49aa069202e307282f808ea54449a927c3b_fnTnCS8rja7DE6jB0bKRna1pZAg="
@@ -223,7 +231,7 @@
223
231
  ],
224
232
  [
225
233
  "test/unit/tools/memoryTools.test.ts",
226
- "ed1b29228843e28ce103a46705426eb63b5e8b4d0f76e66c63747b259c2cd8f0_fnTnCS8rja7DE6jB0bKRna1pZAg="
234
+ "87cca3dccfa48aa9c74c3c0fa39980e5d745997337e869e38291ff5d5a6a230a_fnTnCS8rja7DE6jB0bKRna1pZAg="
227
235
  ],
228
236
  [
229
237
  "test/unit/types/identityCodec.test.ts",
@@ -243,16 +251,16 @@
243
251
  ],
244
252
  [
245
253
  "test/unit/types/writePolicy.test.ts",
246
- "b1dce7dcab42c012d504d2d108626e62ce024463654f118b5bb78adb2faa7dac_fnTnCS8rja7DE6jB0bKRna1pZAg="
254
+ "f36d20bf300ab0ebe8921e5125be6dcfd1fd1a39d51bff1e7f301f1c60661c98_fnTnCS8rja7DE6jB0bKRna1pZAg="
247
255
  ],
248
256
  [
249
257
  "test/unit/vector/inMemoryCosineIndex.test.ts",
250
- "5ff0eb2d7ae3e24505f4ca337caaf4706c4345dad283a8faa51105465161f259_fnTnCS8rja7DE6jB0bKRna1pZAg="
258
+ "4433925d1ffd368928b8b09be5d58d26cbc9d805413572b492dc1d82c6a32ca8_fnTnCS8rja7DE6jB0bKRna1pZAg="
251
259
  ],
252
260
  [
253
261
  "test/unit/vector/vectorIndex.test.ts",
254
- "fb1b4366bcd6b06174b82a3604cd6ee09692cb89a6c38b90866281ba204efc90_fnTnCS8rja7DE6jB0bKRna1pZAg="
262
+ "ee46f9a64127b829fea5ce21e63481d2ad757cfc9d04b389bd27e146b6a0c136_fnTnCS8rja7DE6jB0bKRna1pZAg="
255
263
  ]
256
264
  ],
257
- "filesHash": "41qqBVkA2UlzsTYEJ5_czQ"
265
+ "filesHash": "PAS6a5eG6VsawhuG7UzMAQ"
258
266
  }