@scotthuang/engram 0.6.8 → 0.7.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.
@@ -1,146 +0,0 @@
1
- /**
2
- * Image Store - 图片本地持久化存储
3
- *
4
- * 将图片从临时路径(如微信下发的 /tmp 目录)copy 到持久化目录,
5
- * 按日期归档,配套生成元数据 JSON 文件,支持 SHA-256 去重。
6
- *
7
- * 存储结构:
8
- * memory-engram/images/YYYY-MM/DD/
9
- * ├── YYYYMMDD_HHmmss_{hash6}.jpg ← 原图
10
- * └── YYYYMMDD_HHmmss_{hash6}.json ← 元数据
11
- */
12
- export interface ImageMetadata {
13
- /** 原始文件路径 */
14
- originalPath: string;
15
- /** 持久化后的绝对路径 */
16
- storedPath: string;
17
- /** 相对于 memory-engram/ 的路径(用于记忆引用) */
18
- relativePath: string;
19
- /** 存储时间戳(毫秒) */
20
- timestamp: number;
21
- /** 来源渠道 */
22
- source: string;
23
- /** 图片文件 SHA-256 hash */
24
- imageHash: string;
25
- /** 文件大小(字节) */
26
- fileSize: number;
27
- /** 图片描述(由 3.1.2 图片理解填写) */
28
- description: string;
29
- /** 识别到的实体(由 3.1.2 图片理解填写) */
30
- entities: string[];
31
- /** 人脸识别结果(由 3.2 人脸识别填写) */
32
- faces: Array<{
33
- personId: string | null;
34
- name: string;
35
- confidence: number;
36
- bbox: number[];
37
- }>;
38
- }
39
- export interface ImageStoreResult {
40
- /** 持久化后的绝对路径 */
41
- storedPath: string;
42
- /** 相对于 memory-engram/ 的路径(用于记忆引用) */
43
- relativePath: string;
44
- /** 完整元数据 */
45
- metadata: ImageMetadata;
46
- /** 是否为重复图片(已存在相同 hash) */
47
- isDuplicate: boolean;
48
- }
49
- /**
50
- * 图片持久化存储管理器
51
- */
52
- export declare class ImageStore {
53
- private workspaceDir;
54
- /** hash → relativePath 的去重索引 */
55
- private hashIndex;
56
- constructor(workspaceDir: string);
57
- /** memory-engram 根目录 */
58
- private get engramDir();
59
- /** images 根目录 */
60
- private get imagesDir();
61
- /** hash 索引文件绝对路径 */
62
- private get hashIndexPath();
63
- /**
64
- * 计算文件的 SHA-256 hash
65
- */
66
- private computeFileHash;
67
- /**
68
- * 加载 hash 去重索引
69
- */
70
- private loadHashIndex;
71
- /**
72
- * 保存 hash 去重索引
73
- */
74
- private saveHashIndex;
75
- /**
76
- * 生成本地时间相关的路径组件
77
- */
78
- private getTimeParts;
79
- /**
80
- * 存储图片到持久化目录
81
- *
82
- * @param originalPath 图片的原始路径(如 /tmp/wechat_xxx.jpg)
83
- * @param options.source 来源渠道(默认 "unknown")
84
- * @returns 存储结果,包含新路径和元数据
85
- * @throws 如果文件不存在或扩展名不支持
86
- */
87
- storeImage(originalPath: string, options?: {
88
- source?: string;
89
- }): Promise<ImageStoreResult>;
90
- /**
91
- * 更新图片元数据(用于 3.1.2 填写 description/entities,3.2 填写 faces)
92
- *
93
- * @param relativePath 相对于 memory-engram/ 的图片路径
94
- * @param updates 要更新的字段
95
- */
96
- updateMetadata(relativePath: string, updates: Partial<Pick<ImageMetadata, "description" | "entities" | "faces">>): Promise<ImageMetadata | null>;
97
- /**
98
- * 根据 hash 查找已存储的图片
99
- */
100
- findByHash(imageHash: string): Promise<ImageMetadata | null>;
101
- /**
102
- * 列出某天的所有图片
103
- *
104
- * @param date 日期字符串 YYYY-MM-DD
105
- */
106
- listByDate(date: string): Promise<ImageMetadata[]>;
107
- /**
108
- * 获取图片存储统计
109
- */
110
- getStats(): Promise<{
111
- totalImages: number;
112
- totalSizeBytes: number;
113
- }>;
114
- /**
115
- * 构建元数据对象
116
- */
117
- private buildMetadata;
118
- /**
119
- * 遍历 images/ 目录,加载所有图片元数据 JSON
120
- */
121
- private loadAllMetadata;
122
- /**
123
- * 文本检索图片:jieba 分词 + BM25 打分
124
- *
125
- * @param query 搜索关键词(如 "微信合照")
126
- * @param limit 返回数量上限
127
- * @returns 按相关性排序的图片列表
128
- */
129
- searchByText(query: string, limit?: number): Promise<ImageSearchResult[]>;
130
- }
131
- export interface ImageSearchResult {
132
- /** 相对于 memory-engram/ 的路径 */
133
- relativePath: string;
134
- /** 绝对路径 */
135
- storedPath: string;
136
- /** 存储日期 YYYY-MM-DD */
137
- date: string;
138
- /** 描述摘要(前 200 字) */
139
- description: string;
140
- /** 实体关键词 */
141
- entities: string[];
142
- /** 来源渠道 */
143
- source: string;
144
- /** BM25 相关性分数 */
145
- score: number;
146
- }
@@ -1,418 +0,0 @@
1
- /**
2
- * Image Store - 图片本地持久化存储
3
- *
4
- * 将图片从临时路径(如微信下发的 /tmp 目录)copy 到持久化目录,
5
- * 按日期归档,配套生成元数据 JSON 文件,支持 SHA-256 去重。
6
- *
7
- * 存储结构:
8
- * memory-engram/images/YYYY-MM/DD/
9
- * ├── YYYYMMDD_HHmmss_{hash6}.jpg ← 原图
10
- * └── YYYYMMDD_HHmmss_{hash6}.json ← 元数据
11
- */
12
- import { promises as fs } from "node:fs";
13
- import { join, extname } from "node:path";
14
- import { createHash } from "node:crypto";
15
- import { createReadStream } from "node:fs";
16
- import { logger } from "./logger.js";
17
- import { initJieba, tokenize } from "./bm25.js";
18
- // ---- 支持的图片扩展名 ----
19
- const SUPPORTED_EXTENSIONS = new Set([
20
- ".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp", ".tiff", ".tif", ".heic", ".heif", ".svg",
21
- ]);
22
- // ---- hash 索引文件路径 ----
23
- const HASH_INDEX_FILE = "image-hash-index.json";
24
- /**
25
- * 图片持久化存储管理器
26
- */
27
- export class ImageStore {
28
- workspaceDir;
29
- /** hash → relativePath 的去重索引 */
30
- hashIndex = null;
31
- constructor(workspaceDir) {
32
- this.workspaceDir = workspaceDir;
33
- }
34
- /** memory-engram 根目录 */
35
- get engramDir() {
36
- return join(this.workspaceDir, "memory-engram");
37
- }
38
- /** images 根目录 */
39
- get imagesDir() {
40
- return join(this.engramDir, "images");
41
- }
42
- /** hash 索引文件绝对路径 */
43
- get hashIndexPath() {
44
- return join(this.imagesDir, HASH_INDEX_FILE);
45
- }
46
- /**
47
- * 计算文件的 SHA-256 hash
48
- */
49
- async computeFileHash(filePath) {
50
- return new Promise((resolve, reject) => {
51
- const hash = createHash("sha256");
52
- const stream = createReadStream(filePath);
53
- stream.on("data", (chunk) => hash.update(chunk));
54
- stream.on("end", () => resolve(hash.digest("hex")));
55
- stream.on("error", reject);
56
- });
57
- }
58
- /**
59
- * 加载 hash 去重索引
60
- */
61
- async loadHashIndex() {
62
- if (this.hashIndex !== null)
63
- return this.hashIndex;
64
- try {
65
- const raw = await fs.readFile(this.hashIndexPath, "utf-8");
66
- this.hashIndex = JSON.parse(raw);
67
- return this.hashIndex;
68
- }
69
- catch {
70
- this.hashIndex = {};
71
- return this.hashIndex;
72
- }
73
- }
74
- /**
75
- * 保存 hash 去重索引
76
- */
77
- async saveHashIndex() {
78
- if (!this.hashIndex)
79
- return;
80
- await fs.mkdir(this.imagesDir, { recursive: true });
81
- await fs.writeFile(this.hashIndexPath, JSON.stringify(this.hashIndex, null, 2), "utf-8");
82
- }
83
- /**
84
- * 生成本地时间相关的路径组件
85
- */
86
- getTimeParts(now) {
87
- const y = now.getFullYear();
88
- const M = String(now.getMonth() + 1).padStart(2, "0");
89
- const d = String(now.getDate()).padStart(2, "0");
90
- const h = String(now.getHours()).padStart(2, "0");
91
- const m = String(now.getMinutes()).padStart(2, "0");
92
- const s = String(now.getSeconds()).padStart(2, "0");
93
- return {
94
- yearMonth: `${y}-${M}`,
95
- day: d,
96
- filePrefix: `${y}${M}${d}_${h}${m}${s}`,
97
- };
98
- }
99
- /**
100
- * 存储图片到持久化目录
101
- *
102
- * @param originalPath 图片的原始路径(如 /tmp/wechat_xxx.jpg)
103
- * @param options.source 来源渠道(默认 "unknown")
104
- * @returns 存储结果,包含新路径和元数据
105
- * @throws 如果文件不存在或扩展名不支持
106
- */
107
- async storeImage(originalPath, options) {
108
- const source = options?.source || "unknown";
109
- logger.info(`[engram:image-store] storeImage called: ${originalPath} (source=${source})`);
110
- // 1. 校验文件存在
111
- let stat;
112
- try {
113
- stat = await fs.stat(originalPath);
114
- }
115
- catch {
116
- throw new Error(`Image file not found: ${originalPath}`);
117
- }
118
- if (!stat.isFile()) {
119
- throw new Error(`Not a file: ${originalPath}`);
120
- }
121
- // 2. 校验扩展名
122
- const ext = extname(originalPath).toLowerCase();
123
- if (!SUPPORTED_EXTENSIONS.has(ext)) {
124
- throw new Error(`Unsupported image format: ${ext} (supported: ${[...SUPPORTED_EXTENSIONS].join(", ")})`);
125
- }
126
- // 3. 计算文件 hash
127
- const imageHash = await this.computeFileHash(originalPath);
128
- const hash6 = imageHash.slice(0, 6);
129
- logger.info(`[engram:image-store] File hash: ${imageHash.slice(0, 16)}... size=${stat.size}`);
130
- // 4. 去重检查
131
- const hashIndex = await this.loadHashIndex();
132
- if (hashIndex[imageHash]) {
133
- const existingRelPath = hashIndex[imageHash];
134
- const existingAbsPath = join(this.engramDir, existingRelPath);
135
- // 确认文件还存在(可能被手动删除了)
136
- try {
137
- await fs.stat(existingAbsPath);
138
- // 读取已有元数据
139
- const metaPath = existingAbsPath.replace(/\.[^.]+$/, ".json");
140
- let metadata;
141
- try {
142
- const raw = await fs.readFile(metaPath, "utf-8");
143
- metadata = JSON.parse(raw);
144
- }
145
- catch {
146
- // 元数据丢失,重建一个基本的
147
- metadata = this.buildMetadata(originalPath, existingAbsPath, existingRelPath, imageHash, stat.size, source);
148
- }
149
- logger.info(`[engram:image-store] Duplicate detected, existing: ${existingRelPath}`);
150
- return {
151
- storedPath: existingAbsPath,
152
- relativePath: existingRelPath,
153
- metadata,
154
- isDuplicate: true,
155
- };
156
- }
157
- catch {
158
- // 文件已被删除,清除索引,继续存储
159
- logger.info(`[engram:image-store] Hash index stale (file deleted), re-storing`);
160
- delete hashIndex[imageHash];
161
- }
162
- }
163
- // 5. 构建目标路径
164
- const now = new Date();
165
- const { yearMonth, day, filePrefix } = this.getTimeParts(now);
166
- const destDir = join(this.imagesDir, yearMonth, day);
167
- await fs.mkdir(destDir, { recursive: true });
168
- const fileName = `${filePrefix}_${hash6}${ext}`;
169
- const destPath = join(destDir, fileName);
170
- const relativePath = `images/${yearMonth}/${day}/${fileName}`;
171
- // 6. Copy 文件
172
- await fs.copyFile(originalPath, destPath);
173
- logger.info(`[engram:image-store] Copied: ${originalPath} → ${destPath}`);
174
- // 7. 生成元数据
175
- const metadata = this.buildMetadata(originalPath, destPath, relativePath, imageHash, stat.size, source);
176
- const metaPath = join(destDir, `${filePrefix}_${hash6}.json`);
177
- await fs.writeFile(metaPath, JSON.stringify(metadata, null, 2), "utf-8");
178
- logger.info(`[engram:image-store] Metadata saved: ${metaPath}`);
179
- // 8. 更新 hash 索引
180
- hashIndex[imageHash] = relativePath;
181
- await this.saveHashIndex();
182
- return {
183
- storedPath: destPath,
184
- relativePath,
185
- metadata,
186
- isDuplicate: false,
187
- };
188
- }
189
- /**
190
- * 更新图片元数据(用于 3.1.2 填写 description/entities,3.2 填写 faces)
191
- *
192
- * @param relativePath 相对于 memory-engram/ 的图片路径
193
- * @param updates 要更新的字段
194
- */
195
- async updateMetadata(relativePath, updates) {
196
- const metaPath = join(this.engramDir, relativePath.replace(/\.[^.]+$/, ".json"));
197
- try {
198
- const raw = await fs.readFile(metaPath, "utf-8");
199
- const metadata = JSON.parse(raw);
200
- if (updates.description !== undefined)
201
- metadata.description = updates.description;
202
- if (updates.entities !== undefined)
203
- metadata.entities = updates.entities;
204
- if (updates.faces !== undefined)
205
- metadata.faces = updates.faces;
206
- await fs.writeFile(metaPath, JSON.stringify(metadata, null, 2), "utf-8");
207
- logger.info(`[engram:image-store] Metadata updated: ${metaPath}`);
208
- return metadata;
209
- }
210
- catch (err) {
211
- logger.error(`[engram:image-store] Failed to update metadata for ${relativePath}: ${err}`);
212
- return null;
213
- }
214
- }
215
- /**
216
- * 根据 hash 查找已存储的图片
217
- */
218
- async findByHash(imageHash) {
219
- const hashIndex = await this.loadHashIndex();
220
- const relativePath = hashIndex[imageHash];
221
- if (!relativePath)
222
- return null;
223
- const metaPath = join(this.engramDir, relativePath.replace(/\.[^.]+$/, ".json"));
224
- try {
225
- const raw = await fs.readFile(metaPath, "utf-8");
226
- return JSON.parse(raw);
227
- }
228
- catch {
229
- return null;
230
- }
231
- }
232
- /**
233
- * 列出某天的所有图片
234
- *
235
- * @param date 日期字符串 YYYY-MM-DD
236
- */
237
- async listByDate(date) {
238
- const match = date.match(/^(\d{4}-\d{2})-(\d{2})$/);
239
- if (!match)
240
- return [];
241
- const yearMonth = match[1];
242
- const day = match[2];
243
- const dayDir = join(this.imagesDir, yearMonth, day);
244
- try {
245
- const files = await fs.readdir(dayDir);
246
- const jsonFiles = files.filter(f => f.endsWith(".json"));
247
- const results = [];
248
- for (const file of jsonFiles) {
249
- try {
250
- const raw = await fs.readFile(join(dayDir, file), "utf-8");
251
- results.push(JSON.parse(raw));
252
- }
253
- catch {
254
- // skip malformed
255
- }
256
- }
257
- return results.sort((a, b) => a.timestamp - b.timestamp);
258
- }
259
- catch {
260
- return [];
261
- }
262
- }
263
- /**
264
- * 获取图片存储统计
265
- */
266
- async getStats() {
267
- const hashIndex = await this.loadHashIndex();
268
- const totalImages = Object.keys(hashIndex).length;
269
- // 粗略统计,不遍历文件系统
270
- return { totalImages, totalSizeBytes: 0 };
271
- }
272
- /**
273
- * 构建元数据对象
274
- */
275
- buildMetadata(originalPath, storedPath, relativePath, imageHash, fileSize, source) {
276
- return {
277
- originalPath,
278
- storedPath,
279
- relativePath,
280
- timestamp: Date.now(),
281
- source,
282
- imageHash,
283
- fileSize,
284
- description: "",
285
- entities: [],
286
- faces: [],
287
- };
288
- }
289
- // ---- 图片文本检索 ----
290
- /**
291
- * 遍历 images/ 目录,加载所有图片元数据 JSON
292
- */
293
- async loadAllMetadata() {
294
- const results = [];
295
- try {
296
- // images/ 下按 YYYY-MM/DD/ 组织
297
- const yearMonthDirs = await fs.readdir(this.imagesDir);
298
- for (const ym of yearMonthDirs) {
299
- if (ym.startsWith(".") || ym.endsWith(".json"))
300
- continue; // 跳过 .index 文件等
301
- const ymPath = join(this.imagesDir, ym);
302
- let ymStat;
303
- try {
304
- ymStat = await fs.stat(ymPath);
305
- }
306
- catch {
307
- continue;
308
- }
309
- if (!ymStat.isDirectory())
310
- continue;
311
- const dayDirs = await fs.readdir(ymPath);
312
- for (const dd of dayDirs) {
313
- const ddPath = join(ymPath, dd);
314
- let ddStat;
315
- try {
316
- ddStat = await fs.stat(ddPath);
317
- }
318
- catch {
319
- continue;
320
- }
321
- if (!ddStat.isDirectory())
322
- continue;
323
- const files = await fs.readdir(ddPath);
324
- for (const f of files) {
325
- if (!f.endsWith(".json"))
326
- continue;
327
- try {
328
- const raw = await fs.readFile(join(ddPath, f), "utf-8");
329
- const meta = JSON.parse(raw);
330
- // 只返回有描述的图片(没描述的搜不到也没意义)
331
- if (meta.description) {
332
- results.push(meta);
333
- }
334
- }
335
- catch {
336
- // skip malformed
337
- }
338
- }
339
- }
340
- }
341
- }
342
- catch {
343
- // images/ 目录不存在
344
- }
345
- return results;
346
- }
347
- /**
348
- * 文本检索图片:jieba 分词 + BM25 打分
349
- *
350
- * @param query 搜索关键词(如 "微信合照")
351
- * @param limit 返回数量上限
352
- * @returns 按相关性排序的图片列表
353
- */
354
- async searchByText(query, limit = 5) {
355
- await initJieba();
356
- const allMeta = await this.loadAllMetadata();
357
- if (allMeta.length === 0)
358
- return [];
359
- logger.info(`[engram:image-search] Searching "${query}" across ${allMeta.length} images`);
360
- // 1. 分词 query
361
- const queryTokens = tokenize(query);
362
- if (queryTokens.length === 0)
363
- return [];
364
- // 2. 构建每张图的文档 tokens
365
- const docs = allMeta.map((meta) => {
366
- // 把 description + entities 拼在一起作为检索文本
367
- const text = [meta.description, ...meta.entities].join(" ");
368
- return { meta, tokens: tokenize(text) };
369
- });
370
- // 3. 计算 IDF
371
- const N = docs.length;
372
- const df = new Map();
373
- for (const doc of docs) {
374
- const unique = new Set(doc.tokens);
375
- for (const t of unique) {
376
- df.set(t, (df.get(t) || 0) + 1);
377
- }
378
- }
379
- const idf = new Map();
380
- for (const [term, freq] of df) {
381
- idf.set(term, Math.log((N - freq + 0.5) / (freq + 0.5) + 1));
382
- }
383
- // 4. 平均文档长度
384
- const avgDl = docs.reduce((sum, d) => sum + d.tokens.length, 0) / N;
385
- // 5. BM25 打分
386
- const k1 = 1.5;
387
- const b = 0.75;
388
- const scored = [];
389
- for (const doc of docs) {
390
- let score = 0;
391
- for (const token of queryTokens) {
392
- const tokenIdf = idf.get(token) || 0;
393
- if (tokenIdf === 0)
394
- continue;
395
- const tf = doc.tokens.filter((t) => t === token).length;
396
- const dl = doc.tokens.length;
397
- const tfComponent = (tf * (k1 + 1)) / (tf + k1 * (1 - b + b * (dl / avgDl)));
398
- score += tokenIdf * tfComponent;
399
- }
400
- if (score > 0) {
401
- scored.push({ meta: doc.meta, score });
402
- }
403
- }
404
- scored.sort((a, b) => b.score - a.score);
405
- const topK = scored.slice(0, limit);
406
- logger.info(`[engram:image-search] Found ${scored.length} matches, returning top ${topK.length}`);
407
- return topK.map((s) => ({
408
- relativePath: s.meta.relativePath,
409
- storedPath: s.meta.storedPath,
410
- date: new Date(s.meta.timestamp).toISOString().split("T")[0],
411
- description: s.meta.description.slice(0, 200),
412
- entities: s.meta.entities,
413
- source: s.meta.source,
414
- score: Math.round(s.score * 1000) / 1000,
415
- }));
416
- }
417
- }
418
- //# sourceMappingURL=image-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"image-store.js","sourceRoot":"","sources":["../src/image-store.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts DELETED
@@ -1,7 +0,0 @@
1
- /**
2
- * Engram Plugin - Main Entry
3
- *
4
- * 分层语义记忆系统 OpenClaw Plugin
5
- * kind: "memory" (exclusive slot)
6
- */
7
- export default function register(api: any): void;