@framers/agentos 0.1.246 → 0.1.248

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.
Files changed (51) hide show
  1. package/dist/memory/CognitiveMemoryManager.d.ts +15 -0
  2. package/dist/memory/CognitiveMemoryManager.d.ts.map +1 -1
  3. package/dist/memory/CognitiveMemoryManager.js +15 -5
  4. package/dist/memory/CognitiveMemoryManager.js.map +1 -1
  5. package/dist/memory/core/types.d.ts +31 -0
  6. package/dist/memory/core/types.d.ts.map +1 -1
  7. package/dist/memory/index.d.ts +12 -0
  8. package/dist/memory/index.d.ts.map +1 -1
  9. package/dist/memory/index.js +24 -0
  10. package/dist/memory/index.js.map +1 -1
  11. package/dist/memory/ingest/SessionSummarizer.d.ts +155 -0
  12. package/dist/memory/ingest/SessionSummarizer.d.ts.map +1 -0
  13. package/dist/memory/ingest/SessionSummarizer.js +178 -0
  14. package/dist/memory/ingest/SessionSummarizer.js.map +1 -0
  15. package/dist/memory/retrieval/fact-supersession/FactSupersession.d.ts +82 -0
  16. package/dist/memory/retrieval/fact-supersession/FactSupersession.d.ts.map +1 -0
  17. package/dist/memory/retrieval/fact-supersession/FactSupersession.js +159 -0
  18. package/dist/memory/retrieval/fact-supersession/FactSupersession.js.map +1 -0
  19. package/dist/memory/retrieval/fact-supersession/index.d.ts +10 -0
  20. package/dist/memory/retrieval/fact-supersession/index.d.ts.map +1 -0
  21. package/dist/memory/retrieval/fact-supersession/index.js +9 -0
  22. package/dist/memory/retrieval/fact-supersession/index.js.map +1 -0
  23. package/dist/memory/retrieval/hybrid/HybridRetriever.d.ts +151 -0
  24. package/dist/memory/retrieval/hybrid/HybridRetriever.d.ts.map +1 -0
  25. package/dist/memory/retrieval/hybrid/HybridRetriever.js +287 -0
  26. package/dist/memory/retrieval/hybrid/HybridRetriever.js.map +1 -0
  27. package/dist/memory/retrieval/hybrid/index.d.ts +12 -0
  28. package/dist/memory/retrieval/hybrid/index.d.ts.map +1 -0
  29. package/dist/memory/retrieval/hybrid/index.js +10 -0
  30. package/dist/memory/retrieval/hybrid/index.js.map +1 -0
  31. package/dist/memory/retrieval/hybrid/reciprocalRankFusion.d.ts +87 -0
  32. package/dist/memory/retrieval/hybrid/reciprocalRankFusion.d.ts.map +1 -0
  33. package/dist/memory/retrieval/hybrid/reciprocalRankFusion.js +88 -0
  34. package/dist/memory/retrieval/hybrid/reciprocalRankFusion.js.map +1 -0
  35. package/dist/memory/retrieval/session/SessionRetriever.d.ts +123 -0
  36. package/dist/memory/retrieval/session/SessionRetriever.d.ts.map +1 -0
  37. package/dist/memory/retrieval/session/SessionRetriever.js +220 -0
  38. package/dist/memory/retrieval/session/SessionRetriever.js.map +1 -0
  39. package/dist/memory/retrieval/session/SessionSummaryStore.d.ts +122 -0
  40. package/dist/memory/retrieval/session/SessionSummaryStore.d.ts.map +1 -0
  41. package/dist/memory/retrieval/session/SessionSummaryStore.js +142 -0
  42. package/dist/memory/retrieval/session/SessionSummaryStore.js.map +1 -0
  43. package/dist/memory/retrieval/session/index.d.ts +12 -0
  44. package/dist/memory/retrieval/session/index.d.ts.map +1 -0
  45. package/dist/memory/retrieval/session/index.js +10 -0
  46. package/dist/memory/retrieval/session/index.js.map +1 -0
  47. package/dist/memory/retrieval/store/MemoryStore.d.ts +9 -0
  48. package/dist/memory/retrieval/store/MemoryStore.d.ts.map +1 -1
  49. package/dist/memory/retrieval/store/MemoryStore.js +6 -2
  50. package/dist/memory/retrieval/store/MemoryStore.js.map +1 -1
  51. package/package.json +1 -1
@@ -0,0 +1,220 @@
1
+ /**
2
+ * @file SessionRetriever.ts
3
+ * @description Two-stage hierarchical retriever: select top-K sessions
4
+ * by summary similarity, then return top-M chunks per selected session
5
+ * from the underlying {@link MemoryStore}. Optional rerank pass over
6
+ * the merged pool. Returns a standard `CognitiveRetrievalResult` so
7
+ * downstream consumers (prompt assembly, bench adapters) don't change
8
+ * shape.
9
+ *
10
+ * ## What this does
11
+ *
12
+ * Implements the xMemory (arxiv 2602.02007v3) / TACITREE (EMNLP 2025)
13
+ * hierarchical-retrieval pattern, session-granularity variant: a
14
+ * coverage mechanism that guarantees the reader sees chunks from
15
+ * multiple distinct sessions on multi-session queries. Single-stage
16
+ * retrieval tends to cluster on the single most-relevant session,
17
+ * missing multi-session evidence; this retriever forces diversity by
18
+ * construction.
19
+ *
20
+ * ## Why a separate class, not a `CognitiveMemoryManager` option
21
+ *
22
+ * Keeps the existing manager retrieval path untouched. Step 2 MVP.
23
+ * Future steps may promote session-level retrieval into the manager
24
+ * once it's proven on benchmarks.
25
+ *
26
+ * ## Two-stage flow
27
+ *
28
+ * 1. Stage 1: `summaryStore.querySessions(query, topK=K)` — select
29
+ * top-K sessions.
30
+ * 2. Stage 2: single `memoryStore.query(query, topK=K*M*OVER_FETCH)` —
31
+ * over-fetch to ensure chunks from Stage-1 sessions land in the
32
+ * candidate pool.
33
+ * 3. Post-filter: keep only traces whose `bench-session:<id>` tag
34
+ * matches a Stage-1 session.
35
+ * 4. Group by session, take top-`chunksPerSession` (M) per session.
36
+ * 5. Optional rerank over the merged pool.
37
+ * 6. Truncate to `recallTopK`.
38
+ *
39
+ * ## Fallbacks
40
+ *
41
+ * - Stage 1 returns zero sessions (cold scope, no summaries indexed):
42
+ * fall through to `memoryStore.query` and return its top-
43
+ * `recallTopK` directly. Diagnostics tag
44
+ * `escalations: ['session-retriever:stage1-empty']`.
45
+ * - Stage 2 post-filter wipes the pool: return the raw Stage-2 top-
46
+ * `recallTopK` without session filtering. Diagnostics tag
47
+ * `escalations: ['session-retriever:stage2-empty']`.
48
+ *
49
+ * @module agentos/memory/retrieval/session/SessionRetriever
50
+ */
51
+ /**
52
+ * Over-fetch multiplier applied to the Stage-2 `MemoryStore.query`
53
+ * topK, so post-filtering by session tag has enough candidates to
54
+ * find chunks from every Stage-1 session.
55
+ *
56
+ * At the defaults (K=5 sessions × M=3 chunks), Stage-2 requests
57
+ * `5 * 3 * 3 = 45` candidates. Empirically this is enough overhead
58
+ * even when the question is topically dominated by one session.
59
+ */
60
+ const STAGE2_OVER_FETCH = 3;
61
+ /**
62
+ * Two-stage hierarchical retriever.
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * const retriever = new SessionRetriever({
67
+ * summaryStore,
68
+ * memoryStore,
69
+ * embeddingManager,
70
+ * rerankerService,
71
+ * defaultTopSessions: 5,
72
+ * defaultChunksPerSession: 3,
73
+ * });
74
+ * const result = await retriever.retrieve(
75
+ * 'What did the user say about their rescue dog?',
76
+ * { valence: 0, arousal: 0, dominance: 0 },
77
+ * { scope: 'user', scopeId: 'u42' },
78
+ * { recallTopK: 10 },
79
+ * );
80
+ * ```
81
+ */
82
+ export class SessionRetriever {
83
+ constructor(opts) {
84
+ this.opts = {
85
+ summaryStore: opts.summaryStore,
86
+ memoryStore: opts.memoryStore,
87
+ embeddingManager: opts.embeddingManager,
88
+ rerankerService: opts.rerankerService,
89
+ defaultTopSessions: opts.defaultTopSessions ?? 5,
90
+ defaultChunksPerSession: opts.defaultChunksPerSession ?? 3,
91
+ };
92
+ }
93
+ /**
94
+ * Two-stage retrieve. Returns a `CognitiveRetrievalResult`
95
+ * compatible with the existing `CognitiveMemoryManager.retrieve`
96
+ * shape.
97
+ *
98
+ * Diagnostics are best-effort: timings reflect wall-clock of each
99
+ * stage, not the cognitive-scorer internal accounting.
100
+ */
101
+ async retrieve(query, mood, scope, options = {}) {
102
+ const startTime = Date.now();
103
+ const K = options.topSessions ?? this.opts.defaultTopSessions;
104
+ const M = options.chunksPerSession ?? this.opts.defaultChunksPerSession;
105
+ const recallTopK = options.recallTopK ?? 10;
106
+ const tagPrefix = options.sessionTagPrefix ?? 'bench-session:';
107
+ // Stage 1: select top-K sessions by summary similarity.
108
+ const stage1Start = Date.now();
109
+ const sessions = await this.opts.summaryStore.querySessions(query, {
110
+ scope: scope.scope,
111
+ scopeId: scope.scopeId,
112
+ topK: K,
113
+ });
114
+ const stage1Ms = Date.now() - stage1Start;
115
+ // Stage-1 fallback: no summaries indexed for this scope.
116
+ if (sessions.length === 0) {
117
+ const { scored, timings } = await this.opts.memoryStore.query(query, mood, {
118
+ topK: recallTopK,
119
+ scopes: [scope],
120
+ });
121
+ return this.buildResult(scored.slice(0, recallTopK), {
122
+ fallback: 'stage1-empty',
123
+ candidatesScanned: scored.length,
124
+ vectorSearchMs: timings.vectorSearchMs,
125
+ scoringMs: timings.scoringMs,
126
+ totalMs: Date.now() - startTime,
127
+ });
128
+ }
129
+ // Stage 2: over-fetch from MemoryStore so post-filter has enough
130
+ // candidates per session.
131
+ const overFetchTopK = K * M * STAGE2_OVER_FETCH;
132
+ const { scored: stage2Pool, timings: stage2Timings } = await this.opts.memoryStore.query(query, mood, { topK: overFetchTopK, scopes: [scope] });
133
+ // Post-filter: keep only traces whose bench-session tag matches a
134
+ // Stage-1 session. Group by session.
135
+ const selectedIds = new Set(sessions.map((s) => s.sessionId));
136
+ const bySession = new Map();
137
+ for (const trace of stage2Pool) {
138
+ const tag = trace.tags.find((t) => t.startsWith(tagPrefix));
139
+ if (!tag)
140
+ continue;
141
+ const sid = tag.slice(tagPrefix.length);
142
+ if (!selectedIds.has(sid))
143
+ continue;
144
+ const bucket = bySession.get(sid) ?? [];
145
+ bucket.push(trace);
146
+ bySession.set(sid, bucket);
147
+ }
148
+ // Stage-2 fallback: post-filter wiped the pool. Return raw Stage-2
149
+ // top-recallTopK without session filtering.
150
+ if (bySession.size === 0) {
151
+ return this.buildResult(stage2Pool.slice(0, recallTopK), {
152
+ fallback: 'stage2-empty',
153
+ candidatesScanned: stage2Pool.length,
154
+ vectorSearchMs: stage2Timings.vectorSearchMs,
155
+ scoringMs: stage2Timings.scoringMs,
156
+ totalMs: Date.now() - startTime,
157
+ });
158
+ }
159
+ // Take top-M per session (bucket is already sorted by retrieval
160
+ // score — MemoryStore.query returns scored traces in descending
161
+ // order).
162
+ const merged = [];
163
+ for (const [, bucket] of bySession)
164
+ merged.push(...bucket.slice(0, M));
165
+ // Optional rerank over the merged pool.
166
+ const final = merged;
167
+ if (this.opts.rerankerService && final.length > 0) {
168
+ try {
169
+ const rerankerOutput = await this.opts.rerankerService.rerank({
170
+ query,
171
+ documents: final.map((t) => ({
172
+ id: t.id,
173
+ content: t.content,
174
+ originalScore: t.retrievalScore,
175
+ })),
176
+ }, { topN: final.length });
177
+ const rerankedScores = new Map(rerankerOutput.results.map((r) => [r.id, r.relevanceScore]));
178
+ for (const trace of final) {
179
+ const neural = rerankedScores.get(trace.id);
180
+ if (neural !== undefined) {
181
+ // Blend identical to CognitiveMemoryManager.retrieve: 0.7 cognitive + 0.3 neural.
182
+ trace.retrievalScore = 0.7 * trace.retrievalScore + 0.3 * neural;
183
+ }
184
+ }
185
+ final.sort((a, b) => b.retrievalScore - a.retrievalScore);
186
+ }
187
+ catch {
188
+ // Reranker errors are non-critical; degrade to cognitive-only ordering.
189
+ }
190
+ }
191
+ else {
192
+ // No rerank: sort by cognitive score (bucket grouping left order
193
+ // per-session, not global).
194
+ final.sort((a, b) => b.retrievalScore - a.retrievalScore);
195
+ }
196
+ // Truncate to recallTopK.
197
+ const truncated = final.slice(0, recallTopK);
198
+ return this.buildResult(truncated, {
199
+ candidatesScanned: stage2Pool.length,
200
+ vectorSearchMs: stage2Timings.vectorSearchMs + stage1Ms,
201
+ scoringMs: stage2Timings.scoringMs,
202
+ totalMs: Date.now() - startTime,
203
+ });
204
+ }
205
+ /** Assemble the CognitiveRetrievalResult shape. */
206
+ buildResult(retrieved, d) {
207
+ return {
208
+ retrieved,
209
+ partiallyRetrieved: [],
210
+ diagnostics: {
211
+ candidatesScanned: d.candidatesScanned,
212
+ vectorSearchTimeMs: d.vectorSearchMs,
213
+ scoringTimeMs: d.scoringMs,
214
+ totalTimeMs: d.totalMs,
215
+ ...(d.fallback ? { escalations: [`session-retriever:${d.fallback}`] } : {}),
216
+ },
217
+ };
218
+ }
219
+ }
220
+ //# sourceMappingURL=SessionRetriever.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionRetriever.js","sourceRoot":"","sources":["../../../../src/memory/retrieval/session/SessionRetriever.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * @file SessionSummaryStore.ts
3
+ * @description Vector store for session-level summaries, used by
4
+ * {@link SessionRetriever} to select top-K relevant sessions at
5
+ * retrieval time before drilling into chunk-level results.
6
+ *
7
+ * ## What this does
8
+ *
9
+ * Maintains a per-scope vector collection
10
+ * `<collectionPrefix>_<scope>_<scopeId>` (default prefix
11
+ * `cogmem_sessions`) with one vector per unique session. Each vector
12
+ * is the embedding of that session's {@link SessionSummarizer}
13
+ * output: a 50-100 token dense fact-laden summary.
14
+ *
15
+ * ## Why a dedicated collection
16
+ *
17
+ * Session summaries are a structurally different retrieval target
18
+ * than individual memory traces: there's one per conversation thread,
19
+ * they live longer, and they want to be searched in their own metric
20
+ * space without dilution from per-chunk vectors. A dedicated
21
+ * collection also lets {@link SessionRetriever} do Stage 1 session
22
+ * selection with a single cheap vector search, independent of the
23
+ * chunk-level trace store.
24
+ *
25
+ * ## Relation to Anthropic contextual retrieval
26
+ *
27
+ * `SessionSummarizer` implements the Anthropic Sep-2024
28
+ * contextual-retrieval pattern at session granularity: it prepends
29
+ * a summary to every chunk before embedding. This store is the
30
+ * retrieval-time counterpart. It lets callers search the summaries
31
+ * directly rather than relying on the prepended-summary chunks to
32
+ * surface via their own query embeddings. Together they form the
33
+ * `SessionRetriever` two-stage flow documented in the Step 2 design
34
+ * spec.
35
+ *
36
+ * @module agentos/memory/retrieval/session/SessionSummaryStore
37
+ */
38
+ import type { IVectorStore } from '../../../core/vector-store/IVectorStore.js';
39
+ import type { IEmbeddingManager } from '../../../core/embeddings/IEmbeddingManager.js';
40
+ import type { MemoryScope } from '../../core/types.js';
41
+ /**
42
+ * Options for constructing a {@link SessionSummaryStore}.
43
+ */
44
+ export interface SessionSummaryStoreOptions {
45
+ /** Vector store to use for the summary collection. */
46
+ vectorStore: IVectorStore;
47
+ /** Embedding manager shared with the rest of the memory stack (reuse for cache hits). */
48
+ embeddingManager: IEmbeddingManager;
49
+ /**
50
+ * Collection-name prefix. Final collection is
51
+ * `<prefix>_<scope>_<scopeId>`.
52
+ * @default 'cogmem_sessions'
53
+ */
54
+ collectionPrefix?: string;
55
+ }
56
+ /**
57
+ * Input for {@link SessionSummaryStore.indexSession}.
58
+ */
59
+ export interface IndexSessionInput {
60
+ scope: MemoryScope;
61
+ scopeId: string;
62
+ sessionId: string;
63
+ /** The summary text produced by `SessionSummarizer`. Must be non-empty. */
64
+ summary: string;
65
+ /** Optional ISO date for the session. Stored for future temporal filtering. */
66
+ sessionDate?: string;
67
+ }
68
+ /**
69
+ * One row from {@link SessionSummaryStore.querySessions}.
70
+ */
71
+ export interface QueriedSession {
72
+ sessionId: string;
73
+ /** Similarity in the vector store's configured metric (cosine by default, range [-1, 1]). */
74
+ similarityScore: number;
75
+ }
76
+ /**
77
+ * Dedicated vector store wrapper for session-level summaries.
78
+ *
79
+ * @example
80
+ * ```ts
81
+ * const store = new SessionSummaryStore({ vectorStore, embeddingManager });
82
+ * await store.indexSession({
83
+ * scope: 'user', scopeId: 'u42', sessionId: 's-7',
84
+ * summary: 'User discussed adopting a rescue dog from Portland shelter...',
85
+ * });
86
+ * const hits = await store.querySessions('rescue dog adoption', {
87
+ * scope: 'user', scopeId: 'u42', topK: 5,
88
+ * });
89
+ * ```
90
+ */
91
+ export declare class SessionSummaryStore {
92
+ private readonly vectorStore;
93
+ private readonly embeddingManager;
94
+ private readonly collectionPrefix;
95
+ constructor(opts: SessionSummaryStoreOptions);
96
+ /**
97
+ * Embed the summary and upsert into the scope-specific collection.
98
+ * Upsert is idempotent: re-indexing the same `sessionId` replaces
99
+ * the prior vector rather than appending a duplicate.
100
+ */
101
+ indexSession(input: IndexSessionInput): Promise<void>;
102
+ /**
103
+ * Embed the query and return the top-K sessions for the given
104
+ * scope, ordered by descending similarity. Returns `[]` when the
105
+ * collection does not yet exist (cold scope).
106
+ */
107
+ querySessions(query: string, options: {
108
+ scope: MemoryScope;
109
+ scopeId: string;
110
+ topK: number;
111
+ }): Promise<QueriedSession[]>;
112
+ /** Compose the per-scope collection name. */
113
+ private collectionName;
114
+ /**
115
+ * Lazily create the collection with the embedding dimension from
116
+ * the first indexed vector. Idempotent on the `InMemoryVectorStore`
117
+ * implementation; other providers' `createCollection` variants
118
+ * honour `overwriteIfExists: false`.
119
+ */
120
+ private ensureCollection;
121
+ }
122
+ //# sourceMappingURL=SessionSummaryStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionSummaryStore.d.ts","sourceRoot":"","sources":["../../../../src/memory/retrieval/session/SessionSummaryStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,4CAA4C,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,sDAAsD;IACtD,WAAW,EAAE,YAAY,CAAC;IAC1B,yFAAyF;IACzF,gBAAgB,EAAE,iBAAiB,CAAC;IACpC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,6FAA6F;IAC7F,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoB;IACrD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAE9B,IAAI,EAAE,0BAA0B;IAM5C;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB3D;;;;OAIG;IACG,aAAa,CACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAC7D,OAAO,CAAC,cAAc,EAAE,CAAC;IAwB5B,6CAA6C;IAC7C,OAAO,CAAC,cAAc;IAItB;;;;;OAKG;YACW,gBAAgB;CAc/B"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * @file SessionSummaryStore.ts
3
+ * @description Vector store for session-level summaries, used by
4
+ * {@link SessionRetriever} to select top-K relevant sessions at
5
+ * retrieval time before drilling into chunk-level results.
6
+ *
7
+ * ## What this does
8
+ *
9
+ * Maintains a per-scope vector collection
10
+ * `<collectionPrefix>_<scope>_<scopeId>` (default prefix
11
+ * `cogmem_sessions`) with one vector per unique session. Each vector
12
+ * is the embedding of that session's {@link SessionSummarizer}
13
+ * output: a 50-100 token dense fact-laden summary.
14
+ *
15
+ * ## Why a dedicated collection
16
+ *
17
+ * Session summaries are a structurally different retrieval target
18
+ * than individual memory traces: there's one per conversation thread,
19
+ * they live longer, and they want to be searched in their own metric
20
+ * space without dilution from per-chunk vectors. A dedicated
21
+ * collection also lets {@link SessionRetriever} do Stage 1 session
22
+ * selection with a single cheap vector search, independent of the
23
+ * chunk-level trace store.
24
+ *
25
+ * ## Relation to Anthropic contextual retrieval
26
+ *
27
+ * `SessionSummarizer` implements the Anthropic Sep-2024
28
+ * contextual-retrieval pattern at session granularity: it prepends
29
+ * a summary to every chunk before embedding. This store is the
30
+ * retrieval-time counterpart. It lets callers search the summaries
31
+ * directly rather than relying on the prepended-summary chunks to
32
+ * surface via their own query embeddings. Together they form the
33
+ * `SessionRetriever` two-stage flow documented in the Step 2 design
34
+ * spec.
35
+ *
36
+ * @module agentos/memory/retrieval/session/SessionSummaryStore
37
+ */
38
+ /**
39
+ * Dedicated vector store wrapper for session-level summaries.
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * const store = new SessionSummaryStore({ vectorStore, embeddingManager });
44
+ * await store.indexSession({
45
+ * scope: 'user', scopeId: 'u42', sessionId: 's-7',
46
+ * summary: 'User discussed adopting a rescue dog from Portland shelter...',
47
+ * });
48
+ * const hits = await store.querySessions('rescue dog adoption', {
49
+ * scope: 'user', scopeId: 'u42', topK: 5,
50
+ * });
51
+ * ```
52
+ */
53
+ export class SessionSummaryStore {
54
+ constructor(opts) {
55
+ this.vectorStore = opts.vectorStore;
56
+ this.embeddingManager = opts.embeddingManager;
57
+ this.collectionPrefix = opts.collectionPrefix ?? 'cogmem_sessions';
58
+ }
59
+ /**
60
+ * Embed the summary and upsert into the scope-specific collection.
61
+ * Upsert is idempotent: re-indexing the same `sessionId` replaces
62
+ * the prior vector rather than appending a duplicate.
63
+ */
64
+ async indexSession(input) {
65
+ if (!input.summary || input.summary.trim().length === 0)
66
+ return;
67
+ const collection = this.collectionName(input.scope, input.scopeId);
68
+ const { embeddings } = await this.embeddingManager.generateEmbeddings({
69
+ texts: input.summary,
70
+ });
71
+ const embedding = embeddings[0];
72
+ await this.ensureCollection(collection, embedding.length);
73
+ const doc = {
74
+ id: input.sessionId,
75
+ textContent: input.summary,
76
+ embedding,
77
+ metadata: {
78
+ sessionId: input.sessionId,
79
+ scopeId: input.scopeId,
80
+ createdAt: Date.now(),
81
+ ...(input.sessionDate ? { sessionDate: input.sessionDate } : {}),
82
+ },
83
+ };
84
+ await this.vectorStore.upsert(collection, [doc]);
85
+ }
86
+ /**
87
+ * Embed the query and return the top-K sessions for the given
88
+ * scope, ordered by descending similarity. Returns `[]` when the
89
+ * collection does not yet exist (cold scope).
90
+ */
91
+ async querySessions(query, options) {
92
+ const collection = this.collectionName(options.scope, options.scopeId);
93
+ const exists = this.vectorStore.collectionExists
94
+ ? await this.vectorStore.collectionExists(collection)
95
+ : true;
96
+ if (!exists)
97
+ return [];
98
+ const { embeddings } = await this.embeddingManager.generateEmbeddings({ texts: query });
99
+ const queryEmbedding = embeddings[0];
100
+ try {
101
+ const results = await this.vectorStore.query(collection, queryEmbedding, {
102
+ topK: options.topK,
103
+ includeMetadata: true,
104
+ });
105
+ return results.documents.map((d) => ({
106
+ sessionId: d.metadata?.sessionId ?? d.id,
107
+ similarityScore: d.similarityScore ?? 0,
108
+ }));
109
+ }
110
+ catch {
111
+ // Collection may have been dropped between the existence check
112
+ // and the query. Degrade to empty rather than throwing.
113
+ return [];
114
+ }
115
+ }
116
+ /** Compose the per-scope collection name. */
117
+ collectionName(scope, scopeId) {
118
+ return `${this.collectionPrefix}_${scope}_${scopeId}`;
119
+ }
120
+ /**
121
+ * Lazily create the collection with the embedding dimension from
122
+ * the first indexed vector. Idempotent on the `InMemoryVectorStore`
123
+ * implementation; other providers' `createCollection` variants
124
+ * honour `overwriteIfExists: false`.
125
+ */
126
+ async ensureCollection(collection, dim) {
127
+ try {
128
+ const exists = this.vectorStore.collectionExists
129
+ ? await this.vectorStore.collectionExists(collection)
130
+ : true;
131
+ if (!exists) {
132
+ await this.vectorStore.createCollection?.(collection, dim, {
133
+ overwriteIfExists: false,
134
+ });
135
+ }
136
+ }
137
+ catch {
138
+ // Some providers auto-create on first upsert — swallow here.
139
+ }
140
+ }
141
+ }
142
+ //# sourceMappingURL=SessionSummaryStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionSummaryStore.js","sourceRoot":"","sources":["../../../../src/memory/retrieval/session/SessionSummaryStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @file index.ts
3
+ * @description Barrel exports for session-level hierarchical
4
+ * retrieval (Step 2 of the RAG stack sequenced rollout).
5
+ *
6
+ * @module agentos/memory/retrieval/session
7
+ */
8
+ export { SessionSummaryStore } from './SessionSummaryStore.js';
9
+ export type { SessionSummaryStoreOptions, IndexSessionInput, QueriedSession, } from './SessionSummaryStore.js';
10
+ export { SessionRetriever } from './SessionRetriever.js';
11
+ export type { SessionRetrieverOptions, SessionRetrieveOptions, } from './SessionRetriever.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/memory/retrieval/session/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EACV,0BAA0B,EAC1B,iBAAiB,EACjB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EACV,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @file index.ts
3
+ * @description Barrel exports for session-level hierarchical
4
+ * retrieval (Step 2 of the RAG stack sequenced rollout).
5
+ *
6
+ * @module agentos/memory/retrieval/session
7
+ */
8
+ export { SessionSummaryStore } from './SessionSummaryStore.js';
9
+ export { SessionRetriever } from './SessionRetriever.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/memory/retrieval/session/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAO/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -72,6 +72,15 @@ export declare class MemoryStore {
72
72
  query(queryText: string, currentMood: PADState, options?: CognitiveRetrievalOptions): Promise<{
73
73
  scored: ScoredMemoryTrace[];
74
74
  partial: PartiallyRetrievedTrace[];
75
+ /**
76
+ * Per-stage wall-clock timings. Surfaced so
77
+ * {@link CognitiveMemoryManager} can populate its diagnostics
78
+ * with real numbers instead of the former 0-placeholder.
79
+ */
80
+ timings: {
81
+ vectorSearchMs: number;
82
+ scoringMs: number;
83
+ };
75
84
  }>;
76
85
  /**
77
86
  * Record that a memory was accessed (retrieved).
@@ -1 +1 @@
1
- {"version":3,"file":"MemoryStore.d.ts","sourceRoot":"","sources":["../../../../src/memory/retrieval/store/MemoryStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MemoryStore.d.ts","sourceRoot":"","sources":["../../../../src/memory/retrieval/store/MemoryStore.ts"],"names":[],"mappings":"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"}
@@ -217,7 +217,7 @@ export class MemoryStore {
217
217
  // Determine which collections to search
218
218
  const scopes = options.scopes?.length ? options.scopes : this.getKnownScopes();
219
219
  if (scopes.length === 0) {
220
- return { scored: [], partial: [] };
220
+ return { scored: [], partial: [], timings: { vectorSearchMs: 0, scoringMs: 0 } };
221
221
  }
222
222
  // Generate query embedding
223
223
  const embeddingResponse = await this.config.embeddingManager.generateEmbeddings({
@@ -237,6 +237,7 @@ export class MemoryStore {
237
237
  }
238
238
  // Search across scopes
239
239
  const allCandidates = [];
240
+ const vectorSearchStart = Date.now();
240
241
  for (const { scope, scopeId } of scopes) {
241
242
  const collection = collectionName(this.config.collectionPrefix, scope, scopeId);
242
243
  try {
@@ -275,6 +276,7 @@ export class MemoryStore {
275
276
  // Collection may not exist yet; skip
276
277
  }
277
278
  }
279
+ const vectorSearchMs = Date.now() - vectorSearchStart;
278
280
  // Score and rank — optional per-call scoringWeights override
279
281
  // enables ablation studies (zero one signal at a time).
280
282
  const effectiveWeights = options.scoringWeights
@@ -287,14 +289,16 @@ export class MemoryStore {
287
289
  decayConfig: this.decay,
288
290
  weights: effectiveWeights,
289
291
  };
292
+ const scoringStart = Date.now();
290
293
  const scored = scoreAndRankTraces(allCandidates, scoringContext).slice(0, topK);
291
294
  const partial = detectPartiallyRetrieved(allCandidates, now);
295
+ const scoringMs = Date.now() - scoringStart;
292
296
  // Cognitive mechanisms: RIF + FOK
293
297
  if (this.mechanismsEngine && scored.length > 0) {
294
298
  const cutoff = scored[scored.length - 1].retrievalScore;
295
299
  this.mechanismsEngine.onRetrieval(scored, allCandidates, cutoff, []);
296
300
  }
297
- return { scored, partial };
301
+ return { scored, partial, timings: { vectorSearchMs, scoringMs } };
298
302
  }
299
303
  // =========================================================================
300
304
  // Access tracking