@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,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engram Index — 派生缓存 {stableId → path/title/mtime/...}
|
|
3
|
+
*
|
|
4
|
+
* 设计见 docs/superpowers/specs/2026-06-22-per-edge-synapse-refactor-design.md。
|
|
5
|
+
*
|
|
6
|
+
* 文件位置:`.co-engram/engram-index.json`(gitignore)
|
|
7
|
+
* 用途:
|
|
8
|
+
* - doctor 增量扫描(mtime 比对)
|
|
9
|
+
* - repository 快速查 stableId → path
|
|
10
|
+
* - graph 派生
|
|
11
|
+
* - viewer 渲染
|
|
12
|
+
*
|
|
13
|
+
* @module @co-engram/core/storage
|
|
14
|
+
*/
|
|
15
|
+
import { readdirSync, readFileSync, statSync, writeFileSync, mkdirSync, existsSync, } from "node:fs";
|
|
16
|
+
import { dirname, join } from "node:path";
|
|
17
|
+
import { isStableEngramId } from "../types/repository-types.js";
|
|
18
|
+
import { slugify, inferDomainTagsFromPath } from "../types/slugify.js";
|
|
19
|
+
import { isEngramFile, parseEngramFile, } from "./engram-store.js";
|
|
20
|
+
/** .co-engram/ 顶层缓存目录名 */
|
|
21
|
+
export const CO_ENGRAM_CACHE_DIR = ".co-engram";
|
|
22
|
+
/** engram-index.json 文件名 */
|
|
23
|
+
export const ENGRAM_INDEX_FILENAME = "engram-index.json";
|
|
24
|
+
/** 应被 index 扫描跳过的目录 */
|
|
25
|
+
const SKIP_DIRECTORIES = new Set([
|
|
26
|
+
CO_ENGRAM_CACHE_DIR,
|
|
27
|
+
"node_modules",
|
|
28
|
+
".git",
|
|
29
|
+
"synapses", // synapse 数据,不是 engram
|
|
30
|
+
"engrams", // 旧版三文件数据布局(content/meta/synapses),不扫
|
|
31
|
+
]);
|
|
32
|
+
/**
|
|
33
|
+
* 应被 index 扫描跳过的 markdown 文件名(大小写不敏感)。
|
|
34
|
+
* 这些是仓库级文档,不是 engram —— 例如 README 是 quickstart 教用户创建的文件。
|
|
35
|
+
* doctor 不会把它们报为 orphan_markdown。
|
|
36
|
+
*/
|
|
37
|
+
const SKIP_MARKDOWN_FILENAMES = new Set([
|
|
38
|
+
"readme.md",
|
|
39
|
+
"license.md",
|
|
40
|
+
"contributing.md",
|
|
41
|
+
"changelog.md",
|
|
42
|
+
"code_of_conduct.md",
|
|
43
|
+
"security.md",
|
|
44
|
+
]);
|
|
45
|
+
/** engram-index.json 完整路径 */
|
|
46
|
+
export function engramIndexPath(dataRoot) {
|
|
47
|
+
return join(dataRoot, CO_ENGRAM_CACHE_DIR, ENGRAM_INDEX_FILENAME);
|
|
48
|
+
}
|
|
49
|
+
/** 创建空 index */
|
|
50
|
+
export function createEmptyEngramIndex() {
|
|
51
|
+
return {
|
|
52
|
+
version: 1,
|
|
53
|
+
entries: new Map(),
|
|
54
|
+
lastRebuiltAt: new Date().toISOString(),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 从磁盘读取 index;不存在或损坏返回空 index。
|
|
59
|
+
*/
|
|
60
|
+
export function readEngramIndex(dataRoot) {
|
|
61
|
+
const path = engramIndexPath(dataRoot);
|
|
62
|
+
if (!existsSync(path))
|
|
63
|
+
return createEmptyEngramIndex();
|
|
64
|
+
try {
|
|
65
|
+
const raw = readFileSync(path, "utf8");
|
|
66
|
+
const parsed = JSON.parse(raw);
|
|
67
|
+
const entries = new Map();
|
|
68
|
+
if (parsed.engrams && typeof parsed.engrams === "object") {
|
|
69
|
+
for (const [key, value] of Object.entries(parsed.engrams)) {
|
|
70
|
+
if (isStableEngramId(key) && value) {
|
|
71
|
+
entries.set(key, value);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
version: 1,
|
|
77
|
+
entries,
|
|
78
|
+
lastRebuiltAt: parsed.lastRebuiltAt ?? new Date().toISOString(),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return createEmptyEngramIndex();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 落盘 index(gitignore,但结构稳定以便人类 debug)。
|
|
87
|
+
*/
|
|
88
|
+
export function writeEngramIndex(dataRoot, index) {
|
|
89
|
+
const path = engramIndexPath(dataRoot);
|
|
90
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
91
|
+
const engramsObj = {};
|
|
92
|
+
for (const [key, value] of index.entries) {
|
|
93
|
+
engramsObj[key] = value;
|
|
94
|
+
}
|
|
95
|
+
const data = {
|
|
96
|
+
version: 1,
|
|
97
|
+
engrams: engramsObj,
|
|
98
|
+
lastRebuiltAt: new Date().toISOString(),
|
|
99
|
+
};
|
|
100
|
+
writeFileSync(path, JSON.stringify(data, null, 2), "utf8");
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 从单条 engram 文件构建 index entry。
|
|
104
|
+
*
|
|
105
|
+
* - slug:frontmatter 显式则锁定,否则从 title slugify
|
|
106
|
+
* - domainTags:frontmatter 显式则锁定,否则从路径推断
|
|
107
|
+
* - mtime / contentHash 必须由调用者传入
|
|
108
|
+
*/
|
|
109
|
+
export function buildIndexEntryFromFrontmatter(params) {
|
|
110
|
+
const { relativePath, frontmatter, mtime, contentHash } = params;
|
|
111
|
+
const hasExplicitSlug = typeof frontmatter.slug === "string" && frontmatter.slug.length > 0;
|
|
112
|
+
const slug = hasExplicitSlug ? frontmatter.slug : slugify(frontmatter.title);
|
|
113
|
+
const hasExplicitDomainTags = Array.isArray(frontmatter.domainTags) && frontmatter.domainTags.length > 0;
|
|
114
|
+
const domainTags = hasExplicitDomainTags
|
|
115
|
+
? [...frontmatter.domainTags]
|
|
116
|
+
: inferDomainTagsFromPath(relativePath);
|
|
117
|
+
return {
|
|
118
|
+
id: frontmatter.id,
|
|
119
|
+
path: relativePath,
|
|
120
|
+
title: frontmatter.title,
|
|
121
|
+
slug,
|
|
122
|
+
slugLocked: hasExplicitSlug,
|
|
123
|
+
domainTags,
|
|
124
|
+
domainTagsLocked: hasExplicitDomainTags,
|
|
125
|
+
tags: Array.isArray(frontmatter.tags) ? [...frontmatter.tags] : [],
|
|
126
|
+
kind: frontmatter.kind,
|
|
127
|
+
verificationStatus: frontmatter.verificationStatus,
|
|
128
|
+
createdAt: frontmatter.createdAt,
|
|
129
|
+
updatedAt: frontmatter.updatedAt,
|
|
130
|
+
mtime,
|
|
131
|
+
contentHash,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* 扫描 dataRoot 下所有 .md,构建 engram-index。
|
|
136
|
+
*
|
|
137
|
+
* 规则:
|
|
138
|
+
* - 跳过 SKIP_DIRECTORIES 中的目录(.co-engram, node_modules, .git, synapses)
|
|
139
|
+
* - 无 frontmatter 的 .md 跳过(由 doctor 报告为 orphan_markdown)
|
|
140
|
+
* - frontmatter 缺 id 的 .md 跳过(由 doctor 报告为 orphan_markdown)
|
|
141
|
+
*/
|
|
142
|
+
export function rebuildEngramIndex(dataRoot, onOrphan) {
|
|
143
|
+
const index = createEmptyEngramIndex();
|
|
144
|
+
function walk(currentDir, relativeDir) {
|
|
145
|
+
let entries;
|
|
146
|
+
try {
|
|
147
|
+
entries = readdirSync(currentDir, { withFileTypes: true });
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
for (const entry of entries) {
|
|
153
|
+
if (SKIP_DIRECTORIES.has(entry.name))
|
|
154
|
+
continue;
|
|
155
|
+
const absolutePath = join(currentDir, entry.name);
|
|
156
|
+
const relativePath = relativeDir.length === 0 ? entry.name : `${relativeDir}/${entry.name}`;
|
|
157
|
+
if (entry.isDirectory()) {
|
|
158
|
+
walk(absolutePath, relativePath);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (!entry.isFile())
|
|
162
|
+
continue;
|
|
163
|
+
if (!entry.name.endsWith(".md"))
|
|
164
|
+
continue;
|
|
165
|
+
if (SKIP_MARKDOWN_FILENAMES.has(entry.name.toLowerCase()))
|
|
166
|
+
continue;
|
|
167
|
+
try {
|
|
168
|
+
const raw = readFileSync(absolutePath, "utf8");
|
|
169
|
+
if (!isEngramFile(raw)) {
|
|
170
|
+
onOrphan?.(relativePath);
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const parsed = parseEngramFile(raw);
|
|
174
|
+
const stat = statSync(absolutePath);
|
|
175
|
+
const entryRecord = buildIndexEntryFromFrontmatter({
|
|
176
|
+
relativePath,
|
|
177
|
+
frontmatter: parsed.frontmatter,
|
|
178
|
+
mtime: stat.mtimeMs,
|
|
179
|
+
contentHash: parsed.frontmatter.contentHash ?? "",
|
|
180
|
+
});
|
|
181
|
+
index.entries.set(entryRecord.id, entryRecord);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
onOrphan?.(relativePath);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
walk(dataRoot, "");
|
|
189
|
+
index.lastRebuiltAt = new Date().toISOString();
|
|
190
|
+
return index;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* 增量更新:仅更新单条 engram 的 index entry。
|
|
194
|
+
*/
|
|
195
|
+
export function upsertEngramIndexEntry(index, entry) {
|
|
196
|
+
index.entries.set(entry.id, entry);
|
|
197
|
+
return index;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* 从 index 中删除一条 engram。
|
|
201
|
+
*/
|
|
202
|
+
export function removeEngramIndexEntry(index, id) {
|
|
203
|
+
return index.entries.delete(id);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* 按 path 查 stableId(用于 doctor 检测文件移动)。
|
|
207
|
+
*/
|
|
208
|
+
export function findEngramIdByPath(index, relativePath) {
|
|
209
|
+
for (const entry of index.entries.values()) {
|
|
210
|
+
if (entry.path === relativePath)
|
|
211
|
+
return entry.id;
|
|
212
|
+
}
|
|
213
|
+
return undefined;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=engram-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engram-index.js","sourceRoot":"","sources":["../../src/storage/engram-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engram 单文件存储(frontmatter + content)
|
|
3
|
+
*
|
|
4
|
+
* 设计要点:
|
|
5
|
+
* - 单文件:meta 字段进 frontmatter,content 跟在后面(英文)或前面(中文)
|
|
6
|
+
* - ULID 作为 stable id(永不变),与路径解耦
|
|
7
|
+
* - 文件可放在任意多层目录,slug 是文件名(可被 frontmatter 锁定)
|
|
8
|
+
*
|
|
9
|
+
* ## 双语双位置格式
|
|
10
|
+
*
|
|
11
|
+
* ### 英文模式(legacy,默认):
|
|
12
|
+
* ```
|
|
13
|
+
* ---
|
|
14
|
+
* id: 01JXKA9F8S7TQN8C9V2F3M4P5
|
|
15
|
+
* title: ...
|
|
16
|
+
* kind: observation
|
|
17
|
+
* ...
|
|
18
|
+
* ---
|
|
19
|
+
*
|
|
20
|
+
* <content>
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* ### 中文模式(language='zh'):
|
|
24
|
+
* ```
|
|
25
|
+
* <content>
|
|
26
|
+
*
|
|
27
|
+
* <!-- co-engram-meta:zh -->
|
|
28
|
+
* ---
|
|
29
|
+
* 标识: 01JXKA9F8S7TQN8C9V2F3M4P5
|
|
30
|
+
* 标题: ...
|
|
31
|
+
* 类型: observation
|
|
32
|
+
* ...
|
|
33
|
+
* __语言: zh
|
|
34
|
+
* ---
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* 中文模式的字段名按 `ENGRAM_FIELD_MAP.zh` 映射;`__语言: zh` 是保留标记,
|
|
38
|
+
* 解析时剥离,不进入运行时 `Engram` 对象。
|
|
39
|
+
*
|
|
40
|
+
* 解析器(`parseEngramFile`)自动检测两种格式并归一化为运行时英文 keys,
|
|
41
|
+
* 因此旧文件无需迁移即可读取。
|
|
42
|
+
*
|
|
43
|
+
* @module @co-engram/core/storage
|
|
44
|
+
*/
|
|
45
|
+
import type { EngramKind, EmotionalValence, EngramSourceType, EngramVisibility, VerificationStatus } from "../types/engram.js";
|
|
46
|
+
import type { StableEngramId } from "../types/repository-types.js";
|
|
47
|
+
import type { Language } from "../i18n/types.js";
|
|
48
|
+
/** Frontmatter 字段 */
|
|
49
|
+
export interface EngramFrontmatter {
|
|
50
|
+
/** Stable engram id (ULID) */
|
|
51
|
+
readonly id: StableEngramId;
|
|
52
|
+
readonly title: string;
|
|
53
|
+
/** 显式 slug(锁定);不存在则从 title slugify */
|
|
54
|
+
readonly slug?: string;
|
|
55
|
+
/** 显式 domainTags(锁定);不存在则从路径推断 */
|
|
56
|
+
readonly domainTags?: readonly string[];
|
|
57
|
+
readonly kind: EngramKind;
|
|
58
|
+
readonly kinds?: readonly EngramKind[];
|
|
59
|
+
readonly tags?: readonly string[];
|
|
60
|
+
readonly summary?: string;
|
|
61
|
+
readonly contentHash?: string;
|
|
62
|
+
readonly contentSize?: number;
|
|
63
|
+
readonly createdBy: string;
|
|
64
|
+
readonly createdAt: string;
|
|
65
|
+
readonly updatedBy: string;
|
|
66
|
+
readonly updatedAt: string;
|
|
67
|
+
readonly version: number;
|
|
68
|
+
readonly importance?: number;
|
|
69
|
+
readonly confidence?: number;
|
|
70
|
+
readonly emotionalValence?: EmotionalValence;
|
|
71
|
+
readonly sourceType?: EngramSourceType;
|
|
72
|
+
readonly evidenceCount?: number;
|
|
73
|
+
readonly retrievalCount?: number;
|
|
74
|
+
readonly effectiveRetrievals?: number;
|
|
75
|
+
readonly failedUses?: number;
|
|
76
|
+
readonly reinforcementScore?: number;
|
|
77
|
+
readonly decayHalfLifeDays?: number | null;
|
|
78
|
+
readonly lastRetrievedAt?: string;
|
|
79
|
+
readonly lastEffectiveAt?: string;
|
|
80
|
+
readonly lastRetrievalScore?: number;
|
|
81
|
+
/** 显式锁定的 freshness(优先于派生);仅当 lifecycle 工具强制切换时设置 */
|
|
82
|
+
readonly forcedFreshness?: "fresh" | "aging" | "stale" | "forgotten";
|
|
83
|
+
readonly status?: "draft" | "active" | "archived" | "forgotten";
|
|
84
|
+
readonly visibility?: EngramVisibility;
|
|
85
|
+
readonly verificationStatus?: VerificationStatus;
|
|
86
|
+
readonly encodingContext?: string;
|
|
87
|
+
readonly perspective?: string;
|
|
88
|
+
readonly contextTags?: readonly string[];
|
|
89
|
+
/** 其他扩展字段 */
|
|
90
|
+
readonly [key: string]: unknown;
|
|
91
|
+
}
|
|
92
|
+
/** Engram 单文件结构 */
|
|
93
|
+
export interface EngramFile {
|
|
94
|
+
readonly frontmatter: EngramFrontmatter;
|
|
95
|
+
readonly content: string;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 序列化为 frontmatter + content 的 markdown。
|
|
99
|
+
*
|
|
100
|
+
* - `language='en'`(默认):顶部 frontmatter + 英文字段名(legacy 格式)
|
|
101
|
+
* - `language='zh'`:正文在前 + 底部 frontmatter + 中文字段名 + `__语言: zh` 标记
|
|
102
|
+
*
|
|
103
|
+
* 默认 `'en'` 保证未传 language 的现有调用零破坏。
|
|
104
|
+
*/
|
|
105
|
+
export declare function serializeEngramFile(file: EngramFile, language?: Language): string;
|
|
106
|
+
/**
|
|
107
|
+
* 解析单文件,自动检测格式(顶部/底部、中文/英文)。
|
|
108
|
+
*
|
|
109
|
+
* 检测顺序:
|
|
110
|
+
* 1. 开头是 `---\n` → 顶部 frontmatter(英文 legacy 或未来中文顶部)
|
|
111
|
+
* 2. 否则若含 `<!-- co-engram-meta:` 标记 → 底部 frontmatter(中文)
|
|
112
|
+
* 3. 否则抛错
|
|
113
|
+
*
|
|
114
|
+
* 解析后:
|
|
115
|
+
* - 反向归一化磁盘 keys 为运行时英文 keys(自动检测中文 keys)
|
|
116
|
+
* - 剥离语言标记字段(`__lang` / `__语言`)
|
|
117
|
+
* - 验证 id/title 存在
|
|
118
|
+
*
|
|
119
|
+
* 解析失败抛 Error(不静默回退,人类错误由 doctor 报告)。
|
|
120
|
+
*/
|
|
121
|
+
export declare function parseEngramFile(raw: string): EngramFile;
|
|
122
|
+
/** 读取 engram 文件 */
|
|
123
|
+
export declare function readEngramFile(filePath: string): EngramFile;
|
|
124
|
+
/** 写入 engram 文件(自动创建父目录);language 决定磁盘格式 */
|
|
125
|
+
export declare function writeEngramFile(filePath: string, file: EngramFile, language?: Language): void;
|
|
126
|
+
/** 删除 engram 文件 */
|
|
127
|
+
export declare function deleteEngramFile(filePath: string): void;
|
|
128
|
+
/** 原子重命名(用于 doctor 修复文件路径) */
|
|
129
|
+
export declare function renameEngramFile(oldPath: string, newPath: string): void;
|
|
130
|
+
/**
|
|
131
|
+
* 检查文件是否是 engram(顶部 `---` + 有效 frontmatter,或含底部 meta marker)。
|
|
132
|
+
*
|
|
133
|
+
* 用于 doctor 扫描时区分:
|
|
134
|
+
* - 单文件 frontmatter 的 engram
|
|
135
|
+
* - 普通 markdown(无 frontmatter,提示注册为 engram)
|
|
136
|
+
*/
|
|
137
|
+
export declare function isEngramFile(raw: string): boolean;
|
|
138
|
+
/**
|
|
139
|
+
* 检测已序列化文件的磁盘 language(供迁移逻辑判断是否需重写)。
|
|
140
|
+
*
|
|
141
|
+
* 返回:
|
|
142
|
+
* - `'zh'` — 底部 frontmatter(中文模式)
|
|
143
|
+
* - `'en'` — 顶部 frontmatter 且无中文标记(英文模式)
|
|
144
|
+
* - `undefined` — 不是有效 engram 文件
|
|
145
|
+
*/
|
|
146
|
+
export declare function detectEngramFileLanguage(raw: string): Language | undefined;
|
|
147
|
+
//# sourceMappingURL=engram-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engram-store.d.ts","sourceRoot":"","sources":["../../src/storage/engram-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engram 单文件存储(frontmatter + content)
|
|
3
|
+
*
|
|
4
|
+
* 设计要点:
|
|
5
|
+
* - 单文件:meta 字段进 frontmatter,content 跟在后面(英文)或前面(中文)
|
|
6
|
+
* - ULID 作为 stable id(永不变),与路径解耦
|
|
7
|
+
* - 文件可放在任意多层目录,slug 是文件名(可被 frontmatter 锁定)
|
|
8
|
+
*
|
|
9
|
+
* ## 双语双位置格式
|
|
10
|
+
*
|
|
11
|
+
* ### 英文模式(legacy,默认):
|
|
12
|
+
* ```
|
|
13
|
+
* ---
|
|
14
|
+
* id: 01JXKA9F8S7TQN8C9V2F3M4P5
|
|
15
|
+
* title: ...
|
|
16
|
+
* kind: observation
|
|
17
|
+
* ...
|
|
18
|
+
* ---
|
|
19
|
+
*
|
|
20
|
+
* <content>
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* ### 中文模式(language='zh'):
|
|
24
|
+
* ```
|
|
25
|
+
* <content>
|
|
26
|
+
*
|
|
27
|
+
* <!-- co-engram-meta:zh -->
|
|
28
|
+
* ---
|
|
29
|
+
* 标识: 01JXKA9F8S7TQN8C9V2F3M4P5
|
|
30
|
+
* 标题: ...
|
|
31
|
+
* 类型: observation
|
|
32
|
+
* ...
|
|
33
|
+
* __语言: zh
|
|
34
|
+
* ---
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* 中文模式的字段名按 `ENGRAM_FIELD_MAP.zh` 映射;`__语言: zh` 是保留标记,
|
|
38
|
+
* 解析时剥离,不进入运行时 `Engram` 对象。
|
|
39
|
+
*
|
|
40
|
+
* 解析器(`parseEngramFile`)自动检测两种格式并归一化为运行时英文 keys,
|
|
41
|
+
* 因此旧文件无需迁移即可读取。
|
|
42
|
+
*
|
|
43
|
+
* @module @co-engram/core/storage
|
|
44
|
+
*/
|
|
45
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync, unlinkSync, renameSync, } from "node:fs";
|
|
46
|
+
import { dirname } from "node:path";
|
|
47
|
+
import { parse, stringify } from "yaml";
|
|
48
|
+
import { DEFAULT_LANGUAGE } from "../i18n/index.js";
|
|
49
|
+
import { ENGRAM_FIELD_MAP, ENGRAM_FIELD_REVERSE_MAP, delocalizeKeys, detectChineseKeys, localizeKeys, } from "../i18n/field-names.js";
|
|
50
|
+
const FRONTMATTER_DELIMITER = "---";
|
|
51
|
+
/**
|
|
52
|
+
* 底部 frontmatter 的开场 HTML 注释标记
|
|
53
|
+
*
|
|
54
|
+
* 形式:`<!-- co-engram-meta:<lang> -->`(`:zh` / `:en`)
|
|
55
|
+
* 解析时容忍缺失 lang 后缀(向后兼容),允许任何后缀值。
|
|
56
|
+
* 注释行让 markdown 渲染器忽略,人类阅读时不被干扰。
|
|
57
|
+
*/
|
|
58
|
+
const BOTTOM_META_MARKER_RE = /<!--[ \t]*co-engram-meta:?[a-z]*[ \t]*-->\s*\n/;
|
|
59
|
+
/**
|
|
60
|
+
* 序列化为 frontmatter + content 的 markdown。
|
|
61
|
+
*
|
|
62
|
+
* - `language='en'`(默认):顶部 frontmatter + 英文字段名(legacy 格式)
|
|
63
|
+
* - `language='zh'`:正文在前 + 底部 frontmatter + 中文字段名 + `__语言: zh` 标记
|
|
64
|
+
*
|
|
65
|
+
* 默认 `'en'` 保证未传 language 的现有调用零破坏。
|
|
66
|
+
*/
|
|
67
|
+
export function serializeEngramFile(file, language = DEFAULT_LANGUAGE) {
|
|
68
|
+
const body = file.content.replace(/^\n+/, "").replace(/\n+$/, "");
|
|
69
|
+
if (language === "zh") {
|
|
70
|
+
const localized = localizeKeys(file.frontmatter, "zh", ENGRAM_FIELD_MAP, {
|
|
71
|
+
attachLangMarker: true,
|
|
72
|
+
});
|
|
73
|
+
const yamlStr = stringify(localized, { lineWidth: 0 });
|
|
74
|
+
const yamlTrimmed = yamlStr.endsWith("\n") ? yamlStr : yamlStr + "\n";
|
|
75
|
+
return `${body}\n\n<!-- co-engram-meta:zh -->\n${FRONTMATTER_DELIMITER}\n${yamlTrimmed}${FRONTMATTER_DELIMITER}\n`;
|
|
76
|
+
}
|
|
77
|
+
const yamlStr = stringify(file.frontmatter, { lineWidth: 0 });
|
|
78
|
+
const yamlTrimmed = yamlStr.endsWith("\n") ? yamlStr : yamlStr + "\n";
|
|
79
|
+
return `${FRONTMATTER_DELIMITER}\n${yamlTrimmed}${FRONTMATTER_DELIMITER}\n\n${body}\n`;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 解析单文件,自动检测格式(顶部/底部、中文/英文)。
|
|
83
|
+
*
|
|
84
|
+
* 检测顺序:
|
|
85
|
+
* 1. 开头是 `---\n` → 顶部 frontmatter(英文 legacy 或未来中文顶部)
|
|
86
|
+
* 2. 否则若含 `<!-- co-engram-meta:` 标记 → 底部 frontmatter(中文)
|
|
87
|
+
* 3. 否则抛错
|
|
88
|
+
*
|
|
89
|
+
* 解析后:
|
|
90
|
+
* - 反向归一化磁盘 keys 为运行时英文 keys(自动检测中文 keys)
|
|
91
|
+
* - 剥离语言标记字段(`__lang` / `__语言`)
|
|
92
|
+
* - 验证 id/title 存在
|
|
93
|
+
*
|
|
94
|
+
* 解析失败抛 Error(不静默回退,人类错误由 doctor 报告)。
|
|
95
|
+
*/
|
|
96
|
+
export function parseEngramFile(raw) {
|
|
97
|
+
// 检测格式:顶部 vs 底部
|
|
98
|
+
let yamlText;
|
|
99
|
+
let body;
|
|
100
|
+
if (raw.startsWith(FRONTMATTER_DELIMITER)) {
|
|
101
|
+
// 顶部 frontmatter(legacy en 或顶部的 zh)
|
|
102
|
+
const closeMarker = `\n${FRONTMATTER_DELIMITER}\n`;
|
|
103
|
+
const closeIndex = raw.indexOf(closeMarker, FRONTMATTER_DELIMITER.length);
|
|
104
|
+
if (closeIndex === -1) {
|
|
105
|
+
throw new Error("Invalid engram file: missing closing frontmatter delimiter");
|
|
106
|
+
}
|
|
107
|
+
const yamlStart = FRONTMATTER_DELIMITER.length + 1;
|
|
108
|
+
yamlText = raw.slice(yamlStart, closeIndex);
|
|
109
|
+
const bodyRaw = raw.slice(closeIndex + closeMarker.length);
|
|
110
|
+
body = bodyRaw.replace(/^\n+/, "").replace(/\n+$/, "");
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
// 底部 frontmatter:查找 `<!-- co-engram-meta -->` 标记
|
|
114
|
+
const markerMatch = raw.match(BOTTOM_META_MARKER_RE);
|
|
115
|
+
if (!markerMatch || markerMatch.index === undefined) {
|
|
116
|
+
throw new Error("Invalid engram file: missing frontmatter (expected leading `---` or `<!-- co-engram-meta -->` marker)");
|
|
117
|
+
}
|
|
118
|
+
const yamlRegionStart = markerMatch.index + markerMatch[0].length;
|
|
119
|
+
const rest = raw.slice(yamlRegionStart);
|
|
120
|
+
if (!rest.startsWith(FRONTMATTER_DELIMITER)) {
|
|
121
|
+
throw new Error("Invalid engram file: bottom meta marker not followed by `---`");
|
|
122
|
+
}
|
|
123
|
+
const closeMarker = `\n${FRONTMATTER_DELIMITER}\n`;
|
|
124
|
+
const closeIndex = rest.indexOf(closeMarker, FRONTMATTER_DELIMITER.length);
|
|
125
|
+
if (closeIndex === -1) {
|
|
126
|
+
throw new Error("Invalid engram file: missing closing bottom frontmatter delimiter");
|
|
127
|
+
}
|
|
128
|
+
const yamlStart = FRONTMATTER_DELIMITER.length;
|
|
129
|
+
yamlText = rest.slice(yamlStart, closeIndex);
|
|
130
|
+
const bodyRaw = raw.slice(0, markerMatch.index);
|
|
131
|
+
body = bodyRaw.replace(/^\n+/, "").replace(/\n+$/, "");
|
|
132
|
+
}
|
|
133
|
+
const parsed = parse(yamlText);
|
|
134
|
+
if (!parsed || typeof parsed !== "object") {
|
|
135
|
+
throw new Error("Invalid engram file: frontmatter is not an object");
|
|
136
|
+
}
|
|
137
|
+
const rawObj = parsed;
|
|
138
|
+
const { normalized } = delocalizeKeys(rawObj, ENGRAM_FIELD_REVERSE_MAP);
|
|
139
|
+
// 兜底:如果反向索引未识别出中文 keys(老版数据没有 __语言 标记),
|
|
140
|
+
// 检测 raw 顶层是否含中文 key 并尝试归一化。delocalizeKeys 已用反向索引覆盖,
|
|
141
|
+
// 这里只是确保未来添加新字段时不会丢失。
|
|
142
|
+
void detectChineseKeys; // 保留导入以便未来扩展(启发式检测目前由 delocalizeKeys 覆盖)
|
|
143
|
+
const frontmatter = normalized;
|
|
144
|
+
if (typeof frontmatter.id !== "string" || frontmatter.id.length === 0) {
|
|
145
|
+
throw new Error("Invalid engram file: frontmatter missing id");
|
|
146
|
+
}
|
|
147
|
+
if (typeof frontmatter.title !== "string") {
|
|
148
|
+
throw new Error("Invalid engram file: frontmatter missing title");
|
|
149
|
+
}
|
|
150
|
+
return { frontmatter, content: body };
|
|
151
|
+
}
|
|
152
|
+
/** 读取 engram 文件 */
|
|
153
|
+
export function readEngramFile(filePath) {
|
|
154
|
+
const raw = readFileSync(filePath, "utf8");
|
|
155
|
+
return parseEngramFile(raw);
|
|
156
|
+
}
|
|
157
|
+
/** 写入 engram 文件(自动创建父目录);language 决定磁盘格式 */
|
|
158
|
+
export function writeEngramFile(filePath, file, language = DEFAULT_LANGUAGE) {
|
|
159
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
160
|
+
writeFileSync(filePath, serializeEngramFile(file, language), "utf8");
|
|
161
|
+
}
|
|
162
|
+
/** 删除 engram 文件 */
|
|
163
|
+
export function deleteEngramFile(filePath) {
|
|
164
|
+
if (existsSync(filePath)) {
|
|
165
|
+
unlinkSync(filePath);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/** 原子重命名(用于 doctor 修复文件路径) */
|
|
169
|
+
export function renameEngramFile(oldPath, newPath) {
|
|
170
|
+
mkdirSync(dirname(newPath), { recursive: true });
|
|
171
|
+
renameSync(oldPath, newPath);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* 检查文件是否是 engram(顶部 `---` + 有效 frontmatter,或含底部 meta marker)。
|
|
175
|
+
*
|
|
176
|
+
* 用于 doctor 扫描时区分:
|
|
177
|
+
* - 单文件 frontmatter 的 engram
|
|
178
|
+
* - 普通 markdown(无 frontmatter,提示注册为 engram)
|
|
179
|
+
*/
|
|
180
|
+
export function isEngramFile(raw) {
|
|
181
|
+
// 快速路径:顶部 frontmatter
|
|
182
|
+
if (raw.startsWith(FRONTMATTER_DELIMITER)) {
|
|
183
|
+
try {
|
|
184
|
+
parseEngramFile(raw);
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// 底部 frontmatter:必须含 marker
|
|
192
|
+
if (BOTTOM_META_MARKER_RE.test(raw)) {
|
|
193
|
+
try {
|
|
194
|
+
parseEngramFile(raw);
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* 检测已序列化文件的磁盘 language(供迁移逻辑判断是否需重写)。
|
|
205
|
+
*
|
|
206
|
+
* 返回:
|
|
207
|
+
* - `'zh'` — 底部 frontmatter(中文模式)
|
|
208
|
+
* - `'en'` — 顶部 frontmatter 且无中文标记(英文模式)
|
|
209
|
+
* - `undefined` — 不是有效 engram 文件
|
|
210
|
+
*/
|
|
211
|
+
export function detectEngramFileLanguage(raw) {
|
|
212
|
+
if (!isEngramFile(raw))
|
|
213
|
+
return undefined;
|
|
214
|
+
// 底部 marker 表示 zh
|
|
215
|
+
if (BOTTOM_META_MARKER_RE.test(raw) &&
|
|
216
|
+
!raw.startsWith(FRONTMATTER_DELIMITER)) {
|
|
217
|
+
return "zh";
|
|
218
|
+
}
|
|
219
|
+
return "en";
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=engram-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engram-store.js","sourceRoot":"","sources":["../../src/storage/engram-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git 暂存与提交消息生成(P0-C 规范化提交)
|
|
3
|
+
*
|
|
4
|
+
* 提供:
|
|
5
|
+
* - stageChanges: 根据 engramIds 收集对应三文件路径
|
|
6
|
+
* - generateCommitMessage: 分析暂存文件,生成规范化提交消息
|
|
7
|
+
* - assessChangeRisk: 根据 synapse 类型评估变更风险
|
|
8
|
+
*
|
|
9
|
+
* @module @co-engram/core/storage
|
|
10
|
+
*/
|
|
11
|
+
import type { SynapseKind } from "../types/synapse.js";
|
|
12
|
+
/** 提交消息信息 */
|
|
13
|
+
export interface CommitInfo {
|
|
14
|
+
/** 完整提交消息 */
|
|
15
|
+
readonly message: string;
|
|
16
|
+
/** 变更类型 */
|
|
17
|
+
readonly kind: "create" | "update" | "delete" | "mixed";
|
|
18
|
+
/** 涉及的 engram 数量 */
|
|
19
|
+
readonly engramCount: number;
|
|
20
|
+
}
|
|
21
|
+
/** 风险等级 */
|
|
22
|
+
export type ChangeRisk = "low" | "medium" | "high";
|
|
23
|
+
/** 变更风险评估结果 */
|
|
24
|
+
export interface ChangeRiskAssessment {
|
|
25
|
+
readonly risk: ChangeRisk;
|
|
26
|
+
readonly reasons: readonly string[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 将 engramIds 转换为三文件路径列表
|
|
30
|
+
*
|
|
31
|
+
* @param engramIds - 相对路径形式的 engram ID 列表
|
|
32
|
+
* @returns 相对 rootPath 的文件路径数组(每个 engram 对应 3 个文件)
|
|
33
|
+
*/
|
|
34
|
+
export declare function stageChanges(engramIds: readonly string[]): string[];
|
|
35
|
+
/**
|
|
36
|
+
* 生成规范化提交消息
|
|
37
|
+
*
|
|
38
|
+
* 形如:`co-engram: 新增[设备ADB调试方法]及3条连接(supersedes, depends_on)`
|
|
39
|
+
*
|
|
40
|
+
* P0 简化版:只基于文件路径数量生成消息,不解析实际内容。
|
|
41
|
+
* P1+ 版本会读 YAML 提取 title/kind/synapse kinds 生成更详细消息。
|
|
42
|
+
*/
|
|
43
|
+
export declare function generateCommitMessage(stagedFiles: readonly string[], options?: {
|
|
44
|
+
title?: string;
|
|
45
|
+
synapseKinds?: readonly SynapseKind[];
|
|
46
|
+
}): CommitInfo;
|
|
47
|
+
/**
|
|
48
|
+
* 评估变更风险
|
|
49
|
+
*
|
|
50
|
+
* 规则(来自设计文档 §八):
|
|
51
|
+
* 低风险:新增 extends/similar_to/exemplifies/contextualizes/consolidates
|
|
52
|
+
* 中风险:新增 depends_on/causes/follows/derives_from/part_of
|
|
53
|
+
* 高风险:新增 contradicts/supersedes 或删除已有连接
|
|
54
|
+
*/
|
|
55
|
+
export declare function assessChangeRisk(synapseKinds: readonly SynapseKind[], hasDeletions: boolean): ChangeRiskAssessment;
|
|
56
|
+
//# sourceMappingURL=git-stage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-stage.d.ts","sourceRoot":"","sources":["../../src/storage/git-stage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,aAAa;AACb,MAAM,WAAW,UAAU;IACzB,aAAa;IACb,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,WAAW;IACX,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACxD,oBAAoB;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,WAAW;AACX,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEnD,eAAe;AACf,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAiBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAOnE;AAgDD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,SAAS,WAAW,EAAE,CAAA;CAAE,GAClE,UAAU,CA4BZ;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,SAAS,WAAW,EAAE,EACpC,YAAY,EAAE,OAAO,GACpB,oBAAoB,CAmCtB"}
|