@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.
- package/.rush/temp/{b82cf6bdece20481260e6bab946179eeec9d7b46.tar.log → cbbdbe09515171b4eba8f2592be2dace1e4e8142.tar.log} +14 -2
- package/.rush/temp/chunked-rush-logs/ts-agent-memory.build.chunks.jsonl +2 -2
- package/.rush/temp/operation/build/all.log +2 -2
- package/.rush/temp/operation/build/log-chunks.jsonl +2 -2
- package/.rush/temp/operation/build/state.json +1 -1
- package/dist/packlets/converters/envelopeConverter.js +17 -3
- package/dist/packlets/converters/envelopeConverter.js.map +1 -1
- package/dist/packlets/index/memoryIndex.js +58 -10
- package/dist/packlets/index/memoryIndex.js.map +1 -1
- package/dist/packlets/ingest/cycleGuard.js +13 -6
- package/dist/packlets/ingest/cycleGuard.js.map +1 -1
- package/dist/packlets/ingest/hostStages.js.map +1 -1
- package/dist/packlets/ingest/model.js.map +1 -1
- package/dist/packlets/ingest/orchestrator.js +94 -49
- package/dist/packlets/ingest/orchestrator.js.map +1 -1
- package/dist/packlets/retrieve/hybridRetriever.js +13 -2
- package/dist/packlets/retrieve/hybridRetriever.js.map +1 -1
- package/dist/packlets/retrieve/linkTraversalRetriever.js +46 -57
- package/dist/packlets/retrieve/linkTraversalRetriever.js.map +1 -1
- package/dist/packlets/retrieve/recencyRetriever.js +3 -3
- package/dist/packlets/retrieve/recencyRetriever.js.map +1 -1
- package/dist/packlets/retrieve/retriever.js +50 -7
- package/dist/packlets/retrieve/retriever.js.map +1 -1
- package/dist/packlets/retrieve/semanticRetriever.js +9 -3
- package/dist/packlets/retrieve/semanticRetriever.js.map +1 -1
- package/dist/packlets/retrieve/structuredFilterRetriever.js +3 -3
- package/dist/packlets/retrieve/structuredFilterRetriever.js.map +1 -1
- package/dist/packlets/retrieve/tagRetriever.js +3 -3
- package/dist/packlets/retrieve/tagRetriever.js.map +1 -1
- package/dist/packlets/retrieve/temporalRetrievers.js +3 -3
- package/dist/packlets/retrieve/temporalRetrievers.js.map +1 -1
- package/dist/packlets/store/fileTreeMemoryStore.js +72 -16
- package/dist/packlets/store/fileTreeMemoryStore.js.map +1 -1
- package/dist/packlets/tools/memoryTools.js +104 -21
- package/dist/packlets/tools/memoryTools.js.map +1 -1
- package/dist/packlets/types/envelope.js +13 -1
- package/dist/packlets/types/envelope.js.map +1 -1
- package/dist/packlets/vector/inMemoryCosineIndex.js +22 -17
- package/dist/packlets/vector/inMemoryCosineIndex.js.map +1 -1
- package/dist/packlets/vector/vectorIndex.js.map +1 -1
- package/dist/test/unit/converters/antagonistRoundTrip.test.js +3 -3
- package/dist/test/unit/converters/antagonistRoundTrip.test.js.map +1 -1
- package/dist/test/unit/converters/envelopeConverter.test.js +125 -8
- package/dist/test/unit/converters/envelopeConverter.test.js.map +1 -1
- package/dist/test/unit/index/memoryIndex.test.js +87 -25
- package/dist/test/unit/index/memoryIndex.test.js.map +1 -1
- package/dist/test/unit/ingest/antagonistCycleAndParity.test.js +20 -16
- package/dist/test/unit/ingest/antagonistCycleAndParity.test.js.map +1 -1
- package/dist/test/unit/ingest/cycleGuard.test.js +28 -1
- package/dist/test/unit/ingest/cycleGuard.test.js.map +1 -1
- package/dist/test/unit/ingest/orchestrator.test.js +187 -45
- package/dist/test/unit/ingest/orchestrator.test.js.map +1 -1
- package/dist/test/unit/retrieve/linkTraversalRetriever.test.js +106 -31
- package/dist/test/unit/retrieve/linkTraversalRetriever.test.js.map +1 -1
- package/dist/test/unit/retrieve/retrievers.test.js +299 -37
- package/dist/test/unit/retrieve/retrievers.test.js.map +1 -1
- package/dist/test/unit/store/embedOnWrite.test.js +69 -12
- package/dist/test/unit/store/embedOnWrite.test.js.map +1 -1
- package/dist/test/unit/store/listScoped.test.js +109 -0
- package/dist/test/unit/store/listScoped.test.js.map +1 -0
- package/dist/test/unit/store/rankAxis.test.js +254 -0
- package/dist/test/unit/store/rankAxis.test.js.map +1 -0
- package/dist/test/unit/tools/memoryTools.test.js +280 -11
- package/dist/test/unit/tools/memoryTools.test.js.map +1 -1
- package/dist/test/unit/types/writePolicy.test.js +9 -2
- package/dist/test/unit/types/writePolicy.test.js.map +1 -1
- package/dist/test/unit/vector/inMemoryCosineIndex.test.js +95 -35
- package/dist/test/unit/vector/inMemoryCosineIndex.test.js.map +1 -1
- package/dist/test/unit/vector/vectorIndex.test.js +24 -15
- package/dist/test/unit/vector/vectorIndex.test.js.map +1 -1
- package/dist/ts-agent-memory.d.ts +384 -97
- package/etc/ts-agent-memory.api.md +64 -22
- package/lib/packlets/converters/envelopeConverter.d.ts +8 -1
- package/lib/packlets/converters/envelopeConverter.d.ts.map +1 -1
- package/lib/packlets/converters/envelopeConverter.js +18 -4
- package/lib/packlets/converters/envelopeConverter.js.map +1 -1
- package/lib/packlets/index/memoryIndex.d.ts +42 -10
- package/lib/packlets/index/memoryIndex.d.ts.map +1 -1
- package/lib/packlets/index/memoryIndex.js +58 -10
- package/lib/packlets/index/memoryIndex.js.map +1 -1
- package/lib/packlets/ingest/cycleGuard.d.ts +5 -5
- package/lib/packlets/ingest/cycleGuard.d.ts.map +1 -1
- package/lib/packlets/ingest/cycleGuard.js +13 -6
- package/lib/packlets/ingest/cycleGuard.js.map +1 -1
- package/lib/packlets/ingest/hostStages.d.ts +3 -3
- package/lib/packlets/ingest/hostStages.d.ts.map +1 -1
- package/lib/packlets/ingest/hostStages.js.map +1 -1
- package/lib/packlets/ingest/model.d.ts +25 -14
- package/lib/packlets/ingest/model.d.ts.map +1 -1
- package/lib/packlets/ingest/model.js.map +1 -1
- package/lib/packlets/ingest/orchestrator.d.ts +18 -4
- package/lib/packlets/ingest/orchestrator.d.ts.map +1 -1
- package/lib/packlets/ingest/orchestrator.js +93 -48
- package/lib/packlets/ingest/orchestrator.js.map +1 -1
- package/lib/packlets/retrieve/hybridRetriever.d.ts.map +1 -1
- package/lib/packlets/retrieve/hybridRetriever.js +12 -1
- package/lib/packlets/retrieve/hybridRetriever.js.map +1 -1
- package/lib/packlets/retrieve/linkTraversalRetriever.d.ts +18 -23
- package/lib/packlets/retrieve/linkTraversalRetriever.d.ts.map +1 -1
- package/lib/packlets/retrieve/linkTraversalRetriever.js +45 -56
- package/lib/packlets/retrieve/linkTraversalRetriever.js.map +1 -1
- package/lib/packlets/retrieve/recencyRetriever.js +2 -2
- package/lib/packlets/retrieve/recencyRetriever.js.map +1 -1
- package/lib/packlets/retrieve/retriever.d.ts +70 -11
- package/lib/packlets/retrieve/retriever.d.ts.map +1 -1
- package/lib/packlets/retrieve/retriever.js +52 -7
- package/lib/packlets/retrieve/retriever.js.map +1 -1
- package/lib/packlets/retrieve/semanticRetriever.d.ts.map +1 -1
- package/lib/packlets/retrieve/semanticRetriever.js +9 -3
- package/lib/packlets/retrieve/semanticRetriever.js.map +1 -1
- package/lib/packlets/retrieve/structuredFilterRetriever.js +2 -2
- package/lib/packlets/retrieve/structuredFilterRetriever.js.map +1 -1
- package/lib/packlets/retrieve/tagRetriever.js +2 -2
- package/lib/packlets/retrieve/tagRetriever.js.map +1 -1
- package/lib/packlets/retrieve/temporalRetrievers.js +3 -3
- package/lib/packlets/retrieve/temporalRetrievers.js.map +1 -1
- package/lib/packlets/store/fileTreeMemoryStore.d.ts +57 -3
- package/lib/packlets/store/fileTreeMemoryStore.d.ts.map +1 -1
- package/lib/packlets/store/fileTreeMemoryStore.js +72 -16
- package/lib/packlets/store/fileTreeMemoryStore.js.map +1 -1
- package/lib/packlets/tools/memoryTools.d.ts +24 -0
- package/lib/packlets/tools/memoryTools.d.ts.map +1 -1
- package/lib/packlets/tools/memoryTools.js +104 -21
- package/lib/packlets/tools/memoryTools.js.map +1 -1
- package/lib/packlets/types/envelope.d.ts +61 -8
- package/lib/packlets/types/envelope.d.ts.map +1 -1
- package/lib/packlets/types/envelope.js +14 -0
- package/lib/packlets/types/envelope.js.map +1 -1
- package/lib/packlets/vector/inMemoryCosineIndex.d.ts +9 -5
- package/lib/packlets/vector/inMemoryCosineIndex.d.ts.map +1 -1
- package/lib/packlets/vector/inMemoryCosineIndex.js +22 -17
- package/lib/packlets/vector/inMemoryCosineIndex.js.map +1 -1
- package/lib/packlets/vector/vectorIndex.d.ts +46 -20
- package/lib/packlets/vector/vectorIndex.d.ts.map +1 -1
- package/lib/packlets/vector/vectorIndex.js.map +1 -1
- package/lib/test/unit/converters/antagonistRoundTrip.test.js +3 -3
- package/lib/test/unit/converters/antagonistRoundTrip.test.js.map +1 -1
- package/lib/test/unit/converters/envelopeConverter.test.js +124 -7
- package/lib/test/unit/converters/envelopeConverter.test.js.map +1 -1
- package/lib/test/unit/index/memoryIndex.test.js +86 -24
- package/lib/test/unit/index/memoryIndex.test.js.map +1 -1
- package/lib/test/unit/ingest/antagonistCycleAndParity.test.js +20 -16
- package/lib/test/unit/ingest/antagonistCycleAndParity.test.js.map +1 -1
- package/lib/test/unit/ingest/cycleGuard.test.js +28 -1
- package/lib/test/unit/ingest/cycleGuard.test.js.map +1 -1
- package/lib/test/unit/ingest/orchestrator.test.js +186 -44
- package/lib/test/unit/ingest/orchestrator.test.js.map +1 -1
- package/lib/test/unit/retrieve/linkTraversalRetriever.test.js +106 -31
- package/lib/test/unit/retrieve/linkTraversalRetriever.test.js.map +1 -1
- package/lib/test/unit/retrieve/retrievers.test.js +298 -36
- package/lib/test/unit/retrieve/retrievers.test.js.map +1 -1
- package/lib/test/unit/store/embedOnWrite.test.js +68 -11
- package/lib/test/unit/store/embedOnWrite.test.js.map +1 -1
- package/lib/test/unit/store/listScoped.test.d.ts +2 -0
- package/lib/test/unit/store/listScoped.test.d.ts.map +1 -0
- package/lib/test/unit/store/listScoped.test.js +111 -0
- package/lib/test/unit/store/listScoped.test.js.map +1 -0
- package/lib/test/unit/store/rankAxis.test.d.ts +2 -0
- package/lib/test/unit/store/rankAxis.test.d.ts.map +1 -0
- package/lib/test/unit/store/rankAxis.test.js +256 -0
- package/lib/test/unit/store/rankAxis.test.js.map +1 -0
- package/lib/test/unit/tools/memoryTools.test.js +280 -11
- package/lib/test/unit/tools/memoryTools.test.js.map +1 -1
- package/lib/test/unit/types/writePolicy.test.js +9 -2
- package/lib/test/unit/types/writePolicy.test.js.map +1 -1
- package/lib/test/unit/vector/inMemoryCosineIndex.test.js +95 -35
- package/lib/test/unit/vector/inMemoryCosineIndex.test.js.map +1 -1
- package/lib/test/unit/vector/vectorIndex.test.js +24 -15
- package/lib/test/unit/vector/vectorIndex.test.js.map +1 -1
- package/package.json +7 -7
- package/rush-logs/ts-agent-memory.build.cache.log +1 -1
- package/rush-logs/ts-agent-memory.build.log +2 -2
- package/src/packlets/converters/envelopeConverter.ts +27 -4
- package/src/packlets/index/memoryIndex.ts +86 -22
- package/src/packlets/ingest/cycleGuard.ts +22 -11
- package/src/packlets/ingest/hostStages.ts +3 -3
- package/src/packlets/ingest/model.ts +25 -14
- package/src/packlets/ingest/orchestrator.ts +143 -67
- package/src/packlets/retrieve/hybridRetriever.ts +14 -1
- package/src/packlets/retrieve/linkTraversalRetriever.ts +51 -62
- package/src/packlets/retrieve/recencyRetriever.ts +3 -3
- package/src/packlets/retrieve/retriever.ts +97 -13
- package/src/packlets/retrieve/semanticRetriever.ts +10 -5
- package/src/packlets/retrieve/structuredFilterRetriever.ts +3 -3
- package/src/packlets/retrieve/tagRetriever.ts +3 -3
- package/src/packlets/retrieve/temporalRetrievers.ts +3 -3
- package/src/packlets/store/fileTreeMemoryStore.ts +117 -12
- package/src/packlets/tools/memoryTools.ts +152 -25
- package/src/packlets/types/envelope.ts +66 -8
- package/src/packlets/vector/inMemoryCosineIndex.ts +45 -22
- package/src/packlets/vector/vectorIndex.ts +47 -20
- package/src/test/unit/converters/antagonistRoundTrip.test.ts +3 -3
- package/src/test/unit/converters/envelopeConverter.test.ts +168 -11
- package/src/test/unit/index/memoryIndex.test.ts +99 -14
- package/src/test/unit/ingest/antagonistCycleAndParity.test.ts +23 -18
- package/src/test/unit/ingest/cycleGuard.test.ts +44 -2
- package/src/test/unit/ingest/orchestrator.test.ts +234 -41
- package/src/test/unit/retrieve/linkTraversalRetriever.test.ts +134 -35
- package/src/test/unit/retrieve/retrievers.test.ts +381 -25
- package/src/test/unit/store/embedOnWrite.test.ts +83 -11
- package/src/test/unit/store/listScoped.test.ts +138 -0
- package/src/test/unit/store/rankAxis.test.ts +349 -0
- package/src/test/unit/tools/memoryTools.test.ts +362 -13
- package/src/test/unit/types/writePolicy.test.ts +11 -2
- package/src/test/unit/vector/inMemoryCosineIndex.test.ts +115 -39
- package/src/test/unit/vector/vectorIndex.test.ts +33 -17
- package/temp/build/lint/_eslint-5eVG3S6w.json +41 -33
- package/temp/build/typescript/ts_8nwakTlr.json +1 -1
- package/temp/ts-agent-memory.api.json +1080 -136
- 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<
|
|
28
|
-
public constructor(result: Result<ReadonlyArray<
|
|
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<
|
|
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
|
|
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
|
-
|
|
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-
|
|
59
|
+
test('replaces the vector on a same-target add', async () => {
|
|
46
60
|
const index = InMemoryCosineIndex.create().orThrow();
|
|
47
|
-
|
|
48
|
-
expect(await index.add(
|
|
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'
|
|
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'
|
|
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'
|
|
81
|
-
expect(await index.add('b'
|
|
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'
|
|
91
|
-
(await index.add('b'
|
|
92
|
-
(await index.add('c'
|
|
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'
|
|
138
|
-
(await index.add('unit'
|
|
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'
|
|
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
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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('
|
|
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
|
-
|
|
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([
|
|
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'
|
|
202
|
-
const source = new FakeSource(succeed([
|
|
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'
|
|
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'
|
|
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 = (
|
|
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([
|
|
230
|
-
|
|
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([
|
|
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 {
|
|
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
|
|
23
|
+
* seam is usable end-to-end with scope-qualified targets.
|
|
13
24
|
*/
|
|
14
25
|
class StubVectorIndex implements IVectorIndex {
|
|
15
|
-
private readonly _vectors: Map<
|
|
26
|
+
private readonly _vectors: Map<string, IEdgeTarget> = new Map();
|
|
16
27
|
|
|
17
|
-
public add(
|
|
18
|
-
|
|
19
|
-
|
|
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(
|
|
23
|
-
this._vectors.delete(
|
|
24
|
-
return Promise.resolve(succeed(
|
|
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.
|
|
29
|
-
.map((
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
expect(await index.
|
|
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
|
-
|
|
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(
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
66
|
+
"80f85adb4c3207cdb63231d5effe72b8004803399d2c438ca47f00b66d7f02ca_5FxNr7n+qjkV58wA2j2YZUqKABE="
|
|
67
67
|
],
|
|
68
68
|
[
|
|
69
69
|
"packlets/vector/inMemoryCosineIndex.ts",
|
|
70
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
90
|
+
"f8bf85cf7e3fe260eebd79f87e1429acbea25d6dc53af31c8d16c76032afb199_5FxNr7n+qjkV58wA2j2YZUqKABE="
|
|
91
91
|
],
|
|
92
92
|
[
|
|
93
93
|
"packlets/retrieve/recencyRetriever.ts",
|
|
94
|
-
"
|
|
94
|
+
"3feaaf34e69c0b507af7bf3a6a63d475013b57bed2d749a8aa03d5c8ed595fbb_5FxNr7n+qjkV58wA2j2YZUqKABE="
|
|
95
95
|
],
|
|
96
96
|
[
|
|
97
97
|
"packlets/retrieve/linkTraversalRetriever.ts",
|
|
98
|
-
"
|
|
98
|
+
"5a99e5cd1f5cbf3d1984bee2d08614f33801c24e8c3d3e9f501fe949f1c631f8_5FxNr7n+qjkV58wA2j2YZUqKABE="
|
|
99
99
|
],
|
|
100
100
|
[
|
|
101
101
|
"packlets/retrieve/tagRetriever.ts",
|
|
102
|
-
"
|
|
102
|
+
"405161979ed404331933acef3c131ec1ae177d052037336ef62851a09b328865_5FxNr7n+qjkV58wA2j2YZUqKABE="
|
|
103
103
|
],
|
|
104
104
|
[
|
|
105
105
|
"packlets/retrieve/structuredFilterRetriever.ts",
|
|
106
|
-
"
|
|
106
|
+
"c1286d14929b84afddeaf6e03a6b19b466363ef2fd901df98a241b4415857311_5FxNr7n+qjkV58wA2j2YZUqKABE="
|
|
107
107
|
],
|
|
108
108
|
[
|
|
109
109
|
"packlets/retrieve/semanticRetriever.ts",
|
|
110
|
-
"
|
|
110
|
+
"f272c8908bc0ad788d215443bd693edac99ccac8c108f03c44b6a01d7211cdaf_5FxNr7n+qjkV58wA2j2YZUqKABE="
|
|
111
111
|
],
|
|
112
112
|
[
|
|
113
113
|
"packlets/retrieve/temporalRetrievers.ts",
|
|
114
|
-
"
|
|
114
|
+
"a46e192e8e1c697184c125f6869aa841ec28acfb6351416e901689a15c032ae2_5FxNr7n+qjkV58wA2j2YZUqKABE="
|
|
115
115
|
],
|
|
116
116
|
[
|
|
117
117
|
"packlets/retrieve/hybridRetriever.ts",
|
|
118
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
134
|
+
"56eba4b5ec0a705af8df262b18955cce35acd8cf84cd81820edc7fcb80f4269b_5FxNr7n+qjkV58wA2j2YZUqKABE="
|
|
135
135
|
],
|
|
136
136
|
[
|
|
137
137
|
"packlets/ingest/hostStages.ts",
|
|
138
|
-
"
|
|
138
|
+
"77545a186e3b50a34f7196e366e29c3215de787dec48420b80ae313a836de67b_5FxNr7n+qjkV58wA2j2YZUqKABE="
|
|
139
139
|
],
|
|
140
140
|
[
|
|
141
141
|
"packlets/ingest/cycleGuard.ts",
|
|
142
|
-
"
|
|
142
|
+
"bdb6bc770953cf562f68c4920c01524ac18b9f02766598bca443fc2c6d479ba6_5FxNr7n+qjkV58wA2j2YZUqKABE="
|
|
143
143
|
],
|
|
144
144
|
[
|
|
145
145
|
"packlets/ingest/orchestrator.ts",
|
|
146
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
166
|
+
"e7b53bb59b48fee358e6a288dd3df326ee5f8b3116559f55d57b3112bd008517_fnTnCS8rja7DE6jB0bKRna1pZAg="
|
|
167
167
|
],
|
|
168
168
|
[
|
|
169
169
|
"test/unit/index/memoryIndex.test.ts",
|
|
170
|
-
"
|
|
170
|
+
"0046e5ae00cbbf8f8163911a30f62603c8f93cafd47aceb44c2f4adf6b65ce10_fnTnCS8rja7DE6jB0bKRna1pZAg="
|
|
171
171
|
],
|
|
172
172
|
[
|
|
173
173
|
"test/unit/ingest/antagonistCycleAndParity.test.ts",
|
|
174
|
-
"
|
|
174
|
+
"cc97c550aea40ba89678400d6a1274aaaf224eddb847d2a941b0f8346417f1a8_fnTnCS8rja7DE6jB0bKRna1pZAg="
|
|
175
175
|
],
|
|
176
176
|
[
|
|
177
177
|
"test/unit/ingest/cycleGuard.test.ts",
|
|
178
|
-
"
|
|
178
|
+
"f0096fa558b1ab01e2b291b826dc413086a83530e033828133e2e231f055d14c_fnTnCS8rja7DE6jB0bKRna1pZAg="
|
|
179
179
|
],
|
|
180
180
|
[
|
|
181
181
|
"test/unit/ingest/orchestrator.test.ts",
|
|
182
|
-
"
|
|
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
|
-
"
|
|
190
|
+
"18ea5e3a48853535bf102fa514049c15b1dbc87bc28dc7f09832b3f4cbd22e24_fnTnCS8rja7DE6jB0bKRna1pZAg="
|
|
191
191
|
],
|
|
192
192
|
[
|
|
193
193
|
"test/unit/retrieve/retrievers.test.ts",
|
|
194
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
254
|
+
"f36d20bf300ab0ebe8921e5125be6dcfd1fd1a39d51bff1e7f301f1c60661c98_fnTnCS8rja7DE6jB0bKRna1pZAg="
|
|
247
255
|
],
|
|
248
256
|
[
|
|
249
257
|
"test/unit/vector/inMemoryCosineIndex.test.ts",
|
|
250
|
-
"
|
|
258
|
+
"4433925d1ffd368928b8b09be5d58d26cbc9d805413572b492dc1d82c6a32ca8_fnTnCS8rja7DE6jB0bKRna1pZAg="
|
|
251
259
|
],
|
|
252
260
|
[
|
|
253
261
|
"test/unit/vector/vectorIndex.test.ts",
|
|
254
|
-
"
|
|
262
|
+
"ee46f9a64127b829fea5ce21e63481d2ad757cfc9d04b389bd27e146b6a0c136_fnTnCS8rja7DE6jB0bKRna1pZAg="
|
|
255
263
|
]
|
|
256
264
|
],
|
|
257
|
-
"filesHash": "
|
|
265
|
+
"filesHash": "PAS6a5eG6VsawhuG7UzMAQ"
|
|
258
266
|
}
|