@scotthuang/engram 0.4.8 → 0.5.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/bm25.d.ts +3 -1
- package/dist/bm25.js +4 -10
- package/dist/bm25.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/image-store.d.ts +118 -0
- package/dist/image-store.js +289 -0
- package/dist/image-store.js.map +1 -0
- package/dist/index.js +17 -6
- package/dist/index.js.map +1 -1
- package/dist/recall.d.ts +20 -3
- package/dist/recall.js +44 -5
- package/dist/recall.js.map +1 -1
- package/dist/settle.d.ts +30 -8
- package/dist/settle.js +192 -23
- package/dist/settle.js.map +1 -1
- package/dist/vector.js +5 -6
- package/dist/vector.js.map +1 -1
- package/package.json +1 -1
package/dist/bm25.d.ts
CHANGED
|
@@ -16,8 +16,10 @@ export declare class BM25Index {
|
|
|
16
16
|
private avgDl;
|
|
17
17
|
/**
|
|
18
18
|
* 从短期记忆文件构建索引
|
|
19
|
+
* v0.5: 全量索引所有 .md 文件(不再按 maxAgeDays 截断)
|
|
20
|
+
* maxAgeDays 参数保留但仅用于向下兼容(不再生效)
|
|
19
21
|
*/
|
|
20
|
-
buildFromDirectory(dir: string,
|
|
22
|
+
buildFromDirectory(dir: string, _maxAgeDays?: number): Promise<void>;
|
|
21
23
|
/**
|
|
22
24
|
* 解析结构化的短期记忆文件
|
|
23
25
|
* 格式:### HH:MM [分类标签]\n摘要内容
|
package/dist/bm25.js
CHANGED
|
@@ -66,33 +66,27 @@ export class BM25Index {
|
|
|
66
66
|
avgDl = 0;
|
|
67
67
|
/**
|
|
68
68
|
* 从短期记忆文件构建索引
|
|
69
|
+
* v0.5: 全量索引所有 .md 文件(不再按 maxAgeDays 截断)
|
|
70
|
+
* maxAgeDays 参数保留但仅用于向下兼容(不再生效)
|
|
69
71
|
*/
|
|
70
|
-
async buildFromDirectory(dir,
|
|
72
|
+
async buildFromDirectory(dir, _maxAgeDays = 7) {
|
|
71
73
|
await initJieba();
|
|
72
74
|
this.docs = [];
|
|
73
|
-
const cutoff = new Date();
|
|
74
|
-
cutoff.setDate(cutoff.getDate() - maxAgeDays);
|
|
75
75
|
// 设计初心:只读取 memory/short-term/
|
|
76
76
|
const shortTermDir = join(dir, "short-term");
|
|
77
77
|
try {
|
|
78
78
|
const files = await fs.readdir(shortTermDir);
|
|
79
79
|
let mdFiles = 0;
|
|
80
|
-
let skippedFiles = 0;
|
|
81
80
|
for (const file of files.sort().reverse()) { // 最新的优先
|
|
82
81
|
if (!file.endsWith(".md"))
|
|
83
82
|
continue;
|
|
84
83
|
const filePath = join(shortTermDir, file);
|
|
85
|
-
const stat = await fs.stat(filePath);
|
|
86
|
-
if (stat.mtime < cutoff) {
|
|
87
|
-
skippedFiles++;
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
84
|
const content = await fs.readFile(filePath, "utf-8");
|
|
91
85
|
const entries = this.parseEntries(content, filePath, file);
|
|
92
86
|
this.docs.push(...entries);
|
|
93
87
|
mdFiles++;
|
|
94
88
|
}
|
|
95
|
-
logger.info(`[engram:bm25] Scanned ${mdFiles}
|
|
89
|
+
logger.info(`[engram:bm25] Scanned ${mdFiles} MD files (full scan, no expiry cutoff)`);
|
|
96
90
|
}
|
|
97
91
|
catch {
|
|
98
92
|
logger.info(`[engram:bm25] short-term directory not found at ${shortTermDir}, 0 entries`);
|
package/dist/bm25.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bm25.js","sourceRoot":"","sources":["../src/bm25.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"bm25.js","sourceRoot":"","sources":["../src/bm25.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -0,0 +1,118 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,289 @@
|
|
|
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
|
+
// ---- 支持的图片扩展名 ----
|
|
18
|
+
const SUPPORTED_EXTENSIONS = new Set([
|
|
19
|
+
".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp", ".tiff", ".tif", ".heic", ".heif", ".svg",
|
|
20
|
+
]);
|
|
21
|
+
// ---- hash 索引文件路径 ----
|
|
22
|
+
const HASH_INDEX_FILE = "image-hash-index.json";
|
|
23
|
+
/**
|
|
24
|
+
* 图片持久化存储管理器
|
|
25
|
+
*/
|
|
26
|
+
export class ImageStore {
|
|
27
|
+
workspaceDir;
|
|
28
|
+
/** hash → relativePath 的去重索引 */
|
|
29
|
+
hashIndex = null;
|
|
30
|
+
constructor(workspaceDir) {
|
|
31
|
+
this.workspaceDir = workspaceDir;
|
|
32
|
+
}
|
|
33
|
+
/** memory-engram 根目录 */
|
|
34
|
+
get engramDir() {
|
|
35
|
+
return join(this.workspaceDir, "memory-engram");
|
|
36
|
+
}
|
|
37
|
+
/** images 根目录 */
|
|
38
|
+
get imagesDir() {
|
|
39
|
+
return join(this.engramDir, "images");
|
|
40
|
+
}
|
|
41
|
+
/** hash 索引文件绝对路径 */
|
|
42
|
+
get hashIndexPath() {
|
|
43
|
+
return join(this.imagesDir, HASH_INDEX_FILE);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 计算文件的 SHA-256 hash
|
|
47
|
+
*/
|
|
48
|
+
async computeFileHash(filePath) {
|
|
49
|
+
return new Promise((resolve, reject) => {
|
|
50
|
+
const hash = createHash("sha256");
|
|
51
|
+
const stream = createReadStream(filePath);
|
|
52
|
+
stream.on("data", (chunk) => hash.update(chunk));
|
|
53
|
+
stream.on("end", () => resolve(hash.digest("hex")));
|
|
54
|
+
stream.on("error", reject);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 加载 hash 去重索引
|
|
59
|
+
*/
|
|
60
|
+
async loadHashIndex() {
|
|
61
|
+
if (this.hashIndex !== null)
|
|
62
|
+
return this.hashIndex;
|
|
63
|
+
try {
|
|
64
|
+
const raw = await fs.readFile(this.hashIndexPath, "utf-8");
|
|
65
|
+
this.hashIndex = JSON.parse(raw);
|
|
66
|
+
return this.hashIndex;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
this.hashIndex = {};
|
|
70
|
+
return this.hashIndex;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 保存 hash 去重索引
|
|
75
|
+
*/
|
|
76
|
+
async saveHashIndex() {
|
|
77
|
+
if (!this.hashIndex)
|
|
78
|
+
return;
|
|
79
|
+
await fs.mkdir(this.imagesDir, { recursive: true });
|
|
80
|
+
await fs.writeFile(this.hashIndexPath, JSON.stringify(this.hashIndex, null, 2), "utf-8");
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 生成本地时间相关的路径组件
|
|
84
|
+
*/
|
|
85
|
+
getTimeParts(now) {
|
|
86
|
+
const y = now.getFullYear();
|
|
87
|
+
const M = String(now.getMonth() + 1).padStart(2, "0");
|
|
88
|
+
const d = String(now.getDate()).padStart(2, "0");
|
|
89
|
+
const h = String(now.getHours()).padStart(2, "0");
|
|
90
|
+
const m = String(now.getMinutes()).padStart(2, "0");
|
|
91
|
+
const s = String(now.getSeconds()).padStart(2, "0");
|
|
92
|
+
return {
|
|
93
|
+
yearMonth: `${y}-${M}`,
|
|
94
|
+
day: d,
|
|
95
|
+
filePrefix: `${y}${M}${d}_${h}${m}${s}`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 存储图片到持久化目录
|
|
100
|
+
*
|
|
101
|
+
* @param originalPath 图片的原始路径(如 /tmp/wechat_xxx.jpg)
|
|
102
|
+
* @param options.source 来源渠道(默认 "unknown")
|
|
103
|
+
* @returns 存储结果,包含新路径和元数据
|
|
104
|
+
* @throws 如果文件不存在或扩展名不支持
|
|
105
|
+
*/
|
|
106
|
+
async storeImage(originalPath, options) {
|
|
107
|
+
const source = options?.source || "unknown";
|
|
108
|
+
logger.info(`[engram:image-store] storeImage called: ${originalPath} (source=${source})`);
|
|
109
|
+
// 1. 校验文件存在
|
|
110
|
+
let stat;
|
|
111
|
+
try {
|
|
112
|
+
stat = await fs.stat(originalPath);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
throw new Error(`Image file not found: ${originalPath}`);
|
|
116
|
+
}
|
|
117
|
+
if (!stat.isFile()) {
|
|
118
|
+
throw new Error(`Not a file: ${originalPath}`);
|
|
119
|
+
}
|
|
120
|
+
// 2. 校验扩展名
|
|
121
|
+
const ext = extname(originalPath).toLowerCase();
|
|
122
|
+
if (!SUPPORTED_EXTENSIONS.has(ext)) {
|
|
123
|
+
throw new Error(`Unsupported image format: ${ext} (supported: ${[...SUPPORTED_EXTENSIONS].join(", ")})`);
|
|
124
|
+
}
|
|
125
|
+
// 3. 计算文件 hash
|
|
126
|
+
const imageHash = await this.computeFileHash(originalPath);
|
|
127
|
+
const hash6 = imageHash.slice(0, 6);
|
|
128
|
+
logger.info(`[engram:image-store] File hash: ${imageHash.slice(0, 16)}... size=${stat.size}`);
|
|
129
|
+
// 4. 去重检查
|
|
130
|
+
const hashIndex = await this.loadHashIndex();
|
|
131
|
+
if (hashIndex[imageHash]) {
|
|
132
|
+
const existingRelPath = hashIndex[imageHash];
|
|
133
|
+
const existingAbsPath = join(this.engramDir, existingRelPath);
|
|
134
|
+
// 确认文件还存在(可能被手动删除了)
|
|
135
|
+
try {
|
|
136
|
+
await fs.stat(existingAbsPath);
|
|
137
|
+
// 读取已有元数据
|
|
138
|
+
const metaPath = existingAbsPath.replace(/\.[^.]+$/, ".json");
|
|
139
|
+
let metadata;
|
|
140
|
+
try {
|
|
141
|
+
const raw = await fs.readFile(metaPath, "utf-8");
|
|
142
|
+
metadata = JSON.parse(raw);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// 元数据丢失,重建一个基本的
|
|
146
|
+
metadata = this.buildMetadata(originalPath, existingAbsPath, existingRelPath, imageHash, stat.size, source);
|
|
147
|
+
}
|
|
148
|
+
logger.info(`[engram:image-store] Duplicate detected, existing: ${existingRelPath}`);
|
|
149
|
+
return {
|
|
150
|
+
storedPath: existingAbsPath,
|
|
151
|
+
relativePath: existingRelPath,
|
|
152
|
+
metadata,
|
|
153
|
+
isDuplicate: true,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// 文件已被删除,清除索引,继续存储
|
|
158
|
+
logger.info(`[engram:image-store] Hash index stale (file deleted), re-storing`);
|
|
159
|
+
delete hashIndex[imageHash];
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// 5. 构建目标路径
|
|
163
|
+
const now = new Date();
|
|
164
|
+
const { yearMonth, day, filePrefix } = this.getTimeParts(now);
|
|
165
|
+
const destDir = join(this.imagesDir, yearMonth, day);
|
|
166
|
+
await fs.mkdir(destDir, { recursive: true });
|
|
167
|
+
const fileName = `${filePrefix}_${hash6}${ext}`;
|
|
168
|
+
const destPath = join(destDir, fileName);
|
|
169
|
+
const relativePath = `images/${yearMonth}/${day}/${fileName}`;
|
|
170
|
+
// 6. Copy 文件
|
|
171
|
+
await fs.copyFile(originalPath, destPath);
|
|
172
|
+
logger.info(`[engram:image-store] Copied: ${originalPath} → ${destPath}`);
|
|
173
|
+
// 7. 生成元数据
|
|
174
|
+
const metadata = this.buildMetadata(originalPath, destPath, relativePath, imageHash, stat.size, source);
|
|
175
|
+
const metaPath = join(destDir, `${filePrefix}_${hash6}.json`);
|
|
176
|
+
await fs.writeFile(metaPath, JSON.stringify(metadata, null, 2), "utf-8");
|
|
177
|
+
logger.info(`[engram:image-store] Metadata saved: ${metaPath}`);
|
|
178
|
+
// 8. 更新 hash 索引
|
|
179
|
+
hashIndex[imageHash] = relativePath;
|
|
180
|
+
await this.saveHashIndex();
|
|
181
|
+
return {
|
|
182
|
+
storedPath: destPath,
|
|
183
|
+
relativePath,
|
|
184
|
+
metadata,
|
|
185
|
+
isDuplicate: false,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* 更新图片元数据(用于 3.1.2 填写 description/entities,3.2 填写 faces)
|
|
190
|
+
*
|
|
191
|
+
* @param relativePath 相对于 memory-engram/ 的图片路径
|
|
192
|
+
* @param updates 要更新的字段
|
|
193
|
+
*/
|
|
194
|
+
async updateMetadata(relativePath, updates) {
|
|
195
|
+
const metaPath = join(this.engramDir, relativePath.replace(/\.[^.]+$/, ".json"));
|
|
196
|
+
try {
|
|
197
|
+
const raw = await fs.readFile(metaPath, "utf-8");
|
|
198
|
+
const metadata = JSON.parse(raw);
|
|
199
|
+
if (updates.description !== undefined)
|
|
200
|
+
metadata.description = updates.description;
|
|
201
|
+
if (updates.entities !== undefined)
|
|
202
|
+
metadata.entities = updates.entities;
|
|
203
|
+
if (updates.faces !== undefined)
|
|
204
|
+
metadata.faces = updates.faces;
|
|
205
|
+
await fs.writeFile(metaPath, JSON.stringify(metadata, null, 2), "utf-8");
|
|
206
|
+
logger.info(`[engram:image-store] Metadata updated: ${metaPath}`);
|
|
207
|
+
return metadata;
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
logger.error(`[engram:image-store] Failed to update metadata for ${relativePath}: ${err}`);
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* 根据 hash 查找已存储的图片
|
|
216
|
+
*/
|
|
217
|
+
async findByHash(imageHash) {
|
|
218
|
+
const hashIndex = await this.loadHashIndex();
|
|
219
|
+
const relativePath = hashIndex[imageHash];
|
|
220
|
+
if (!relativePath)
|
|
221
|
+
return null;
|
|
222
|
+
const metaPath = join(this.engramDir, relativePath.replace(/\.[^.]+$/, ".json"));
|
|
223
|
+
try {
|
|
224
|
+
const raw = await fs.readFile(metaPath, "utf-8");
|
|
225
|
+
return JSON.parse(raw);
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* 列出某天的所有图片
|
|
233
|
+
*
|
|
234
|
+
* @param date 日期字符串 YYYY-MM-DD
|
|
235
|
+
*/
|
|
236
|
+
async listByDate(date) {
|
|
237
|
+
const match = date.match(/^(\d{4}-\d{2})-(\d{2})$/);
|
|
238
|
+
if (!match)
|
|
239
|
+
return [];
|
|
240
|
+
const yearMonth = match[1];
|
|
241
|
+
const day = match[2];
|
|
242
|
+
const dayDir = join(this.imagesDir, yearMonth, day);
|
|
243
|
+
try {
|
|
244
|
+
const files = await fs.readdir(dayDir);
|
|
245
|
+
const jsonFiles = files.filter(f => f.endsWith(".json"));
|
|
246
|
+
const results = [];
|
|
247
|
+
for (const file of jsonFiles) {
|
|
248
|
+
try {
|
|
249
|
+
const raw = await fs.readFile(join(dayDir, file), "utf-8");
|
|
250
|
+
results.push(JSON.parse(raw));
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
// skip malformed
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return results.sort((a, b) => a.timestamp - b.timestamp);
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
return [];
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* 获取图片存储统计
|
|
264
|
+
*/
|
|
265
|
+
async getStats() {
|
|
266
|
+
const hashIndex = await this.loadHashIndex();
|
|
267
|
+
const totalImages = Object.keys(hashIndex).length;
|
|
268
|
+
// 粗略统计,不遍历文件系统
|
|
269
|
+
return { totalImages, totalSizeBytes: 0 };
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* 构建元数据对象
|
|
273
|
+
*/
|
|
274
|
+
buildMetadata(originalPath, storedPath, relativePath, imageHash, fileSize, source) {
|
|
275
|
+
return {
|
|
276
|
+
originalPath,
|
|
277
|
+
storedPath,
|
|
278
|
+
relativePath,
|
|
279
|
+
timestamp: Date.now(),
|
|
280
|
+
source,
|
|
281
|
+
imageHash,
|
|
282
|
+
fileSize,
|
|
283
|
+
description: "",
|
|
284
|
+
entities: [],
|
|
285
|
+
faces: [],
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=image-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-store.js","sourceRoot":"","sources":["../src/image-store.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -10,7 +10,7 @@ import { parseConfig } from "./config.js";
|
|
|
10
10
|
import { RecallEngine } from "./recall.js";
|
|
11
11
|
import { ProfileManager } from "./profile.js";
|
|
12
12
|
import { VectorStore } from "./vector.js";
|
|
13
|
-
import { runSettlement } from "./settle.js";
|
|
13
|
+
import { runSettlement, runMonthlySettle } from "./settle.js";
|
|
14
14
|
import { logger } from "./logger.js";
|
|
15
15
|
import { promises as fs } from "node:fs";
|
|
16
16
|
import path from "node:path";
|
|
@@ -965,14 +965,25 @@ export default function register(api) {
|
|
|
965
965
|
// ---- CLI Commands ----
|
|
966
966
|
api.registerCli(({ program }) => {
|
|
967
967
|
const mem = program.command("memory-sys").description("Memory system commands");
|
|
968
|
-
mem.command("settle").description("Run settlement manually").action(async () => {
|
|
968
|
+
mem.command("settle").description("Run daily settlement manually").action(async () => {
|
|
969
969
|
const results = await runSettlement({
|
|
970
970
|
workspaceDir,
|
|
971
971
|
config,
|
|
972
|
-
llmCall:
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
972
|
+
llmCall: makeLlmCall(config),
|
|
973
|
+
vectorStore: vectorStore ? (text, category, importance) => vectorStore.store(text, category, importance) : undefined,
|
|
974
|
+
vectorPrune: vectorStore ? (threshold, maxPrune) => vectorStore.prune(threshold, maxPrune) : undefined,
|
|
975
|
+
});
|
|
976
|
+
results.forEach(r => console.log(` ${r}`));
|
|
977
|
+
});
|
|
978
|
+
mem.command("monthly-settle").description("Run monthly settle (selective vectorize + prune)").action(async () => {
|
|
979
|
+
console.log("Running monthly settlement...");
|
|
980
|
+
if (vectorStore) {
|
|
981
|
+
await vectorStore.startup();
|
|
982
|
+
}
|
|
983
|
+
const results = await runMonthlySettle({
|
|
984
|
+
workspaceDir,
|
|
985
|
+
config,
|
|
986
|
+
llmCall: makeLlmCall(config),
|
|
976
987
|
vectorStore: vectorStore ? (text, category, importance) => vectorStore.store(text, category, importance) : undefined,
|
|
977
988
|
vectorPrune: vectorStore ? (threshold, maxPrune) => vectorStore.prune(threshold, maxPrune) : undefined,
|
|
978
989
|
});
|