@metaharness/kernel 0.1.5 → 0.1.6
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/README.md +47 -22
- package/dist/memory-rvf.d.ts +65 -1
- package/dist/memory-rvf.d.ts.map +1 -1
- package/dist/memory-rvf.js +89 -17
- package/dist/memory-rvf.js.map +1 -1
- package/dist/memory.d.ts +3 -2
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +24 -10
- package/dist/memory.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -62,14 +62,19 @@ npm install @metaharness/kernel @ruvector/rvf
|
|
|
62
62
|
|
|
63
63
|
```js
|
|
64
64
|
import { createRvfBackend } from '@metaharness/kernel/memory-rvf';
|
|
65
|
+
import { rankWithDecay } from '@metaharness/kernel/memory';
|
|
65
66
|
|
|
66
67
|
const mem = await createRvfBackend({ dimensions: 384, dir: './.harness/memory' });
|
|
67
68
|
if (!mem) {
|
|
68
69
|
// @ruvector/rvf is not installed: keep using the default in-process memory.
|
|
69
70
|
} else {
|
|
70
|
-
await mem.insertBatch([{ id: 'note-1', embedding }], 'notes'); // re-insert = replace
|
|
71
|
-
const hits = await mem.search(query, 10, 'notes'); // [{ id, score, distance, namespace }]
|
|
71
|
+
await mem.insertBatch([{ id: 'note-1', embedding, metadata: { source: 'chat' } }], 'notes'); // re-insert = replace
|
|
72
|
+
const hits = await mem.search(query, 10, 'notes'); // [{ id, score, distance, namespace, storedAt, metadata }]
|
|
73
|
+
const ranked = await rankWithDecay(hits, { halfLifeMs: 7 * 24 * 3600e3 }); // newer first among near-ties
|
|
72
74
|
const exact = await mem.search(query, 10, 'notes', { exact: true }); // brute force
|
|
75
|
+
const fromChat = await mem.search(query, 10, 'notes', {
|
|
76
|
+
filter: { op: 'eq', field: 'source', value: 'chat' }, // metadata filter
|
|
77
|
+
});
|
|
73
78
|
await mem.delete(['note-1'], 'notes');
|
|
74
79
|
await mem.close(); // releases the file lock; reopen the same dir later to continue
|
|
75
80
|
}
|
|
@@ -85,27 +90,47 @@ if (!mem) {
|
|
|
85
90
|
- With the default `cosine` metric, `score` is cosine similarity
|
|
86
91
|
(`1 - distance`). With `l2` it is `1 / (1 + distance)`, which ranks the same
|
|
87
92
|
way but is not a cosine similarity.
|
|
88
|
-
-
|
|
89
|
-
|
|
90
|
-
`
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
93
|
+
- Per-vector metadata (`@ruvector/rvf` 0.4.7 or later, with rvf-node 0.4.2): every
|
|
94
|
+
insert stores `storedAt` (ms since epoch; pass your own or it defaults to
|
|
95
|
+
`Date.now()`) and any `metadata` you pass, such as `{ source, tags }`. Hits return
|
|
96
|
+
`storedAt` and `metadata`, so `rankWithDecay` can reorder them by age. Numbers are
|
|
97
|
+
stored as f64, and objects and arrays as JSON. A field keeps the type of its first
|
|
98
|
+
value, and writing another type throws RVF's `MetadataTypeConflict`. `storedAt` is
|
|
99
|
+
a reserved key.
|
|
100
|
+
- `search(…, { filter })` takes RVF filter leaves `{ op, field, value }` (`eq`, `ne`,
|
|
101
|
+
`lt`, `le`, `gt`, `ge`, `in`, `range`) combined with `and`, `or` and `not`. A filter
|
|
102
|
+
that keeps most of the store is approximate on HNSW. Add `exact: true` for exact
|
|
103
|
+
filtered results.
|
|
104
|
+
- On an older RVF, writes skip metadata and hits come back without `storedAt`, as
|
|
105
|
+
in 0.1.5. RVF rejects metadata before it writes anything. The backend then retries
|
|
106
|
+
without metadata and reports `metadataSupported === false`. A `filter` throws in
|
|
107
|
+
this mode instead of returning unfiltered hits. Vectors written by 0.1.5 open
|
|
108
|
+
without changes and have no `storedAt`, so `rankWithDecay` treats them as age 0.
|
|
109
|
+
- `rankWithDecay` weights each hit by `0.5^(age / halfLifeMs)`. Before 0.1.6, it
|
|
110
|
+
looked for an emergent-time `AgenticClock.weight(ageMs)` that the package does not
|
|
111
|
+
have, and fell back to raw scores. So decay never reordered anything.
|
|
112
|
+
- `{ exact: true }` needs `@ruvector/rvf` 0.4.6 or later. Earlier versions ignore it.
|
|
113
|
+
- Supported range: `@ruvector/rvf` `^0.3.0 || ^0.4.7`. On 0.2.3, deletes did not
|
|
114
|
+
survive a reopen. In the 0.4 line the floor is 0.4.7, which adds per-vector metadata.
|
|
115
|
+
|
|
116
|
+
Measured with `bench/memory-rvf-bench.mjs` on `@ruvector/rvf` 0.4.7 (rvf-node 0.4.2),
|
|
117
|
+
Node 22 and kernel 0.1.6, where every insert carries its `storedAt` metadata. The data
|
|
118
|
+
was seeded uniform random vectors with cosine distance. Each run used 200 queries at
|
|
119
|
+
k = 10, scored against brute force after closing and reopening the store. Recall is
|
|
120
|
+
from unfiltered HNSW at the default efSearch 100. The figures are medians of 5
|
|
121
|
+
sequential runs on a shared host at load average about 19, so the latencies are
|
|
122
|
+
indicative only.
|
|
123
|
+
|
|
124
|
+
| Set | recall@10 (HNSW) | recall p50 / p95 | exact scan p50 (recall 1.0) | `insert()` p50 / p95 | `insertBatch` per vector |
|
|
102
125
|
|---|---|---|---|---|---|
|
|
103
|
-
|
|
|
104
|
-
| 10k ×
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
126
|
+
| 10k × 128 | 0.972 | 0.76 ms / 1.20 ms | 0.58 ms | 16.8 ms / 21.7 ms | 0.039 ms |
|
|
127
|
+
| 10k × 384 | 0.8745 | 1.40 ms / 1.98 ms | 1.63 ms | – | 0.044 ms |
|
|
128
|
+
|
|
129
|
+
Recall is the same as on 0.4.6. At 384 dimensions, 0.4.7 does not raise HNSW recall.
|
|
130
|
+
In a same-host run of kernel 0.1.5 on rvf 0.4.6 (no metadata), `insert()` p50 was
|
|
131
|
+
12.4 ms and `insertBatch` was 0.029 ms per vector at 10k × 128. Storing metadata adds
|
|
132
|
+
about a third to write cost. Each `insert()` is its own durable commit, so batch your
|
|
133
|
+
writes.
|
|
109
134
|
|
|
110
135
|
## Subsystems
|
|
111
136
|
|
package/dist/memory-rvf.d.ts
CHANGED
|
@@ -1,5 +1,39 @@
|
|
|
1
1
|
import type { MemoryHit } from './memory.js';
|
|
2
2
|
export type RvfMetric = 'cosine' | 'l2';
|
|
3
|
+
/**
|
|
4
|
+
* A per-vector metadata value (@ruvector/rvf >= 0.4.7). Numbers are stored as
|
|
5
|
+
* f64, objects and arrays as JSON. A field keeps the type of the first
|
|
6
|
+
* non-null value written to it; writing another type throws RVF's
|
|
7
|
+
* MetadataTypeConflict (0xff09).
|
|
8
|
+
*/
|
|
9
|
+
export type RvfMetadataValue = string | number | boolean | null | object;
|
|
10
|
+
/** Metadata key this module reserves for the insert timestamp. */
|
|
11
|
+
export declare const STORED_AT_FIELD = "storedAt";
|
|
12
|
+
type FilterLiteral = number | string | boolean;
|
|
13
|
+
/**
|
|
14
|
+
* A metadata filter, passed through to RVF. Leaves name a metadata key with
|
|
15
|
+
* `field` (`storedAt` or a key from your `metadata`).
|
|
16
|
+
*/
|
|
17
|
+
export type RvfMetadataFilter = {
|
|
18
|
+
op: 'eq' | 'ne' | 'lt' | 'le' | 'gt' | 'ge';
|
|
19
|
+
field: string;
|
|
20
|
+
value: FilterLiteral;
|
|
21
|
+
} | {
|
|
22
|
+
op: 'in';
|
|
23
|
+
field: string;
|
|
24
|
+
values: FilterLiteral[];
|
|
25
|
+
} | {
|
|
26
|
+
op: 'range';
|
|
27
|
+
field: string;
|
|
28
|
+
low: FilterLiteral;
|
|
29
|
+
high: FilterLiteral;
|
|
30
|
+
} | {
|
|
31
|
+
op: 'and' | 'or';
|
|
32
|
+
exprs: RvfMetadataFilter[];
|
|
33
|
+
} | {
|
|
34
|
+
op: 'not';
|
|
35
|
+
expr: RvfMetadataFilter;
|
|
36
|
+
};
|
|
3
37
|
/** A memory hit from the RVF backend; carries RVF's raw distance as well. */
|
|
4
38
|
export interface RvfMemoryHit extends MemoryHit {
|
|
5
39
|
/**
|
|
@@ -7,12 +41,25 @@ export interface RvfMemoryHit extends MemoryHit {
|
|
|
7
41
|
* Euclidean distance.
|
|
8
42
|
*/
|
|
9
43
|
distance: number;
|
|
44
|
+
/**
|
|
45
|
+
* The caller metadata stored with the vector (without `storedAt`, which is
|
|
46
|
+
* lifted to `MemoryHit.storedAt`). Absent when the vector has none, or on
|
|
47
|
+
* @ruvector/rvf < 0.4.7.
|
|
48
|
+
*/
|
|
49
|
+
metadata?: Record<string, RvfMetadataValue>;
|
|
10
50
|
}
|
|
11
51
|
export interface RvfSearchOptions {
|
|
12
52
|
/** Exact brute-force scan instead of HNSW (@ruvector/rvf >= 0.4.6; ignored earlier). */
|
|
13
53
|
exact?: boolean;
|
|
14
54
|
/** HNSW ef_search beam width. RVF default: 100. */
|
|
15
55
|
efSearch?: number;
|
|
56
|
+
/**
|
|
57
|
+
* Metadata filter (@ruvector/rvf >= 0.4.7). Throws when the installed RVF
|
|
58
|
+
* has no metadata support rather than returning unfiltered hits. A filter
|
|
59
|
+
* that keeps most of the store is approximate on HNSW; add `exact: true`
|
|
60
|
+
* for exact filtered results.
|
|
61
|
+
*/
|
|
62
|
+
filter?: RvfMetadataFilter;
|
|
16
63
|
}
|
|
17
64
|
export interface RvfBackendOptions {
|
|
18
65
|
dimensions: number;
|
|
@@ -37,14 +84,30 @@ export interface RvfBackendOptions {
|
|
|
37
84
|
export interface RvfBackendEntry {
|
|
38
85
|
id: string;
|
|
39
86
|
embedding: number[] | Float32Array;
|
|
87
|
+
/** Insert time in ms since epoch. Default: `Date.now()` at insert. */
|
|
88
|
+
storedAt?: number;
|
|
89
|
+
/** Extra per-vector metadata, e.g. `{ source, tags }`. `storedAt` is reserved. */
|
|
90
|
+
metadata?: Record<string, RvfMetadataValue>;
|
|
91
|
+
}
|
|
92
|
+
export interface RvfInsertOptions {
|
|
93
|
+
/** Insert time in ms since epoch. Default: `Date.now()` at insert. */
|
|
94
|
+
storedAt?: number;
|
|
95
|
+
/** Extra per-vector metadata, e.g. `{ source, tags }`. `storedAt` is reserved. */
|
|
96
|
+
metadata?: Record<string, RvfMetadataValue>;
|
|
40
97
|
}
|
|
41
98
|
export interface RvfBackend {
|
|
42
99
|
/** Absolute directory holding the namespace files. */
|
|
43
100
|
readonly dir: string;
|
|
44
101
|
/** False when `dir` was not given (temporary directory, removed on close). */
|
|
45
102
|
readonly persistent: boolean;
|
|
103
|
+
/**
|
|
104
|
+
* Whether writes carry per-vector metadata. True on @ruvector/rvf >= 0.4.7
|
|
105
|
+
* (rvf-node >= 0.4.2); becomes false after the first write that RVF rejects
|
|
106
|
+
* with MetadataNotSupported, and stays false.
|
|
107
|
+
*/
|
|
108
|
+
readonly metadataSupported: boolean;
|
|
46
109
|
/** Insert (or replace) one vector. */
|
|
47
|
-
insert(id: string, embedding: number[] | Float32Array, namespace?: string): Promise<void>;
|
|
110
|
+
insert(id: string, embedding: number[] | Float32Array, namespace?: string, opts?: RvfInsertOptions): Promise<void>;
|
|
48
111
|
/** Insert (or replace) many vectors in one RVF commit. */
|
|
49
112
|
insertBatch(entries: RvfBackendEntry[], namespace?: string): Promise<void>;
|
|
50
113
|
/** Top-k nearest neighbours, best first. Unknown namespace → []. */
|
|
@@ -68,4 +131,5 @@ export declare function isRvfAvailable(): Promise<boolean>;
|
|
|
68
131
|
* can fall back to its default memory. Namespace files are opened lazily.
|
|
69
132
|
*/
|
|
70
133
|
export declare function createRvfBackend(opts: RvfBackendOptions): Promise<RvfBackend | null>;
|
|
134
|
+
export {};
|
|
71
135
|
//# sourceMappingURL=memory-rvf.d.ts.map
|
package/dist/memory-rvf.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-rvf.d.ts","sourceRoot":"","sources":["../src/memory-rvf.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"memory-rvf.d.ts","sourceRoot":"","sources":["../src/memory-rvf.ts"],"names":[],"mappings":"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"}
|
package/dist/memory-rvf.js
CHANGED
|
@@ -11,21 +11,29 @@
|
|
|
11
11
|
// ------------------------ -------------------------------------------
|
|
12
12
|
// namespace one `<namespace>.rvf` file under `dir`
|
|
13
13
|
// (+ its `.rvf.idmap.json` string-id sidecar)
|
|
14
|
-
// insert / insertBatch RvfDatabase.ingestBatch (re-insert = upsert)
|
|
14
|
+
// insert / insertBatch RvfDatabase.ingestBatch (re-insert = upsert),
|
|
15
|
+
// with per-vector metadata { storedAt, ... }
|
|
15
16
|
// search RvfDatabase.query(vec, k, { efSearch,
|
|
16
|
-
// forceExact })
|
|
17
|
+
// forceExact, filter }); hits carry
|
|
18
|
+
// `storedAt` and `metadata`
|
|
17
19
|
// delete RvfDatabase.delete(ids)
|
|
18
20
|
// size RvfDatabase.status().totalVectors
|
|
19
21
|
// flush no-op: every ingest/delete is committed to
|
|
20
22
|
// the file when its promise resolves
|
|
21
23
|
// close RvfDatabase.close() (releases the writer lock)
|
|
22
24
|
//
|
|
25
|
+
// Per-vector metadata (ruvector #704) needs @ruvector/rvf >= 0.4.7 with
|
|
26
|
+
// rvf-node >= 0.4.2. Every insert stores `storedAt` (ms since epoch, default
|
|
27
|
+
// Date.now()) plus any caller `metadata`; hits return both, so `rankWithDecay`
|
|
28
|
+
// can reorder them by age, and `search(..., { filter })` filters on them.
|
|
29
|
+
// Earlier versions reject metadata with MetadataNotSupported before writing
|
|
30
|
+
// anything; this module then retries the same write WITHOUT metadata and
|
|
31
|
+
// stays in that mode for the backend's lifetime, i.e. it behaves exactly as
|
|
32
|
+
// kernel 0.1.5 did (no `storedAt` on hits, decay treats them as age 0).
|
|
33
|
+
// Vectors written before metadata existed (e.g. by kernel 0.1.5) also come
|
|
34
|
+
// back without `storedAt`. Namespaces stay separate files.
|
|
35
|
+
//
|
|
23
36
|
// What RVF cannot do, and how this module handles it:
|
|
24
|
-
// - Per-vector metadata is not supported by @ruvector/rvf (issue #704:
|
|
25
|
-
// `ingestBatch` throws MetadataNotSupported). So `storedAt` is NOT
|
|
26
|
-
// persisted and hits come back without it; `rankWithDecay` then treats
|
|
27
|
-
// every hit as age 0, i.e. decay does not reorder RVF hits. Namespaces are
|
|
28
|
-
// separate files for the same reason (there is no metadata to filter on).
|
|
29
37
|
// - `forceExact` (exact brute-force search) is passed through by
|
|
30
38
|
// @ruvector/rvf >= 0.4.6 (rvf-node >= 0.4.1). Earlier versions ignore it
|
|
31
39
|
// and search stays on HNSW.
|
|
@@ -33,7 +41,7 @@
|
|
|
33
41
|
// another process) opening the same namespace for writing fails with
|
|
34
42
|
// RVF LockHeld. Call `close()` to release it.
|
|
35
43
|
//
|
|
36
|
-
// RVF is an OPTIONAL peer dependency (^0.3.0 || ^0.4.
|
|
44
|
+
// RVF is an OPTIONAL peer dependency (^0.3.0 || ^0.4.7). When it is not
|
|
37
45
|
// installed, `createRvfBackend()` returns null and the caller keeps its
|
|
38
46
|
// default in-process memory. When it IS installed but fails at use time
|
|
39
47
|
// (native binding missing, lock held, dimension mismatch), the error is
|
|
@@ -41,6 +49,10 @@
|
|
|
41
49
|
import { existsSync, mkdirSync, mkdtempSync, readdirSync, rmSync } from 'node:fs';
|
|
42
50
|
import { tmpdir } from 'node:os';
|
|
43
51
|
import { join, resolve } from 'node:path';
|
|
52
|
+
/** Metadata key this module reserves for the insert timestamp. */
|
|
53
|
+
export const STORED_AT_FIELD = 'storedAt';
|
|
54
|
+
/** RvfErrorCode.MetadataNotSupported (0xff04). */
|
|
55
|
+
const METADATA_NOT_SUPPORTED = 0xff04;
|
|
44
56
|
let _rvf;
|
|
45
57
|
async function loadRvf() {
|
|
46
58
|
if (_rvf !== undefined)
|
|
@@ -50,13 +62,28 @@ async function loadRvf() {
|
|
|
50
62
|
// install without it must still type-check and build.
|
|
51
63
|
const mod = (await import('@ruvector/rvf'));
|
|
52
64
|
const db = mod.RvfDatabase ?? mod.default?.RvfDatabase;
|
|
53
|
-
|
|
65
|
+
const codes = mod.RvfErrorCode ?? mod.default?.RvfErrorCode;
|
|
66
|
+
_rvf =
|
|
67
|
+
db && typeof db.create === 'function' && typeof db.open === 'function'
|
|
68
|
+
? { db, sdkHasMetadata: typeof codes?.MetadataTypeConflict === 'number' }
|
|
69
|
+
: null;
|
|
54
70
|
}
|
|
55
71
|
catch {
|
|
56
72
|
_rvf = null;
|
|
57
73
|
}
|
|
58
74
|
return _rvf;
|
|
59
75
|
}
|
|
76
|
+
function isMetadataNotSupported(err) {
|
|
77
|
+
return typeof err === 'object' && err !== null && err.code === METADATA_NOT_SUPPORTED;
|
|
78
|
+
}
|
|
79
|
+
function checkStoredAt(storedAt, fallback) {
|
|
80
|
+
if (storedAt === undefined)
|
|
81
|
+
return fallback;
|
|
82
|
+
if (typeof storedAt !== 'number' || !Number.isFinite(storedAt)) {
|
|
83
|
+
throw new Error(`memory-rvf: storedAt must be a finite number (ms since epoch), got ${storedAt}`);
|
|
84
|
+
}
|
|
85
|
+
return storedAt;
|
|
86
|
+
}
|
|
60
87
|
/** Is a usable @ruvector/rvf (with `RvfDatabase`) importable in this process? */
|
|
61
88
|
export async function isRvfAvailable() {
|
|
62
89
|
return (await loadRvf()) !== null;
|
|
@@ -86,9 +113,11 @@ function toVector(embedding, dimensions) {
|
|
|
86
113
|
* can fall back to its default memory. Namespace files are opened lazily.
|
|
87
114
|
*/
|
|
88
115
|
export async function createRvfBackend(opts) {
|
|
89
|
-
const
|
|
90
|
-
if (!
|
|
116
|
+
const loaded = await loadRvf();
|
|
117
|
+
if (!loaded)
|
|
91
118
|
return null;
|
|
119
|
+
const Rvf = loaded.db;
|
|
120
|
+
let metadataSupported = loaded.sdkHasMetadata;
|
|
92
121
|
const dimensions = opts.dimensions;
|
|
93
122
|
if (!Number.isInteger(dimensions) || dimensions <= 0) {
|
|
94
123
|
throw new Error(`memory-rvf: dimensions must be a positive integer, got ${dimensions}`);
|
|
@@ -149,13 +178,41 @@ export async function createRvfBackend(opts) {
|
|
|
149
178
|
const insertBatch = async (entries, namespace = 'default') => {
|
|
150
179
|
if (entries.length === 0)
|
|
151
180
|
return;
|
|
181
|
+
const now = Date.now();
|
|
152
182
|
const rows = entries.map(e => {
|
|
153
183
|
if (typeof e.id !== 'string' || e.id.length === 0)
|
|
154
184
|
throw new Error('memory-rvf: id must be a non-empty string');
|
|
155
|
-
|
|
185
|
+
if (e.metadata !== undefined && (typeof e.metadata !== 'object' || e.metadata === null || Array.isArray(e.metadata))) {
|
|
186
|
+
throw new Error('memory-rvf: metadata must be a plain object');
|
|
187
|
+
}
|
|
188
|
+
if (e.metadata && STORED_AT_FIELD in e.metadata) {
|
|
189
|
+
throw new Error(`memory-rvf: metadata key "${STORED_AT_FIELD}" is reserved; pass storedAt instead`);
|
|
190
|
+
}
|
|
191
|
+
const storedAt = checkStoredAt(e.storedAt, now);
|
|
192
|
+
return {
|
|
193
|
+
id: e.id,
|
|
194
|
+
vector: toVector(e.embedding, dimensions),
|
|
195
|
+
metadata: { ...e.metadata, [STORED_AT_FIELD]: storedAt },
|
|
196
|
+
};
|
|
156
197
|
});
|
|
157
198
|
const db = (await get(namespace, true));
|
|
158
|
-
const
|
|
199
|
+
const plain = () => rows.map(({ id, vector }) => ({ id, vector }));
|
|
200
|
+
let res;
|
|
201
|
+
if (!metadataSupported) {
|
|
202
|
+
res = await db.ingestBatch(plain());
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
try {
|
|
206
|
+
res = await db.ingestBatch(rows);
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
// RVF < 0.4.7 (or rvf-node < 0.4.2) rejects metadata before writing.
|
|
210
|
+
if (!isMetadataNotSupported(err))
|
|
211
|
+
throw err;
|
|
212
|
+
metadataSupported = false;
|
|
213
|
+
res = await db.ingestBatch(plain());
|
|
214
|
+
}
|
|
215
|
+
}
|
|
159
216
|
if (res.rejected > 0) {
|
|
160
217
|
throw new Error(`memory-rvf: RVF rejected ${res.rejected} of ${rows.length} vectors in namespace ${namespace}`);
|
|
161
218
|
}
|
|
@@ -163,13 +220,19 @@ export async function createRvfBackend(opts) {
|
|
|
163
220
|
return {
|
|
164
221
|
dir,
|
|
165
222
|
persistent,
|
|
166
|
-
|
|
167
|
-
return
|
|
223
|
+
get metadataSupported() {
|
|
224
|
+
return metadataSupported;
|
|
225
|
+
},
|
|
226
|
+
insert(id, embedding, namespace = 'default', io = {}) {
|
|
227
|
+
return insertBatch([{ id, embedding, storedAt: io.storedAt, metadata: io.metadata }], namespace);
|
|
168
228
|
},
|
|
169
229
|
insertBatch,
|
|
170
230
|
async search(embedding, k, namespace = 'default', so = {}) {
|
|
171
231
|
if (!Number.isInteger(k) || k <= 0)
|
|
172
232
|
throw new Error(`memory-rvf: k must be a positive integer, got ${k}`);
|
|
233
|
+
if (so.filter !== undefined && !metadataSupported) {
|
|
234
|
+
throw new Error('memory-rvf: metadata filters need @ruvector/rvf >= 0.4.7 with rvf-node >= 0.4.2');
|
|
235
|
+
}
|
|
173
236
|
const vec = toVector(embedding, dimensions);
|
|
174
237
|
const db = await get(namespace, false);
|
|
175
238
|
if (!db)
|
|
@@ -179,11 +242,20 @@ export async function createRvfBackend(opts) {
|
|
|
179
242
|
q.efSearch = so.efSearch;
|
|
180
243
|
if (so.exact)
|
|
181
244
|
q.forceExact = true;
|
|
245
|
+
if (so.filter !== undefined)
|
|
246
|
+
q.filter = so.filter;
|
|
182
247
|
const raw = await db.query(vec, k, q);
|
|
183
248
|
return raw.map(r => {
|
|
184
249
|
const score = toScore(r.distance);
|
|
185
|
-
|
|
186
|
-
|
|
250
|
+
const hit = { id: r.id, score, decayedScore: score, distance: r.distance, namespace };
|
|
251
|
+
if (r.metadata) {
|
|
252
|
+
const { [STORED_AT_FIELD]: storedAt, ...rest } = r.metadata;
|
|
253
|
+
if (typeof storedAt === 'number')
|
|
254
|
+
hit.storedAt = storedAt;
|
|
255
|
+
if (Object.keys(rest).length > 0)
|
|
256
|
+
hit.metadata = rest;
|
|
257
|
+
}
|
|
258
|
+
return hit;
|
|
187
259
|
});
|
|
188
260
|
},
|
|
189
261
|
async delete(ids, namespace = 'default') {
|
package/dist/memory-rvf.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-rvf.js","sourceRoot":"","sources":["../src/memory-rvf.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"memory-rvf.js","sourceRoot":"","sources":["../src/memory-rvf.ts"],"names":[],"mappings":"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"}
|
package/dist/memory.d.ts
CHANGED
|
@@ -26,8 +26,9 @@ export interface DecayConfig {
|
|
|
26
26
|
halfLifeMs?: number;
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
|
-
* Rank a list of raw HNSW hits
|
|
30
|
-
*
|
|
29
|
+
* Rank a list of raw HNSW hits by decay-weighted score when `useDecay` is
|
|
30
|
+
* true: an emergent-time AgenticClock weight when one is usable, otherwise
|
|
31
|
+
* the half-life weight `linearDecay(age, halfLifeMs)`.
|
|
31
32
|
*
|
|
32
33
|
* Returns a NEW array sorted descending by decayedScore (when useDecay=true)
|
|
33
34
|
* or score (when false).
|
package/dist/memory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,SAAS;IACxB,uBAAuB;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,gFAAgF;IAChF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,SAAS;IACxB,uBAAuB;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,gFAAgF;IAChF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyCD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,SAAS,EAAE,EACjB,MAAM,GAAE,WAAgB,GACvB,OAAO,CAAC,SAAS,EAAE,CAAC,CAwBtB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAC9F,CAAC,KAAK,EAAE,MAAM,KAAK;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAC/D,CASA;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAIrE"}
|
package/dist/memory.js
CHANGED
|
@@ -40,9 +40,23 @@ async function loadEmergent() {
|
|
|
40
40
|
return null;
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
+
/** An emergent-time clock with a callable `weight(ageMs)`, or null. */
|
|
44
|
+
async function emergentDecayClock(halfLifeMs) {
|
|
45
|
+
const emergent = await loadEmergent();
|
|
46
|
+
if (!emergent)
|
|
47
|
+
return null;
|
|
48
|
+
try {
|
|
49
|
+
const clock = new emergent.AgenticClock({ halfLifeMs });
|
|
50
|
+
return typeof clock.weight === 'function' ? clock : null;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
43
56
|
/**
|
|
44
|
-
* Rank a list of raw HNSW hits
|
|
45
|
-
*
|
|
57
|
+
* Rank a list of raw HNSW hits by decay-weighted score when `useDecay` is
|
|
58
|
+
* true: an emergent-time AgenticClock weight when one is usable, otherwise
|
|
59
|
+
* the half-life weight `linearDecay(age, halfLifeMs)`.
|
|
46
60
|
*
|
|
47
61
|
* Returns a NEW array sorted descending by decayedScore (when useDecay=true)
|
|
48
62
|
* or score (when false).
|
|
@@ -54,14 +68,14 @@ export async function rankWithDecay(hits, config = {}) {
|
|
|
54
68
|
if (!useDecay) {
|
|
55
69
|
return [...hits].sort((a, b) => b.score - a.score);
|
|
56
70
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
71
|
+
// Without a usable emergent-time clock, decay with the deterministic
|
|
72
|
+
// half-life weight 0.5^(age / halfLifeMs). `score` stays raw. Until 0.1.6
|
|
73
|
+
// this path returned raw scores, so decay never reordered anything:
|
|
74
|
+
// @ruvector/emergent-time 0.1.x has no `weight(ageMs)` (its AgenticClock
|
|
75
|
+
// measures internal agent time from state deltas, not age decay).
|
|
76
|
+
const clock = (await emergentDecayClock(halfLifeMs))
|
|
77
|
+
?? { weight: (ageMs) => linearDecay(ageMs, halfLifeMs) };
|
|
78
|
+
// Hits without `storedAt` are treated as age 0 (weight 1).
|
|
65
79
|
const ranked = hits.map(h => {
|
|
66
80
|
const ageMs = h.storedAt !== undefined ? Math.max(0, now - h.storedAt) : 0;
|
|
67
81
|
const weight = clock.weight(ageMs);
|
package/dist/memory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,EAAE;AACF,8BAA8B;AAC9B,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,oEAAoE;AACpE,EAAE;AACF,gEAAgE;AAChE,6EAA6E;AAC7E,wEAAwE;AACxE,2EAA2E;AAC3E,4EAA4E;AAC5E,EAAE;AACF,mEAAmE;AACnE,+DAA+D;AAC/D,EAAE;AACF,uEAAuE;AACvE,0EAA0E;AAC1E,sEAAsE;AACtE,wDAAwD;AAqCxD,IAAI,SAA6C,CAAC;AAElD,KAAK,UAAU,YAAY;IACzB,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAA+B,CAAC;QAClF,2EAA2E;QAC3E,wEAAwE;QACxE,sEAAsE;QACtE,wEAAwE;QACxE,uEAAuE;QACvE,6DAA6D;QAC7D,IAAI,GAAG,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,SAAS,GAAG,GAAG,CAAC;QAChB,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,EAAE;AACF,8BAA8B;AAC9B,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,oEAAoE;AACpE,EAAE;AACF,gEAAgE;AAChE,6EAA6E;AAC7E,wEAAwE;AACxE,2EAA2E;AAC3E,4EAA4E;AAC5E,EAAE;AACF,mEAAmE;AACnE,+DAA+D;AAC/D,EAAE;AACF,uEAAuE;AACvE,0EAA0E;AAC1E,sEAAsE;AACtE,wDAAwD;AAqCxD,IAAI,SAA6C,CAAC;AAElD,KAAK,UAAU,YAAY;IACzB,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAA+B,CAAC;QAClF,2EAA2E;QAC3E,wEAAwE;QACxE,sEAAsE;QACtE,wEAAwE;QACxE,uEAAuE;QACvE,6DAA6D;QAC7D,IAAI,GAAG,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,SAAS,GAAG,GAAG,CAAC;QAChB,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,KAAK,UAAU,kBAAkB,CAAC,UAAkB;IAClD,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IACtC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,CAAyB,CAAC;QAChF,OAAO,OAAO,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAE,KAA2C,CAAC,CAAC,CAAC,IAAI,CAAC;IAClG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAiB,EACjB,SAAsB,EAAE;IAExB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC;IACzC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;IAE1E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,qEAAqE;IACrE,0EAA0E;IAC1E,oEAAoE;IACpE,yEAAyE;IACzE,kEAAkE;IAClE,MAAM,KAAK,GAAG,CAAC,MAAM,kBAAkB,CAAC,UAAU,CAAC,CAAC;WAC/C,EAAE,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC;IACnE,2DAA2D;IAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAC1B,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,KAAK,GAAG,MAAM,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;IACvD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA+C,EAAE;IAGpF,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,iEAAiE;QACjE,wBAAwB;QACxB,OAAO,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO,CAAC,KAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,UAAkB;IAC3D,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACzB,MAAM,MAAM,GAAG,KAAK,GAAG,UAAU,CAAC;IAClC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metaharness/kernel",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Cross-platform kernel for the agent-harness-generator — wasm primary, NAPI-RS native fallback",
|
|
5
5
|
"homepage": "https://github.com/ruvnet/metaharness",
|
|
6
6
|
"repository": {
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"@ruvector/emergent-time": "^0.1.0"
|
|
58
58
|
},
|
|
59
59
|
"peerDependencies": {
|
|
60
|
-
"@ruvector/rvf": "^0.3.0 || ^0.4.
|
|
60
|
+
"@ruvector/rvf": "^0.3.0 || ^0.4.7",
|
|
61
61
|
"@metaharness/kernel-darwin-arm64": "0.1.0",
|
|
62
62
|
"@metaharness/kernel-darwin-x64": "0.1.0",
|
|
63
63
|
"@metaharness/kernel-linux-x64-gnu": "0.1.0",
|
|
@@ -88,6 +88,6 @@
|
|
|
88
88
|
"node": ">=20.0.0"
|
|
89
89
|
},
|
|
90
90
|
"devDependencies": {
|
|
91
|
-
"@ruvector/rvf": "^0.4.
|
|
91
|
+
"@ruvector/rvf": "^0.4.7"
|
|
92
92
|
}
|
|
93
93
|
}
|