@mce-bt/microagents-memory 0.1.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/dist/mtm.js ADDED
@@ -0,0 +1,139 @@
1
+ import pg from 'pg';
2
+ const { Pool } = pg;
3
+ /**
4
+ * Mid-Term Memory (MTM) — PostgreSQL-backed episodic summaries.
5
+ *
6
+ * Stores session summaries and recent episode timeline.
7
+ * Tagged by domain/topic for efficient querying.
8
+ * "What happened recently regarding X?"
9
+ */
10
+ export class MidTermMemory {
11
+ pool = null;
12
+ config;
13
+ agentId = '';
14
+ constructor(config) {
15
+ this.config = config;
16
+ }
17
+ async start(agentId) {
18
+ this.agentId = agentId;
19
+ this.pool = new Pool({ connectionString: this.config.connectionString });
20
+ await this.ensureSchema();
21
+ }
22
+ async stop() {
23
+ if (this.pool) {
24
+ await this.pool.end();
25
+ this.pool = null;
26
+ }
27
+ }
28
+ async ensureSchema() {
29
+ if (!this.pool)
30
+ return;
31
+ await this.pool.query(`
32
+ CREATE TABLE IF NOT EXISTS mtm_episodes (
33
+ id TEXT PRIMARY KEY,
34
+ agent_id TEXT NOT NULL,
35
+ session_id TEXT NOT NULL,
36
+ summary TEXT NOT NULL,
37
+ tags TEXT[] DEFAULT '{}',
38
+ domain TEXT,
39
+ started_at TIMESTAMPTZ NOT NULL,
40
+ ended_at TIMESTAMPTZ,
41
+ metadata JSONB DEFAULT '{}',
42
+ created_at TIMESTAMPTZ DEFAULT NOW()
43
+ );
44
+
45
+ CREATE INDEX IF NOT EXISTS idx_mtm_agent_id ON mtm_episodes(agent_id);
46
+ CREATE INDEX IF NOT EXISTS idx_mtm_domain ON mtm_episodes(domain);
47
+ CREATE INDEX IF NOT EXISTS idx_mtm_tags ON mtm_episodes USING GIN(tags);
48
+ CREATE INDEX IF NOT EXISTS idx_mtm_started_at ON mtm_episodes(started_at DESC);
49
+ `);
50
+ }
51
+ /**
52
+ * Store a session summary as an episodic memory.
53
+ */
54
+ async storeSummary(episode) {
55
+ if (!this.pool)
56
+ throw new Error('MTM not started');
57
+ const id = `ep-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
58
+ await this.pool.query(`INSERT INTO mtm_episodes (id, agent_id, session_id, summary, tags, domain, started_at, ended_at, metadata)
59
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`, [
60
+ id,
61
+ episode.agentId,
62
+ episode.sessionId,
63
+ episode.summary,
64
+ episode.tags,
65
+ episode.domain,
66
+ episode.startedAt,
67
+ episode.endedAt,
68
+ JSON.stringify(episode.metadata),
69
+ ]);
70
+ return id;
71
+ }
72
+ /**
73
+ * Get recent episodes, optionally filtered by domain or tags.
74
+ */
75
+ async getRecent(options = {}) {
76
+ if (!this.pool)
77
+ throw new Error('MTM not started');
78
+ const conditions = [];
79
+ const params = [];
80
+ let idx = 1;
81
+ // Default to current agent
82
+ conditions.push(`agent_id = $${idx}`);
83
+ params.push(options.agentId ?? this.agentId);
84
+ idx++;
85
+ if (options.domain) {
86
+ conditions.push(`domain = $${idx}`);
87
+ params.push(options.domain);
88
+ idx++;
89
+ }
90
+ if (options.tags && options.tags.length > 0) {
91
+ conditions.push(`tags && $${idx}`);
92
+ params.push(options.tags);
93
+ idx++;
94
+ }
95
+ if (options.sinceDate) {
96
+ conditions.push(`started_at >= $${idx}`);
97
+ params.push(options.sinceDate);
98
+ idx++;
99
+ }
100
+ const limit = options.limit ?? 20;
101
+ const where = conditions.join(' AND ');
102
+ const result = await this.pool.query(`SELECT * FROM mtm_episodes WHERE ${where} ORDER BY started_at DESC LIMIT $${idx}`, [...params, limit]);
103
+ return result.rows.map(this.rowToEpisode);
104
+ }
105
+ /**
106
+ * Get a specific episode by ID.
107
+ */
108
+ async getById(id) {
109
+ if (!this.pool)
110
+ throw new Error('MTM not started');
111
+ const result = await this.pool.query('SELECT * FROM mtm_episodes WHERE id = $1', [id]);
112
+ if (result.rows.length === 0)
113
+ return null;
114
+ return this.rowToEpisode(result.rows[0]);
115
+ }
116
+ /**
117
+ * Delete an episode.
118
+ */
119
+ async delete(id) {
120
+ if (!this.pool)
121
+ throw new Error('MTM not started');
122
+ await this.pool.query('DELETE FROM mtm_episodes WHERE id = $1', [id]);
123
+ }
124
+ rowToEpisode(row) {
125
+ return {
126
+ id: row.id,
127
+ agentId: row.agent_id,
128
+ sessionId: row.session_id,
129
+ summary: row.summary,
130
+ tags: row.tags,
131
+ domain: row.domain,
132
+ startedAt: new Date(row.started_at),
133
+ endedAt: row.ended_at ? new Date(row.ended_at) : null,
134
+ metadata: (row.metadata ?? {}),
135
+ createdAt: new Date(row.created_at),
136
+ };
137
+ }
138
+ }
139
+ //# sourceMappingURL=mtm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mtm.js","sourceRoot":"","sources":["../src/mtm.ts"],"names":[],"mappings":"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"}
package/dist/stm.d.ts ADDED
@@ -0,0 +1,55 @@
1
+ import type { MemoryEntry } from '@mce-bt/microagents-core';
2
+ export interface STMConfig {
3
+ redisUrl: string;
4
+ /** TTL for session data in seconds (default: 24 hours) */
5
+ sessionTtlS?: number;
6
+ /** Maximum entries per session before automatic truncation */
7
+ maxEntriesPerSession?: number;
8
+ }
9
+ /**
10
+ * Short-Term Memory (STM) — Redis-backed session log.
11
+ *
12
+ * Stores detailed, session-scoped interaction logs:
13
+ * messages, events, errors, plans, tool calls/results.
14
+ * Cross-agent within a session. TTL-based expiration.
15
+ */
16
+ export declare class ShortTermMemory {
17
+ private redis;
18
+ private config;
19
+ private agentId;
20
+ private sessionTtlS;
21
+ private maxEntriesPerSession;
22
+ constructor(config: STMConfig);
23
+ start(agentId: string): Promise<void>;
24
+ stop(): Promise<void>;
25
+ private sessionKey;
26
+ /**
27
+ * Log an entry to the session's short-term memory.
28
+ */
29
+ log(sessionId: string, entry: Omit<MemoryEntry, 'id' | 'sessionId' | 'agentId' | 'timestamp'>): Promise<void>;
30
+ /**
31
+ * Get the full session log.
32
+ */
33
+ getSessionLog(sessionId: string): Promise<MemoryEntry[]>;
34
+ /**
35
+ * Get the most recent N entries from a session.
36
+ */
37
+ getRecentEntries(sessionId: string, count: number): Promise<MemoryEntry[]>;
38
+ /**
39
+ * Get session entries filtered by type.
40
+ */
41
+ getEntriesByType(sessionId: string, type: MemoryEntry['type']): Promise<MemoryEntry[]>;
42
+ /**
43
+ * Delete all entries for a session.
44
+ */
45
+ clearSession(sessionId: string): Promise<void>;
46
+ /**
47
+ * Check if a session exists in STM.
48
+ */
49
+ sessionExists(sessionId: string): Promise<boolean>;
50
+ /**
51
+ * Get the entry count for a session.
52
+ */
53
+ getSessionLength(sessionId: string): Promise<number>;
54
+ }
55
+ //# sourceMappingURL=stm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stm.d.ts","sourceRoot":"","sources":["../src/stm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,oBAAoB,CAAS;gBAEzB,MAAM,EAAE,SAAS;IAMvB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACG,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,SAAS,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBnH;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAO9D;;OAEG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAOhF;;OAEG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAK5F;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpD;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxD;;OAEG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAI3D"}
package/dist/stm.js ADDED
@@ -0,0 +1,105 @@
1
+ import { Redis } from 'ioredis';
2
+ /**
3
+ * Short-Term Memory (STM) — Redis-backed session log.
4
+ *
5
+ * Stores detailed, session-scoped interaction logs:
6
+ * messages, events, errors, plans, tool calls/results.
7
+ * Cross-agent within a session. TTL-based expiration.
8
+ */
9
+ export class ShortTermMemory {
10
+ redis = null;
11
+ config;
12
+ agentId = '';
13
+ sessionTtlS;
14
+ maxEntriesPerSession;
15
+ constructor(config) {
16
+ this.config = config;
17
+ this.sessionTtlS = config.sessionTtlS ?? 86400; // 24h
18
+ this.maxEntriesPerSession = config.maxEntriesPerSession ?? 1000;
19
+ }
20
+ async start(agentId) {
21
+ this.agentId = agentId;
22
+ this.redis = new Redis(this.config.redisUrl);
23
+ }
24
+ async stop() {
25
+ if (this.redis) {
26
+ this.redis.disconnect();
27
+ this.redis = null;
28
+ }
29
+ }
30
+ sessionKey(sessionId) {
31
+ return `stm:${sessionId}`;
32
+ }
33
+ /**
34
+ * Log an entry to the session's short-term memory.
35
+ */
36
+ async log(sessionId, entry) {
37
+ if (!this.redis)
38
+ throw new Error('STM not started');
39
+ const fullEntry = {
40
+ ...entry,
41
+ id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
42
+ sessionId,
43
+ agentId: this.agentId,
44
+ timestamp: new Date(),
45
+ };
46
+ const key = this.sessionKey(sessionId);
47
+ await this.redis.rpush(key, JSON.stringify(fullEntry));
48
+ await this.redis.expire(key, this.sessionTtlS);
49
+ // Trim to max entries (keep most recent)
50
+ const length = await this.redis.llen(key);
51
+ if (length > this.maxEntriesPerSession) {
52
+ await this.redis.ltrim(key, length - this.maxEntriesPerSession, -1);
53
+ }
54
+ }
55
+ /**
56
+ * Get the full session log.
57
+ */
58
+ async getSessionLog(sessionId) {
59
+ if (!this.redis)
60
+ throw new Error('STM not started');
61
+ const raw = await this.redis.lrange(this.sessionKey(sessionId), 0, -1);
62
+ return raw.map((r) => JSON.parse(r));
63
+ }
64
+ /**
65
+ * Get the most recent N entries from a session.
66
+ */
67
+ async getRecentEntries(sessionId, count) {
68
+ if (!this.redis)
69
+ throw new Error('STM not started');
70
+ const raw = await this.redis.lrange(this.sessionKey(sessionId), -count, -1);
71
+ return raw.map((r) => JSON.parse(r));
72
+ }
73
+ /**
74
+ * Get session entries filtered by type.
75
+ */
76
+ async getEntriesByType(sessionId, type) {
77
+ const all = await this.getSessionLog(sessionId);
78
+ return all.filter((e) => e.type === type);
79
+ }
80
+ /**
81
+ * Delete all entries for a session.
82
+ */
83
+ async clearSession(sessionId) {
84
+ if (!this.redis)
85
+ throw new Error('STM not started');
86
+ await this.redis.del(this.sessionKey(sessionId));
87
+ }
88
+ /**
89
+ * Check if a session exists in STM.
90
+ */
91
+ async sessionExists(sessionId) {
92
+ if (!this.redis)
93
+ throw new Error('STM not started');
94
+ return (await this.redis.exists(this.sessionKey(sessionId))) === 1;
95
+ }
96
+ /**
97
+ * Get the entry count for a session.
98
+ */
99
+ async getSessionLength(sessionId) {
100
+ if (!this.redis)
101
+ throw new Error('STM not started');
102
+ return this.redis.llen(this.sessionKey(sessionId));
103
+ }
104
+ }
105
+ //# sourceMappingURL=stm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stm.js","sourceRoot":"","sources":["../src/stm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import type { MemoryManager } from './manager.js';
2
+ import type { MemoryExtractor, ExtractionStats } from './memory-extractor.js';
3
+ export interface SummarizationPipelineConfig {
4
+ /**
5
+ * LLM function used to generate session summaries.
6
+ * Takes a conversation log as input, returns a concise summary.
7
+ */
8
+ summarizeFn: (text: string) => Promise<string>;
9
+ /**
10
+ * Minimum number of STM entries before a session qualifies
11
+ * for summarization (default: 5).
12
+ */
13
+ minEntries?: number;
14
+ /**
15
+ * Whether to run knowledge extraction after summarization
16
+ * (default: true).
17
+ */
18
+ extractKnowledge?: boolean;
19
+ /**
20
+ * Whether to use contradiction-aware extraction
21
+ * (default: true).
22
+ */
23
+ contradictionAware?: boolean;
24
+ /**
25
+ * Whether to clear the STM session after summarization
26
+ * (default: false — we keep the raw log for the current session).
27
+ */
28
+ clearStmAfterSummarize?: boolean;
29
+ }
30
+ export interface PipelineResult {
31
+ sessionId: string;
32
+ summarized: boolean;
33
+ episodeId?: string;
34
+ summary?: string;
35
+ extraction?: ExtractionStats;
36
+ skippedReason?: string;
37
+ }
38
+ /**
39
+ * Auto-Summarization Pipeline — moves knowledge up the memory tiers.
40
+ *
41
+ * STM (session log) → MTM (episode summary) → LTM (knowledge graph)
42
+ *
43
+ * This pipeline:
44
+ * 1. Reads the current session from STM
45
+ * 2. Uses an LLM to produce a concise summary → stores in MTM
46
+ * 3. Extracts entities/relations from the session → stores in KG (LTM)
47
+ *
48
+ * Can be triggered manually, on session close, or by a cron/heartbeat.
49
+ */
50
+ export declare class SummarizationPipeline {
51
+ private manager;
52
+ private extractor;
53
+ private config;
54
+ private logger?;
55
+ constructor(manager: MemoryManager, extractor: MemoryExtractor | null, config: SummarizationPipelineConfig, logger?: SummarizationPipeline['logger']);
56
+ /**
57
+ * Process a single session: summarize → store episode → extract knowledge.
58
+ */
59
+ processSession(sessionId: string, options?: {
60
+ tags?: string[];
61
+ domain?: string;
62
+ metadata?: Record<string, unknown>;
63
+ }): Promise<PipelineResult>;
64
+ /**
65
+ * Process multiple sessions in batch.
66
+ * Useful for cron jobs that sweep up all completed sessions.
67
+ */
68
+ processSessions(sessionIds: string[], options?: {
69
+ tags?: string[];
70
+ domain?: string;
71
+ }): Promise<PipelineResult[]>;
72
+ /**
73
+ * Build context from entities mentioned in the session entries.
74
+ * Used for contradiction-aware extraction.
75
+ */
76
+ private buildEntityContext;
77
+ }
78
+ //# sourceMappingURL=summarization-pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarization-pipeline.d.ts","sourceRoot":"","sources":["../src/summarization-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI9E,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAE/C;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,MAAM,CAEuC;IACrD,OAAO,CAAC,MAAM,CAAC,CAKb;gBAGA,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,eAAe,GAAG,IAAI,EACjC,MAAM,EAAE,2BAA2B,EACnC,MAAM,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC;IAc1C;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;QACP,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC/B,GACL,OAAO,CAAC,cAAc,CAAC;IAiF1B;;;OAGG;IACG,eAAe,CACnB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,GAAE;QACP,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACZ,GACL,OAAO,CAAC,cAAc,EAAE,CAAC;IAS5B;;;OAGG;YACW,kBAAkB;CA8CjC"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Auto-Summarization Pipeline — moves knowledge up the memory tiers.
3
+ *
4
+ * STM (session log) → MTM (episode summary) → LTM (knowledge graph)
5
+ *
6
+ * This pipeline:
7
+ * 1. Reads the current session from STM
8
+ * 2. Uses an LLM to produce a concise summary → stores in MTM
9
+ * 3. Extracts entities/relations from the session → stores in KG (LTM)
10
+ *
11
+ * Can be triggered manually, on session close, or by a cron/heartbeat.
12
+ */
13
+ export class SummarizationPipeline {
14
+ manager;
15
+ extractor;
16
+ config;
17
+ logger;
18
+ constructor(manager, extractor, config, logger) {
19
+ this.manager = manager;
20
+ this.extractor = extractor;
21
+ this.config = {
22
+ summarizeFn: config.summarizeFn,
23
+ minEntries: config.minEntries ?? 5,
24
+ extractKnowledge: config.extractKnowledge ?? true,
25
+ contradictionAware: config.contradictionAware ?? true,
26
+ clearStmAfterSummarize: config.clearStmAfterSummarize ?? false,
27
+ };
28
+ this.logger = logger;
29
+ }
30
+ /**
31
+ * Process a single session: summarize → store episode → extract knowledge.
32
+ */
33
+ async processSession(sessionId, options = {}) {
34
+ const result = { sessionId, summarized: false };
35
+ // 1. Load STM entries
36
+ const entries = await this.manager.stm.getSessionLog(sessionId);
37
+ if (entries.length < this.config.minEntries) {
38
+ result.skippedReason = `Only ${entries.length} entries (min: ${this.config.minEntries})`;
39
+ this.logger?.debug('Session skipped', {
40
+ sessionId,
41
+ reason: result.skippedReason,
42
+ });
43
+ return result;
44
+ }
45
+ // 2. Generate summary via LLM
46
+ const logText = entries
47
+ .map((e) => {
48
+ const ts = new Date(e.timestamp).toISOString();
49
+ return `[${ts}] [${e.type}] ${e.content}`;
50
+ })
51
+ .join('\n');
52
+ const summary = await this.config.summarizeFn(logText);
53
+ // 3. Store in MTM as an episode
54
+ const episodeId = await this.manager.summarizeSession(sessionId, summary, {
55
+ tags: options.tags,
56
+ domain: options.domain,
57
+ metadata: options.metadata,
58
+ });
59
+ result.summarized = true;
60
+ result.episodeId = episodeId;
61
+ result.summary = summary;
62
+ this.logger?.info('Session summarized', {
63
+ sessionId,
64
+ episodeId,
65
+ entryCount: entries.length,
66
+ });
67
+ // 4. Extract knowledge into KG (if enabled and extractor available)
68
+ if (this.config.extractKnowledge && this.extractor) {
69
+ try {
70
+ let extractionStats;
71
+ if (this.config.contradictionAware) {
72
+ // Build existing context for contradiction-aware extraction
73
+ const existingContext = await this.buildEntityContext(entries);
74
+ extractionStats = await this.extractor.extractWithContradictions(entries, existingContext || undefined);
75
+ }
76
+ else {
77
+ extractionStats = await this.extractor.extractFromEntries(entries);
78
+ }
79
+ result.extraction = extractionStats;
80
+ this.logger?.info('Knowledge extracted from session', {
81
+ sessionId,
82
+ ...extractionStats,
83
+ });
84
+ }
85
+ catch (err) {
86
+ this.logger?.error('Knowledge extraction failed', {
87
+ sessionId,
88
+ error: err instanceof Error ? err.message : String(err),
89
+ });
90
+ }
91
+ }
92
+ // 5. Optionally clear STM
93
+ if (this.config.clearStmAfterSummarize) {
94
+ await this.manager.stm.clearSession(sessionId);
95
+ this.logger?.debug('STM cleared after summarization', { sessionId });
96
+ }
97
+ return result;
98
+ }
99
+ /**
100
+ * Process multiple sessions in batch.
101
+ * Useful for cron jobs that sweep up all completed sessions.
102
+ */
103
+ async processSessions(sessionIds, options = {}) {
104
+ const results = [];
105
+ for (const sessionId of sessionIds) {
106
+ const result = await this.processSession(sessionId, options);
107
+ results.push(result);
108
+ }
109
+ return results;
110
+ }
111
+ /**
112
+ * Build context from entities mentioned in the session entries.
113
+ * Used for contradiction-aware extraction.
114
+ */
115
+ async buildEntityContext(entries) {
116
+ if (!this.manager.kg)
117
+ return null;
118
+ // Extract potential entity names from entries (simple heuristic)
119
+ const kg = this.manager.kg;
120
+ const text = entries
121
+ .map((e) => e.content ?? '')
122
+ .join(' ');
123
+ // Quick search for entities matching terms in the text
124
+ const words = [...new Set(text.split(/[\s,;:!?.]+/).filter((w) => w.length > 2))];
125
+ // Check top words against KG (limit to avoid N+1)
126
+ const candidates = words.slice(0, 20);
127
+ const matchedEntities = [];
128
+ for (const word of candidates) {
129
+ const found = await kg.searchEntities({ query: word, limit: 1 });
130
+ if (found.length > 0) {
131
+ matchedEntities.push(found[0].name);
132
+ }
133
+ }
134
+ if (matchedEntities.length === 0)
135
+ return null;
136
+ // Build context text from matched entities
137
+ const contextParts = [];
138
+ for (const name of [...new Set(matchedEntities)]) {
139
+ const entity = await kg.getEntityByName(name);
140
+ if (!entity)
141
+ continue;
142
+ const relations = await kg.getEntityRelations(name);
143
+ const lines = [
144
+ `Entity: ${entity.name} (${entity.entityType})`,
145
+ `Observations: ${entity.observations.join('; ')}`,
146
+ ];
147
+ if (relations.length > 0) {
148
+ lines.push(`Relations: ${relations.map((r) => `${r.fromName} -[${r.relationType}]-> ${r.toName}`).join(', ')}`);
149
+ }
150
+ contextParts.push(lines.join('\n'));
151
+ }
152
+ return contextParts.join('\n\n');
153
+ }
154
+ }
155
+ //# sourceMappingURL=summarization-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarization-pipeline.js","sourceRoot":"","sources":["../src/summarization-pipeline.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@mce-bt/microagents-memory",
3
+ "version": "0.1.0",
4
+ "description": "3-tier memory system — STM (Redis), MTM (Postgres), LTM (Postgres + pgvector)",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "scripts": {
15
+ "build": "tsc --build",
16
+ "clean": "rm -rf dist tsconfig.tsbuildinfo",
17
+ "test": "vitest run --passWithNoTests"
18
+ },
19
+ "dependencies": {
20
+ "ioredis": "^5.4.0",
21
+ "pg": "^8.13.0",
22
+ "pgvector": "^0.2.0",
23
+ "zod": "^3.23.0"
24
+ },
25
+ "devDependencies": {
26
+ "@types/pg": "^8.11.0"
27
+ },
28
+ "peerDependencies": {
29
+ "@mce-bt/microagents-observability": "^0.1.0",
30
+ "@mce-bt/microagents-completion": "^0.1.0"
31
+ },
32
+ "peerDependenciesMeta": {
33
+ "@mce-bt/microagents-observability": {
34
+ "optional": true
35
+ },
36
+ "@mce-bt/microagents-completion": {
37
+ "optional": true
38
+ }
39
+ },
40
+ "license": "MIT",
41
+ "files": [
42
+ "dist"
43
+ ],
44
+ "publishConfig": {
45
+ "access": "public"
46
+ },
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "git+https://github.com/cavillo/microagents.git",
50
+ "directory": "packages/memory"
51
+ },
52
+ "homepage": "https://github.com/cavillo/microagents#readme",
53
+ "bugs": {
54
+ "url": "https://github.com/cavillo/microagents/issues"
55
+ },
56
+ "engines": {
57
+ "node": ">=20.0.0"
58
+ }
59
+ }