@co-engram/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +167 -0
- package/dist/config/defaults.d.ts +45 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +70 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +84 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +230 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +145 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +14 -0
- package/dist/config/types.js.map +1 -0
- package/dist/contradiction/arbiter.d.ts +51 -0
- package/dist/contradiction/arbiter.d.ts.map +1 -0
- package/dist/contradiction/arbiter.js +112 -0
- package/dist/contradiction/arbiter.js.map +1 -0
- package/dist/contradiction/auto-degrade.d.ts +53 -0
- package/dist/contradiction/auto-degrade.d.ts.map +1 -0
- package/dist/contradiction/auto-degrade.js +79 -0
- package/dist/contradiction/auto-degrade.js.map +1 -0
- package/dist/contradiction/detector.d.ts +33 -0
- package/dist/contradiction/detector.d.ts.map +1 -0
- package/dist/contradiction/detector.js +76 -0
- package/dist/contradiction/detector.js.map +1 -0
- package/dist/contradiction/index.d.ts +11 -0
- package/dist/contradiction/index.d.ts.map +1 -0
- package/dist/contradiction/index.js +11 -0
- package/dist/contradiction/index.js.map +1 -0
- package/dist/contradiction/resolver.d.ts +45 -0
- package/dist/contradiction/resolver.d.ts.map +1 -0
- package/dist/contradiction/resolver.js +196 -0
- package/dist/contradiction/resolver.js.map +1 -0
- package/dist/contradiction/types.d.ts +73 -0
- package/dist/contradiction/types.d.ts.map +1 -0
- package/dist/contradiction/types.js +7 -0
- package/dist/contradiction/types.js.map +1 -0
- package/dist/dedup/dedupe.d.ts +49 -0
- package/dist/dedup/dedupe.d.ts.map +1 -0
- package/dist/dedup/dedupe.js +111 -0
- package/dist/dedup/dedupe.js.map +1 -0
- package/dist/dedup/hash.d.ts +27 -0
- package/dist/dedup/hash.d.ts.map +1 -0
- package/dist/dedup/hash.js +43 -0
- package/dist/dedup/hash.js.map +1 -0
- package/dist/dedup/index.d.ts +12 -0
- package/dist/dedup/index.d.ts.map +1 -0
- package/dist/dedup/index.js +12 -0
- package/dist/dedup/index.js.map +1 -0
- package/dist/dedup/llm-triage.d.ts +48 -0
- package/dist/dedup/llm-triage.d.ts.map +1 -0
- package/dist/dedup/llm-triage.js +100 -0
- package/dist/dedup/llm-triage.js.map +1 -0
- package/dist/dedup/merge.d.ts +41 -0
- package/dist/dedup/merge.d.ts.map +1 -0
- package/dist/dedup/merge.js +55 -0
- package/dist/dedup/merge.js.map +1 -0
- package/dist/dedup/similar.d.ts +45 -0
- package/dist/dedup/similar.d.ts.map +1 -0
- package/dist/dedup/similar.js +103 -0
- package/dist/dedup/similar.js.map +1 -0
- package/dist/dedup/types.d.ts +72 -0
- package/dist/dedup/types.d.ts.map +1 -0
- package/dist/dedup/types.js +18 -0
- package/dist/dedup/types.js.map +1 -0
- package/dist/disclosure/adaptive.d.ts +86 -0
- package/dist/disclosure/adaptive.d.ts.map +1 -0
- package/dist/disclosure/adaptive.js +196 -0
- package/dist/disclosure/adaptive.js.map +1 -0
- package/dist/disclosure/budget.d.ts +51 -0
- package/dist/disclosure/budget.d.ts.map +1 -0
- package/dist/disclosure/budget.js +91 -0
- package/dist/disclosure/budget.js.map +1 -0
- package/dist/disclosure/index.d.ts +11 -0
- package/dist/disclosure/index.d.ts.map +1 -0
- package/dist/disclosure/index.js +11 -0
- package/dist/disclosure/index.js.map +1 -0
- package/dist/disclosure/tier-loader.d.ts +58 -0
- package/dist/disclosure/tier-loader.d.ts.map +1 -0
- package/dist/disclosure/tier-loader.js +205 -0
- package/dist/disclosure/tier-loader.js.map +1 -0
- package/dist/dreaming/decay.d.ts +46 -0
- package/dist/dreaming/decay.d.ts.map +1 -0
- package/dist/dreaming/decay.js +69 -0
- package/dist/dreaming/decay.js.map +1 -0
- package/dist/dreaming/deep.d.ts +48 -0
- package/dist/dreaming/deep.d.ts.map +1 -0
- package/dist/dreaming/deep.js +41 -0
- package/dist/dreaming/deep.js.map +1 -0
- package/dist/dreaming/index.d.ts +12 -0
- package/dist/dreaming/index.d.ts.map +1 -0
- package/dist/dreaming/index.js +12 -0
- package/dist/dreaming/index.js.map +1 -0
- package/dist/dreaming/light.d.ts +54 -0
- package/dist/dreaming/light.d.ts.map +1 -0
- package/dist/dreaming/light.js +114 -0
- package/dist/dreaming/light.js.map +1 -0
- package/dist/dreaming/rem.d.ts +128 -0
- package/dist/dreaming/rem.d.ts.map +1 -0
- package/dist/dreaming/rem.js +228 -0
- package/dist/dreaming/rem.js.map +1 -0
- package/dist/dreaming/scheduler.d.ts +75 -0
- package/dist/dreaming/scheduler.d.ts.map +1 -0
- package/dist/dreaming/scheduler.js +138 -0
- package/dist/dreaming/scheduler.js.map +1 -0
- package/dist/dreaming/trash.d.ts +174 -0
- package/dist/dreaming/trash.d.ts.map +1 -0
- package/dist/dreaming/trash.js +466 -0
- package/dist/dreaming/trash.js.map +1 -0
- package/dist/evolution/category.d.ts +127 -0
- package/dist/evolution/category.d.ts.map +1 -0
- package/dist/evolution/category.js +271 -0
- package/dist/evolution/category.js.map +1 -0
- package/dist/evolution/index.d.ts +8 -0
- package/dist/evolution/index.d.ts.map +1 -0
- package/dist/evolution/index.js +8 -0
- package/dist/evolution/index.js.map +1 -0
- package/dist/evolution/triggered.d.ts +107 -0
- package/dist/evolution/triggered.d.ts.map +1 -0
- package/dist/evolution/triggered.js +278 -0
- package/dist/evolution/triggered.js.map +1 -0
- package/dist/generative/cross-pollinate.d.ts +144 -0
- package/dist/generative/cross-pollinate.d.ts.map +1 -0
- package/dist/generative/cross-pollinate.js +390 -0
- package/dist/generative/cross-pollinate.js.map +1 -0
- package/dist/generative/gap-detector.d.ts +80 -0
- package/dist/generative/gap-detector.d.ts.map +1 -0
- package/dist/generative/gap-detector.js +250 -0
- package/dist/generative/gap-detector.js.map +1 -0
- package/dist/generative/hypothesis.d.ts +161 -0
- package/dist/generative/hypothesis.d.ts.map +1 -0
- package/dist/generative/hypothesis.js +356 -0
- package/dist/generative/hypothesis.js.map +1 -0
- package/dist/generative/index.d.ts +9 -0
- package/dist/generative/index.d.ts.map +1 -0
- package/dist/generative/index.js +9 -0
- package/dist/generative/index.js.map +1 -0
- package/dist/graph/clustering.d.ts +117 -0
- package/dist/graph/clustering.d.ts.map +1 -0
- package/dist/graph/clustering.js +196 -0
- package/dist/graph/clustering.js.map +1 -0
- package/dist/graph/index.d.ts +13 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +13 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/layout.d.ts +46 -0
- package/dist/graph/layout.d.ts.map +1 -0
- package/dist/graph/layout.js +269 -0
- package/dist/graph/layout.js.map +1 -0
- package/dist/graph/presets.d.ts +134 -0
- package/dist/graph/presets.d.ts.map +1 -0
- package/dist/graph/presets.js +190 -0
- package/dist/graph/presets.js.map +1 -0
- package/dist/graph/registry.d.ts +42 -0
- package/dist/graph/registry.d.ts.map +1 -0
- package/dist/graph/registry.js +158 -0
- package/dist/graph/registry.js.map +1 -0
- package/dist/graph/snapshot.d.ts +113 -0
- package/dist/graph/snapshot.d.ts.map +1 -0
- package/dist/graph/snapshot.js +194 -0
- package/dist/graph/snapshot.js.map +1 -0
- package/dist/graph/traverse.d.ts +84 -0
- package/dist/graph/traverse.d.ts.map +1 -0
- package/dist/graph/traverse.js +190 -0
- package/dist/graph/traverse.js.map +1 -0
- package/dist/graph/view-config.d.ts +99 -0
- package/dist/graph/view-config.d.ts.map +1 -0
- package/dist/graph/view-config.js +208 -0
- package/dist/graph/view-config.js.map +1 -0
- package/dist/host/detect-git-author.d.ts +26 -0
- package/dist/host/detect-git-author.d.ts.map +1 -0
- package/dist/host/detect-git-author.js +53 -0
- package/dist/host/detect-git-author.js.map +1 -0
- package/dist/host/index.d.ts +7 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +7 -0
- package/dist/host/index.js.map +1 -0
- package/dist/i18n/en.d.ts +8 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +211 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/field-names.d.ts +95 -0
- package/dist/i18n/field-names.d.ts.map +1 -0
- package/dist/i18n/field-names.js +329 -0
- package/dist/i18n/field-names.js.map +1 -0
- package/dist/i18n/index.d.ts +92 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +135 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/types.d.ts +92 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +7 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/i18n/zh.d.ts +197 -0
- package/dist/i18n/zh.d.ts.map +1 -0
- package/dist/i18n/zh.js +216 -0
- package/dist/i18n/zh.js.map +1 -0
- package/dist/importance/index.d.ts +7 -0
- package/dist/importance/index.d.ts.map +1 -0
- package/dist/importance/index.js +7 -0
- package/dist/importance/index.js.map +1 -0
- package/dist/importance/vector.d.ts +113 -0
- package/dist/importance/vector.d.ts.map +1 -0
- package/dist/importance/vector.js +202 -0
- package/dist/importance/vector.js.map +1 -0
- package/dist/index/digest-builder.d.ts +59 -0
- package/dist/index/digest-builder.d.ts.map +1 -0
- package/dist/index/digest-builder.js +195 -0
- package/dist/index/digest-builder.js.map +1 -0
- package/dist/index/graph-builder.d.ts +32 -0
- package/dist/index/graph-builder.d.ts.map +1 -0
- package/dist/index/graph-builder.js +104 -0
- package/dist/index/graph-builder.js.map +1 -0
- package/dist/index/incremental.d.ts +31 -0
- package/dist/index/incremental.d.ts.map +1 -0
- package/dist/index/incremental.js +47 -0
- package/dist/index/incremental.js.map +1 -0
- package/dist/index/index.d.ts +11 -0
- package/dist/index/index.d.ts.map +1 -0
- package/dist/index/index.js +11 -0
- package/dist/index/index.js.map +1 -0
- package/dist/index/orchestrator.d.ts +60 -0
- package/dist/index/orchestrator.d.ts.map +1 -0
- package/dist/index/orchestrator.js +99 -0
- package/dist/index/orchestrator.js.map +1 -0
- package/dist/index/types.d.ts +116 -0
- package/dist/index/types.d.ts.map +1 -0
- package/dist/index/types.js +10 -0
- package/dist/index/types.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/learning/index.d.ts +7 -0
- package/dist/learning/index.d.ts.map +1 -0
- package/dist/learning/index.js +7 -0
- package/dist/learning/index.js.map +1 -0
- package/dist/learning/loop.d.ts +79 -0
- package/dist/learning/loop.d.ts.map +1 -0
- package/dist/learning/loop.js +116 -0
- package/dist/learning/loop.js.map +1 -0
- package/dist/lifecycle/freshness.d.ts +35 -0
- package/dist/lifecycle/freshness.d.ts.map +1 -0
- package/dist/lifecycle/freshness.js +60 -0
- package/dist/lifecycle/freshness.js.map +1 -0
- package/dist/lifecycle/index.d.ts +7 -0
- package/dist/lifecycle/index.d.ts.map +1 -0
- package/dist/lifecycle/index.js +7 -0
- package/dist/lifecycle/index.js.map +1 -0
- package/dist/lineage/index.d.ts +10 -0
- package/dist/lineage/index.d.ts.map +1 -0
- package/dist/lineage/index.js +10 -0
- package/dist/lineage/index.js.map +1 -0
- package/dist/lineage/trace.d.ts +142 -0
- package/dist/lineage/trace.d.ts.map +1 -0
- package/dist/lineage/trace.js +316 -0
- package/dist/lineage/trace.js.map +1 -0
- package/dist/maintenance/engine.d.ts +78 -0
- package/dist/maintenance/engine.d.ts.map +1 -0
- package/dist/maintenance/engine.js +291 -0
- package/dist/maintenance/engine.js.map +1 -0
- package/dist/maintenance/index.d.ts +8 -0
- package/dist/maintenance/index.d.ts.map +1 -0
- package/dist/maintenance/index.js +8 -0
- package/dist/maintenance/index.js.map +1 -0
- package/dist/maintenance/types.d.ts +111 -0
- package/dist/maintenance/types.d.ts.map +1 -0
- package/dist/maintenance/types.js +24 -0
- package/dist/maintenance/types.js.map +1 -0
- package/dist/observability/audit-log.d.ts +77 -0
- package/dist/observability/audit-log.d.ts.map +1 -0
- package/dist/observability/audit-log.js +101 -0
- package/dist/observability/audit-log.js.map +1 -0
- package/dist/observability/effectiveness-tracker.d.ts +162 -0
- package/dist/observability/effectiveness-tracker.d.ts.map +1 -0
- package/dist/observability/effectiveness-tracker.js +251 -0
- package/dist/observability/effectiveness-tracker.js.map +1 -0
- package/dist/observability/index.d.ts +16 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +16 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/necessity-evaluator.d.ts +116 -0
- package/dist/observability/necessity-evaluator.d.ts.map +1 -0
- package/dist/observability/necessity-evaluator.js +487 -0
- package/dist/observability/necessity-evaluator.js.map +1 -0
- package/dist/observability/proposal-engine.d.ts +224 -0
- package/dist/observability/proposal-engine.d.ts.map +1 -0
- package/dist/observability/proposal-engine.js +651 -0
- package/dist/observability/proposal-engine.js.map +1 -0
- package/dist/perspectives/index.d.ts +7 -0
- package/dist/perspectives/index.d.ts.map +1 -0
- package/dist/perspectives/index.js +7 -0
- package/dist/perspectives/index.js.map +1 -0
- package/dist/perspectives/multi-view.d.ts +81 -0
- package/dist/perspectives/multi-view.d.ts.map +1 -0
- package/dist/perspectives/multi-view.js +221 -0
- package/dist/perspectives/multi-view.js.map +1 -0
- package/dist/prompt-builder/builder.d.ts +47 -0
- package/dist/prompt-builder/builder.d.ts.map +1 -0
- package/dist/prompt-builder/builder.js +136 -0
- package/dist/prompt-builder/builder.js.map +1 -0
- package/dist/prompt-builder/index.d.ts +8 -0
- package/dist/prompt-builder/index.d.ts.map +1 -0
- package/dist/prompt-builder/index.js +8 -0
- package/dist/prompt-builder/index.js.map +1 -0
- package/dist/prompt-builder/types.d.ts +42 -0
- package/dist/prompt-builder/types.d.ts.map +1 -0
- package/dist/prompt-builder/types.js +10 -0
- package/dist/prompt-builder/types.js.map +1 -0
- package/dist/prompt-signals/cache.d.ts +36 -0
- package/dist/prompt-signals/cache.d.ts.map +1 -0
- package/dist/prompt-signals/cache.js +70 -0
- package/dist/prompt-signals/cache.js.map +1 -0
- package/dist/prompt-signals/index.d.ts +12 -0
- package/dist/prompt-signals/index.d.ts.map +1 -0
- package/dist/prompt-signals/index.js +11 -0
- package/dist/prompt-signals/index.js.map +1 -0
- package/dist/prompt-signals/stats.d.ts +45 -0
- package/dist/prompt-signals/stats.d.ts.map +1 -0
- package/dist/prompt-signals/stats.js +119 -0
- package/dist/prompt-signals/stats.js.map +1 -0
- package/dist/prompt-signals/types.d.ts +53 -0
- package/dist/prompt-signals/types.d.ts.map +1 -0
- package/dist/prompt-signals/types.js +34 -0
- package/dist/prompt-signals/types.js.map +1 -0
- package/dist/provenance/index.d.ts +7 -0
- package/dist/provenance/index.d.ts.map +1 -0
- package/dist/provenance/index.js +7 -0
- package/dist/provenance/index.js.map +1 -0
- package/dist/provenance/reliability.d.ts +133 -0
- package/dist/provenance/reliability.d.ts.map +1 -0
- package/dist/provenance/reliability.js +213 -0
- package/dist/provenance/reliability.js.map +1 -0
- package/dist/reinforcement/config.d.ts +34 -0
- package/dist/reinforcement/config.d.ts.map +1 -0
- package/dist/reinforcement/config.js +43 -0
- package/dist/reinforcement/config.js.map +1 -0
- package/dist/reinforcement/index.d.ts +12 -0
- package/dist/reinforcement/index.d.ts.map +1 -0
- package/dist/reinforcement/index.js +12 -0
- package/dist/reinforcement/index.js.map +1 -0
- package/dist/reinforcement/ltd.d.ts +59 -0
- package/dist/reinforcement/ltd.d.ts.map +1 -0
- package/dist/reinforcement/ltd.js +90 -0
- package/dist/reinforcement/ltd.js.map +1 -0
- package/dist/reinforcement/ltp.d.ts +63 -0
- package/dist/reinforcement/ltp.d.ts.map +1 -0
- package/dist/reinforcement/ltp.js +99 -0
- package/dist/reinforcement/ltp.js.map +1 -0
- package/dist/reinforcement/related.d.ts +39 -0
- package/dist/reinforcement/related.d.ts.map +1 -0
- package/dist/reinforcement/related.js +92 -0
- package/dist/reinforcement/related.js.map +1 -0
- package/dist/retrieval/filter.d.ts +18 -0
- package/dist/retrieval/filter.d.ts.map +1 -0
- package/dist/retrieval/filter.js +68 -0
- package/dist/retrieval/filter.js.map +1 -0
- package/dist/retrieval/fts.d.ts +44 -0
- package/dist/retrieval/fts.d.ts.map +1 -0
- package/dist/retrieval/fts.js +120 -0
- package/dist/retrieval/fts.js.map +1 -0
- package/dist/retrieval/index.d.ts +10 -0
- package/dist/retrieval/index.d.ts.map +1 -0
- package/dist/retrieval/index.js +10 -0
- package/dist/retrieval/index.js.map +1 -0
- package/dist/retrieval/orchestrator.d.ts +78 -0
- package/dist/retrieval/orchestrator.d.ts.map +1 -0
- package/dist/retrieval/orchestrator.js +156 -0
- package/dist/retrieval/orchestrator.js.map +1 -0
- package/dist/retrieval/scoring.d.ts +105 -0
- package/dist/retrieval/scoring.d.ts.map +1 -0
- package/dist/retrieval/scoring.js +165 -0
- package/dist/retrieval/scoring.js.map +1 -0
- package/dist/signals/extract.d.ts +98 -0
- package/dist/signals/extract.d.ts.map +1 -0
- package/dist/signals/extract.js +388 -0
- package/dist/signals/extract.js.map +1 -0
- package/dist/signals/file-sink.d.ts +81 -0
- package/dist/signals/file-sink.d.ts.map +1 -0
- package/dist/signals/file-sink.js +227 -0
- package/dist/signals/file-sink.js.map +1 -0
- package/dist/signals/index.d.ts +12 -0
- package/dist/signals/index.d.ts.map +1 -0
- package/dist/signals/index.js +12 -0
- package/dist/signals/index.js.map +1 -0
- package/dist/signals/rpe.d.ts +60 -0
- package/dist/signals/rpe.d.ts.map +1 -0
- package/dist/signals/rpe.js +68 -0
- package/dist/signals/rpe.js.map +1 -0
- package/dist/signals/types.d.ts +80 -0
- package/dist/signals/types.d.ts.map +1 -0
- package/dist/signals/types.js +14 -0
- package/dist/signals/types.js.map +1 -0
- package/dist/storage/engram-index.d.ts +73 -0
- package/dist/storage/engram-index.d.ts.map +1 -0
- package/dist/storage/engram-index.js +215 -0
- package/dist/storage/engram-index.js.map +1 -0
- package/dist/storage/engram-store.d.ts +147 -0
- package/dist/storage/engram-store.d.ts.map +1 -0
- package/dist/storage/engram-store.js +221 -0
- package/dist/storage/engram-store.js.map +1 -0
- package/dist/storage/git-stage.d.ts +56 -0
- package/dist/storage/git-stage.d.ts.map +1 -0
- package/dist/storage/git-stage.js +147 -0
- package/dist/storage/git-stage.js.map +1 -0
- package/dist/storage/git.d.ts +57 -0
- package/dist/storage/git.d.ts.map +1 -0
- package/dist/storage/git.js +156 -0
- package/dist/storage/git.js.map +1 -0
- package/dist/storage/hash.d.ts +23 -0
- package/dist/storage/hash.d.ts.map +1 -0
- package/dist/storage/hash.js +31 -0
- package/dist/storage/hash.js.map +1 -0
- package/dist/storage/index.d.ts +14 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +14 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/path.d.ts +51 -0
- package/dist/storage/path.d.ts.map +1 -0
- package/dist/storage/path.js +72 -0
- package/dist/storage/path.js.map +1 -0
- package/dist/storage/repository.d.ts +342 -0
- package/dist/storage/repository.d.ts.map +1 -0
- package/dist/storage/repository.js +1221 -0
- package/dist/storage/repository.js.map +1 -0
- package/dist/storage/synapse-store.d.ts +113 -0
- package/dist/storage/synapse-store.d.ts.map +1 -0
- package/dist/storage/synapse-store.js +279 -0
- package/dist/storage/synapse-store.js.map +1 -0
- package/dist/tools/doctor-tools.d.ts +53 -0
- package/dist/tools/doctor-tools.d.ts.map +1 -0
- package/dist/tools/doctor-tools.js +97 -0
- package/dist/tools/doctor-tools.js.map +1 -0
- package/dist/tools/engram-tools.d.ts +166 -0
- package/dist/tools/engram-tools.d.ts.map +1 -0
- package/dist/tools/engram-tools.js +834 -0
- package/dist/tools/engram-tools.js.map +1 -0
- package/dist/tools/index.d.ts +16 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +16 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/llm-descriptions.d.ts +61 -0
- package/dist/tools/llm-descriptions.d.ts.map +1 -0
- package/dist/tools/llm-descriptions.js +556 -0
- package/dist/tools/llm-descriptions.js.map +1 -0
- package/dist/tools/proposal-tools.d.ts +40 -0
- package/dist/tools/proposal-tools.d.ts.map +1 -0
- package/dist/tools/proposal-tools.js +99 -0
- package/dist/tools/proposal-tools.js.map +1 -0
- package/dist/tools/registry.d.ts +30 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +43 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/schemas.d.ts +715 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +383 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/tools/skill-tools.d.ts +26 -0
- package/dist/tools/skill-tools.d.ts.map +1 -0
- package/dist/tools/skill-tools.js +84 -0
- package/dist/tools/skill-tools.js.map +1 -0
- package/dist/tools/synapse-tools.d.ts +28 -0
- package/dist/tools/synapse-tools.d.ts.map +1 -0
- package/dist/tools/synapse-tools.js +177 -0
- package/dist/tools/synapse-tools.js.map +1 -0
- package/dist/tools/tool.d.ts +84 -0
- package/dist/tools/tool.d.ts.map +1 -0
- package/dist/tools/tool.js +22 -0
- package/dist/tools/tool.js.map +1 -0
- package/dist/tools/wrapped.d.ts +28 -0
- package/dist/tools/wrapped.d.ts.map +1 -0
- package/dist/tools/wrapped.js +172 -0
- package/dist/tools/wrapped.js.map +1 -0
- package/dist/types/disclosure.d.ts +70 -0
- package/dist/types/disclosure.d.ts.map +1 -0
- package/dist/types/disclosure.js +9 -0
- package/dist/types/disclosure.js.map +1 -0
- package/dist/types/engram.d.ts +203 -0
- package/dist/types/engram.d.ts.map +1 -0
- package/dist/types/engram.js +7 -0
- package/dist/types/engram.js.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +15 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/intention.d.ts +91 -0
- package/dist/types/intention.d.ts.map +1 -0
- package/dist/types/intention.js +9 -0
- package/dist/types/intention.js.map +1 -0
- package/dist/types/repository-types.d.ts +113 -0
- package/dist/types/repository-types.d.ts.map +1 -0
- package/dist/types/repository-types.js +18 -0
- package/dist/types/repository-types.js.map +1 -0
- package/dist/types/scene.d.ts +52 -0
- package/dist/types/scene.d.ts.map +1 -0
- package/dist/types/scene.js +12 -0
- package/dist/types/scene.js.map +1 -0
- package/dist/types/skill.d.ts +107 -0
- package/dist/types/skill.d.ts.map +1 -0
- package/dist/types/skill.js +10 -0
- package/dist/types/skill.js.map +1 -0
- package/dist/types/slugify.d.ts +34 -0
- package/dist/types/slugify.d.ts.map +1 -0
- package/dist/types/slugify.js +55 -0
- package/dist/types/slugify.js.map +1 -0
- package/dist/types/synapse-id.d.ts +22 -0
- package/dist/types/synapse-id.d.ts.map +1 -0
- package/dist/types/synapse-id.js +34 -0
- package/dist/types/synapse-id.js.map +1 -0
- package/dist/types/synapse.d.ts +99 -0
- package/dist/types/synapse.d.ts.map +1 -0
- package/dist/types/synapse.js +9 -0
- package/dist/types/synapse.js.map +1 -0
- package/dist/verification/index.d.ts +11 -0
- package/dist/verification/index.d.ts.map +1 -0
- package/dist/verification/index.js +11 -0
- package/dist/verification/index.js.map +1 -0
- package/dist/verification/metacognition.d.ts +102 -0
- package/dist/verification/metacognition.d.ts.map +1 -0
- package/dist/verification/metacognition.js +284 -0
- package/dist/verification/metacognition.js.map +1 -0
- package/dist/verification/state-machine.d.ts +77 -0
- package/dist/verification/state-machine.d.ts.map +1 -0
- package/dist/verification/state-machine.js +126 -0
- package/dist/verification/state-machine.js.map +1 -0
- package/dist/verification/upgrade.d.ts +133 -0
- package/dist/verification/upgrade.d.ts.map +1 -0
- package/dist/verification/upgrade.js +364 -0
- package/dist/verification/upgrade.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,834 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engram 工具集
|
|
3
|
+
*
|
|
4
|
+
* 11 个工具(P0 六个 + P1 五个:三信号 + 生命周期):
|
|
5
|
+
* - engram_create / engram_get / engram_update / engram_delete
|
|
6
|
+
* - engram_search / engram_list
|
|
7
|
+
* - engram_reinforce / engram_report_failure(三信号)
|
|
8
|
+
* - engram_archive / engram_restore / engram_forget(生命周期)
|
|
9
|
+
*
|
|
10
|
+
* @module @co-engram/core/tools
|
|
11
|
+
*/
|
|
12
|
+
import { validateInput } from "./tool.js";
|
|
13
|
+
import { matchesFilter } from "../retrieval/filter.js";
|
|
14
|
+
import { computeFreshness } from "../lifecycle/freshness.js";
|
|
15
|
+
import { adaptiveDisclosure } from "../disclosure/adaptive.js";
|
|
16
|
+
import { createBudget } from "../disclosure/budget.js";
|
|
17
|
+
import { recordRetrievalSuccess, } from "../reinforcement/ltp.js";
|
|
18
|
+
import { recordRetrievalFailure } from "../reinforcement/ltd.js";
|
|
19
|
+
import { reinforceRelated } from "../reinforcement/related.js";
|
|
20
|
+
import { DEFAULT_CONFIG as DEFAULT_REINFORCEMENT_CONFIG } from "../reinforcement/config.js";
|
|
21
|
+
import { checkDuplicateSync } from "../dedup/dedupe.js";
|
|
22
|
+
import { mergeEngram } from "../dedup/merge.js";
|
|
23
|
+
import { recomputeImportance } from "../importance/vector.js";
|
|
24
|
+
import { manualResolveContradiction } from "../contradiction/index.js";
|
|
25
|
+
import { closeLearningLoop } from "../learning/loop.js";
|
|
26
|
+
import { upgradeVerification } from "../verification/index.js";
|
|
27
|
+
import { getEvolutionLineage } from "../lineage/index.js";
|
|
28
|
+
import { restoreFromTrash } from "../dreaming/trash.js";
|
|
29
|
+
import { collectDigestLines } from "../index/digest-builder.js";
|
|
30
|
+
import { EngramCreateInputSchema, EngramGetInputSchema, EngramUpdateInputSchema, EngramDeleteInputSchema, EngramSearchInputSchema, EngramListInputSchema, EngramReinforceInputSchema, EngramReportFailureInputSchema, EngramArchiveInputSchema, EngramRestoreInputSchema, EngramForgetInputSchema, EngramRecomputeImportanceInputSchema, ContradictionResolveInputSchema, CloseLearningLoopInputSchema, UpgradeVerificationInputSchema, GetEvolutionLineageInputSchema, } from "./schemas.js";
|
|
31
|
+
export const engramCreateTool = {
|
|
32
|
+
name: "engram_create",
|
|
33
|
+
description: '创建一个新的 Engram(记忆单元)。需要 title / content / kind / domainTags;createdBy 可选,缺省时回退到 ToolContext.defaultCreatedBy(MCP: CO_ENGRAM_DEFAULT_CREATED_BY 环境变量;OpenClaw: plugin config.defaultCreatedBy),再缺省回退到 "unknown"。默认开启智能去重(dedupe=true):DUPLICATE 时强化原 engram 不重复创建;UPDATE 时合并;NEW 时正常创建。',
|
|
34
|
+
inputSchema: EngramCreateInputSchema,
|
|
35
|
+
execute(input, ctx) {
|
|
36
|
+
const parsed = validateInput(EngramCreateInputSchema, input);
|
|
37
|
+
const createdBy = parsed.createdBy ?? ctx.defaultCreatedBy ?? "unknown";
|
|
38
|
+
if (parsed.dedupe !== false) {
|
|
39
|
+
const dedupResult = checkDuplicateSync({ repository: ctx.repository }, {
|
|
40
|
+
title: parsed.title,
|
|
41
|
+
content: parsed.content,
|
|
42
|
+
kind: parsed.kind,
|
|
43
|
+
kinds: parsed.kinds,
|
|
44
|
+
summary: parsed.summary,
|
|
45
|
+
domainTags: parsed.domainTags,
|
|
46
|
+
contextTags: parsed.contextTags,
|
|
47
|
+
encodingContext: parsed.encodingContext,
|
|
48
|
+
importance: parsed.importance,
|
|
49
|
+
confidence: parsed.confidence,
|
|
50
|
+
emotionalValence: parsed.emotionalValence,
|
|
51
|
+
sourceType: parsed.sourceType,
|
|
52
|
+
visibility: parsed.visibility,
|
|
53
|
+
decayHalfLifeDays: parsed.decayHalfLifeDays,
|
|
54
|
+
createdBy,
|
|
55
|
+
});
|
|
56
|
+
if (dedupResult.verdict === "DUPLICATE" && dedupResult.targetId) {
|
|
57
|
+
// 强化原 engram:再次见到视为有效检索(effectiveness=1)
|
|
58
|
+
recordRetrievalSuccess(ctx.repository, dedupResult.targetId, 1);
|
|
59
|
+
return {
|
|
60
|
+
id: dedupResult.targetId,
|
|
61
|
+
verdict: "DUPLICATE",
|
|
62
|
+
targetId: dedupResult.targetId,
|
|
63
|
+
reason: dedupResult.reason,
|
|
64
|
+
confidence: dedupResult.confidence,
|
|
65
|
+
candidatesConsidered: dedupResult.candidatesConsidered,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (dedupResult.verdict === "UPDATE" && dedupResult.targetId) {
|
|
69
|
+
mergeEngram(ctx.repository, {
|
|
70
|
+
id: dedupResult.targetId,
|
|
71
|
+
newTitle: parsed.title,
|
|
72
|
+
newContent: parsed.content,
|
|
73
|
+
newSummary: parsed.summary,
|
|
74
|
+
newImportance: parsed.importance,
|
|
75
|
+
mergedBy: createdBy,
|
|
76
|
+
reason: dedupResult.reason ?? "dedup auto-merge",
|
|
77
|
+
});
|
|
78
|
+
invalidateSearchIndex(ctx);
|
|
79
|
+
return {
|
|
80
|
+
id: dedupResult.targetId,
|
|
81
|
+
verdict: "UPDATE",
|
|
82
|
+
targetId: dedupResult.targetId,
|
|
83
|
+
reason: dedupResult.reason,
|
|
84
|
+
confidence: dedupResult.confidence,
|
|
85
|
+
candidatesConsidered: dedupResult.candidatesConsidered,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const engram = ctx.repository.createEngram({
|
|
90
|
+
title: parsed.title,
|
|
91
|
+
content: parsed.content,
|
|
92
|
+
kind: parsed.kind,
|
|
93
|
+
kinds: parsed.kinds,
|
|
94
|
+
summary: parsed.summary,
|
|
95
|
+
domainTags: parsed.domainTags,
|
|
96
|
+
contextTags: parsed.contextTags,
|
|
97
|
+
encodingContext: parsed.encodingContext,
|
|
98
|
+
importance: parsed.importance,
|
|
99
|
+
confidence: parsed.confidence,
|
|
100
|
+
emotionalValence: parsed.emotionalValence,
|
|
101
|
+
sourceType: parsed.sourceType,
|
|
102
|
+
visibility: parsed.visibility,
|
|
103
|
+
decayHalfLifeDays: parsed.decayHalfLifeDays,
|
|
104
|
+
createdBy,
|
|
105
|
+
});
|
|
106
|
+
invalidateSearchIndex(ctx);
|
|
107
|
+
ctx.auditLog?.append({
|
|
108
|
+
actor: "user",
|
|
109
|
+
action: "create",
|
|
110
|
+
engramId: engram.id,
|
|
111
|
+
metadata: {
|
|
112
|
+
title: parsed.title,
|
|
113
|
+
kind: parsed.kind,
|
|
114
|
+
domainTags: parsed.domainTags,
|
|
115
|
+
createdBy,
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
return {
|
|
119
|
+
id: engram.id,
|
|
120
|
+
verdict: "NEW",
|
|
121
|
+
candidatesConsidered: 0,
|
|
122
|
+
};
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
// ============================================================
|
|
126
|
+
// engram_get
|
|
127
|
+
// ============================================================
|
|
128
|
+
export const engramGetTool = {
|
|
129
|
+
name: "engram_get",
|
|
130
|
+
description: "按披露层级(catalog / digest / content / meta / synapses / auto)读取 Engram。auto 模式按 contextBudget 自动选 tier。",
|
|
131
|
+
inputSchema: EngramGetInputSchema,
|
|
132
|
+
execute(input, ctx) {
|
|
133
|
+
const parsed = validateInput(EngramGetInputSchema, input);
|
|
134
|
+
if (parsed.tier === "auto") {
|
|
135
|
+
return readEngramViewAuto(ctx.repository, parsed.id, {
|
|
136
|
+
contextBudget: parsed.contextBudget,
|
|
137
|
+
score: parsed.score,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return readEngramView(ctx.repository, parsed.id, parsed.tier);
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* auto 模式:调用 adaptiveDisclosure 决定 tier
|
|
145
|
+
*
|
|
146
|
+
* 把单条 engram 当作唯一的候选传入。
|
|
147
|
+
*/
|
|
148
|
+
function readEngramViewAuto(repo, id, options) {
|
|
149
|
+
const totalTokens = options.contextBudget?.totalTokens ?? 4096;
|
|
150
|
+
const reserved = options.contextBudget?.reserved ?? 0;
|
|
151
|
+
const budget = createBudget(totalTokens, reserved);
|
|
152
|
+
const digest = repo.readDigest(id);
|
|
153
|
+
if (!digest)
|
|
154
|
+
throw new Error(`Engram not found: ${id}`);
|
|
155
|
+
const line = {
|
|
156
|
+
id,
|
|
157
|
+
title: digest.title,
|
|
158
|
+
kind: digest.kind,
|
|
159
|
+
kinds: [digest.kind],
|
|
160
|
+
summary: digest.summary,
|
|
161
|
+
domainTags: digest.domainTags,
|
|
162
|
+
contextTags: [],
|
|
163
|
+
importance: digest.importance,
|
|
164
|
+
emotionalValence: digest.emotionalValence,
|
|
165
|
+
freshness: digest.freshness,
|
|
166
|
+
status: "active",
|
|
167
|
+
sourceType: "firsthand",
|
|
168
|
+
createdBy: "",
|
|
169
|
+
createdAt: digest.updatedAt,
|
|
170
|
+
updatedAt: digest.updatedAt,
|
|
171
|
+
lastRetrievedAt: null,
|
|
172
|
+
lastEffectiveAt: null,
|
|
173
|
+
retrievalCount: 0,
|
|
174
|
+
effectiveRetrievals: 0,
|
|
175
|
+
failedUses: 0,
|
|
176
|
+
reinforcementScore: 0,
|
|
177
|
+
decayHalfLifeDays: 90,
|
|
178
|
+
contentSize: digest.contentSize,
|
|
179
|
+
contentHash: "",
|
|
180
|
+
outgoingSynapseCount: 0,
|
|
181
|
+
incomingSynapseCount: 0,
|
|
182
|
+
activeContradictionCount: 0,
|
|
183
|
+
};
|
|
184
|
+
const result = adaptiveDisclosure({
|
|
185
|
+
repository: repo,
|
|
186
|
+
candidates: [{ id, score: options.score ?? 1 }],
|
|
187
|
+
digestLines: { [id]: line },
|
|
188
|
+
budget,
|
|
189
|
+
});
|
|
190
|
+
const entry = result.loaded[0];
|
|
191
|
+
if (!entry) {
|
|
192
|
+
// 预算极小,连 catalog 都装不下 → 降级为直接读 catalog
|
|
193
|
+
return readEngramView(repo, id, "catalog");
|
|
194
|
+
}
|
|
195
|
+
return entry.view;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* 读取 EngramView(被工具 / adapter 共用)
|
|
199
|
+
*/
|
|
200
|
+
export function readEngramView(repo, id, tier) {
|
|
201
|
+
switch (tier) {
|
|
202
|
+
case "catalog": {
|
|
203
|
+
const entry = repo.readCatalogEntry(id);
|
|
204
|
+
if (!entry)
|
|
205
|
+
throw new Error(`Engram not found: ${id}`);
|
|
206
|
+
return { tier: "catalog", entry };
|
|
207
|
+
}
|
|
208
|
+
case "digest": {
|
|
209
|
+
const digest = repo.readDigest(id);
|
|
210
|
+
if (!digest)
|
|
211
|
+
throw new Error(`Engram not found: ${id}`);
|
|
212
|
+
return { tier: "digest", digest };
|
|
213
|
+
}
|
|
214
|
+
case "content": {
|
|
215
|
+
const engram = repo.readEngram(id);
|
|
216
|
+
return {
|
|
217
|
+
tier: "content",
|
|
218
|
+
entry: toCatalogEntry(engram),
|
|
219
|
+
content: engram.content,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
case "meta": {
|
|
223
|
+
const engram = repo.readEngram(id);
|
|
224
|
+
return {
|
|
225
|
+
tier: "meta",
|
|
226
|
+
entry: toCatalogEntry(engram),
|
|
227
|
+
meta: stripContentFromMeta(engram),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
case "synapses": {
|
|
231
|
+
const entry = repo.readCatalogEntry(id);
|
|
232
|
+
if (!entry)
|
|
233
|
+
throw new Error(`Engram not found: ${id}`);
|
|
234
|
+
const outgoingFile = repo.readSynapses(id);
|
|
235
|
+
const incoming = collectIncoming(repo, id);
|
|
236
|
+
const neighborDigests = collectNeighborDigests(repo, id, outgoingFile.outgoing, incoming);
|
|
237
|
+
const bundle = {
|
|
238
|
+
engramId: id,
|
|
239
|
+
outgoing: outgoingFile.outgoing,
|
|
240
|
+
incoming,
|
|
241
|
+
neighborDigests,
|
|
242
|
+
};
|
|
243
|
+
return { tier: "synapses", bundle };
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
function toCatalogEntry(engram) {
|
|
248
|
+
return {
|
|
249
|
+
id: engram.id,
|
|
250
|
+
title: engram.title,
|
|
251
|
+
kind: engram.kind,
|
|
252
|
+
domainTags: engram.domainTags,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
/** meta tier 不暴露 body(避免双重传输) */
|
|
256
|
+
function stripContentFromMeta(engram) {
|
|
257
|
+
const { content: _content, ...rest } = engram;
|
|
258
|
+
return rest;
|
|
259
|
+
}
|
|
260
|
+
/** 收集指向 id 的 incoming synapses(需要扫所有 engram) */
|
|
261
|
+
function collectIncoming(repo, id) {
|
|
262
|
+
const all = repo.collectAllSynapses();
|
|
263
|
+
return all
|
|
264
|
+
.filter(({ synapse }) => synapse.to === id)
|
|
265
|
+
.map(({ synapse }) => synapse);
|
|
266
|
+
}
|
|
267
|
+
function collectNeighborDigests(repo, _selfId, outgoing, incoming) {
|
|
268
|
+
const neighborIds = new Set();
|
|
269
|
+
for (const s of outgoing)
|
|
270
|
+
neighborIds.add(s.to);
|
|
271
|
+
for (const s of incoming)
|
|
272
|
+
neighborIds.add(s.from);
|
|
273
|
+
const digests = [];
|
|
274
|
+
for (const nid of neighborIds) {
|
|
275
|
+
const d = repo.readDigest(nid);
|
|
276
|
+
if (d)
|
|
277
|
+
digests.push(d);
|
|
278
|
+
}
|
|
279
|
+
return digests;
|
|
280
|
+
}
|
|
281
|
+
// ============================================================
|
|
282
|
+
// engram_update
|
|
283
|
+
// ============================================================
|
|
284
|
+
/**
|
|
285
|
+
* 跟踪 engram_update 的字段对比(用于 audit log)
|
|
286
|
+
*
|
|
287
|
+
* 不在表中的字段(version / updatedAt / retrievalCount 等系统字段)不算"用户修改"。
|
|
288
|
+
*/
|
|
289
|
+
const TRACKED_ENGRAM_FIELDS = [
|
|
290
|
+
"title",
|
|
291
|
+
"summary",
|
|
292
|
+
"content",
|
|
293
|
+
"kinds",
|
|
294
|
+
"domainTags",
|
|
295
|
+
"contextTags",
|
|
296
|
+
"encodingContext",
|
|
297
|
+
"importance",
|
|
298
|
+
"confidence",
|
|
299
|
+
"emotionalValence",
|
|
300
|
+
"decayHalfLifeDays",
|
|
301
|
+
"visibility",
|
|
302
|
+
];
|
|
303
|
+
/** 字段值在 audit 中的最大长度(超出截断,防 audit.jsonl 爆炸) */
|
|
304
|
+
const FIELD_TRUNCATE = {
|
|
305
|
+
title: 80,
|
|
306
|
+
summary: 120,
|
|
307
|
+
content: 240,
|
|
308
|
+
encodingContext: 120,
|
|
309
|
+
};
|
|
310
|
+
function truncateFieldValue(field, value) {
|
|
311
|
+
if (typeof value === "string") {
|
|
312
|
+
const max = FIELD_TRUNCATE[field] ?? 0;
|
|
313
|
+
if (max > 0 && value.length > max) {
|
|
314
|
+
const head = Math.ceil(max * 0.6);
|
|
315
|
+
const tail = Math.floor(max * 0.3);
|
|
316
|
+
const omitted = value.length - head - tail;
|
|
317
|
+
return (value.slice(0, head) +
|
|
318
|
+
`…[${omitted} chars omitted]…` +
|
|
319
|
+
value.slice(-tail));
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return value;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* 对比 before / after,返回每个变化字段的 { from, to }
|
|
326
|
+
*
|
|
327
|
+
* 用 JSON.stringify 等价比较覆盖数组 / 对象 / 基本类型,简单稳健。
|
|
328
|
+
*/
|
|
329
|
+
function diffEngramFields(before, after) {
|
|
330
|
+
const changes = {};
|
|
331
|
+
for (const f of TRACKED_ENGRAM_FIELDS) {
|
|
332
|
+
const b = before[f];
|
|
333
|
+
const a = after[f];
|
|
334
|
+
if (JSON.stringify(b) === JSON.stringify(a))
|
|
335
|
+
continue;
|
|
336
|
+
changes[f] = {
|
|
337
|
+
from: truncateFieldValue(f, b),
|
|
338
|
+
to: truncateFieldValue(f, a),
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
return changes;
|
|
342
|
+
}
|
|
343
|
+
export const engramUpdateTool = {
|
|
344
|
+
name: "engram_update",
|
|
345
|
+
description: "更新 Engram 的字段(content / title / importance / 等)。",
|
|
346
|
+
inputSchema: EngramUpdateInputSchema,
|
|
347
|
+
execute(input, ctx) {
|
|
348
|
+
const parsed = validateInput(EngramUpdateInputSchema, input);
|
|
349
|
+
// 取 before 用于 audit diff;若 engram 不存在 updateEngram 会抛,这里 readEngram 也抛
|
|
350
|
+
const before = ctx.repository.readEngram(parsed.id);
|
|
351
|
+
const engram = ctx.repository.updateEngram(parsed.id, {
|
|
352
|
+
title: parsed.title,
|
|
353
|
+
content: parsed.content,
|
|
354
|
+
summary: parsed.summary,
|
|
355
|
+
kinds: parsed.kinds,
|
|
356
|
+
domainTags: parsed.domainTags,
|
|
357
|
+
contextTags: parsed.contextTags,
|
|
358
|
+
encodingContext: parsed.encodingContext,
|
|
359
|
+
importance: parsed.importance,
|
|
360
|
+
confidence: parsed.confidence,
|
|
361
|
+
emotionalValence: parsed.emotionalValence,
|
|
362
|
+
decayHalfLifeDays: parsed.decayHalfLifeDays,
|
|
363
|
+
visibility: parsed.visibility,
|
|
364
|
+
updatedBy: parsed.updatedBy,
|
|
365
|
+
});
|
|
366
|
+
invalidateSearchIndex(ctx);
|
|
367
|
+
ctx.auditLog?.append({
|
|
368
|
+
actor: "user",
|
|
369
|
+
action: "update",
|
|
370
|
+
engramId: engram.id,
|
|
371
|
+
metadata: {
|
|
372
|
+
updatedBy: parsed.updatedBy,
|
|
373
|
+
changes: diffEngramFields(before, engram),
|
|
374
|
+
},
|
|
375
|
+
});
|
|
376
|
+
return { id: engram.id, version: engram.version };
|
|
377
|
+
},
|
|
378
|
+
};
|
|
379
|
+
// ============================================================
|
|
380
|
+
// engram_delete
|
|
381
|
+
// ============================================================
|
|
382
|
+
export const engramDeleteTool = {
|
|
383
|
+
name: "engram_delete",
|
|
384
|
+
description: "删除 Engram(content + meta + synapses 三文件一起删)。",
|
|
385
|
+
inputSchema: EngramDeleteInputSchema,
|
|
386
|
+
execute(input, ctx) {
|
|
387
|
+
const parsed = validateInput(EngramDeleteInputSchema, input);
|
|
388
|
+
if (!ctx.repository.exists(parsed.id)) {
|
|
389
|
+
throw new Error(`Engram not found: ${parsed.id}`);
|
|
390
|
+
}
|
|
391
|
+
ctx.repository.deleteEngram(parsed.id);
|
|
392
|
+
invalidateSearchIndex(ctx);
|
|
393
|
+
ctx.auditLog?.append({
|
|
394
|
+
actor: "user",
|
|
395
|
+
action: "purge",
|
|
396
|
+
engramId: parsed.id,
|
|
397
|
+
});
|
|
398
|
+
return { id: parsed.id, deleted: true };
|
|
399
|
+
},
|
|
400
|
+
};
|
|
401
|
+
// ============================================================
|
|
402
|
+
// engram_search
|
|
403
|
+
// ============================================================
|
|
404
|
+
export const engramSearchTool = {
|
|
405
|
+
name: "engram_search",
|
|
406
|
+
description: "FTS 全文检索(中文 bigram + 英文 word),可选过滤器。",
|
|
407
|
+
inputSchema: EngramSearchInputSchema,
|
|
408
|
+
execute(input, ctx) {
|
|
409
|
+
const parsed = validateInput(EngramSearchInputSchema, input);
|
|
410
|
+
if (!ctx.searchOrchestrator) {
|
|
411
|
+
throw new Error("SearchOrchestrator not available in ToolContext");
|
|
412
|
+
}
|
|
413
|
+
const results = ctx.searchOrchestrator.search(parsed.query, parsed.filter, parsed.limit);
|
|
414
|
+
// P4 自动维护:命中后立即 bump retrieval stats(不触发 version++)
|
|
415
|
+
// 用于 RPE 公式的 expected 基准
|
|
416
|
+
const timestamp = new Date().toISOString();
|
|
417
|
+
for (const r of results) {
|
|
418
|
+
try {
|
|
419
|
+
ctx.repository.bumpRetrievalStats(r.id, {
|
|
420
|
+
retrievedDelta: 1,
|
|
421
|
+
lastRetrievalScore: r.score,
|
|
422
|
+
lastRetrievedAt: timestamp,
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
// bump 失败不阻塞 search 结果(可能 engram 已被并发删除)
|
|
427
|
+
}
|
|
428
|
+
// M1: 为每个 hit 开观察窗口(如果配置了 effectivenessTracker)
|
|
429
|
+
const engram = safeReadEngram(ctx, r.id);
|
|
430
|
+
if (engram) {
|
|
431
|
+
ctx.effectivenessTracker?.openWindow({
|
|
432
|
+
engramId: r.id,
|
|
433
|
+
query: parsed.query,
|
|
434
|
+
score: r.score,
|
|
435
|
+
kinds: engram.kinds ?? [engram.kind],
|
|
436
|
+
sessionId: ctx.sessionId,
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
return {
|
|
441
|
+
// title/kind/domainTags 让 LLM 不必再 engram_get 才知道每条结果是啥。
|
|
442
|
+
// orchestrator 已经从 DigestLine 带出了 entry 字段,直接展开。
|
|
443
|
+
results: results.map((r) => ({
|
|
444
|
+
id: r.id,
|
|
445
|
+
score: r.score,
|
|
446
|
+
title: r.entry.title,
|
|
447
|
+
kind: r.entry.kind,
|
|
448
|
+
domainTags: r.entry.domainTags,
|
|
449
|
+
})),
|
|
450
|
+
total: results.length,
|
|
451
|
+
};
|
|
452
|
+
},
|
|
453
|
+
};
|
|
454
|
+
// ============================================================
|
|
455
|
+
// engram_list
|
|
456
|
+
// ============================================================
|
|
457
|
+
export const engramListTool = {
|
|
458
|
+
name: "engram_list",
|
|
459
|
+
description: "按过滤器列出 Engram(无查询,按元数据过滤,直接读最新数据)。",
|
|
460
|
+
inputSchema: EngramListInputSchema,
|
|
461
|
+
execute(input, ctx) {
|
|
462
|
+
const parsed = validateInput(EngramListInputSchema, input);
|
|
463
|
+
const entries = ctx.repository.listEngrams();
|
|
464
|
+
const lines = [];
|
|
465
|
+
for (const entry of entries) {
|
|
466
|
+
const engram = ctx.repository.readEngram(entry.id);
|
|
467
|
+
lines.push(engramToDigestLine(engram));
|
|
468
|
+
}
|
|
469
|
+
const filtered = lines.filter((line) => matchesFilter(line, parsed.filter));
|
|
470
|
+
const limited = filtered.slice(0, parsed.limit);
|
|
471
|
+
return {
|
|
472
|
+
results: limited.map((line) => ({
|
|
473
|
+
id: line.id,
|
|
474
|
+
title: line.title,
|
|
475
|
+
kind: line.kind,
|
|
476
|
+
domainTags: line.domainTags,
|
|
477
|
+
})),
|
|
478
|
+
total: filtered.length,
|
|
479
|
+
};
|
|
480
|
+
},
|
|
481
|
+
};
|
|
482
|
+
/** Engram → DigestLine(用于过滤) */
|
|
483
|
+
function engramToDigestLine(engram) {
|
|
484
|
+
return {
|
|
485
|
+
id: engram.id,
|
|
486
|
+
title: engram.title,
|
|
487
|
+
kind: engram.kind,
|
|
488
|
+
kinds: engram.kinds,
|
|
489
|
+
summary: engram.summary,
|
|
490
|
+
domainTags: engram.domainTags,
|
|
491
|
+
contextTags: engram.contextTags,
|
|
492
|
+
importance: engram.importance,
|
|
493
|
+
emotionalValence: engram.emotionalValence,
|
|
494
|
+
freshness: engram.freshness,
|
|
495
|
+
status: engram.status,
|
|
496
|
+
sourceType: engram.sourceType,
|
|
497
|
+
createdBy: engram.createdBy,
|
|
498
|
+
createdAt: engram.createdAt,
|
|
499
|
+
updatedAt: engram.updatedAt,
|
|
500
|
+
lastRetrievedAt: engram.lastRetrievedAt ?? null,
|
|
501
|
+
lastEffectiveAt: engram.lastEffectiveAt ?? null,
|
|
502
|
+
retrievalCount: engram.retrievalCount,
|
|
503
|
+
effectiveRetrievals: engram.effectiveRetrievals,
|
|
504
|
+
failedUses: engram.failedUses,
|
|
505
|
+
reinforcementScore: engram.reinforcementScore,
|
|
506
|
+
decayHalfLifeDays: engram.decayHalfLifeDays,
|
|
507
|
+
contentSize: engram.contentSize,
|
|
508
|
+
contentHash: engram.contentHash,
|
|
509
|
+
outgoingSynapseCount: engram.outgoingSynapseCount,
|
|
510
|
+
incomingSynapseCount: engram.incomingSynapseCount,
|
|
511
|
+
activeContradictionCount: engram.activeContradictionCount,
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* 写入操作后失效搜索索引,并立即从 repository 重建
|
|
516
|
+
*
|
|
517
|
+
* 之前的实现是 no-op,依赖 host adapter 手动 rebuild,但 host 无从得知何时该 rebuild,
|
|
518
|
+
* 导致用户新建 engram 后立即 engram_search 搜不到(索引是启动时的快照)。
|
|
519
|
+
*
|
|
520
|
+
* 当前实现:用 collectDigestLines(repo) 拉取真实 DigestLine[](含真实 importance /
|
|
521
|
+
* decayHalfLifeDays / retrievalCount / reinforcementScore 等),让三因子打分能正常工作。
|
|
522
|
+
*
|
|
523
|
+
* 代价是每次写入都做一次 O(N) rebuild;N 通常 < 10k,可接受。
|
|
524
|
+
* 后续 P1 改为增量更新(只插入/更新被改动的 engram)。
|
|
525
|
+
*/
|
|
526
|
+
function invalidateSearchIndex(ctx) {
|
|
527
|
+
if (!ctx.searchOrchestrator)
|
|
528
|
+
return;
|
|
529
|
+
ctx.searchOrchestrator.build(collectDigestLines(ctx.repository));
|
|
530
|
+
}
|
|
531
|
+
/** 读取 engram,失败时返回 null(不抛) */
|
|
532
|
+
function safeReadEngram(ctx, id) {
|
|
533
|
+
try {
|
|
534
|
+
return ctx.repository.readEngram(id);
|
|
535
|
+
}
|
|
536
|
+
catch {
|
|
537
|
+
return null;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
// ============================================================
|
|
541
|
+
// engram_reinforce(P1:三信号追踪 - 有效检索 LTP)
|
|
542
|
+
// ============================================================
|
|
543
|
+
export const engramReinforceTool = {
|
|
544
|
+
name: "engram_reinforce",
|
|
545
|
+
description: "上报一次有效检索(LTP 强化 + Hebbian 关联强化)。更新 effectiveRetrievals / reinforcementScore / importance(每次 += effectiveness × 0.02,clamp [0,1]);邻居 engram 得到 50% 增益(contradicts 除外)。",
|
|
546
|
+
inputSchema: EngramReinforceInputSchema,
|
|
547
|
+
execute(input, ctx) {
|
|
548
|
+
const parsed = validateInput(EngramReinforceInputSchema, input);
|
|
549
|
+
if (!ctx.repository.exists(parsed.id)) {
|
|
550
|
+
throw new Error(`Engram not found: ${parsed.id}`);
|
|
551
|
+
}
|
|
552
|
+
const nowIso = new Date().toISOString();
|
|
553
|
+
const direct = recordRetrievalSuccess(ctx.repository, parsed.id, parsed.effectiveness, DEFAULT_REINFORCEMENT_CONFIG, nowIso);
|
|
554
|
+
const related = reinforceRelated(ctx.repository, parsed.id, direct.importanceDelta, DEFAULT_REINFORCEMENT_CONFIG, nowIso);
|
|
555
|
+
// M1: 关闭观察窗口并标记为 effective(有效性信号)
|
|
556
|
+
ctx.effectivenessTracker?.closeAsEffective(parsed.id);
|
|
557
|
+
ctx.auditLog?.append({
|
|
558
|
+
actor: "user",
|
|
559
|
+
action: "reinforce",
|
|
560
|
+
engramId: parsed.id,
|
|
561
|
+
metadata: { effectiveness: parsed.effectiveness, note: parsed.note },
|
|
562
|
+
});
|
|
563
|
+
return {
|
|
564
|
+
id: parsed.id,
|
|
565
|
+
retrievalCount: direct.retrievalCount,
|
|
566
|
+
effectiveRetrievals: direct.effectiveRetrievals,
|
|
567
|
+
reinforcementScore: direct.reinforcementScore,
|
|
568
|
+
importance: direct.importance,
|
|
569
|
+
importanceDelta: direct.importanceDelta,
|
|
570
|
+
lastEffectiveAt: direct.lastEffectiveAt,
|
|
571
|
+
reinforcedNeighborIds: related.reinforcedNeighborIds,
|
|
572
|
+
};
|
|
573
|
+
},
|
|
574
|
+
};
|
|
575
|
+
// ============================================================
|
|
576
|
+
// engram_report_failure(P1:三信号追踪 - 失败使用 LTD)
|
|
577
|
+
// ============================================================
|
|
578
|
+
export const engramReportFailureTool = {
|
|
579
|
+
name: "engram_report_failure",
|
|
580
|
+
description: "上报一次失败使用(LTD 削弱)。更新 failedUses / retrievalCount / importance(单次 -0.03,超阈值后 ×1.5 升级)。failedUses≥3 建议 archive,≥5 建议 forget。",
|
|
581
|
+
inputSchema: EngramReportFailureInputSchema,
|
|
582
|
+
execute(input, ctx) {
|
|
583
|
+
const parsed = validateInput(EngramReportFailureInputSchema, input);
|
|
584
|
+
if (!ctx.repository.exists(parsed.id)) {
|
|
585
|
+
throw new Error(`Engram not found: ${parsed.id}`);
|
|
586
|
+
}
|
|
587
|
+
const result = recordRetrievalFailure(ctx.repository, parsed.id, DEFAULT_REINFORCEMENT_CONFIG);
|
|
588
|
+
// M1: 关闭观察窗口(标记为 failure,不再触发 inconclusive)
|
|
589
|
+
ctx.effectivenessTracker?.closeAsFailure(parsed.id);
|
|
590
|
+
ctx.auditLog?.append({
|
|
591
|
+
actor: "user",
|
|
592
|
+
action: "report_failure",
|
|
593
|
+
engramId: parsed.id,
|
|
594
|
+
metadata: { reason: parsed.reason, context: parsed.context },
|
|
595
|
+
});
|
|
596
|
+
return {
|
|
597
|
+
id: parsed.id,
|
|
598
|
+
failedUses: result.failedUses,
|
|
599
|
+
retrievalCount: result.retrievalCount,
|
|
600
|
+
importance: result.importance,
|
|
601
|
+
importanceDelta: result.importanceDelta,
|
|
602
|
+
shouldArchive: result.shouldArchive,
|
|
603
|
+
shouldForget: result.shouldForget,
|
|
604
|
+
};
|
|
605
|
+
},
|
|
606
|
+
};
|
|
607
|
+
// ============================================================
|
|
608
|
+
// engram_archive / restore / forget(P1:生命周期管理)
|
|
609
|
+
// ============================================================
|
|
610
|
+
export const engramArchiveTool = {
|
|
611
|
+
name: "engram_archive",
|
|
612
|
+
description: "归档 engram(移出默认检索,但保留数据可恢复)。检索默认排除 archived,可用 filter 包含。",
|
|
613
|
+
inputSchema: EngramArchiveInputSchema,
|
|
614
|
+
execute(input, ctx) {
|
|
615
|
+
const parsed = validateInput(EngramArchiveInputSchema, input);
|
|
616
|
+
if (!ctx.repository.exists(parsed.id)) {
|
|
617
|
+
throw new Error(`Engram not found: ${parsed.id}`);
|
|
618
|
+
}
|
|
619
|
+
ctx.repository.updateLifecycle(parsed.id, "archived", undefined);
|
|
620
|
+
const updated = ctx.repository.readEngram(parsed.id);
|
|
621
|
+
ctx.auditLog?.append({
|
|
622
|
+
actor: "user",
|
|
623
|
+
action: "update_lifecycle",
|
|
624
|
+
engramId: parsed.id,
|
|
625
|
+
metadata: { to: "archived", reason: parsed.reason },
|
|
626
|
+
});
|
|
627
|
+
return {
|
|
628
|
+
id: parsed.id,
|
|
629
|
+
status: "archived",
|
|
630
|
+
freshness: computeFreshness(updated.lastEffectiveAt, updated.decayHalfLifeDays),
|
|
631
|
+
};
|
|
632
|
+
},
|
|
633
|
+
};
|
|
634
|
+
export const engramRestoreTool = {
|
|
635
|
+
name: "engram_restore",
|
|
636
|
+
description: "从 archived/forgotten 恢复为 active,重新进入默认检索。若 engram 已被 sweep 到 .trash/,会先从回收站移回再恢复。",
|
|
637
|
+
inputSchema: EngramRestoreInputSchema,
|
|
638
|
+
execute(input, ctx) {
|
|
639
|
+
const parsed = validateInput(EngramRestoreInputSchema, input);
|
|
640
|
+
// 双路径查找:先查 active 区,再查 trash
|
|
641
|
+
let restoredFromTrash = false;
|
|
642
|
+
if (!ctx.repository.exists(parsed.id)) {
|
|
643
|
+
const trashResult = restoreFromTrash(ctx.repository, parsed.id, {
|
|
644
|
+
auditLog: ctx.auditLog,
|
|
645
|
+
});
|
|
646
|
+
if (!trashResult.ok) {
|
|
647
|
+
throw new Error(`Engram not found: ${parsed.id} (${trashResult.reason})`);
|
|
648
|
+
}
|
|
649
|
+
restoredFromTrash = true;
|
|
650
|
+
}
|
|
651
|
+
ctx.repository.updateLifecycle(parsed.id, "active", undefined);
|
|
652
|
+
const updated = ctx.repository.readEngram(parsed.id);
|
|
653
|
+
ctx.auditLog?.append({
|
|
654
|
+
actor: "user",
|
|
655
|
+
action: "restore",
|
|
656
|
+
engramId: parsed.id,
|
|
657
|
+
metadata: { reason: parsed.reason },
|
|
658
|
+
});
|
|
659
|
+
return {
|
|
660
|
+
id: parsed.id,
|
|
661
|
+
status: "active",
|
|
662
|
+
freshness: computeFreshness(updated.lastEffectiveAt, updated.decayHalfLifeDays),
|
|
663
|
+
...(restoredFromTrash ? { restoredFromTrash: true } : {}),
|
|
664
|
+
};
|
|
665
|
+
},
|
|
666
|
+
};
|
|
667
|
+
export const engramForgetTool = {
|
|
668
|
+
name: "engram_forget",
|
|
669
|
+
description: "主动遗忘 engram(RIF 检索诱导遗忘)。文件保留(Git 可追溯)但移出所有默认检索。需要 reason。",
|
|
670
|
+
inputSchema: EngramForgetInputSchema,
|
|
671
|
+
execute(input, ctx) {
|
|
672
|
+
const parsed = validateInput(EngramForgetInputSchema, input);
|
|
673
|
+
if (!ctx.repository.exists(parsed.id)) {
|
|
674
|
+
throw new Error(`Engram not found: ${parsed.id}`);
|
|
675
|
+
}
|
|
676
|
+
ctx.repository.updateLifecycle(parsed.id, "forgotten", "forgotten");
|
|
677
|
+
ctx.auditLog?.append({
|
|
678
|
+
actor: "user",
|
|
679
|
+
action: "forget",
|
|
680
|
+
engramId: parsed.id,
|
|
681
|
+
metadata: { reason: parsed.reason },
|
|
682
|
+
});
|
|
683
|
+
return { id: parsed.id, status: "forgotten", freshness: "forgotten" };
|
|
684
|
+
},
|
|
685
|
+
};
|
|
686
|
+
// ============================================================
|
|
687
|
+
// engram_recompute_importance(P2:多维重要性)
|
|
688
|
+
// ============================================================
|
|
689
|
+
export const engramRecomputeImportanceTool = {
|
|
690
|
+
name: "engram_recompute_importance",
|
|
691
|
+
description: "重新计算 engram 的多维重要性(personal/team/project/network/temporal)。network 和 temporal 由系统派生(incomingSynapseCount + 艾宾浩斯衰退),其余可通过 overrides 手动设置。结果 composite 写回 engram.importance。",
|
|
692
|
+
inputSchema: EngramRecomputeImportanceInputSchema,
|
|
693
|
+
execute(input, ctx) {
|
|
694
|
+
const parsed = validateInput(EngramRecomputeImportanceInputSchema, input);
|
|
695
|
+
const result = recomputeImportance(ctx.repository, parsed.id, {
|
|
696
|
+
overrides: parsed.overrides,
|
|
697
|
+
persist: parsed.persist,
|
|
698
|
+
updatedBy: parsed.updatedBy,
|
|
699
|
+
});
|
|
700
|
+
return {
|
|
701
|
+
id: result.id,
|
|
702
|
+
previous: result.previous,
|
|
703
|
+
next: result.next,
|
|
704
|
+
persisted: result.persisted,
|
|
705
|
+
};
|
|
706
|
+
},
|
|
707
|
+
};
|
|
708
|
+
// ============================================================
|
|
709
|
+
// contradiction_resolve(P2:spec §3.9 人工裁决)
|
|
710
|
+
// ============================================================
|
|
711
|
+
export const contradictionResolveTool = {
|
|
712
|
+
name: "contradiction_resolve",
|
|
713
|
+
description: "人工裁决一个 contradicts synapse(spec §3.9 阶段 2 人工介入)。必须给 verdict + rationale + resolvedBy。系统会自动把 synapse.resolutionState 标记为 resolved 并记录到 evidence 数组。",
|
|
714
|
+
inputSchema: ContradictionResolveInputSchema,
|
|
715
|
+
execute(input, ctx) {
|
|
716
|
+
const parsed = validateInput(ContradictionResolveInputSchema, input);
|
|
717
|
+
const result = manualResolveContradiction(ctx.repository, {
|
|
718
|
+
fromId: parsed.fromId,
|
|
719
|
+
synapseId: parsed.synapseId,
|
|
720
|
+
verdict: parsed.verdict,
|
|
721
|
+
rationale: parsed.rationale,
|
|
722
|
+
resolvedBy: parsed.resolvedBy,
|
|
723
|
+
});
|
|
724
|
+
return {
|
|
725
|
+
fromId: parsed.fromId,
|
|
726
|
+
synapseId: parsed.synapseId,
|
|
727
|
+
status: result.finalStatus,
|
|
728
|
+
resolved: true,
|
|
729
|
+
};
|
|
730
|
+
},
|
|
731
|
+
};
|
|
732
|
+
// ============================================================
|
|
733
|
+
// close_learning_loop(P2:闭合学习回路,spec §5.3.5)
|
|
734
|
+
// ============================================================
|
|
735
|
+
export const closeLearningLoopTool = {
|
|
736
|
+
name: "close_learning_loop",
|
|
737
|
+
description: "闭合学习回路(多巴胺闭环):把使用结果反馈到系统。success/partial → LTP 强化 + Hebbian 邻居强化;failure → LTD 削弱 + 触发降级阈值检查。同步触发 Provenance 奖惩回路(如已配置)。",
|
|
738
|
+
inputSchema: CloseLearningLoopInputSchema,
|
|
739
|
+
execute(input, ctx) {
|
|
740
|
+
const parsed = validateInput(CloseLearningLoopInputSchema, input);
|
|
741
|
+
const result = closeLearningLoop(ctx.repository, {
|
|
742
|
+
engramId: parsed.engramId,
|
|
743
|
+
outcome: parsed.outcome,
|
|
744
|
+
effectiveness: parsed.effectiveness,
|
|
745
|
+
reason: parsed.reason,
|
|
746
|
+
reportedBy: parsed.reportedBy,
|
|
747
|
+
});
|
|
748
|
+
return {
|
|
749
|
+
engramId: result.engramId,
|
|
750
|
+
outcome: result.outcome,
|
|
751
|
+
importance: result.importance,
|
|
752
|
+
importanceDelta: result.importanceDelta,
|
|
753
|
+
hebbianTriggered: result.hebbianReinforcement.triggered,
|
|
754
|
+
provenanceTriggered: result.provenanceUpdate.triggered,
|
|
755
|
+
shouldArchive: result.shouldArchive,
|
|
756
|
+
shouldForget: result.shouldForget,
|
|
757
|
+
};
|
|
758
|
+
},
|
|
759
|
+
};
|
|
760
|
+
// ============================================================
|
|
761
|
+
// upgrade_verification(P3 4.5.3:验证状态升级)
|
|
762
|
+
// ============================================================
|
|
763
|
+
export const upgradeVerificationTool = {
|
|
764
|
+
name: "upgrade_verification",
|
|
765
|
+
description: "升级 engram 的验证状态(unverified → plausible → probable → verified → refuted)。必须给出证据说明 + 验证人。系统会校验状态机(不允许跳级)+ 三维证据条件(evidenceCount + 跨情境 domainTags + 时间稳定天数)。force=true 可跳过条件检查但保留状态机校验(人工裁决场景)。",
|
|
766
|
+
inputSchema: UpgradeVerificationInputSchema,
|
|
767
|
+
execute(input, ctx) {
|
|
768
|
+
const parsed = validateInput(UpgradeVerificationInputSchema, input);
|
|
769
|
+
const result = upgradeVerification(ctx.repository, parsed.engramId, parsed.newStatus, {
|
|
770
|
+
description: parsed.evidenceDescription,
|
|
771
|
+
verifiedBy: parsed.verifiedBy,
|
|
772
|
+
confidence: parsed.confidence,
|
|
773
|
+
domainTags: parsed.evidenceDomainTags,
|
|
774
|
+
}, {
|
|
775
|
+
force: parsed.force,
|
|
776
|
+
});
|
|
777
|
+
return {
|
|
778
|
+
engramId: result.engramId,
|
|
779
|
+
previousStatus: result.previousStatus,
|
|
780
|
+
newStatus: result.newStatus,
|
|
781
|
+
eligible: result.eligible,
|
|
782
|
+
applied: result.applied,
|
|
783
|
+
evidenceAppended: result.evidenceAppended,
|
|
784
|
+
synapseIds: result.synapseIds,
|
|
785
|
+
reason: result.reason,
|
|
786
|
+
checks: result.checks,
|
|
787
|
+
};
|
|
788
|
+
},
|
|
789
|
+
};
|
|
790
|
+
// ============================================================
|
|
791
|
+
// get_evolution_lineage(P3 4.6.3:进化血统追溯)
|
|
792
|
+
// ============================================================
|
|
793
|
+
export const getEvolutionLineageTool = {
|
|
794
|
+
name: "get_evolution_lineage",
|
|
795
|
+
description: "追溯 engram 的进化血统(spec §12.7 场景 6)。沿 derives_from / consolidates / supersedes synapse 双向追溯:ancestors = 来源(observation 等),descendants = 演化结果(pattern/procedure 等)。返回 DAG 节点和边,可用于 Graph View 可视化。spec §4.6 验收:从 Skill 可反向追溯到原 observation 的完整链路。",
|
|
796
|
+
inputSchema: GetEvolutionLineageInputSchema,
|
|
797
|
+
execute(input, ctx) {
|
|
798
|
+
const parsed = validateInput(GetEvolutionLineageInputSchema, input);
|
|
799
|
+
const lineage = getEvolutionLineage(ctx.repository, parsed.engramId, {
|
|
800
|
+
direction: parsed.direction,
|
|
801
|
+
maxDepth: parsed.maxDepth,
|
|
802
|
+
kinds: parsed.kinds,
|
|
803
|
+
});
|
|
804
|
+
return {
|
|
805
|
+
rootId: lineage.rootId,
|
|
806
|
+
nodes: lineage.nodes,
|
|
807
|
+
edges: lineage.edges,
|
|
808
|
+
maxDepth: lineage.maxDepth,
|
|
809
|
+
totalNodes: lineage.totalNodes,
|
|
810
|
+
origins: lineage.origins,
|
|
811
|
+
terminals: lineage.terminals,
|
|
812
|
+
hasCycle: lineage.hasCycle,
|
|
813
|
+
};
|
|
814
|
+
},
|
|
815
|
+
};
|
|
816
|
+
export const ALL_ENGRAM_TOOLS = [
|
|
817
|
+
engramCreateTool,
|
|
818
|
+
engramGetTool,
|
|
819
|
+
engramUpdateTool,
|
|
820
|
+
engramDeleteTool,
|
|
821
|
+
engramSearchTool,
|
|
822
|
+
engramListTool,
|
|
823
|
+
engramReinforceTool,
|
|
824
|
+
engramReportFailureTool,
|
|
825
|
+
engramArchiveTool,
|
|
826
|
+
engramRestoreTool,
|
|
827
|
+
engramForgetTool,
|
|
828
|
+
engramRecomputeImportanceTool,
|
|
829
|
+
contradictionResolveTool,
|
|
830
|
+
closeLearningLoopTool,
|
|
831
|
+
upgradeVerificationTool,
|
|
832
|
+
getEvolutionLineageTool,
|
|
833
|
+
];
|
|
834
|
+
//# sourceMappingURL=engram-tools.js.map
|