agentfootprint 8.7.0 → 8.8.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 +4 -2
- 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/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/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/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/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/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/loadRelevant.d.ts +49 -15
- package/dist/esm/memory/embedding/loadRelevant.js +136 -7
- package/dist/esm/memory/embedding/loadRelevant.js.map +1 -1
- 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/events/registry.js +2 -0
- package/dist/events/registry.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/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/loadRelevant.js +138 -8
- package/dist/memory/embedding/loadRelevant.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/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/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/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/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/loadRelevant.d.ts +49 -15
- package/dist/types/memory/embedding/loadRelevant.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/package.json +1 -1
|
@@ -1,24 +1,67 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* defineRAG —
|
|
3
|
+
* defineRAG — retrieval-augmented generation over a document corpus.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* strategy: TOP_K })` — the rename is for intent + ergonomics.
|
|
5
|
+
* Embed the user's question, retrieve the most similar chunks from a
|
|
6
|
+
* vector store, inject them into the system-prompt slot of the next LLM
|
|
7
|
+
* call. It is the same machinery as `defineMemory({ type: SEMANTIC,
|
|
8
|
+
* strategy: TOP_K })` — with three differences that are not cosmetic:
|
|
10
9
|
*
|
|
11
10
|
* defineMemory ─┬─► EPISODIC (raw conversation)
|
|
12
11
|
* ├─► SEMANTIC (extracted facts / RAG chunks)
|
|
13
12
|
* ├─► NARRATIVE (beats / summaries)
|
|
14
13
|
* └─► CAUSAL (footprintjs decision snapshots)
|
|
15
14
|
*
|
|
16
|
-
* defineRAG ─► SEMANTIC + TOP_K
|
|
17
|
-
*
|
|
15
|
+
* defineRAG ─► SEMANTIC + TOP_K, READ-ONLY, over a NAMED CORPUS,
|
|
16
|
+
* rendered as citable <source> blocks.
|
|
17
|
+
*
|
|
18
|
+
* ─── What changed in 8.8.0, and why ────────────────────────────────────
|
|
19
|
+
*
|
|
20
|
+
* **1. A corpus is read-only.** Until 8.8.0 `defineRAG` also mounted the
|
|
21
|
+
* semantic pipeline's WRITE half, which embedded every conversation turn
|
|
22
|
+
* and stored it in the same namespace as the documents. The consequence
|
|
23
|
+
* was measurable and bad: the user's own question, re-embedded, is the
|
|
24
|
+
* single best-scoring "document" in the corpus (cosine 1.0 against
|
|
25
|
+
* itself), so it came back as retrieval hit #1 and consumed a slot in
|
|
26
|
+
* the top-K budget that a real passage should have had. A corpus is not
|
|
27
|
+
* a conversation log. Nothing this retriever reads is written back.
|
|
28
|
+
*
|
|
29
|
+
* If you want conversation memory ALONGSIDE a corpus, that is what
|
|
30
|
+
* `defineMemory` is for, and the two are registered separately, each
|
|
31
|
+
* with its own store:
|
|
32
|
+
*
|
|
33
|
+
* ```ts
|
|
34
|
+
* const agent = Agent.create({ provider })
|
|
35
|
+
* .rag(defineRAG({ id: 'product-docs', store: corpusStore, embedder }))
|
|
36
|
+
* .memory(defineMemory({
|
|
37
|
+
* id: 'chat',
|
|
38
|
+
* type: MEMORY_TYPES.EPISODIC,
|
|
39
|
+
* strategy: { kind: MEMORY_STRATEGIES.WINDOW, size: 10 },
|
|
40
|
+
* store: conversationStore,
|
|
41
|
+
* }))
|
|
42
|
+
* .build();
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* **2. The corpus has its own namespace.** A memory reads under the
|
|
46
|
+
* identity passed to `agent.run()`. For conversation recall that is
|
|
47
|
+
* right. For a shared corpus it was the reason the documented example
|
|
48
|
+
* retrieved NOTHING: `indexDocuments` writes under
|
|
49
|
+
* `{ conversationId: '_global' }` by default, while a run with no
|
|
50
|
+
* explicit identity gets `{ conversationId: 'run-<timestamp>-<n>' }` —
|
|
51
|
+
* so the write side and the read side never met, silently. `corpus`
|
|
52
|
+
* defaults to the same `'_global'` the indexer uses, so the documented
|
|
53
|
+
* example works with no extra arguments; pass it explicitly when you
|
|
54
|
+
* index per tenant.
|
|
55
|
+
*
|
|
56
|
+
* **3. Chunks are citable.** Retrieved passages render as
|
|
57
|
+
* `<source id="refunds.md#3" doc="refunds.md" score="0.81">` under a
|
|
58
|
+
* corpus header, instead of the conversation-recall shape that printed
|
|
59
|
+
* `role="unknown" turn="0"` on a page of a PDF and gave the model
|
|
60
|
+
* nothing to cite.
|
|
18
61
|
*
|
|
19
62
|
* Pattern: Composition over duplication — defineRAG returns a
|
|
20
63
|
* MemoryDefinition produced by defineMemory. No new engine
|
|
21
|
-
* code, no new slot subflow, no new
|
|
64
|
+
* code, no new slot subflow, no new stage.
|
|
22
65
|
*
|
|
23
66
|
* Role: Layer-3 context-engineering primitive. Lives next to
|
|
24
67
|
* defineSkill / defineSteering / defineInstruction / defineFact
|
|
@@ -26,27 +69,32 @@
|
|
|
26
69
|
* (RAG content is computed at runtime via async retrieval —
|
|
27
70
|
* can't fit the synchronous Injection.inject shape).
|
|
28
71
|
*
|
|
29
|
-
* Emits:
|
|
30
|
-
*
|
|
31
|
-
*
|
|
72
|
+
* Emits: `agentfootprint.memory.retrieved` (once per retrieval, with
|
|
73
|
+
* every candidate and its score — including the rejected ones),
|
|
74
|
+
* `agentfootprint.memory.attached` (once per chunk that reached
|
|
75
|
+
* the prompt), and `agentfootprint.context.injected` with
|
|
76
|
+
* `source: 'rag'` (once per chunk).
|
|
32
77
|
*
|
|
33
78
|
* @see ./indexDocuments.ts for the seeding helper
|
|
34
79
|
* @see ../../memory/define.ts for the underlying factory
|
|
80
|
+
* @see ../../memory/retrieval/ for the retrieval seam
|
|
35
81
|
* @see ../../memory/asRoleRefusal.ts for why `asRole` is refused, not honoured
|
|
36
82
|
*
|
|
37
|
-
* @example Basic usage
|
|
83
|
+
* @example Basic usage — works with no identity argument anywhere
|
|
38
84
|
* ```ts
|
|
39
|
-
* import {
|
|
40
|
-
import { InMemoryStore, mockEmbedder } from 'agentfootprint/memory'
|
|
41
|
-
import { mock } from 'agentfootprint/
|
|
85
|
+
* import { Agent, defineRAG, indexDocuments } from 'agentfootprint';
|
|
86
|
+
* import { InMemoryStore, mockEmbedder } from 'agentfootprint/memory';
|
|
87
|
+
* import { mock } from 'agentfootprint/providers';
|
|
42
88
|
*
|
|
43
89
|
* const embedder = mockEmbedder();
|
|
44
90
|
* const store = new InMemoryStore();
|
|
45
91
|
*
|
|
46
|
-
* // Seed the
|
|
92
|
+
* // Seed the corpus once at startup (defaults to the '_global' namespace).
|
|
47
93
|
* await indexDocuments(store, embedder, [
|
|
48
|
-
* { id: '
|
|
49
|
-
*
|
|
94
|
+
* { id: 'refunds.md#0', content: 'Refunds are processed within 3 business days.',
|
|
95
|
+
* metadata: { source: 'refunds.md' } },
|
|
96
|
+
* { id: 'pricing.md#0', content: 'Pro plan costs $20/month.',
|
|
97
|
+
* metadata: { source: 'pricing.md' } },
|
|
50
98
|
* ]);
|
|
51
99
|
*
|
|
52
100
|
* const docs = defineRAG({
|
|
@@ -61,13 +109,27 @@ import { mock } from 'agentfootprint/llm-providers';
|
|
|
61
109
|
* const agent = Agent.create({ provider: mock({ reply: 'ok' }), model: 'mock' })
|
|
62
110
|
* .rag(docs)
|
|
63
111
|
* .build();
|
|
112
|
+
*
|
|
113
|
+
* agent.on('agentfootprint.memory.retrieved', (e) => {
|
|
114
|
+
* // every candidate, admitted or not, with its score and its reason
|
|
115
|
+
* console.log(e.payload.candidates);
|
|
116
|
+
* });
|
|
117
|
+
*
|
|
118
|
+
* await agent.run({ message: 'How long do refunds take?' });
|
|
64
119
|
* ```
|
|
65
120
|
*/
|
|
66
121
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
67
|
-
exports.defineRAG = void 0;
|
|
122
|
+
exports.defineRAG = exports.DEFAULT_CORPUS_IDENTITY = void 0;
|
|
68
123
|
const define_types_js_1 = require("../../memory/define.types.js");
|
|
69
124
|
const define_js_1 = require("../../memory/define.js");
|
|
70
125
|
const asRoleRefusal_js_1 = require("../../memory/asRoleRefusal.js");
|
|
126
|
+
/**
|
|
127
|
+
* The namespace a corpus lives in unless told otherwise — the same one
|
|
128
|
+
* `indexDocuments` writes to by default. The two defaults are one value
|
|
129
|
+
* on purpose: index with no options, retrieve with no options, and the
|
|
130
|
+
* documents are found.
|
|
131
|
+
*/
|
|
132
|
+
exports.DEFAULT_CORPUS_IDENTITY = { conversationId: '_global' };
|
|
71
133
|
/**
|
|
72
134
|
* Build a RAG context-engineering definition. The returned
|
|
73
135
|
* `MemoryDefinition` is registered on the Agent via `.rag(definition)`
|
|
@@ -75,6 +137,7 @@ const asRoleRefusal_js_1 = require("../../memory/asRoleRefusal.js");
|
|
|
75
137
|
*
|
|
76
138
|
* @throws when `store` does not implement `search()`. RAG requires a
|
|
77
139
|
* vector-capable adapter.
|
|
140
|
+
* @throws when `retrieval` is combined with `topK` or `threshold`.
|
|
78
141
|
*/
|
|
79
142
|
function defineRAG(opts) {
|
|
80
143
|
if (!opts.id || opts.id.trim() === '') {
|
|
@@ -94,17 +157,41 @@ function defineRAG(opts) {
|
|
|
94
157
|
throw new Error(`defineRAG[${opts.id}]: store must implement search(). ` +
|
|
95
158
|
'Pass a vector-capable adapter (InMemoryStore, pgvector, Pinecone, ...).');
|
|
96
159
|
}
|
|
160
|
+
if (opts.retrieval !== undefined) {
|
|
161
|
+
const shorthand = [];
|
|
162
|
+
if (opts.topK !== undefined)
|
|
163
|
+
shorthand.push('`topK`');
|
|
164
|
+
if (opts.threshold !== undefined)
|
|
165
|
+
shorthand.push('`threshold`');
|
|
166
|
+
if (shorthand.length > 0) {
|
|
167
|
+
throw new Error(`defineRAG[${opts.id}]: ${shorthand.join(' and ')} cannot be combined with \`retrieval\` ` +
|
|
168
|
+
'— they are two spellings of the same rule and could disagree. Keep ' +
|
|
169
|
+
`\`retrieval: ${opts.retrieval.name}({ ... })\` and drop ${shorthand.join('/')}.`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
97
172
|
return (0, define_js_1.defineMemory)({
|
|
98
173
|
id: opts.id,
|
|
99
174
|
...(opts.description !== undefined && { description: opts.description }),
|
|
100
175
|
type: define_types_js_1.MEMORY_TYPES.SEMANTIC,
|
|
101
|
-
strategy:
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
176
|
+
strategy: opts.retrieval !== undefined
|
|
177
|
+
? {
|
|
178
|
+
kind: define_types_js_1.MEMORY_STRATEGIES.TOP_K,
|
|
179
|
+
embedder: opts.embedder,
|
|
180
|
+
retrieval: opts.retrieval,
|
|
181
|
+
...(opts.embedderId !== undefined && { embedderId: opts.embedderId }),
|
|
182
|
+
}
|
|
183
|
+
: {
|
|
184
|
+
kind: define_types_js_1.MEMORY_STRATEGIES.TOP_K,
|
|
185
|
+
topK: opts.topK ?? 3,
|
|
186
|
+
threshold: opts.threshold ?? 0.7,
|
|
187
|
+
embedder: opts.embedder,
|
|
188
|
+
...(opts.embedderId !== undefined && { embedderId: opts.embedderId }),
|
|
189
|
+
},
|
|
107
190
|
store: opts.store,
|
|
191
|
+
// A corpus is not a conversation log — see the header.
|
|
192
|
+
readOnly: true,
|
|
193
|
+
corpus: opts.corpus ?? exports.DEFAULT_CORPUS_IDENTITY,
|
|
194
|
+
flavor: 'rag',
|
|
108
195
|
});
|
|
109
196
|
}
|
|
110
197
|
exports.defineRAG = defineRAG;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defineRAG.js","sourceRoot":"","sources":["../../../src/lib/rag/defineRAG.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"defineRAG.js","sourceRoot":"","sources":["../../../src/lib/rag/defineRAG.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/rag/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.indexDocuments = exports.defineRAG = void 0;
|
|
3
|
+
exports.indexDocuments = exports.DEFAULT_CORPUS_IDENTITY = exports.defineRAG = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* RAG — retrieval-augmented generation as a context-engineering
|
|
6
6
|
* flavor. ONE factory + ONE seeding helper. Composes over the memory
|
|
@@ -8,6 +8,7 @@ exports.indexDocuments = exports.defineRAG = void 0;
|
|
|
8
8
|
*/
|
|
9
9
|
var defineRAG_js_1 = require("./defineRAG.js");
|
|
10
10
|
Object.defineProperty(exports, "defineRAG", { enumerable: true, get: function () { return defineRAG_js_1.defineRAG; } });
|
|
11
|
+
Object.defineProperty(exports, "DEFAULT_CORPUS_IDENTITY", { enumerable: true, get: function () { return defineRAG_js_1.DEFAULT_CORPUS_IDENTITY; } });
|
|
11
12
|
var indexDocuments_js_1 = require("./indexDocuments.js");
|
|
12
13
|
Object.defineProperty(exports, "indexDocuments", { enumerable: true, get: function () { return indexDocuments_js_1.indexDocuments; } });
|
|
13
14
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/rag/index.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH,+
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/rag/index.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH,+CAA2F;AAAlF,yGAAA,SAAS,OAAA;AAAE,uHAAA,uBAAuB,OAAA;AAC3C,yDAAmG;AAA1F,mHAAA,cAAc,OAAA"}
|
package/dist/memory/define.js
CHANGED
|
@@ -68,14 +68,21 @@ const define_types_js_1 = require("./define.types.js");
|
|
|
68
68
|
function defineMemory(options) {
|
|
69
69
|
validate(options);
|
|
70
70
|
const pipeline = buildPipeline(options);
|
|
71
|
+
// `readOnly` drops the write half entirely (8.8.0). Not "writes are
|
|
72
|
+
// skipped at runtime" — the subflow is never compiled and never mounted,
|
|
73
|
+
// so a read-only memory has no write stage in its chart, no write commit
|
|
74
|
+
// in its log, and nothing to disable later by accident.
|
|
75
|
+
const write = options.readOnly === true ? undefined : pipeline.write;
|
|
71
76
|
const definition = {
|
|
72
77
|
id: options.id,
|
|
73
78
|
...(options.description !== undefined && { description: options.description }),
|
|
74
79
|
type: options.type,
|
|
75
80
|
read: brandPipeline(pipeline.read),
|
|
76
|
-
...(
|
|
81
|
+
...(write !== undefined && { write: brandPipeline(write) }),
|
|
77
82
|
timing: options.timing ?? define_types_js_1.MEMORY_TIMING.TURN_START,
|
|
78
83
|
...(options.redact !== undefined && { redact: options.redact }),
|
|
84
|
+
...(options.corpus !== undefined && { corpus: options.corpus }),
|
|
85
|
+
...(options.flavor !== undefined && { flavor: options.flavor }),
|
|
79
86
|
...(options.type === define_types_js_1.MEMORY_TYPES.CAUSAL &&
|
|
80
87
|
options.projection !== undefined && {
|
|
81
88
|
projection: options.projection,
|
|
@@ -97,6 +104,26 @@ function validate(options) {
|
|
|
97
104
|
throw new Error(`defineMemory[id=${options.id}]: \`store\` is required. ` +
|
|
98
105
|
'Pass `new InMemoryStore()` for dev/tests, or a backed store for production.');
|
|
99
106
|
}
|
|
107
|
+
// The shorthand and the spelled-out rule EXCLUDE. Accepting both would
|
|
108
|
+
// mean one of two numbers silently loses, and the recording would name
|
|
109
|
+
// a `k` the run did not use.
|
|
110
|
+
// Read through a structural shape, not the union: the union's arms
|
|
111
|
+
// declare the OTHER spelling as `never`, so intersecting them here
|
|
112
|
+
// would make the very field this check reads unreadable.
|
|
113
|
+
const strategy = options.strategy;
|
|
114
|
+
if (strategy?.retrieval !== undefined) {
|
|
115
|
+
const shorthand = [];
|
|
116
|
+
if (strategy.topK !== undefined)
|
|
117
|
+
shorthand.push('`topK`');
|
|
118
|
+
if (strategy.threshold !== undefined)
|
|
119
|
+
shorthand.push('`threshold`');
|
|
120
|
+
if (shorthand.length > 0) {
|
|
121
|
+
throw new Error(`defineMemory[id=${options.id}]: ${shorthand.join(' and ')} cannot be combined with ` +
|
|
122
|
+
'`retrieval` — they are two spellings of the same rule and could disagree. ' +
|
|
123
|
+
`Keep the strategy (\`retrieval: ${strategy.retrieval.name}({ ... })\`) and drop ` +
|
|
124
|
+
`${shorthand.join('/')}, or drop \`retrieval\`.`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
100
127
|
}
|
|
101
128
|
// ─── Pipeline dispatch ─────────────────────────────────────────────
|
|
102
129
|
function buildPipeline(options) {
|
|
@@ -181,8 +208,11 @@ function buildSemanticPipeline(options) {
|
|
|
181
208
|
const config = {
|
|
182
209
|
store: options.store,
|
|
183
210
|
embedder: t.embedder,
|
|
184
|
-
k: t.topK,
|
|
211
|
+
...(t.topK !== undefined && { k: t.topK }),
|
|
185
212
|
...(t.threshold !== undefined && { minScore: t.threshold }),
|
|
213
|
+
...(t.embedderId !== undefined && { embedderId: t.embedderId }),
|
|
214
|
+
...(t.retrieval !== undefined && { retrieval: t.retrieval }),
|
|
215
|
+
...(options.flavor !== undefined && { flavor: options.flavor }),
|
|
186
216
|
};
|
|
187
217
|
return (0, semantic_js_1.semanticPipeline)(config);
|
|
188
218
|
}
|
|
@@ -272,6 +302,12 @@ function buildCausalPipeline(options) {
|
|
|
272
302
|
'Pass `new InMemoryStore({ embedder })` for dev/tests, or a vector adapter ' +
|
|
273
303
|
'(pgvector, Pinecone, Qdrant) for production.');
|
|
274
304
|
}
|
|
305
|
+
// CAUSAL predates the retrieval seam and reads the shorthand only. A
|
|
306
|
+
// strategy passed here would be accepted and ignored, so it is refused.
|
|
307
|
+
if (s.retrieval !== undefined) {
|
|
308
|
+
throw new Error(`defineMemory[${options.id}]: CAUSAL type does not read \`retrieval\` — snapshot recall ` +
|
|
309
|
+
'matches a stored query vector, not a document pool. Use `topK` + `threshold`.');
|
|
310
|
+
}
|
|
275
311
|
const config = {
|
|
276
312
|
store: options.store,
|
|
277
313
|
embedder: s.embedder,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/memory/define.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;;;AAEH,yDAAkD;AAElD,sDAAoF;AACpF,0DAA4D;AAC5D,wDAAuF;AACvF,gDAA2E;AAC3E,0DAA0F;AAC1F,gDAA2E;AAC3E,gDAAkF;AAGlF,uDAgB2B;AAG3B,sEAAsE;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,SAAgB,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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"}
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
* @see MEMORY.md for the load-bearing design memory
|
|
41
41
|
*/
|
|
42
42
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
-
exports.isMemoryInjectionKey = exports.memoryInjectionKey = exports.MEMORY_INJECTION_KEY_PREFIX = exports.isSnapshotProjection = exports.isMemoryTiming = exports.isMemoryStrategyKind = exports.isMemoryType = exports.SNAPSHOT_PROJECTIONS = exports.MEMORY_TIMING = exports.MEMORY_STRATEGIES = exports.MEMORY_TYPES = void 0;
|
|
43
|
+
exports.isRetrievalEvidenceKey = exports.retrievalEvidenceKey = exports.RETRIEVAL_EVIDENCE_KEY_PREFIX = exports.isMemoryInjectionKey = exports.memoryInjectionKey = exports.MEMORY_INJECTION_KEY_PREFIX = exports.isSnapshotProjection = exports.isMemoryTiming = exports.isMemoryStrategyKind = exports.isMemoryType = exports.SNAPSHOT_PROJECTIONS = exports.MEMORY_TIMING = exports.MEMORY_STRATEGIES = exports.MEMORY_TYPES = void 0;
|
|
44
44
|
// ─── Const-objects (SSOT) ───────────────────────────────────────────
|
|
45
45
|
/**
|
|
46
46
|
* What shape of memory you're keeping.
|
|
@@ -135,4 +135,24 @@ function isMemoryInjectionKey(key) {
|
|
|
135
135
|
return key.startsWith(exports.MEMORY_INJECTION_KEY_PREFIX);
|
|
136
136
|
}
|
|
137
137
|
exports.isMemoryInjectionKey = isMemoryInjectionKey;
|
|
138
|
+
/**
|
|
139
|
+
* Scope-key prefix for the retrieval record a memory lifts to the parent
|
|
140
|
+
* scope (8.8.0), one key per memory id — the same layering rule as
|
|
141
|
+
* `memoryInjection_`.
|
|
142
|
+
*
|
|
143
|
+
* This key is the reason a backward slice can now reach a passage. It is
|
|
144
|
+
* ORDINARY root state, so `sliceForKey('finalContent')` walks the
|
|
145
|
+
* system-prompt write, and the record naming every candidate id and score
|
|
146
|
+
* is one hop away. Before 8.8.0 the scores existed only inside the memory
|
|
147
|
+
* subflow, which the root commit log never sees.
|
|
148
|
+
*/
|
|
149
|
+
exports.RETRIEVAL_EVIDENCE_KEY_PREFIX = 'retrievalEvidence_';
|
|
150
|
+
function retrievalEvidenceKey(id) {
|
|
151
|
+
return `${exports.RETRIEVAL_EVIDENCE_KEY_PREFIX}${id}`;
|
|
152
|
+
}
|
|
153
|
+
exports.retrievalEvidenceKey = retrievalEvidenceKey;
|
|
154
|
+
function isRetrievalEvidenceKey(key) {
|
|
155
|
+
return key.startsWith(exports.RETRIEVAL_EVIDENCE_KEY_PREFIX);
|
|
156
|
+
}
|
|
157
|
+
exports.isRetrievalEvidenceKey = isRetrievalEvidenceKey;
|
|
138
158
|
//# 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;AACU,QAAA,YAAY,GAAG;IAC1B,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;CACR,CAAC;AAGX;;;;;;;;GAQG;AACU,QAAA,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;AACU,QAAA,aAAa,GAAG;IAC3B,eAAe,EAAE,iBAAiB;IAClC,UAAU,EAAE,YAAY;CAChB,CAAC;AAGX;;;;;;;;GAQG;AACU,QAAA,oBAAoB,GAAG;IAClC,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;IACtB,IAAI,EAAE,MAAM;CACJ,CAAC;AAqTX,uEAAuE;AAEvE,SAAgB,YAAY,CAAC,KAAa;IACxC,OAAQ,MAAM,CAAC,MAAM,CAAC,oBAAY,CAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAFD,oCAEC;AAED,SAAgB,oBAAoB,CAAC,KAAa;IAChD,OAAQ,MAAM,CAAC,MAAM,CAAC,yBAAiB,CAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAFD,oDAEC;AAED,SAAgB,cAAc,CAAC,KAAa;IAC1C,OAAQ,MAAM,CAAC,MAAM,CAAC,qBAAa,CAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAFD,wCAEC;AAED,SAAgB,oBAAoB,CAAC,KAAa;IAChD,OAAQ,MAAM,CAAC,MAAM,CAAC,4BAAoB,CAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAFD,oDAEC;AAED,uEAAuE;AAEvE;;;;;GAKG;AACU,QAAA,2BAA2B,GAAG,kBAA2B,CAAC;AAEvE,SAAgB,kBAAkB,CAAC,EAAU;IAC3C,OAAO,GAAG,mCAA2B,GAAG,EAAE,EAAE,CAAC;AAC/C,CAAC;AAFD,gDAEC;AAED,SAAgB,oBAAoB,CAAC,GAAW;IAC9C,OAAO,GAAG,CAAC,UAAU,CAAC,mCAA2B,CAAC,CAAC;AACrD,CAAC;AAFD,oDAEC;AAED;;;;;;;;;;GAUG;AACU,QAAA,6BAA6B,GAAG,oBAA6B,CAAC;AAE3E,SAAgB,oBAAoB,CAAC,EAAU;IAC7C,OAAO,GAAG,qCAA6B,GAAG,EAAE,EAAE,CAAC;AACjD,CAAC;AAFD,oDAEC;AAED,SAAgB,sBAAsB,CAAC,GAAW;IAChD,OAAO,GAAG,CAAC,UAAU,CAAC,qCAA6B,CAAC,CAAC;AACvD,CAAC;AAFD,wDAEC"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.loadRelevant = void 0;
|
|
3
|
+
exports.__resetEmptyCorpusWarnings = exports.loadRelevant = void 0;
|
|
4
|
+
const index_js_1 = require("../identity/index.js");
|
|
5
|
+
const fnv1a_js_1 = require("../../lib/fnv1a.js");
|
|
6
|
+
const provenance_js_1 = require("../retrieval/provenance.js");
|
|
7
|
+
const topK_js_1 = require("../retrieval/topK.js");
|
|
4
8
|
/**
|
|
5
9
|
* Default query extractor — last user message.
|
|
6
10
|
*
|
|
@@ -22,6 +26,12 @@ function defaultQueryFrom(scope) {
|
|
|
22
26
|
}
|
|
23
27
|
return '';
|
|
24
28
|
}
|
|
29
|
+
/** Emit through the scope's emit channel when there is one (there always is under an Agent). */
|
|
30
|
+
function emit(scope, type, payload) {
|
|
31
|
+
const emitter = scope.$emit;
|
|
32
|
+
if (typeof emitter === 'function')
|
|
33
|
+
emitter.call(scope, type, payload);
|
|
34
|
+
}
|
|
25
35
|
function loadRelevant(config) {
|
|
26
36
|
const { store, embedder } = config;
|
|
27
37
|
if (!store.search) {
|
|
@@ -29,12 +39,43 @@ function loadRelevant(config) {
|
|
|
29
39
|
'Use a vector-capable adapter (InMemoryStore, pgvector, Pinecone, ...).');
|
|
30
40
|
}
|
|
31
41
|
const queryFrom = config.queryFrom ?? defaultQueryFrom;
|
|
32
|
-
|
|
42
|
+
// The shorthand and the strategy are two spellings of one rule; the
|
|
43
|
+
// strategy wins when both are present, and `defineMemory` refuses the
|
|
44
|
+
// contradiction before it ever gets here.
|
|
45
|
+
const strategy = config.retrieval ??
|
|
46
|
+
(0, topK_js_1.topK)({
|
|
47
|
+
k: config.k ?? 20,
|
|
48
|
+
threshold: config.minScore === undefined ? null : config.minScore,
|
|
49
|
+
// With no explicit strategy there is no explicit reject window
|
|
50
|
+
// either; 10 near-misses is enough to diagnose a threshold without
|
|
51
|
+
// making every retrieval read a large page.
|
|
52
|
+
});
|
|
53
|
+
const poolSize = strategy.k + strategy.rejectWindow;
|
|
33
54
|
return async (scope) => {
|
|
34
55
|
const identity = scope.identity;
|
|
56
|
+
const namespace = (0, index_js_1.identityNamespace)(identity);
|
|
35
57
|
const text = queryFrom(scope).trim();
|
|
58
|
+
const baseEvidence = {
|
|
59
|
+
queryHash: (0, fnv1a_js_1.fnv1a)(text),
|
|
60
|
+
k: strategy.k,
|
|
61
|
+
...(strategy.threshold !== undefined && { threshold: strategy.threshold }),
|
|
62
|
+
...(config.embedderId !== undefined && { embedderId: config.embedderId }),
|
|
63
|
+
selectionOrder: 'recency',
|
|
64
|
+
namespace,
|
|
65
|
+
};
|
|
36
66
|
if (text.length === 0) {
|
|
37
67
|
scope.loaded = [];
|
|
68
|
+
const emptyQuery = {
|
|
69
|
+
...baseEvidence,
|
|
70
|
+
consideredCount: 0,
|
|
71
|
+
admittedCount: 0,
|
|
72
|
+
rejectedCount: 0,
|
|
73
|
+
candidates: [],
|
|
74
|
+
candidatesComplete: true,
|
|
75
|
+
// The corpus was never asked, so it cannot be reported empty.
|
|
76
|
+
corpusEmpty: false,
|
|
77
|
+
};
|
|
78
|
+
scope.retrieved = emptyQuery;
|
|
38
79
|
return;
|
|
39
80
|
}
|
|
40
81
|
const signal = scope.$getEnv?.()?.signal;
|
|
@@ -45,16 +86,105 @@ function loadRelevant(config) {
|
|
|
45
86
|
// store.search optional on MemoryStore but required when an embedder
|
|
46
87
|
// is configured (validated upstream by defineMemory).
|
|
47
88
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
48
|
-
const results = await store.search(identity, queryVec, {
|
|
49
|
-
k,
|
|
50
|
-
|
|
89
|
+
const results = (await store.search(identity, queryVec, {
|
|
90
|
+
k: poolSize,
|
|
91
|
+
// `minScore` is deliberately NOT forwarded — see the header proof.
|
|
51
92
|
...(config.tiers && { tiers: config.tiers }),
|
|
52
93
|
...(config.embedderId !== undefined && { embedderId: config.embedderId }),
|
|
94
|
+
text,
|
|
95
|
+
}));
|
|
96
|
+
// A store that ranks server-side may return entries without a usable
|
|
97
|
+
// score. We report that rather than printing a number we did not get.
|
|
98
|
+
const scoresUsable = results.every((r) => typeof r.score === 'number' && Number.isFinite(r.score));
|
|
99
|
+
const verdicts = scoresUsable
|
|
100
|
+
? strategy.select(results.map((r) => ({ entry: r.entry, score: r.score })))
|
|
101
|
+
: // No comparable scores to rule on. The store already ranked, so we
|
|
102
|
+
// honour its order and take the first `k` — and say in the record
|
|
103
|
+
// that we could not see the candidates ourselves.
|
|
104
|
+
results.map((_, i) => ({ admitted: i < strategy.k }));
|
|
105
|
+
const admitted = [];
|
|
106
|
+
const candidates = [];
|
|
107
|
+
results.forEach((result, i) => {
|
|
108
|
+
// `verdicts` is built from `results` above, one per element.
|
|
109
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
110
|
+
const verdict = verdicts[i];
|
|
111
|
+
if (verdict.admitted)
|
|
112
|
+
admitted.push(result);
|
|
113
|
+
candidates.push({
|
|
114
|
+
id: result.entry.id,
|
|
115
|
+
score: result.score,
|
|
116
|
+
rank: i + 1,
|
|
117
|
+
admitted: verdict.admitted,
|
|
118
|
+
...(verdict.reason !== undefined && { reason: verdict.reason }),
|
|
119
|
+
...(0, provenance_js_1.chunkProvenance)(result.entry.value),
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
const evidence = {
|
|
123
|
+
...baseEvidence,
|
|
124
|
+
...(queryVec.length > 0 && { dimensions: queryVec.length }),
|
|
125
|
+
consideredCount: results.length,
|
|
126
|
+
admittedCount: admitted.length,
|
|
127
|
+
rejectedCount: results.length - admitted.length,
|
|
128
|
+
...(scoresUsable
|
|
129
|
+
? { candidates }
|
|
130
|
+
: {
|
|
131
|
+
candidatesOmittedReason: 'the store ranked this query server-side and returned no comparable scores',
|
|
132
|
+
}),
|
|
133
|
+
// The pool came back full, so there may be further below-threshold
|
|
134
|
+
// entries we never saw. This never weakens the ADMITTED set (see
|
|
135
|
+
// the header proof) — only the rejected list is a sample.
|
|
136
|
+
candidatesComplete: results.length < poolSize,
|
|
137
|
+
corpusEmpty: results.length === 0,
|
|
138
|
+
};
|
|
139
|
+
scope.loaded = admitted.map((r) => r.entry);
|
|
140
|
+
scope.retrieved = evidence;
|
|
141
|
+
// Telemetry rides the emit channel, never a commit payload. The
|
|
142
|
+
// memory bridge (`memoryRecorder`) is attached on every Agent run, so
|
|
143
|
+
// this reaches `agent.on('agentfootprint.memory.retrieved')` with no
|
|
144
|
+
// extra wiring. Which retriever fired is `meta.runtimeStageId`
|
|
145
|
+
// (`sf-memory-read-<id>/load-relevant#N`) — the house correlation model.
|
|
146
|
+
emit(scope, 'agentfootprint.memory.retrieved', {
|
|
147
|
+
queryHash: evidence.queryHash,
|
|
148
|
+
k: evidence.k,
|
|
149
|
+
...(evidence.threshold !== undefined && { threshold: evidence.threshold }),
|
|
150
|
+
...(evidence.embedderId !== undefined && { embedderId: evidence.embedderId }),
|
|
151
|
+
...(evidence.dimensions !== undefined && { dimensions: evidence.dimensions }),
|
|
152
|
+
consideredCount: evidence.consideredCount,
|
|
153
|
+
admittedCount: evidence.admittedCount,
|
|
154
|
+
rejectedCount: evidence.rejectedCount,
|
|
155
|
+
...(evidence.candidates !== undefined && { candidates: evidence.candidates }),
|
|
156
|
+
...(evidence.candidatesOmittedReason !== undefined && {
|
|
157
|
+
candidatesOmittedReason: evidence.candidatesOmittedReason,
|
|
158
|
+
}),
|
|
159
|
+
candidatesComplete: evidence.candidatesComplete,
|
|
160
|
+
corpusEmpty: evidence.corpusEmpty,
|
|
161
|
+
namespace: evidence.namespace,
|
|
53
162
|
});
|
|
54
|
-
//
|
|
55
|
-
//
|
|
56
|
-
|
|
163
|
+
// An empty namespace is almost never "the corpus has nothing to say".
|
|
164
|
+
// It is almost always "the corpus was indexed under a different
|
|
165
|
+
// identity than the one being queried" — the failure that used to be
|
|
166
|
+
// completely silent. Say it once per process, naming both sides.
|
|
167
|
+
if (evidence.corpusEmpty)
|
|
168
|
+
warnEmptyCorpus(namespace);
|
|
57
169
|
};
|
|
58
170
|
}
|
|
59
171
|
exports.loadRelevant = loadRelevant;
|
|
172
|
+
const warnedNamespaces = new Set();
|
|
173
|
+
function warnEmptyCorpus(namespace) {
|
|
174
|
+
if (warnedNamespaces.has(namespace))
|
|
175
|
+
return;
|
|
176
|
+
warnedNamespaces.add(namespace);
|
|
177
|
+
console.warn(`[agentfootprint] Semantic retrieval found NO entries at all in namespace '${namespace}'.\n` +
|
|
178
|
+
` Nothing was injected, and the answer will come from the model alone.\n` +
|
|
179
|
+
` The usual cause is that the corpus was indexed under a different identity than the one\n` +
|
|
180
|
+
` being queried: indexDocuments() defaults to { conversationId: '_global' }, and a memory\n` +
|
|
181
|
+
` reads under the identity passed to agent.run() unless the retriever declares its own\n` +
|
|
182
|
+
` \`corpus\`. defineRAG() defaults \`corpus\` to { conversationId: '_global' } so the two\n` +
|
|
183
|
+
` sides meet; pass \`corpus\` explicitly when you index per tenant.`);
|
|
184
|
+
}
|
|
185
|
+
/** Test seam — the once-per-process warning is per PROCESS, which tests must be able to reset. */
|
|
186
|
+
function __resetEmptyCorpusWarnings() {
|
|
187
|
+
warnedNamespaces.clear();
|
|
188
|
+
}
|
|
189
|
+
exports.__resetEmptyCorpusWarnings = __resetEmptyCorpusWarnings;
|
|
60
190
|
//# sourceMappingURL=loadRelevant.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadRelevant.js","sourceRoot":"","sources":["../../../src/memory/embedding/loadRelevant.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"loadRelevant.js","sourceRoot":"","sources":["../../../src/memory/embedding/loadRelevant.ts"],"names":[],"mappings":";;;AAmDA,mDAAyD;AACzD,iDAA2C;AAC3C,8DAA6D;AAC7D,kDAA4C;AA+C5C;;;;;;;GAOG;AACH,SAAS,gBAAgB,CAAC,KAA8B;IACtD,MAAM,QAAQ,GAAG,KAAqD,CAAC;IACvE,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;IACzC,MAAM,MAAM,GACV,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAwB,CAAC;IAErF,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QAChC,IAAI,CAAC,CAAC,OAAO;YAAE,OAAO,CAAC,CAAC,OAAO,CAAC;IAClC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,gGAAgG;AAChG,SAAS,IAAI,CAAC,KAA8B,EAAE,IAAY,EAAE,OAAgB;IAC1E,MAAM,OAAO,GAAI,KAAgE,CAAC,KAAK,CAAC;IACxF,IAAI,OAAO,OAAO,KAAK,UAAU;QAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC;AAED,SAAgB,YAAY,CAAC,MAA0B;IACrD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IACnC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,kEAAkE;YAChE,wEAAwE,CAC3E,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,gBAAgB,CAAC;IACvD,oEAAoE;IACpE,sEAAsE;IACtE,0CAA0C;IAC1C,MAAM,QAAQ,GACZ,MAAM,CAAC,SAAS;QAChB,IAAA,cAAI,EAAC;YACH,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE;YACjB,SAAS,EAAE,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ;YACjE,+DAA+D;YAC/D,mEAAmE;YACnE,4CAA4C;SAC7C,CAAC,CAAC;IACL,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC;IAEpD,OAAO,KAAK,EAAE,KAA8B,EAAiB,EAAE;QAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,MAAM,SAAS,GAAG,IAAA,4BAAiB,EAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAErC,MAAM,YAAY,GAAG;YACnB,SAAS,EAAE,IAAA,gBAAK,EAAC,IAAI,CAAC;YACtB,CAAC,EAAE,QAAQ,CAAC,CAAC;YACb,GAAG,CAAC,QAAQ,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC1E,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;YACzE,cAAc,EAAE,SAAkB;YAClC,SAAS;SACV,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;YAClB,MAAM,UAAU,GAAsB;gBACpC,GAAG,YAAY;gBACf,eAAe,EAAE,CAAC;gBAClB,aAAa,EAAE,CAAC;gBAChB,aAAa,EAAE,CAAC;gBAChB,UAAU,EAAE,EAAE;gBACd,kBAAkB,EAAE,IAAI;gBACxB,8DAA8D;gBAC9D,WAAW,EAAE,KAAK;aACnB,CAAC;YACF,KAAK,CAAC,SAAS,GAAG,UAAU,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC;QACzC,MAAM,QAAQ,GAAG,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC;YACrC,IAAI;YACJ,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9B,CAAC,CAAa,CAAC;QAEhB,qEAAqE;QACrE,sDAAsD;QACtD,oEAAoE;QACpE,MAAM,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,MAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE;YACvD,CAAC,EAAE,QAAQ;YACX,mEAAmE;YACnE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YAC5C,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;YACzE,IAAI;SACL,CAAC,CAAoC,CAAC;QAEvC,qEAAqE;QACrE,sEAAsE;QACtE,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAC/D,CAAC;QAEF,MAAM,QAAQ,GAAgC,YAAY;YACxD,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC3E,CAAC,CAAC,mEAAmE;gBACnE,kEAAkE;gBAClE,kDAAkD;gBAClD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAoB,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE5E,MAAM,QAAQ,GAA2B,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAyB,EAAE,CAAC;QAC5C,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5B,6DAA6D;YAC7D,oEAAoE;YACpE,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;YAC7B,IAAI,OAAO,CAAC,QAAQ;gBAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5C,UAAU,CAAC,IAAI,CAAC;gBACd,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,IAAI,EAAE,CAAC,GAAG,CAAC;gBACX,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC/D,GAAG,IAAA,+BAAe,EAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;aACvC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAsB;YAClC,GAAG,YAAY;YACf,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC3D,eAAe,EAAE,OAAO,CAAC,MAAM;YAC/B,aAAa,EAAE,QAAQ,CAAC,MAAM;YAC9B,aAAa,EAAE,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;YAC/C,GAAG,CAAC,YAAY;gBACd,CAAC,CAAC,EAAE,UAAU,EAAE;gBAChB,CAAC,CAAC;oBACE,uBAAuB,EACrB,2EAA2E;iBAC9E,CAAC;YACN,mEAAmE;YACnE,iEAAiE;YACjE,0DAA0D;YAC1D,kBAAkB,EAAE,OAAO,CAAC,MAAM,GAAG,QAAQ;YAC7C,WAAW,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;SAClC,CAAC;QAEF,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAA0B,CAAC;QACrE,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC;QAE3B,gEAAgE;QAChE,sEAAsE;QACtE,qEAAqE;QACrE,+DAA+D;QAC/D,yEAAyE;QACzE,IAAI,CAAC,KAAK,EAAE,iCAAiC,EAAE;YAC7C,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,CAAC,EAAE,QAAQ,CAAC,CAAC;YACb,GAAG,CAAC,QAAQ,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC1E,GAAG,CAAC,QAAQ,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC7E,GAAG,CAAC,QAAQ,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC7E,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,GAAG,CAAC,QAAQ,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC7E,GAAG,CAAC,QAAQ,CAAC,uBAAuB,KAAK,SAAS,IAAI;gBACpD,uBAAuB,EAAE,QAAQ,CAAC,uBAAuB;aAC1D,CAAC;YACF,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB;YAC/C,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC9B,CAAC,CAAC;QAEH,sEAAsE;QACtE,gEAAgE;QAChE,qEAAqE;QACrE,iEAAiE;QACjE,IAAI,QAAQ,CAAC,WAAW;YAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC,CAAC;AACJ,CAAC;AAvJD,oCAuJC;AAED,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;AAE3C,SAAS,eAAe,CAAC,SAAiB;IACxC,IAAI,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,OAAO;IAC5C,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,IAAI,CACV,6EAA6E,SAAS,MAAM;QAC1F,0EAA0E;QAC1E,4FAA4F;QAC5F,6FAA6F;QAC7F,0FAA0F;QAC1F,6FAA6F;QAC7F,qEAAqE,CACxE,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,SAAgB,0BAA0B;IACxC,gBAAgB,CAAC,KAAK,EAAE,CAAC;AAC3B,CAAC;AAFD,gEAEC"}
|