@windagency/valora-plugin-memory-vault 1.0.0
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.
Potentially problematic release.
This version of @windagency/valora-plugin-memory-vault might be problematic. Click here for more details.
- package/dist/config-schema.d.ts +134 -0
- package/dist/config-schema.d.ts.map +1 -0
- package/dist/config-schema.js +61 -0
- package/dist/config-schema.js.map +1 -0
- package/dist/consolidation/cluster.d.ts +17 -0
- package/dist/consolidation/cluster.d.ts.map +1 -0
- package/dist/consolidation/cluster.js +59 -0
- package/dist/consolidation/cluster.js.map +1 -0
- package/dist/consolidation-service.d.ts +75 -0
- package/dist/consolidation-service.d.ts.map +1 -0
- package/dist/consolidation-service.js +373 -0
- package/dist/consolidation-service.js.map +1 -0
- package/dist/constants.d.ts +30 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +30 -0
- package/dist/constants.js.map +1 -0
- package/dist/decay.d.ts +51 -0
- package/dist/decay.d.ts.map +1 -0
- package/dist/decay.js +59 -0
- package/dist/decay.js.map +1 -0
- package/dist/embeddings/embedder.port.d.ts +9 -0
- package/dist/embeddings/embedder.port.d.ts.map +1 -0
- package/dist/embeddings/embedder.port.js +2 -0
- package/dist/embeddings/embedder.port.js.map +1 -0
- package/dist/embeddings/llm-provider-embedder.d.ts +26 -0
- package/dist/embeddings/llm-provider-embedder.d.ts.map +1 -0
- package/dist/embeddings/llm-provider-embedder.js +34 -0
- package/dist/embeddings/llm-provider-embedder.js.map +1 -0
- package/dist/embeddings/resolve-embedder.d.ts +27 -0
- package/dist/embeddings/resolve-embedder.d.ts.map +1 -0
- package/dist/embeddings/resolve-embedder.js +38 -0
- package/dist/embeddings/resolve-embedder.js.map +1 -0
- package/dist/embeddings/vector-store.d.ts +35 -0
- package/dist/embeddings/vector-store.d.ts.map +1 -0
- package/dist/embeddings/vector-store.js +174 -0
- package/dist/embeddings/vector-store.js.map +1 -0
- package/dist/extraction-service.d.ts +33 -0
- package/dist/extraction-service.d.ts.map +1 -0
- package/dist/extraction-service.js +168 -0
- package/dist/extraction-service.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6498 -0
- package/dist/index.js.map +1 -0
- package/dist/manager.d.ts +62 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +377 -0
- package/dist/manager.js.map +1 -0
- package/dist/migration/auto-migrate.d.ts +20 -0
- package/dist/migration/auto-migrate.d.ts.map +1 -0
- package/dist/migration/auto-migrate.js +49 -0
- package/dist/migration/auto-migrate.js.map +1 -0
- package/dist/migration/json-to-vault.d.ts +10 -0
- package/dist/migration/json-to-vault.d.ts.map +1 -0
- package/dist/migration/json-to-vault.js +88 -0
- package/dist/migration/json-to-vault.js.map +1 -0
- package/dist/migration/vault-version.d.ts +4 -0
- package/dist/migration/vault-version.d.ts.map +1 -0
- package/dist/migration/vault-version.js +19 -0
- package/dist/migration/vault-version.js.map +1 -0
- package/dist/retrieval/cosine-ann.d.ts +13 -0
- package/dist/retrieval/cosine-ann.d.ts.map +1 -0
- package/dist/retrieval/cosine-ann.js +26 -0
- package/dist/retrieval/cosine-ann.js.map +1 -0
- package/dist/retrieval/spreading-activation.d.ts +12 -0
- package/dist/retrieval/spreading-activation.d.ts.map +1 -0
- package/dist/retrieval/spreading-activation.js +70 -0
- package/dist/retrieval/spreading-activation.js.map +1 -0
- package/dist/store.d.ts +38 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +192 -0
- package/dist/store.js.map +1 -0
- package/dist/vault/default-vault-dir.d.ts +17 -0
- package/dist/vault/default-vault-dir.d.ts.map +1 -0
- package/dist/vault/default-vault-dir.js +23 -0
- package/dist/vault/default-vault-dir.js.map +1 -0
- package/dist/vault/file-format.d.ts +44 -0
- package/dist/vault/file-format.d.ts.map +1 -0
- package/dist/vault/file-format.js +214 -0
- package/dist/vault/file-format.js.map +1 -0
- package/dist/vault/vault-index.d.ts +28 -0
- package/dist/vault/vault-index.d.ts.map +1 -0
- package/dist/vault/vault-index.js +98 -0
- package/dist/vault/vault-index.js.map +1 -0
- package/dist/vault/vault-store.d.ts +75 -0
- package/dist/vault/vault-store.d.ts.map +1 -0
- package/dist/vault/vault-store.js +369 -0
- package/dist/vault/vault-store.js.map +1 -0
- package/dist/vault-memory-provider.d.ts +53 -0
- package/dist/vault-memory-provider.d.ts.map +1 -0
- package/dist/vault-memory-provider.js +139 -0
- package/dist/vault-memory-provider.js.map +1 -0
- package/package.json +58 -0
- package/valora-plugin.json +10 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thrown when the wrapped {@link LLMProvider} does not implement the optional
|
|
3
|
+
* `embed?()` method. ADR-013 §4 mandates graceful degradation: callers should
|
|
4
|
+
* detect this error and fall back to the lexical recall path rather than fail
|
|
5
|
+
* the entire pipeline.
|
|
6
|
+
*/
|
|
7
|
+
export class EmbedderNotSupportedError extends Error {
|
|
8
|
+
constructor(providerName) {
|
|
9
|
+
super(`LLM provider '${providerName}' does not implement embed(); cannot generate embeddings.`);
|
|
10
|
+
this.name = 'EmbedderNotSupportedError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Adapter that exposes an {@link LLMProvider}'s optional `embed?()` method
|
|
15
|
+
* through the {@link EmbedderPort} contract used by the memory subsystem.
|
|
16
|
+
*
|
|
17
|
+
* Per ADR-013 §4 and CODE-QUALITY-GUIDELINES.md (Adapter Pattern, Appendix B),
|
|
18
|
+
* memory must reach embedders only via this port — never via direct LLM-SDK
|
|
19
|
+
* imports — so swapping providers (Ollama, OpenAI, Anthropic) is a one-line
|
|
20
|
+
* change in DI wiring.
|
|
21
|
+
*/
|
|
22
|
+
export class LlmProviderEmbedder {
|
|
23
|
+
provider;
|
|
24
|
+
constructor(provider) {
|
|
25
|
+
this.provider = provider;
|
|
26
|
+
}
|
|
27
|
+
async embed(req) {
|
|
28
|
+
if (!this.provider.embed) {
|
|
29
|
+
throw new EmbedderNotSupportedError(this.provider.name);
|
|
30
|
+
}
|
|
31
|
+
return this.provider.embed(req);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=llm-provider-embedder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-provider-embedder.js","sourceRoot":"","sources":["../../src/embeddings/llm-provider-embedder.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACnD,YAAY,YAAoB;QAC/B,KAAK,CAAC,iBAAiB,YAAY,2DAA2D,CAAC,CAAC;QAChG,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IACzC,CAAC;CACD;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,mBAAmB;IACF;IAA7B,YAA6B,QAAqB;QAArB,aAAQ,GAAR,QAAQ,CAAa;IAAG,CAAC;IAEtD,KAAK,CAAC,KAAK,CAAC,GAAqB;QAChC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC1B,MAAM,IAAI,yBAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;CACD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { LLMProviderContract as LLMProvider, MemoryRetentionConfig } from '@windagency/valora-plugin-api';
|
|
2
|
+
import type { EmbedderPort } from './embedder.port.js';
|
|
3
|
+
/**
|
|
4
|
+
* Lookup function the host injects so the bundled vault does not depend on
|
|
5
|
+
* the host's `llm/registry` directly. The host wires this to its real
|
|
6
|
+
* provider registry at boot via the bootstrap glue.
|
|
7
|
+
*/
|
|
8
|
+
export interface ProviderLookup {
|
|
9
|
+
createProvider(_name: string, _config: Record<string, unknown>): LLMProvider;
|
|
10
|
+
getAvailableProviders(): string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Resolve an {@link EmbedderPort} for the memory subsystem from the configured
|
|
14
|
+
* embedding provider. Returns `undefined` when:
|
|
15
|
+
* - Embeddings are not configured (`memory.embedding` absent).
|
|
16
|
+
* - No provider lookup is supplied.
|
|
17
|
+
* - The configured provider does not implement `embed?()`.
|
|
18
|
+
* - The provider registry cannot construct the provider.
|
|
19
|
+
*
|
|
20
|
+
* Semantic recall falls back gracefully to the lexical path in any of these
|
|
21
|
+
* cases, so this resolver is intentionally forgiving.
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveEmbedder(
|
|
24
|
+
memoryConfig: MemoryRetentionConfig | undefined,
|
|
25
|
+
providerLookup?: ProviderLookup
|
|
26
|
+
): Promise<EmbedderPort | undefined>;
|
|
27
|
+
//# sourceMappingURL=resolve-embedder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-embedder.d.ts","sourceRoot":"","sources":["../../src/embeddings/resolve-embedder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,IAAI,WAAW,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAI/G,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC9B,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC;IAC7E,qBAAqB,IAAI,MAAM,EAAE,CAAC;CAClC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC9B,YAAY,EAAE,qBAAqB,GAAG,SAAS,EAC/C,cAAc,CAAC,EAAE,cAAc,GAC7B,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAkBnC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { getLogger } from '@windagency/valora-runtime';
|
|
2
|
+
import { LlmProviderEmbedder } from './llm-provider-embedder.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve an {@link EmbedderPort} for the memory subsystem from the configured
|
|
5
|
+
* embedding provider. Returns `undefined` when:
|
|
6
|
+
* - Embeddings are not configured (`memory.embedding` absent).
|
|
7
|
+
* - No provider lookup is supplied.
|
|
8
|
+
* - The configured provider does not implement `embed?()`.
|
|
9
|
+
* - The provider registry cannot construct the provider.
|
|
10
|
+
*
|
|
11
|
+
* Semantic recall falls back gracefully to the lexical path in any of these
|
|
12
|
+
* cases, so this resolver is intentionally forgiving.
|
|
13
|
+
*/
|
|
14
|
+
export function resolveEmbedder(memoryConfig, providerLookup) {
|
|
15
|
+
const embeddingConfig = memoryConfig?.embedding;
|
|
16
|
+
if (!embeddingConfig) return Promise.resolve(undefined);
|
|
17
|
+
if (providerLookup === undefined) return Promise.resolve(undefined);
|
|
18
|
+
try {
|
|
19
|
+
const requested = embeddingConfig.provider;
|
|
20
|
+
const providerName = requested === 'auto' ? selectAutoProvider(providerLookup.getAvailableProviders()) : requested;
|
|
21
|
+
if (providerName === undefined) return Promise.resolve(undefined);
|
|
22
|
+
const provider = providerLookup.createProvider(providerName, {});
|
|
23
|
+
if (typeof provider.embed !== 'function') return Promise.resolve(undefined);
|
|
24
|
+
return Promise.resolve(new LlmProviderEmbedder(provider));
|
|
25
|
+
} catch (err) {
|
|
26
|
+
getLogger().debug(`Memory embedder unavailable, falling back to lexical recall: ${String(err)}`);
|
|
27
|
+
return Promise.resolve(undefined);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const AUTO_PREFERENCE = ['ollama', 'openai', 'anthropic', 'google'];
|
|
31
|
+
function selectAutoProvider(available) {
|
|
32
|
+
const lookup = new Set(available);
|
|
33
|
+
for (const candidate of AUTO_PREFERENCE) {
|
|
34
|
+
if (lookup.has(candidate)) return candidate;
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=resolve-embedder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-embedder.js","sourceRoot":"","sources":["../../src/embeddings/resolve-embedder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAIvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAYjE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAC9B,YAA+C,EAC/C,cAA+B;IAE/B,MAAM,eAAe,GAAG,YAAY,EAAE,SAAS,CAAC;IAChD,IAAI,CAAC,eAAe;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,IAAI,cAAc,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEpE,IAAI,CAAC;QACJ,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC;QAC3C,MAAM,YAAY,GAAG,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,cAAc,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnH,IAAI,YAAY,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAElE,MAAM,QAAQ,GAAgB,cAAc,CAAC,cAAc,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC9E,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,UAAU;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE5E,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,SAAS,EAAE,CAAC,KAAK,CAAC,gEAAgE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjG,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;AACF,CAAC;AAED,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AAEpE,SAAS,kBAAkB,CAAC,SAAmB;IAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAClC,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC7C,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface VectorStore {
|
|
2
|
+
append(id: string, vector: number[]): void;
|
|
3
|
+
compact(liveIds: Set<string>): void;
|
|
4
|
+
count(): number;
|
|
5
|
+
coverage(liveIds: Set<string>): number;
|
|
6
|
+
dim: number;
|
|
7
|
+
flush(): void;
|
|
8
|
+
has(id: string): boolean;
|
|
9
|
+
model: string;
|
|
10
|
+
read(id: string): Float32Array | null;
|
|
11
|
+
}
|
|
12
|
+
interface PersistedMeta {
|
|
13
|
+
dim: number;
|
|
14
|
+
model: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Read just the embedding model and dimension persisted on disk, without
|
|
18
|
+
* loading the binary vectors. Returns null when no index file exists yet.
|
|
19
|
+
*
|
|
20
|
+
* Callers use this to align with the on-disk model/dim before opening the
|
|
21
|
+
* store with `openVectorStore`, so they avoid the dim/model mismatch error.
|
|
22
|
+
*/
|
|
23
|
+
export declare function readVectorStoreMeta(dir: string): null | PersistedMeta;
|
|
24
|
+
/**
|
|
25
|
+
* Open (or create) a vector store in a directory.
|
|
26
|
+
*
|
|
27
|
+
* If an existing index is present and its persisted `model` or `dim` differ
|
|
28
|
+
* from the caller's arguments, this function throws — preventing corrupt
|
|
29
|
+
* embeddings from being silently mixed. Callers should use
|
|
30
|
+
* {@link readVectorStoreMeta} to align with on-disk values, or run
|
|
31
|
+
* `valora memory reembed` to rebuild with a new model.
|
|
32
|
+
*/
|
|
33
|
+
export declare function openVectorStore(dir: string, model: string, dim: number): VectorStore;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=vector-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-store.d.ts","sourceRoot":"","sources":["../../src/embeddings/vector-store.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC3B,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3C,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACpC,KAAK,IAAI,MAAM,CAAC;IAChB,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,IAAI,IAAI,CAAC;IACd,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAAC;CACtC;AAED,UAAU,aAAa;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACd;AA0BD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,aAAa,CAUrE;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CAIpF"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { atomicWriteBuffer, atomicWriteFile } from '../vault/file-format.js';
|
|
4
|
+
const BIN_FILENAME = 'embeddings.bin';
|
|
5
|
+
const INDEX_FILENAME = 'embeddings.index.json';
|
|
6
|
+
/**
|
|
7
|
+
* Read just the embedding model and dimension persisted on disk, without
|
|
8
|
+
* loading the binary vectors. Returns null when no index file exists yet.
|
|
9
|
+
*
|
|
10
|
+
* Callers use this to align with the on-disk model/dim before opening the
|
|
11
|
+
* store with `openVectorStore`, so they avoid the dim/model mismatch error.
|
|
12
|
+
*/
|
|
13
|
+
export function readVectorStoreMeta(dir) {
|
|
14
|
+
const indexPath = path.join(dir, INDEX_FILENAME);
|
|
15
|
+
if (!existsSync(indexPath)) return null;
|
|
16
|
+
try {
|
|
17
|
+
const raw = JSON.parse(readFileSync(indexPath, 'utf-8'));
|
|
18
|
+
if (typeof raw.dim !== 'number' || typeof raw.model !== 'string') return null;
|
|
19
|
+
return { dim: raw.dim, model: raw.model };
|
|
20
|
+
} catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Open (or create) a vector store in a directory.
|
|
26
|
+
*
|
|
27
|
+
* If an existing index is present and its persisted `model` or `dim` differ
|
|
28
|
+
* from the caller's arguments, this function throws — preventing corrupt
|
|
29
|
+
* embeddings from being silently mixed. Callers should use
|
|
30
|
+
* {@link readVectorStoreMeta} to align with on-disk values, or run
|
|
31
|
+
* `valora memory reembed` to rebuild with a new model.
|
|
32
|
+
*/
|
|
33
|
+
export function openVectorStore(dir, model, dim) {
|
|
34
|
+
mkdirSync(dir, { recursive: true });
|
|
35
|
+
const state = initializeState(dir, model, dim);
|
|
36
|
+
return buildStoreApi(state);
|
|
37
|
+
}
|
|
38
|
+
function appendVector(state, id, vector) {
|
|
39
|
+
if (vector.length !== state.dim) {
|
|
40
|
+
throw new Error(`Vector for id='${id}' has length ${vector.length}, expected dim ${state.dim}.`);
|
|
41
|
+
}
|
|
42
|
+
const f32 = new Float32Array(vector);
|
|
43
|
+
const chunk = Buffer.from(f32.buffer, f32.byteOffset, f32.byteLength);
|
|
44
|
+
// Defer concatenation: appending to an array is O(1); a single Buffer.concat
|
|
45
|
+
// at consolidation time replaces what would otherwise be O(N²) allocation
|
|
46
|
+
// and copy across N appends.
|
|
47
|
+
state.pendingChunks.push(chunk);
|
|
48
|
+
state.offsets.set(id, state.nextOffset);
|
|
49
|
+
state.nextOffset += state.bytesPerVector;
|
|
50
|
+
}
|
|
51
|
+
function buildStoreApi(state) {
|
|
52
|
+
return {
|
|
53
|
+
append(id, vector) {
|
|
54
|
+
appendVector(state, id, vector);
|
|
55
|
+
},
|
|
56
|
+
compact(liveIds) {
|
|
57
|
+
compactState(state, liveIds);
|
|
58
|
+
flushState(state);
|
|
59
|
+
},
|
|
60
|
+
count: () => state.offsets.size,
|
|
61
|
+
coverage(liveIds) {
|
|
62
|
+
if (liveIds.size === 0) return 0;
|
|
63
|
+
let hit = 0;
|
|
64
|
+
for (const id of liveIds) if (state.offsets.has(id)) hit++;
|
|
65
|
+
return hit / liveIds.size;
|
|
66
|
+
},
|
|
67
|
+
get dim() {
|
|
68
|
+
return state.dim;
|
|
69
|
+
},
|
|
70
|
+
flush: () => flushState(state),
|
|
71
|
+
has: (id) => state.offsets.has(id),
|
|
72
|
+
get model() {
|
|
73
|
+
return state.model;
|
|
74
|
+
},
|
|
75
|
+
read: (id) => readVector(state, id)
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function compactState(state, liveIds) {
|
|
79
|
+
consolidatePending(state);
|
|
80
|
+
const survivingChunks = [];
|
|
81
|
+
const newOffsets = new Map();
|
|
82
|
+
let newNext = 0;
|
|
83
|
+
for (const [id, offset] of state.offsets) {
|
|
84
|
+
if (!liveIds.has(id)) continue;
|
|
85
|
+
// subarray returns a view; allocate a fresh buffer so the new contiguous
|
|
86
|
+
// buffer does not alias the previous `state.buffer`.
|
|
87
|
+
const view = state.buffer.subarray(offset, offset + state.bytesPerVector);
|
|
88
|
+
const owned = Buffer.allocUnsafe(view.length);
|
|
89
|
+
view.copy(owned);
|
|
90
|
+
survivingChunks.push(owned);
|
|
91
|
+
newOffsets.set(id, newNext);
|
|
92
|
+
newNext += state.bytesPerVector;
|
|
93
|
+
}
|
|
94
|
+
// One concat, not N — the loop above does no allocation beyond per-vector copies.
|
|
95
|
+
state.buffer = survivingChunks.length === 0 ? Buffer.alloc(0) : Buffer.concat(survivingChunks);
|
|
96
|
+
state.offsets.clear();
|
|
97
|
+
for (const [id, off] of newOffsets) state.offsets.set(id, off);
|
|
98
|
+
state.nextOffset = newNext;
|
|
99
|
+
}
|
|
100
|
+
function consolidatePending(state) {
|
|
101
|
+
if (state.pendingChunks.length === 0) return;
|
|
102
|
+
state.buffer = Buffer.concat([state.buffer, ...state.pendingChunks]);
|
|
103
|
+
state.pendingChunks = [];
|
|
104
|
+
}
|
|
105
|
+
function flushState(state) {
|
|
106
|
+
consolidatePending(state);
|
|
107
|
+
mkdirSync(state.dir, { recursive: true });
|
|
108
|
+
atomicWriteBuffer(state.binPath, state.buffer);
|
|
109
|
+
const index = {
|
|
110
|
+
dim: state.dim,
|
|
111
|
+
entries: Object.fromEntries(state.offsets),
|
|
112
|
+
model: state.model
|
|
113
|
+
};
|
|
114
|
+
atomicWriteFile(state.indexPath, JSON.stringify(index, null, 2));
|
|
115
|
+
}
|
|
116
|
+
function initializeState(dir, model, dim) {
|
|
117
|
+
const binPath = path.join(dir, BIN_FILENAME);
|
|
118
|
+
const indexPath = path.join(dir, INDEX_FILENAME);
|
|
119
|
+
const persisted = readVectorStoreMeta(dir);
|
|
120
|
+
if (persisted !== null) {
|
|
121
|
+
if (persisted.model !== model || persisted.dim !== dim) {
|
|
122
|
+
throw new Error(
|
|
123
|
+
`Vector store at ${dir} was written with model='${persisted.model}' dim=${persisted.dim}, ` +
|
|
124
|
+
`but the caller requested model='${model}' dim=${dim}. ` +
|
|
125
|
+
`Run \`valora memory reembed\` to rebuild embeddings with the new model.`
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const offsets = loadOffsets(indexPath);
|
|
130
|
+
const buffer = loadBuffer(binPath);
|
|
131
|
+
return {
|
|
132
|
+
binPath,
|
|
133
|
+
buffer,
|
|
134
|
+
bytesPerVector: dim * Float32Array.BYTES_PER_ELEMENT,
|
|
135
|
+
dim,
|
|
136
|
+
dir,
|
|
137
|
+
indexPath,
|
|
138
|
+
model,
|
|
139
|
+
nextOffset: buffer.length,
|
|
140
|
+
offsets,
|
|
141
|
+
pendingChunks: []
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function loadBuffer(binPath) {
|
|
145
|
+
try {
|
|
146
|
+
return readFileSync(binPath);
|
|
147
|
+
} catch {
|
|
148
|
+
return Buffer.alloc(0);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function loadOffsets(indexPath) {
|
|
152
|
+
const offsets = new Map();
|
|
153
|
+
try {
|
|
154
|
+
const raw = JSON.parse(readFileSync(indexPath, 'utf-8'));
|
|
155
|
+
for (const [id, offset] of Object.entries(raw.entries)) {
|
|
156
|
+
offsets.set(id, offset);
|
|
157
|
+
}
|
|
158
|
+
} catch {
|
|
159
|
+
// no existing index — start empty
|
|
160
|
+
}
|
|
161
|
+
return offsets;
|
|
162
|
+
}
|
|
163
|
+
function readVector(state, id) {
|
|
164
|
+
const offset = state.offsets.get(id);
|
|
165
|
+
if (offset === undefined) return null;
|
|
166
|
+
consolidatePending(state);
|
|
167
|
+
// Copy bytes into a fresh ArrayBuffer so the returned Float32Array does not
|
|
168
|
+
// alias the internal buffer (which may be reallocated by future appends).
|
|
169
|
+
const slice = state.buffer.subarray(offset, offset + state.bytesPerVector);
|
|
170
|
+
const copy = Buffer.allocUnsafe(slice.length);
|
|
171
|
+
slice.copy(copy);
|
|
172
|
+
return new Float32Array(copy.buffer, copy.byteOffset, state.dim);
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=vector-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-store.js","sourceRoot":"","sources":["../../src/embeddings/vector-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Extraction Service.
|
|
3
|
+
*
|
|
4
|
+
* Extracts episodic memory entries from feedback pipeline stage outputs.
|
|
5
|
+
* Called automatically after the `feedback` command completes successfully.
|
|
6
|
+
*
|
|
7
|
+
* Confidence assignment rules:
|
|
8
|
+
* - Error/failure → 'observed' (directly witnessed)
|
|
9
|
+
* - User feedback (satisfaction, pain points) → 'verified' (human confirmed)
|
|
10
|
+
* - Performance/bottleneck → 'observed'
|
|
11
|
+
* - Auto-detected patterns (agent improvements, workflow optimisations) → 'inferred'
|
|
12
|
+
*/
|
|
13
|
+
import type { MemoryEntry } from '@windagency/valora-plugin-api';
|
|
14
|
+
import { MemoryManager } from './manager.js';
|
|
15
|
+
export declare class MemoryExtractionService {
|
|
16
|
+
private readonly manager;
|
|
17
|
+
constructor(manager?: MemoryManager);
|
|
18
|
+
extractFromFeedbackOutputs(
|
|
19
|
+
stageOutputs: Array<{
|
|
20
|
+
outputs: Record<string, unknown>;
|
|
21
|
+
success: boolean;
|
|
22
|
+
}>,
|
|
23
|
+
sessionId: string,
|
|
24
|
+
agentRole: string
|
|
25
|
+
): Promise<MemoryEntry[]>;
|
|
26
|
+
private extractBottlenecks;
|
|
27
|
+
private extractErrorPatterns;
|
|
28
|
+
private extractPatterns;
|
|
29
|
+
private extractUserFeedback;
|
|
30
|
+
}
|
|
31
|
+
export declare function getMemoryExtraction(): MemoryExtractionService;
|
|
32
|
+
export declare function resetMemoryExtraction(): void;
|
|
33
|
+
//# sourceMappingURL=extraction-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extraction-service.d.ts","sourceRoot":"","sources":["../src/extraction-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA4B7C,qBAAa,uBAAuB;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;gBAE5B,OAAO,CAAC,EAAE,aAAa;IAI7B,0BAA0B,CAC/B,YAAY,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,EAC3E,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,EAAE,CAAC;YAoBX,kBAAkB;YA8BlB,oBAAoB;YA8BpB,eAAe;YAuCf,mBAAmB;CA6CjC;AAqBD,wBAAgB,mBAAmB,IAAI,uBAAuB,CAG7D;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Extraction Service.
|
|
3
|
+
*
|
|
4
|
+
* Extracts episodic memory entries from feedback pipeline stage outputs.
|
|
5
|
+
* Called automatically after the `feedback` command completes successfully.
|
|
6
|
+
*
|
|
7
|
+
* Confidence assignment rules:
|
|
8
|
+
* - Error/failure → 'observed' (directly witnessed)
|
|
9
|
+
* - User feedback (satisfaction, pain points) → 'verified' (human confirmed)
|
|
10
|
+
* - Performance/bottleneck → 'observed'
|
|
11
|
+
* - Auto-detected patterns (agent improvements, workflow optimisations) → 'inferred'
|
|
12
|
+
*/
|
|
13
|
+
import { MemoryManager } from './manager.js';
|
|
14
|
+
import { runAutoMigrationIfNeeded } from './migration/auto-migrate.js';
|
|
15
|
+
import { getDefaultVaultDir, getLegacyJsonDir } from './vault/default-vault-dir.js';
|
|
16
|
+
import { VaultStore } from './vault/vault-store.js';
|
|
17
|
+
export class MemoryExtractionService {
|
|
18
|
+
manager;
|
|
19
|
+
constructor(manager) {
|
|
20
|
+
this.manager = manager ?? new MemoryManager(buildDefaultVaultStore());
|
|
21
|
+
}
|
|
22
|
+
async extractFromFeedbackOutputs(stageOutputs, sessionId, agentRole) {
|
|
23
|
+
const merged = stageOutputs.filter((s) => s.success).reduce((acc, s) => ({ ...acc, ...s.outputs }), {});
|
|
24
|
+
// Extract relatedPaths from files_changed — normalise both the flat string[]
|
|
25
|
+
// and the object shape { created, modified, deleted, renamed } that the LLM produces.
|
|
26
|
+
const relatedPaths = normalisedFilesChanged(merged.files_changed);
|
|
27
|
+
// Call the four private extraction methods and collect all entries
|
|
28
|
+
const [errorEntries, feedbackEntries, bottleneckEntries, patternEntries] = await Promise.all([
|
|
29
|
+
this.extractErrorPatterns(merged, sessionId, agentRole, relatedPaths),
|
|
30
|
+
this.extractUserFeedback(merged, sessionId, agentRole, relatedPaths),
|
|
31
|
+
this.extractBottlenecks(merged, sessionId, agentRole, relatedPaths),
|
|
32
|
+
this.extractPatterns(merged, sessionId, agentRole, relatedPaths)
|
|
33
|
+
]);
|
|
34
|
+
return [...errorEntries, ...feedbackEntries, ...bottleneckEntries, ...patternEntries];
|
|
35
|
+
}
|
|
36
|
+
async extractBottlenecks(outputs, sessionId, agentRole, relatedPaths) {
|
|
37
|
+
if (!Array.isArray(outputs.bottlenecks_identified) || outputs.bottlenecks_identified.length === 0) {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
const bottlenecks = outputs.bottlenecks_identified.slice(0, 3);
|
|
41
|
+
const entries = [];
|
|
42
|
+
for (const bottleneck of bottlenecks) {
|
|
43
|
+
const entry = await this.manager.create('episodic', {
|
|
44
|
+
agentRole,
|
|
45
|
+
confidence: 'observed',
|
|
46
|
+
content: `Performance bottleneck: ${JSON.stringify(bottleneck)}`,
|
|
47
|
+
isError: false,
|
|
48
|
+
relatedPaths,
|
|
49
|
+
sessionId,
|
|
50
|
+
source: { command: 'feedback', label: 'post-session-extraction' },
|
|
51
|
+
tags: ['performance', 'bottleneck', agentRole]
|
|
52
|
+
});
|
|
53
|
+
entries.push(entry);
|
|
54
|
+
}
|
|
55
|
+
return entries;
|
|
56
|
+
}
|
|
57
|
+
async extractErrorPatterns(outputs, sessionId, agentRole, relatedPaths) {
|
|
58
|
+
if (!Array.isArray(outputs.errors_encountered) || outputs.errors_encountered.length === 0) {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
const errors = outputs.errors_encountered.slice(0, 5);
|
|
62
|
+
const entries = [];
|
|
63
|
+
for (const error of errors) {
|
|
64
|
+
const entry = await this.manager.create('episodic', {
|
|
65
|
+
agentRole,
|
|
66
|
+
confidence: 'observed',
|
|
67
|
+
content: `Error during ${agentRole}: ${JSON.stringify(error)}`,
|
|
68
|
+
isError: true,
|
|
69
|
+
relatedPaths,
|
|
70
|
+
sessionId,
|
|
71
|
+
source: { command: 'feedback', label: 'post-session-extraction' },
|
|
72
|
+
tags: ['error', agentRole, 'feedback']
|
|
73
|
+
});
|
|
74
|
+
entries.push(entry);
|
|
75
|
+
}
|
|
76
|
+
return entries;
|
|
77
|
+
}
|
|
78
|
+
async extractPatterns(outputs, sessionId, agentRole, relatedPaths) {
|
|
79
|
+
const entries = [];
|
|
80
|
+
if (Array.isArray(outputs.agent_improvements) && outputs.agent_improvements.length > 0) {
|
|
81
|
+
const entry = await this.manager.create('episodic', {
|
|
82
|
+
agentRole,
|
|
83
|
+
confidence: 'inferred',
|
|
84
|
+
content: `Agent improvement opportunity: ${JSON.stringify(outputs.agent_improvements)}`,
|
|
85
|
+
isError: false,
|
|
86
|
+
relatedPaths,
|
|
87
|
+
sessionId,
|
|
88
|
+
source: { command: 'feedback', label: 'post-session-extraction' },
|
|
89
|
+
tags: ['improvement', 'agent', agentRole]
|
|
90
|
+
});
|
|
91
|
+
entries.push(entry);
|
|
92
|
+
}
|
|
93
|
+
if (Array.isArray(outputs.workflow_optimizations) && outputs.workflow_optimizations.length > 0) {
|
|
94
|
+
const entry = await this.manager.create('episodic', {
|
|
95
|
+
agentRole,
|
|
96
|
+
confidence: 'inferred',
|
|
97
|
+
content: `Workflow optimization: ${JSON.stringify(outputs.workflow_optimizations)}`,
|
|
98
|
+
isError: false,
|
|
99
|
+
relatedPaths,
|
|
100
|
+
sessionId,
|
|
101
|
+
source: { command: 'feedback', label: 'post-session-extraction' },
|
|
102
|
+
tags: ['optimization', 'workflow']
|
|
103
|
+
});
|
|
104
|
+
entries.push(entry);
|
|
105
|
+
}
|
|
106
|
+
return entries;
|
|
107
|
+
}
|
|
108
|
+
async extractUserFeedback(outputs, sessionId, agentRole, relatedPaths) {
|
|
109
|
+
const entries = [];
|
|
110
|
+
const satisfactionScore = outputs.satisfaction_score;
|
|
111
|
+
const successHighlights = outputs.success_highlights;
|
|
112
|
+
const painPoints = outputs.pain_points;
|
|
113
|
+
if (
|
|
114
|
+
(satisfactionScore !== undefined && satisfactionScore >= 8) ||
|
|
115
|
+
(Array.isArray(successHighlights) && successHighlights.length > 0)
|
|
116
|
+
) {
|
|
117
|
+
const entry = await this.manager.create('episodic', {
|
|
118
|
+
agentRole,
|
|
119
|
+
confidence: 'verified',
|
|
120
|
+
content: `Session rated ${satisfactionScore}/10. ${outputs.feedback_comments ?? ''}`,
|
|
121
|
+
isError: false,
|
|
122
|
+
relatedPaths,
|
|
123
|
+
sessionId,
|
|
124
|
+
source: { command: 'feedback', label: 'post-session-extraction' },
|
|
125
|
+
tags: ['user-feedback', 'satisfaction', agentRole]
|
|
126
|
+
});
|
|
127
|
+
entries.push(entry);
|
|
128
|
+
}
|
|
129
|
+
if (Array.isArray(painPoints) && painPoints.length > 0) {
|
|
130
|
+
const entry = await this.manager.create('episodic', {
|
|
131
|
+
agentRole,
|
|
132
|
+
confidence: 'observed',
|
|
133
|
+
content: `Pain points: ${JSON.stringify(painPoints)}`,
|
|
134
|
+
isError: false,
|
|
135
|
+
relatedPaths,
|
|
136
|
+
sessionId,
|
|
137
|
+
source: { command: 'feedback', label: 'post-session-extraction' },
|
|
138
|
+
tags: ['pain-point', agentRole, 'feedback']
|
|
139
|
+
});
|
|
140
|
+
entries.push(entry);
|
|
141
|
+
}
|
|
142
|
+
return entries;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function buildDefaultVaultStore() {
|
|
146
|
+
const vaultDir = getDefaultVaultDir();
|
|
147
|
+
runAutoMigrationIfNeeded(getLegacyJsonDir(), vaultDir);
|
|
148
|
+
return new VaultStore(vaultDir);
|
|
149
|
+
}
|
|
150
|
+
function normalisedFilesChanged(raw) {
|
|
151
|
+
if (!raw) return [];
|
|
152
|
+
if (Array.isArray(raw)) return raw.map((f) => f.trim()).filter((f) => f.length > 0);
|
|
153
|
+
if (typeof raw === 'object') {
|
|
154
|
+
return [...(raw.created ?? []), ...(raw.modified ?? []), ...(raw.deleted ?? []), ...(raw.renamed ?? [])]
|
|
155
|
+
.map((f) => f.trim())
|
|
156
|
+
.filter((f) => f.length > 0);
|
|
157
|
+
}
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
let extractionInstance = null;
|
|
161
|
+
export function getMemoryExtraction() {
|
|
162
|
+
extractionInstance ??= new MemoryExtractionService();
|
|
163
|
+
return extractionInstance;
|
|
164
|
+
}
|
|
165
|
+
export function resetMemoryExtraction() {
|
|
166
|
+
extractionInstance = null;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=extraction-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extraction-service.js","sourceRoot":"","sources":["../src/extraction-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAyBpD,MAAM,OAAO,uBAAuB;IAClB,OAAO,CAAgB;IAExC,YAAY,OAAuB;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,aAAa,CAAC,sBAAsB,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,0BAA0B,CAC/B,YAA2E,EAC3E,SAAiB,EACjB,SAAiB;QAEjB,MAAM,MAAM,GAAoB,YAAY;aAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;aACxB,MAAM,CAAkB,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAEtE,6EAA6E;QAC7E,sFAAsF;QACtF,MAAM,YAAY,GAAa,sBAAsB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAE5E,mEAAmE;QACnE,MAAM,CAAC,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC5F,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC;YACrE,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC;YACpE,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC;YACnE,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC;SAChE,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,YAAY,EAAE,GAAG,eAAe,EAAE,GAAG,iBAAiB,EAAE,GAAG,cAAc,CAAC,CAAC;IACvF,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC/B,OAAwB,EACxB,SAAiB,EACjB,SAAiB,EACjB,YAAsB;QAEtB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,IAAI,OAAO,CAAC,sBAAsB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnG,OAAO,EAAE,CAAC;QACX,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE;gBACnD,SAAS;gBACT,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,2BAA2B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;gBAChE,OAAO,EAAE,KAAK;gBACd,YAAY;gBACZ,SAAS;gBACT,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,yBAAyB,EAAE;gBACjE,IAAI,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,SAAS,CAAC;aAC9C,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,oBAAoB,CACjC,OAAwB,EACxB,SAAiB,EACjB,SAAiB,EACjB,YAAsB;QAEtB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,OAAO,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3F,OAAO,EAAE,CAAC;QACX,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE;gBACnD,SAAS;gBACT,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,gBAAgB,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;gBAC9D,OAAO,EAAE,IAAI;gBACb,YAAY;gBACZ,SAAS;gBACT,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,yBAAyB,EAAE;gBACjE,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC;aACtC,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,eAAe,CAC5B,OAAwB,EACxB,SAAiB,EACjB,SAAiB,EACjB,YAAsB;QAEtB,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,OAAO,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE;gBACnD,SAAS;gBACT,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,kCAAkC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE;gBACvF,OAAO,EAAE,KAAK;gBACd,YAAY;gBACZ,SAAS;gBACT,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,yBAAyB,EAAE;gBACjE,IAAI,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,SAAS,CAAC;aACzC,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,IAAI,OAAO,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChG,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE;gBACnD,SAAS;gBACT,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,0BAA0B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,sBAAsB,CAAC,EAAE;gBACnF,OAAO,EAAE,KAAK;gBACd,YAAY;gBACZ,SAAS;gBACT,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,yBAAyB,EAAE;gBACjE,IAAI,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC;aAClC,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAChC,OAAwB,EACxB,SAAiB,EACjB,SAAiB,EACjB,YAAsB;QAEtB,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,MAAM,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;QACrD,MAAM,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;QACrD,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;QAEvC,IACC,CAAC,iBAAiB,KAAK,SAAS,IAAI,iBAAiB,IAAI,CAAC,CAAC;YAC3D,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,EACjE,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE;gBACnD,SAAS;gBACT,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,iBAAiB,iBAAiB,QAAQ,OAAO,CAAC,iBAAiB,IAAI,EAAE,EAAE;gBACpF,OAAO,EAAE,KAAK;gBACd,YAAY;gBACZ,SAAS;gBACT,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,yBAAyB,EAAE;gBACjE,IAAI,EAAE,CAAC,eAAe,EAAE,cAAc,EAAE,SAAS,CAAC;aAClD,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE;gBACnD,SAAS;gBACT,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,gBAAgB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;gBACrD,OAAO,EAAE,KAAK;gBACd,YAAY;gBACZ,SAAS;gBACT,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,yBAAyB,EAAE;gBACjE,IAAI,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC;aAC3C,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;CACD;AAED,SAAS,sBAAsB;IAC9B,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,wBAAwB,CAAC,gBAAgB,EAAE,EAAE,QAAQ,CAAC,CAAC;IACvD,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAqC;IACpE,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpF,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;aACtG,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC;AAED,IAAI,kBAAkB,GAAmC,IAAI,CAAC;AAE9D,MAAM,UAAU,mBAAmB;IAClC,kBAAkB,KAAK,IAAI,uBAAuB,EAAE,CAAC;IACrD,OAAO,kBAAkB,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,qBAAqB;IACpC,kBAAkB,GAAG,IAAI,CAAC;AAC3B,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundled vault memory backend for Valora.
|
|
3
|
+
*
|
|
4
|
+
* Registers `'vault'` as a memory provider via `api.memory.register(...)` —
|
|
5
|
+
* the same API any third-party memory plugin would use. The host bootstraps
|
|
6
|
+
* this package at startup; user plugins may override via
|
|
7
|
+
* `manifest.overrides: ['vault']`.
|
|
8
|
+
*/
|
|
9
|
+
import type { MemoryProviderDescriptor, PluginAPI } from '@windagency/valora-plugin-api';
|
|
10
|
+
export declare const VAULT_DESCRIPTOR: MemoryProviderDescriptor;
|
|
11
|
+
export declare function register(api: PluginAPI): void;
|
|
12
|
+
export { parseVaultPluginConfig, VAULT_PLUGIN_CONFIG_SCHEMA, type VaultPluginConfig } from './config-schema.js';
|
|
13
|
+
export {
|
|
14
|
+
type ConsolidationCompleteListener,
|
|
15
|
+
type ConsolidationServiceContext,
|
|
16
|
+
getMemoryConsolidation,
|
|
17
|
+
MemoryConsolidationService,
|
|
18
|
+
resetMemoryConsolidation
|
|
19
|
+
} from './consolidation-service.js';
|
|
20
|
+
export { centroidSummary, cosineClusters } from './consolidation/cluster.js';
|
|
21
|
+
export { computeEffectiveHalfLife, computeStrength, shouldPrune } from './decay.js';
|
|
22
|
+
export type { EmbedderPort } from './embeddings/embedder.port.js';
|
|
23
|
+
export { EmbedderNotSupportedError, LlmProviderEmbedder } from './embeddings/llm-provider-embedder.js';
|
|
24
|
+
export { type ProviderLookup, resolveEmbedder } from './embeddings/resolve-embedder.js';
|
|
25
|
+
export { openVectorStore, readVectorStoreMeta, type VectorStore } from './embeddings/vector-store.js';
|
|
26
|
+
export { getMemoryExtraction, MemoryExtractionService, resetMemoryExtraction } from './extraction-service.js';
|
|
27
|
+
export { MemoryManager } from './manager.js';
|
|
28
|
+
export { runAutoMigrationIfNeeded } from './migration/auto-migrate.js';
|
|
29
|
+
export { migrateJsonToVault, type MigrationOptions, type MigrationResult } from './migration/json-to-vault.js';
|
|
30
|
+
export { readVaultVersion, VAULT_SCHEMA_VERSION, writeVaultVersion } from './migration/vault-version.js';
|
|
31
|
+
export { VaultMemoryProvider } from './vault-memory-provider.js';
|
|
32
|
+
/** @deprecated retained for migration paths only — production code uses VaultStore. */
|
|
33
|
+
export { MemoryStore } from './store.js';
|
|
34
|
+
export { getDefaultVaultDir, getLegacyJsonDir } from './vault/default-vault-dir.js';
|
|
35
|
+
export {
|
|
36
|
+
computeContentHash,
|
|
37
|
+
type ParsedMemoryFile,
|
|
38
|
+
parseMemoryFile,
|
|
39
|
+
serialiseMemoryFile
|
|
40
|
+
} from './vault/file-format.js';
|
|
41
|
+
export { openVaultStore, type VaultStats, VaultStore } from './vault/vault-store.js';
|
|
42
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAIzF,eAAO,MAAM,gBAAgB,EAAE,wBAI9B,CAAC;AAEF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAE7C;AAKD,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEhH,OAAO,EACN,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,EAChC,sBAAsB,EACtB,0BAA0B,EAC1B,wBAAwB,EACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACpF,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AACvG,OAAO,EAAE,KAAK,cAAc,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACtG,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC9G,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/G,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEzG,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,uFAAuF;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,EACN,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,eAAe,EACf,mBAAmB,EACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,KAAK,UAAU,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC"}
|