@co-engram/core 0.1.2 → 0.1.4
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 +73 -0
- package/dist/bootstrap/classify.d.ts.map +1 -0
- package/dist/bootstrap/classify.js +134 -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 +53 -3
- 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 +1278 -33
- 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 +709 -32
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +1282 -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/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/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 +81 -4
- package/dist/observability/proposal-engine.d.ts.map +1 -1
- package/dist/observability/proposal-engine.js +207 -13
- 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 +74 -5
- package/dist/storage/repository.d.ts.map +1 -1
- package/dist/storage/repository.js +337 -21
- 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/proposal-tools.d.ts +23 -1
- package/dist/tools/proposal-tools.d.ts.map +1 -1
- package/dist/tools/proposal-tools.js +58 -17
- package/dist/tools/proposal-tools.js.map +1 -1
- 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 +96 -22
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +84 -11
- 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
|
@@ -14,10 +14,83 @@
|
|
|
14
14
|
* @module @co-engram/core/prompt-signals
|
|
15
15
|
*/
|
|
16
16
|
import type { PromptSignalSnapshot } from "./types.js";
|
|
17
|
+
import type { PromptSignalBus } from "./event-bus.js";
|
|
17
18
|
/**
|
|
18
19
|
* 缓存文件名
|
|
19
20
|
*/
|
|
20
21
|
export declare const PROMPT_SIGNALS_FILENAME = "prompt-signals.json";
|
|
22
|
+
/**
|
|
23
|
+
* PromptSignalCache 配置
|
|
24
|
+
*
|
|
25
|
+
* - bus:事件源,cache 订阅它的 emit
|
|
26
|
+
* - rebuild:实际重算 snapshot 的回调(由消费方注入,
|
|
27
|
+
* 通常读 team-memory + computePromptSignals + writePromptSignals)
|
|
28
|
+
* - debounceMs:事件触发后等多久才真的 rebuild(默认 200ms,
|
|
29
|
+
* 让 burst 事件合并成单次重算)
|
|
30
|
+
* - initialSnapshot:启动时的初始值(默认 EMPTY_PROMPT_SIGNALS)
|
|
31
|
+
*/
|
|
32
|
+
export interface PromptSignalCacheOptions {
|
|
33
|
+
readonly bus: PromptSignalBus;
|
|
34
|
+
readonly rebuild: () => Promise<PromptSignalSnapshot>;
|
|
35
|
+
readonly debounceMs?: number;
|
|
36
|
+
readonly initialSnapshot?: PromptSignalSnapshot;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 事件驱动的 invalidating cache(Task 3.4 root cause AD)
|
|
40
|
+
*
|
|
41
|
+
* 旧实现:prompt-builder 直接读 prompt-signals.json,只在 maintenance light stage
|
|
42
|
+
* 周期跑(默认 5min)时刷新。engram_create / synapse_create / proposal accept 等
|
|
43
|
+
* 操作不会立即触发刷新,导致"刚创建的 engram 没出现在下次 prompt 的 topTags"。
|
|
44
|
+
*
|
|
45
|
+
* 新实现:cache 订阅 PromptSignalBus,任何相关事件都标记 stale + debounced rebuild,
|
|
46
|
+
* 保证下一次 promptBuilder.snapshot() 拿到最新数据。
|
|
47
|
+
*
|
|
48
|
+
* 失败策略:rebuild 抛错时保留旧 snapshot 并清掉 stale 标记(避免无限重试);
|
|
49
|
+
* 调用方可通过 getRevision() 观察是否真的更新过。
|
|
50
|
+
*/
|
|
51
|
+
export declare class PromptSignalCache {
|
|
52
|
+
private snapshotValue;
|
|
53
|
+
private revisionValue;
|
|
54
|
+
private staleValue;
|
|
55
|
+
private debounceMs;
|
|
56
|
+
private readonly rebuildFn;
|
|
57
|
+
private readonly unsubscribe;
|
|
58
|
+
private pendingTimer;
|
|
59
|
+
private disposed;
|
|
60
|
+
constructor(opts: PromptSignalCacheOptions);
|
|
61
|
+
/**
|
|
62
|
+
* 当前 snapshot 引用
|
|
63
|
+
*
|
|
64
|
+
* rebuild 成功后引用会替换,消费方可以用引用相等检测是否需要重读。
|
|
65
|
+
*/
|
|
66
|
+
snapshot(): PromptSignalSnapshot;
|
|
67
|
+
/**
|
|
68
|
+
* rebuild 次数(成功才递增)
|
|
69
|
+
*
|
|
70
|
+
* 用于测试断言和监控:revision 没动 = 数据没变。
|
|
71
|
+
*/
|
|
72
|
+
getRevision(): number;
|
|
73
|
+
/**
|
|
74
|
+
* 是否有事件触发但还未 rebuild 完成
|
|
75
|
+
*
|
|
76
|
+
* true 表示当前 snapshot 可能过时。
|
|
77
|
+
*/
|
|
78
|
+
isStale(): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* 手动触发 rebuild(忽略 stale 状态)
|
|
81
|
+
*
|
|
82
|
+
* 成功 → revision++ + 替换 snapshot + 清 stale;
|
|
83
|
+
* 失败 → 保留旧 snapshot + 清 stale(避免无限重试),不抛错。
|
|
84
|
+
*/
|
|
85
|
+
rebuild(): Promise<void>;
|
|
86
|
+
/**
|
|
87
|
+
* 停止接收 bus 事件,清掉 pending timer
|
|
88
|
+
*
|
|
89
|
+
* dispose 后再调用 rebuild() 是 noop,snapshot() 返回最后一次成功的值。
|
|
90
|
+
*/
|
|
91
|
+
dispose(): void;
|
|
92
|
+
private handleBusEvent;
|
|
93
|
+
}
|
|
21
94
|
/**
|
|
22
95
|
* 读取 prompt signals 缓存
|
|
23
96
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/prompt-signals/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;GAEG;AACH,eAAO,MAAM,uBAAuB,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/prompt-signals/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD;;GAEG;AACH,eAAO,MAAM,uBAAuB,wBAAwB,CAAC;AAM7D;;;;;;;;;GASG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACtD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,oBAAoB,CAAC;CACjD;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;IAChE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,QAAQ,CAAS;gBAEb,IAAI,EAAE,wBAAwB;IAO1C;;;;OAIG;IACH,QAAQ,IAAI,oBAAoB;IAIhC;;;;OAIG;IACH,WAAW,IAAI,MAAM;IAIrB;;;;OAIG;IACH,OAAO,IAAI,OAAO;IAIlB;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAa9B;;;;OAIG;IACH,OAAO,IAAI,IAAI;IAUf,OAAO,CAAC,cAAc;CAWvB;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GACzC,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAY3C;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,oBAAoB,EAC7B,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GACzD,OAAO,CAAC,IAAI,CAAC,CAQf"}
|
|
@@ -13,10 +13,112 @@
|
|
|
13
13
|
*
|
|
14
14
|
* @module @co-engram/core/prompt-signals
|
|
15
15
|
*/
|
|
16
|
+
import { EMPTY_PROMPT_SIGNALS } from "./types.js";
|
|
16
17
|
/**
|
|
17
18
|
* 缓存文件名
|
|
18
19
|
*/
|
|
19
20
|
export const PROMPT_SIGNALS_FILENAME = "prompt-signals.json";
|
|
21
|
+
/**
|
|
22
|
+
* 事件驱动的 invalidating cache(Task 3.4 root cause AD)
|
|
23
|
+
*
|
|
24
|
+
* 旧实现:prompt-builder 直接读 prompt-signals.json,只在 maintenance light stage
|
|
25
|
+
* 周期跑(默认 5min)时刷新。engram_create / synapse_create / proposal accept 等
|
|
26
|
+
* 操作不会立即触发刷新,导致"刚创建的 engram 没出现在下次 prompt 的 topTags"。
|
|
27
|
+
*
|
|
28
|
+
* 新实现:cache 订阅 PromptSignalBus,任何相关事件都标记 stale + debounced rebuild,
|
|
29
|
+
* 保证下一次 promptBuilder.snapshot() 拿到最新数据。
|
|
30
|
+
*
|
|
31
|
+
* 失败策略:rebuild 抛错时保留旧 snapshot 并清掉 stale 标记(避免无限重试);
|
|
32
|
+
* 调用方可通过 getRevision() 观察是否真的更新过。
|
|
33
|
+
*/
|
|
34
|
+
export class PromptSignalCache {
|
|
35
|
+
snapshotValue;
|
|
36
|
+
revisionValue = 0;
|
|
37
|
+
staleValue = false;
|
|
38
|
+
debounceMs;
|
|
39
|
+
rebuildFn;
|
|
40
|
+
unsubscribe;
|
|
41
|
+
pendingTimer = null;
|
|
42
|
+
disposed = false;
|
|
43
|
+
constructor(opts) {
|
|
44
|
+
this.snapshotValue = opts.initialSnapshot ?? EMPTY_PROMPT_SIGNALS;
|
|
45
|
+
this.debounceMs = opts.debounceMs ?? 200;
|
|
46
|
+
this.rebuildFn = opts.rebuild;
|
|
47
|
+
this.unsubscribe = opts.bus.on(() => this.handleBusEvent());
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 当前 snapshot 引用
|
|
51
|
+
*
|
|
52
|
+
* rebuild 成功后引用会替换,消费方可以用引用相等检测是否需要重读。
|
|
53
|
+
*/
|
|
54
|
+
snapshot() {
|
|
55
|
+
return this.snapshotValue;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* rebuild 次数(成功才递增)
|
|
59
|
+
*
|
|
60
|
+
* 用于测试断言和监控:revision 没动 = 数据没变。
|
|
61
|
+
*/
|
|
62
|
+
getRevision() {
|
|
63
|
+
return this.revisionValue;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 是否有事件触发但还未 rebuild 完成
|
|
67
|
+
*
|
|
68
|
+
* true 表示当前 snapshot 可能过时。
|
|
69
|
+
*/
|
|
70
|
+
isStale() {
|
|
71
|
+
return this.staleValue;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 手动触发 rebuild(忽略 stale 状态)
|
|
75
|
+
*
|
|
76
|
+
* 成功 → revision++ + 替换 snapshot + 清 stale;
|
|
77
|
+
* 失败 → 保留旧 snapshot + 清 stale(避免无限重试),不抛错。
|
|
78
|
+
*/
|
|
79
|
+
async rebuild() {
|
|
80
|
+
if (this.disposed)
|
|
81
|
+
return;
|
|
82
|
+
try {
|
|
83
|
+
const fresh = await this.rebuildFn();
|
|
84
|
+
this.snapshotValue = fresh;
|
|
85
|
+
this.revisionValue += 1;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// 静默失败:保留旧 snapshot,清 stale 避免下一轮立刻重试
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
this.staleValue = false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 停止接收 bus 事件,清掉 pending timer
|
|
96
|
+
*
|
|
97
|
+
* dispose 后再调用 rebuild() 是 noop,snapshot() 返回最后一次成功的值。
|
|
98
|
+
*/
|
|
99
|
+
dispose() {
|
|
100
|
+
if (this.disposed)
|
|
101
|
+
return;
|
|
102
|
+
this.disposed = true;
|
|
103
|
+
this.unsubscribe();
|
|
104
|
+
if (this.pendingTimer !== null) {
|
|
105
|
+
clearTimeout(this.pendingTimer);
|
|
106
|
+
this.pendingTimer = null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
handleBusEvent() {
|
|
110
|
+
if (this.disposed)
|
|
111
|
+
return;
|
|
112
|
+
this.staleValue = true;
|
|
113
|
+
if (this.pendingTimer !== null) {
|
|
114
|
+
clearTimeout(this.pendingTimer);
|
|
115
|
+
}
|
|
116
|
+
this.pendingTimer = setTimeout(() => {
|
|
117
|
+
this.pendingTimer = null;
|
|
118
|
+
void this.rebuild();
|
|
119
|
+
}, this.debounceMs);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
20
122
|
/**
|
|
21
123
|
* 读取 prompt signals 缓存
|
|
22
124
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/prompt-signals/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/prompt-signals/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt signals 事件总线(Task 3.4)
|
|
3
|
+
*
|
|
4
|
+
* 15 轮拉通分析 root cause AD「prompt 提示不刷新」的核心修复:
|
|
5
|
+
* 仓库状态变化(engram 创建/验证/reinforce、synapse 创建、proposal 决议、
|
|
6
|
+
* doctor 完成)应触发 prompt-signals 缓存失效并 debounced rebuild,
|
|
7
|
+
* 让下一次 prompt build 看到最新 signals。
|
|
8
|
+
*
|
|
9
|
+
* 设计:
|
|
10
|
+
* - 基于 Node EventEmitter,零依赖
|
|
11
|
+
* - 类型安全:event.type 是有限枚举,拼错编译期 fail
|
|
12
|
+
* - on() 返回 unsubscribe,便于 cache.dispose() 解绑
|
|
13
|
+
*
|
|
14
|
+
* Phase A 只交付原语(event bus + cache class);
|
|
15
|
+
* Phase B 把 emit 点接入 close_learning_loop / synapse_create / repository 等。
|
|
16
|
+
*
|
|
17
|
+
* @module @co-engram/core/prompt-signals
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* 触发 prompt-signals 失效的事件类型
|
|
21
|
+
*
|
|
22
|
+
* 每种事件对应一个"会改变 topTags / missedTopics / lowConfidenceTopics"的仓库操作:
|
|
23
|
+
* - engram_created / engram_updated / engram_verified / engram_reinforced /
|
|
24
|
+
* engram_failed:engram 增删改、验证状态变化、强化或失败信号
|
|
25
|
+
* - synapse_created:新增 synapse 影响 graph 结构和 domain profile
|
|
26
|
+
* - proposal_accepted / proposal_dismissed:proposal 决议改变 engram 集合
|
|
27
|
+
* - doctor_completed:doctor 可能 sweep/forget,engram 集合变化
|
|
28
|
+
*/
|
|
29
|
+
export type PromptSignalEventType = "engram_created" | "engram_updated" | "engram_verified" | "engram_reinforced" | "engram_failed" | "synapse_created" | "proposal_accepted" | "proposal_dismissed" | "doctor_completed";
|
|
30
|
+
/**
|
|
31
|
+
* 一条 prompt signal 事件
|
|
32
|
+
*
|
|
33
|
+
* engramId 可选:某些事件(如 doctor_completed)不针对单个 engram。
|
|
34
|
+
* at 是 ISO timestamp,由 emit 方填入(便于审计/调试)。
|
|
35
|
+
*/
|
|
36
|
+
export interface PromptSignalEvent {
|
|
37
|
+
readonly type: PromptSignalEventType;
|
|
38
|
+
readonly engramId?: string;
|
|
39
|
+
readonly at: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Prompt signals 事件总线
|
|
43
|
+
*
|
|
44
|
+
* 用法:
|
|
45
|
+
* const bus = new PromptSignalBus();
|
|
46
|
+
* const unsubscribe = bus.on((event) => console.log(event));
|
|
47
|
+
* bus.emit({ type: "engram_created", engramId: "E1", at: new Date().toISOString() });
|
|
48
|
+
* unsubscribe();
|
|
49
|
+
*/
|
|
50
|
+
export declare class PromptSignalBus {
|
|
51
|
+
private readonly emitter;
|
|
52
|
+
constructor();
|
|
53
|
+
/**
|
|
54
|
+
* 发布事件,同步通知所有订阅者
|
|
55
|
+
*
|
|
56
|
+
* 同步语义让 emit 方能在调试时立刻看到效果;
|
|
57
|
+
* cache 订阅者收到事件后会自己调度 debounced rebuild(异步)。
|
|
58
|
+
*/
|
|
59
|
+
emit(event: PromptSignalEvent): void;
|
|
60
|
+
/**
|
|
61
|
+
* 订阅事件
|
|
62
|
+
*
|
|
63
|
+
* @returns unsubscribe 函数,调用后停止接收事件
|
|
64
|
+
*/
|
|
65
|
+
on(handler: (event: PromptSignalEvent) => void): () => void;
|
|
66
|
+
}
|
|
67
|
+
export declare function getGlobalPromptSignalBus(): PromptSignalBus;
|
|
68
|
+
/**
|
|
69
|
+
* 测试辅助:重置 singleton bus(让每个 test 隔离)
|
|
70
|
+
*
|
|
71
|
+
* 生产代码不应调用。cache.dispose() 不会自动调用此函数——
|
|
72
|
+
* 进程退出即清理,无需手动 reset。
|
|
73
|
+
*/
|
|
74
|
+
export declare function resetGlobalPromptSignalBus(): void;
|
|
75
|
+
/**
|
|
76
|
+
* 安全 emit:任何异常都吞掉(bus 不应阻塞业务路径)
|
|
77
|
+
*
|
|
78
|
+
* 失败场景:listener 抛错(EventEmitter 默认会 uncaught),bus 写审计落盘失败,等。
|
|
79
|
+
* prompt signals 是派生数据,丢失一次刷新无影响——下次事件触发会再 rebuild。
|
|
80
|
+
*/
|
|
81
|
+
export declare function safeEmit(event: PromptSignalEvent): void;
|
|
82
|
+
//# sourceMappingURL=event-bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/prompt-signals/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH;;;;;;;;;GASG;AACH,MAAM,MAAM,qBAAqB,GAC7B,gBAAgB,GAChB,gBAAgB,GAChB,iBAAiB,GACjB,mBAAmB,GACnB,eAAe,GACf,iBAAiB,GACjB,mBAAmB,GACnB,oBAAoB,GACpB,kBAAkB,CAAC;AAEvB;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;;IAO9C;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAIpC;;;;OAIG;IACH,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI;CAM5D;AAsBD,wBAAgB,wBAAwB,IAAI,eAAe,CAK1D;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,IAAI,IAAI,CAIjD;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAMvD"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt signals 事件总线(Task 3.4)
|
|
3
|
+
*
|
|
4
|
+
* 15 轮拉通分析 root cause AD「prompt 提示不刷新」的核心修复:
|
|
5
|
+
* 仓库状态变化(engram 创建/验证/reinforce、synapse 创建、proposal 决议、
|
|
6
|
+
* doctor 完成)应触发 prompt-signals 缓存失效并 debounced rebuild,
|
|
7
|
+
* 让下一次 prompt build 看到最新 signals。
|
|
8
|
+
*
|
|
9
|
+
* 设计:
|
|
10
|
+
* - 基于 Node EventEmitter,零依赖
|
|
11
|
+
* - 类型安全:event.type 是有限枚举,拼错编译期 fail
|
|
12
|
+
* - on() 返回 unsubscribe,便于 cache.dispose() 解绑
|
|
13
|
+
*
|
|
14
|
+
* Phase A 只交付原语(event bus + cache class);
|
|
15
|
+
* Phase B 把 emit 点接入 close_learning_loop / synapse_create / repository 等。
|
|
16
|
+
*
|
|
17
|
+
* @module @co-engram/core/prompt-signals
|
|
18
|
+
*/
|
|
19
|
+
import { EventEmitter } from "node:events";
|
|
20
|
+
/**
|
|
21
|
+
* Prompt signals 事件总线
|
|
22
|
+
*
|
|
23
|
+
* 用法:
|
|
24
|
+
* const bus = new PromptSignalBus();
|
|
25
|
+
* const unsubscribe = bus.on((event) => console.log(event));
|
|
26
|
+
* bus.emit({ type: "engram_created", engramId: "E1", at: new Date().toISOString() });
|
|
27
|
+
* unsubscribe();
|
|
28
|
+
*/
|
|
29
|
+
export class PromptSignalBus {
|
|
30
|
+
emitter = new EventEmitter();
|
|
31
|
+
constructor() {
|
|
32
|
+
// prompt signals 不需要无限 listener,SetMaxListeners 避免开发期警告
|
|
33
|
+
this.emitter.setMaxListeners(20);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 发布事件,同步通知所有订阅者
|
|
37
|
+
*
|
|
38
|
+
* 同步语义让 emit 方能在调试时立刻看到效果;
|
|
39
|
+
* cache 订阅者收到事件后会自己调度 debounced rebuild(异步)。
|
|
40
|
+
*/
|
|
41
|
+
emit(event) {
|
|
42
|
+
this.emitter.emit("signal", event);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 订阅事件
|
|
46
|
+
*
|
|
47
|
+
* @returns unsubscribe 函数,调用后停止接收事件
|
|
48
|
+
*/
|
|
49
|
+
on(handler) {
|
|
50
|
+
this.emitter.on("signal", handler);
|
|
51
|
+
return () => {
|
|
52
|
+
this.emitter.off("signal", handler);
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// ============================================================
|
|
57
|
+
// Task 3.4 Phase B:进程级 singleton bus
|
|
58
|
+
// ============================================================
|
|
59
|
+
/**
|
|
60
|
+
* 进程级 singleton PromptSignalBus
|
|
61
|
+
*
|
|
62
|
+
* 设计权衡:
|
|
63
|
+
* - 选 singleton 而非 DI:repository / proposalEngine / closeLearningLoop
|
|
64
|
+
* 都是高频核心路径,加 bus 参数会污染所有调用方签名。
|
|
65
|
+
* - 进程内一致即可:prompt-signals 是宿主进程内部的派生缓存,
|
|
66
|
+
* 不跨进程、不持久化,singleton 不会引入全局状态污染问题。
|
|
67
|
+
* - 测试隔离:resetGlobalPromptSignalBus() 让每个 test 拿干净 bus。
|
|
68
|
+
*
|
|
69
|
+
* 用法:
|
|
70
|
+
* import { getGlobalPromptSignalBus } from ".../prompt-signals";
|
|
71
|
+
* getGlobalPromptSignalBus().emit({ type: "engram_created", engramId, at });
|
|
72
|
+
*/
|
|
73
|
+
let globalPromptSignalBus = null;
|
|
74
|
+
export function getGlobalPromptSignalBus() {
|
|
75
|
+
if (globalPromptSignalBus === null) {
|
|
76
|
+
globalPromptSignalBus = new PromptSignalBus();
|
|
77
|
+
}
|
|
78
|
+
return globalPromptSignalBus;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 测试辅助:重置 singleton bus(让每个 test 隔离)
|
|
82
|
+
*
|
|
83
|
+
* 生产代码不应调用。cache.dispose() 不会自动调用此函数——
|
|
84
|
+
* 进程退出即清理,无需手动 reset。
|
|
85
|
+
*/
|
|
86
|
+
export function resetGlobalPromptSignalBus() {
|
|
87
|
+
if (globalPromptSignalBus !== null) {
|
|
88
|
+
globalPromptSignalBus = null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 安全 emit:任何异常都吞掉(bus 不应阻塞业务路径)
|
|
93
|
+
*
|
|
94
|
+
* 失败场景:listener 抛错(EventEmitter 默认会 uncaught),bus 写审计落盘失败,等。
|
|
95
|
+
* prompt signals 是派生数据,丢失一次刷新无影响——下次事件触发会再 rebuild。
|
|
96
|
+
*/
|
|
97
|
+
export function safeEmit(event) {
|
|
98
|
+
try {
|
|
99
|
+
getGlobalPromptSignalBus().emit(event);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// intentional:bus 失败不阻塞业务
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=event-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/prompt-signals/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmC3C;;;;;;;;GAQG;AACH,MAAM,OAAO,eAAe;IACT,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;IAE9C;QACE,wDAAwD;QACxD,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACH,IAAI,CAAC,KAAwB;QAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,EAAE,CAAC,OAA2C;QAC5C,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC,CAAC;IACJ,CAAC;CACF;AAED,+DAA+D;AAC/D,qCAAqC;AACrC,+DAA+D;AAE/D;;;;;;;;;;;;;GAaG;AACH,IAAI,qBAAqB,GAA2B,IAAI,CAAC;AAEzD,MAAM,UAAU,wBAAwB;IACtC,IAAI,qBAAqB,KAAK,IAAI,EAAE,CAAC;QACnC,qBAAqB,GAAG,IAAI,eAAe,EAAE,CAAC;IAChD,CAAC;IACD,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B;IACxC,IAAI,qBAAqB,KAAK,IAAI,EAAE,CAAC;QACnC,qBAAqB,GAAG,IAAI,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAwB;IAC/C,IAAI,CAAC;QACH,wBAAwB,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;AACH,CAAC"}
|
|
@@ -8,5 +8,6 @@
|
|
|
8
8
|
export type { PromptSignalSnapshot, PromptSignalStats } from "./types.js";
|
|
9
9
|
export { EMPTY_PROMPT_SIGNALS } from "./types.js";
|
|
10
10
|
export { computePromptSignals, type ComputePromptSignalsOptions, } from "./stats.js";
|
|
11
|
-
export { readPromptSignals, writePromptSignals, PROMPT_SIGNALS_FILENAME, } from "./cache.js";
|
|
11
|
+
export { readPromptSignals, writePromptSignals, PROMPT_SIGNALS_FILENAME, PromptSignalCache, type PromptSignalCacheOptions, } from "./cache.js";
|
|
12
|
+
export { PromptSignalBus, type PromptSignalEvent, type PromptSignalEventType, getGlobalPromptSignalBus, resetGlobalPromptSignalBus, safeEmit, } from "./event-bus.js";
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompt-signals/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EACL,oBAAoB,EACpB,KAAK,2BAA2B,GACjC,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompt-signals/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EACL,oBAAoB,EACpB,KAAK,2BAA2B,GACjC,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,KAAK,wBAAwB,GAC9B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,wBAAwB,EACxB,0BAA0B,EAC1B,QAAQ,GACT,MAAM,gBAAgB,CAAC"}
|
|
@@ -7,5 +7,6 @@
|
|
|
7
7
|
*/
|
|
8
8
|
export { EMPTY_PROMPT_SIGNALS } from "./types.js";
|
|
9
9
|
export { computePromptSignals, } from "./stats.js";
|
|
10
|
-
export { readPromptSignals, writePromptSignals, PROMPT_SIGNALS_FILENAME, } from "./cache.js";
|
|
10
|
+
export { readPromptSignals, writePromptSignals, PROMPT_SIGNALS_FILENAME, PromptSignalCache, } from "./cache.js";
|
|
11
|
+
export { PromptSignalBus, getGlobalPromptSignalBus, resetGlobalPromptSignalBus, safeEmit, } from "./event-bus.js";
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompt-signals/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EACL,oBAAoB,GAErB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompt-signals/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EACL,oBAAoB,GAErB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,GAElB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EAGf,wBAAwB,EACxB,0BAA0B,EAC1B,QAAQ,GACT,MAAM,gBAAgB,CAAC"}
|
|
@@ -48,8 +48,22 @@ export declare function recordRetrievalSuccess(repo: EngramRepository, id: strin
|
|
|
48
48
|
*
|
|
49
49
|
* 用于 Hebbian 间接强化(邻居得到增益时),
|
|
50
50
|
* 或外部队列触发的批量强化(如 Dreaming 周期)。
|
|
51
|
+
*
|
|
52
|
+
* P0-9 修复:Hebbian 邻居联动此前是"幽灵强化" —— 只改 importance,但
|
|
53
|
+
* effectiveRetrievals / retrievalCount / reinforcementScore 全为 0,且
|
|
54
|
+
* audit_log 无任何 reinforce 记录。新增 `withStats` 选项让邻居联动也走
|
|
55
|
+
* 完整统计更新(语义上,邻居被"间接有效检索")。
|
|
51
56
|
*/
|
|
52
|
-
export declare function reinforceEngram(repo: EngramRepository, id: string, amount: number, nowIso?: string
|
|
57
|
+
export declare function reinforceEngram(repo: EngramRepository, id: string, amount: number, nowIso?: string, options?: {
|
|
58
|
+
/**
|
|
59
|
+
* 是否同时更新 retrievalCount/effectiveRetrievals/reinforcementScore。
|
|
60
|
+
* 默认 false(向后兼容:Dreaming 周期批量强化不应污染检索统计)。
|
|
61
|
+
* Hebbian 邻居联动应传 true(P0-9:让邻居统计字段可观察)。
|
|
62
|
+
*/
|
|
63
|
+
readonly withStats?: boolean;
|
|
64
|
+
/** 邻居联动的 effectiveness 值(默认 = amount,即把 importance 增益视作 effectiveness) */
|
|
65
|
+
readonly effectiveness?: number;
|
|
66
|
+
}): {
|
|
53
67
|
id: string;
|
|
54
68
|
importanceDelta: number;
|
|
55
69
|
importance: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ltp.d.ts","sourceRoot":"","sources":["../../src/reinforcement/ltp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,gBAAgB,EACtB,EAAE,EAAE,MAAM,EACV,aAAa,EAAE,MAAM,EACrB,MAAM,GAAE,mBAAoC,EAC5C,MAAM,GAAE,MAAiC,GACxC,SAAS,CA0BX;AAED
|
|
1
|
+
{"version":3,"file":"ltp.d.ts","sourceRoot":"","sources":["../../src/reinforcement/ltp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,gBAAgB,EACtB,EAAE,EAAE,MAAM,EACV,aAAa,EAAE,MAAM,EACrB,MAAM,GAAE,mBAAoC,EAC5C,MAAM,GAAE,MAAiC,GACxC,SAAS,CA0BX;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,gBAAgB,EACtB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAiC,EACzC,OAAO,GAAE;IACP;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CAC5B,GACL;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CA8B7D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,mBAAmB,SAAI,EACvB,MAAM,GAAE,mBAAoC,GAC3C,MAAM,CAOR"}
|
|
@@ -63,18 +63,37 @@ export function recordRetrievalSuccess(repo, id, effectiveness, config = DEFAULT
|
|
|
63
63
|
*
|
|
64
64
|
* 用于 Hebbian 间接强化(邻居得到增益时),
|
|
65
65
|
* 或外部队列触发的批量强化(如 Dreaming 周期)。
|
|
66
|
+
*
|
|
67
|
+
* P0-9 修复:Hebbian 邻居联动此前是"幽灵强化" —— 只改 importance,但
|
|
68
|
+
* effectiveRetrievals / retrievalCount / reinforcementScore 全为 0,且
|
|
69
|
+
* audit_log 无任何 reinforce 记录。新增 `withStats` 选项让邻居联动也走
|
|
70
|
+
* 完整统计更新(语义上,邻居被"间接有效检索")。
|
|
66
71
|
*/
|
|
67
|
-
export function reinforceEngram(repo, id, amount, nowIso = new Date().toISOString()) {
|
|
72
|
+
export function reinforceEngram(repo, id, amount, nowIso = new Date().toISOString(), options = {}) {
|
|
68
73
|
if (!repo.exists(id)) {
|
|
69
74
|
throw new Error(`Engram not found: ${id}`);
|
|
70
75
|
}
|
|
71
76
|
if (amount < 0) {
|
|
72
77
|
throw new Error(`amount must be >= 0, got ${amount}`);
|
|
73
78
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
79
|
+
const withStats = options.withStats ?? false;
|
|
80
|
+
const effectiveness = options.effectiveness ?? amount;
|
|
81
|
+
if (withStats) {
|
|
82
|
+
repo.bumpRetrievalStats(id, {
|
|
83
|
+
retrievedDelta: 1,
|
|
84
|
+
effectiveDelta: 1,
|
|
85
|
+
reinforcementDelta: effectiveness,
|
|
86
|
+
importanceDelta: amount,
|
|
87
|
+
lastRetrievedAt: nowIso,
|
|
88
|
+
lastEffectiveAt: nowIso,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
repo.bumpRetrievalStats(id, {
|
|
93
|
+
importanceDelta: amount,
|
|
94
|
+
lastEffectiveAt: nowIso,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
78
97
|
const updated = repo.readEngram(id);
|
|
79
98
|
return {
|
|
80
99
|
id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ltp.js","sourceRoot":"","sources":["../../src/reinforcement/ltp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,EAAE,cAAc,EAA4B,MAAM,aAAa,CAAC;AAYvE;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAsB,EACtB,EAAU,EACV,aAAqB,EACrB,SAA8B,cAAc,EAC5C,SAAiB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IAEzC,IAAI,aAAa,GAAG,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,uCAAuC,aAAa,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,eAAe,GAAG,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;IACvD,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE;QAC1B,cAAc,EAAE,CAAC;QACjB,cAAc,EAAE,CAAC;QACjB,kBAAkB,EAAE,aAAa;QACjC,eAAe;QACf,eAAe,EAAE,MAAM;QACvB,eAAe,EAAE,MAAM;KACxB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACpC,OAAO;QACL,EAAE;QACF,eAAe;QACf,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;QAChD,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,MAAM;KACnD,CAAC;AACJ,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"ltp.js","sourceRoot":"","sources":["../../src/reinforcement/ltp.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,11 +12,20 @@
|
|
|
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
|
*/
|
|
19
27
|
import type { EngramRepository } from "../storage/repository.js";
|
|
28
|
+
import type { AuditLog } from "../observability/audit-log.js";
|
|
20
29
|
import { type ReinforcementConfig } from "./config.js";
|
|
21
30
|
export interface ReinforceRelatedResult {
|
|
22
31
|
/** 被强化的邻居 id 列表 */
|
|
@@ -26,6 +35,25 @@ export interface ReinforceRelatedResult {
|
|
|
26
35
|
/** 给每个邻居的 importanceDelta */
|
|
27
36
|
readonly importanceDeltaPerNeighbor: number;
|
|
28
37
|
}
|
|
38
|
+
/** reinforceRelated 的可选参数 */
|
|
39
|
+
export interface ReinforceRelatedOptions {
|
|
40
|
+
/**
|
|
41
|
+
* 触发此次联动的源 engram id(等于 reinforceRelated 的 engramId 参数)。
|
|
42
|
+
* 用于 audit metadata,让邻居能追溯"我为什么被强化"。
|
|
43
|
+
*/
|
|
44
|
+
readonly triggeredBy?: string;
|
|
45
|
+
/**
|
|
46
|
+
* 触发此次联动的工具/路径(如 "reinforce" / "close_learning_loop")。
|
|
47
|
+
* 用于 audit metadata,便于过滤不同来源的联动。
|
|
48
|
+
*/
|
|
49
|
+
readonly triggerTool?: string;
|
|
50
|
+
/**
|
|
51
|
+
* 若提供,对每个被强化的邻居写一条 reinforce audit(解决 P0-9 幽灵强化)。
|
|
52
|
+
*/
|
|
53
|
+
readonly auditLog?: AuditLog;
|
|
54
|
+
/** 宿主标识(透传到 audit entry) */
|
|
55
|
+
readonly host?: "claude-code-mcp" | "openclaw-plugin" | string;
|
|
56
|
+
}
|
|
29
57
|
/**
|
|
30
58
|
* 对邻居执行 Hebbian 强化
|
|
31
59
|
*
|
|
@@ -34,6 +62,7 @@ export interface ReinforceRelatedResult {
|
|
|
34
62
|
* @param baseImportanceDelta - 原始 engram 得到的 importanceDelta
|
|
35
63
|
* @param config - 配置(可选)
|
|
36
64
|
* @param nowIso - 当前时间
|
|
65
|
+
* @param options - P0-9 修复:可选 auditLog + triggeredBy,让联动可观察
|
|
37
66
|
*/
|
|
38
|
-
export declare function reinforceRelated(repo: EngramRepository, engramId: string, baseImportanceDelta: number, config?: ReinforcementConfig, nowIso?: string): ReinforceRelatedResult;
|
|
67
|
+
export declare function reinforceRelated(repo: EngramRepository, engramId: string, baseImportanceDelta: number, config?: ReinforcementConfig, nowIso?: string, options?: ReinforceRelatedOptions): ReinforceRelatedResult;
|
|
39
68
|
//# sourceMappingURL=related.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"related.d.ts","sourceRoot":"","sources":["../../src/reinforcement/related.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"related.d.ts","sourceRoot":"","sources":["../../src/reinforcement/related.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQvE,MAAM,WAAW,sBAAsB;IACrC,mBAAmB;IACnB,QAAQ,CAAC,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;IAClD,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,6BAA6B;IAC7B,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;CAC7C;AAED,6BAA6B;AAC7B,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,4BAA4B;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,MAAM,CAAC;CAChE;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,gBAAgB,EACtB,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,MAAM,EAC3B,MAAM,GAAE,mBAAoC,EAC5C,MAAM,GAAE,MAAiC,EACzC,OAAO,GAAE,uBAA4B,GACpC,sBAAsB,CAwFxB"}
|