@co-engram/core 0.1.2 → 0.1.3
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 +67 -0
- package/dist/bootstrap/classify.d.ts.map +1 -0
- package/dist/bootstrap/classify.js +119 -0
- package/dist/bootstrap/classify.js.map +1 -0
- package/dist/bootstrap/index.d.ts +89 -0
- package/dist/bootstrap/index.d.ts.map +1 -0
- package/dist/bootstrap/index.js +158 -0
- package/dist/bootstrap/index.js.map +1 -0
- package/dist/concepts/dictionary.d.ts +260 -0
- package/dist/concepts/dictionary.d.ts.map +1 -0
- package/dist/concepts/dictionary.js +253 -0
- package/dist/concepts/dictionary.js.map +1 -0
- package/dist/concepts/index.d.ts +11 -0
- package/dist/concepts/index.d.ts.map +1 -0
- package/dist/concepts/index.js +10 -0
- package/dist/concepts/index.js.map +1 -0
- package/dist/concepts/types.d.ts +65 -0
- package/dist/concepts/types.d.ts.map +1 -0
- package/dist/concepts/types.js +15 -0
- package/dist/concepts/types.js.map +1 -0
- package/dist/config/defaults.d.ts +32 -3
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +52 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.d.ts +18 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +75 -3
- package/dist/config/index.js.map +1 -1
- package/dist/config/loader.d.ts +10 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +10 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +97 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/contradiction/auto-degrade.d.ts +11 -2
- package/dist/contradiction/auto-degrade.d.ts.map +1 -1
- package/dist/contradiction/auto-degrade.js +22 -0
- package/dist/contradiction/auto-degrade.js.map +1 -1
- package/dist/contradiction/resolver.d.ts.map +1 -1
- package/dist/contradiction/resolver.js +7 -1
- package/dist/contradiction/resolver.js.map +1 -1
- package/dist/dreaming/index.d.ts +1 -0
- package/dist/dreaming/index.d.ts.map +1 -1
- package/dist/dreaming/index.js +1 -0
- package/dist/dreaming/index.js.map +1 -1
- package/dist/dreaming/llm-pattern-abstraction.d.ts +31 -0
- package/dist/dreaming/llm-pattern-abstraction.d.ts.map +1 -0
- package/dist/dreaming/llm-pattern-abstraction.js +70 -0
- package/dist/dreaming/llm-pattern-abstraction.js.map +1 -0
- package/dist/dreaming/rem.d.ts.map +1 -1
- package/dist/dreaming/rem.js +1 -0
- package/dist/dreaming/rem.js.map +1 -1
- package/dist/dreaming/scheduler.d.ts +13 -0
- package/dist/dreaming/scheduler.d.ts.map +1 -1
- package/dist/dreaming/scheduler.js +14 -2
- package/dist/dreaming/scheduler.js.map +1 -1
- package/dist/evolution/triggered.d.ts.map +1 -1
- package/dist/evolution/triggered.js +1 -0
- package/dist/evolution/triggered.js.map +1 -1
- package/dist/generative/hypothesis.d.ts.map +1 -1
- package/dist/generative/hypothesis.js +1 -0
- package/dist/generative/hypothesis.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +1262 -32
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/index.d.ts +34 -1
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +36 -7
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/zh.d.ts +698 -32
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +1267 -33
- package/dist/i18n/zh.js.map +1 -1
- package/dist/index/graph-builder.js +3 -3
- package/dist/index/graph-builder.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/learning/loop.d.ts +9 -0
- package/dist/learning/loop.d.ts.map +1 -1
- package/dist/learning/loop.js +42 -1
- package/dist/learning/loop.js.map +1 -1
- package/dist/maintenance/types.d.ts +11 -0
- package/dist/maintenance/types.d.ts.map +1 -1
- package/dist/maintenance/types.js.map +1 -1
- package/dist/merge/synapse-merger.js +6 -0
- package/dist/merge/synapse-merger.js.map +1 -1
- package/dist/merge-driver.cjs +64 -5
- package/dist/observability/audit-log.d.ts +7 -1
- package/dist/observability/audit-log.d.ts.map +1 -1
- package/dist/observability/audit-log.js.map +1 -1
- package/dist/observability/necessity-evaluator.d.ts +29 -0
- package/dist/observability/necessity-evaluator.d.ts.map +1 -1
- package/dist/observability/necessity-evaluator.js +240 -13
- package/dist/observability/necessity-evaluator.js.map +1 -1
- package/dist/observability/proposal-engine.d.ts.map +1 -1
- package/dist/observability/proposal-engine.js +12 -0
- package/dist/observability/proposal-engine.js.map +1 -1
- package/dist/observability/runtime-description-check.d.ts +55 -0
- package/dist/observability/runtime-description-check.d.ts.map +1 -0
- package/dist/observability/runtime-description-check.js +63 -0
- package/dist/observability/runtime-description-check.js.map +1 -0
- package/dist/prompt-signals/cache.d.ts +73 -0
- package/dist/prompt-signals/cache.d.ts.map +1 -1
- package/dist/prompt-signals/cache.js +102 -0
- package/dist/prompt-signals/cache.js.map +1 -1
- package/dist/prompt-signals/event-bus.d.ts +82 -0
- package/dist/prompt-signals/event-bus.d.ts.map +1 -0
- package/dist/prompt-signals/event-bus.js +105 -0
- package/dist/prompt-signals/event-bus.js.map +1 -0
- package/dist/prompt-signals/index.d.ts +2 -1
- package/dist/prompt-signals/index.d.ts.map +1 -1
- package/dist/prompt-signals/index.js +2 -1
- package/dist/prompt-signals/index.js.map +1 -1
- package/dist/reinforcement/ltp.d.ts +15 -1
- package/dist/reinforcement/ltp.d.ts.map +1 -1
- package/dist/reinforcement/ltp.js +24 -5
- package/dist/reinforcement/ltp.js.map +1 -1
- package/dist/reinforcement/related.d.ts +31 -2
- package/dist/reinforcement/related.d.ts.map +1 -1
- package/dist/reinforcement/related.js +39 -3
- package/dist/reinforcement/related.js.map +1 -1
- package/dist/retrieval/filter.d.ts.map +1 -1
- package/dist/retrieval/filter.js +7 -0
- package/dist/retrieval/filter.js.map +1 -1
- package/dist/retrieval/fts.d.ts +6 -5
- package/dist/retrieval/fts.d.ts.map +1 -1
- package/dist/retrieval/fts.js +74 -22
- package/dist/retrieval/fts.js.map +1 -1
- package/dist/status/index.d.ts +7 -0
- package/dist/status/index.d.ts.map +1 -0
- package/dist/status/index.js +7 -0
- package/dist/status/index.js.map +1 -0
- package/dist/status/status.d.ts +132 -0
- package/dist/status/status.d.ts.map +1 -0
- package/dist/status/status.js +437 -0
- package/dist/status/status.js.map +1 -0
- package/dist/storage/engram-store.d.ts.map +1 -1
- package/dist/storage/engram-store.js +17 -2
- package/dist/storage/engram-store.js.map +1 -1
- package/dist/storage/git.d.ts +168 -0
- package/dist/storage/git.d.ts.map +1 -1
- package/dist/storage/git.js +616 -33
- package/dist/storage/git.js.map +1 -1
- 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/infra-doctor.d.ts +42 -0
- package/dist/storage/infra-doctor.d.ts.map +1 -0
- package/dist/storage/infra-doctor.js +92 -0
- package/dist/storage/infra-doctor.js.map +1 -0
- package/dist/storage/obsidian-links.d.ts +73 -0
- package/dist/storage/obsidian-links.d.ts.map +1 -0
- package/dist/storage/obsidian-links.js +177 -0
- package/dist/storage/obsidian-links.js.map +1 -0
- package/dist/storage/path.d.ts +24 -0
- package/dist/storage/path.d.ts.map +1 -1
- package/dist/storage/path.js +53 -0
- package/dist/storage/path.js.map +1 -1
- package/dist/storage/repository.d.ts +37 -1
- package/dist/storage/repository.d.ts.map +1 -1
- package/dist/storage/repository.js +235 -17
- package/dist/storage/repository.js.map +1 -1
- package/dist/storage/synapse-store.d.ts +7 -1
- package/dist/storage/synapse-store.d.ts.map +1 -1
- package/dist/storage/synapse-store.js +8 -0
- package/dist/storage/synapse-store.js.map +1 -1
- package/dist/tools/audit-query-tool.d.ts +53 -0
- package/dist/tools/audit-query-tool.d.ts.map +1 -0
- package/dist/tools/audit-query-tool.js +123 -0
- package/dist/tools/audit-query-tool.js.map +1 -0
- package/dist/tools/doctor-tools.d.ts +5 -0
- package/dist/tools/doctor-tools.d.ts.map +1 -1
- package/dist/tools/doctor-tools.js +11 -3
- package/dist/tools/doctor-tools.js.map +1 -1
- package/dist/tools/engram-tools.d.ts +13 -0
- package/dist/tools/engram-tools.d.ts.map +1 -1
- package/dist/tools/engram-tools.js +72 -8
- package/dist/tools/engram-tools.js.map +1 -1
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/llm-descriptions.d.ts +28 -28
- package/dist/tools/llm-descriptions.d.ts.map +1 -1
- package/dist/tools/llm-descriptions.js +56 -489
- package/dist/tools/llm-descriptions.js.map +1 -1
- package/dist/tools/normalization.d.ts +43 -0
- package/dist/tools/normalization.d.ts.map +1 -0
- package/dist/tools/normalization.js +68 -0
- package/dist/tools/normalization.js.map +1 -0
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +6 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/schemas.d.ts +67 -11
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +61 -6
- package/dist/tools/schemas.js.map +1 -1
- package/dist/tools/skill-tools.js +1 -1
- package/dist/tools/skill-tools.js.map +1 -1
- package/dist/tools/synapse-tools.d.ts.map +1 -1
- package/dist/tools/synapse-tools.js +1 -0
- package/dist/tools/synapse-tools.js.map +1 -1
- package/dist/tools/sync-tools.d.ts +102 -0
- package/dist/tools/sync-tools.d.ts.map +1 -0
- package/dist/tools/sync-tools.js +309 -0
- package/dist/tools/sync-tools.js.map +1 -0
- package/dist/tools/synthesize-tools.d.ts +79 -0
- package/dist/tools/synthesize-tools.d.ts.map +1 -0
- package/dist/tools/synthesize-tools.js +297 -0
- package/dist/tools/synthesize-tools.js.map +1 -0
- package/dist/tools/tool-profile.d.ts +68 -0
- package/dist/tools/tool-profile.d.ts.map +1 -0
- package/dist/tools/tool-profile.js +174 -0
- package/dist/tools/tool-profile.js.map +1 -0
- package/dist/tools/tool.d.ts +17 -0
- package/dist/tools/tool.d.ts.map +1 -1
- package/dist/tools/tool.js.map +1 -1
- package/dist/types/disclosure.d.ts +7 -0
- package/dist/types/disclosure.d.ts.map +1 -1
- package/dist/types/repository-types.d.ts +17 -1
- package/dist/types/repository-types.d.ts.map +1 -1
- package/dist/types/synapse.d.ts +19 -1
- package/dist/types/synapse.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -12,7 +12,15 @@
|
|
|
12
12
|
*
|
|
13
13
|
* 与 ltp.ts 的关系:
|
|
14
14
|
* - ltp.recordRetrievalSuccess:直接强化单个 engram
|
|
15
|
-
* - related.reinforceRelated:触发 ltp 后,对邻居做 reinforceEngram
|
|
15
|
+
* - related.reinforceRelated:触发 ltp 后,对邻居做 reinforceEngram
|
|
16
|
+
*
|
|
17
|
+
* P0-9 修复:此前邻居联动是"幽灵强化" —— 邻居 importance 被改但
|
|
18
|
+
* (a) effectiveRetrievals/retrievalCount/reinforcementScore 全为 0
|
|
19
|
+
* (b) audit_log 无任何 reinforce 记录(查 action:reinforce, engramId:B 永远空)
|
|
20
|
+
* (c) 也不知道是哪个 engram 触发的联动
|
|
21
|
+
* 现在通过 options.auditLog + options.triggeredBy 让联动可观察:
|
|
22
|
+
* - reinforceEngram 传 withStats:true 让统计字段同步更新
|
|
23
|
+
* - auditLog.append({action:"reinforce", engramId:邻居, metadata:{triggeredBy, sourceImportanceDelta, ...}})
|
|
16
24
|
*
|
|
17
25
|
* @module @co-engram/core/reinforcement
|
|
18
26
|
*/
|
|
@@ -30,8 +38,9 @@ const NEGATIVE_KINDS = new Set([
|
|
|
30
38
|
* @param baseImportanceDelta - 原始 engram 得到的 importanceDelta
|
|
31
39
|
* @param config - 配置(可选)
|
|
32
40
|
* @param nowIso - 当前时间
|
|
41
|
+
* @param options - P0-9 修复:可选 auditLog + triggeredBy,让联动可观察
|
|
33
42
|
*/
|
|
34
|
-
export function reinforceRelated(repo, engramId, baseImportanceDelta, config = DEFAULT_CONFIG, nowIso = new Date().toISOString()) {
|
|
43
|
+
export function reinforceRelated(repo, engramId, baseImportanceDelta, config = DEFAULT_CONFIG, nowIso = new Date().toISOString(), options = {}) {
|
|
35
44
|
if (!repo.exists(engramId)) {
|
|
36
45
|
throw new Error(`Engram not found: ${engramId}`);
|
|
37
46
|
}
|
|
@@ -54,6 +63,8 @@ export function reinforceRelated(repo, engramId, baseImportanceDelta, config = D
|
|
|
54
63
|
// 收集 outgoing + incoming 邻居
|
|
55
64
|
const all = repo.collectAllSynapses();
|
|
56
65
|
const neighborIds = new Set();
|
|
66
|
+
/** 记录每个邻居关联的 synapse id,用于 audit metadata 追溯 */
|
|
67
|
+
const neighborSynapseMap = new Map();
|
|
57
68
|
let skipped = 0;
|
|
58
69
|
for (const { fromId, synapse } of all) {
|
|
59
70
|
if (NEGATIVE_KINDS.has(synapse.kind)) {
|
|
@@ -63,10 +74,12 @@ export function reinforceRelated(repo, engramId, baseImportanceDelta, config = D
|
|
|
63
74
|
if (fromId === engramId) {
|
|
64
75
|
// 我是 from,邻居是 to
|
|
65
76
|
neighborIds.add(synapse.to);
|
|
77
|
+
neighborSynapseMap.set(synapse.to, synapse.id);
|
|
66
78
|
}
|
|
67
79
|
else if (synapse.to === engramId) {
|
|
68
80
|
// 我是 to,邻居是 from
|
|
69
81
|
neighborIds.add(fromId);
|
|
82
|
+
neighborSynapseMap.set(fromId, synapse.id);
|
|
70
83
|
}
|
|
71
84
|
}
|
|
72
85
|
const reinforced = [];
|
|
@@ -80,8 +93,31 @@ export function reinforceRelated(repo, engramId, baseImportanceDelta, config = D
|
|
|
80
93
|
skipped += 1;
|
|
81
94
|
continue;
|
|
82
95
|
}
|
|
83
|
-
|
|
96
|
+
// P0-9 修复:邻居联动也更新统计字段,让 effectiveRetrievals/retrievalCount/
|
|
97
|
+
// reinforcementScore 可观察。语义上邻居被"间接有效检索"。
|
|
98
|
+
reinforceEngram(repo, neighborId, neighborDelta, nowIso, {
|
|
99
|
+
withStats: true,
|
|
100
|
+
effectiveness: neighborDelta,
|
|
101
|
+
});
|
|
84
102
|
reinforced.push(neighborId);
|
|
103
|
+
// P0-9 修复:写邻居 audit,让联动可追溯
|
|
104
|
+
if (options.auditLog) {
|
|
105
|
+
options.auditLog.append({
|
|
106
|
+
actor: "system",
|
|
107
|
+
action: "reinforce",
|
|
108
|
+
engramId: neighborId,
|
|
109
|
+
host: options.host,
|
|
110
|
+
metadata: {
|
|
111
|
+
triggeredBy: options.triggeredBy ?? engramId,
|
|
112
|
+
triggerTool: options.triggerTool,
|
|
113
|
+
sourceEngramId: engramId,
|
|
114
|
+
synapseId: neighborSynapseMap.get(neighborId),
|
|
115
|
+
importanceDelta: neighborDelta,
|
|
116
|
+
effectiveness: neighborDelta,
|
|
117
|
+
hebbian: true,
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
}
|
|
85
121
|
}
|
|
86
122
|
return {
|
|
87
123
|
reinforcedNeighborIds: reinforced,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"related.js","sourceRoot":"","sources":["../../src/reinforcement/related.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"related.js","sourceRoot":"","sources":["../../src/reinforcement/related.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/retrieval/filter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,YAAY,GAAG,SAAS,GAC/B,OAAO,
|
|
1
|
+
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/retrieval/filter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,YAAY,GAAG,SAAS,GAC/B,OAAO,CAuET;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,MAAM,EAAE,YAAY,GAAG,SAAS,GAC/B,UAAU,EAAE,CAEd"}
|
package/dist/retrieval/filter.js
CHANGED
|
@@ -17,6 +17,13 @@ export function matchesFilter(line, filter) {
|
|
|
17
17
|
return false;
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
+
// P0-3 修复:contextTags 此前在 SearchFilter 三方缺失,现在补齐
|
|
21
|
+
// 语义与 domainTags 一致:engram.contextTags 与 filter.contextTags 有交集则通过
|
|
22
|
+
if (filter.contextTags && filter.contextTags.length > 0) {
|
|
23
|
+
if (!filter.contextTags.some((t) => line.contextTags.includes(t))) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
20
27
|
if (filter.kinds && filter.kinds.length > 0) {
|
|
21
28
|
if (!filter.kinds.some((k) => line.kinds.includes(k))) {
|
|
22
29
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/retrieval/filter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/retrieval/filter.ts"],"names":[],"mappings":"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"}
|
package/dist/retrieval/fts.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Full Text Search(关键词匹配)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* 基于内存倒排索引。Task 4.1 把 P0 时代的中文 bigram 切分换成了
|
|
5
|
+
* Intl.Segmenter(Node 22+ 内置,零新依赖),消除 bigram 跨词边界的假阳性。
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
* -
|
|
9
|
-
*
|
|
7
|
+
* 策略:
|
|
8
|
+
* - 中文:Intl.Segmenter(granularity=word)按字典做词级切分,
|
|
9
|
+
* 同时保留单字让短查询仍能命中(unigram 覆盖,无 bigram 假阳性)。
|
|
10
|
+
* - 英文:word boundary 切分
|
|
10
11
|
* - 大小写不敏感
|
|
11
12
|
*
|
|
12
13
|
* @module @co-engram/core/retrieval
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fts.d.ts","sourceRoot":"","sources":["../../src/retrieval/fts.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"fts.d.ts","sourceRoot":"","sources":["../../src/retrieval/fts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAoFpD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,0BAA0B;IAC1B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5D,iCAAiC;IACjC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7D,0BAA0B;IAC1B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAChD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,QAAQ,CA+BnE;AAED,eAAe;AACf,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,QAAQ,EACf,KAAK,SAAK,GACT,MAAM,EAAE,CAwCV"}
|
package/dist/retrieval/fts.js
CHANGED
|
@@ -1,18 +1,48 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Full Text Search(关键词匹配)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* 基于内存倒排索引。Task 4.1 把 P0 时代的中文 bigram 切分换成了
|
|
5
|
+
* Intl.Segmenter(Node 22+ 内置,零新依赖),消除 bigram 跨词边界的假阳性。
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
* -
|
|
9
|
-
*
|
|
7
|
+
* 策略:
|
|
8
|
+
* - 中文:Intl.Segmenter(granularity=word)按字典做词级切分,
|
|
9
|
+
* 同时保留单字让短查询仍能命中(unigram 覆盖,无 bigram 假阳性)。
|
|
10
|
+
* - 英文:word boundary 切分
|
|
10
11
|
* - 大小写不敏感
|
|
11
12
|
*
|
|
12
13
|
* @module @co-engram/core/retrieval
|
|
13
14
|
*/
|
|
14
|
-
/**
|
|
15
|
-
|
|
15
|
+
/**
|
|
16
|
+
* 中文 word segmenter(lazy 单例)
|
|
17
|
+
*
|
|
18
|
+
* Intl.Segmenter 实例可重用,构造有非零开销。模块级缓存让多次 tokenize 共享。
|
|
19
|
+
*/
|
|
20
|
+
let zhWordSegmenter = null;
|
|
21
|
+
function getZhSegmenter() {
|
|
22
|
+
if (zhWordSegmenter !== null)
|
|
23
|
+
return zhWordSegmenter;
|
|
24
|
+
try {
|
|
25
|
+
zhWordSegmenter = new Intl.Segmenter("zh", { granularity: "word" });
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
zhWordSegmenter = null; // 旧 ICU / 非 zh 环境:fallback 到单字
|
|
29
|
+
}
|
|
30
|
+
return zhWordSegmenter;
|
|
31
|
+
}
|
|
32
|
+
/** Token 化结果
|
|
33
|
+
*
|
|
34
|
+
* mode 参数(P0-6 修复):
|
|
35
|
+
* - 'index':索引阶段。word-level segment 长度 > 1 时,额外补单字 token,
|
|
36
|
+
* 让单字 query(如"团")能命中含该字的词(如"团队")。
|
|
37
|
+
* - 'query':查询阶段。不补单字 token,但 segmenter 输出的 word-level
|
|
38
|
+
* 单字 token(如"调试"被切成["调","试"])正常加入。
|
|
39
|
+
*
|
|
40
|
+
* Task 4.1 anti-false-positive 的 trade-off(P0-6 修订):
|
|
41
|
+
* 索引端补单字后,segmenter 不识别的 2 字 query(如"忆系")会产生跨词
|
|
42
|
+
* 边界匹配(假阳性)。但用户极少查无意义 2 字组合,单字 query 极常见,
|
|
43
|
+
* trade-off 划算。FTS 真正消除假阳性需要 phrase matching(未实现)。
|
|
44
|
+
*/
|
|
45
|
+
function tokenize(text, mode = "index") {
|
|
16
46
|
if (!text) {
|
|
17
47
|
return [];
|
|
18
48
|
}
|
|
@@ -21,20 +51,41 @@ function tokenize(text) {
|
|
|
21
51
|
// 英文 word
|
|
22
52
|
const englishWords = lower.match(/[a-z][a-z0-9_-]{1,}/g) ?? [];
|
|
23
53
|
tokens.push(...englishWords);
|
|
24
|
-
//
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
54
|
+
// 中文段(Intl.Segmenter 也能切英文,但 regex 已处理;这里只跑中日韩段)
|
|
55
|
+
const cjkSegments = lower.match(/[一-龥ぁ-んァ-ン]+/g) ?? [];
|
|
56
|
+
const segmenter = getZhSegmenter();
|
|
57
|
+
for (const seg of cjkSegments) {
|
|
58
|
+
if (segmenter !== null) {
|
|
59
|
+
// 词级切分:不额外生成单字 token,避免 "忆系" 这种跨词边界的查询命中
|
|
60
|
+
// "记忆系统设计"(否则单字 "忆"/"系" 都在文档 tokens 里,导致假阳性)。
|
|
61
|
+
// ICU 字典能识别的常见词("记忆"/"系统"/"设计")会作为一个 token,
|
|
62
|
+
// 词典不识别的("调试"→["调","试"])按单字输出,符合用户直觉。
|
|
63
|
+
const seen = new Set();
|
|
64
|
+
for (const { segment } of segmenter.segment(seg)) {
|
|
65
|
+
const trimmed = segment.trim();
|
|
66
|
+
if (!trimmed)
|
|
67
|
+
continue;
|
|
68
|
+
if (!seen.has(trimmed)) {
|
|
69
|
+
seen.add(trimmed);
|
|
70
|
+
tokens.push(trimmed);
|
|
71
|
+
}
|
|
72
|
+
// P0-6 修复(index 模式):word-level segment 额外补单字 token,
|
|
73
|
+
// 让单字 query(如"团")能命中含该字的词(如"团队")。
|
|
74
|
+
// 仅 index 模式拆字;query 模式不拆,避免膨胀 query token 集合。
|
|
75
|
+
if (mode === "index" && trimmed.length > 1) {
|
|
76
|
+
for (const ch of trimmed) {
|
|
77
|
+
if (/[一-龥ぁ-んァ-ン]/.test(ch) && !seen.has(ch)) {
|
|
78
|
+
seen.add(ch);
|
|
79
|
+
tokens.push(ch);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
29
84
|
}
|
|
30
85
|
else {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
// 也加入单字,便于短查询匹配
|
|
35
|
-
for (const ch of seg) {
|
|
86
|
+
// fallback:无 Intl.Segmenter 时退到单字(不引入 bigram 假阳性)
|
|
87
|
+
for (const ch of seg)
|
|
36
88
|
tokens.push(ch);
|
|
37
|
-
}
|
|
38
89
|
}
|
|
39
90
|
}
|
|
40
91
|
// 数字
|
|
@@ -59,7 +110,7 @@ export function buildFtsIndex(lines) {
|
|
|
59
110
|
line.domainTags.join(" "),
|
|
60
111
|
line.contextTags.join(" "),
|
|
61
112
|
].join(" ");
|
|
62
|
-
const tokens = new Set(tokenize(text));
|
|
113
|
+
const tokens = new Set(tokenize(text, "index"));
|
|
63
114
|
docTokens.set(line.id, tokens);
|
|
64
115
|
for (const token of tokens) {
|
|
65
116
|
let postings = inverted.get(token);
|
|
@@ -82,7 +133,7 @@ export function buildFtsIndex(lines) {
|
|
|
82
133
|
* 计分:每个匹配 token 加 1 分;title 中的 token 加权(2x)
|
|
83
134
|
*/
|
|
84
135
|
export function searchFts(query, index, limit = 50) {
|
|
85
|
-
const queryTokens = tokenize(query);
|
|
136
|
+
const queryTokens = tokenize(query, "query");
|
|
86
137
|
if (queryTokens.length === 0) {
|
|
87
138
|
return [];
|
|
88
139
|
}
|
|
@@ -101,9 +152,10 @@ export function searchFts(query, index, limit = 50) {
|
|
|
101
152
|
// 基础分
|
|
102
153
|
entry.score += 1;
|
|
103
154
|
entry.matched.add(token);
|
|
104
|
-
// title 加权:如果 token 在 title 中
|
|
155
|
+
// title 加权:如果 token 在 title 中(用 index 模式 tokenize,
|
|
156
|
+
// 因为 doc.title 在索引阶段也用 index 模式,两端一致)
|
|
105
157
|
const doc = index.docs.get(docId);
|
|
106
|
-
if (doc && tokenize(doc.title).includes(token)) {
|
|
158
|
+
if (doc && tokenize(doc.title, "index").includes(token)) {
|
|
107
159
|
entry.score += 1;
|
|
108
160
|
}
|
|
109
161
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fts.js","sourceRoot":"","sources":["../../src/retrieval/fts.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"fts.js","sourceRoot":"","sources":["../../src/retrieval/fts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/status/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/status/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,aAAa,EACb,kBAAkB,GAGnB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 健康可视化状态(Finding 128 / 254 等 P0 的用户感知层)
|
|
3
|
+
*
|
|
4
|
+
* `co-engram status` 命令与 viewer Health tab 共用本模块。
|
|
5
|
+
* 设计目标:把"静默失败"变成"一眼可见"——挑剔用户首启就能看到问题在哪。
|
|
6
|
+
*
|
|
7
|
+
* @module @co-engram/core/status
|
|
8
|
+
*/
|
|
9
|
+
/** 单项健康检查结果 */
|
|
10
|
+
export interface HealthCheck {
|
|
11
|
+
/** 检查项 id(snake_case) */
|
|
12
|
+
readonly id: string;
|
|
13
|
+
/** 显示名 */
|
|
14
|
+
readonly label: string;
|
|
15
|
+
/** ok / warn / error / info */
|
|
16
|
+
readonly status: "ok" | "warn" | "error" | "info";
|
|
17
|
+
/** 简短说明 */
|
|
18
|
+
readonly message: string;
|
|
19
|
+
/** 可选详情(展开看) */
|
|
20
|
+
readonly detail?: string;
|
|
21
|
+
/**
|
|
22
|
+
* 警告含义说明(只在 warn/error 时填;ok/info 留空)
|
|
23
|
+
*
|
|
24
|
+
* 结构化对齐:i18n key `viewer.health.why.<checkId>` —— viewer 端按当前
|
|
25
|
+
* 语言渲染,core 不耦合文案。例如 checkId='merge_driver' 时 viewer 翻译表里
|
|
26
|
+
* 有 `viewer.health.why.merge_driver = "未配置时,多人协作合并分支会引发
|
|
27
|
+
* engram frontmatter 冲突,需手工解决"`。
|
|
28
|
+
*/
|
|
29
|
+
readonly whyI18nKey?: string;
|
|
30
|
+
/**
|
|
31
|
+
* 修复指引(结构化,只在 warn/error 时填)
|
|
32
|
+
*
|
|
33
|
+
* 与 doctor 的 `DoctorNextAction` 区别:nextAction 给 LLM agent(含 argsHint),
|
|
34
|
+
* `fix` 给人(含可复制命令)。两者刻意区分,不混用。
|
|
35
|
+
*/
|
|
36
|
+
readonly fix?: HealthCheckFix;
|
|
37
|
+
}
|
|
38
|
+
/** 健康检查的修复指引(给 viewer UI 用) */
|
|
39
|
+
export interface HealthCheckFix {
|
|
40
|
+
/**
|
|
41
|
+
* 修复描述 i18n key(viewer 端按语言渲染)
|
|
42
|
+
*
|
|
43
|
+
* 例如 checkId='merge_driver' → `viewer.health.fix.merge_driver.description`
|
|
44
|
+
*/
|
|
45
|
+
readonly descriptionI18nKey: string;
|
|
46
|
+
/**
|
|
47
|
+
* 可执行的 shell 命令(可选,UI 提供"复制命令"按钮)
|
|
48
|
+
*
|
|
49
|
+
* 不通过 i18n key —— 命令跨语言一致。例如 `co-engram init`、
|
|
50
|
+
* `git init && git add -A && git commit -m initial`。
|
|
51
|
+
*/
|
|
52
|
+
readonly command?: string;
|
|
53
|
+
/**
|
|
54
|
+
* 对应的 co-engram 工具名(可选,UI 显示工具名 + argsHint)
|
|
55
|
+
*
|
|
56
|
+
* 例如 `engram_list_proposals`、`engram_doctor`。
|
|
57
|
+
*/
|
|
58
|
+
readonly tool?: string;
|
|
59
|
+
/** 工具参数提示(配合 tool 用) */
|
|
60
|
+
readonly argsHint?: string;
|
|
61
|
+
}
|
|
62
|
+
/** 完整状态快照 */
|
|
63
|
+
export interface StatusSnapshot {
|
|
64
|
+
/** 生成时间 ISO */
|
|
65
|
+
readonly generatedAt: string;
|
|
66
|
+
/** dataRoot 路径 */
|
|
67
|
+
readonly dataRoot: string;
|
|
68
|
+
/** dataRoot 是否存在 */
|
|
69
|
+
readonly dataRootExists: boolean;
|
|
70
|
+
/** 是否为 co-engram 仓库(含 .co-engram/config.json) */
|
|
71
|
+
readonly isEngramWarehouse: boolean;
|
|
72
|
+
/** 配置(若可读) */
|
|
73
|
+
readonly config?: Readonly<Record<string, unknown>>;
|
|
74
|
+
/** engram 统计 */
|
|
75
|
+
readonly stats: {
|
|
76
|
+
readonly total: number;
|
|
77
|
+
readonly byKind: Readonly<Record<string, number>>;
|
|
78
|
+
readonly byStatus: Readonly<Record<string, number>>;
|
|
79
|
+
readonly archived: number;
|
|
80
|
+
readonly forgotten: number;
|
|
81
|
+
};
|
|
82
|
+
/** 索引文件状态 */
|
|
83
|
+
readonly indexes: {
|
|
84
|
+
readonly engramIndex: {
|
|
85
|
+
readonly exists: boolean;
|
|
86
|
+
readonly mtime?: string;
|
|
87
|
+
readonly sizeBytes?: number;
|
|
88
|
+
};
|
|
89
|
+
readonly digestJsonl: {
|
|
90
|
+
readonly exists: boolean;
|
|
91
|
+
readonly mtime?: string;
|
|
92
|
+
readonly sizeBytes?: number;
|
|
93
|
+
};
|
|
94
|
+
readonly graphJson: {
|
|
95
|
+
readonly exists: boolean;
|
|
96
|
+
readonly mtime?: string;
|
|
97
|
+
readonly sizeBytes?: number;
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
/** 候选提案 */
|
|
101
|
+
readonly proposals: {
|
|
102
|
+
readonly pending: number;
|
|
103
|
+
readonly total: number;
|
|
104
|
+
};
|
|
105
|
+
/** Git 状态 */
|
|
106
|
+
readonly git: {
|
|
107
|
+
readonly isRepo: boolean;
|
|
108
|
+
readonly dirty: boolean;
|
|
109
|
+
readonly uncommittedCount: number;
|
|
110
|
+
};
|
|
111
|
+
/** merge driver 配置 */
|
|
112
|
+
readonly mergeDriver: {
|
|
113
|
+
readonly configured: boolean;
|
|
114
|
+
readonly detail?: string;
|
|
115
|
+
};
|
|
116
|
+
/** 健康检查项列表 */
|
|
117
|
+
readonly checks: readonly HealthCheck[];
|
|
118
|
+
/** 总体健康(ok = 所有 check 都 ok/info;warn = 有 warn;error = 有 error) */
|
|
119
|
+
readonly overall: "ok" | "warn" | "error";
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 计算仓库健康状态
|
|
123
|
+
*
|
|
124
|
+
* @param dataRoot team-memory 根目录
|
|
125
|
+
* @returns StatusSnapshot;即使 dataRoot 不存在也返回(便于 UI 显示诊断)
|
|
126
|
+
*/
|
|
127
|
+
export declare function computeStatus(dataRoot: string): StatusSnapshot;
|
|
128
|
+
/**
|
|
129
|
+
* 把 StatusSnapshot 格式化为人类可读文本
|
|
130
|
+
*/
|
|
131
|
+
export declare function formatStatusAsText(s: StatusSnapshot): string;
|
|
132
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/status/status.ts"],"names":[],"mappings":"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"}
|