agentfootprint 8.7.0 → 8.9.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.
- package/AGENTS.md +12 -4
- package/CLAUDE.md +7 -3
- package/ai-instructions/claude-code/SKILL.md +1 -1
- package/ai-instructions/setup.sh +0 -0
- package/bin/agentfootprint-lint-tools.mjs +0 -0
- package/dist/adapters/memory/sqliteVector.js +875 -0
- package/dist/adapters/memory/sqliteVector.js.map +1 -0
- package/dist/core/Agent.js +6 -0
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/agent/buildAgentChart.js +12 -1
- package/dist/core/agent/buildAgentChart.js.map +1 -1
- package/dist/core/agent/buildDynamicAgentChart.js +12 -1
- package/dist/core/agent/buildDynamicAgentChart.js.map +1 -1
- package/dist/core/agent/memoryRecallInjections.js +100 -10
- package/dist/core/agent/memoryRecallInjections.js.map +1 -1
- package/dist/core/agent/stages/deliver.js.map +1 -1
- package/dist/core/slots/buildSystemPromptSlot.js +10 -0
- package/dist/core/slots/buildSystemPromptSlot.js.map +1 -1
- package/dist/core/slots/helpers.js +12 -10
- package/dist/core/slots/helpers.js.map +1 -1
- package/dist/embedders/index.js +11 -0
- package/dist/embedders/index.js.map +1 -1
- package/dist/esm/adapters/memory/sqliteVector.d.ts +251 -0
- package/dist/esm/adapters/memory/sqliteVector.js +869 -0
- package/dist/esm/adapters/memory/sqliteVector.js.map +1 -0
- package/dist/esm/core/Agent.js +6 -0
- package/dist/esm/core/Agent.js.map +1 -1
- package/dist/esm/core/agent/buildAgentChart.js +13 -2
- package/dist/esm/core/agent/buildAgentChart.js.map +1 -1
- package/dist/esm/core/agent/buildDynamicAgentChart.js +13 -2
- package/dist/esm/core/agent/buildDynamicAgentChart.js.map +1 -1
- package/dist/esm/core/agent/memoryRecallInjections.d.ts +13 -3
- package/dist/esm/core/agent/memoryRecallInjections.js +101 -11
- package/dist/esm/core/agent/memoryRecallInjections.js.map +1 -1
- package/dist/esm/core/agent/stages/deliver.d.ts +6 -3
- package/dist/esm/core/agent/stages/deliver.js.map +1 -1
- package/dist/esm/core/slots/buildSystemPromptSlot.js +10 -0
- package/dist/esm/core/slots/buildSystemPromptSlot.js.map +1 -1
- package/dist/esm/core/slots/helpers.d.ts +11 -2
- package/dist/esm/core/slots/helpers.js +11 -9
- package/dist/esm/core/slots/helpers.js.map +1 -1
- package/dist/esm/embedders/index.js +11 -0
- package/dist/esm/embedders/index.js.map +1 -1
- package/dist/esm/events/payloads.d.ts +63 -0
- package/dist/esm/events/registry.d.ts +3 -1
- package/dist/esm/events/registry.js +2 -0
- package/dist/esm/events/registry.js.map +1 -1
- package/dist/esm/hosting/sqliteSessions.d.ts +7 -13
- package/dist/esm/hosting/sqliteSessions.js +8 -25
- package/dist/esm/hosting/sqliteSessions.js.map +1 -1
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.js +6 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/fnv1a.d.ts +16 -0
- package/dist/esm/lib/fnv1a.js +24 -0
- package/dist/esm/lib/fnv1a.js.map +1 -0
- package/dist/esm/lib/injection-engine/types.d.ts +17 -0
- package/dist/esm/lib/injection-engine/types.js.map +1 -1
- package/dist/esm/lib/rag/defineRAG.d.ts +126 -26
- package/dist/esm/lib/rag/defineRAG.js +112 -25
- package/dist/esm/lib/rag/defineRAG.js.map +1 -1
- package/dist/esm/lib/rag/index.d.ts +1 -1
- package/dist/esm/lib/rag/index.js +1 -1
- package/dist/esm/lib/rag/index.js.map +1 -1
- package/dist/esm/lib/rag/indexDocuments.d.ts +26 -4
- package/dist/esm/lib/rag/indexDocuments.js +12 -1
- package/dist/esm/lib/rag/indexDocuments.js.map +1 -1
- package/dist/esm/lib/sqliteUnavailable.d.ts +55 -0
- package/dist/esm/lib/sqliteUnavailable.js +61 -0
- package/dist/esm/lib/sqliteUnavailable.js.map +1 -0
- package/dist/esm/memory/define.js +38 -2
- package/dist/esm/memory/define.js.map +1 -1
- package/dist/esm/memory/define.types.d.ts +93 -1
- package/dist/esm/memory/define.types.js +18 -0
- package/dist/esm/memory/define.types.js.map +1 -1
- package/dist/esm/memory/embedding/embedMessages.js +16 -0
- package/dist/esm/memory/embedding/embedMessages.js.map +1 -1
- package/dist/esm/memory/embedding/emitEmbedding.d.ts +38 -0
- package/dist/esm/memory/embedding/emitEmbedding.js +15 -0
- package/dist/esm/memory/embedding/emitEmbedding.js.map +1 -0
- package/dist/esm/memory/embedding/loadRelevant.d.ts +49 -15
- package/dist/esm/memory/embedding/loadRelevant.js +150 -7
- package/dist/esm/memory/embedding/loadRelevant.js.map +1 -1
- package/dist/esm/memory/embedding/mockEmbedder.js +4 -0
- package/dist/esm/memory/embedding/mockEmbedder.js.map +1 -1
- package/dist/esm/memory/embedding/types.d.ts +24 -0
- package/dist/esm/memory/index.d.ts +2 -1
- package/dist/esm/memory/index.js +2 -1
- package/dist/esm/memory/index.js.map +1 -1
- package/dist/esm/memory/pipeline/semantic.d.ts +15 -0
- package/dist/esm/memory/pipeline/semantic.js +3 -1
- package/dist/esm/memory/pipeline/semantic.js.map +1 -1
- package/dist/esm/memory/retrieval/index.d.ts +10 -0
- package/dist/esm/memory/retrieval/index.js +3 -0
- package/dist/esm/memory/retrieval/index.js.map +1 -0
- package/dist/esm/memory/retrieval/provenance.d.ts +43 -0
- package/dist/esm/memory/retrieval/provenance.js +60 -0
- package/dist/esm/memory/retrieval/provenance.js.map +1 -0
- package/dist/esm/memory/retrieval/topK.d.ts +67 -0
- package/dist/esm/memory/retrieval/topK.js +53 -0
- package/dist/esm/memory/retrieval/topK.js.map +1 -0
- package/dist/esm/memory/retrieval/types.d.ts +189 -0
- package/dist/esm/memory/retrieval/types.js +2 -0
- package/dist/esm/memory/retrieval/types.js.map +1 -0
- package/dist/esm/memory/stages/formatDefault.d.ts +52 -26
- package/dist/esm/memory/stages/formatDefault.js +118 -28
- package/dist/esm/memory/stages/formatDefault.js.map +1 -1
- package/dist/esm/memory/stages/pickByBudget.js +53 -3
- package/dist/esm/memory/stages/pickByBudget.js.map +1 -1
- package/dist/esm/memory/stages/types.d.ts +15 -0
- package/dist/esm/memory/wire/mountMemoryPipeline.d.ts +25 -0
- package/dist/esm/memory/wire/mountMemoryPipeline.js +11 -2
- package/dist/esm/memory/wire/mountMemoryPipeline.js.map +1 -1
- package/dist/esm/memory-providers.d.ts +2 -0
- package/dist/esm/memory-providers.js +8 -0
- package/dist/esm/memory-providers.js.map +1 -1
- package/dist/esm/observe.d.ts +2 -0
- package/dist/esm/observe.js +2 -0
- package/dist/esm/observe.js.map +1 -1
- package/dist/esm/recorders/core/EmbeddingRecorder.d.ts +19 -0
- package/dist/esm/recorders/core/EmbeddingRecorder.js +24 -0
- package/dist/esm/recorders/core/EmbeddingRecorder.js.map +1 -0
- package/dist/events/registry.js +2 -0
- package/dist/events/registry.js.map +1 -1
- package/dist/hosting/sqliteSessions.js +10 -27
- package/dist/hosting/sqliteSessions.js.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/fnv1a.js +28 -0
- package/dist/lib/fnv1a.js.map +1 -0
- package/dist/lib/injection-engine/types.js.map +1 -1
- package/dist/lib/rag/defineRAG.js +113 -26
- package/dist/lib/rag/defineRAG.js.map +1 -1
- package/dist/lib/rag/index.js +2 -1
- package/dist/lib/rag/index.js.map +1 -1
- package/dist/lib/rag/indexDocuments.js +12 -1
- package/dist/lib/rag/indexDocuments.js.map +1 -1
- package/dist/lib/sqliteUnavailable.js +65 -0
- package/dist/lib/sqliteUnavailable.js.map +1 -0
- package/dist/memory/define.js +38 -2
- package/dist/memory/define.js.map +1 -1
- package/dist/memory/define.types.js +21 -1
- package/dist/memory/define.types.js.map +1 -1
- package/dist/memory/embedding/embedMessages.js +16 -0
- package/dist/memory/embedding/embedMessages.js.map +1 -1
- package/dist/memory/embedding/emitEmbedding.js +19 -0
- package/dist/memory/embedding/emitEmbedding.js.map +1 -0
- package/dist/memory/embedding/loadRelevant.js +152 -8
- package/dist/memory/embedding/loadRelevant.js.map +1 -1
- package/dist/memory/embedding/mockEmbedder.js +4 -0
- package/dist/memory/embedding/mockEmbedder.js.map +1 -1
- package/dist/memory/index.js +5 -1
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/pipeline/semantic.js +2 -0
- package/dist/memory/pipeline/semantic.js.map +1 -1
- package/dist/memory/retrieval/index.js +9 -0
- package/dist/memory/retrieval/index.js.map +1 -0
- package/dist/memory/retrieval/provenance.js +65 -0
- package/dist/memory/retrieval/provenance.js.map +1 -0
- package/dist/memory/retrieval/topK.js +57 -0
- package/dist/memory/retrieval/topK.js.map +1 -0
- package/dist/memory/retrieval/types.js +3 -0
- package/dist/memory/retrieval/types.js.map +1 -0
- package/dist/memory/stages/formatDefault.js +118 -28
- package/dist/memory/stages/formatDefault.js.map +1 -1
- package/dist/memory/stages/pickByBudget.js +53 -3
- package/dist/memory/stages/pickByBudget.js.map +1 -1
- package/dist/memory/wire/mountMemoryPipeline.js +11 -2
- package/dist/memory/wire/mountMemoryPipeline.js.map +1 -1
- package/dist/memory-providers.js +13 -1
- package/dist/memory-providers.js.map +1 -1
- package/dist/observe.js +4 -1
- package/dist/observe.js.map +1 -1
- package/dist/recorders/core/EmbeddingRecorder.js +28 -0
- package/dist/recorders/core/EmbeddingRecorder.js.map +1 -0
- package/dist/types/adapters/memory/sqliteVector.d.ts +252 -0
- package/dist/types/adapters/memory/sqliteVector.d.ts.map +1 -0
- package/dist/types/core/Agent.d.ts.map +1 -1
- package/dist/types/core/agent/buildAgentChart.d.ts.map +1 -1
- package/dist/types/core/agent/buildDynamicAgentChart.d.ts.map +1 -1
- package/dist/types/core/agent/memoryRecallInjections.d.ts +13 -3
- package/dist/types/core/agent/memoryRecallInjections.d.ts.map +1 -1
- package/dist/types/core/agent/stages/deliver.d.ts +6 -3
- package/dist/types/core/agent/stages/deliver.d.ts.map +1 -1
- package/dist/types/core/slots/buildSystemPromptSlot.d.ts.map +1 -1
- package/dist/types/core/slots/helpers.d.ts +11 -2
- package/dist/types/core/slots/helpers.d.ts.map +1 -1
- package/dist/types/embedders/index.d.ts.map +1 -1
- package/dist/types/events/payloads.d.ts +63 -0
- package/dist/types/events/payloads.d.ts.map +1 -1
- package/dist/types/events/registry.d.ts +3 -1
- package/dist/types/events/registry.d.ts.map +1 -1
- package/dist/types/hosting/sqliteSessions.d.ts +7 -13
- package/dist/types/hosting/sqliteSessions.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lib/fnv1a.d.ts +17 -0
- package/dist/types/lib/fnv1a.d.ts.map +1 -0
- package/dist/types/lib/injection-engine/types.d.ts +17 -0
- package/dist/types/lib/injection-engine/types.d.ts.map +1 -1
- package/dist/types/lib/rag/defineRAG.d.ts +126 -26
- package/dist/types/lib/rag/defineRAG.d.ts.map +1 -1
- package/dist/types/lib/rag/index.d.ts +1 -1
- package/dist/types/lib/rag/index.d.ts.map +1 -1
- package/dist/types/lib/rag/indexDocuments.d.ts +26 -4
- package/dist/types/lib/rag/indexDocuments.d.ts.map +1 -1
- package/dist/types/lib/sqliteUnavailable.d.ts +56 -0
- package/dist/types/lib/sqliteUnavailable.d.ts.map +1 -0
- package/dist/types/memory/define.d.ts.map +1 -1
- package/dist/types/memory/define.types.d.ts +93 -1
- package/dist/types/memory/define.types.d.ts.map +1 -1
- package/dist/types/memory/embedding/embedMessages.d.ts.map +1 -1
- package/dist/types/memory/embedding/emitEmbedding.d.ts +39 -0
- package/dist/types/memory/embedding/emitEmbedding.d.ts.map +1 -0
- package/dist/types/memory/embedding/loadRelevant.d.ts +49 -15
- package/dist/types/memory/embedding/loadRelevant.d.ts.map +1 -1
- package/dist/types/memory/embedding/mockEmbedder.d.ts.map +1 -1
- package/dist/types/memory/embedding/types.d.ts +24 -0
- package/dist/types/memory/embedding/types.d.ts.map +1 -1
- package/dist/types/memory/index.d.ts +2 -1
- package/dist/types/memory/index.d.ts.map +1 -1
- package/dist/types/memory/pipeline/semantic.d.ts +15 -0
- package/dist/types/memory/pipeline/semantic.d.ts.map +1 -1
- package/dist/types/memory/retrieval/index.d.ts +11 -0
- package/dist/types/memory/retrieval/index.d.ts.map +1 -0
- package/dist/types/memory/retrieval/provenance.d.ts +44 -0
- package/dist/types/memory/retrieval/provenance.d.ts.map +1 -0
- package/dist/types/memory/retrieval/topK.d.ts +68 -0
- package/dist/types/memory/retrieval/topK.d.ts.map +1 -0
- package/dist/types/memory/retrieval/types.d.ts +190 -0
- package/dist/types/memory/retrieval/types.d.ts.map +1 -0
- package/dist/types/memory/stages/formatDefault.d.ts +52 -26
- package/dist/types/memory/stages/formatDefault.d.ts.map +1 -1
- package/dist/types/memory/stages/pickByBudget.d.ts.map +1 -1
- package/dist/types/memory/stages/types.d.ts +15 -0
- package/dist/types/memory/stages/types.d.ts.map +1 -1
- package/dist/types/memory/wire/mountMemoryPipeline.d.ts +25 -0
- package/dist/types/memory/wire/mountMemoryPipeline.d.ts.map +1 -1
- package/dist/types/memory-providers.d.ts +2 -0
- package/dist/types/memory-providers.d.ts.map +1 -1
- package/dist/types/observe.d.ts +2 -0
- package/dist/types/observe.d.ts.map +1 -1
- package/dist/types/recorders/core/EmbeddingRecorder.d.ts +20 -0
- package/dist/types/recorders/core/EmbeddingRecorder.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -59,10 +59,15 @@ export interface IndexDocumentsOptions {
|
|
|
59
59
|
*/
|
|
60
60
|
readonly identity?: MemoryIdentity;
|
|
61
61
|
/**
|
|
62
|
-
* Stable id of the embedder. Stored on each entry so a future
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
62
|
+
* Stable id of the embedder. Stored on each entry so a future embedder swap
|
|
63
|
+
* doesn't silently mix similarity scores.
|
|
64
|
+
*
|
|
65
|
+
* Defaults to the embedder's own `id` (8.9.0 — every shipped embedder sets
|
|
66
|
+
* one), and to `'default-embedder'` for a hand-written `Embedder` that has
|
|
67
|
+
* none. That default matters more with a durable store: it is half of the
|
|
68
|
+
* `'<id>@<dims>'` fingerprint `sqliteVectorStore` records per vector and
|
|
69
|
+
* refuses on, so an index built by `staticEmbedder()` will not silently
|
|
70
|
+
* accept vectors from `openaiEmbedder()`.
|
|
66
71
|
*/
|
|
67
72
|
readonly embedderId?: string;
|
|
68
73
|
/**
|
|
@@ -81,6 +86,23 @@ export interface IndexDocumentsOptions {
|
|
|
81
86
|
* this through to abort batch indexing on shutdown / timeout.
|
|
82
87
|
*/
|
|
83
88
|
readonly signal?: AbortSignal;
|
|
89
|
+
/**
|
|
90
|
+
* Called once with the cost of the embedding work this call did (8.9.0).
|
|
91
|
+
*
|
|
92
|
+
* `indexDocuments` runs at STARTUP, outside any agent run, so it has no
|
|
93
|
+
* emit channel to ride — there is no scope, no dispatcher and no
|
|
94
|
+
* `runtimeStageId` to correlate against. Rather than pretend otherwise, it
|
|
95
|
+
* hands the same payload the in-run stages emit as
|
|
96
|
+
* `agentfootprint.embedding.generated` straight to you, so the index-time
|
|
97
|
+
* half of the cost model is reportable from a boot script:
|
|
98
|
+
*
|
|
99
|
+
* ```ts
|
|
100
|
+
* await indexDocuments(store, embedder, docs, {
|
|
101
|
+
* onEmbedding: (e) => console.log(`embedded ${e.count} documents in ${e.durationMs}ms`),
|
|
102
|
+
* });
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
readonly onEmbedding?: (payload: import('../../events/payloads.js').EmbeddingGeneratedPayload) => void;
|
|
84
106
|
/**
|
|
85
107
|
* Max number of concurrent embed calls when the embedder doesn't
|
|
86
108
|
* implement `embedBatch`. Default `8`. Without this cap, a 10K-doc
|
|
@@ -51,8 +51,11 @@ export async function indexDocuments(store, embedder, documents, options = {}) {
|
|
|
51
51
|
if (!Array.isArray(documents) || documents.length === 0)
|
|
52
52
|
return 0;
|
|
53
53
|
const identity = options.identity ?? DEFAULT_IDENTITY;
|
|
54
|
-
|
|
54
|
+
// The embedder's own name first: it is what a durable store fingerprints
|
|
55
|
+
// the namespace with, and an anonymous index cannot refuse a later swap.
|
|
56
|
+
const embedderId = options.embedderId ?? embedder.id ?? 'default-embedder';
|
|
55
57
|
const now = Date.now();
|
|
58
|
+
const embedStartedAt = Date.now();
|
|
56
59
|
const ttl = options.ttlMs ? now + options.ttlMs : undefined;
|
|
57
60
|
// Embed in batch when supported, else fall back to capped-concurrency
|
|
58
61
|
// single calls. Unlimited concurrency on a large corpus would
|
|
@@ -69,6 +72,14 @@ export async function indexDocuments(store, embedder, documents, options = {}) {
|
|
|
69
72
|
const limit = Math.max(1, options.maxConcurrency ?? 8);
|
|
70
73
|
vectors = await embedWithConcurrency(embedder, texts, limit, options.signal);
|
|
71
74
|
}
|
|
75
|
+
options.onEmbedding?.({
|
|
76
|
+
model: embedderId,
|
|
77
|
+
provider: 'custom',
|
|
78
|
+
inputKind: 'document',
|
|
79
|
+
dimension: embedder.dimensions,
|
|
80
|
+
count: vectors.length,
|
|
81
|
+
durationMs: Date.now() - embedStartedAt,
|
|
82
|
+
});
|
|
72
83
|
const entries = documents.map((doc, i) => {
|
|
73
84
|
const vec = vectors[i];
|
|
74
85
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexDocuments.js","sourceRoot":"","sources":["../../../../src/lib/rag/indexDocuments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;
|
|
1
|
+
{"version":3,"file":"indexDocuments.js","sourceRoot":"","sources":["../../../../src/lib/rag/indexDocuments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lib/sqliteUnavailable — the one refusal for "this Node has no `node:sqlite`".
|
|
3
|
+
*
|
|
4
|
+
* Pattern: leaf error type (imports nothing).
|
|
5
|
+
* Role: shared by `hosting/sqliteSessions` and `adapters/memory/sqliteVector`.
|
|
6
|
+
* It lives here rather than in either of them because two adapters
|
|
7
|
+
* hitting the same missing module must raise the same error: a
|
|
8
|
+
* consumer catching `SqliteUnavailableError` should not have to know
|
|
9
|
+
* which of our stores was being constructed, and two classes of one
|
|
10
|
+
* name is a duplicate type the build refuses anyway.
|
|
11
|
+
* Emits: N/A.
|
|
12
|
+
*
|
|
13
|
+
* Node 20 does not have the module at all; Node 22.5 through 22.12 have it
|
|
14
|
+
* behind `--experimental-sqlite`; Node 22.13+ and 23.4+ have it as-is (still
|
|
15
|
+
* marked experimental by Node, which is why it prints a warning on first use).
|
|
16
|
+
*
|
|
17
|
+
* The refusal names the version you are on and the three ways out, because
|
|
18
|
+
* "cannot find module 'node:sqlite'" out of a library's guts tells you what
|
|
19
|
+
* broke and nothing about what to do.
|
|
20
|
+
*
|
|
21
|
+
* **There is deliberately no fallback.** Each caller supplies its own last
|
|
22
|
+
* sentence saying what a silent fallback would have looked like from the
|
|
23
|
+
* outside, because that sentence is the argument — not decoration.
|
|
24
|
+
*/
|
|
25
|
+
/** What the refusal says about the caller that raised it. */
|
|
26
|
+
export interface SqliteUnavailableContext {
|
|
27
|
+
/** The factory the consumer actually wrote, e.g. `sqliteSessions()`. */
|
|
28
|
+
readonly factory: string;
|
|
29
|
+
/** The honest in-memory alternative, named so it can be reached for. */
|
|
30
|
+
readonly alternative: string;
|
|
31
|
+
/** Why falling back to that alternative silently would be worse than refusing. */
|
|
32
|
+
readonly whyNotFallback: string;
|
|
33
|
+
/** Which door the message belongs to, for the `[prefix]` tag. */
|
|
34
|
+
readonly door: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Raised when `node:sqlite` is not available in the running Node.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* try {
|
|
42
|
+
* const store = sqliteVectorStore({ file: './corpus.db' });
|
|
43
|
+
* } catch (err) {
|
|
44
|
+
* if (err instanceof SqliteUnavailableError) {
|
|
45
|
+
* console.error(`Node ${err.nodeVersion} cannot do this`, err.message);
|
|
46
|
+
* }
|
|
47
|
+
* }
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare class SqliteUnavailableError extends Error {
|
|
51
|
+
readonly code: "ERR_SQLITE_UNAVAILABLE";
|
|
52
|
+
/** The Node version this process is running. */
|
|
53
|
+
readonly nodeVersion: string;
|
|
54
|
+
constructor(nodeVersion: string, reason: string, context?: SqliteUnavailableContext);
|
|
55
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lib/sqliteUnavailable — the one refusal for "this Node has no `node:sqlite`".
|
|
3
|
+
*
|
|
4
|
+
* Pattern: leaf error type (imports nothing).
|
|
5
|
+
* Role: shared by `hosting/sqliteSessions` and `adapters/memory/sqliteVector`.
|
|
6
|
+
* It lives here rather than in either of them because two adapters
|
|
7
|
+
* hitting the same missing module must raise the same error: a
|
|
8
|
+
* consumer catching `SqliteUnavailableError` should not have to know
|
|
9
|
+
* which of our stores was being constructed, and two classes of one
|
|
10
|
+
* name is a duplicate type the build refuses anyway.
|
|
11
|
+
* Emits: N/A.
|
|
12
|
+
*
|
|
13
|
+
* Node 20 does not have the module at all; Node 22.5 through 22.12 have it
|
|
14
|
+
* behind `--experimental-sqlite`; Node 22.13+ and 23.4+ have it as-is (still
|
|
15
|
+
* marked experimental by Node, which is why it prints a warning on first use).
|
|
16
|
+
*
|
|
17
|
+
* The refusal names the version you are on and the three ways out, because
|
|
18
|
+
* "cannot find module 'node:sqlite'" out of a library's guts tells you what
|
|
19
|
+
* broke and nothing about what to do.
|
|
20
|
+
*
|
|
21
|
+
* **There is deliberately no fallback.** Each caller supplies its own last
|
|
22
|
+
* sentence saying what a silent fallback would have looked like from the
|
|
23
|
+
* outside, because that sentence is the argument — not decoration.
|
|
24
|
+
*/
|
|
25
|
+
const SESSIONS_CONTEXT = {
|
|
26
|
+
door: 'hosting',
|
|
27
|
+
factory: 'sqliteSessions()',
|
|
28
|
+
alternative: 'memorySessions() — which keeps conversations in a Map and loses them on restart, and says so in its name',
|
|
29
|
+
whyNotFallback: 'a store that silently forgot every conversation on restart looks, from the outside, exactly like a brand-new user',
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Raised when `node:sqlite` is not available in the running Node.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* try {
|
|
37
|
+
* const store = sqliteVectorStore({ file: './corpus.db' });
|
|
38
|
+
* } catch (err) {
|
|
39
|
+
* if (err instanceof SqliteUnavailableError) {
|
|
40
|
+
* console.error(`Node ${err.nodeVersion} cannot do this`, err.message);
|
|
41
|
+
* }
|
|
42
|
+
* }
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export class SqliteUnavailableError extends Error {
|
|
46
|
+
code = 'ERR_SQLITE_UNAVAILABLE';
|
|
47
|
+
/** The Node version this process is running. */
|
|
48
|
+
nodeVersion;
|
|
49
|
+
constructor(nodeVersion, reason, context = SESSIONS_CONTEXT) {
|
|
50
|
+
super(`[${context.door}] ${context.factory} needs Node's built-in 'node:sqlite' module, and this ` +
|
|
51
|
+
`process (Node ${nodeVersion}) does not have it (${reason}). ` +
|
|
52
|
+
`That module ships with Node 22.5 and newer: on Node 22.13+ (and 23.4+) it is ` +
|
|
53
|
+
`available as-is, and on Node 22.5–22.12 it is behind --experimental-sqlite. ` +
|
|
54
|
+
`So: upgrade Node, add that flag, or use ${context.alternative}. ` +
|
|
55
|
+
`This refuses rather than falling back to memory on your behalf: ` +
|
|
56
|
+
`${context.whyNotFallback}.`);
|
|
57
|
+
this.name = 'SqliteUnavailableError';
|
|
58
|
+
this.nodeVersion = nodeVersion;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=sqliteUnavailable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqliteUnavailable.js","sourceRoot":"","sources":["../../../src/lib/sqliteUnavailable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAcH,MAAM,gBAAgB,GAA6B;IACjD,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,kBAAkB;IAC3B,WAAW,EACT,0GAA0G;IAC5G,cAAc,EACZ,mHAAmH;CACtH,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACtC,IAAI,GAAG,wBAAiC,CAAC;IAClD,gDAAgD;IACvC,WAAW,CAAS;IAE7B,YACE,WAAmB,EACnB,MAAc,EACd,UAAoC,gBAAgB;QAEpD,KAAK,CACH,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,wDAAwD;YAC1F,iBAAiB,WAAW,uBAAuB,MAAM,KAAK;YAC9D,+EAA+E;YAC/E,8EAA8E;YAC9E,2CAA2C,OAAO,CAAC,WAAW,IAAI;YAClE,kEAAkE;YAClE,GAAG,OAAO,CAAC,cAAc,GAAG,CAC/B,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -65,14 +65,21 @@ import { MEMORY_TYPES, MEMORY_STRATEGIES, MEMORY_TIMING, } from './define.types.
|
|
|
65
65
|
export function defineMemory(options) {
|
|
66
66
|
validate(options);
|
|
67
67
|
const pipeline = buildPipeline(options);
|
|
68
|
+
// `readOnly` drops the write half entirely (8.8.0). Not "writes are
|
|
69
|
+
// skipped at runtime" — the subflow is never compiled and never mounted,
|
|
70
|
+
// so a read-only memory has no write stage in its chart, no write commit
|
|
71
|
+
// in its log, and nothing to disable later by accident.
|
|
72
|
+
const write = options.readOnly === true ? undefined : pipeline.write;
|
|
68
73
|
const definition = {
|
|
69
74
|
id: options.id,
|
|
70
75
|
...(options.description !== undefined && { description: options.description }),
|
|
71
76
|
type: options.type,
|
|
72
77
|
read: brandPipeline(pipeline.read),
|
|
73
|
-
...(
|
|
78
|
+
...(write !== undefined && { write: brandPipeline(write) }),
|
|
74
79
|
timing: options.timing ?? MEMORY_TIMING.TURN_START,
|
|
75
80
|
...(options.redact !== undefined && { redact: options.redact }),
|
|
81
|
+
...(options.corpus !== undefined && { corpus: options.corpus }),
|
|
82
|
+
...(options.flavor !== undefined && { flavor: options.flavor }),
|
|
76
83
|
...(options.type === MEMORY_TYPES.CAUSAL &&
|
|
77
84
|
options.projection !== undefined && {
|
|
78
85
|
projection: options.projection,
|
|
@@ -93,6 +100,26 @@ function validate(options) {
|
|
|
93
100
|
throw new Error(`defineMemory[id=${options.id}]: \`store\` is required. ` +
|
|
94
101
|
'Pass `new InMemoryStore()` for dev/tests, or a backed store for production.');
|
|
95
102
|
}
|
|
103
|
+
// The shorthand and the spelled-out rule EXCLUDE. Accepting both would
|
|
104
|
+
// mean one of two numbers silently loses, and the recording would name
|
|
105
|
+
// a `k` the run did not use.
|
|
106
|
+
// Read through a structural shape, not the union: the union's arms
|
|
107
|
+
// declare the OTHER spelling as `never`, so intersecting them here
|
|
108
|
+
// would make the very field this check reads unreadable.
|
|
109
|
+
const strategy = options.strategy;
|
|
110
|
+
if (strategy?.retrieval !== undefined) {
|
|
111
|
+
const shorthand = [];
|
|
112
|
+
if (strategy.topK !== undefined)
|
|
113
|
+
shorthand.push('`topK`');
|
|
114
|
+
if (strategy.threshold !== undefined)
|
|
115
|
+
shorthand.push('`threshold`');
|
|
116
|
+
if (shorthand.length > 0) {
|
|
117
|
+
throw new Error(`defineMemory[id=${options.id}]: ${shorthand.join(' and ')} cannot be combined with ` +
|
|
118
|
+
'`retrieval` — they are two spellings of the same rule and could disagree. ' +
|
|
119
|
+
`Keep the strategy (\`retrieval: ${strategy.retrieval.name}({ ... })\`) and drop ` +
|
|
120
|
+
`${shorthand.join('/')}, or drop \`retrieval\`.`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
96
123
|
}
|
|
97
124
|
// ─── Pipeline dispatch ─────────────────────────────────────────────
|
|
98
125
|
function buildPipeline(options) {
|
|
@@ -177,8 +204,11 @@ function buildSemanticPipeline(options) {
|
|
|
177
204
|
const config = {
|
|
178
205
|
store: options.store,
|
|
179
206
|
embedder: t.embedder,
|
|
180
|
-
k: t.topK,
|
|
207
|
+
...(t.topK !== undefined && { k: t.topK }),
|
|
181
208
|
...(t.threshold !== undefined && { minScore: t.threshold }),
|
|
209
|
+
...(t.embedderId !== undefined && { embedderId: t.embedderId }),
|
|
210
|
+
...(t.retrieval !== undefined && { retrieval: t.retrieval }),
|
|
211
|
+
...(options.flavor !== undefined && { flavor: options.flavor }),
|
|
182
212
|
};
|
|
183
213
|
return semanticPipeline(config);
|
|
184
214
|
}
|
|
@@ -268,6 +298,12 @@ function buildCausalPipeline(options) {
|
|
|
268
298
|
'Pass `new InMemoryStore({ embedder })` for dev/tests, or a vector adapter ' +
|
|
269
299
|
'(pgvector, Pinecone, Qdrant) for production.');
|
|
270
300
|
}
|
|
301
|
+
// CAUSAL predates the retrieval seam and reads the shorthand only. A
|
|
302
|
+
// strategy passed here would be accepted and ignored, so it is refused.
|
|
303
|
+
if (s.retrieval !== undefined) {
|
|
304
|
+
throw new Error(`defineMemory[${options.id}]: CAUSAL type does not read \`retrieval\` — snapshot recall ` +
|
|
305
|
+
'matches a stored query vector, not a document pool. Use `topK` + `threshold`.');
|
|
306
|
+
}
|
|
271
307
|
const config = {
|
|
272
308
|
store: options.store,
|
|
273
309
|
embedder: s.embedder,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define.js","sourceRoot":"","sources":["../../../src/memory/define.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,eAAe,EAA8B,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAA+B,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,YAAY,EAA2B,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAgC,MAAM,yBAAyB,CAAC;AAC1F,OAAO,EAAE,YAAY,EAA2B,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAA+B,MAAM,mBAAmB,CAAC;AAGlF,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,aAAa,GAad,MAAM,mBAAmB,CAAC;AAG3B,sEAAsE;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,QAAQ,CAAC,OAAO,CAAC,CAAC;IAElB,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAExC,MAAM,UAAU,GAAqB;QACnC,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;QAC9E,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;QAClC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"define.js","sourceRoot":"","sources":["../../../src/memory/define.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,6 +41,8 @@
|
|
|
41
41
|
import type { LLMProvider } from '../adapters/types.js';
|
|
42
42
|
import type { Embedder } from './embedding/index.js';
|
|
43
43
|
import type { MemoryStore } from './store/index.js';
|
|
44
|
+
import type { MemoryIdentity } from './identity/index.js';
|
|
45
|
+
import type { RetrievalStrategy } from './retrieval/types.js';
|
|
44
46
|
/**
|
|
45
47
|
* What shape of memory you're keeping.
|
|
46
48
|
*
|
|
@@ -152,12 +154,44 @@ export interface SummarizeStrategy {
|
|
|
152
154
|
* STRICT threshold: when no entry meets the threshold, return EMPTY.
|
|
153
155
|
* No fallback — garbage in context is worse than no memory.
|
|
154
156
|
*/
|
|
155
|
-
|
|
157
|
+
/**
|
|
158
|
+
* Top-K retrieval, in either of its two spellings — and never both.
|
|
159
|
+
*
|
|
160
|
+
* The arms EXCLUDE (8.8.0). `{ topK, threshold }` is the shorthand;
|
|
161
|
+
* `{ retrieval }` is the same rule written as a {@link RetrievalStrategy},
|
|
162
|
+
* which is also how a different rule gets in. Accepting both would mean
|
|
163
|
+
* one of two `k`s silently loses and the recording would name a `k` the
|
|
164
|
+
* run did not use — so the type refuses it at the keystroke, and
|
|
165
|
+
* `defineMemory` refuses it again at runtime for JavaScript callers.
|
|
166
|
+
*/
|
|
167
|
+
export type TopKStrategy = TopKShorthandStrategy | TopKRetrievalStrategy;
|
|
168
|
+
/** The historical spelling: two loose numbers. Unchanged since 2.x. */
|
|
169
|
+
export interface TopKShorthandStrategy {
|
|
156
170
|
readonly kind: typeof MEMORY_STRATEGIES.TOP_K;
|
|
157
171
|
readonly topK: number;
|
|
158
172
|
/** Min cosine similarity. Strict — no fallback below this. Default 0.7. */
|
|
159
173
|
readonly threshold?: number;
|
|
160
174
|
readonly embedder: Embedder;
|
|
175
|
+
/**
|
|
176
|
+
* Stable id of the embedder, filtered against `MemoryEntry.embeddingModel`
|
|
177
|
+
* at search time so a later embedder swap cannot silently mix two vector
|
|
178
|
+
* spaces. Pair it with the same value passed to `indexDocuments`.
|
|
179
|
+
*
|
|
180
|
+
* Wired in 8.8.0. `defineRAG` has accepted an `embedderId` since 7.x and
|
|
181
|
+
* never forwarded it — an option the run did not read.
|
|
182
|
+
*/
|
|
183
|
+
readonly embedderId?: string;
|
|
184
|
+
readonly retrieval?: never;
|
|
185
|
+
}
|
|
186
|
+
/** The spelled-out rule (8.8.0) — and the seam a re-ranker will arrive through. */
|
|
187
|
+
export interface TopKRetrievalStrategy {
|
|
188
|
+
readonly kind: typeof MEMORY_STRATEGIES.TOP_K;
|
|
189
|
+
readonly embedder: Embedder;
|
|
190
|
+
readonly retrieval: RetrievalStrategy;
|
|
191
|
+
/** See {@link TopKShorthandStrategy.embedderId}. */
|
|
192
|
+
readonly embedderId?: string;
|
|
193
|
+
readonly topK?: never;
|
|
194
|
+
readonly threshold?: never;
|
|
161
195
|
}
|
|
162
196
|
/**
|
|
163
197
|
* Extract — on WRITE, an LLM (or pattern matcher) distills entries from
|
|
@@ -234,7 +268,34 @@ export interface MemoryDefinition<T = unknown> {
|
|
|
234
268
|
readonly redact?: MemoryRedactionPolicy;
|
|
235
269
|
/** Snapshot projection — only meaningful when `type === CAUSAL`. */
|
|
236
270
|
readonly projection?: SnapshotProjection;
|
|
271
|
+
/**
|
|
272
|
+
* The namespace this memory reads and writes (8.8.0).
|
|
273
|
+
*
|
|
274
|
+
* Absent — the historical behaviour, and still the right one for
|
|
275
|
+
* conversation memory — means "whatever identity the run was given",
|
|
276
|
+
* so each conversation remembers its own turns.
|
|
277
|
+
*
|
|
278
|
+
* Present means "always this namespace, whoever is asking", which is
|
|
279
|
+
* what a shared document corpus is: a corpus does not belong to a
|
|
280
|
+
* conversation, and reading it under a per-run conversation id is why
|
|
281
|
+
* `defineRAG`'s own documented example retrieved nothing at all before
|
|
282
|
+
* 8.8.0. `defineRAG` defaults it to `{ conversationId: '_global' }`,
|
|
283
|
+
* matching `indexDocuments`'s default so the two sides meet.
|
|
284
|
+
*/
|
|
285
|
+
readonly corpus?: MemoryIdentity;
|
|
286
|
+
/**
|
|
287
|
+
* Which claim this memory's injected block makes (8.8.0). `'memory'`
|
|
288
|
+
* is conversation recall; `'rag'` is corpus retrieval, and it is the
|
|
289
|
+
* value that reaches the recording as `ContextInjectedPayload.source`.
|
|
290
|
+
*
|
|
291
|
+
* The event vocabulary has carried a `'rag'` source since 2.x and
|
|
292
|
+
* nothing ever emitted it — a declared value no run can produce is a
|
|
293
|
+
* gap in the contract, not a spare.
|
|
294
|
+
*/
|
|
295
|
+
readonly flavor?: MemoryFlavor;
|
|
237
296
|
}
|
|
297
|
+
/** What an injected memory block is claiming to be. */
|
|
298
|
+
export type MemoryFlavor = 'memory' | 'rag';
|
|
238
299
|
/**
|
|
239
300
|
* Opaque tag for the compiled flowchart the factory hands back.
|
|
240
301
|
* The actual type is `FlowChart<MemoryState>` from footprintjs but we
|
|
@@ -256,6 +317,23 @@ export interface DefineMemoryOptionsBase {
|
|
|
256
317
|
readonly strategy: Strategy;
|
|
257
318
|
readonly timing?: MemoryTiming;
|
|
258
319
|
readonly redact?: MemoryRedactionPolicy;
|
|
320
|
+
/**
|
|
321
|
+
* Read and write under THIS namespace instead of the run's identity
|
|
322
|
+
* (8.8.0). See {@link MemoryDefinition.corpus}.
|
|
323
|
+
*/
|
|
324
|
+
readonly corpus?: MemoryIdentity;
|
|
325
|
+
/**
|
|
326
|
+
* Build a read-only memory (8.8.0): no write subflow is compiled, so
|
|
327
|
+
* nothing this memory sees is ever stored back.
|
|
328
|
+
*
|
|
329
|
+
* The reason it exists: a retrieval corpus and a conversation log are
|
|
330
|
+
* two different things sharing one pipeline. Writing the conversation
|
|
331
|
+
* into the corpus makes the user's own question the best-scoring
|
|
332
|
+
* "document" in it. `defineRAG` sets this.
|
|
333
|
+
*/
|
|
334
|
+
readonly readOnly?: boolean;
|
|
335
|
+
/** Which claim the injected block makes. See {@link MemoryDefinition.flavor}. */
|
|
336
|
+
readonly flavor?: MemoryFlavor;
|
|
259
337
|
}
|
|
260
338
|
export interface DefineEpisodicOptions extends DefineMemoryOptionsBase {
|
|
261
339
|
readonly type: typeof MEMORY_TYPES.EPISODIC;
|
|
@@ -286,3 +364,17 @@ export declare function isSnapshotProjection(value: string): value is SnapshotPr
|
|
|
286
364
|
export declare const MEMORY_INJECTION_KEY_PREFIX: "memoryInjection_";
|
|
287
365
|
export declare function memoryInjectionKey(id: string): string;
|
|
288
366
|
export declare function isMemoryInjectionKey(key: string): boolean;
|
|
367
|
+
/**
|
|
368
|
+
* Scope-key prefix for the retrieval record a memory lifts to the parent
|
|
369
|
+
* scope (8.8.0), one key per memory id — the same layering rule as
|
|
370
|
+
* `memoryInjection_`.
|
|
371
|
+
*
|
|
372
|
+
* This key is the reason a backward slice can now reach a passage. It is
|
|
373
|
+
* ORDINARY root state, so `sliceForKey('finalContent')` walks the
|
|
374
|
+
* system-prompt write, and the record naming every candidate id and score
|
|
375
|
+
* is one hop away. Before 8.8.0 the scores existed only inside the memory
|
|
376
|
+
* subflow, which the root commit log never sees.
|
|
377
|
+
*/
|
|
378
|
+
export declare const RETRIEVAL_EVIDENCE_KEY_PREFIX: "retrievalEvidence_";
|
|
379
|
+
export declare function retrievalEvidenceKey(id: string): string;
|
|
380
|
+
export declare function isRetrievalEvidenceKey(key: string): boolean;
|
|
@@ -126,4 +126,22 @@ export function memoryInjectionKey(id) {
|
|
|
126
126
|
export function isMemoryInjectionKey(key) {
|
|
127
127
|
return key.startsWith(MEMORY_INJECTION_KEY_PREFIX);
|
|
128
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Scope-key prefix for the retrieval record a memory lifts to the parent
|
|
131
|
+
* scope (8.8.0), one key per memory id — the same layering rule as
|
|
132
|
+
* `memoryInjection_`.
|
|
133
|
+
*
|
|
134
|
+
* This key is the reason a backward slice can now reach a passage. It is
|
|
135
|
+
* ORDINARY root state, so `sliceForKey('finalContent')` walks the
|
|
136
|
+
* system-prompt write, and the record naming every candidate id and score
|
|
137
|
+
* is one hop away. Before 8.8.0 the scores existed only inside the memory
|
|
138
|
+
* subflow, which the root commit log never sees.
|
|
139
|
+
*/
|
|
140
|
+
export const RETRIEVAL_EVIDENCE_KEY_PREFIX = 'retrievalEvidence_';
|
|
141
|
+
export function retrievalEvidenceKey(id) {
|
|
142
|
+
return `${RETRIEVAL_EVIDENCE_KEY_PREFIX}${id}`;
|
|
143
|
+
}
|
|
144
|
+
export function isRetrievalEvidenceKey(key) {
|
|
145
|
+
return key.startsWith(RETRIEVAL_EVIDENCE_KEY_PREFIX);
|
|
146
|
+
}
|
|
129
147
|
//# sourceMappingURL=define.types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define.types.js","sourceRoot":"","sources":["../../../src/memory/define.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;
|
|
1
|
+
{"version":3,"file":"define.types.js","sourceRoot":"","sources":["../../../src/memory/define.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAQH,uEAAuE;AAEvE;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;CACR,CAAC;AAGX;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;CACR,CAAC;AAGX;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,eAAe,EAAE,iBAAiB;IAClC,UAAU,EAAE,YAAY;CAChB,CAAC;AAGX;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;IACtB,IAAI,EAAE,MAAM;CACJ,CAAC;AAqTX,uEAAuE;AAEvE,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAQ,MAAM,CAAC,MAAM,CAAC,YAAY,CAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAQ,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAQ,MAAM,CAAC,MAAM,CAAC,aAAa,CAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAQ,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED,uEAAuE;AAEvE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,kBAA2B,CAAC;AAEvE,MAAM,UAAU,kBAAkB,CAAC,EAAU;IAC3C,OAAO,GAAG,2BAA2B,GAAG,EAAE,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,OAAO,GAAG,CAAC,UAAU,CAAC,2BAA2B,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,oBAA6B,CAAC;AAE3E,MAAM,UAAU,oBAAoB,CAAC,EAAU;IAC7C,OAAO,GAAG,6BAA6B,GAAG,EAAE,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,OAAO,GAAG,CAAC,UAAU,CAAC,6BAA6B,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { emitEmbedding } from './emitEmbedding.js';
|
|
1
2
|
/** Default: extract plaintext from any supported content shape. */
|
|
2
3
|
function defaultTextFrom(message) {
|
|
3
4
|
return message.content ?? '';
|
|
@@ -18,6 +19,7 @@ export function embedMessages(config) {
|
|
|
18
19
|
}
|
|
19
20
|
const texts = messages.map(textFrom);
|
|
20
21
|
const signal = scope.$getEnv?.()?.signal;
|
|
22
|
+
const startedAt = Date.now();
|
|
21
23
|
let vectors;
|
|
22
24
|
if (embedder.embedBatch) {
|
|
23
25
|
vectors = (await embedder.embedBatch({
|
|
@@ -28,6 +30,20 @@ export function embedMessages(config) {
|
|
|
28
30
|
else {
|
|
29
31
|
vectors = await Promise.all(texts.map((text) => embedder.embed({ text, ...(signal ? { signal } : {}) })));
|
|
30
32
|
}
|
|
33
|
+
// The INDEX-time half of the two-phase cost model (8.9.0). Embedding cost
|
|
34
|
+
// splits in two — this side scales with the size of what you store, and
|
|
35
|
+
// the query side scales with traffic — and telling them apart is the whole
|
|
36
|
+
// reason for a durable index. `agentfootprint.embedding.generated` has been
|
|
37
|
+
// declared since 2.x with an `inputKind` field and no emitter; this is one
|
|
38
|
+
// of its two.
|
|
39
|
+
emitEmbedding(scope, {
|
|
40
|
+
model: config.embedderId ?? embedder.id ?? 'unknown',
|
|
41
|
+
provider: 'custom',
|
|
42
|
+
inputKind: 'document',
|
|
43
|
+
dimension: embedder.dimensions,
|
|
44
|
+
count: vectors.length,
|
|
45
|
+
durationMs: Date.now() - startedAt,
|
|
46
|
+
});
|
|
31
47
|
scope.newMessageEmbeddings = vectors;
|
|
32
48
|
if (config.embedderId !== undefined) {
|
|
33
49
|
scope.newMessageEmbeddingModel = config.embedderId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedMessages.js","sourceRoot":"","sources":["../../../../src/memory/embedding/embedMessages.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"embedMessages.js","sourceRoot":"","sources":["../../../../src/memory/embedding/embedMessages.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAmCnD,mEAAmE;AACnE,SAAS,eAAe,CAAC,OAAgB;IACvC,OAAO,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,MAA2B;IACvD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,eAAe,CAAC;IAEpD,OAAO,KAAK,EAAE,KAAqC,EAAiB,EAAE;QACpE,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAuB,CAAC;QACjE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC;QAEzC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,OAAmB,CAAC;QACxB,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACxB,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,UAAU,CAAC;gBACnC,KAAK;gBACL,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9B,CAAC,CAAe,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CACzB,KAAK,CAAC,GAAG,CACP,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAsB,CACvF,CACF,CAAC;QACJ,CAAC;QAED,0EAA0E;QAC1E,wEAAwE;QACxE,2EAA2E;QAC3E,4EAA4E;QAC5E,2EAA2E;QAC3E,cAAc;QACd,aAAa,CAAC,KAAK,EAAE;YACnB,KAAK,EAAE,MAAM,CAAC,UAAU,IAAI,QAAQ,CAAC,EAAE,IAAI,SAAS;YACpD,QAAQ,EAAE,QAAQ;YAClB,SAAS,EAAE,UAAU;YACrB,SAAS,EAAE,QAAQ,CAAC,UAAU;YAC9B,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACnC,CAAC,CAAC;QAEH,KAAK,CAAC,oBAAoB,GAAG,OAAO,CAAC;QACrC,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACpC,KAAK,CAAC,wBAAwB,GAAG,MAAM,CAAC,UAAU,CAAC;QACrD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* emitEmbedding — one place that reports an embedding call.
|
|
3
|
+
*
|
|
4
|
+
* Pattern: leaf helper over the emit channel.
|
|
5
|
+
* Role: memory/ layer. Both halves of the two-phase cost model go through
|
|
6
|
+
* it — `embedMessages` reports `'document'`, `loadRelevant` reports
|
|
7
|
+
* `'query'` — so the two can never drift into describing the same
|
|
8
|
+
* fact two different ways.
|
|
9
|
+
* Emits: `agentfootprint.embedding.generated`.
|
|
10
|
+
*
|
|
11
|
+
* ── Why this event matters more than it looks ───────────────────────────────
|
|
12
|
+
* Embedding cost is not one number. **Index time** embeds the corpus: it
|
|
13
|
+
* happens once, and its cost scales with how much you store. **Query time**
|
|
14
|
+
* embeds the user's question: it happens per retrieval, and its cost scales
|
|
15
|
+
* with traffic. `inputKind` is the field that separates them, and separating
|
|
16
|
+
* them is what makes "should this corpus live in a file?" a question with an
|
|
17
|
+
* arithmetic answer instead of a feeling.
|
|
18
|
+
*
|
|
19
|
+
* The payload has been declared since 2.x and nothing emitted it, so any
|
|
20
|
+
* dashboard built against it has been reading a flat line that meant "not
|
|
21
|
+
* wired", not "no cost".
|
|
22
|
+
*
|
|
23
|
+
* Telemetry rides the EMIT channel, never a commit payload — a cost report is
|
|
24
|
+
* an observation about a stage, not state the next stage reads.
|
|
25
|
+
*/
|
|
26
|
+
import type { TypedScope } from 'footprintjs';
|
|
27
|
+
import type { EmbeddingGeneratedPayload } from '../../events/payloads.js';
|
|
28
|
+
/**
|
|
29
|
+
* Fire the event when the scope has an emit channel, and do nothing when it
|
|
30
|
+
* does not.
|
|
31
|
+
*
|
|
32
|
+
* A memory pipeline can be mounted outside an Agent (`mountMemoryRead` on a
|
|
33
|
+
* bare flowchart), and a stage that threw because nobody was listening would
|
|
34
|
+
* make observability a requirement rather than an option.
|
|
35
|
+
*/
|
|
36
|
+
export declare function emitEmbedding(scope: TypedScope<Record<string, unknown>> | {
|
|
37
|
+
$emit?: unknown;
|
|
38
|
+
}, payload: EmbeddingGeneratedPayload): void;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fire the event when the scope has an emit channel, and do nothing when it
|
|
3
|
+
* does not.
|
|
4
|
+
*
|
|
5
|
+
* A memory pipeline can be mounted outside an Agent (`mountMemoryRead` on a
|
|
6
|
+
* bare flowchart), and a stage that threw because nobody was listening would
|
|
7
|
+
* make observability a requirement rather than an option.
|
|
8
|
+
*/
|
|
9
|
+
export function emitEmbedding(scope, payload) {
|
|
10
|
+
const emitter = scope.$emit;
|
|
11
|
+
if (typeof emitter === 'function') {
|
|
12
|
+
emitter.call(scope, 'agentfootprint.embedding.generated', payload);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=emitEmbedding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitEmbedding.js","sourceRoot":"","sources":["../../../../src/memory/embedding/emitEmbedding.ts"],"names":[],"mappings":"AA4BA;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAgE,EAChE,OAAkC;IAElC,MAAM,OAAO,GAAI,KAA8D,CAAC,KAAK,CAAC;IACtF,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,oCAAoC,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
|