@mono-agent/memory 0.4.1
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 +61 -0
- package/dist/bujo/capture.d.ts +20 -0
- package/dist/bujo/capture.d.ts.map +1 -0
- package/dist/bujo/capture.js +77 -0
- package/dist/bujo/capture.js.map +1 -0
- package/dist/bujo/cli-env.d.ts +11 -0
- package/dist/bujo/cli-env.d.ts.map +1 -0
- package/dist/bujo/cli-env.js +30 -0
- package/dist/bujo/cli-env.js.map +1 -0
- package/dist/bujo/cli.d.ts +3 -0
- package/dist/bujo/cli.d.ts.map +1 -0
- package/dist/bujo/cli.js +98 -0
- package/dist/bujo/cli.js.map +1 -0
- package/dist/bujo/consolidate.d.ts +15 -0
- package/dist/bujo/consolidate.d.ts.map +1 -0
- package/dist/bujo/consolidate.js +61 -0
- package/dist/bujo/consolidate.js.map +1 -0
- package/dist/bujo/daily.d.ts +17 -0
- package/dist/bujo/daily.d.ts.map +1 -0
- package/dist/bujo/daily.js +47 -0
- package/dist/bujo/daily.js.map +1 -0
- package/dist/bujo/distill.d.ts +10 -0
- package/dist/bujo/distill.d.ts.map +1 -0
- package/dist/bujo/distill.js +50 -0
- package/dist/bujo/distill.js.map +1 -0
- package/dist/bujo/entities.d.ts +24 -0
- package/dist/bujo/entities.d.ts.map +1 -0
- package/dist/bujo/entities.js +80 -0
- package/dist/bujo/entities.js.map +1 -0
- package/dist/bujo/grammar.d.ts +18 -0
- package/dist/bujo/grammar.d.ts.map +1 -0
- package/dist/bujo/grammar.js +147 -0
- package/dist/bujo/grammar.js.map +1 -0
- package/dist/bujo/graph.d.ts +17 -0
- package/dist/bujo/graph.d.ts.map +1 -0
- package/dist/bujo/graph.js +96 -0
- package/dist/bujo/graph.js.map +1 -0
- package/dist/bujo/ids.d.ts +9 -0
- package/dist/bujo/ids.d.ts.map +1 -0
- package/dist/bujo/ids.js +23 -0
- package/dist/bujo/ids.js.map +1 -0
- package/dist/bujo/index.d.ts +26 -0
- package/dist/bujo/index.d.ts.map +1 -0
- package/dist/bujo/index.js +20 -0
- package/dist/bujo/index.js.map +1 -0
- package/dist/bujo/json.d.ts +3 -0
- package/dist/bujo/json.d.ts.map +1 -0
- package/dist/bujo/json.js +58 -0
- package/dist/bujo/json.js.map +1 -0
- package/dist/bujo/llm.d.ts +14 -0
- package/dist/bujo/llm.d.ts.map +1 -0
- package/dist/bujo/llm.js +2 -0
- package/dist/bujo/llm.js.map +1 -0
- package/dist/bujo/migrate.d.ts +12 -0
- package/dist/bujo/migrate.d.ts.map +1 -0
- package/dist/bujo/migrate.js +136 -0
- package/dist/bujo/migrate.js.map +1 -0
- package/dist/bujo/model-error.d.ts +16 -0
- package/dist/bujo/model-error.d.ts.map +1 -0
- package/dist/bujo/model-error.js +20 -0
- package/dist/bujo/model-error.js.map +1 -0
- package/dist/bujo/ollama-llm.d.ts +7 -0
- package/dist/bujo/ollama-llm.d.ts.map +1 -0
- package/dist/bujo/ollama-llm.js +43 -0
- package/dist/bujo/ollama-llm.js.map +1 -0
- package/dist/bujo/projections.d.ts +8 -0
- package/dist/bujo/projections.d.ts.map +1 -0
- package/dist/bujo/projections.js +53 -0
- package/dist/bujo/projections.js.map +1 -0
- package/dist/bujo/rebuild.d.ts +12 -0
- package/dist/bujo/rebuild.d.ts.map +1 -0
- package/dist/bujo/rebuild.js +73 -0
- package/dist/bujo/rebuild.js.map +1 -0
- package/dist/bujo/recall.d.ts +7 -0
- package/dist/bujo/recall.d.ts.map +1 -0
- package/dist/bujo/recall.js +33 -0
- package/dist/bujo/recall.js.map +1 -0
- package/dist/bujo/reconcile.d.ts +37 -0
- package/dist/bujo/reconcile.d.ts.map +1 -0
- package/dist/bujo/reconcile.js +190 -0
- package/dist/bujo/reconcile.js.map +1 -0
- package/dist/bujo/reflect.d.ts +30 -0
- package/dist/bujo/reflect.d.ts.map +1 -0
- package/dist/bujo/reflect.js +100 -0
- package/dist/bujo/reflect.js.map +1 -0
- package/dist/bujo/store.d.ts +77 -0
- package/dist/bujo/store.d.ts.map +1 -0
- package/dist/bujo/store.js +222 -0
- package/dist/bujo/store.js.map +1 -0
- package/dist/bujo/types.d.ts +39 -0
- package/dist/bujo/types.d.ts.map +1 -0
- package/dist/bujo/types.js +2 -0
- package/dist/bujo/types.js.map +1 -0
- package/dist/search/chunks.d.ts +14 -0
- package/dist/search/chunks.d.ts.map +1 -0
- package/dist/search/chunks.js +75 -0
- package/dist/search/chunks.js.map +1 -0
- package/dist/search/circuit-breaker.d.ts +34 -0
- package/dist/search/circuit-breaker.d.ts.map +1 -0
- package/dist/search/circuit-breaker.js +89 -0
- package/dist/search/circuit-breaker.js.map +1 -0
- package/dist/search/embeddings.d.ts +44 -0
- package/dist/search/embeddings.d.ts.map +1 -0
- package/dist/search/embeddings.js +141 -0
- package/dist/search/embeddings.js.map +1 -0
- package/dist/search/index.d.ts +8 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +5 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/types.d.ts +41 -0
- package/dist/search/types.d.ts.map +1 -0
- package/dist/search/types.js +2 -0
- package/dist/search/types.js.map +1 -0
- package/dist/search/vector-index.d.ts +28 -0
- package/dist/search/vector-index.d.ts.map +1 -0
- package/dist/search/vector-index.js +214 -0
- package/dist/search/vector-index.js.map +1 -0
- package/dist/store/contract.d.ts +2 -0
- package/dist/store/contract.d.ts.map +1 -0
- package/dist/store/contract.js +2 -0
- package/dist/store/contract.js.map +1 -0
- package/dist/store/db.d.ts +84 -0
- package/dist/store/db.d.ts.map +1 -0
- package/dist/store/db.js +471 -0
- package/dist/store/db.js.map +1 -0
- package/dist/store/fts.d.ts +3 -0
- package/dist/store/fts.d.ts.map +1 -0
- package/dist/store/fts.js +6 -0
- package/dist/store/fts.js.map +1 -0
- package/dist/store/index.d.ts +5 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +3 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/ranking.d.ts +16 -0
- package/dist/store/ranking.d.ts.map +1 -0
- package/dist/store/ranking.js +32 -0
- package/dist/store/ranking.js.map +1 -0
- package/dist/store/schema.d.ts +3 -0
- package/dist/store/schema.d.ts.map +1 -0
- package/dist/store/schema.js +61 -0
- package/dist/store/schema.js.map +1 -0
- package/dist/store/types.d.ts +102 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +25 -0
- package/dist/store/types.js.map +1 -0
- package/dist/store/vec.d.ts +12 -0
- package/dist/store/vec.d.ts.map +1 -0
- package/dist/store/vec.js +20 -0
- package/dist/store/vec.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/bujo/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { EmbeddingProvider } from "../search/index.js";
|
|
2
|
+
import type { MemoryStatus, MemoryType } from "../store/index.js";
|
|
3
|
+
import type { LlmComplete } from "./llm.js";
|
|
4
|
+
export type { CandidateMemory } from "./distill.js";
|
|
5
|
+
/** One parsed markdown bullet line: a visible part + structured metadata from the trailing comment. */
|
|
6
|
+
export interface Bullet {
|
|
7
|
+
readonly id: string;
|
|
8
|
+
readonly type: MemoryType;
|
|
9
|
+
readonly status: MemoryStatus;
|
|
10
|
+
readonly text: string;
|
|
11
|
+
readonly salience: number;
|
|
12
|
+
readonly isInsight: boolean;
|
|
13
|
+
readonly createdAt: string;
|
|
14
|
+
readonly refs: readonly string[];
|
|
15
|
+
readonly dueAt?: string;
|
|
16
|
+
}
|
|
17
|
+
export type BujoTier = "lite" | "journal" | "bujo";
|
|
18
|
+
/** Minimal logger sink for best-effort background work (capture queue). */
|
|
19
|
+
export interface BujoLogger {
|
|
20
|
+
warn(message: string): void;
|
|
21
|
+
}
|
|
22
|
+
export interface BujoOptions {
|
|
23
|
+
readonly root: string;
|
|
24
|
+
/** Embedding provider. When absent, the store runs in `lite` tier (FTS-only recall). */
|
|
25
|
+
readonly embeddings?: EmbeddingProvider;
|
|
26
|
+
/** Vector dimension. Required when `embeddings` is provided; ignored in the `lite` tier. */
|
|
27
|
+
readonly dim?: number;
|
|
28
|
+
readonly maxBytes?: number;
|
|
29
|
+
readonly clock?: () => Date;
|
|
30
|
+
/** Optional LLM for the intelligent capture path (distill + reconcile + entity extraction).
|
|
31
|
+
* When absent, `capture()` returns `undefined` and `appendHostSummary` is the only write path. */
|
|
32
|
+
readonly llm?: LlmComplete;
|
|
33
|
+
/** Explicit tier override. When absent, the tier is derived from the options:
|
|
34
|
+
* no embeddings → `"lite"`; embeddings + no llm → `"journal"`; embeddings + llm → `"bujo"`. */
|
|
35
|
+
readonly tier?: BujoTier;
|
|
36
|
+
/** Optional sink for caught errors in the async capture queue. Defaults to a no-op. */
|
|
37
|
+
readonly logger?: BujoLogger;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bujo/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,uGAAuG;AACvG,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAEnD,2EAA2E;AAC3E,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wFAAwF;IACxF,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IACxC,4FAA4F;IAC5F,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B;sGACkG;IAClG,QAAQ,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC;IAC3B;mGAC+F;IAC/F,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IACzB,uFAAuF;IACvF,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/bujo/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { MemoryChunk } from "./types.js";
|
|
2
|
+
/** Minimal structural shape of an entity, to avoid a package dependency on memory-graph. */
|
|
3
|
+
export interface EntityLike {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly entityType: string;
|
|
6
|
+
readonly observations: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Builds indexable chunks from the markdown journal archive plus the entity
|
|
10
|
+
* snapshot. Journal files are split into `##`-delimited sections; each entity
|
|
11
|
+
* becomes one summary chunk.
|
|
12
|
+
*/
|
|
13
|
+
export declare function gatherMemoryChunks(rootDir: string, entities: readonly EntityLike[]): Promise<readonly MemoryChunk[]>;
|
|
14
|
+
//# sourceMappingURL=chunks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunks.d.ts","sourceRoot":"","sources":["../../src/search/chunks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,4FAA4F;AAC5F,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,UAAU,EAAE,GAAG,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAmC1H"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
const MEMORY_SUBDIRS = ["daily", "monthly"];
|
|
4
|
+
const DATE_RE = /^(\d{4}-\d{2}-\d{2})\.md$/u;
|
|
5
|
+
/**
|
|
6
|
+
* Builds indexable chunks from the markdown journal archive plus the entity
|
|
7
|
+
* snapshot. Journal files are split into `##`-delimited sections; each entity
|
|
8
|
+
* becomes one summary chunk.
|
|
9
|
+
*/
|
|
10
|
+
export async function gatherMemoryChunks(rootDir, entities) {
|
|
11
|
+
const chunks = [];
|
|
12
|
+
for (const subdir of MEMORY_SUBDIRS) {
|
|
13
|
+
const dir = join(rootDir, subdir);
|
|
14
|
+
for (const name of await readDirSafe(dir)) {
|
|
15
|
+
if (!name.endsWith(".md")) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
const content = await readUtf8(join(dir, name));
|
|
19
|
+
if (content === undefined) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const source = `${subdir}/${name}`;
|
|
23
|
+
const day = subdir === "daily" ? DATE_RE.exec(name)?.[1] : undefined;
|
|
24
|
+
splitSections(content).forEach((section, index) => {
|
|
25
|
+
chunks.push({
|
|
26
|
+
id: `${source}#${index}`,
|
|
27
|
+
source,
|
|
28
|
+
text: section,
|
|
29
|
+
...(day === undefined ? {} : { day }),
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
for (const entity of entities) {
|
|
35
|
+
const facts = entity.observations.join("; ");
|
|
36
|
+
const text = facts.length === 0
|
|
37
|
+
? `${entity.name} (${entity.entityType})`
|
|
38
|
+
: `${entity.name} (${entity.entityType}): ${facts}`;
|
|
39
|
+
chunks.push({ id: `entity:${normalizeName(entity.name)}`, source: "graph", text });
|
|
40
|
+
}
|
|
41
|
+
return chunks;
|
|
42
|
+
}
|
|
43
|
+
function splitSections(content) {
|
|
44
|
+
const sections = content.split(/\n(?=#{1,3} )/u).map((section) => section.trim()).filter(Boolean);
|
|
45
|
+
return sections.length === 0 ? [content.trim()].filter(Boolean) : sections;
|
|
46
|
+
}
|
|
47
|
+
function normalizeName(name) {
|
|
48
|
+
return name.replace(/\s+/gu, " ").trim().toLowerCase();
|
|
49
|
+
}
|
|
50
|
+
async function readUtf8(path) {
|
|
51
|
+
try {
|
|
52
|
+
return await readFile(path, "utf8");
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (isNodeError(error, "ENOENT")) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function readDirSafe(dir) {
|
|
62
|
+
try {
|
|
63
|
+
return await readdir(dir);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (isNodeError(error, "ENOENT")) {
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function isNodeError(error, code) {
|
|
73
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === code;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=chunks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunks.js","sourceRoot":"","sources":["../../src/search/chunks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { EmbeddingProvider } from "./types.js";
|
|
2
|
+
export interface CircuitBreakerEmbeddingOptions {
|
|
3
|
+
/** Consecutive inner failures before the breaker trips OPEN (default 3). */
|
|
4
|
+
readonly failureThreshold?: number;
|
|
5
|
+
/** How long the breaker stays OPEN before allowing a HALF-OPEN trial (default 30000ms). */
|
|
6
|
+
readonly cooldownMs?: number;
|
|
7
|
+
/** Injectable clock for deterministic tests (default Date.now). */
|
|
8
|
+
readonly now?: () => number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Wraps an {@link EmbeddingProvider} with a circuit breaker so a slow/failing
|
|
12
|
+
* backend stops blocking the critical path. After `failureThreshold` consecutive
|
|
13
|
+
* failures the breaker trips OPEN and fails FAST (throwing `embedding_circuit_open`
|
|
14
|
+
* without calling the inner provider) for `cooldownMs`. It then allows a single
|
|
15
|
+
* HALF-OPEN trial: success CLOSES it, failure RE-OPENS it for a fresh cooldown.
|
|
16
|
+
*/
|
|
17
|
+
export declare class CircuitBreakerEmbeddingProvider implements EmbeddingProvider {
|
|
18
|
+
readonly id: string;
|
|
19
|
+
private readonly inner;
|
|
20
|
+
private readonly failureThreshold;
|
|
21
|
+
private readonly cooldownMs;
|
|
22
|
+
private readonly now;
|
|
23
|
+
private state;
|
|
24
|
+
private consecutiveFailures;
|
|
25
|
+
private openedAt;
|
|
26
|
+
private trialInFlight;
|
|
27
|
+
constructor(inner: EmbeddingProvider, options?: CircuitBreakerEmbeddingOptions);
|
|
28
|
+
embed(texts: readonly string[]): Promise<number[][]>;
|
|
29
|
+
private onSuccess;
|
|
30
|
+
private onFailure;
|
|
31
|
+
private open;
|
|
32
|
+
}
|
|
33
|
+
export declare function createCircuitBreakerEmbeddingProvider(inner: EmbeddingProvider, options?: CircuitBreakerEmbeddingOptions): EmbeddingProvider;
|
|
34
|
+
//# sourceMappingURL=circuit-breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../src/search/circuit-breaker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAKpD,MAAM,WAAW,8BAA8B;IAC7C,4EAA4E;IAC5E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,2FAA2F;IAC3F,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AAID;;;;;;GAMG;AACH,qBAAa,+BAAgC,YAAW,iBAAiB;IACvE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IAEnC,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,QAAQ,CAAK;IAGrB,OAAO,CAAC,aAAa,CAAS;gBAElB,KAAK,EAAE,iBAAiB,EAAE,OAAO,GAAE,8BAAmC;IAQ5E,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAoC1D,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,IAAI;CAKb;AAED,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE,8BAAmC,GAC3C,iBAAiB,CAEnB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { MemorySearchError } from "./embeddings.js";
|
|
2
|
+
const DEFAULT_FAILURE_THRESHOLD = 3;
|
|
3
|
+
const DEFAULT_COOLDOWN_MS = 30_000;
|
|
4
|
+
/**
|
|
5
|
+
* Wraps an {@link EmbeddingProvider} with a circuit breaker so a slow/failing
|
|
6
|
+
* backend stops blocking the critical path. After `failureThreshold` consecutive
|
|
7
|
+
* failures the breaker trips OPEN and fails FAST (throwing `embedding_circuit_open`
|
|
8
|
+
* without calling the inner provider) for `cooldownMs`. It then allows a single
|
|
9
|
+
* HALF-OPEN trial: success CLOSES it, failure RE-OPENS it for a fresh cooldown.
|
|
10
|
+
*/
|
|
11
|
+
export class CircuitBreakerEmbeddingProvider {
|
|
12
|
+
id;
|
|
13
|
+
inner;
|
|
14
|
+
failureThreshold;
|
|
15
|
+
cooldownMs;
|
|
16
|
+
now;
|
|
17
|
+
state = "closed";
|
|
18
|
+
consecutiveFailures = 0;
|
|
19
|
+
openedAt = 0;
|
|
20
|
+
// Guards the single HALF-OPEN trial: once a trial is in flight, concurrent
|
|
21
|
+
// callers must fail fast rather than pile onto an unhealthy backend.
|
|
22
|
+
trialInFlight = false;
|
|
23
|
+
constructor(inner, options = {}) {
|
|
24
|
+
this.inner = inner;
|
|
25
|
+
this.failureThreshold = options.failureThreshold ?? DEFAULT_FAILURE_THRESHOLD;
|
|
26
|
+
this.cooldownMs = options.cooldownMs ?? DEFAULT_COOLDOWN_MS;
|
|
27
|
+
this.now = options.now ?? Date.now;
|
|
28
|
+
this.id = inner.id;
|
|
29
|
+
}
|
|
30
|
+
async embed(texts) {
|
|
31
|
+
if (this.state === "open") {
|
|
32
|
+
if (this.now() - this.openedAt < this.cooldownMs) {
|
|
33
|
+
throw new MemorySearchError("embedding_circuit_open", "Embedding circuit is open; failing fast.", {
|
|
34
|
+
id: this.id,
|
|
35
|
+
cooldownMs: this.cooldownMs,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
// Cooldown elapsed: allow exactly one trial.
|
|
39
|
+
this.state = "half-open";
|
|
40
|
+
}
|
|
41
|
+
// In HALF-OPEN only the first caller may probe the backend; concurrent
|
|
42
|
+
// callers fail fast so a single trial decides whether to re-close or
|
|
43
|
+
// re-open. (Once state flips to half-open, the `state === "open"` guard
|
|
44
|
+
// above no longer blocks them, so this second guard is required.)
|
|
45
|
+
if (this.state === "half-open") {
|
|
46
|
+
if (this.trialInFlight) {
|
|
47
|
+
throw new MemorySearchError("embedding_circuit_open", "Embedding circuit is half-open; a trial is already in flight.", {
|
|
48
|
+
id: this.id,
|
|
49
|
+
cooldownMs: this.cooldownMs,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
this.trialInFlight = true;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const result = await this.inner.embed(texts);
|
|
56
|
+
this.onSuccess();
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
this.onFailure();
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
onSuccess() {
|
|
65
|
+
this.state = "closed";
|
|
66
|
+
this.consecutiveFailures = 0;
|
|
67
|
+
this.trialInFlight = false;
|
|
68
|
+
}
|
|
69
|
+
onFailure() {
|
|
70
|
+
if (this.state === "half-open") {
|
|
71
|
+
// A failed trial re-opens the breaker for a fresh cooldown window.
|
|
72
|
+
this.open();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
this.consecutiveFailures += 1;
|
|
76
|
+
if (this.consecutiveFailures >= this.failureThreshold) {
|
|
77
|
+
this.open();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
open() {
|
|
81
|
+
this.state = "open";
|
|
82
|
+
this.openedAt = this.now();
|
|
83
|
+
this.trialInFlight = false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export function createCircuitBreakerEmbeddingProvider(inner, options = {}) {
|
|
87
|
+
return new CircuitBreakerEmbeddingProvider(inner, options);
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/search/circuit-breaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { EmbeddingProvider, EmbeddingProviderConfig, MemorySearchErrorCode } from "./types.js";
|
|
2
|
+
export declare class MemorySearchError extends Error {
|
|
3
|
+
readonly code: MemorySearchErrorCode;
|
|
4
|
+
readonly details: Record<string, unknown>;
|
|
5
|
+
constructor(code: MemorySearchErrorCode, message: string, details?: Record<string, unknown>);
|
|
6
|
+
}
|
|
7
|
+
type FetchLike = typeof fetch;
|
|
8
|
+
export interface OllamaEmbeddingOptions {
|
|
9
|
+
readonly model: string;
|
|
10
|
+
readonly endpoint?: string;
|
|
11
|
+
readonly timeoutMs?: number;
|
|
12
|
+
readonly fetchImpl?: FetchLike;
|
|
13
|
+
}
|
|
14
|
+
/** Local embeddings via Ollama's `/api/embed` endpoint (e.g. nomic-embed-text). */
|
|
15
|
+
export declare class OllamaEmbeddingProvider implements EmbeddingProvider {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
private readonly model;
|
|
18
|
+
private readonly endpoint;
|
|
19
|
+
private readonly timeoutMs;
|
|
20
|
+
private readonly fetchImpl;
|
|
21
|
+
constructor(options: OllamaEmbeddingOptions);
|
|
22
|
+
embed(texts: readonly string[]): Promise<number[][]>;
|
|
23
|
+
}
|
|
24
|
+
export interface OpenAIEmbeddingOptions {
|
|
25
|
+
readonly model: string;
|
|
26
|
+
readonly apiKey: string;
|
|
27
|
+
readonly endpoint?: string;
|
|
28
|
+
readonly timeoutMs?: number;
|
|
29
|
+
readonly fetchImpl?: FetchLike;
|
|
30
|
+
}
|
|
31
|
+
/** Remote embeddings via the OpenAI-compatible `/embeddings` endpoint. */
|
|
32
|
+
export declare class OpenAIEmbeddingProvider implements EmbeddingProvider {
|
|
33
|
+
readonly id: string;
|
|
34
|
+
private readonly model;
|
|
35
|
+
private readonly apiKey;
|
|
36
|
+
private readonly endpoint;
|
|
37
|
+
private readonly timeoutMs;
|
|
38
|
+
private readonly fetchImpl;
|
|
39
|
+
constructor(options: OpenAIEmbeddingOptions);
|
|
40
|
+
embed(texts: readonly string[]): Promise<number[][]>;
|
|
41
|
+
}
|
|
42
|
+
export declare function createEmbeddingProvider(config: EmbeddingProviderConfig, fetchImpl?: FetchLike): EmbeddingProvider;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=embeddings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/search/embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEpG,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAE9B,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAMhG;AAED,KAAK,SAAS,GAAG,OAAO,KAAK,CAAC;AAM9B,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;CAChC;AAED,mFAAmF;AACnF,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAE1B,OAAO,EAAE,sBAAsB;IAWrC,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAsB3D;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;CAChC;AAED,0EAA0E;AAC1E,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAE1B,OAAO,EAAE,sBAAsB;IAerC,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAqB3D;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,uBAAuB,EAC/B,SAAS,CAAC,EAAE,SAAS,GACpB,iBAAiB,CAsBnB"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
export class MemorySearchError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
details;
|
|
4
|
+
constructor(code, message, details = {}) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "MemorySearchError";
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.details = { ...details, code };
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const DEFAULT_OLLAMA_ENDPOINT = "http://localhost:11434";
|
|
12
|
+
const DEFAULT_OPENAI_ENDPOINT = "https://api.openai.com/v1";
|
|
13
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
14
|
+
/** Local embeddings via Ollama's `/api/embed` endpoint (e.g. nomic-embed-text). */
|
|
15
|
+
export class OllamaEmbeddingProvider {
|
|
16
|
+
id;
|
|
17
|
+
model;
|
|
18
|
+
endpoint;
|
|
19
|
+
timeoutMs;
|
|
20
|
+
fetchImpl;
|
|
21
|
+
constructor(options) {
|
|
22
|
+
if (typeof options.model !== "string" || options.model.trim().length === 0) {
|
|
23
|
+
throw new MemorySearchError("invalid_embedding_options", "Ollama embedding model is required.");
|
|
24
|
+
}
|
|
25
|
+
this.model = options.model;
|
|
26
|
+
this.endpoint = (options.endpoint ?? DEFAULT_OLLAMA_ENDPOINT).replace(/\/+$/u, "");
|
|
27
|
+
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
28
|
+
this.fetchImpl = options.fetchImpl ?? fetch;
|
|
29
|
+
this.id = `ollama:${this.model}`;
|
|
30
|
+
}
|
|
31
|
+
async embed(texts) {
|
|
32
|
+
if (texts.length === 0) {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
const body = JSON.stringify({ model: this.model, input: [...texts] });
|
|
36
|
+
const response = await withTimeout(this.timeoutMs, (signal) => this.fetchImpl(`${this.endpoint}/api/embed`, {
|
|
37
|
+
method: "POST",
|
|
38
|
+
headers: { "content-type": "application/json" },
|
|
39
|
+
body,
|
|
40
|
+
signal,
|
|
41
|
+
}));
|
|
42
|
+
if (!response.ok) {
|
|
43
|
+
throw new MemorySearchError("embedding_request_failed", `Ollama embeddings request failed (${response.status}).`, {
|
|
44
|
+
status: response.status,
|
|
45
|
+
endpoint: this.endpoint,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const json = (await response.json());
|
|
49
|
+
return validateEmbeddings(json.embeddings, texts.length);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Remote embeddings via the OpenAI-compatible `/embeddings` endpoint. */
|
|
53
|
+
export class OpenAIEmbeddingProvider {
|
|
54
|
+
id;
|
|
55
|
+
model;
|
|
56
|
+
apiKey;
|
|
57
|
+
endpoint;
|
|
58
|
+
timeoutMs;
|
|
59
|
+
fetchImpl;
|
|
60
|
+
constructor(options) {
|
|
61
|
+
if (typeof options.model !== "string" || options.model.trim().length === 0) {
|
|
62
|
+
throw new MemorySearchError("invalid_embedding_options", "OpenAI embedding model is required.");
|
|
63
|
+
}
|
|
64
|
+
if (typeof options.apiKey !== "string" || options.apiKey.trim().length === 0) {
|
|
65
|
+
throw new MemorySearchError("invalid_embedding_options", "OpenAI embeddings require an API key.");
|
|
66
|
+
}
|
|
67
|
+
this.model = options.model;
|
|
68
|
+
this.apiKey = options.apiKey;
|
|
69
|
+
this.endpoint = (options.endpoint ?? DEFAULT_OPENAI_ENDPOINT).replace(/\/+$/u, "");
|
|
70
|
+
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
71
|
+
this.fetchImpl = options.fetchImpl ?? fetch;
|
|
72
|
+
this.id = `openai:${this.model}`;
|
|
73
|
+
}
|
|
74
|
+
async embed(texts) {
|
|
75
|
+
if (texts.length === 0) {
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
const response = await withTimeout(this.timeoutMs, (signal) => this.fetchImpl(`${this.endpoint}/embeddings`, {
|
|
79
|
+
method: "POST",
|
|
80
|
+
headers: { "content-type": "application/json", authorization: `Bearer ${this.apiKey}` },
|
|
81
|
+
body: JSON.stringify({ model: this.model, input: [...texts] }),
|
|
82
|
+
signal,
|
|
83
|
+
}));
|
|
84
|
+
if (!response.ok) {
|
|
85
|
+
throw new MemorySearchError("embedding_request_failed", `OpenAI embeddings request failed (${response.status}).`, {
|
|
86
|
+
status: response.status,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
const json = (await response.json());
|
|
90
|
+
const embeddings = Array.isArray(json.data) ? json.data.map((entry) => entry.embedding) : undefined;
|
|
91
|
+
return validateEmbeddings(embeddings, texts.length);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export function createEmbeddingProvider(config, fetchImpl) {
|
|
95
|
+
if (config.provider === "ollama") {
|
|
96
|
+
return new OllamaEmbeddingProvider({
|
|
97
|
+
model: config.model,
|
|
98
|
+
...(config.endpoint === undefined ? {} : { endpoint: config.endpoint }),
|
|
99
|
+
...(config.timeoutMs === undefined ? {} : { timeoutMs: config.timeoutMs }),
|
|
100
|
+
...(fetchImpl === undefined ? {} : { fetchImpl }),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (config.provider === "openai") {
|
|
104
|
+
if (config.apiKey === undefined) {
|
|
105
|
+
throw new MemorySearchError("invalid_embedding_options", "OpenAI embeddings require an API key.");
|
|
106
|
+
}
|
|
107
|
+
return new OpenAIEmbeddingProvider({
|
|
108
|
+
model: config.model,
|
|
109
|
+
apiKey: config.apiKey,
|
|
110
|
+
...(config.endpoint === undefined ? {} : { endpoint: config.endpoint }),
|
|
111
|
+
...(config.timeoutMs === undefined ? {} : { timeoutMs: config.timeoutMs }),
|
|
112
|
+
...(fetchImpl === undefined ? {} : { fetchImpl }),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
throw new MemorySearchError("invalid_embedding_options", `Unknown embedding provider "${String(config.provider)}".`);
|
|
116
|
+
}
|
|
117
|
+
function validateEmbeddings(value, expected) {
|
|
118
|
+
if (!Array.isArray(value) || value.length !== expected) {
|
|
119
|
+
throw new MemorySearchError("embedding_response_invalid", "Embedding response shape was unexpected.", {
|
|
120
|
+
expected,
|
|
121
|
+
received: Array.isArray(value) ? value.length : typeof value,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return value.map((vector) => {
|
|
125
|
+
if (!Array.isArray(vector) || vector.some((component) => typeof component !== "number")) {
|
|
126
|
+
throw new MemorySearchError("embedding_response_invalid", "Embedding vector was not an array of numbers.");
|
|
127
|
+
}
|
|
128
|
+
return vector;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
async function withTimeout(timeoutMs, run) {
|
|
132
|
+
const controller = new AbortController();
|
|
133
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
134
|
+
try {
|
|
135
|
+
return await run(controller.signal);
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
clearTimeout(timer);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=embeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/search/embeddings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { createEmbeddingProvider, MemorySearchError, OllamaEmbeddingProvider, OpenAIEmbeddingProvider, } from "./embeddings.js";
|
|
2
|
+
export { CircuitBreakerEmbeddingProvider, createCircuitBreakerEmbeddingProvider, } from "./circuit-breaker.js";
|
|
3
|
+
export type { CircuitBreakerEmbeddingOptions } from "./circuit-breaker.js";
|
|
4
|
+
export { createVectorMemoryIndex, VectorMemoryIndex } from "./vector-index.js";
|
|
5
|
+
export { gatherMemoryChunks } from "./chunks.js";
|
|
6
|
+
export type { EntityLike } from "./chunks.js";
|
|
7
|
+
export type { EmbeddingProvider, EmbeddingProviderConfig, EmbeddingProviderKind, MemoryChunk, MemorySearchErrorCode, SearchHit, VectorMemoryIndexOptions, } from "./types.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/search/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,+BAA+B,EAC/B,qCAAqC,GACtC,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EACV,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,WAAW,EACX,qBAAqB,EACrB,SAAS,EACT,wBAAwB,GACzB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { createEmbeddingProvider, MemorySearchError, OllamaEmbeddingProvider, OpenAIEmbeddingProvider, } from "./embeddings.js";
|
|
2
|
+
export { CircuitBreakerEmbeddingProvider, createCircuitBreakerEmbeddingProvider, } from "./circuit-breaker.js";
|
|
3
|
+
export { createVectorMemoryIndex, VectorMemoryIndex } from "./vector-index.js";
|
|
4
|
+
export { gatherMemoryChunks } from "./chunks.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/search/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,+BAA+B,EAC/B,qCAAqC,GACtC,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type MemorySearchErrorCode = "invalid_embedding_options" | "embedding_request_failed" | "embedding_response_invalid" | "embedding_circuit_open" | "invalid_index_options" | "index_read_failed" | "index_write_failed";
|
|
2
|
+
/** Turns text into dense vectors. Implementations: Ollama (default), OpenAI. */
|
|
3
|
+
export interface EmbeddingProvider {
|
|
4
|
+
/** Stable identifier for diagnostics (e.g. "ollama:nomic-embed-text"). */
|
|
5
|
+
readonly id: string;
|
|
6
|
+
embed(texts: readonly string[]): Promise<number[][]>;
|
|
7
|
+
}
|
|
8
|
+
/** A unit of indexable memory (a journal section or an entity summary). */
|
|
9
|
+
export interface MemoryChunk {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly source: string;
|
|
12
|
+
readonly text: string;
|
|
13
|
+
readonly day?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface SearchHit {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly source: string;
|
|
18
|
+
readonly text: string;
|
|
19
|
+
readonly score: number;
|
|
20
|
+
readonly day?: string;
|
|
21
|
+
}
|
|
22
|
+
export type EmbeddingProviderKind = "ollama" | "openai";
|
|
23
|
+
export interface EmbeddingProviderConfig {
|
|
24
|
+
readonly provider: EmbeddingProviderKind;
|
|
25
|
+
readonly model: string;
|
|
26
|
+
readonly endpoint?: string;
|
|
27
|
+
readonly apiKey?: string;
|
|
28
|
+
readonly timeoutMs?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface VectorMemoryIndexOptions {
|
|
31
|
+
/** JSONL file holding the embedding records (e.g. `<root>/index/embeddings.jsonl`). */
|
|
32
|
+
readonly path: string;
|
|
33
|
+
readonly embeddings: EmbeddingProvider;
|
|
34
|
+
/** Prefix applied to documents before embedding (nomic-embed-text convention). */
|
|
35
|
+
readonly documentPrefix?: string;
|
|
36
|
+
/** Prefix applied to queries before embedding (nomic-embed-text convention). */
|
|
37
|
+
readonly queryPrefix?: string;
|
|
38
|
+
/** Embedding batch size (default 32). */
|
|
39
|
+
readonly batchSize?: number;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/search/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAC7B,2BAA2B,GAC3B,0BAA0B,GAC1B,4BAA4B,GAC5B,wBAAwB,GACxB,uBAAuB,GACvB,mBAAmB,GACnB,oBAAoB,CAAC;AAEzB,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;CACtD;AAED,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,uFAAuF;IACvF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,kFAAkF;IAClF,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,gFAAgF;IAChF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,yCAAyC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/search/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { MemoryChunk, SearchHit, VectorMemoryIndexOptions } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* A dependency-free embedded vector store: embeddings persisted as JSON Lines,
|
|
4
|
+
* searched by brute-force cosine similarity. Fast and simple well under ~50k
|
|
5
|
+
* chunks, which is ample for a single agent's memory; no external vector DB.
|
|
6
|
+
*/
|
|
7
|
+
export declare class VectorMemoryIndex {
|
|
8
|
+
private readonly path;
|
|
9
|
+
private readonly embeddings;
|
|
10
|
+
private readonly documentPrefix;
|
|
11
|
+
private readonly queryPrefix;
|
|
12
|
+
private readonly batchSize;
|
|
13
|
+
private records;
|
|
14
|
+
private loaded;
|
|
15
|
+
constructor(options: VectorMemoryIndexOptions);
|
|
16
|
+
/** Replaces the entire index from the supplied chunks (used by consolidation). */
|
|
17
|
+
rebuild(chunks: readonly MemoryChunk[]): Promise<{
|
|
18
|
+
readonly indexed: number;
|
|
19
|
+
}>;
|
|
20
|
+
/** Semantic search by cosine similarity. Throws if embeddings are unavailable. */
|
|
21
|
+
search(query: string, limit?: number, minScore?: number): Promise<readonly SearchHit[]>;
|
|
22
|
+
size(): Promise<number>;
|
|
23
|
+
private embedAll;
|
|
24
|
+
private ensureLoaded;
|
|
25
|
+
private persist;
|
|
26
|
+
}
|
|
27
|
+
export declare function createVectorMemoryIndex(options: VectorMemoryIndexOptions): VectorMemoryIndex;
|
|
28
|
+
//# sourceMappingURL=vector-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-index.d.ts","sourceRoot":"","sources":["../../src/search/vector-index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAqB,WAAW,EAAE,SAAS,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAetG;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,wBAAwB;IAW7C,kFAAkF;IAC5E,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IASpF,kFAAkF;IAC5E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,QAAQ,SAAI,GAAG,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC;IAyB7E,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;YAKf,QAAQ;YAUR,YAAY;YA0CZ,OAAO;CAsBtB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAE5F"}
|