cognitive-core 0.1.2 → 0.2.1
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/settings.json +111 -2
- package/.sessionlog/settings.json +4 -0
- 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 +8 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -6
- 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 +311 -0
- package/dist/learning/unified-pipeline.d.ts.map +1 -0
- package/dist/learning/unified-pipeline.js +844 -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 +43 -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/efficacy-toolkit.d.ts +164 -0
- package/dist/workspace/efficacy-toolkit.d.ts.map +1 -0
- package/dist/workspace/efficacy-toolkit.js +281 -0
- package/dist/workspace/efficacy-toolkit.js.map +1 -0
- package/dist/workspace/index.d.ts +2 -1
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js +3 -1
- package/dist/workspace/index.js.map +1 -1
- 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/templates/index.d.ts +3 -0
- package/dist/workspace/templates/index.d.ts.map +1 -1
- package/dist/workspace/templates/index.js +6 -0
- package/dist/workspace/templates/index.js.map +1 -1
- package/dist/workspace/templates/playbook-decay-detection.d.ts +46 -0
- package/dist/workspace/templates/playbook-decay-detection.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-decay-detection.js +197 -0
- package/dist/workspace/templates/playbook-decay-detection.js.map +1 -0
- package/dist/workspace/templates/playbook-efficacy-audit.d.ts +46 -0
- package/dist/workspace/templates/playbook-efficacy-audit.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-efficacy-audit.js +160 -0
- package/dist/workspace/templates/playbook-efficacy-audit.js.map +1 -0
- package/dist/workspace/templates/playbook-lifecycle-review.d.ts +51 -0
- package/dist/workspace/templates/playbook-lifecycle-review.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-lifecycle-review.js +187 -0
- package/dist/workspace/templates/playbook-lifecycle-review.js.map +1 -0
- 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 +12 -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 +136 -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 +66 -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 +1191 -0
- package/src/memory/candidate-retrieval.ts +72 -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/efficacy-toolkit.ts +496 -0
- package/src/workspace/index.ts +29 -0
- package/src/workspace/runner.ts +3 -3
- package/src/workspace/templates/index.ts +24 -0
- package/src/workspace/templates/playbook-decay-detection.ts +272 -0
- package/src/workspace/templates/playbook-efficacy-audit.ts +246 -0
- package/src/workspace/templates/playbook-lifecycle-review.ts +274 -0
- 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/fixtures/behavioral-trajectories.ts +210 -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/pipeline-data-correctness.test.ts +794 -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/meta-learner.test.ts +418 -0
- package/tests/learning/pipeline-memory-updates.test.ts +721 -0
- package/tests/learning/reflexion-generator.test.ts +411 -0
- package/tests/learning/trajectory-sources.test.ts +12 -4
- package/tests/learning/unified-pipeline-efficacy.test.ts +232 -0
- package/tests/learning/unified-pipeline.test.ts +322 -0
- package/tests/mcp/playbook-server.test.ts +6 -1
- package/tests/memory/candidate-retrieval.test.ts +167 -0
- 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/meta.test.ts +399 -0
- 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/evaluator.test.ts +257 -0
- 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/search/verification-runner.test.ts +357 -0
- 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/error-classifier.test.ts +149 -0
- package/tests/utils/partitioned-store.test.ts +230 -0
- package/tests/utils/trajectory-helpers.test.ts +163 -0
- package/tests/workspace/efficacy-toolkit.test.ts +404 -0
- package/tests/workspace/full-flow.test.ts +10 -4
- package/tests/workspace/runner.test.ts +10 -4
- package/tests/workspace/templates/playbook-efficacy.test.ts +377 -0
- 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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
2
|
import { PlaybookLibrary, createPlaybookLibrary } from '../../src/memory/playbook.js';
|
|
3
3
|
import type { Playbook } from '../../src/types/playbook.js';
|
|
4
|
+
import { createSqlitePersistence } from '../../src/persistence/index.js';
|
|
4
5
|
import { mkdtemp, rm } from 'node:fs/promises';
|
|
5
6
|
import { join } from 'node:path';
|
|
6
7
|
import { tmpdir } from 'node:os';
|
|
@@ -8,15 +9,19 @@ import { tmpdir } from 'node:os';
|
|
|
8
9
|
describe('PlaybookLibrary', () => {
|
|
9
10
|
let tempDir: string;
|
|
10
11
|
let library: PlaybookLibrary;
|
|
12
|
+
let persistence: any;
|
|
11
13
|
|
|
12
14
|
beforeEach(async () => {
|
|
13
15
|
tempDir = await mkdtemp(join(tmpdir(), 'atlas-test-'));
|
|
14
|
-
|
|
16
|
+
persistence = createSqlitePersistence({ baseDir: tempDir });
|
|
17
|
+
await persistence.init();
|
|
18
|
+
library = createPlaybookLibrary(persistence);
|
|
15
19
|
await library.init();
|
|
16
20
|
});
|
|
17
21
|
|
|
18
22
|
afterEach(async () => {
|
|
19
23
|
await library.close();
|
|
24
|
+
persistence.close();
|
|
20
25
|
await rm(tempDir, { recursive: true, force: true });
|
|
21
26
|
});
|
|
22
27
|
|
|
@@ -322,6 +327,164 @@ describe('PlaybookLibrary', () => {
|
|
|
322
327
|
});
|
|
323
328
|
});
|
|
324
329
|
|
|
330
|
+
describe('stability-plasticity', () => {
|
|
331
|
+
it('should dampen confidence changes for high consolidationStrength', async () => {
|
|
332
|
+
// Create a highly consolidated playbook
|
|
333
|
+
const consolidated = createSamplePlaybook({
|
|
334
|
+
name: 'consolidated',
|
|
335
|
+
confidence: 0.7,
|
|
336
|
+
evolution: {
|
|
337
|
+
version: '1.0.0',
|
|
338
|
+
createdFrom: [],
|
|
339
|
+
failures: [],
|
|
340
|
+
refinements: [],
|
|
341
|
+
successCount: 50,
|
|
342
|
+
failureCount: 2,
|
|
343
|
+
consolidationStrength: 5,
|
|
344
|
+
},
|
|
345
|
+
});
|
|
346
|
+
await library.add(consolidated);
|
|
347
|
+
|
|
348
|
+
// Create a fresh playbook
|
|
349
|
+
const fresh = createSamplePlaybook({
|
|
350
|
+
name: 'fresh',
|
|
351
|
+
confidence: 0.7,
|
|
352
|
+
evolution: {
|
|
353
|
+
version: '1.0.0',
|
|
354
|
+
createdFrom: [],
|
|
355
|
+
failures: [],
|
|
356
|
+
refinements: [],
|
|
357
|
+
successCount: 0,
|
|
358
|
+
failureCount: 0,
|
|
359
|
+
consolidationStrength: 0,
|
|
360
|
+
},
|
|
361
|
+
});
|
|
362
|
+
await library.add(fresh);
|
|
363
|
+
|
|
364
|
+
// Apply failure to both
|
|
365
|
+
await library.recordFailure(consolidated.id, 'traj-1', 'test', 'test fail');
|
|
366
|
+
await library.recordFailure(fresh.id, 'traj-2', 'test', 'test fail');
|
|
367
|
+
|
|
368
|
+
const updatedConsolidated = await library.get(consolidated.id);
|
|
369
|
+
const updatedFresh = await library.get(fresh.id);
|
|
370
|
+
|
|
371
|
+
// Both should decrease, but consolidated should decrease less
|
|
372
|
+
const consolidatedDelta = 0.7 - updatedConsolidated!.confidence;
|
|
373
|
+
const freshDelta = 0.7 - updatedFresh!.confidence;
|
|
374
|
+
expect(consolidatedDelta).toBeLessThan(freshDelta);
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
it('should behave as before when consolidationStrength is 0', async () => {
|
|
378
|
+
// A playbook with no consolidation should update like the original EMA
|
|
379
|
+
const playbook = createSamplePlaybook({
|
|
380
|
+
confidence: 0.5,
|
|
381
|
+
evolution: {
|
|
382
|
+
version: '1.0.0',
|
|
383
|
+
createdFrom: [],
|
|
384
|
+
failures: [],
|
|
385
|
+
refinements: [],
|
|
386
|
+
successCount: 0,
|
|
387
|
+
failureCount: 0,
|
|
388
|
+
consolidationStrength: 0,
|
|
389
|
+
},
|
|
390
|
+
});
|
|
391
|
+
await library.add(playbook);
|
|
392
|
+
|
|
393
|
+
await library.recordSuccess(playbook.id, 'traj-1');
|
|
394
|
+
|
|
395
|
+
const updated = await library.get(playbook.id);
|
|
396
|
+
// With cs=0: dampedDelta = rawDelta / (1 + 0) = rawDelta
|
|
397
|
+
// rawDelta = (1 - 0.5) * 0.1 = 0.05
|
|
398
|
+
// new confidence = 0.5 + 0.05 = 0.55
|
|
399
|
+
expect(updated!.confidence).toBeCloseTo(0.55, 2);
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
it('should grow consolidationStrength on success', async () => {
|
|
403
|
+
const playbook = createSamplePlaybook({
|
|
404
|
+
evolution: {
|
|
405
|
+
version: '1.0.0',
|
|
406
|
+
createdFrom: [],
|
|
407
|
+
failures: [],
|
|
408
|
+
refinements: [],
|
|
409
|
+
successCount: 0,
|
|
410
|
+
failureCount: 0,
|
|
411
|
+
consolidationStrength: 0,
|
|
412
|
+
},
|
|
413
|
+
});
|
|
414
|
+
await library.add(playbook);
|
|
415
|
+
|
|
416
|
+
await library.recordSuccess(playbook.id, 'traj-1');
|
|
417
|
+
const after1 = await library.get(playbook.id);
|
|
418
|
+
expect(after1!.evolution.consolidationStrength).toBeCloseTo(0.05, 3);
|
|
419
|
+
|
|
420
|
+
await library.recordSuccess(playbook.id, 'traj-2');
|
|
421
|
+
const after2 = await library.get(playbook.id);
|
|
422
|
+
expect(after2!.evolution.consolidationStrength).toBeCloseTo(0.10, 3);
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
it('should not reduce consolidationStrength on failure', async () => {
|
|
426
|
+
const playbook = createSamplePlaybook({
|
|
427
|
+
evolution: {
|
|
428
|
+
version: '1.0.0',
|
|
429
|
+
createdFrom: [],
|
|
430
|
+
failures: [],
|
|
431
|
+
refinements: [],
|
|
432
|
+
successCount: 10,
|
|
433
|
+
failureCount: 0,
|
|
434
|
+
consolidationStrength: 2.0,
|
|
435
|
+
},
|
|
436
|
+
});
|
|
437
|
+
await library.add(playbook);
|
|
438
|
+
|
|
439
|
+
await library.recordFailure(playbook.id, 'traj-1', 'test', 'failed');
|
|
440
|
+
const updated = await library.get(playbook.id);
|
|
441
|
+
// consolidationStrength should remain at 2.0 (failures don't reduce it)
|
|
442
|
+
expect(updated!.evolution.consolidationStrength).toBe(2.0);
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
it('should cap consolidationStrength at 10', async () => {
|
|
446
|
+
const playbook = createSamplePlaybook({
|
|
447
|
+
evolution: {
|
|
448
|
+
version: '1.0.0',
|
|
449
|
+
createdFrom: [],
|
|
450
|
+
failures: [],
|
|
451
|
+
refinements: [],
|
|
452
|
+
successCount: 100,
|
|
453
|
+
failureCount: 0,
|
|
454
|
+
consolidationStrength: 9.98,
|
|
455
|
+
},
|
|
456
|
+
});
|
|
457
|
+
await library.add(playbook);
|
|
458
|
+
|
|
459
|
+
await library.recordSuccess(playbook.id, 'traj-1');
|
|
460
|
+
const updated = await library.get(playbook.id);
|
|
461
|
+
expect(updated!.evolution.consolidationStrength).toBeLessThanOrEqual(10);
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
it('should backward compat — missing consolidationStrength defaults to 0', async () => {
|
|
465
|
+
// Playbook without consolidationStrength field
|
|
466
|
+
const playbook = createSamplePlaybook({
|
|
467
|
+
confidence: 0.5,
|
|
468
|
+
evolution: {
|
|
469
|
+
version: '1.0.0',
|
|
470
|
+
createdFrom: [],
|
|
471
|
+
failures: [],
|
|
472
|
+
refinements: [],
|
|
473
|
+
successCount: 0,
|
|
474
|
+
failureCount: 0,
|
|
475
|
+
// No consolidationStrength or domainBreadth
|
|
476
|
+
},
|
|
477
|
+
});
|
|
478
|
+
await library.add(playbook);
|
|
479
|
+
|
|
480
|
+
await library.recordSuccess(playbook.id, 'traj-1');
|
|
481
|
+
const updated = await library.get(playbook.id);
|
|
482
|
+
// Should still work, same as cs=0
|
|
483
|
+
expect(updated!.confidence).toBeCloseTo(0.55, 2);
|
|
484
|
+
expect(updated!.evolution.consolidationStrength).toBeCloseTo(0.05, 3);
|
|
485
|
+
});
|
|
486
|
+
});
|
|
487
|
+
|
|
325
488
|
describe('count and getAll', () => {
|
|
326
489
|
it('should return correct counts', async () => {
|
|
327
490
|
expect(await library.count()).toBe(0);
|
|
@@ -335,4 +498,147 @@ describe('PlaybookLibrary', () => {
|
|
|
335
498
|
expect(all).toHaveLength(2);
|
|
336
499
|
});
|
|
337
500
|
});
|
|
501
|
+
|
|
502
|
+
describe('MMR diversity', () => {
|
|
503
|
+
it('should match pure relevance ranking when lambda=1.0', async () => {
|
|
504
|
+
await library.add(createSamplePlaybook({
|
|
505
|
+
name: 'pb-a',
|
|
506
|
+
applicability: {
|
|
507
|
+
situations: ['Fix TypeScript type errors in production code'],
|
|
508
|
+
triggers: ['TS2322'],
|
|
509
|
+
antiPatterns: [],
|
|
510
|
+
domains: ['typescript'],
|
|
511
|
+
},
|
|
512
|
+
guidance: {
|
|
513
|
+
strategy: 'Analyze and fix type mismatches',
|
|
514
|
+
tactics: [],
|
|
515
|
+
steps: [],
|
|
516
|
+
},
|
|
517
|
+
}));
|
|
518
|
+
await library.add(createSamplePlaybook({
|
|
519
|
+
name: 'pb-b',
|
|
520
|
+
applicability: {
|
|
521
|
+
situations: ['Fix TypeScript import errors'],
|
|
522
|
+
triggers: ['import'],
|
|
523
|
+
antiPatterns: [],
|
|
524
|
+
domains: ['typescript'],
|
|
525
|
+
},
|
|
526
|
+
guidance: {
|
|
527
|
+
strategy: 'Check and resolve import paths',
|
|
528
|
+
tactics: [],
|
|
529
|
+
steps: [],
|
|
530
|
+
},
|
|
531
|
+
}));
|
|
532
|
+
|
|
533
|
+
// lambda=1.0 should give same order as no MMR
|
|
534
|
+
const pureRelevance = await library.findMatching('TypeScript type errors', { k: 2 });
|
|
535
|
+
const mmr1 = await library.findMatching('TypeScript type errors', { k: 2, lambda: 1.0 });
|
|
536
|
+
|
|
537
|
+
expect(pureRelevance.length).toBe(mmr1.length);
|
|
538
|
+
// Same top result
|
|
539
|
+
expect(pureRelevance[0].playbook.name).toBe(mmr1[0].playbook.name);
|
|
540
|
+
});
|
|
541
|
+
|
|
542
|
+
it('should diversify results when lambda is low', async () => {
|
|
543
|
+
// Add two very similar playbooks and one different
|
|
544
|
+
await library.add(createSamplePlaybook({
|
|
545
|
+
name: 'similar-1',
|
|
546
|
+
applicability: {
|
|
547
|
+
situations: ['Debug TypeScript type error in code'],
|
|
548
|
+
triggers: ['type error'],
|
|
549
|
+
antiPatterns: [],
|
|
550
|
+
domains: ['typescript'],
|
|
551
|
+
},
|
|
552
|
+
guidance: {
|
|
553
|
+
strategy: 'Read the full error message and trace back to the source type declaration',
|
|
554
|
+
tactics: [],
|
|
555
|
+
steps: [],
|
|
556
|
+
},
|
|
557
|
+
}));
|
|
558
|
+
await library.add(createSamplePlaybook({
|
|
559
|
+
name: 'similar-2',
|
|
560
|
+
applicability: {
|
|
561
|
+
situations: ['Debug TypeScript type error in tests'],
|
|
562
|
+
triggers: ['type error'],
|
|
563
|
+
antiPatterns: [],
|
|
564
|
+
domains: ['typescript'],
|
|
565
|
+
},
|
|
566
|
+
guidance: {
|
|
567
|
+
strategy: 'Read the full error message and trace back to the source type declaration',
|
|
568
|
+
tactics: [],
|
|
569
|
+
steps: [],
|
|
570
|
+
},
|
|
571
|
+
}));
|
|
572
|
+
await library.add(createSamplePlaybook({
|
|
573
|
+
name: 'different',
|
|
574
|
+
applicability: {
|
|
575
|
+
situations: ['Debug TypeScript type error using alternative approach'],
|
|
576
|
+
triggers: ['type error'],
|
|
577
|
+
antiPatterns: [],
|
|
578
|
+
domains: ['typescript'],
|
|
579
|
+
},
|
|
580
|
+
guidance: {
|
|
581
|
+
strategy: 'Use the TypeScript compiler API to programmatically analyze types',
|
|
582
|
+
tactics: [],
|
|
583
|
+
steps: [],
|
|
584
|
+
},
|
|
585
|
+
}));
|
|
586
|
+
|
|
587
|
+
// With low lambda, MMR should prefer the diverse playbook over the near-duplicate
|
|
588
|
+
const diverseResults = await library.findMatching('TypeScript type error', {
|
|
589
|
+
k: 3,
|
|
590
|
+
lambda: 0.3,
|
|
591
|
+
});
|
|
592
|
+
|
|
593
|
+
expect(diverseResults.length).toBe(3);
|
|
594
|
+
// The "different" strategy playbook should appear in the top results
|
|
595
|
+
const names = diverseResults.map((r) => r.playbook.name);
|
|
596
|
+
expect(names).toContain('different');
|
|
597
|
+
});
|
|
598
|
+
|
|
599
|
+
it('should avoid returning near-duplicates with strong diversity bias', async () => {
|
|
600
|
+
// Add 3 playbooks with identical strategies
|
|
601
|
+
for (let i = 0; i < 3; i++) {
|
|
602
|
+
await library.add(createSamplePlaybook({
|
|
603
|
+
name: `clone-${i}`,
|
|
604
|
+
applicability: {
|
|
605
|
+
situations: ['Resolve eslint warnings in codebase'],
|
|
606
|
+
triggers: ['eslint warning'],
|
|
607
|
+
antiPatterns: [],
|
|
608
|
+
domains: ['typescript'],
|
|
609
|
+
},
|
|
610
|
+
guidance: {
|
|
611
|
+
strategy: 'Run eslint with auto-fix flag',
|
|
612
|
+
tactics: [],
|
|
613
|
+
steps: [],
|
|
614
|
+
},
|
|
615
|
+
}));
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
// Add one unique playbook
|
|
619
|
+
await library.add(createSamplePlaybook({
|
|
620
|
+
name: 'unique-lint',
|
|
621
|
+
applicability: {
|
|
622
|
+
situations: ['Resolve eslint warnings using custom rules'],
|
|
623
|
+
triggers: ['eslint warning'],
|
|
624
|
+
antiPatterns: [],
|
|
625
|
+
domains: ['typescript'],
|
|
626
|
+
},
|
|
627
|
+
guidance: {
|
|
628
|
+
strategy: 'Create custom eslint rule to prevent the warning pattern',
|
|
629
|
+
tactics: [],
|
|
630
|
+
steps: [],
|
|
631
|
+
},
|
|
632
|
+
}));
|
|
633
|
+
|
|
634
|
+
// With diversity bias, the unique one should appear by position 2
|
|
635
|
+
const results = await library.findMatching('eslint warnings', {
|
|
636
|
+
k: 2,
|
|
637
|
+
lambda: 0.3,
|
|
638
|
+
});
|
|
639
|
+
|
|
640
|
+
const names = results.map((r) => r.playbook.name);
|
|
641
|
+
expect(names).toContain('unique-lint');
|
|
642
|
+
});
|
|
643
|
+
});
|
|
338
644
|
});
|
|
@@ -3,6 +3,7 @@ import { PlaybookLibrary, createPlaybookLibrary } from '../../src/memory/playboo
|
|
|
3
3
|
import { loadCuratedPlaybooks, type CuratedPlaybookFile } from '../../src/memory/curated-loader.js';
|
|
4
4
|
import type { Playbook, PlaybookProvenance } from '../../src/types/playbook.js';
|
|
5
5
|
import { createPlaybook } from '../../src/types/playbook.js';
|
|
6
|
+
import { createSqlitePersistence } from '../../src/persistence/index.js';
|
|
6
7
|
import { mkdtemp, rm, mkdir, writeFile } from 'node:fs/promises';
|
|
7
8
|
import { join } from 'node:path';
|
|
8
9
|
import { tmpdir } from 'node:os';
|
|
@@ -10,15 +11,19 @@ import { tmpdir } from 'node:os';
|
|
|
10
11
|
describe('Playbook Provenance', () => {
|
|
11
12
|
let tempDir: string;
|
|
12
13
|
let library: PlaybookLibrary;
|
|
14
|
+
let persistence: any;
|
|
13
15
|
|
|
14
16
|
beforeEach(async () => {
|
|
15
17
|
tempDir = await mkdtemp(join(tmpdir(), 'atlas-prov-test-'));
|
|
16
|
-
|
|
18
|
+
persistence = createSqlitePersistence({ baseDir: tempDir });
|
|
19
|
+
await persistence.init();
|
|
20
|
+
library = createPlaybookLibrary(persistence);
|
|
17
21
|
await library.init();
|
|
18
22
|
});
|
|
19
23
|
|
|
20
24
|
afterEach(async () => {
|
|
21
25
|
await library.close();
|
|
26
|
+
persistence.close();
|
|
22
27
|
await rm(tempDir, { recursive: true, force: true });
|
|
23
28
|
});
|
|
24
29
|
|
|
@@ -373,17 +378,21 @@ describe('Curated Playbook Loader', () => {
|
|
|
373
378
|
let tempDir: string;
|
|
374
379
|
let curatedDir: string;
|
|
375
380
|
let library: PlaybookLibrary;
|
|
381
|
+
let persistence: any;
|
|
376
382
|
|
|
377
383
|
beforeEach(async () => {
|
|
378
384
|
tempDir = await mkdtemp(join(tmpdir(), 'atlas-curated-test-'));
|
|
379
385
|
curatedDir = join(tempDir, 'curated');
|
|
380
386
|
await mkdir(curatedDir, { recursive: true });
|
|
381
|
-
|
|
387
|
+
persistence = createSqlitePersistence({ baseDir: tempDir });
|
|
388
|
+
await persistence.init();
|
|
389
|
+
library = createPlaybookLibrary(persistence);
|
|
382
390
|
await library.init();
|
|
383
391
|
});
|
|
384
392
|
|
|
385
393
|
afterEach(async () => {
|
|
386
394
|
await library.close();
|
|
395
|
+
persistence.close();
|
|
387
396
|
await rm(tempDir, { recursive: true, force: true });
|
|
388
397
|
});
|
|
389
398
|
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { ReasoningBank } from '../../src/memory/reasoning-bank.js';
|
|
3
|
+
import { createExperience } from '../../src/types/memory.js';
|
|
4
|
+
|
|
5
|
+
function makeExperience(
|
|
6
|
+
taskInput: string,
|
|
7
|
+
domain: string,
|
|
8
|
+
success = true,
|
|
9
|
+
accessScore = 1.0
|
|
10
|
+
) {
|
|
11
|
+
return createExperience({
|
|
12
|
+
taskInput,
|
|
13
|
+
solutionOutput: `Solution for: ${taskInput}`,
|
|
14
|
+
feedback: success ? 'Success' : 'Failed',
|
|
15
|
+
success,
|
|
16
|
+
domain,
|
|
17
|
+
trajectoryId: `traj-${crypto.randomUUID().slice(0, 8)}`,
|
|
18
|
+
metadata: { accessScore },
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
describe('ReasoningBank', () => {
|
|
23
|
+
describe('buildClusters', () => {
|
|
24
|
+
it('should form clusters from similar experiences', () => {
|
|
25
|
+
const bank = new ReasoningBank({ minClusterSize: 2, maxClusters: 5 });
|
|
26
|
+
|
|
27
|
+
const experiences = [
|
|
28
|
+
// Cluster 1: TypeScript type errors
|
|
29
|
+
makeExperience('Fix TypeScript type error in component', 'typescript'),
|
|
30
|
+
makeExperience('Resolve TypeScript type mismatch in handler', 'typescript'),
|
|
31
|
+
makeExperience('Debug TypeScript type assertion failure', 'typescript'),
|
|
32
|
+
// Cluster 2: CSS styling
|
|
33
|
+
makeExperience('Fix CSS layout alignment issue in sidebar', 'css'),
|
|
34
|
+
makeExperience('Correct CSS flexbox alignment in header', 'css'),
|
|
35
|
+
makeExperience('Fix CSS grid alignment on main page', 'css'),
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
bank.buildClusters(experiences);
|
|
39
|
+
|
|
40
|
+
expect(bank.clusterCount).toBeGreaterThanOrEqual(2);
|
|
41
|
+
const clusters = bank.getClusters();
|
|
42
|
+
expect(clusters.length).toBeGreaterThanOrEqual(2);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('should not cluster when too few experiences', () => {
|
|
46
|
+
const bank = new ReasoningBank({ minClusterSize: 5 });
|
|
47
|
+
|
|
48
|
+
const experiences = [
|
|
49
|
+
makeExperience('Fix a bug', 'typescript'),
|
|
50
|
+
makeExperience('Add a feature', 'typescript'),
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
bank.buildClusters(experiences);
|
|
54
|
+
|
|
55
|
+
expect(bank.clusterCount).toBe(0);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('should only cluster successful experiences', () => {
|
|
59
|
+
const bank = new ReasoningBank({ minClusterSize: 2 });
|
|
60
|
+
|
|
61
|
+
const experiences = [
|
|
62
|
+
makeExperience('Fix TypeScript error', 'typescript', true),
|
|
63
|
+
makeExperience('Fix TypeScript import', 'typescript', true),
|
|
64
|
+
makeExperience('Fix TypeScript build', 'typescript', true),
|
|
65
|
+
makeExperience('Fix failing deploy', 'devops', false),
|
|
66
|
+
makeExperience('Fix broken pipeline', 'devops', false),
|
|
67
|
+
makeExperience('Fix CI configuration', 'devops', false),
|
|
68
|
+
];
|
|
69
|
+
|
|
70
|
+
bank.buildClusters(experiences);
|
|
71
|
+
|
|
72
|
+
// All clusters should only contain successful experiences
|
|
73
|
+
for (const cluster of bank.getClusters()) {
|
|
74
|
+
expect(cluster.successRate).toBe(1.0);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
describe('findInCluster', () => {
|
|
80
|
+
it('should return experiences from matching cluster', () => {
|
|
81
|
+
const bank = new ReasoningBank({ minClusterSize: 2 });
|
|
82
|
+
|
|
83
|
+
const experiences = [
|
|
84
|
+
makeExperience('Fix TypeScript type error in component', 'typescript'),
|
|
85
|
+
makeExperience('Fix TypeScript type mismatch in API', 'typescript'),
|
|
86
|
+
makeExperience('Fix TypeScript type assertion issue', 'typescript'),
|
|
87
|
+
makeExperience('Fix CSS layout bug in sidebar', 'css'),
|
|
88
|
+
makeExperience('Fix CSS flexbox alignment issue', 'css'),
|
|
89
|
+
makeExperience('Fix CSS grid layout problem', 'css'),
|
|
90
|
+
];
|
|
91
|
+
|
|
92
|
+
bank.buildClusters(experiences);
|
|
93
|
+
|
|
94
|
+
const results = bank.findInCluster('TypeScript type error', { k: 3 });
|
|
95
|
+
|
|
96
|
+
expect(results.length).toBeGreaterThan(0);
|
|
97
|
+
// Results should come from the typescript cluster
|
|
98
|
+
for (const r of results) {
|
|
99
|
+
expect(r.experience.domain).toBe('typescript');
|
|
100
|
+
expect(r.clusterId).toBeDefined();
|
|
101
|
+
expect(r.score).toBeGreaterThan(0);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('should return empty array when no clusters exist', () => {
|
|
106
|
+
const bank = new ReasoningBank();
|
|
107
|
+
const results = bank.findInCluster('anything');
|
|
108
|
+
expect(results).toHaveLength(0);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('should filter by domain', () => {
|
|
112
|
+
const bank = new ReasoningBank({ minClusterSize: 2 });
|
|
113
|
+
|
|
114
|
+
const experiences = [
|
|
115
|
+
makeExperience('Fix error in production code', 'typescript'),
|
|
116
|
+
makeExperience('Fix error in production system', 'typescript'),
|
|
117
|
+
makeExperience('Fix error in production app', 'typescript'),
|
|
118
|
+
makeExperience('Fix error in production deploy', 'devops'),
|
|
119
|
+
makeExperience('Fix error in production pipeline', 'devops'),
|
|
120
|
+
makeExperience('Fix error in production build', 'devops'),
|
|
121
|
+
];
|
|
122
|
+
|
|
123
|
+
bank.buildClusters(experiences);
|
|
124
|
+
|
|
125
|
+
const results = bank.findInCluster('production error', {
|
|
126
|
+
domain: 'devops',
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
for (const r of results) {
|
|
130
|
+
expect(r.experience.domain).toBe('devops');
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
describe('cluster labels', () => {
|
|
136
|
+
it('should reflect common task patterns', () => {
|
|
137
|
+
const bank = new ReasoningBank({ minClusterSize: 2 });
|
|
138
|
+
|
|
139
|
+
const experiences = [
|
|
140
|
+
makeExperience('Fix TypeScript type error in component file', 'typescript'),
|
|
141
|
+
makeExperience('Fix TypeScript type error in module export', 'typescript'),
|
|
142
|
+
makeExperience('Fix TypeScript type error in interface', 'typescript'),
|
|
143
|
+
];
|
|
144
|
+
|
|
145
|
+
bank.buildClusters(experiences);
|
|
146
|
+
|
|
147
|
+
const clusters = bank.getClusters();
|
|
148
|
+
expect(clusters.length).toBeGreaterThan(0);
|
|
149
|
+
|
|
150
|
+
// Label should contain common tokens like "fix", "typescript", "type", or "error"
|
|
151
|
+
const label = clusters[0].label.toLowerCase();
|
|
152
|
+
const hasCommonToken =
|
|
153
|
+
label.includes('fix') ||
|
|
154
|
+
label.includes('typescript') ||
|
|
155
|
+
label.includes('type') ||
|
|
156
|
+
label.includes('error');
|
|
157
|
+
expect(hasCommonToken).toBe(true);
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
describe('cluster stats', () => {
|
|
162
|
+
it('should report correct success rates', () => {
|
|
163
|
+
const bank = new ReasoningBank({ minClusterSize: 2 });
|
|
164
|
+
|
|
165
|
+
// All successful (failures are filtered out before clustering)
|
|
166
|
+
const experiences = [
|
|
167
|
+
makeExperience('Fix TypeScript error one', 'typescript', true),
|
|
168
|
+
makeExperience('Fix TypeScript error two', 'typescript', true),
|
|
169
|
+
makeExperience('Fix TypeScript error three', 'typescript', true),
|
|
170
|
+
];
|
|
171
|
+
|
|
172
|
+
bank.buildClusters(experiences);
|
|
173
|
+
|
|
174
|
+
const stats = bank.getClusterStats();
|
|
175
|
+
expect(stats.length).toBeGreaterThan(0);
|
|
176
|
+
|
|
177
|
+
for (const stat of stats) {
|
|
178
|
+
expect(stat.successRate).toBe(1.0); // Only successful ones clustered
|
|
179
|
+
expect(stat.size).toBeGreaterThanOrEqual(2);
|
|
180
|
+
expect(stat.label).toBeDefined();
|
|
181
|
+
expect(stat.clusterId).toBeDefined();
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
describe('re-clustering', () => {
|
|
187
|
+
it('should track experiences since last cluster', () => {
|
|
188
|
+
const bank = new ReasoningBank({ reclusterInterval: 3 });
|
|
189
|
+
|
|
190
|
+
expect(bank.shouldRecluster()).toBe(false);
|
|
191
|
+
|
|
192
|
+
bank.notifyNewExperience();
|
|
193
|
+
bank.notifyNewExperience();
|
|
194
|
+
expect(bank.shouldRecluster()).toBe(false);
|
|
195
|
+
|
|
196
|
+
bank.notifyNewExperience();
|
|
197
|
+
expect(bank.shouldRecluster()).toBe(true);
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it('should reset counter after buildClusters', () => {
|
|
201
|
+
const bank = new ReasoningBank({ reclusterInterval: 2 });
|
|
202
|
+
|
|
203
|
+
bank.notifyNewExperience();
|
|
204
|
+
bank.notifyNewExperience();
|
|
205
|
+
expect(bank.shouldRecluster()).toBe(true);
|
|
206
|
+
|
|
207
|
+
bank.buildClusters([
|
|
208
|
+
makeExperience('Task A one', 'typescript'),
|
|
209
|
+
makeExperience('Task A two', 'typescript'),
|
|
210
|
+
makeExperience('Task A three', 'typescript'),
|
|
211
|
+
]);
|
|
212
|
+
|
|
213
|
+
expect(bank.shouldRecluster()).toBe(false);
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
describe('edge cases', () => {
|
|
218
|
+
it('should handle empty experience list', () => {
|
|
219
|
+
const bank = new ReasoningBank();
|
|
220
|
+
bank.buildClusters([]);
|
|
221
|
+
expect(bank.clusterCount).toBe(0);
|
|
222
|
+
expect(bank.getClusters()).toHaveLength(0);
|
|
223
|
+
expect(bank.getClusterStats()).toHaveLength(0);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
it('should handle all identical experiences', () => {
|
|
227
|
+
const bank = new ReasoningBank({ minClusterSize: 2 });
|
|
228
|
+
|
|
229
|
+
const experiences = Array.from({ length: 5 }, () =>
|
|
230
|
+
makeExperience('Fix TypeScript error', 'typescript')
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
bank.buildClusters(experiences);
|
|
234
|
+
|
|
235
|
+
// Should form at least one cluster
|
|
236
|
+
expect(bank.clusterCount).toBeGreaterThanOrEqual(1);
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
});
|