@zooique/memora 0.3.0 → 2.0.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/README.md +8 -8
- package/dist/agent/agent.d.ts +69 -92
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +267 -197
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +3 -0
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +14 -4
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/builtinToolHandlers.d.ts +1 -1
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +5 -4
- package/dist/agent/builtinToolHandlers.js.map +1 -1
- package/dist/agent/guardrail.d.ts +47 -0
- package/dist/agent/guardrail.d.ts.map +1 -0
- package/dist/agent/guardrail.js +51 -0
- package/dist/agent/guardrail.js.map +1 -0
- package/dist/agent/loop.d.ts +79 -18
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +317 -231
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/chatLockManager.d.ts +116 -0
- package/dist/agent/managers/chatLockManager.d.ts.map +1 -0
- package/dist/agent/managers/chatLockManager.js +191 -0
- package/dist/agent/managers/chatLockManager.js.map +1 -0
- package/dist/agent/managers/insightExtractor.d.ts +34 -69
- package/dist/agent/managers/insightExtractor.d.ts.map +1 -1
- package/dist/agent/managers/insightExtractor.js +133 -189
- package/dist/agent/managers/insightExtractor.js.map +1 -1
- package/dist/agent/managers/memoryAdvisor.d.ts +102 -2
- package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
- package/dist/agent/managers/memoryAdvisor.js +262 -4
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts +85 -0
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.js +215 -0
- package/dist/agent/managers/memoryDecayScheduler.js.map +1 -1
- package/dist/agent/managers/memoryInspector.d.ts +230 -64
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +439 -81
- package/dist/agent/managers/memoryInspector.js.map +1 -1
- package/dist/agent/managers/relationBuilder.d.ts +131 -0
- package/dist/agent/managers/relationBuilder.d.ts.map +1 -0
- package/dist/agent/managers/relationBuilder.js +192 -0
- package/dist/agent/managers/relationBuilder.js.map +1 -0
- package/dist/agent/managers/sessionArchiver.d.ts +6 -0
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
- package/dist/agent/managers/sessionArchiver.js +68 -8
- package/dist/agent/managers/sessionArchiver.js.map +1 -1
- package/dist/agent/managers/sessionManager.d.ts.map +1 -1
- package/dist/agent/managers/sessionManager.js +9 -17
- package/dist/agent/managers/sessionManager.js.map +1 -1
- package/dist/agent/managers/textPolishManager.d.ts +62 -0
- package/dist/agent/managers/textPolishManager.d.ts.map +1 -0
- package/dist/agent/managers/textPolishManager.js +99 -0
- package/dist/agent/managers/textPolishManager.js.map +1 -0
- package/dist/agent/personaMatcher.d.ts +29 -0
- package/dist/agent/personaMatcher.d.ts.map +1 -0
- package/dist/agent/personaMatcher.js +60 -0
- package/dist/agent/personaMatcher.js.map +1 -0
- package/dist/agent/toolExecutor.d.ts +2 -2
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +2 -1
- package/dist/agent/toolExecutor.js.map +1 -1
- package/dist/agent/tracer.d.ts +31 -0
- package/dist/agent/tracer.d.ts.map +1 -1
- package/dist/agent/tracer.js +31 -0
- package/dist/agent/tracer.js.map +1 -1
- package/dist/agent/types.d.ts +132 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +38 -0
- package/dist/agent/types.js.map +1 -1
- package/dist/config/loader.d.ts +52 -40
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +52 -32
- package/dist/config/loader.js.map +1 -1
- package/dist/eval/evalRunner.d.ts +94 -0
- package/dist/eval/evalRunner.d.ts.map +1 -0
- package/dist/eval/evalRunner.js +141 -0
- package/dist/eval/evalRunner.js.map +1 -0
- package/dist/eval/evalTypes.d.ts +33 -3
- package/dist/eval/evalTypes.d.ts.map +1 -1
- package/dist/eval/evalTypes.js +18 -2
- package/dist/eval/evalTypes.js.map +1 -1
- package/dist/eval/scenarios.d.ts +33 -0
- package/dist/eval/scenarios.d.ts.map +1 -0
- package/dist/eval/scenarios.js +109 -0
- package/dist/eval/scenarios.js.map +1 -0
- package/dist/index.d.ts +51 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -6
- package/dist/index.js.map +1 -1
- package/dist/llm/abortSignal.d.ts +27 -0
- package/dist/llm/abortSignal.d.ts.map +1 -0
- package/dist/llm/abortSignal.js +44 -0
- package/dist/llm/abortSignal.js.map +1 -0
- package/dist/llm/embedding.d.ts +7 -2
- package/dist/llm/embedding.d.ts.map +1 -1
- package/dist/llm/embedding.js +66 -46
- package/dist/llm/embedding.js.map +1 -1
- package/dist/llm/factory.js +1 -1
- package/dist/llm/factory.js.map +1 -1
- package/dist/llm/openaiCompatible.d.ts.map +1 -1
- package/dist/llm/openaiCompatible.js +26 -27
- package/dist/llm/openaiCompatible.js.map +1 -1
- package/dist/llm/provider.d.ts +0 -14
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/llm/provider.js.map +1 -1
- package/dist/logging/logger.d.ts +1 -0
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +43 -37
- package/dist/logging/logger.js.map +1 -1
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +8 -7
- package/dist/memory/inMemoryStorage.js.map +1 -1
- package/dist/memory/lockManager.d.ts +48 -0
- package/dist/memory/lockManager.d.ts.map +1 -0
- package/dist/memory/lockManager.js +159 -0
- package/dist/memory/lockManager.js.map +1 -0
- package/dist/memory/projectManager.d.ts +23 -53
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +46 -227
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/projectRegistry.d.ts +62 -0
- package/dist/memory/projectRegistry.d.ts.map +1 -0
- package/dist/memory/projectRegistry.js +158 -0
- package/dist/memory/projectRegistry.js.map +1 -0
- package/dist/memory/recall.d.ts +3 -3
- package/dist/memory/recall.d.ts.map +1 -1
- package/dist/memory/recall.js +3 -3
- package/dist/memory/recall.js.map +1 -1
- package/dist/memory/sourceValidation.d.ts +49 -0
- package/dist/memory/sourceValidation.d.ts.map +1 -0
- package/dist/memory/sourceValidation.js +141 -0
- package/dist/memory/sourceValidation.js.map +1 -0
- package/dist/memory/store.d.ts.map +1 -1
- package/dist/memory/store.js +2 -1
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/types.d.ts +0 -47
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +0 -138
- package/dist/memory/types.js.map +1 -1
- package/dist/memory/vectorStore.d.ts +82 -7
- package/dist/memory/vectorStore.d.ts.map +1 -1
- package/dist/memory/vectorStore.js +12 -8
- package/dist/memory/vectorStore.js.map +1 -1
- package/dist/persona/personaManager.d.ts +30 -4
- package/dist/persona/personaManager.d.ts.map +1 -1
- package/dist/persona/personaManager.js +47 -14
- package/dist/persona/personaManager.js.map +1 -1
- package/dist/security/pathGuard.d.ts.map +1 -1
- package/dist/security/pathGuard.js +3 -1
- package/dist/security/pathGuard.js.map +1 -1
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +2 -1
- package/dist/skill/skillManager.js.map +1 -1
- package/dist/utils/array.d.ts +24 -0
- package/dist/utils/array.d.ts.map +1 -0
- package/dist/utils/array.js +24 -0
- package/dist/utils/array.js.map +1 -0
- package/dist/utils/errors.d.ts +10 -8
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +12 -9
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +7 -0
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js.map +1 -1
- package/dist/utils/objects.d.ts +17 -0
- package/dist/utils/objects.d.ts.map +1 -0
- package/dist/utils/objects.js +19 -0
- package/dist/utils/objects.js.map +1 -0
- package/dist/utils/segmenter.d.ts +17 -0
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +26 -0
- package/dist/utils/segmenter.js.map +1 -1
- package/dist/utils/strings.d.ts +22 -1
- package/dist/utils/strings.d.ts.map +1 -1
- package/dist/utils/strings.js +29 -1
- package/dist/utils/strings.js.map +1 -1
- package/dist/utils/time.d.ts +18 -3
- package/dist/utils/time.d.ts.map +1 -1
- package/dist/utils/time.js +24 -8
- package/dist/utils/time.js.map +1 -1
- package/dist/utils/toError.d.ts +8 -4
- package/dist/utils/toError.d.ts.map +1 -1
- package/dist/utils/toError.js +25 -5
- package/dist/utils/toError.js.map +1 -1
- package/package.json +11 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { validateSource } from '../memory/
|
|
2
|
-
import {
|
|
1
|
+
import { validateSource } from '../memory/sourceValidation.js';
|
|
2
|
+
import { segmentLower } from '../utils/segmenter.js';
|
|
3
|
+
import { byScoreDesc } from '../utils/array.js';
|
|
3
4
|
import { configError } from '../utils/errors.js';
|
|
4
5
|
import { logger } from '../logging/logger.js';
|
|
5
6
|
import { applyDecayToMemory } from '../memory/recall.js';
|
|
@@ -206,7 +207,7 @@ export class InMemoryStorage {
|
|
|
206
207
|
getBySource(source) {
|
|
207
208
|
return Array.from(this.memories.values())
|
|
208
209
|
.filter((m) => m.source === source && m.deletedAt === undefined)
|
|
209
|
-
.sort(
|
|
210
|
+
.sort(byScoreDesc)
|
|
210
211
|
.map((m) => ({ ...m }));
|
|
211
212
|
}
|
|
212
213
|
/**
|
|
@@ -225,16 +226,16 @@ export class InMemoryStorage {
|
|
|
225
226
|
// 空查询:按 score 降序返回(浅拷贝,读取隔离)
|
|
226
227
|
if (!query.trim()) {
|
|
227
228
|
return activeMemories
|
|
228
|
-
.sort(
|
|
229
|
+
.sort(byScoreDesc)
|
|
229
230
|
.slice(0, limit)
|
|
230
231
|
.map((m) => ({ ...m }));
|
|
231
232
|
}
|
|
232
233
|
// 规范分词(与 recall.ts extractKeywords 共用 segmentText)
|
|
233
|
-
const tokens =
|
|
234
|
+
const tokens = segmentLower(query);
|
|
234
235
|
// 若分词后无有效 token,降级为按 score 返回
|
|
235
236
|
if (tokens.length === 0) {
|
|
236
237
|
return activeMemories
|
|
237
|
-
.sort(
|
|
238
|
+
.sort(byScoreDesc)
|
|
238
239
|
.slice(0, limit)
|
|
239
240
|
.map((m) => ({ ...m }));
|
|
240
241
|
}
|
|
@@ -244,7 +245,7 @@ export class InMemoryStorage {
|
|
|
244
245
|
return tokens.some((t) => text.includes(t));
|
|
245
246
|
});
|
|
246
247
|
// 按 score 降序排序
|
|
247
|
-
results.sort(
|
|
248
|
+
results.sort(byScoreDesc);
|
|
248
249
|
// 返回浅拷贝,避免调用方修改污染存储内部对象
|
|
249
250
|
return results.slice(0, limit).map((m) => ({ ...m }));
|
|
250
251
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inMemoryStorage.js","sourceRoot":"","sources":["../../src/memory/inMemoryStorage.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"inMemoryStorage.js","sourceRoot":"","sources":["../../src/memory/inMemoryStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 锁文件管理器
|
|
3
|
+
*
|
|
4
|
+
* 管理项目级 .lock 文件的生命周期,防止同项目并发写入导致数据损坏。
|
|
5
|
+
* 不强制阻止并发(CLI-first),检测到冲突仅警告。
|
|
6
|
+
*/
|
|
7
|
+
export declare class LockManager {
|
|
8
|
+
/** 当前持有的锁文件路径 */
|
|
9
|
+
private currentLockPath;
|
|
10
|
+
/**
|
|
11
|
+
* 获取当前锁文件路径(null 表示未持有锁)
|
|
12
|
+
*/
|
|
13
|
+
get currentPath(): string | null;
|
|
14
|
+
/**
|
|
15
|
+
* 获取锁文件
|
|
16
|
+
*
|
|
17
|
+
* 如果锁文件存在且进程存活,发出警告但不阻止。
|
|
18
|
+
* 如果锁文件存在但进程已死,清理残留锁。
|
|
19
|
+
* 如果锁文件损坏(结构不合法),清理后重新获取。
|
|
20
|
+
*
|
|
21
|
+
* @param memoraDir - 项目 .memora/ 目录(锁文件所在目录)
|
|
22
|
+
*/
|
|
23
|
+
acquire(memoraDir: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* 释放锁文件
|
|
26
|
+
*
|
|
27
|
+
* 删除当前持有的锁文件,并重置内部状态。
|
|
28
|
+
* 未持有锁时为 no-op。
|
|
29
|
+
*/
|
|
30
|
+
release(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* 安全删除文件(忽略不存在的错误)
|
|
33
|
+
*
|
|
34
|
+
* @param filePath - 待删除文件路径
|
|
35
|
+
*/
|
|
36
|
+
private safeUnlink;
|
|
37
|
+
/**
|
|
38
|
+
* 检查进程是否存活
|
|
39
|
+
*
|
|
40
|
+
* 跨平台统一使用 process.kill(pid, 0) 探测进程存活
|
|
41
|
+
* (Windows 上 process.kill(pid, 0) 同样有效)
|
|
42
|
+
*
|
|
43
|
+
* @param pid - 待检查的进程 ID
|
|
44
|
+
* @returns true 表示进程存活
|
|
45
|
+
*/
|
|
46
|
+
private isProcessAlive;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=lockManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockManager.d.ts","sourceRoot":"","sources":["../../src/memory/lockManager.ts"],"names":[],"mappings":"AAkEA;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,iBAAiB;IACjB,OAAO,CAAC,eAAe,CAAuB;IAE9C;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,GAAG,IAAI,CAE/B;IAED;;;;;;;;OAQG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4C/C;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;;;OAIG;YACW,UAAU;IAQxB;;;;;;;;OAQG;IACH,OAAO,CAAC,cAAc;CAWvB"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 锁文件管理器 — 项目级并发保护
|
|
3
|
+
*
|
|
4
|
+
* 从 ProjectManager 拆分出来,专职管理 .memora/.lock 文件:
|
|
5
|
+
* - 获取锁(写入 PID + 时间戳 + 主机名)
|
|
6
|
+
* - 释放锁(删除锁文件)
|
|
7
|
+
* - 残留锁检测(进程存活判断 + 自动清理)
|
|
8
|
+
* - 锁文件结构校验(QC-24 类型守卫,替代 `as` 类型断言)
|
|
9
|
+
*
|
|
10
|
+
* 设计原则:
|
|
11
|
+
* - 跨平台兼容(process.kill(pid, 0) 在 POSIX + Windows 均有效)
|
|
12
|
+
* - 不强制阻止并发(CLI-first,检测到冲突仅警告,用户决定)
|
|
13
|
+
* - 安全降级(锁文件损坏/进程已死 → 清理残留 → 重新获取)
|
|
14
|
+
*
|
|
15
|
+
* 锁文件策略:
|
|
16
|
+
* - 打开项目时创建 .lock 文件(含 PID + 时间戳 + 主机名)
|
|
17
|
+
* - 关闭/切换项目时删除 .lock 文件
|
|
18
|
+
* - 检测到残留锁时:判断进程是否存活 → 存活则警告 / 已死则清理
|
|
19
|
+
*
|
|
20
|
+
* 与 ProjectManager 的分工(1.0 接口稳定化):
|
|
21
|
+
* - LockManager:锁文件获取/释放 + 残留锁检测/清理
|
|
22
|
+
* - ProjectManager:项目生命周期编排(注册 + 资源加载 + 上下文构建)
|
|
23
|
+
*
|
|
24
|
+
* 详见 ADR-008 · 目录结构按"职责分层"
|
|
25
|
+
*/
|
|
26
|
+
import { join } from 'node:path';
|
|
27
|
+
import { hostname } from 'node:os';
|
|
28
|
+
import { mkdir, readFile, writeFile, unlink } from 'node:fs/promises';
|
|
29
|
+
import { logger } from '../logging/logger.js';
|
|
30
|
+
import { toError } from '../utils/toError.js';
|
|
31
|
+
import { nowIso } from '../utils/time.js';
|
|
32
|
+
import { isPlainObject } from '../utils/objects.js';
|
|
33
|
+
// ─── 类型守卫(QC-24,对不可信磁盘 JSON 运行时校验) ─────
|
|
34
|
+
/**
|
|
35
|
+
* 判断值是否为 LockInfo(锁文件结构)
|
|
36
|
+
*
|
|
37
|
+
* @param value 待校验的值
|
|
38
|
+
* @returns true 表示符合 LockInfo 结构
|
|
39
|
+
*/
|
|
40
|
+
function isLockInfo(value) {
|
|
41
|
+
if (!isPlainObject(value))
|
|
42
|
+
return false;
|
|
43
|
+
return (typeof value['pid'] === 'number' &&
|
|
44
|
+
typeof value['acquiredAt'] === 'string' &&
|
|
45
|
+
typeof value['hostname'] === 'string');
|
|
46
|
+
}
|
|
47
|
+
// ─── 类 ──────────────────────────────────────────────────
|
|
48
|
+
/**
|
|
49
|
+
* 锁文件管理器
|
|
50
|
+
*
|
|
51
|
+
* 管理项目级 .lock 文件的生命周期,防止同项目并发写入导致数据损坏。
|
|
52
|
+
* 不强制阻止并发(CLI-first),检测到冲突仅警告。
|
|
53
|
+
*/
|
|
54
|
+
export class LockManager {
|
|
55
|
+
/** 当前持有的锁文件路径 */
|
|
56
|
+
currentLockPath = null;
|
|
57
|
+
/**
|
|
58
|
+
* 获取当前锁文件路径(null 表示未持有锁)
|
|
59
|
+
*/
|
|
60
|
+
get currentPath() {
|
|
61
|
+
return this.currentLockPath;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 获取锁文件
|
|
65
|
+
*
|
|
66
|
+
* 如果锁文件存在且进程存活,发出警告但不阻止。
|
|
67
|
+
* 如果锁文件存在但进程已死,清理残留锁。
|
|
68
|
+
* 如果锁文件损坏(结构不合法),清理后重新获取。
|
|
69
|
+
*
|
|
70
|
+
* @param memoraDir - 项目 .memora/ 目录(锁文件所在目录)
|
|
71
|
+
*/
|
|
72
|
+
async acquire(memoraDir) {
|
|
73
|
+
const lockPath = join(memoraDir, '.lock');
|
|
74
|
+
try {
|
|
75
|
+
// 尝试读取锁文件(存在时)
|
|
76
|
+
const raw = await readFile(lockPath, 'utf-8');
|
|
77
|
+
// QC-24 使用类型守卫校验 JSON.parse 结果,替代 `as LockInfo` 类型断言
|
|
78
|
+
const parsed = JSON.parse(raw);
|
|
79
|
+
if (isLockInfo(parsed)) {
|
|
80
|
+
// 合法锁文件:检查进程是否存活
|
|
81
|
+
const info = parsed;
|
|
82
|
+
if (this.isProcessAlive(info.pid)) {
|
|
83
|
+
logger.warn({ pid: info.pid, acquiredAt: info.acquiredAt, hostname: info.hostname }, '项目已被其他进程打开(锁文件存在),继续操作可能导致数据冲突');
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// 残留锁,清理
|
|
87
|
+
logger.info({ pid: info.pid }, '清理残留锁文件(进程已退出)');
|
|
88
|
+
await this.safeUnlink(lockPath);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// 锁文件结构损坏(合法 JSON 但非 LockInfo),清理后 fall through 到写入新锁
|
|
93
|
+
logger.warn({ path: lockPath }, '锁文件结构损坏,清理残留');
|
|
94
|
+
await this.safeUnlink(lockPath);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
// 锁文件不存在或损坏,清理:记录 debug 日志便于排查(不存在属正常首次启动)
|
|
99
|
+
logger.debug({ path: lockPath, err: toError(err).message }, '锁文件读取失败,清理残留');
|
|
100
|
+
await this.safeUnlink(lockPath);
|
|
101
|
+
}
|
|
102
|
+
// 写入新锁
|
|
103
|
+
const lockInfo = {
|
|
104
|
+
pid: process.pid,
|
|
105
|
+
acquiredAt: nowIso(),
|
|
106
|
+
hostname: hostname(),
|
|
107
|
+
};
|
|
108
|
+
await mkdir(memoraDir, { recursive: true });
|
|
109
|
+
await writeFile(lockPath, JSON.stringify(lockInfo, null, 2), 'utf-8');
|
|
110
|
+
this.currentLockPath = lockPath;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 释放锁文件
|
|
114
|
+
*
|
|
115
|
+
* 删除当前持有的锁文件,并重置内部状态。
|
|
116
|
+
* 未持有锁时为 no-op。
|
|
117
|
+
*/
|
|
118
|
+
async release() {
|
|
119
|
+
if (this.currentLockPath) {
|
|
120
|
+
await this.safeUnlink(this.currentLockPath);
|
|
121
|
+
this.currentLockPath = null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 安全删除文件(忽略不存在的错误)
|
|
126
|
+
*
|
|
127
|
+
* @param filePath - 待删除文件路径
|
|
128
|
+
*/
|
|
129
|
+
async safeUnlink(filePath) {
|
|
130
|
+
try {
|
|
131
|
+
await unlink(filePath);
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
logger.debug({ path: filePath, err: toError(err).message }, 'safeUnlink 忽略删除失败');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* 检查进程是否存活
|
|
139
|
+
*
|
|
140
|
+
* 跨平台统一使用 process.kill(pid, 0) 探测进程存活
|
|
141
|
+
* (Windows 上 process.kill(pid, 0) 同样有效)
|
|
142
|
+
*
|
|
143
|
+
* @param pid - 待检查的进程 ID
|
|
144
|
+
* @returns true 表示进程存活
|
|
145
|
+
*/
|
|
146
|
+
isProcessAlive(pid) {
|
|
147
|
+
try {
|
|
148
|
+
// 发送信号 0 检查进程是否存在(POSIX 兼容)
|
|
149
|
+
// Windows 上 process.kill(pid, 0) 也会抛出错误如果进程不存在
|
|
150
|
+
process.kill(pid, 0);
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
logger.debug({ pid }, '进程不存在');
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=lockManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockManager.js","sourceRoot":"","sources":["../../src/memory/lockManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAgBnD,0CAA0C;AAE1C;;;;;GAKG;AACH,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,CACL,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ;QAChC,OAAO,KAAK,CAAC,YAAY,CAAC,KAAK,QAAQ;QACvC,OAAO,KAAK,CAAC,UAAU,CAAC,KAAK,QAAQ,CACtC,CAAC;AACJ,CAAC;AAED,2DAA2D;AAE3D;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IACtB,iBAAiB;IACT,eAAe,GAAkB,IAAI,CAAC;IAE9C;;OAEG;IACH,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,OAAO,CAAC,SAAiB;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,eAAe;YACf,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC9C,qDAAqD;YACrD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,iBAAiB;gBACjB,MAAM,IAAI,GAAG,MAAM,CAAC;gBACpB,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClC,MAAM,CAAC,IAAI,CACT,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EACvE,gCAAgC,CACjC,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,SAAS;oBACT,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;oBACjD,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,sDAAsD;gBACtD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,cAAc,CAAC,CAAC;gBAChD,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,2CAA2C;YAC3C,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;YAC5E,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAED,OAAO;QACP,MAAM,QAAQ,GAAa;YACzB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,UAAU,EAAE,MAAM,EAAE;YACpB,QAAQ,EAAE,QAAQ,EAAE;SACrB,CAAC;QAEF,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACtE,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC5C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,UAAU,CAAC,QAAgB;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,mBAAmB,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,cAAc,CAAC,GAAW;QAChC,IAAI,CAAC;YACH,4BAA4B;YAC5B,+CAA+C;YAC/C,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
|
|
@@ -3,6 +3,8 @@ import type { IMemoryStorage } from '../memory/storageInterface.js';
|
|
|
3
3
|
import type { LoadResult } from '../memory/loader.js';
|
|
4
4
|
import type { SecurityGuard } from '../security/pathGuard.js';
|
|
5
5
|
import { type Memory } from '../memory/types.js';
|
|
6
|
+
import { type ProjectEntry } from '../memory/projectRegistry.js';
|
|
7
|
+
export type { ProjectEntry } from '../memory/projectRegistry.js';
|
|
6
8
|
/**
|
|
7
9
|
* 项目上下文:打开一个项目后产出的一组组件
|
|
8
10
|
* 与 DomainContext 类似,但增加了项目级别的信息
|
|
@@ -27,17 +29,6 @@ export interface ProjectContext {
|
|
|
27
29
|
/** 加载结果 */
|
|
28
30
|
loadResult: LoadResult;
|
|
29
31
|
}
|
|
30
|
-
/**
|
|
31
|
-
* 项目注册表条目
|
|
32
|
-
*/
|
|
33
|
-
export interface ProjectEntry {
|
|
34
|
-
/** 项目根目录的绝对路径 */
|
|
35
|
-
path: string;
|
|
36
|
-
/** 项目名称(用户自定义或目录名) */
|
|
37
|
-
name: string;
|
|
38
|
-
/** 最后打开时间 */
|
|
39
|
-
lastOpened: string;
|
|
40
|
-
}
|
|
41
32
|
/**
|
|
42
33
|
* ProjectManager 构造选项
|
|
43
34
|
*/
|
|
@@ -64,22 +55,25 @@ export interface ProjectManagerOptions {
|
|
|
64
55
|
* 1. 初始化当前项目(加锁 + 加载两层配置)
|
|
65
56
|
* 2. /project <name> 切换到新项目(解锁旧项目 + 加锁新项目)
|
|
66
57
|
* 3. 退出时清理锁文件
|
|
58
|
+
*
|
|
59
|
+
* 注册表/锁文件实现委托给 ProjectRegistry / LockManager,
|
|
60
|
+
* 本类聚焦生命周期编排。
|
|
67
61
|
*/
|
|
68
62
|
export declare class ProjectManager {
|
|
69
|
-
/** 项目注册表路径 */
|
|
70
|
-
private readonly registryPath;
|
|
71
63
|
/** Agent 级数据目录(memora.db 所在目录) */
|
|
72
64
|
private readonly agentDataDir;
|
|
73
65
|
/** Agent 级存储实例(全局共享,不随项目切换重建) */
|
|
74
66
|
private agentIndex;
|
|
75
67
|
/** 当前打开的项目路径 */
|
|
76
68
|
private currentProjectPath;
|
|
77
|
-
/** 当前持有的锁文件路径 */
|
|
78
|
-
private currentLockPath;
|
|
79
69
|
/** 外部注入的存储实例(可选,不传则内部创建 InMemoryStorage 兜底) */
|
|
80
70
|
private externalStorage;
|
|
81
71
|
/** SecurityGuard 工厂函数(由 Agent 层注入) */
|
|
82
72
|
private readonly createSecurityGuard?;
|
|
73
|
+
/** 项目注册表(专职管理 projects.json) */
|
|
74
|
+
private readonly registry;
|
|
75
|
+
/** 锁文件管理器(专职管理 .memora/.lock) */
|
|
76
|
+
private readonly lockManager;
|
|
83
77
|
constructor(options: ProjectManagerOptions);
|
|
84
78
|
/**
|
|
85
79
|
* 确保 Agent 级资源已初始化(存储实例)
|
|
@@ -145,67 +139,43 @@ export declare class ProjectManager {
|
|
|
145
139
|
shutdown(): Promise<void>;
|
|
146
140
|
/**
|
|
147
141
|
* 列出已注册的项目(IX-02:统一为 getter 风格,与 persona/skill 一致)
|
|
142
|
+
*
|
|
143
|
+
* 委托给 ProjectRegistry。
|
|
148
144
|
*/
|
|
149
145
|
get list(): ProjectEntry[];
|
|
150
146
|
/**
|
|
151
147
|
* 列出已注册的项目
|
|
152
|
-
*
|
|
148
|
+
*
|
|
149
|
+
* v1.0 公共 API(CHANGELOG 迁移路径:`agent.listProjects()` → `agent.projects.listProjects()`)。
|
|
150
|
+
* 与 `.list` getter 等价,保留方法形式以兼容 0.3 迁移路径。
|
|
153
151
|
*/
|
|
154
152
|
listProjects(): ProjectEntry[];
|
|
155
153
|
/**
|
|
156
154
|
* 注册项目到注册表
|
|
155
|
+
*
|
|
156
|
+
* 委托给 ProjectRegistry。
|
|
157
|
+
*
|
|
158
|
+
* @param projectPath 项目根目录
|
|
159
|
+
* @param name 项目名称
|
|
157
160
|
*/
|
|
158
161
|
registerProject(projectPath: string, name: string): void;
|
|
159
162
|
/**
|
|
160
163
|
* 从注册表移除项目
|
|
164
|
+
*
|
|
165
|
+
* 委托给 ProjectRegistry。
|
|
166
|
+
*
|
|
167
|
+
* @param projectPath 项目根目录
|
|
161
168
|
*/
|
|
162
169
|
unregisterProject(projectPath: string): void;
|
|
163
170
|
/**
|
|
164
171
|
* 获取当前项目路径
|
|
165
172
|
*/
|
|
166
173
|
get currentProject(): string | null;
|
|
167
|
-
/**
|
|
168
|
-
* 获取锁文件
|
|
169
|
-
* 如果锁文件存在且进程存活,发出警告但不阻止
|
|
170
|
-
* 如果锁文件存在但进程已死,清理残留锁
|
|
171
|
-
*/
|
|
172
|
-
private acquireLock;
|
|
173
|
-
/**
|
|
174
|
-
* 释放锁文件
|
|
175
|
-
*/
|
|
176
|
-
private releaseLock;
|
|
177
|
-
/**
|
|
178
|
-
* 安全删除文件(忽略不存在的错误)
|
|
179
|
-
*/
|
|
180
|
-
private safeUnlink;
|
|
181
|
-
/**
|
|
182
|
-
* 检查进程是否存活
|
|
183
|
-
*
|
|
184
|
-
* 跨平台统一使用 process.kill(pid, 0) 探测进程存活
|
|
185
|
-
* (Windows 上 process.kill(pid, 0) 同样有效)
|
|
186
|
-
*/
|
|
187
|
-
private isProcessAlive;
|
|
188
174
|
/**
|
|
189
175
|
* 解析项目的 .memora/ 目录路径
|
|
190
176
|
* 每个项目有独立的 .memora/ 目录(在项目根目录下)
|
|
191
177
|
* 这与 config.memory.dataDir(用户级默认目录)不同
|
|
192
178
|
*/
|
|
193
179
|
private resolveMemoraDir;
|
|
194
|
-
/**
|
|
195
|
-
* 从项目路径推断项目名称
|
|
196
|
-
* 取路径最后一段目录名
|
|
197
|
-
*/
|
|
198
|
-
private inferProjectName;
|
|
199
|
-
/**
|
|
200
|
-
* 读取项目注册表
|
|
201
|
-
*
|
|
202
|
-
* 同步读取:list getter 契约要求同步返回,注册表操作低频,同步 I/O 影响可控
|
|
203
|
-
* 损坏时返回空数组并记录警告日志,避免静默吞错掩盖磁盘故障
|
|
204
|
-
*/
|
|
205
|
-
private readRegistry;
|
|
206
|
-
/**
|
|
207
|
-
* 写入项目注册表
|
|
208
|
-
*/
|
|
209
|
-
private writeRegistry;
|
|
210
180
|
}
|
|
211
181
|
//# sourceMappingURL=projectManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectManager.d.ts","sourceRoot":"","sources":["../../src/memory/projectManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"projectManager.d.ts","sourceRoot":"","sources":["../../src/memory/projectManager.ts"],"names":[],"mappings":"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"}
|