cognitive-core 0.1.2 → 0.2.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/CLAUDE.md +233 -0
- package/README.md +370 -54
- package/dist/atlas.d.ts +10 -10
- package/dist/atlas.d.ts.map +1 -1
- package/dist/atlas.js +79 -48
- package/dist/atlas.js.map +1 -1
- package/dist/bin/cli-utils.d.ts +37 -0
- package/dist/bin/cli-utils.d.ts.map +1 -0
- package/dist/bin/cli-utils.js +176 -0
- package/dist/bin/cli-utils.js.map +1 -0
- package/dist/bin/cognitive-core.d.ts +2 -12
- package/dist/bin/cognitive-core.d.ts.map +1 -1
- package/dist/bin/cognitive-core.js +76 -351
- package/dist/bin/cognitive-core.js.map +1 -1
- package/dist/bin/commands/kb.d.ts +6 -0
- package/dist/bin/commands/kb.d.ts.map +1 -0
- package/dist/bin/commands/kb.js +240 -0
- package/dist/bin/commands/kb.js.map +1 -0
- package/dist/bin/commands/learn.d.ts +6 -0
- package/dist/bin/commands/learn.d.ts.map +1 -0
- package/dist/bin/commands/learn.js +91 -0
- package/dist/bin/commands/learn.js.map +1 -0
- package/dist/bin/commands/legacy.d.ts +12 -0
- package/dist/bin/commands/legacy.d.ts.map +1 -0
- package/dist/bin/commands/legacy.js +142 -0
- package/dist/bin/commands/legacy.js.map +1 -0
- package/dist/bin/commands/run.d.ts +3 -0
- package/dist/bin/commands/run.d.ts.map +1 -0
- package/dist/bin/commands/run.js +99 -0
- package/dist/bin/commands/run.js.map +1 -0
- package/dist/bin/commands/sessions.d.ts +9 -0
- package/dist/bin/commands/sessions.d.ts.map +1 -0
- package/dist/bin/commands/sessions.js +183 -0
- package/dist/bin/commands/sessions.js.map +1 -0
- package/dist/bin/commands/skills.d.ts +6 -0
- package/dist/bin/commands/skills.d.ts.map +1 -0
- package/dist/bin/commands/skills.js +135 -0
- package/dist/bin/commands/skills.js.map +1 -0
- package/dist/embeddings/index.d.ts +1 -0
- package/dist/embeddings/index.d.ts.map +1 -1
- package/dist/embeddings/index.js +2 -0
- package/dist/embeddings/index.js.map +1 -1
- package/dist/embeddings/inverted-index.d.ts +47 -0
- package/dist/embeddings/inverted-index.d.ts.map +1 -0
- package/dist/embeddings/inverted-index.js +122 -0
- package/dist/embeddings/inverted-index.js.map +1 -0
- package/dist/embeddings/manager.d.ts +3 -1
- package/dist/embeddings/manager.d.ts.map +1 -1
- package/dist/embeddings/manager.js +12 -7
- package/dist/embeddings/manager.js.map +1 -1
- package/dist/embeddings/vector-store.d.ts +7 -3
- package/dist/embeddings/vector-store.d.ts.map +1 -1
- package/dist/embeddings/vector-store.js +22 -6
- package/dist/embeddings/vector-store.js.map +1 -1
- package/dist/factory.d.ts +11 -12
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +20 -7
- package/dist/factory.js.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -5
- package/dist/index.js.map +1 -1
- package/dist/learning/analyzer.d.ts.map +1 -1
- package/dist/learning/analyzer.js +17 -35
- package/dist/learning/analyzer.js.map +1 -1
- package/dist/learning/energy-evaluator.d.ts +128 -0
- package/dist/learning/energy-evaluator.d.ts.map +1 -0
- package/dist/learning/energy-evaluator.js +175 -0
- package/dist/learning/energy-evaluator.js.map +1 -0
- package/dist/learning/healing-orchestrator.d.ts +182 -0
- package/dist/learning/healing-orchestrator.d.ts.map +1 -0
- package/dist/learning/healing-orchestrator.js +250 -0
- package/dist/learning/healing-orchestrator.js.map +1 -0
- package/dist/learning/index.d.ts +7 -2
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +13 -2
- package/dist/learning/index.js.map +1 -1
- package/dist/learning/instant-loop.d.ts +87 -0
- package/dist/learning/instant-loop.d.ts.map +1 -0
- package/dist/learning/instant-loop.js +264 -0
- package/dist/learning/instant-loop.js.map +1 -0
- package/dist/learning/loop-coordinator.d.ts +61 -0
- package/dist/learning/loop-coordinator.d.ts.map +1 -0
- package/dist/learning/loop-coordinator.js +96 -0
- package/dist/learning/loop-coordinator.js.map +1 -0
- package/dist/learning/maintenance-scheduler.d.ts +141 -0
- package/dist/learning/maintenance-scheduler.d.ts.map +1 -0
- package/dist/learning/maintenance-scheduler.js +186 -0
- package/dist/learning/maintenance-scheduler.js.map +1 -0
- package/dist/learning/meta-learner.d.ts.map +1 -1
- package/dist/learning/meta-learner.js +4 -21
- package/dist/learning/meta-learner.js.map +1 -1
- package/dist/learning/pipeline.d.ts +31 -4
- package/dist/learning/pipeline.d.ts.map +1 -1
- package/dist/learning/pipeline.js +64 -12
- package/dist/learning/pipeline.js.map +1 -1
- package/dist/learning/reflexion-generator.d.ts +64 -0
- package/dist/learning/reflexion-generator.d.ts.map +1 -0
- package/dist/learning/reflexion-generator.js +194 -0
- package/dist/learning/reflexion-generator.js.map +1 -0
- package/dist/learning/trajectory-sources/entire.d.ts +8 -5
- package/dist/learning/trajectory-sources/entire.d.ts.map +1 -1
- package/dist/learning/trajectory-sources/entire.js +13 -6
- package/dist/learning/trajectory-sources/entire.js.map +1 -1
- package/dist/learning/trajectory-sources/index.d.ts +1 -1
- package/dist/learning/trajectory-sources/index.d.ts.map +1 -1
- package/dist/learning/trajectory-sources/index.js +1 -1
- package/dist/learning/trajectory-sources/index.js.map +1 -1
- package/dist/learning/trajectory-sources/pipeline.d.ts +4 -4
- package/dist/learning/trajectory-sources/pipeline.d.ts.map +1 -1
- package/dist/learning/trajectory-sources/pipeline.js +2 -2
- package/dist/learning/trajectory-sources/pipeline.js.map +1 -1
- package/dist/learning/unified-pipeline.d.ts +281 -0
- package/dist/learning/unified-pipeline.d.ts.map +1 -0
- package/dist/learning/unified-pipeline.js +637 -0
- package/dist/learning/unified-pipeline.js.map +1 -0
- package/dist/memory/candidate-retrieval.d.ts +43 -0
- package/dist/memory/candidate-retrieval.d.ts.map +1 -0
- package/dist/memory/candidate-retrieval.js +41 -0
- package/dist/memory/candidate-retrieval.js.map +1 -0
- package/dist/memory/causal-store.d.ts +97 -0
- package/dist/memory/causal-store.d.ts.map +1 -0
- package/dist/memory/causal-store.js +209 -0
- package/dist/memory/causal-store.js.map +1 -0
- package/dist/memory/coherence.d.ts +71 -0
- package/dist/memory/coherence.d.ts.map +1 -0
- package/dist/memory/coherence.js +176 -0
- package/dist/memory/coherence.js.map +1 -0
- package/dist/memory/experience.d.ts +39 -6
- package/dist/memory/experience.d.ts.map +1 -1
- package/dist/memory/experience.js +193 -49
- package/dist/memory/experience.js.map +1 -1
- package/dist/memory/index.d.ts +7 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +12 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/knowledge-bank.d.ts +14 -0
- package/dist/memory/knowledge-bank.d.ts.map +1 -1
- package/dist/memory/knowledge-bank.js +45 -0
- package/dist/memory/knowledge-bank.js.map +1 -1
- package/dist/memory/meta.d.ts +7 -8
- package/dist/memory/meta.d.ts.map +1 -1
- package/dist/memory/meta.js +73 -79
- package/dist/memory/meta.js.map +1 -1
- package/dist/memory/playbook.d.ts +26 -9
- package/dist/memory/playbook.d.ts.map +1 -1
- package/dist/memory/playbook.js +198 -74
- package/dist/memory/playbook.js.map +1 -1
- package/dist/memory/reasoning-bank.d.ts +130 -0
- package/dist/memory/reasoning-bank.d.ts.map +1 -0
- package/dist/memory/reasoning-bank.js +342 -0
- package/dist/memory/reasoning-bank.js.map +1 -0
- package/dist/memory/reflexion.d.ts +59 -0
- package/dist/memory/reflexion.d.ts.map +1 -0
- package/dist/memory/reflexion.js +96 -0
- package/dist/memory/reflexion.js.map +1 -0
- package/dist/memory/system.d.ts +7 -2
- package/dist/memory/system.d.ts.map +1 -1
- package/dist/memory/system.js +19 -7
- package/dist/memory/system.js.map +1 -1
- package/dist/memory/temporal-compressor.d.ts +126 -0
- package/dist/memory/temporal-compressor.d.ts.map +1 -0
- package/dist/memory/temporal-compressor.js +335 -0
- package/dist/memory/temporal-compressor.js.map +1 -0
- package/dist/persistence/index.d.ts +11 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +11 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/migrator.d.ts +40 -0
- package/dist/persistence/migrator.d.ts.map +1 -0
- package/dist/persistence/migrator.js +238 -0
- package/dist/persistence/migrator.js.map +1 -0
- package/dist/persistence/serializers.d.ts +45 -0
- package/dist/persistence/serializers.d.ts.map +1 -0
- package/dist/persistence/serializers.js +80 -0
- package/dist/persistence/serializers.js.map +1 -0
- package/dist/persistence/sqlite-persistence.d.ts +228 -0
- package/dist/persistence/sqlite-persistence.d.ts.map +1 -0
- package/dist/persistence/sqlite-persistence.js +588 -0
- package/dist/persistence/sqlite-persistence.js.map +1 -0
- package/dist/runtime/flows/learning.d.ts +10 -12
- package/dist/runtime/flows/learning.d.ts.map +1 -1
- package/dist/runtime/flows/learning.js +10 -23
- package/dist/runtime/flows/learning.js.map +1 -1
- package/dist/search/index.d.ts +1 -0
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +2 -0
- package/dist/search/index.js.map +1 -1
- package/dist/search/moe-gate.d.ts +124 -0
- package/dist/search/moe-gate.d.ts.map +1 -0
- package/dist/search/moe-gate.js +234 -0
- package/dist/search/moe-gate.js.map +1 -0
- package/dist/search/router.d.ts +32 -2
- package/dist/search/router.d.ts.map +1 -1
- package/dist/search/router.js +87 -4
- package/dist/search/router.js.map +1 -1
- package/dist/session-bank/git-reader.d.ts +9 -4
- package/dist/session-bank/git-reader.d.ts.map +1 -1
- package/dist/session-bank/git-reader.js +22 -15
- package/dist/session-bank/git-reader.js.map +1 -1
- package/dist/session-bank/index.d.ts +2 -2
- package/dist/session-bank/index.d.ts.map +1 -1
- package/dist/session-bank/index.js +2 -2
- package/dist/session-bank/index.js.map +1 -1
- package/dist/session-bank/parser.d.ts +16 -5
- package/dist/session-bank/parser.d.ts.map +1 -1
- package/dist/session-bank/parser.js +187 -80
- package/dist/session-bank/parser.js.map +1 -1
- package/dist/session-bank/session-bank.d.ts +5 -0
- package/dist/session-bank/session-bank.d.ts.map +1 -1
- package/dist/session-bank/session-bank.js +30 -9
- package/dist/session-bank/session-bank.js.map +1 -1
- package/dist/session-bank/types.d.ts +4 -1
- package/dist/session-bank/types.d.ts.map +1 -1
- package/dist/session-bank/types.js +3 -3
- package/dist/session-bank/types.js.map +1 -1
- package/dist/surfacing/skill-publisher.d.ts.map +1 -1
- package/dist/surfacing/skill-publisher.js +15 -43
- package/dist/surfacing/skill-publisher.js.map +1 -1
- package/dist/surfacing/sqlite-storage-adapter.d.ts.map +1 -1
- package/dist/surfacing/sqlite-storage-adapter.js +13 -21
- package/dist/surfacing/sqlite-storage-adapter.js.map +1 -1
- package/dist/types/config.d.ts +100 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +27 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/memory.d.ts +52 -0
- package/dist/types/memory.d.ts.map +1 -1
- package/dist/types/memory.js +13 -0
- package/dist/types/memory.js.map +1 -1
- package/dist/types/playbook.d.ts +4 -0
- package/dist/types/playbook.d.ts.map +1 -1
- package/dist/types/playbook.js.map +1 -1
- package/dist/utils/error-classifier.d.ts +30 -0
- package/dist/utils/error-classifier.d.ts.map +1 -0
- package/dist/utils/error-classifier.js +85 -0
- package/dist/utils/error-classifier.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/partitioned-store.d.ts +93 -0
- package/dist/utils/partitioned-store.d.ts.map +1 -0
- package/dist/utils/partitioned-store.js +251 -0
- package/dist/utils/partitioned-store.js.map +1 -0
- package/dist/utils/trajectory-helpers.d.ts +39 -0
- package/dist/utils/trajectory-helpers.d.ts.map +1 -0
- package/dist/utils/trajectory-helpers.js +57 -0
- package/dist/utils/trajectory-helpers.js.map +1 -0
- package/dist/workspace/runner.d.ts +3 -4
- package/dist/workspace/runner.d.ts.map +1 -1
- package/dist/workspace/runner.js.map +1 -1
- package/dist/workspace/types.d.ts +9 -2
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/types.js.map +1 -1
- package/package.json +6 -4
- package/references/sessionlog/.husky/pre-commit +1 -0
- package/references/sessionlog/.lintstagedrc.json +4 -0
- package/references/sessionlog/.prettierignore +4 -0
- package/references/sessionlog/.prettierrc.json +11 -0
- package/references/sessionlog/LICENSE +21 -0
- package/references/sessionlog/README.md +453 -0
- package/references/sessionlog/eslint.config.js +58 -0
- package/references/sessionlog/package-lock.json +3672 -0
- package/references/sessionlog/package.json +65 -0
- package/references/sessionlog/src/__tests__/agent-hooks.test.ts +570 -0
- package/references/sessionlog/src/__tests__/agent-registry.test.ts +127 -0
- package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +225 -0
- package/references/sessionlog/src/__tests__/claude-generator.test.ts +46 -0
- package/references/sessionlog/src/__tests__/commit-msg.test.ts +86 -0
- package/references/sessionlog/src/__tests__/cursor-agent.test.ts +224 -0
- package/references/sessionlog/src/__tests__/e2e-live.test.ts +890 -0
- package/references/sessionlog/src/__tests__/event-log.test.ts +183 -0
- package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +105 -0
- package/references/sessionlog/src/__tests__/gemini-agent.test.ts +375 -0
- package/references/sessionlog/src/__tests__/git-hooks.test.ts +78 -0
- package/references/sessionlog/src/__tests__/hook-managers.test.ts +121 -0
- package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +759 -0
- package/references/sessionlog/src/__tests__/opencode-agent.test.ts +338 -0
- package/references/sessionlog/src/__tests__/redaction.test.ts +136 -0
- package/references/sessionlog/src/__tests__/session-repo.test.ts +353 -0
- package/references/sessionlog/src/__tests__/session-store.test.ts +166 -0
- package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +466 -0
- package/references/sessionlog/src/__tests__/skill-live.test.ts +461 -0
- package/references/sessionlog/src/__tests__/summarize.test.ts +348 -0
- package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +610 -0
- package/references/sessionlog/src/__tests__/task-plan-live.test.ts +632 -0
- package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +121 -0
- package/references/sessionlog/src/__tests__/types.test.ts +166 -0
- package/references/sessionlog/src/__tests__/utils.test.ts +333 -0
- package/references/sessionlog/src/__tests__/validation.test.ts +103 -0
- package/references/sessionlog/src/__tests__/worktree.test.ts +57 -0
- package/references/sessionlog/src/agent/agents/claude-code.ts +1089 -0
- package/references/sessionlog/src/agent/agents/cursor.ts +361 -0
- package/references/sessionlog/src/agent/agents/gemini-cli.ts +632 -0
- package/references/sessionlog/src/agent/agents/opencode.ts +540 -0
- package/references/sessionlog/src/agent/registry.ts +143 -0
- package/references/sessionlog/src/agent/session-types.ts +113 -0
- package/references/sessionlog/src/agent/types.ts +220 -0
- package/references/sessionlog/src/cli.ts +597 -0
- package/references/sessionlog/src/commands/clean.ts +133 -0
- package/references/sessionlog/src/commands/disable.ts +84 -0
- package/references/sessionlog/src/commands/doctor.ts +145 -0
- package/references/sessionlog/src/commands/enable.ts +202 -0
- package/references/sessionlog/src/commands/explain.ts +261 -0
- package/references/sessionlog/src/commands/reset.ts +105 -0
- package/references/sessionlog/src/commands/resume.ts +180 -0
- package/references/sessionlog/src/commands/rewind.ts +195 -0
- package/references/sessionlog/src/commands/setup-ccweb.ts +275 -0
- package/references/sessionlog/src/commands/status.ts +172 -0
- package/references/sessionlog/src/config.ts +165 -0
- package/references/sessionlog/src/events/event-log.ts +126 -0
- package/references/sessionlog/src/git-operations.ts +558 -0
- package/references/sessionlog/src/hooks/git-hooks.ts +165 -0
- package/references/sessionlog/src/hooks/lifecycle.ts +391 -0
- package/references/sessionlog/src/index.ts +650 -0
- package/references/sessionlog/src/security/redaction.ts +283 -0
- package/references/sessionlog/src/session/state-machine.ts +452 -0
- package/references/sessionlog/src/store/checkpoint-store.ts +509 -0
- package/references/sessionlog/src/store/native-store.ts +173 -0
- package/references/sessionlog/src/store/provider-types.ts +99 -0
- package/references/sessionlog/src/store/session-store.ts +266 -0
- package/references/sessionlog/src/strategy/attribution.ts +296 -0
- package/references/sessionlog/src/strategy/common.ts +207 -0
- package/references/sessionlog/src/strategy/content-overlap.ts +228 -0
- package/references/sessionlog/src/strategy/manual-commit.ts +988 -0
- package/references/sessionlog/src/strategy/types.ts +279 -0
- package/references/sessionlog/src/summarize/claude-generator.ts +115 -0
- package/references/sessionlog/src/summarize/summarize.ts +432 -0
- package/references/sessionlog/src/types.ts +508 -0
- package/references/sessionlog/src/utils/chunk-files.ts +49 -0
- package/references/sessionlog/src/utils/commit-message.ts +65 -0
- package/references/sessionlog/src/utils/detect-agent.ts +36 -0
- package/references/sessionlog/src/utils/hook-managers.ts +125 -0
- package/references/sessionlog/src/utils/ide-tags.ts +32 -0
- package/references/sessionlog/src/utils/paths.ts +79 -0
- package/references/sessionlog/src/utils/preview-rewind.ts +80 -0
- package/references/sessionlog/src/utils/rewind-conflict.ts +121 -0
- package/references/sessionlog/src/utils/shadow-branch.ts +109 -0
- package/references/sessionlog/src/utils/string-utils.ts +46 -0
- package/references/sessionlog/src/utils/todo-extract.ts +188 -0
- package/references/sessionlog/src/utils/trailers.ts +187 -0
- package/references/sessionlog/src/utils/transcript-parse.ts +177 -0
- package/references/sessionlog/src/utils/transcript-timestamp.ts +59 -0
- package/references/sessionlog/src/utils/tree-ops.ts +219 -0
- package/references/sessionlog/src/utils/tty.ts +72 -0
- package/references/sessionlog/src/utils/validation.ts +65 -0
- package/references/sessionlog/src/utils/worktree.ts +58 -0
- package/references/sessionlog/src/wire-types.ts +59 -0
- package/references/sessionlog/templates/setup-env.sh +153 -0
- package/references/sessionlog/tsconfig.json +18 -0
- package/references/sessionlog/vitest.config.ts +12 -0
- package/references/skill-tree/.sudocode/issues.jsonl +8 -0
- package/references/skill-tree/.sudocode/specs.jsonl +2 -0
- package/references/skill-tree/CLAUDE.md +56 -80
- package/references/skill-tree/README.md +188 -140
- package/references/skill-tree/examples/basic-usage.ts +95 -121
- package/references/skill-tree/package-lock.json +369 -26
- package/references/skill-tree/package.json +1 -1
- package/src/atlas.ts +97 -67
- package/src/bin/cli-utils.ts +220 -0
- package/src/bin/cognitive-core.ts +84 -392
- package/src/bin/commands/kb.ts +266 -0
- package/src/bin/commands/learn.ts +100 -0
- package/src/bin/commands/legacy.ts +182 -0
- package/src/bin/commands/run.ts +113 -0
- package/src/bin/commands/sessions.ts +221 -0
- package/src/bin/commands/skills.ts +146 -0
- package/src/embeddings/index.ts +3 -0
- package/src/embeddings/inverted-index.ts +134 -0
- package/src/embeddings/manager.ts +13 -8
- package/src/embeddings/vector-store.ts +21 -9
- package/src/factory.ts +33 -16
- package/src/index.ts +109 -9
- package/src/learning/analyzer.ts +21 -37
- package/src/learning/energy-evaluator.ts +282 -0
- package/src/learning/healing-orchestrator.ts +383 -0
- package/src/learning/index.ts +65 -9
- package/src/learning/instant-loop.ts +357 -0
- package/src/learning/maintenance-scheduler.ts +271 -0
- package/src/learning/meta-learner.ts +5 -23
- package/src/learning/reflexion-generator.ts +273 -0
- package/src/learning/trajectory-sources/entire.ts +24 -13
- package/src/learning/trajectory-sources/index.ts +2 -2
- package/src/learning/trajectory-sources/pipeline.ts +5 -5
- package/src/learning/unified-pipeline.ts +921 -0
- package/src/memory/candidate-retrieval.ts +71 -0
- package/src/memory/causal-store.ts +273 -0
- package/src/memory/coherence.ts +252 -0
- package/src/memory/experience.ts +217 -50
- package/src/memory/index.ts +43 -0
- package/src/memory/knowledge-bank.ts +57 -0
- package/src/memory/meta.ts +78 -96
- package/src/memory/playbook.ts +239 -75
- package/src/memory/reasoning-bank.ts +458 -0
- package/src/memory/reflexion.ts +122 -0
- package/src/memory/system.ts +21 -5
- package/src/memory/temporal-compressor.ts +409 -0
- package/src/persistence/index.ts +37 -0
- package/src/persistence/migrator.ts +298 -0
- package/src/persistence/serializers.ts +79 -0
- package/src/persistence/sqlite-persistence.ts +925 -0
- package/src/runtime/flows/learning.ts +25 -42
- package/src/search/index.ts +10 -0
- package/src/search/moe-gate.ts +304 -0
- package/src/search/router.ts +111 -4
- package/src/session-bank/git-reader.ts +29 -19
- package/src/session-bank/index.ts +4 -2
- package/src/session-bank/parser.ts +280 -98
- package/src/session-bank/session-bank.ts +33 -12
- package/src/session-bank/types.ts +8 -5
- package/src/surfacing/skill-publisher.ts +17 -49
- package/src/surfacing/sqlite-storage-adapter.ts +16 -32
- package/src/types/config.ts +30 -0
- package/src/types/index.ts +3 -0
- package/src/types/memory.ts +30 -0
- package/src/types/playbook.ts +4 -0
- package/src/utils/error-classifier.ts +113 -0
- package/src/utils/index.ts +18 -0
- package/src/utils/partitioned-store.ts +299 -0
- package/src/utils/trajectory-helpers.ts +79 -0
- package/src/workspace/runner.ts +3 -3
- package/src/workspace/types.ts +10 -2
- package/tests/embeddings/inverted-index.test.ts +138 -0
- package/tests/feature-toggles.test.ts +275 -0
- package/tests/gap-fixes.test.ts +17 -4
- package/tests/integration/cli-e2e.test.ts +621 -0
- package/tests/integration/e2e.test.ts +6 -5
- package/tests/integration/entire-e2e.test.ts +314 -125
- package/tests/integration/persistence-e2e.test.ts +741 -0
- package/tests/integration/phase-e2e.test.ts +1143 -0
- package/tests/integration/session-bank.test.ts +20 -14
- package/tests/integration/sessionlog-e2e.test.ts +329 -0
- package/tests/integration/unified-pipeline-e2e.test.ts +634 -0
- package/tests/learning/analyzer.test.ts +1 -1
- package/tests/learning/energy-evaluator.test.ts +180 -0
- package/tests/learning/entire-trajectory-source.test.ts +25 -25
- package/tests/learning/healing-orchestrator.test.ts +269 -0
- package/tests/learning/instant-loop.test.ts +243 -0
- package/tests/learning/maintenance-scheduler.test.ts +191 -0
- package/tests/learning/reflexion-generator.test.ts +411 -0
- package/tests/learning/trajectory-sources.test.ts +12 -4
- package/tests/learning/unified-pipeline.test.ts +322 -0
- package/tests/mcp/playbook-server.test.ts +6 -1
- package/tests/memory/causal-store.test.ts +276 -0
- package/tests/memory/coherence.test.ts +232 -0
- package/tests/memory/experience.test.ts +8 -3
- package/tests/memory/playbook.test.ts +307 -1
- package/tests/memory/provenance.test.ts +11 -2
- package/tests/memory/reasoning-bank.test.ts +239 -0
- package/tests/memory/reflexion.test.ts +166 -0
- package/tests/memory/skill-exporter.test.ts +6 -1
- package/tests/memory/system.test.ts +6 -1
- package/tests/memory/temporal-compressor.test.ts +318 -0
- package/tests/persistence/migrator.test.ts +1009 -0
- package/tests/persistence/sqlite-persistence.test.ts +635 -0
- package/tests/runtime/agent-manager.test.ts +6 -1
- package/tests/runtime/delegate.test.ts +6 -1
- package/tests/search/moe-gate.test.ts +250 -0
- package/tests/search/refinement-loop.test.ts +11 -2
- package/tests/search/router.test.ts +81 -2
- package/tests/session-bank/fixtures/sessionlog-root-metadata.json +16 -0
- package/tests/session-bank/fixtures/sessionlog-session/full.jsonl +6 -0
- package/tests/session-bank/fixtures/sessionlog-session/metadata.json +55 -0
- package/tests/session-bank/git-reader.test.ts +13 -13
- package/tests/session-bank/parser.test.ts +135 -3
- package/tests/session-bank/session-bank.test.ts +1 -1
- package/tests/surfacing/skill-library.test.ts +6 -1
- package/tests/surfacing/skill-publisher.test.ts +24 -58
- package/tests/surfacing/sqlite-storage-adapter.test.ts +11 -23
- package/tests/utils/partitioned-store.test.ts +230 -0
- package/tests/workspace/full-flow.test.ts +10 -4
- package/tests/workspace/runner.test.ts +10 -4
- package/docs/DESIGN-workspace-migration.md +0 -1079
- package/docs/PLAN-agentic-workspace-implementation.md +0 -717
- package/docs/PLAN-graph-migration.md +0 -299
- package/docs/PLAN-session-bank-implementation.md +0 -474
- package/src/learning/pipeline.ts +0 -323
- package/tests/learning/pipeline.test.ts +0 -176
package/src/memory/experience.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { Experience } from '../types/index.js';
|
|
2
|
-
import {
|
|
2
|
+
import type { SqlitePersistence, ExperienceRow } from '../persistence/index.js';
|
|
3
|
+
import { fromISO, fromInt, fromJSON, blobToEmbedding } from '../persistence/index.js';
|
|
4
|
+
import { InvertedIndex } from '../embeddings/inverted-index.js';
|
|
3
5
|
import { findTopK } from '../utils/similarity.js';
|
|
6
|
+
import type { ReasoningBank } from './reasoning-bank.js';
|
|
7
|
+
import { getCandidates, type ItemResolver } from './candidate-retrieval.js';
|
|
4
8
|
|
|
5
9
|
/**
|
|
6
10
|
* Result of pruning operation
|
|
@@ -22,34 +26,94 @@ export interface PruneResult {
|
|
|
22
26
|
remainingCount: number;
|
|
23
27
|
}
|
|
24
28
|
|
|
29
|
+
/**
|
|
30
|
+
* Convert an ExperienceRow (SQLite representation) back to an Experience (domain type).
|
|
31
|
+
*/
|
|
32
|
+
function rowToExperience(row: ExperienceRow): Experience {
|
|
33
|
+
return {
|
|
34
|
+
id: row.id,
|
|
35
|
+
taskInput: row.task_input,
|
|
36
|
+
solutionOutput: row.solution_output,
|
|
37
|
+
feedback: row.feedback,
|
|
38
|
+
success: fromInt(row.success),
|
|
39
|
+
domain: row.domain,
|
|
40
|
+
embedding: blobToEmbedding(row.embedding),
|
|
41
|
+
trajectoryId: row.trajectory_id,
|
|
42
|
+
usageCount: row.usage_count,
|
|
43
|
+
accessScore: row.access_score,
|
|
44
|
+
retrievalCount: row.retrieval_count,
|
|
45
|
+
tier: row.tier as 'hot' | 'warm' | 'cold',
|
|
46
|
+
compressed: fromJSON(row.compressed),
|
|
47
|
+
metadata: fromJSON(row.metadata, {}),
|
|
48
|
+
createdAt: fromISO(row.created_at) ?? new Date(),
|
|
49
|
+
lastAccessedAt: fromISO(row.last_accessed_at),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
25
53
|
/**
|
|
26
54
|
* Experience Memory - ReMem-style task-level retrieval
|
|
27
55
|
* Stores complete (task, solution, feedback) tuples
|
|
56
|
+
*
|
|
57
|
+
* Uses SqlitePersistence for storage and InvertedIndex
|
|
58
|
+
* for fast candidate narrowing before similarity scoring.
|
|
28
59
|
*/
|
|
29
60
|
export class ExperienceMemory {
|
|
30
|
-
private
|
|
61
|
+
private persistence: SqlitePersistence;
|
|
62
|
+
private _index: InvertedIndex = new InvertedIndex();
|
|
31
63
|
private initialized = false;
|
|
64
|
+
private _reasoningBank: ReasoningBank | null = null;
|
|
32
65
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
66
|
+
/**
|
|
67
|
+
* ItemResolver adapter for getCandidates().
|
|
68
|
+
* Resolves items by ID from SQLite and returns all values.
|
|
69
|
+
*/
|
|
70
|
+
private _resolver: ItemResolver<Experience>;
|
|
71
|
+
|
|
72
|
+
constructor(persistence: SqlitePersistence) {
|
|
73
|
+
this.persistence = persistence;
|
|
74
|
+
this._resolver = {
|
|
75
|
+
get: (id: string) => {
|
|
76
|
+
const row = this.persistence.getExperience(id);
|
|
77
|
+
return row ? rowToExperience(row) : undefined;
|
|
78
|
+
},
|
|
79
|
+
values: () => this.getAllSync(),
|
|
80
|
+
};
|
|
38
81
|
}
|
|
39
82
|
|
|
40
83
|
async init(): Promise<void> {
|
|
41
84
|
if (this.initialized) return;
|
|
42
|
-
|
|
85
|
+
|
|
86
|
+
// Build inverted index from all experiences in DB
|
|
87
|
+
const ids = this.persistence.getExperienceIds();
|
|
88
|
+
for (const { id, task_input } of ids) {
|
|
89
|
+
this._index.add(id, task_input);
|
|
90
|
+
}
|
|
91
|
+
|
|
43
92
|
this.initialized = true;
|
|
44
93
|
}
|
|
45
94
|
|
|
95
|
+
/**
|
|
96
|
+
* Set the reasoning bank for cluster-augmented retrieval.
|
|
97
|
+
* Called externally when ReasoningBank is initialized.
|
|
98
|
+
*/
|
|
99
|
+
setReasoningBank(bank: ReasoningBank): void {
|
|
100
|
+
this._reasoningBank = bank;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Get the reasoning bank (if set).
|
|
105
|
+
*/
|
|
106
|
+
getReasoningBank(): ReasoningBank | null {
|
|
107
|
+
return this._reasoningBank;
|
|
108
|
+
}
|
|
109
|
+
|
|
46
110
|
/**
|
|
47
111
|
* Store a new experience
|
|
48
112
|
*/
|
|
49
113
|
async add(experience: Experience): Promise<void> {
|
|
50
114
|
await this.init();
|
|
51
|
-
this.
|
|
52
|
-
|
|
115
|
+
this.persistence.insertExperience(experience);
|
|
116
|
+
this._index.add(experience.id, experience.taskInput);
|
|
53
117
|
}
|
|
54
118
|
|
|
55
119
|
/**
|
|
@@ -57,12 +121,14 @@ export class ExperienceMemory {
|
|
|
57
121
|
*/
|
|
58
122
|
async get(id: string): Promise<Experience | undefined> {
|
|
59
123
|
await this.init();
|
|
60
|
-
|
|
124
|
+
const row = this.persistence.getExperience(id);
|
|
125
|
+
return row ? rowToExperience(row) : undefined;
|
|
61
126
|
}
|
|
62
127
|
|
|
63
128
|
/**
|
|
64
129
|
* Find similar experiences
|
|
65
|
-
* Uses
|
|
130
|
+
* Uses inverted index for candidate narrowing, then embedding/text similarity scoring.
|
|
131
|
+
* Bumps accessScore on returned results.
|
|
66
132
|
*/
|
|
67
133
|
async findSimilar(
|
|
68
134
|
query: string | number[],
|
|
@@ -76,9 +142,26 @@ export class ExperienceMemory {
|
|
|
76
142
|
await this.init();
|
|
77
143
|
|
|
78
144
|
const k = options?.k ?? 4; // ReMem default
|
|
79
|
-
let experiences = this._store.values();
|
|
80
145
|
|
|
81
|
-
//
|
|
146
|
+
// Get candidate pool
|
|
147
|
+
const domainFallback = options?.domain
|
|
148
|
+
? [
|
|
149
|
+
...this.persistence.getExperiencesByDomain(options.domain).map(rowToExperience),
|
|
150
|
+
// Include '_global' domain items too
|
|
151
|
+
...this.persistence.getExperiencesByDomain('_global').map(rowToExperience),
|
|
152
|
+
]
|
|
153
|
+
: undefined;
|
|
154
|
+
|
|
155
|
+
let experiences: Experience[];
|
|
156
|
+
|
|
157
|
+
if (typeof query === 'string') {
|
|
158
|
+
experiences = getCandidates(query, this._index, this._resolver, { k }, domainFallback);
|
|
159
|
+
} else {
|
|
160
|
+
// Embedding query — inverted index doesn't help, use fallback
|
|
161
|
+
experiences = domainFallback ?? this.getAllSync();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Apply domain filter (for cases where inverted index returned cross-domain results)
|
|
82
165
|
if (options?.domain) {
|
|
83
166
|
experiences = experiences.filter((e) => e.domain === options.domain);
|
|
84
167
|
}
|
|
@@ -100,11 +183,57 @@ export class ExperienceMemory {
|
|
|
100
183
|
}));
|
|
101
184
|
|
|
102
185
|
// Filter by minimum score
|
|
103
|
-
|
|
104
|
-
|
|
186
|
+
const filtered = options?.minScore !== undefined
|
|
187
|
+
? results.filter((r) => r.score >= options.minScore!)
|
|
188
|
+
: results;
|
|
189
|
+
|
|
190
|
+
// Merge with ReasoningBank results if available (string queries only)
|
|
191
|
+
let merged = filtered;
|
|
192
|
+
if (this._reasoningBank && typeof query === 'string') {
|
|
193
|
+
const clusterResults = this._reasoningBank.findInCluster(query, {
|
|
194
|
+
k,
|
|
195
|
+
domain: options?.domain,
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
// Merge: deduplicate by experience ID, keep higher score
|
|
199
|
+
const seenIds = new Map<string, number>();
|
|
200
|
+
for (const r of merged) {
|
|
201
|
+
seenIds.set(r.experience.id, r.score);
|
|
202
|
+
}
|
|
203
|
+
for (const cr of clusterResults) {
|
|
204
|
+
const existing = seenIds.get(cr.experience.id);
|
|
205
|
+
if (existing === undefined) {
|
|
206
|
+
merged.push({ experience: cr.experience, score: cr.score });
|
|
207
|
+
seenIds.set(cr.experience.id, cr.score);
|
|
208
|
+
}
|
|
209
|
+
// If already present, keep the higher score — existing is already in merged
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Re-sort by score after merge
|
|
213
|
+
merged.sort((a, b) => b.score - a.score);
|
|
214
|
+
merged = merged.slice(0, k);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Bump access scores on returned results
|
|
218
|
+
for (const result of merged) {
|
|
219
|
+
const exp = result.experience;
|
|
220
|
+
const newRetrievalCount = (exp.retrievalCount ?? 0) + 1;
|
|
221
|
+
const newAccessScore = (exp.accessScore ?? 0) * 0.95 + 0.1;
|
|
222
|
+
const newLastAccessedAt = new Date();
|
|
223
|
+
|
|
224
|
+
this.persistence.updateExperience(exp.id, {
|
|
225
|
+
retrievalCount: newRetrievalCount,
|
|
226
|
+
accessScore: newAccessScore,
|
|
227
|
+
lastAccessedAt: newLastAccessedAt,
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
// Update in-memory reference too so caller sees updated values
|
|
231
|
+
exp.retrievalCount = newRetrievalCount;
|
|
232
|
+
exp.accessScore = newAccessScore;
|
|
233
|
+
exp.lastAccessedAt = newLastAccessedAt;
|
|
105
234
|
}
|
|
106
235
|
|
|
107
|
-
return
|
|
236
|
+
return merged;
|
|
108
237
|
}
|
|
109
238
|
|
|
110
239
|
/**
|
|
@@ -115,16 +244,24 @@ export class ExperienceMemory {
|
|
|
115
244
|
updates: Partial<Experience>
|
|
116
245
|
): Promise<Experience | undefined> {
|
|
117
246
|
await this.init();
|
|
118
|
-
const
|
|
119
|
-
if (!
|
|
247
|
+
const row = this.persistence.getExperience(id);
|
|
248
|
+
if (!row) return undefined;
|
|
120
249
|
|
|
250
|
+
const existing = rowToExperience(row);
|
|
121
251
|
const updated = {
|
|
122
252
|
...existing,
|
|
123
253
|
...updates,
|
|
124
254
|
id: existing.id, // Preserve ID
|
|
125
255
|
};
|
|
126
|
-
|
|
127
|
-
|
|
256
|
+
|
|
257
|
+
// Write-through: full replace via INSERT OR REPLACE
|
|
258
|
+
this.persistence.insertExperience(updated);
|
|
259
|
+
|
|
260
|
+
// Update inverted index if taskInput changed
|
|
261
|
+
if (updates.taskInput) {
|
|
262
|
+
this._index.add(id, updates.taskInput);
|
|
263
|
+
}
|
|
264
|
+
|
|
128
265
|
return updated;
|
|
129
266
|
}
|
|
130
267
|
|
|
@@ -133,11 +270,12 @@ export class ExperienceMemory {
|
|
|
133
270
|
*/
|
|
134
271
|
async recordUsage(id: string): Promise<void> {
|
|
135
272
|
await this.init();
|
|
136
|
-
const
|
|
137
|
-
if (
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
273
|
+
const row = this.persistence.getExperience(id);
|
|
274
|
+
if (row) {
|
|
275
|
+
this.persistence.updateExperience(id, {
|
|
276
|
+
usageCount: row.usage_count + 1,
|
|
277
|
+
lastAccessedAt: new Date(),
|
|
278
|
+
});
|
|
141
279
|
}
|
|
142
280
|
}
|
|
143
281
|
|
|
@@ -146,7 +284,16 @@ export class ExperienceMemory {
|
|
|
146
284
|
*/
|
|
147
285
|
async getAll(): Promise<Experience[]> {
|
|
148
286
|
await this.init();
|
|
149
|
-
return this.
|
|
287
|
+
return this.getAllSync();
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Delete an experience by ID
|
|
292
|
+
*/
|
|
293
|
+
async delete(id: string): Promise<boolean> {
|
|
294
|
+
await this.init();
|
|
295
|
+
this._index.remove(id);
|
|
296
|
+
return this.persistence.deleteExperience(id);
|
|
150
297
|
}
|
|
151
298
|
|
|
152
299
|
/**
|
|
@@ -154,11 +301,12 @@ export class ExperienceMemory {
|
|
|
154
301
|
*/
|
|
155
302
|
async getByTrajectory(trajectoryId: string): Promise<Experience[]> {
|
|
156
303
|
await this.init();
|
|
157
|
-
return this.
|
|
304
|
+
return this.persistence.getExperiencesByTrajectory(trajectoryId).map(rowToExperience);
|
|
158
305
|
}
|
|
159
306
|
|
|
160
307
|
/**
|
|
161
|
-
* Prune low-value experiences
|
|
308
|
+
* Prune low-value experiences.
|
|
309
|
+
* Uses accessScore as primary value signal when available.
|
|
162
310
|
*/
|
|
163
311
|
async prune(options?: {
|
|
164
312
|
maxCount?: number;
|
|
@@ -177,7 +325,7 @@ export class ExperienceMemory {
|
|
|
177
325
|
redundancy: [],
|
|
178
326
|
failedOld: [],
|
|
179
327
|
};
|
|
180
|
-
let experiences = this.
|
|
328
|
+
let experiences = this.getAllSync();
|
|
181
329
|
|
|
182
330
|
// 1. Prune by age
|
|
183
331
|
if (options?.maxAgeDays) {
|
|
@@ -186,7 +334,8 @@ export class ExperienceMemory {
|
|
|
186
334
|
(e) => e.createdAt.getTime() < cutoff
|
|
187
335
|
);
|
|
188
336
|
for (const exp of oldExperiences) {
|
|
189
|
-
this.
|
|
337
|
+
this.persistence.deleteExperience(exp.id);
|
|
338
|
+
this._index.remove(exp.id);
|
|
190
339
|
pruned.push(exp.id);
|
|
191
340
|
prunedByReason.age.push(exp.id);
|
|
192
341
|
}
|
|
@@ -201,7 +350,8 @@ export class ExperienceMemory {
|
|
|
201
350
|
(e) => !e.success && e.createdAt.getTime() < cutoff
|
|
202
351
|
);
|
|
203
352
|
for (const exp of failedOld) {
|
|
204
|
-
this.
|
|
353
|
+
this.persistence.deleteExperience(exp.id);
|
|
354
|
+
this._index.remove(exp.id);
|
|
205
355
|
pruned.push(exp.id);
|
|
206
356
|
prunedByReason.failedOld.push(exp.id);
|
|
207
357
|
}
|
|
@@ -219,12 +369,13 @@ export class ExperienceMemory {
|
|
|
219
369
|
const sevenDaysAgo = Date.now() - 7 * 24 * 60 * 60 * 1000;
|
|
220
370
|
for (const exp of lowUsage) {
|
|
221
371
|
if (exp.createdAt.getTime() < sevenDaysAgo) {
|
|
222
|
-
this.
|
|
372
|
+
this.persistence.deleteExperience(exp.id);
|
|
373
|
+
this._index.remove(exp.id);
|
|
223
374
|
pruned.push(exp.id);
|
|
224
375
|
prunedByReason.usage.push(exp.id);
|
|
225
376
|
}
|
|
226
377
|
}
|
|
227
|
-
experiences = this.
|
|
378
|
+
experiences = this.getAllSync(); // Refresh
|
|
228
379
|
}
|
|
229
380
|
|
|
230
381
|
// 4. Prune redundant/similar experiences
|
|
@@ -235,16 +386,17 @@ export class ExperienceMemory {
|
|
|
235
386
|
options.preserveDomainCoverage
|
|
236
387
|
);
|
|
237
388
|
for (const exp of redundant) {
|
|
238
|
-
this.
|
|
389
|
+
this.persistence.deleteExperience(exp.id);
|
|
390
|
+
this._index.remove(exp.id);
|
|
239
391
|
pruned.push(exp.id);
|
|
240
392
|
prunedByReason.redundancy.push(exp.id);
|
|
241
393
|
}
|
|
242
|
-
experiences = this.
|
|
394
|
+
experiences = this.getAllSync(); // Refresh
|
|
243
395
|
}
|
|
244
396
|
|
|
245
397
|
// 5. Prune by count (keep most valuable)
|
|
246
398
|
if (options?.maxCount && experiences.length > options.maxCount) {
|
|
247
|
-
// Sort by value
|
|
399
|
+
// Sort by value (uses accessScore when available)
|
|
248
400
|
experiences.sort((a, b) => {
|
|
249
401
|
const scoreA = this.computeValue(a);
|
|
250
402
|
const scoreB = this.computeValue(b);
|
|
@@ -260,7 +412,8 @@ export class ExperienceMemory {
|
|
|
260
412
|
const keptIds = new Set(kept.map((e) => e.id));
|
|
261
413
|
for (const exp of experiences) {
|
|
262
414
|
if (!keptIds.has(exp.id)) {
|
|
263
|
-
this.
|
|
415
|
+
this.persistence.deleteExperience(exp.id);
|
|
416
|
+
this._index.remove(exp.id);
|
|
264
417
|
pruned.push(exp.id);
|
|
265
418
|
prunedByReason.capacity.push(exp.id);
|
|
266
419
|
}
|
|
@@ -268,23 +421,19 @@ export class ExperienceMemory {
|
|
|
268
421
|
} else {
|
|
269
422
|
const toRemove = experiences.slice(options.maxCount);
|
|
270
423
|
for (const exp of toRemove) {
|
|
271
|
-
this.
|
|
424
|
+
this.persistence.deleteExperience(exp.id);
|
|
425
|
+
this._index.remove(exp.id);
|
|
272
426
|
pruned.push(exp.id);
|
|
273
427
|
prunedByReason.capacity.push(exp.id);
|
|
274
428
|
}
|
|
275
429
|
}
|
|
276
430
|
}
|
|
277
431
|
|
|
278
|
-
// Save changes
|
|
279
|
-
if (pruned.length > 0) {
|
|
280
|
-
await this._store.flush();
|
|
281
|
-
}
|
|
282
|
-
|
|
283
432
|
return {
|
|
284
433
|
prunedIds: pruned,
|
|
285
434
|
prunedByReason,
|
|
286
435
|
totalPruned: pruned.length,
|
|
287
|
-
remainingCount: this.
|
|
436
|
+
remainingCount: this.persistence.getExperienceCount(),
|
|
288
437
|
};
|
|
289
438
|
}
|
|
290
439
|
|
|
@@ -403,9 +552,20 @@ export class ExperienceMemory {
|
|
|
403
552
|
}
|
|
404
553
|
|
|
405
554
|
/**
|
|
406
|
-
* Compute value score for an experience
|
|
555
|
+
* Compute value score for an experience.
|
|
556
|
+
* Uses accessScore as primary signal when available, falls back to
|
|
557
|
+
* the original recency + usage heuristic for backward compatibility.
|
|
407
558
|
*/
|
|
408
559
|
private computeValue(exp: Experience): number {
|
|
560
|
+
// If accessScore is populated (> 0), use it as primary signal
|
|
561
|
+
if (exp.accessScore && exp.accessScore > 0) {
|
|
562
|
+
return (
|
|
563
|
+
exp.accessScore *
|
|
564
|
+
(exp.success ? 1 : 0.3)
|
|
565
|
+
);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
// Backward compat: original heuristic for experiences without accessScore
|
|
409
569
|
const ageMs = Date.now() - exp.createdAt.getTime();
|
|
410
570
|
const ageDays = ageMs / (1000 * 60 * 60 * 24);
|
|
411
571
|
const recencyScore = Math.exp(-ageDays / 30); // Decay over ~30 days
|
|
@@ -441,7 +601,7 @@ export class ExperienceMemory {
|
|
|
441
601
|
};
|
|
442
602
|
}> {
|
|
443
603
|
await this.init();
|
|
444
|
-
const experiences = this.
|
|
604
|
+
const experiences = this.getAllSync();
|
|
445
605
|
|
|
446
606
|
const byDomain: Record<string, number> = {};
|
|
447
607
|
let successCount = 0;
|
|
@@ -503,13 +663,20 @@ export class ExperienceMemory {
|
|
|
503
663
|
*/
|
|
504
664
|
async count(): Promise<number> {
|
|
505
665
|
await this.init();
|
|
506
|
-
return this.
|
|
666
|
+
return this.persistence.getExperienceCount();
|
|
507
667
|
}
|
|
508
668
|
|
|
509
669
|
/**
|
|
510
|
-
* Close the store
|
|
670
|
+
* Close the store (no-op — SqlitePersistence lifecycle is managed externally)
|
|
511
671
|
*/
|
|
512
672
|
async close(): Promise<void> {
|
|
513
|
-
|
|
673
|
+
// SqlitePersistence lifecycle is managed by MemorySystem/Atlas
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
/**
|
|
677
|
+
* Synchronous helper: get all experiences from SQLite.
|
|
678
|
+
*/
|
|
679
|
+
private getAllSync(): Experience[] {
|
|
680
|
+
return this.persistence.getAllExperiences().map(rowToExperience);
|
|
514
681
|
}
|
|
515
682
|
}
|
package/src/memory/index.ts
CHANGED
|
@@ -35,6 +35,45 @@ export {
|
|
|
35
35
|
type TeamMetaObservationEntry,
|
|
36
36
|
} from './team-experience.js';
|
|
37
37
|
|
|
38
|
+
// Reflexion episodes
|
|
39
|
+
export {
|
|
40
|
+
ReflexionMemory,
|
|
41
|
+
createReflexionMemory,
|
|
42
|
+
type ReflexionQueryOptions,
|
|
43
|
+
} from './reflexion.js';
|
|
44
|
+
|
|
45
|
+
// Coherence checking
|
|
46
|
+
export {
|
|
47
|
+
CoherenceChecker,
|
|
48
|
+
createCoherenceChecker,
|
|
49
|
+
type CoherenceResult,
|
|
50
|
+
type CoherenceCheckerConfig,
|
|
51
|
+
} from './coherence.js';
|
|
52
|
+
|
|
53
|
+
// Reasoning bank (clustered experience retrieval)
|
|
54
|
+
export {
|
|
55
|
+
ReasoningBank,
|
|
56
|
+
createReasoningBank,
|
|
57
|
+
type ExperienceCluster,
|
|
58
|
+
type ClusterStats,
|
|
59
|
+
type ReasoningBankConfig,
|
|
60
|
+
} from './reasoning-bank.js';
|
|
61
|
+
|
|
62
|
+
// Causal edge store
|
|
63
|
+
export {
|
|
64
|
+
CausalStore,
|
|
65
|
+
createCausalStore,
|
|
66
|
+
type CausalEdge,
|
|
67
|
+
} from './causal-store.js';
|
|
68
|
+
|
|
69
|
+
// Temporal compression
|
|
70
|
+
export {
|
|
71
|
+
TemporalCompressor,
|
|
72
|
+
createTemporalCompressor,
|
|
73
|
+
type TemporalCompressorConfig,
|
|
74
|
+
type CompressionResult,
|
|
75
|
+
} from './temporal-compressor.js';
|
|
76
|
+
|
|
38
77
|
// Knowledge bank (semantic memory)
|
|
39
78
|
export { KnowledgeBank } from './knowledge-bank.js';
|
|
40
79
|
export { KnowledgeGraphManager } from './knowledge-graph.js';
|
|
@@ -53,6 +92,10 @@ export {
|
|
|
53
92
|
EntityGraphLayer,
|
|
54
93
|
} from './graph-layers/index.js';
|
|
55
94
|
|
|
95
|
+
// Re-export persistence module
|
|
96
|
+
export { SqlitePersistence, createSqlitePersistence } from '../persistence/index.js';
|
|
97
|
+
export type { SqlitePersistenceConfig } from '../persistence/index.js';
|
|
98
|
+
|
|
56
99
|
// Curated playbook loading
|
|
57
100
|
export {
|
|
58
101
|
loadCuratedPlaybooks,
|
|
@@ -21,6 +21,7 @@ import type { GraphNode } from '../types/knowledge-graph.js';
|
|
|
21
21
|
import type { AgenticTaskRunner } from '../workspace/runner.js';
|
|
22
22
|
import type { TrajectoryAnalyzer, AnalysisResult } from '../learning/analyzer.js';
|
|
23
23
|
import { KnowledgeGraphManager } from './knowledge-graph.js';
|
|
24
|
+
import { CoherenceChecker } from './coherence.js';
|
|
24
25
|
import {
|
|
25
26
|
parseKnowledgeNote,
|
|
26
27
|
serializeKnowledgeNote,
|
|
@@ -50,6 +51,7 @@ export class KnowledgeBank {
|
|
|
50
51
|
private readonly bankConfig: KnowledgeBankConfig;
|
|
51
52
|
private initialized = false;
|
|
52
53
|
private searchProvider: SearchProvider = new TextSimilaritySearchProvider();
|
|
54
|
+
private coherenceChecker: CoherenceChecker = new CoherenceChecker();
|
|
53
55
|
|
|
54
56
|
// Directory paths (resolved on init)
|
|
55
57
|
private observationsDir = '';
|
|
@@ -115,15 +117,45 @@ export class KnowledgeBank {
|
|
|
115
117
|
|
|
116
118
|
/**
|
|
117
119
|
* Create a new knowledge note and write it to disk.
|
|
120
|
+
* Runs coherence checking against existing notes — contradictions are flagged
|
|
121
|
+
* via metadata but the note is still stored.
|
|
118
122
|
* Updates the graph overlay in memory.
|
|
119
123
|
*/
|
|
120
124
|
async addObservation(note: KnowledgeNote): Promise<string> {
|
|
121
125
|
await this.init();
|
|
126
|
+
|
|
127
|
+
// Run coherence check against related existing notes (if enabled)
|
|
128
|
+
if (this.bankConfig.coherenceChecking !== false) {
|
|
129
|
+
try {
|
|
130
|
+
const existing = await this.getRelatedNotes(note);
|
|
131
|
+
const coherence = await this.coherenceChecker.check(note, existing);
|
|
132
|
+
|
|
133
|
+
if (!coherence.isCoherent) {
|
|
134
|
+
// Flag contradictions in metadata but still store the note
|
|
135
|
+
const meta = (note.frontmatter as Record<string, unknown>);
|
|
136
|
+
meta['contradictions'] = coherence.contradictions.map(
|
|
137
|
+
(c) => c.existingNoteId
|
|
138
|
+
);
|
|
139
|
+
meta['coherenceEnergy'] = coherence.globalEnergy;
|
|
140
|
+
}
|
|
141
|
+
} catch {
|
|
142
|
+
// Coherence check is non-critical — don't block insertion
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
122
146
|
await this.writeNote(note);
|
|
123
147
|
this.graph.addNode(this.noteToGraphNode(note));
|
|
124
148
|
return note.frontmatter.id;
|
|
125
149
|
}
|
|
126
150
|
|
|
151
|
+
/**
|
|
152
|
+
* Get the last coherence result from the most recent addObservation call.
|
|
153
|
+
* Useful for downstream consumers to react to contradictions.
|
|
154
|
+
*/
|
|
155
|
+
getCoherenceChecker(): CoherenceChecker {
|
|
156
|
+
return this.coherenceChecker;
|
|
157
|
+
}
|
|
158
|
+
|
|
127
159
|
/**
|
|
128
160
|
* Update an existing entity note by appending a section.
|
|
129
161
|
*/
|
|
@@ -1245,6 +1277,31 @@ export class KnowledgeBank {
|
|
|
1245
1277
|
return lines.join('\n');
|
|
1246
1278
|
}
|
|
1247
1279
|
|
|
1280
|
+
/**
|
|
1281
|
+
* Get notes related to the given note by entity or domain overlap.
|
|
1282
|
+
* Used for coherence checking before insertion.
|
|
1283
|
+
*/
|
|
1284
|
+
private async getRelatedNotes(note: KnowledgeNote): Promise<KnowledgeNote[]> {
|
|
1285
|
+
const allNotes = await this.getAllNotes();
|
|
1286
|
+
|
|
1287
|
+
const noteEntities = new Set(note.frontmatter.entities);
|
|
1288
|
+
const noteDomains = new Set(note.frontmatter.domain);
|
|
1289
|
+
|
|
1290
|
+
return allNotes.filter((existing) => {
|
|
1291
|
+
if (existing.frontmatter.id === note.frontmatter.id) return false;
|
|
1292
|
+
|
|
1293
|
+
const hasEntityOverlap = existing.frontmatter.entities.some((e) =>
|
|
1294
|
+
noteEntities.has(e)
|
|
1295
|
+
);
|
|
1296
|
+
if (hasEntityOverlap) return true;
|
|
1297
|
+
|
|
1298
|
+
const hasDomainOverlap = existing.frontmatter.domain.some((d) =>
|
|
1299
|
+
noteDomains.has(d)
|
|
1300
|
+
);
|
|
1301
|
+
return hasDomainOverlap;
|
|
1302
|
+
});
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1248
1305
|
private noteToGraphNode(note: KnowledgeNote): GraphNode {
|
|
1249
1306
|
return {
|
|
1250
1307
|
id: note.frontmatter.id,
|