@co-engram/core 0.1.4 → 0.1.6
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/dedup/hash.d.ts +8 -0
- package/dist/dedup/hash.d.ts.map +1 -1
- package/dist/dedup/hash.js +26 -2
- package/dist/dedup/hash.js.map +1 -1
- package/dist/dreaming/decay.d.ts.map +1 -1
- package/dist/dreaming/decay.js +1 -1
- package/dist/dreaming/decay.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +43 -16
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts +29 -9
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +43 -16
- package/dist/i18n/zh.js.map +1 -1
- package/dist/importance/vector.d.ts +4 -4
- package/dist/importance/vector.d.ts.map +1 -1
- package/dist/importance/vector.js +7 -12
- package/dist/importance/vector.js.map +1 -1
- package/dist/lifecycle/freshness.d.ts +25 -6
- package/dist/lifecycle/freshness.d.ts.map +1 -1
- package/dist/lifecycle/freshness.js +37 -21
- package/dist/lifecycle/freshness.js.map +1 -1
- package/dist/merge-driver.cjs +1 -1
- package/dist/observability/proposal-engine.d.ts +94 -10
- package/dist/observability/proposal-engine.d.ts.map +1 -1
- package/dist/observability/proposal-engine.js +169 -4
- package/dist/observability/proposal-engine.js.map +1 -1
- package/dist/prompt-builder/builder.d.ts +3 -0
- package/dist/prompt-builder/builder.d.ts.map +1 -1
- package/dist/prompt-builder/builder.js +45 -3
- package/dist/prompt-builder/builder.js.map +1 -1
- package/dist/prompt-builder/index.d.ts +1 -0
- package/dist/prompt-builder/index.d.ts.map +1 -1
- package/dist/prompt-builder/index.js +1 -0
- package/dist/prompt-builder/index.js.map +1 -1
- package/dist/prompt-builder/path-overview.d.ts +35 -0
- package/dist/prompt-builder/path-overview.d.ts.map +1 -0
- package/dist/prompt-builder/path-overview.js +44 -0
- package/dist/prompt-builder/path-overview.js.map +1 -0
- package/dist/prompt-builder/types.d.ts +11 -0
- package/dist/prompt-builder/types.d.ts.map +1 -1
- package/dist/retrieval/index.d.ts +2 -0
- package/dist/retrieval/index.d.ts.map +1 -1
- package/dist/retrieval/index.js +2 -0
- package/dist/retrieval/index.js.map +1 -1
- package/dist/retrieval/scoring.d.ts +7 -4
- package/dist/retrieval/scoring.d.ts.map +1 -1
- package/dist/retrieval/scoring.js +9 -16
- package/dist/retrieval/scoring.js.map +1 -1
- package/dist/retrieval/search-engine.d.ts +58 -0
- package/dist/retrieval/search-engine.d.ts.map +1 -0
- package/dist/retrieval/search-engine.js +53 -0
- package/dist/retrieval/search-engine.js.map +1 -0
- package/dist/retrieval/sqlite-orchestrator.d.ts +68 -0
- package/dist/retrieval/sqlite-orchestrator.d.ts.map +1 -0
- package/dist/retrieval/sqlite-orchestrator.js +148 -0
- package/dist/retrieval/sqlite-orchestrator.js.map +1 -0
- package/dist/storage/bootstrap.d.ts +31 -0
- package/dist/storage/bootstrap.d.ts.map +1 -0
- package/dist/storage/bootstrap.js +89 -0
- package/dist/storage/bootstrap.js.map +1 -0
- package/dist/storage/engram-index.d.ts +9 -0
- package/dist/storage/engram-index.d.ts.map +1 -1
- package/dist/storage/engram-index.js +38 -0
- package/dist/storage/engram-index.js.map +1 -1
- package/dist/storage/index-cleanup.d.ts +45 -0
- package/dist/storage/index-cleanup.d.ts.map +1 -0
- package/dist/storage/index-cleanup.js +186 -0
- package/dist/storage/index-cleanup.js.map +1 -0
- package/dist/storage/index-db-cursor.d.ts +27 -0
- package/dist/storage/index-db-cursor.d.ts.map +1 -0
- package/dist/storage/index-db-cursor.js +59 -0
- package/dist/storage/index-db-cursor.js.map +1 -0
- package/dist/storage/index-db.d.ts +112 -0
- package/dist/storage/index-db.d.ts.map +1 -0
- package/dist/storage/index-db.js +183 -0
- package/dist/storage/index-db.js.map +1 -0
- package/dist/storage/index.d.ts +4 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +6 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/repository.d.ts +117 -21
- package/dist/storage/repository.d.ts.map +1 -1
- package/dist/storage/repository.js +222 -51
- package/dist/storage/repository.js.map +1 -1
- package/dist/tools/audit-query-tool.d.ts +2 -2
- package/dist/tools/doctor-tools.d.ts.map +1 -1
- package/dist/tools/doctor-tools.js +18 -3
- package/dist/tools/doctor-tools.js.map +1 -1
- package/dist/tools/engram-tools.d.ts.map +1 -1
- package/dist/tools/engram-tools.js +12 -2
- package/dist/tools/engram-tools.js.map +1 -1
- package/dist/tools/proposal-tools.d.ts +2 -0
- package/dist/tools/proposal-tools.d.ts.map +1 -1
- package/dist/tools/proposal-tools.js +19 -4
- package/dist/tools/proposal-tools.js.map +1 -1
- package/dist/tools/schemas.d.ts +78 -70
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +6 -0
- package/dist/tools/schemas.js.map +1 -1
- package/dist/tools/tool.d.ts +1 -1
- package/dist/tools/tool.d.ts.map +1 -1
- package/dist/types/repository-types.d.ts +1 -1
- package/dist/types/repository-types.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-orchestrator.js","sourceRoot":"","sources":["../../src/retrieval/sqlite-orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Language } from "../i18n/index.js";
|
|
2
|
+
import { type SearchEngine, type SearchEngineType } from "../retrieval/search-engine.js";
|
|
3
|
+
import { EngramRepository } from "./repository.js";
|
|
4
|
+
import { IndexDb } from "./index-db.js";
|
|
5
|
+
export interface BootstrapOptions {
|
|
6
|
+
readonly dataRoot: string;
|
|
7
|
+
readonly language?: Language;
|
|
8
|
+
/** 注入 env(测试用);默认 process.env */
|
|
9
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
10
|
+
}
|
|
11
|
+
export interface BootstrapResult {
|
|
12
|
+
readonly repository: EngramRepository;
|
|
13
|
+
readonly searchEngine: SearchEngine;
|
|
14
|
+
readonly engineType: SearchEngineType;
|
|
15
|
+
/** SQLite 模式下的 indexDb 引用;memory 模式为 undefined。host 持有以在
|
|
16
|
+
* 关闭时显式 close()(进程退出时 OS 自动回收 fd,但测试 / 显式资源管理
|
|
17
|
+
* 需要确定性释放)。 */
|
|
18
|
+
readonly indexDb?: IndexDb;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 装配 EngramRepository + SearchEngine。
|
|
22
|
+
*
|
|
23
|
+
* Engine 选择:env.CO_ENGRAM_SEARCH_ENGINE=sqlite → SQLite FTS5 模式;
|
|
24
|
+
* 未设置 / 其他值 → 默认 memory(in-memory Intl.Segmenter)。
|
|
25
|
+
*
|
|
26
|
+
* Cold start 行为(sqlite 模式):db 为空时,从 repository.listEngrams()
|
|
27
|
+
* 枚举全量 engram,readEngram() 读详情,转 EngramIndexEntry[] 后
|
|
28
|
+
* rebuildFromEntries() 一次性灌入。已有数据的 db 不重建。
|
|
29
|
+
*/
|
|
30
|
+
export declare function bootstrapRepositoryAndSearch(opts: BootstrapOptions): BootstrapResult;
|
|
31
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/storage/bootstrap.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAyB,MAAM,eAAe,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,iCAAiC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC;;oBAEgB;IAChB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,gBAAgB,GACrB,eAAe,CAkDjB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// packages/core/src/storage/bootstrap.ts
|
|
2
|
+
//
|
|
3
|
+
// 装配 EngramRepository + SearchEngine —— 把 host adapter(claude-code-mcp /
|
|
4
|
+
// openclaw-plugin)共用的初始化逻辑抽到 core,避免双宿主行为漂移。
|
|
5
|
+
//
|
|
6
|
+
// 默认行为(memory 模式)完全等同此前各 host 内联的 new SearchOrchestrator()
|
|
7
|
+
// + rebuildSearchIndex。sqlite 模式额外做:
|
|
8
|
+
// 1. 打开 .co-engram/index.db(WAL,首次自动建 schema)
|
|
9
|
+
// 2. 把 indexDb 注入 EngramRepository(开启 write-through)
|
|
10
|
+
// 3. Cold start:db 为空时从 engrams/*.md 全量重建索引
|
|
11
|
+
// 4. 用 SqliteSearchEngineAdapter 包装 SearchEngine
|
|
12
|
+
//
|
|
13
|
+
// @module @co-engram/core/storage
|
|
14
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { createSearchEngine, resolveSearchEngineType, } from "../retrieval/search-engine.js";
|
|
17
|
+
import { EngramRepository } from "./repository.js";
|
|
18
|
+
import { IndexDb } from "./index-db.js";
|
|
19
|
+
/**
|
|
20
|
+
* 装配 EngramRepository + SearchEngine。
|
|
21
|
+
*
|
|
22
|
+
* Engine 选择:env.CO_ENGRAM_SEARCH_ENGINE=sqlite → SQLite FTS5 模式;
|
|
23
|
+
* 未设置 / 其他值 → 默认 memory(in-memory Intl.Segmenter)。
|
|
24
|
+
*
|
|
25
|
+
* Cold start 行为(sqlite 模式):db 为空时,从 repository.listEngrams()
|
|
26
|
+
* 枚举全量 engram,readEngram() 读详情,转 EngramIndexEntry[] 后
|
|
27
|
+
* rebuildFromEntries() 一次性灌入。已有数据的 db 不重建。
|
|
28
|
+
*/
|
|
29
|
+
export function bootstrapRepositoryAndSearch(opts) {
|
|
30
|
+
const engineType = resolveSearchEngineType(opts.env);
|
|
31
|
+
if (engineType === "sqlite") {
|
|
32
|
+
const dbDir = join(opts.dataRoot, ".co-engram");
|
|
33
|
+
if (!existsSync(dbDir))
|
|
34
|
+
mkdirSync(dbDir, { recursive: true });
|
|
35
|
+
const dbPath = join(dbDir, "index.db");
|
|
36
|
+
const indexDb = new IndexDb({ dbPath });
|
|
37
|
+
indexDb.open();
|
|
38
|
+
// 先构造 repository with indexDb,write-through 在后续所有写入路径生效
|
|
39
|
+
const repository = new EngramRepository({
|
|
40
|
+
rootPath: opts.dataRoot,
|
|
41
|
+
...(opts.language ? { language: opts.language } : {}),
|
|
42
|
+
}, indexDb);
|
|
43
|
+
// Cold start:db 空时全量重建
|
|
44
|
+
const count = indexDb.prepare("SELECT count(*) as n FROM engrams").get();
|
|
45
|
+
if (count.n === 0) {
|
|
46
|
+
const entries = [];
|
|
47
|
+
// listEngrams 返回 EngramCatalogEntry[],取 .id 作为 readEngram 入参
|
|
48
|
+
for (const catalog of repository.listEngrams()) {
|
|
49
|
+
try {
|
|
50
|
+
const engram = repository.readEngram(catalog.id);
|
|
51
|
+
if (!engram)
|
|
52
|
+
continue;
|
|
53
|
+
entries.push(engramToIndexEntry(engram));
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// 跳过损坏 engram;doctor 自愈路径会单独处理
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
indexDb.rebuildFromEntries(entries);
|
|
60
|
+
}
|
|
61
|
+
const searchEngine = createSearchEngine({ type: "sqlite", indexDb });
|
|
62
|
+
return { repository, searchEngine, engineType, indexDb };
|
|
63
|
+
}
|
|
64
|
+
// memory 模式:行为与原 host 内联代码等价
|
|
65
|
+
const repository = new EngramRepository({
|
|
66
|
+
rootPath: opts.dataRoot,
|
|
67
|
+
...(opts.language ? { language: opts.language } : {}),
|
|
68
|
+
});
|
|
69
|
+
const searchEngine = createSearchEngine({ type: "memory" });
|
|
70
|
+
return { repository, searchEngine, engineType };
|
|
71
|
+
}
|
|
72
|
+
/** Engram → EngramIndexEntry 投影(与 repository.syncEngramToIndex 同义) */
|
|
73
|
+
function engramToIndexEntry(e) {
|
|
74
|
+
return {
|
|
75
|
+
id: e.id,
|
|
76
|
+
title: e.title,
|
|
77
|
+
kind: e.kind,
|
|
78
|
+
importance: e.importance,
|
|
79
|
+
confidence: e.confidence,
|
|
80
|
+
updatedAt: Date.parse(e.updatedAt),
|
|
81
|
+
contentSize: e.contentSize,
|
|
82
|
+
visibility: e.visibility,
|
|
83
|
+
status: e.status,
|
|
84
|
+
domainTags: [...e.domainTags],
|
|
85
|
+
summary: e.summary,
|
|
86
|
+
contentTokens: e.content,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/storage/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -58,6 +58,15 @@ export declare function buildIndexEntryFromFrontmatter(params: {
|
|
|
58
58
|
* - frontmatter 缺 id 的 .md 跳过(由 doctor 报告为 orphan_markdown)
|
|
59
59
|
*/
|
|
60
60
|
export declare function rebuildEngramIndex(dataRoot: string, onOrphan?: (relativePath: string) => void): EngramIndexMap;
|
|
61
|
+
/**
|
|
62
|
+
* 收集 dataRoot 下所有 .md 文件(跳过 SKIP_DIRECTORIES 与 SKIP_MARKDOWN_FILENAMES)。
|
|
63
|
+
*
|
|
64
|
+
* 与 rebuildEngramIndex 共用同一份"哪些目录/文件不扫"规则,确保 watcher 的
|
|
65
|
+
* 外部提案扫描与索引重建看到一致的文件集合。
|
|
66
|
+
*
|
|
67
|
+
* @returns 绝对路径数组(无特定顺序)
|
|
68
|
+
*/
|
|
69
|
+
export declare function collectMarkdownFiles(dataRoot: string): string[];
|
|
61
70
|
/**
|
|
62
71
|
* 增量更新:仅更新单条 engram 的 index entry。
|
|
63
72
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engram-index.d.ts","sourceRoot":"","sources":["../../src/storage/engram-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAaH,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAEjB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAE3B,0BAA0B;AAC1B,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAEhD,4BAA4B;AAC5B,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AAyBzD,6BAA6B;AAC7B,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,gCAAgC;AAChC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IACxD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,gBAAgB;AAChB,wBAAgB,sBAAsB,IAAI,cAAc,CAMvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAwBhE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,cAAc,GACpB,IAAI,CAaN;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE;IACrD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,GAAG,gBAAgB,CA6BnB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,GACxC,cAAc,CAgDhB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,gBAAgB,GACtB,cAAc,CAGhB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,cAAc,EACrB,EAAE,EAAE,cAAc,GACjB,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,cAAc,EACrB,YAAY,EAAE,MAAM,GACnB,cAAc,GAAG,SAAS,CAK5B"}
|
|
1
|
+
{"version":3,"file":"engram-index.d.ts","sourceRoot":"","sources":["../../src/storage/engram-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAaH,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAEjB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAE3B,0BAA0B;AAC1B,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAEhD,4BAA4B;AAC5B,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AAyBzD,6BAA6B;AAC7B,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,gCAAgC;AAChC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IACxD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,gBAAgB;AAChB,wBAAgB,sBAAsB,IAAI,cAAc,CAMvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAwBhE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,cAAc,GACpB,IAAI,CAaN;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE;IACrD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,GAAG,gBAAgB,CA6BnB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,GACxC,cAAc,CAgDhB;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAwB/D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,gBAAgB,GACtB,cAAc,CAGhB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,cAAc,EACrB,EAAE,EAAE,cAAc,GACjB,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,cAAc,EACrB,YAAY,EAAE,MAAM,GACnB,cAAc,GAAG,SAAS,CAK5B"}
|
|
@@ -189,6 +189,44 @@ export function rebuildEngramIndex(dataRoot, onOrphan) {
|
|
|
189
189
|
index.lastRebuiltAt = new Date().toISOString();
|
|
190
190
|
return index;
|
|
191
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* 收集 dataRoot 下所有 .md 文件(跳过 SKIP_DIRECTORIES 与 SKIP_MARKDOWN_FILENAMES)。
|
|
194
|
+
*
|
|
195
|
+
* 与 rebuildEngramIndex 共用同一份"哪些目录/文件不扫"规则,确保 watcher 的
|
|
196
|
+
* 外部提案扫描与索引重建看到一致的文件集合。
|
|
197
|
+
*
|
|
198
|
+
* @returns 绝对路径数组(无特定顺序)
|
|
199
|
+
*/
|
|
200
|
+
export function collectMarkdownFiles(dataRoot) {
|
|
201
|
+
const out = [];
|
|
202
|
+
function walk(currentDir) {
|
|
203
|
+
let entries;
|
|
204
|
+
try {
|
|
205
|
+
entries = readdirSync(currentDir, { withFileTypes: true });
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
for (const entry of entries) {
|
|
211
|
+
if (SKIP_DIRECTORIES.has(entry.name))
|
|
212
|
+
continue;
|
|
213
|
+
const absolutePath = join(currentDir, entry.name);
|
|
214
|
+
if (entry.isDirectory()) {
|
|
215
|
+
walk(absolutePath);
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
if (!entry.isFile())
|
|
219
|
+
continue;
|
|
220
|
+
if (!entry.name.endsWith(".md"))
|
|
221
|
+
continue;
|
|
222
|
+
if (SKIP_MARKDOWN_FILENAMES.has(entry.name.toLowerCase()))
|
|
223
|
+
continue;
|
|
224
|
+
out.push(absolutePath);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
walk(dataRoot);
|
|
228
|
+
return out;
|
|
229
|
+
}
|
|
192
230
|
/**
|
|
193
231
|
* 增量更新:仅更新单条 engram 的 index entry。
|
|
194
232
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engram-index.js","sourceRoot":"","sources":["../../src/storage/engram-index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"engram-index.js","sourceRoot":"","sources":["../../src/storage/engram-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EACL,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,SAAS,EACT,UAAU,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQ1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EACL,YAAY,EACZ,eAAe,GAEhB,MAAM,mBAAmB,CAAC;AAE3B,0BAA0B;AAC1B,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAAC;AAEhD,4BAA4B;AAC5B,MAAM,CAAC,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;AAEzD,uBAAuB;AACvB,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,mBAAmB;IACnB,cAAc;IACd,MAAM;IACN,UAAU,EAAE,uBAAuB;IACnC,SAAS,EAAE,sCAAsC;CAClD,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,WAAW;IACX,YAAY;IACZ,iBAAiB;IACjB,cAAc;IACd,oBAAoB;IACpB,aAAa;CACd,CAAC,CAAC;AAEH,6BAA6B;AAC7B,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,IAAI,CAAC,QAAQ,EAAE,mBAAmB,EAAE,qBAAqB,CAAC,CAAC;AACpE,CAAC;AASD,gBAAgB;AAChB,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,IAAI,GAAG,EAAE;QAClB,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACxC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,sBAAsB,EAAE,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAE5B,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoC,CAAC;QAC5D,IAAI,MAAM,CAAC,OAAO,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1D,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;oBACnC,OAAO,CAAC,GAAG,CAAC,GAAqB,EAAE,KAAK,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC;YACV,OAAO;YACP,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAChE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,sBAAsB,EAAE,CAAC;IAClC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,KAAqB;IAErB,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACvC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAqC,EAAE,CAAC;IACxD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACzC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC1B,CAAC;IACD,MAAM,IAAI,GAAoB;QAC5B,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,UAAU;QACnB,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACxC,CAAC;IACF,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,8BAA8B,CAAC,MAK9C;IACC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAEjE,MAAM,eAAe,GACnB,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,IAAK,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAE9E,MAAM,qBAAqB,GACzB,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,qBAAqB;QACtC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,UAAW,CAAC;QAC9B,CAAC,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC;IAE1C,OAAO;QACL,EAAE,EAAE,WAAW,CAAC,EAAE;QAClB,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,WAAW,CAAC,KAAK;QACxB,IAAI;QACJ,UAAU,EAAE,eAAe;QAC3B,UAAU;QACV,gBAAgB,EAAE,qBAAqB;QACvC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;QAClE,IAAI,EAAE,WAAW,CAAC,IAAI;QACtB,kBAAkB,EAAE,WAAW,CAAC,kBAAkB;QAClD,SAAS,EAAE,WAAW,CAAC,SAAS;QAChC,SAAS,EAAE,WAAW,CAAC,SAAS;QAChC,KAAK;QACL,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAgB,EAChB,QAAyC;IAEzC,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAC;IAEvC,SAAS,IAAI,CAAC,UAAkB,EAAE,WAAmB;QACnD,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,YAAY,GAChB,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAEzE,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;gBACjC,SAAS;YACX,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;gBAAE,SAAS;YAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC1C,IAAI,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAAE,SAAS;YAEpE,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;gBAC/C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,QAAQ,EAAE,CAAC,YAAY,CAAC,CAAC;oBACzB,SAAS;gBACX,CAAC;gBACD,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;gBACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;gBACpC,MAAM,WAAW,GAAG,8BAA8B,CAAC;oBACjD,YAAY;oBACZ,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,KAAK,EAAE,IAAI,CAAC,OAAO;oBACnB,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,WAAW,IAAI,EAAE;iBAClD,CAAC,CAAC;gBACH,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YACjD,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ,EAAE,CAAC,YAAY,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACnB,KAAK,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,SAAS,IAAI,CAAC,UAAkB;QAC9B,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,YAAY,CAAC,CAAC;gBACnB,SAAS;YACX,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;gBAAE,SAAS;YAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC1C,IAAI,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAAE,SAAS;YACpE,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,CAAC;IACf,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAqB,EACrB,KAAuB;IAEvB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAqB,EACrB,EAAkB;IAElB,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAqB,EACrB,YAAoB;IAEpB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,KAAK,CAAC,EAAE,CAAC;IACnD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 派生索引 dangling reference 自愈(post-doctor cleanup)。
|
|
3
|
+
*
|
|
4
|
+
* 触发场景:
|
|
5
|
+
* - 用户外部删除 .md 文件(git rm / rm / IDE 删除)
|
|
6
|
+
* - runDoctor 清理 engram-index.json(去除 missing_file entry)
|
|
7
|
+
* - **但**派生索引(observation-windows.jsonl / digest.jsonl / graph.json)
|
|
8
|
+
* 仍保留被删 engram 的 id → engram_search 返回 stale 结果 / viewer 显示重影
|
|
9
|
+
*
|
|
10
|
+
* 本模块在 runDoctor 完成后运行,基于 canonicalIds 清除这些悬空引用。
|
|
11
|
+
*
|
|
12
|
+
* 设计:
|
|
13
|
+
* - 纯函数,失败不抛(返回空 issues),让上层 doctor 主流程继续
|
|
14
|
+
* - 幂等(过滤逻辑重复运行结果一致)
|
|
15
|
+
* - 廉价:observation-windows 直接过滤;digest/graph 检测到悬空才 fullRebuild
|
|
16
|
+
*
|
|
17
|
+
* 检查范围:
|
|
18
|
+
* 1. observation-windows.jsonl — filter in-place by engramId
|
|
19
|
+
* 2. digest.jsonl + graph.json — 检测到悬空则触发 IndexOrchestrator.fullRebuild
|
|
20
|
+
*
|
|
21
|
+
* 不检查(无 engram id 引用):
|
|
22
|
+
* - topic-clusters.jsonl — 引用 cluster.id(短 hash),与 engram 无关
|
|
23
|
+
* - proposals.jsonl — entityId = cluster.id 或外部 .md path,非 engram id
|
|
24
|
+
* - prompt-signals.json — 字段是 tag 字符串
|
|
25
|
+
* - audit.jsonl — append-only 历史日志,不应清理
|
|
26
|
+
*
|
|
27
|
+
* @module @co-engram/core/storage
|
|
28
|
+
*/
|
|
29
|
+
import type { EngramRepository } from "./repository.js";
|
|
30
|
+
import type { DoctorIssue } from "../types/repository-types.js";
|
|
31
|
+
export interface IndexCleanupResult {
|
|
32
|
+
readonly fixes: readonly DoctorIssue[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 清除派生索引中对已不存在 engram 的引用。
|
|
36
|
+
*
|
|
37
|
+
* 在 runDoctor 完成后调用 —— 此时 engram-index.json 已被刷新,
|
|
38
|
+
* canonicalIds 应来自 readEngramIndex(dataRoot).entries 或等价途径。
|
|
39
|
+
*/
|
|
40
|
+
export declare function cleanupDanglingIndexReferences(params: {
|
|
41
|
+
readonly repo: EngramRepository;
|
|
42
|
+
readonly dataRoot: string;
|
|
43
|
+
readonly canonicalIds: ReadonlySet<string>;
|
|
44
|
+
}): IndexCleanupResult;
|
|
45
|
+
//# sourceMappingURL=index-cleanup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-cleanup.d.ts","sourceRoot":"","sources":["../../src/storage/index-cleanup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;CACxC;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE;IACrD,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC5C,GAAG,kBAAkB,CAgBrB"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 派生索引 dangling reference 自愈(post-doctor cleanup)。
|
|
3
|
+
*
|
|
4
|
+
* 触发场景:
|
|
5
|
+
* - 用户外部删除 .md 文件(git rm / rm / IDE 删除)
|
|
6
|
+
* - runDoctor 清理 engram-index.json(去除 missing_file entry)
|
|
7
|
+
* - **但**派生索引(observation-windows.jsonl / digest.jsonl / graph.json)
|
|
8
|
+
* 仍保留被删 engram 的 id → engram_search 返回 stale 结果 / viewer 显示重影
|
|
9
|
+
*
|
|
10
|
+
* 本模块在 runDoctor 完成后运行,基于 canonicalIds 清除这些悬空引用。
|
|
11
|
+
*
|
|
12
|
+
* 设计:
|
|
13
|
+
* - 纯函数,失败不抛(返回空 issues),让上层 doctor 主流程继续
|
|
14
|
+
* - 幂等(过滤逻辑重复运行结果一致)
|
|
15
|
+
* - 廉价:observation-windows 直接过滤;digest/graph 检测到悬空才 fullRebuild
|
|
16
|
+
*
|
|
17
|
+
* 检查范围:
|
|
18
|
+
* 1. observation-windows.jsonl — filter in-place by engramId
|
|
19
|
+
* 2. digest.jsonl + graph.json — 检测到悬空则触发 IndexOrchestrator.fullRebuild
|
|
20
|
+
*
|
|
21
|
+
* 不检查(无 engram id 引用):
|
|
22
|
+
* - topic-clusters.jsonl — 引用 cluster.id(短 hash),与 engram 无关
|
|
23
|
+
* - proposals.jsonl — entityId = cluster.id 或外部 .md path,非 engram id
|
|
24
|
+
* - prompt-signals.json — 字段是 tag 字符串
|
|
25
|
+
* - audit.jsonl — append-only 历史日志,不应清理
|
|
26
|
+
*
|
|
27
|
+
* @module @co-engram/core/storage
|
|
28
|
+
*/
|
|
29
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
30
|
+
import { dirname, join } from "node:path";
|
|
31
|
+
import { IndexOrchestrator, defaultCachePath } from "../index/orchestrator.js";
|
|
32
|
+
/**
|
|
33
|
+
* 清除派生索引中对已不存在 engram 的引用。
|
|
34
|
+
*
|
|
35
|
+
* 在 runDoctor 完成后调用 —— 此时 engram-index.json 已被刷新,
|
|
36
|
+
* canonicalIds 应来自 readEngramIndex(dataRoot).entries 或等价途径。
|
|
37
|
+
*/
|
|
38
|
+
export function cleanupDanglingIndexReferences(params) {
|
|
39
|
+
const { repo, dataRoot, canonicalIds } = params;
|
|
40
|
+
const fixes = [];
|
|
41
|
+
const cachePath = defaultCachePath(dataRoot);
|
|
42
|
+
const windowsFix = cleanupObservationWindows(cachePath, canonicalIds);
|
|
43
|
+
if (windowsFix)
|
|
44
|
+
fixes.push(windowsFix);
|
|
45
|
+
const digestGraphFix = rebuildDigestGraphIfStale(repo, cachePath, canonicalIds);
|
|
46
|
+
if (digestGraphFix)
|
|
47
|
+
fixes.push(digestGraphFix);
|
|
48
|
+
return { fixes };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 过滤 observation-windows.jsonl,删除 engramId 不在 canonicalIds 中的行。
|
|
52
|
+
*
|
|
53
|
+
* 文件格式:JSONL,每行 { id, engramId, query, score, hitAt, deadline, kind, status }。
|
|
54
|
+
* 直接 in-place 重写(append-mostly 日志,过滤是正确语义)。
|
|
55
|
+
*/
|
|
56
|
+
function cleanupObservationWindows(cachePath, canonicalIds) {
|
|
57
|
+
const filePath = join(cachePath, "observation-windows.jsonl");
|
|
58
|
+
if (!existsSync(filePath))
|
|
59
|
+
return null;
|
|
60
|
+
let raw;
|
|
61
|
+
try {
|
|
62
|
+
raw = readFileSync(filePath, "utf8");
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
const lines = raw.split("\n");
|
|
68
|
+
let removed = 0;
|
|
69
|
+
const kept = [];
|
|
70
|
+
for (const line of lines) {
|
|
71
|
+
const trimmed = line.trim();
|
|
72
|
+
if (!trimmed)
|
|
73
|
+
continue;
|
|
74
|
+
let isDangling = false;
|
|
75
|
+
try {
|
|
76
|
+
const parsed = JSON.parse(trimmed);
|
|
77
|
+
if (typeof parsed.engramId === "string" &&
|
|
78
|
+
!canonicalIds.has(parsed.engramId)) {
|
|
79
|
+
isDangling = true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// 保留无法解析的行(让 audit / 人工检查)
|
|
84
|
+
}
|
|
85
|
+
if (isDangling) {
|
|
86
|
+
removed++;
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
kept.push(trimmed);
|
|
90
|
+
}
|
|
91
|
+
if (removed === 0)
|
|
92
|
+
return null;
|
|
93
|
+
try {
|
|
94
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
95
|
+
writeFileSync(filePath, kept.length > 0 ? kept.join("\n") + "\n" : "", "utf8");
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
kind: "dangling_index_reference",
|
|
102
|
+
path: filePath,
|
|
103
|
+
message: `Removed ${removed} dangling observation window(s) whose engramId no longer exists`,
|
|
104
|
+
autoFixed: true,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 检测 digest.jsonl 与 graph.json 中的 dangling engram id。
|
|
109
|
+
*
|
|
110
|
+
* 若发现任何悬空,触发 IndexOrchestrator.fullRebuild
|
|
111
|
+
* (fullRebuild 一次性重建 digest + graph,保证二者一致)。
|
|
112
|
+
*
|
|
113
|
+
* 检测代价:O(digest 行数 + graph 节点数 + graph 边数)。
|
|
114
|
+
* 重建代价:仅在检测到悬空时才发生,常见路径(doctored 之后的稳态)开销为 0。
|
|
115
|
+
*/
|
|
116
|
+
function rebuildDigestGraphIfStale(repo, cachePath, canonicalIds) {
|
|
117
|
+
const digestPath = join(cachePath, "digest.jsonl");
|
|
118
|
+
const graphPath = join(cachePath, "graph.json");
|
|
119
|
+
let digestDangling = 0;
|
|
120
|
+
let graphDangling = 0;
|
|
121
|
+
if (existsSync(digestPath)) {
|
|
122
|
+
try {
|
|
123
|
+
const raw = readFileSync(digestPath, "utf8");
|
|
124
|
+
for (const line of raw.split("\n")) {
|
|
125
|
+
const trimmed = line.trim();
|
|
126
|
+
if (!trimmed)
|
|
127
|
+
continue;
|
|
128
|
+
try {
|
|
129
|
+
const parsed = JSON.parse(trimmed);
|
|
130
|
+
if (typeof parsed.id === "string" && !canonicalIds.has(parsed.id)) {
|
|
131
|
+
digestDangling++;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// 跳过无效行(不是 dangling,只是损坏 — 让别处报)
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// 读失败:当作无 dangling,跳过
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (existsSync(graphPath)) {
|
|
144
|
+
try {
|
|
145
|
+
const raw = readFileSync(graphPath, "utf8");
|
|
146
|
+
const parsed = JSON.parse(raw);
|
|
147
|
+
for (const node of parsed.nodes ?? []) {
|
|
148
|
+
if (typeof node.id === "string" && !canonicalIds.has(node.id)) {
|
|
149
|
+
graphDangling++;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
for (const edge of parsed.edges ?? []) {
|
|
153
|
+
if (typeof edge.from === "string" && !canonicalIds.has(edge.from)) {
|
|
154
|
+
graphDangling++;
|
|
155
|
+
}
|
|
156
|
+
if (typeof edge.to === "string" && !canonicalIds.has(edge.to)) {
|
|
157
|
+
graphDangling++;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// 读失败:当作无 dangling,跳过
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (digestDangling === 0 && graphDangling === 0)
|
|
166
|
+
return null;
|
|
167
|
+
try {
|
|
168
|
+
const orchestrator = new IndexOrchestrator(repo, cachePath);
|
|
169
|
+
const result = orchestrator.fullRebuild();
|
|
170
|
+
return {
|
|
171
|
+
kind: "dangling_index_reference",
|
|
172
|
+
path: cachePath,
|
|
173
|
+
message: `Rebuilt stale derived indexes (digest had ${digestDangling} dangling entr${digestDangling === 1 ? "y" : "ies"}, graph had ${graphDangling} dangling ref${graphDangling === 1 ? "" : "s"}; rebuild produced digest=${result.digest.total}, graph nodes=${result.graph.nodes}, edges=${result.graph.edges})`,
|
|
174
|
+
autoFixed: true,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return {
|
|
179
|
+
kind: "dangling_index_reference",
|
|
180
|
+
path: cachePath,
|
|
181
|
+
message: `Detected ${digestDangling} dangling digest entry/${graphDangling} dangling graph ref but fullRebuild failed (check logs)`,
|
|
182
|
+
autoFixed: false,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=index-cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-cleanup.js","sourceRoot":"","sources":["../../src/storage/index-cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 稳定排序键:importance DESC, updatedAt DESC, id ASC
|
|
3
|
+
*
|
|
4
|
+
* cursor 是 opaque base64url token,encode 当前页最后一条的 sort key,
|
|
5
|
+
* 让下一页查询能"接着"这个位置往后取(避免 offset 漂移导致的数据跳过/重复)。
|
|
6
|
+
*
|
|
7
|
+
* 选择 base64url 而非 base64:cursor 经常出现在 URL query string,
|
|
8
|
+
* base64url 无需 URL encode(+ / = 等特殊字符)。
|
|
9
|
+
*/
|
|
10
|
+
export interface SortKey {
|
|
11
|
+
readonly importance: number;
|
|
12
|
+
readonly updatedAt: number;
|
|
13
|
+
readonly id: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function encodeCursor(key: SortKey): string;
|
|
16
|
+
export declare function decodeCursor(cursor: string): SortKey;
|
|
17
|
+
/**
|
|
18
|
+
* 比较两个 sort key,返回 -1 / 0 / 1。
|
|
19
|
+
* 返回 -1 表示 a 排在 b 前面;1 表示 a 排在 b 后面;0 表示相等。
|
|
20
|
+
*
|
|
21
|
+
* 顺序:importance 大→小;同分 updatedAt 新→旧;再同分 id 字典序升序(稳定)。
|
|
22
|
+
*
|
|
23
|
+
* 用于 cursor 分页:取出 cursor 之后,过滤掉所有 compareSortKey(key, cursor) <= 0 的项
|
|
24
|
+
* (cursor 之前或等于的项跳过),从下一个开始取。
|
|
25
|
+
*/
|
|
26
|
+
export declare function compareSortKey(a: SortKey, b: SortKey): number;
|
|
27
|
+
//# sourceMappingURL=index-db-cursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-db-cursor.d.ts","sourceRoot":"","sources":["../../src/storage/index-db-cursor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,OAAO;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAIjD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAwBpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,CAK7D"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 稳定排序键:importance DESC, updatedAt DESC, id ASC
|
|
3
|
+
*
|
|
4
|
+
* cursor 是 opaque base64url token,encode 当前页最后一条的 sort key,
|
|
5
|
+
* 让下一页查询能"接着"这个位置往后取(避免 offset 漂移导致的数据跳过/重复)。
|
|
6
|
+
*
|
|
7
|
+
* 选择 base64url 而非 base64:cursor 经常出现在 URL query string,
|
|
8
|
+
* base64url 无需 URL encode(+ / = 等特殊字符)。
|
|
9
|
+
*/
|
|
10
|
+
export function encodeCursor(key) {
|
|
11
|
+
// 用数组而非 object:更紧凑,且避免 key 顺序歧义
|
|
12
|
+
const json = JSON.stringify([key.importance, key.updatedAt, key.id]);
|
|
13
|
+
return Buffer.from(json, "utf8").toString("base64url");
|
|
14
|
+
}
|
|
15
|
+
export function decodeCursor(cursor) {
|
|
16
|
+
if (!cursor)
|
|
17
|
+
throw new Error("invalid cursor: empty");
|
|
18
|
+
let json;
|
|
19
|
+
try {
|
|
20
|
+
json = Buffer.from(cursor, "base64url").toString("utf8");
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
throw new Error("invalid cursor: base64 decode failed");
|
|
24
|
+
}
|
|
25
|
+
let arr;
|
|
26
|
+
try {
|
|
27
|
+
arr = JSON.parse(json);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
throw new Error("invalid cursor: JSON parse failed");
|
|
31
|
+
}
|
|
32
|
+
if (!Array.isArray(arr) ||
|
|
33
|
+
arr.length !== 3 ||
|
|
34
|
+
typeof arr[0] !== "number" ||
|
|
35
|
+
typeof arr[1] !== "number" ||
|
|
36
|
+
typeof arr[2] !== "string") {
|
|
37
|
+
throw new Error("invalid cursor: shape mismatch");
|
|
38
|
+
}
|
|
39
|
+
return { importance: arr[0], updatedAt: arr[1], id: arr[2] };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 比较两个 sort key,返回 -1 / 0 / 1。
|
|
43
|
+
* 返回 -1 表示 a 排在 b 前面;1 表示 a 排在 b 后面;0 表示相等。
|
|
44
|
+
*
|
|
45
|
+
* 顺序:importance 大→小;同分 updatedAt 新→旧;再同分 id 字典序升序(稳定)。
|
|
46
|
+
*
|
|
47
|
+
* 用于 cursor 分页:取出 cursor 之后,过滤掉所有 compareSortKey(key, cursor) <= 0 的项
|
|
48
|
+
* (cursor 之前或等于的项跳过),从下一个开始取。
|
|
49
|
+
*/
|
|
50
|
+
export function compareSortKey(a, b) {
|
|
51
|
+
if (a.importance !== b.importance)
|
|
52
|
+
return a.importance > b.importance ? -1 : 1;
|
|
53
|
+
if (a.updatedAt !== b.updatedAt)
|
|
54
|
+
return a.updatedAt > b.updatedAt ? -1 : 1;
|
|
55
|
+
if (a.id !== b.id)
|
|
56
|
+
return a.id < b.id ? -1 : 1;
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=index-db-cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-db-cursor.js","sourceRoot":"","sources":["../../src/storage/index-db-cursor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,MAAM,UAAU,YAAY,CAAC,GAAY;IACxC,gCAAgC;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc;IAC1C,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACtD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACJ,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACJ,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACtD,CAAC;IACD,IACC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QACnB,GAAG,CAAC,MAAM,KAAK,CAAC;QAChB,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ;QAC1B,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ;QAC1B,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,EACzB,CAAC;QACF,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,CAAU,EAAE,CAAU;IACpD,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;QAAE,OAAO,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;QAAE,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,CAAC;AACV,CAAC"}
|