@scotthuang/engram 0.3.27 → 0.4.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/vector.js CHANGED
@@ -1,7 +1,11 @@
1
1
  /**
2
2
  * Vector Store - 直接连接 LanceDB + OpenAI-compatible embedding API
3
+ *
4
+ * v0.4: 新增 importance / accessCount / lastAccessed 字段
5
+ * 支持记忆强化 (reinforce) 和遗忘清理 (prune)
3
6
  */
4
7
  import * as lancedb from "@lancedb/lancedb";
8
+ import { logger } from "./logger.js";
5
9
  import OpenAI from "openai";
6
10
  export class VectorStore {
7
11
  db;
@@ -12,10 +16,10 @@ export class VectorStore {
12
16
  constructor(config) {
13
17
  this.config = config;
14
18
  this.instanceId = Math.random().toString(36).slice(2, 8);
15
- console.log(`[engram:vector] VectorStore created, instanceId=${this.instanceId}`);
19
+ logger.info(`[engram:vector] VectorStore created, instanceId=${this.instanceId}`);
16
20
  }
17
21
  async startup() {
18
- console.log(`[engram:vector] startup called, instanceId=${this.instanceId}`);
22
+ logger.info(`[engram:vector] startup called, instanceId=${this.instanceId}`);
19
23
  this.db = await lancedb.connect(this.config.dbDir);
20
24
  this.client = new OpenAI({
21
25
  apiKey: this.config.embedding.apiKey,
@@ -23,13 +27,13 @@ export class VectorStore {
23
27
  });
24
28
  const tableName = this.config.tableName || "memories";
25
29
  const tables = await this.db.tableNames();
26
- console.log(`[engram:vector] startup: available tables = [${tables.join(", ")}]`);
30
+ logger.info(`[engram:vector] startup: available tables = [${tables.join(", ")}]`);
27
31
  if (tables.includes(tableName)) {
28
32
  this.table = await this.db.openTable(tableName);
29
- console.log(`[engram] Vector store connected: ${tableName} (this.table set: ${!!this.table})`);
33
+ logger.info(`[engram] Vector store connected: ${tableName} (this.table set: ${!!this.table})`);
30
34
  }
31
35
  else {
32
- console.log(`[engram] Vector store: table "${tableName}" not found, will create on first write`);
36
+ logger.info(`[engram] Vector store: table "${tableName}" not found, will create on first write`);
33
37
  }
34
38
  }
35
39
  /** 诊断方法:检查 table 是否初始化 */
@@ -49,28 +53,32 @@ export class VectorStore {
49
53
  }
50
54
  /**
51
55
  * 向量搜索
56
+ * 返回结果中包含 id,用于后续 reinforce
52
57
  */
53
58
  async search(query, limit = 5) {
54
- console.log(`[engram:vector] search called: instanceId=${this.instanceId}, this.table=${!!this.table}, this.db=${!!this.db}`);
59
+ logger.info(`[engram:vector] search called: instanceId=${this.instanceId}, this.table=${!!this.table}, this.db=${!!this.db}`);
55
60
  if (!this.table) {
56
- console.log(`[engram:vector] search skipped: table not initialized`);
61
+ logger.info(`[engram:vector] search skipped: table not initialized`);
57
62
  return [];
58
63
  }
59
64
  try {
60
- console.log(`[engram:vector] search query: "${query.slice(0, 100)}" (limit=${limit})`);
65
+ logger.info(`[engram:vector] search query: "${query.slice(0, 100)}" (limit=${limit})`);
61
66
  const queryVector = await this.embed(query);
62
- console.log(`[engram:vector] embedding dimensions: ${queryVector.length}`);
67
+ logger.info(`[engram:vector] embedding dimensions: ${queryVector.length}`);
63
68
  const results = await this.table
64
69
  .vectorSearch(queryVector)
65
70
  .limit(limit)
66
- .select(["text", "category", "createdAt", "_distance"])
71
+ .select(["id", "text", "category", "createdAt", "importance", "accessCount", "_distance"])
67
72
  .toArray();
68
- console.log(`[engram:vector] raw results: ${results.length}`);
73
+ logger.info(`[engram:vector] raw results: ${results.length}`);
69
74
  const scored = results.map((row, i) => {
70
75
  const distance = row._distance ?? 1;
71
76
  const score = 1 / (1 + distance);
72
- console.log(`[engram:vector] #${i} distance=${distance.toFixed(6)} score=${score.toFixed(4)} category=${row.category ?? "-"} text="${row.text.slice(0, 80)}"`);
77
+ const imp = row.importance ?? 0.5;
78
+ const ac = row.accessCount ?? 0;
79
+ logger.info(`[engram:vector] #${i} distance=${distance.toFixed(6)} score=${score.toFixed(4)} importance=${imp.toFixed(2)} accessCount=${ac} category=${row.category ?? "-"} text="${row.text.slice(0, 80)}"`);
73
80
  return {
81
+ id: row.id || undefined,
74
82
  text: row.text,
75
83
  source: "vector",
76
84
  score,
@@ -81,15 +89,16 @@ export class VectorStore {
81
89
  return scored;
82
90
  }
83
91
  catch (err) {
84
- console.error(`[engram] Vector search failed: ${err}`);
92
+ logger.error(`[engram] Vector search failed: ${err}`);
85
93
  return [];
86
94
  }
87
95
  }
88
96
  /**
89
97
  * 存储一条记忆(含 duplicate 检测)
98
+ * @param importance LLM 评分的重要度 0-1,默认 0.5
90
99
  * @returns "created" | "duplicate"
91
100
  */
92
- async store(text, category) {
101
+ async store(text, category, importance = 0.5) {
93
102
  const vector = await this.embed(text);
94
103
  // Duplicate detection: check for near-identical existing entries
95
104
  if (this.table) {
@@ -103,7 +112,7 @@ export class VectorStore {
103
112
  const dist = existing[0]._distance;
104
113
  const sim = 1 / (1 + dist);
105
114
  if (sim > 0.95) {
106
- console.log(`[engram] Duplicate detected (sim=${sim.toFixed(4)}): "${existing[0].text?.slice(0, 60)}"`);
115
+ logger.info(`[engram] Duplicate detected (sim=${sim.toFixed(4)}): "${existing[0].text?.slice(0, 60)}"`);
107
116
  return "duplicate";
108
117
  }
109
118
  }
@@ -115,16 +124,116 @@ export class VectorStore {
115
124
  const now = Math.floor(Date.now() / 1000);
116
125
  const id = `engram-${now}-${Math.random().toString(36).slice(2, 8)}`;
117
126
  const tableName = this.config.tableName || "memories";
127
+ // 限制 importance 在 [0, 1]
128
+ const imp = Math.max(0, Math.min(1, importance));
129
+ const record = {
130
+ id,
131
+ text,
132
+ vector,
133
+ category,
134
+ createdAt: now,
135
+ importance: imp,
136
+ accessCount: 0,
137
+ lastAccessed: 0,
138
+ };
118
139
  if (!this.table) {
119
- this.table = await this.db.createTable(tableName, [
120
- { id, text, vector, category, createdAt: now },
121
- ]);
122
- console.log(`[engram] Vector store: created table "${tableName}" with first entry`);
140
+ this.table = await this.db.createTable(tableName, [record]);
141
+ logger.info(`[engram] Vector store: created table "${tableName}" with first entry (importance=${imp.toFixed(2)})`);
123
142
  }
124
143
  else {
125
- await this.table.add([{ id, text, vector, category, createdAt: now }]);
144
+ await this.table.add([record]);
126
145
  }
146
+ logger.info(`[engram] Stored memory: [${category}] importance=${imp.toFixed(2)} "${text.slice(0, 60)}"`);
127
147
  return "created";
128
148
  }
149
+ /**
150
+ * 强化记忆:召回命中时调用,增加 accessCount 并更新 lastAccessed
151
+ * fire-and-forget,不影响召回速度
152
+ */
153
+ async reinforce(ids) {
154
+ if (!this.table || ids.length === 0)
155
+ return;
156
+ const now = Math.floor(Date.now() / 1000);
157
+ try {
158
+ for (const id of ids) {
159
+ // LanceDB 不支持原子 increment,需要先查再改
160
+ const rows = await this.table
161
+ .search([]) // dummy search, we'll use filter
162
+ .where(`id = '${id}'`)
163
+ .limit(1)
164
+ .select(["id", "accessCount"])
165
+ .toArray()
166
+ .catch(() => []);
167
+ if (rows.length > 0) {
168
+ const oldCount = rows[0].accessCount ?? 0;
169
+ await this.table.update({
170
+ where: `id = '${id}'`,
171
+ values: { accessCount: oldCount + 1, lastAccessed: now },
172
+ });
173
+ logger.info(`[engram:vector] Reinforced memory ${id}: accessCount ${oldCount} → ${oldCount + 1}`);
174
+ }
175
+ }
176
+ }
177
+ catch (err) {
178
+ // reinforce 是增强性功能,失败不影响主流程
179
+ logger.error(`[engram:vector] reinforce failed (non-critical): ${err}`);
180
+ }
181
+ }
182
+ /**
183
+ * 遗忘:清理 effective_importance 低于阈值的长期记忆
184
+ * effective = importance × decay(age) × log2(1 + accessCount)
185
+ * @param threshold 低于此值的记忆将被删除,默认 0.05
186
+ * @param maxPrune 单次最多删除条数,默认 50
187
+ * @returns 删除的条数
188
+ */
189
+ async prune(threshold = 0.05, maxPrune = 50) {
190
+ if (!this.table)
191
+ return 0;
192
+ const halfLifeDays = this.config.halfLifeDays ?? 30;
193
+ const now = Math.floor(Date.now() / 1000);
194
+ try {
195
+ // 全量扫描(LanceDB 没有 aggregate,需要逐条判断)
196
+ const allRows = await this.table
197
+ .search([])
198
+ .select(["id", "text", "importance", "accessCount", "createdAt"])
199
+ .limit(10000) // 安全上限
200
+ .toArray()
201
+ .catch(() => []);
202
+ if (allRows.length === 0)
203
+ return 0;
204
+ const toDelete = [];
205
+ for (const row of allRows) {
206
+ const imp = row.importance ?? 0.5; // 兼容旧数据
207
+ const ac = row.accessCount ?? 0;
208
+ const createdAt = row.createdAt ?? now;
209
+ const ageDays = Math.max(0, (now - createdAt) / 86400);
210
+ // 遗忘公式
211
+ const decay = Math.exp(-Math.log(2) / halfLifeDays * ageDays);
212
+ const accessBoost = Math.log2(1 + ac + 1); // +1 保底:从没被访问的 = log2(2) = 1
213
+ const effective = imp * decay * accessBoost;
214
+ if (effective < threshold) {
215
+ toDelete.push({ id: row.id, effective, text: row.text.slice(0, 60) });
216
+ }
217
+ }
218
+ // 按 effective 升序排列,先删最不重要的
219
+ toDelete.sort((a, b) => a.effective - b.effective);
220
+ const pruneList = toDelete.slice(0, maxPrune);
221
+ if (pruneList.length === 0) {
222
+ logger.info(`[engram:vector] Prune: no stale memories found (${allRows.length} total, threshold=${threshold})`);
223
+ return 0;
224
+ }
225
+ logger.info(`[engram:vector] Prune: ${pruneList.length} stale memories to delete (out of ${toDelete.length} below threshold, ${allRows.length} total)`);
226
+ for (const item of pruneList) {
227
+ logger.info(`[engram:vector] Pruning: effective=${item.effective.toFixed(4)} "${item.text}"`);
228
+ await this.table.delete(`id = '${item.id}'`);
229
+ }
230
+ logger.info(`[engram:vector] Prune complete: deleted ${pruneList.length} memories`);
231
+ return pruneList.length;
232
+ }
233
+ catch (err) {
234
+ logger.error(`[engram:vector] Prune failed: ${err}`);
235
+ return 0;
236
+ }
237
+ }
129
238
  }
130
239
  //# sourceMappingURL=vector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vector.js","sourceRoot":"","sources":["../src/vector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vector.js","sourceRoot":"","sources":["../src/vector.ts"],"names":[],"mappings":"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"}
@@ -97,6 +97,10 @@
97
97
  "type": "string",
98
98
  "description": "LanceDB 数据库目录(默认 workspace/memory-engram/lancedb)"
99
99
  },
100
+ "logDir": {
101
+ "type": "string",
102
+ "description": "日志父目录路径,传入后在此目录下创建 engram/ 子目录按天写日志文件(YYYY-MM-DD.log)。不传则仅 console 输出"
103
+ },
100
104
  "queryRewrite": {
101
105
  "type": "object",
102
106
  "description": "查询重写配置(通过云 LLM 对召回查询进行改写/分解)",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scotthuang/engram",
3
- "version": "0.3.27",
3
+ "version": "0.4.0",
4
4
  "description": "分层语义记忆系统 - OpenClaw Plugin",
5
5
  "type": "module",
6
6
  "openclaw": {