@co-engram/core 0.1.3 → 0.1.5
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/bootstrap/classify.d.ts +6 -0
- package/dist/bootstrap/classify.d.ts.map +1 -1
- package/dist/bootstrap/classify.js +15 -0
- package/dist/bootstrap/classify.js.map +1 -1
- package/dist/config/defaults.js +1 -1
- 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/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +45 -28
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts +24 -12
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +41 -26
- package/dist/i18n/zh.js.map +1 -1
- package/dist/merge/auto-onboard.d.ts +7 -1
- package/dist/merge/auto-onboard.d.ts.map +1 -1
- package/dist/merge/auto-onboard.js +35 -13
- package/dist/merge/auto-onboard.js.map +1 -1
- package/dist/merge/post-merge-hook.d.ts.map +1 -1
- package/dist/merge/post-merge-hook.js +16 -2
- package/dist/merge/post-merge-hook.js.map +1 -1
- package/dist/merge-driver.cjs +1 -1
- package/dist/observability/proposal-engine.d.ts +164 -4
- package/dist/observability/proposal-engine.d.ts.map +1 -1
- package/dist/observability/proposal-engine.js +357 -13
- package/dist/observability/proposal-engine.js.map +1 -1
- 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.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +1 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/repository.d.ts +107 -6
- package/dist/storage/repository.d.ts.map +1 -1
- package/dist/storage/repository.js +212 -14
- package/dist/storage/repository.js.map +1 -1
- 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 +10 -0
- package/dist/tools/engram-tools.js.map +1 -1
- package/dist/tools/proposal-tools.d.ts +25 -1
- package/dist/tools/proposal-tools.d.ts.map +1 -1
- package/dist/tools/proposal-tools.js +76 -21
- package/dist/tools/proposal-tools.js.map +1 -1
- package/dist/tools/schemas.d.ts +29 -11
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +23 -5
- package/dist/tools/schemas.js.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,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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"}
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC"}
|
package/dist/storage/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC"}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
import type { Engram, EngramCatalogEntry, EngramCreateInput, EngramDigest, EngramFreshness, EngramStatus, EngramUpdateInput, ImportanceVector, VerificationStatus, Synapse, SynapseCreateInput, SynapseEvidence, SynapseKind, SynapseResolutionState, SynapseUpdateInput } from "../types/index.js";
|
|
16
16
|
import type { EngramIndexEntry, DoctorReport, PathTreeNode } from "../types/repository-types.js";
|
|
17
17
|
import { type Language } from "../i18n/index.js";
|
|
18
|
+
import { type EngramFile } from "./engram-store.js";
|
|
18
19
|
import { type EngramIndexMap } from "./engram-index.js";
|
|
19
20
|
/** Repository 配置 */
|
|
20
21
|
export interface RepositoryConfig {
|
|
@@ -31,6 +32,29 @@ export interface RepositoryConfig {
|
|
|
31
32
|
*/
|
|
32
33
|
readonly language?: Language;
|
|
33
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* 外部 .md 检测钩子参数:watcher 发现 dataRoot 下未追踪的 .md 文件时构造。
|
|
37
|
+
*
|
|
38
|
+
* - `absPath`:文件绝对路径,host 可读取内容做进一步处理
|
|
39
|
+
* - `relPath`:相对 rootPath 的路径(用于提案展示与去重命名空间)
|
|
40
|
+
* - `raw`:文件原始内容(避免 hook 反复读盘)
|
|
41
|
+
* - `parsed`:尝试解析 frontmatter 的结果;`null` 表示文件不是合法 engram
|
|
42
|
+
* 格式(无 frontmatter 或解析失败)—— host 通常应当跳过此类文件
|
|
43
|
+
*/
|
|
44
|
+
export interface ExternalMarkdownHookParams {
|
|
45
|
+
readonly absPath: string;
|
|
46
|
+
readonly relPath: string;
|
|
47
|
+
readonly raw: string;
|
|
48
|
+
readonly parsed: EngramFile | null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 外部 .md 检测钩子签名。
|
|
52
|
+
*
|
|
53
|
+
* 由 host 适配层(claude-code-mcp / openclaw-plugin)实现,绑定到
|
|
54
|
+
* ProposalEngine.proposeExternalMarkdown,把"未授权来源"的 .md 转成
|
|
55
|
+
* 待审批提案而非直接落库。
|
|
56
|
+
*/
|
|
57
|
+
export type ExternalMarkdownHook = (params: ExternalMarkdownHookParams) => void;
|
|
34
58
|
/**
|
|
35
59
|
* EngramRepository — per-edge synapse + ULID stable id + 单文件 engram
|
|
36
60
|
*
|
|
@@ -57,6 +81,32 @@ export declare class EngramRepository {
|
|
|
57
81
|
* 会立即触发缓存失效,无需等下次 getIndex 的 mtime 兜底检查。
|
|
58
82
|
*/
|
|
59
83
|
private indexWatcher;
|
|
84
|
+
/**
|
|
85
|
+
* 递归 fs.watch 句柄,监听 dataRoot 下所有 .md 文件变化(可选)。
|
|
86
|
+
*
|
|
87
|
+
* 触发场景(关键):git pull / git checkout / 手动编辑 / rsync / 用户拷贝文件
|
|
88
|
+
* 等任何外部写入 .md 的途径,startWatching() 单独监听 index.json 看不到这些变化。
|
|
89
|
+
*
|
|
90
|
+
* 信任边界设计(关键安全语义):
|
|
91
|
+
* - git pull 来的 .md → 由 post-merge hook 调 runDoctor 自动接受(团队可信)
|
|
92
|
+
* - 其他来源的 .md(用户拷贝、IDE 写入等)→ **不**自动接受,通过
|
|
93
|
+
* externalMarkdownHook 通知 host 适配层形成 proposal,等用户审批
|
|
94
|
+
* - watcher 自身只做"扫描 + diff + 通知 hook",不写 index.json
|
|
95
|
+
* - 安全动机:防止恶意/误植的 .md 通过文件系统投毒直接进入团队记忆库
|
|
96
|
+
*/
|
|
97
|
+
private dataWatcher;
|
|
98
|
+
/** dataWatcher debounce 定时器。git pull 一次性触发大量事件,合并为一次扫描。 */
|
|
99
|
+
private dataRebuildTimer;
|
|
100
|
+
/**
|
|
101
|
+
* 外部 .md 检测钩子(由 host 适配层设置)。
|
|
102
|
+
*
|
|
103
|
+
* watcher 扫描发现"dataRoot 下存在但 index 中没有"的 .md 文件时调用。
|
|
104
|
+
* host 适配层通常把回调绑到 ProposalEngine.proposeExternalMarkdown,
|
|
105
|
+
* 让用户审批后再决定是否纳入团队记忆。
|
|
106
|
+
*
|
|
107
|
+
* 未设置时 → watcher 发现新 .md 仅记录 orphan,不自动接受(noop)。
|
|
108
|
+
*/
|
|
109
|
+
private externalMarkdownHook;
|
|
60
110
|
private readonly language;
|
|
61
111
|
constructor(config: RepositoryConfig);
|
|
62
112
|
/** 当前写入语言(读取时自动兼容任意语言格式) */
|
|
@@ -103,20 +153,71 @@ export declare class EngramRepository {
|
|
|
103
153
|
*/
|
|
104
154
|
private purgeStaleIndexEntriesForPath;
|
|
105
155
|
/**
|
|
106
|
-
* 启动对 engram-index.json 的 fs.watch
|
|
156
|
+
* 启动对 engram-index.json 的 fs.watch 监听 + dataRoot .md 递归监听。
|
|
107
157
|
*
|
|
108
|
-
*
|
|
109
|
-
*
|
|
158
|
+
* 启动后:
|
|
159
|
+
* - index.json watcher:外部进程修改 index(创建/更新/删除 engram)→ 失效 cache
|
|
160
|
+
* - dataRoot .md watcher:任何途径(git pull / checkout / 手动编辑 / 用户拷贝)
|
|
161
|
+
* 写入 .md → debounce 后扫描,diff 出"未在 index 中的 .md"并通过
|
|
162
|
+
* externalMarkdownHook 通知 host 适配层。**watcher 自身不写 index**。
|
|
110
163
|
*
|
|
111
|
-
*
|
|
164
|
+
* 信任边界(安全关键):
|
|
165
|
+
* - git pull 来源由 post-merge hook 调 runDoctor 接受,不依赖 watcher
|
|
166
|
+
* - 其他来源由 host 通过 hook 决策(典型:形成 proposal 等待用户审批)
|
|
167
|
+
* - 防止"用户拷贝恶意 .md → 直接进团队记忆库"的攻击面
|
|
112
168
|
*
|
|
113
|
-
*
|
|
114
|
-
* dataRoot 时,确保各进程的缓存相互一致。
|
|
169
|
+
* 幂等:多次调用安全,只创建一个 watcher。
|
|
115
170
|
*
|
|
116
171
|
* 不需要显式停止 — 进程退出时 OS 自动回收 fd。stopWatching() 仅用于
|
|
117
172
|
* 测试 / 显式资源管理场景。
|
|
118
173
|
*/
|
|
119
174
|
startWatching(): void;
|
|
175
|
+
/**
|
|
176
|
+
* 注册外部 .md 检测钩子。host 适配层应在创建 repository + ProposalEngine
|
|
177
|
+
* 之后、调用 startWatching 之前设置钩子,以确保 watcher 触发时回调就绪。
|
|
178
|
+
*
|
|
179
|
+
* @returns 取消注册函数(测试隔离 / 资源释放用)
|
|
180
|
+
*/
|
|
181
|
+
setExternalMarkdownHook(hook: ExternalMarkdownHook): () => void;
|
|
182
|
+
/**
|
|
183
|
+
* 启动 dataRoot 下 .md 文件的递归 fs.watch。
|
|
184
|
+
*
|
|
185
|
+
* Node 22+ 在 Linux/macOS/Windows 都支持 `recursive: true`(Linux 通过 inotify)。
|
|
186
|
+
* 不支持的平台(NFS / 老 Node)→ catch 后 noop,startWatching 的 index.json
|
|
187
|
+
* watcher + getIndex 的 mtime 兜底仍然有效。
|
|
188
|
+
*
|
|
189
|
+
* 触发后 debounce 调用 scanForExternalMarkdown(只读 + hook 通知),
|
|
190
|
+
* **不**调用 rebuildIndex(避免 untrusted .md 直接落库)。
|
|
191
|
+
*/
|
|
192
|
+
private startDataRootWatcher;
|
|
193
|
+
/**
|
|
194
|
+
* Debounce 扫描,合并短时间内的多次 .md 变化事件。
|
|
195
|
+
*
|
|
196
|
+
* git pull / rsync 等批量操作会一次性产生几十~几百个事件,逐个扫描会卡死。
|
|
197
|
+
* 2000ms debounce 既合并事件,也给 post-merge hook(post-merge 在 git pull
|
|
198
|
+
* 完成后同步执行)足够时间完成可信路径的 index 写入,避免 watcher 与
|
|
199
|
+
* post-merge 同时处理同一批文件造成竞争。
|
|
200
|
+
*/
|
|
201
|
+
private scheduleDataScan;
|
|
202
|
+
/**
|
|
203
|
+
* 扫描 dataRoot 下所有 .md,diff 出"未在 index 中的 .md",逐个调用
|
|
204
|
+
* externalMarkdownHook(若设置)。
|
|
205
|
+
*
|
|
206
|
+
* 关键不变量:
|
|
207
|
+
* - **不**写 engram-index.json(防止 untrusted .md 直接进 index)
|
|
208
|
+
* - **不**调用 getIndex() — getIndex 在 index.json 缺失时会触发 rebuildIndex
|
|
209
|
+
* 把所有合法 .md 灌入,这会让"未追踪"判定全部失效。这里直接读
|
|
210
|
+
* index.json,不存在则视为空集合,所有 .md 都视为未追踪。
|
|
211
|
+
* - 已在 index.json 中的 .md → noop(post-merge 或 engram_create 已处理)
|
|
212
|
+
* - 未设置 hook → noop(等价于"未启用外部提案",安全默认)
|
|
213
|
+
* - hook 自身负责去重(典型:ProposalEngine.proposeExternalMarkdown
|
|
214
|
+
* 检查 proposal 状态:pending/accepted/dismissed 都返回 no-change)
|
|
215
|
+
*
|
|
216
|
+
* 性能:全量扫盘读所有 .md,大仓库(>10k 文件)可能耗时数百毫秒。
|
|
217
|
+
* 可接受因为:(1) 2s debounce 已经限频;(2) post-merge hook 通常先完成,
|
|
218
|
+
* 大部分 .md 已在 index,scan 仅对增量做 hook 调用。
|
|
219
|
+
*/
|
|
220
|
+
private scanForExternalMarkdown;
|
|
120
221
|
/** 停止 watcher(主要用于测试隔离) */
|
|
121
222
|
stopWatching(): void;
|
|
122
223
|
/** 失效缓存 — 下次 getIndex 从磁盘重读。同时通知 invalidate listeners。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/storage/repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAeH,OAAO,KAAK,EACV,MAAM,EACN,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,eAAe,EAGf,YAAY,EACZ,iBAAiB,EAGjB,gBAAgB,EAChB,kBAAkB,EAClB,OAAO,EACP,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAEV,gBAAgB,EAChB,YAAY,EAEZ,YAAY,EACb,MAAM,8BAA8B,CAAC;AAWtC,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/storage/repository.ts"],"names":[],"mappings":"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"}
|