cognitive-core 0.1.0 → 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/settings.json +88 -0
- package/.claude/settings.local.json +11 -0
- package/.entire/settings.json +4 -0
- package/CLAUDE.md +233 -0
- package/README.md +841 -255
- package/dist/atlas.d.ts +150 -12
- package/dist/atlas.d.ts.map +1 -1
- package/dist/atlas.js +391 -31
- 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/provider.d.ts.map +1 -1
- package/dist/embeddings/provider.js +6 -3
- package/dist/embeddings/provider.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 +11 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +71 -8
- 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 +11 -2
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +20 -3
- 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/knowledge-extractor.d.ts +56 -0
- package/dist/learning/knowledge-extractor.d.ts.map +1 -0
- package/dist/learning/knowledge-extractor.js +336 -0
- package/dist/learning/knowledge-extractor.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 +7 -0
- package/dist/learning/meta-learner.d.ts.map +1 -1
- package/dist/learning/meta-learner.js +47 -21
- package/dist/learning/meta-learner.js.map +1 -1
- package/dist/learning/pipeline.d.ts +55 -4
- package/dist/learning/pipeline.d.ts.map +1 -1
- package/dist/learning/pipeline.js +134 -16
- 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/team-ingester.d.ts +152 -0
- package/dist/learning/team-ingester.d.ts.map +1 -0
- package/dist/learning/team-ingester.js +333 -0
- package/dist/learning/team-ingester.js.map +1 -0
- package/dist/learning/team-meta-learner.d.ts +50 -0
- package/dist/learning/team-meta-learner.d.ts.map +1 -0
- package/dist/learning/team-meta-learner.js +417 -0
- package/dist/learning/team-meta-learner.js.map +1 -0
- package/dist/learning/team-pipeline.d.ts +76 -0
- package/dist/learning/team-pipeline.d.ts.map +1 -0
- package/dist/learning/team-pipeline.js +266 -0
- package/dist/learning/team-pipeline.js.map +1 -0
- package/dist/learning/trajectory-sources/dataclaw.d.ts +41 -0
- package/dist/learning/trajectory-sources/dataclaw.d.ts.map +1 -0
- package/dist/learning/trajectory-sources/dataclaw.js +330 -0
- package/dist/learning/trajectory-sources/dataclaw.js.map +1 -0
- package/dist/learning/trajectory-sources/entire.d.ts +31 -0
- package/dist/learning/trajectory-sources/entire.d.ts.map +1 -0
- package/dist/learning/trajectory-sources/entire.js +189 -0
- package/dist/learning/trajectory-sources/entire.js.map +1 -0
- package/dist/learning/trajectory-sources/file.d.ts +23 -0
- package/dist/learning/trajectory-sources/file.d.ts.map +1 -0
- package/dist/learning/trajectory-sources/file.js +101 -0
- package/dist/learning/trajectory-sources/file.js.map +1 -0
- package/dist/learning/trajectory-sources/huggingface.d.ts +36 -0
- package/dist/learning/trajectory-sources/huggingface.d.ts.map +1 -0
- package/dist/learning/trajectory-sources/huggingface.js +157 -0
- package/dist/learning/trajectory-sources/huggingface.js.map +1 -0
- package/dist/learning/trajectory-sources/in-memory.d.ts +21 -0
- package/dist/learning/trajectory-sources/in-memory.d.ts.map +1 -0
- package/dist/learning/trajectory-sources/in-memory.js +43 -0
- package/dist/learning/trajectory-sources/in-memory.js.map +1 -0
- package/dist/learning/trajectory-sources/index.d.ts +7 -0
- package/dist/learning/trajectory-sources/index.d.ts.map +1 -0
- package/dist/learning/trajectory-sources/index.js +7 -0
- package/dist/learning/trajectory-sources/index.js.map +1 -0
- package/dist/learning/trajectory-sources/pipeline.d.ts +24 -0
- package/dist/learning/trajectory-sources/pipeline.d.ts.map +1 -0
- package/dist/learning/trajectory-sources/pipeline.js +47 -0
- package/dist/learning/trajectory-sources/pipeline.js.map +1 -0
- 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/graph-layers/base.d.ts +29 -0
- package/dist/memory/graph-layers/base.d.ts.map +1 -0
- package/dist/memory/graph-layers/base.js +143 -0
- package/dist/memory/graph-layers/base.js.map +1 -0
- package/dist/memory/graph-layers/causal.d.ts +14 -0
- package/dist/memory/graph-layers/causal.d.ts.map +1 -0
- package/dist/memory/graph-layers/causal.js +14 -0
- package/dist/memory/graph-layers/causal.js.map +1 -0
- package/dist/memory/graph-layers/entity.d.ts +14 -0
- package/dist/memory/graph-layers/entity.d.ts.map +1 -0
- package/dist/memory/graph-layers/entity.js +14 -0
- package/dist/memory/graph-layers/entity.js.map +1 -0
- package/dist/memory/graph-layers/index.d.ts +6 -0
- package/dist/memory/graph-layers/index.d.ts.map +1 -0
- package/dist/memory/graph-layers/index.js +6 -0
- package/dist/memory/graph-layers/index.js.map +1 -0
- package/dist/memory/graph-layers/semantic.d.ts +14 -0
- package/dist/memory/graph-layers/semantic.d.ts.map +1 -0
- package/dist/memory/graph-layers/semantic.js +14 -0
- package/dist/memory/graph-layers/semantic.js.map +1 -0
- package/dist/memory/graph-layers/temporal.d.ts +14 -0
- package/dist/memory/graph-layers/temporal.d.ts.map +1 -0
- package/dist/memory/graph-layers/temporal.js +14 -0
- package/dist/memory/graph-layers/temporal.js.map +1 -0
- package/dist/memory/index.d.ts +15 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +22 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/knowledge-bank.d.ts +234 -0
- package/dist/memory/knowledge-bank.d.ts.map +1 -0
- package/dist/memory/knowledge-bank.js +1048 -0
- package/dist/memory/knowledge-bank.js.map +1 -0
- package/dist/memory/knowledge-defrag.d.ts +49 -0
- package/dist/memory/knowledge-defrag.d.ts.map +1 -0
- package/dist/memory/knowledge-defrag.js +257 -0
- package/dist/memory/knowledge-defrag.js.map +1 -0
- package/dist/memory/knowledge-graph.d.ts +41 -0
- package/dist/memory/knowledge-graph.d.ts.map +1 -0
- package/dist/memory/knowledge-graph.js +273 -0
- package/dist/memory/knowledge-graph.js.map +1 -0
- 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/search-provider.d.ts +31 -0
- package/dist/memory/search-provider.d.ts.map +1 -0
- package/dist/memory/search-provider.js +2 -0
- package/dist/memory/search-provider.js.map +1 -0
- package/dist/memory/search-providers/index.d.ts +3 -0
- package/dist/memory/search-providers/index.d.ts.map +1 -0
- package/dist/memory/search-providers/index.js +3 -0
- package/dist/memory/search-providers/index.js.map +1 -0
- package/dist/memory/search-providers/minimem.d.ts +43 -0
- package/dist/memory/search-providers/minimem.d.ts.map +1 -0
- package/dist/memory/search-providers/minimem.js +56 -0
- package/dist/memory/search-providers/minimem.js.map +1 -0
- package/dist/memory/search-providers/text-similarity.d.ts +15 -0
- package/dist/memory/search-providers/text-similarity.d.ts.map +1 -0
- package/dist/memory/search-providers/text-similarity.js +21 -0
- package/dist/memory/search-providers/text-similarity.js.map +1 -0
- package/dist/memory/skill-exporter.d.ts +75 -0
- package/dist/memory/skill-exporter.d.ts.map +1 -0
- package/dist/memory/skill-exporter.js +248 -0
- package/dist/memory/skill-exporter.js.map +1 -0
- package/dist/memory/system.d.ts +20 -3
- package/dist/memory/system.d.ts.map +1 -1
- package/dist/memory/system.js +61 -11
- package/dist/memory/system.js.map +1 -1
- package/dist/memory/team-experience.d.ts +298 -0
- package/dist/memory/team-experience.d.ts.map +1 -0
- package/dist/memory/team-experience.js +355 -0
- package/dist/memory/team-experience.js.map +1 -0
- 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/backends/acp-protocol.d.ts +49 -0
- package/dist/runtime/backends/acp-protocol.d.ts.map +1 -0
- package/dist/runtime/backends/acp-protocol.js +166 -0
- package/dist/runtime/backends/acp-protocol.js.map +1 -0
- package/dist/runtime/backends/acp.d.ts +26 -26
- package/dist/runtime/backends/acp.d.ts.map +1 -1
- package/dist/runtime/backends/acp.js +32 -156
- package/dist/runtime/backends/acp.js.map +1 -1
- package/dist/runtime/backends/index.d.ts +3 -1
- package/dist/runtime/backends/index.d.ts.map +1 -1
- package/dist/runtime/backends/index.js +3 -1
- package/dist/runtime/backends/index.js.map +1 -1
- package/dist/runtime/backends/macro-agent.d.ts +104 -0
- package/dist/runtime/backends/macro-agent.d.ts.map +1 -0
- package/dist/runtime/backends/macro-agent.js +107 -0
- package/dist/runtime/backends/macro-agent.js.map +1 -0
- package/dist/runtime/compute-provider.d.ts +87 -0
- package/dist/runtime/compute-provider.d.ts.map +1 -0
- package/dist/runtime/compute-provider.js +87 -0
- package/dist/runtime/compute-provider.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/runtime/index.d.ts +3 -2
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +3 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/manager.d.ts +37 -4
- package/dist/runtime/manager.d.ts.map +1 -1
- package/dist/runtime/manager.js +139 -20
- package/dist/runtime/manager.js.map +1 -1
- package/dist/runtime/types.d.ts +38 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/search/evaluator.d.ts +7 -0
- package/dist/search/evaluator.d.ts.map +1 -1
- package/dist/search/evaluator.js +24 -4
- package/dist/search/evaluator.js.map +1 -1
- package/dist/search/index.d.ts +2 -0
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +4 -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/refinement-loop.d.ts +17 -0
- package/dist/search/refinement-loop.d.ts.map +1 -1
- package/dist/search/refinement-loop.js +77 -6
- package/dist/search/refinement-loop.js.map +1 -1
- package/dist/search/refinement-types.d.ts +2 -2
- 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/search/team-router.d.ts +91 -0
- package/dist/search/team-router.d.ts.map +1 -0
- package/dist/search/team-router.js +315 -0
- package/dist/search/team-router.js.map +1 -0
- package/dist/session-bank/git-reader.d.ts +44 -0
- package/dist/session-bank/git-reader.d.ts.map +1 -0
- package/dist/session-bank/git-reader.js +172 -0
- package/dist/session-bank/git-reader.js.map +1 -0
- package/dist/session-bank/index.d.ts +5 -0
- package/dist/session-bank/index.d.ts.map +1 -0
- package/dist/session-bank/index.js +4 -0
- package/dist/session-bank/index.js.map +1 -0
- package/dist/session-bank/parser.d.ts +50 -0
- package/dist/session-bank/parser.d.ts.map +1 -0
- package/dist/session-bank/parser.js +338 -0
- package/dist/session-bank/parser.js.map +1 -0
- package/dist/session-bank/session-bank.d.ts +40 -0
- package/dist/session-bank/session-bank.d.ts.map +1 -0
- package/dist/session-bank/session-bank.js +347 -0
- package/dist/session-bank/session-bank.js.map +1 -0
- package/dist/session-bank/types.d.ts +132 -0
- package/dist/session-bank/types.d.ts.map +1 -0
- package/dist/session-bank/types.js +7 -0
- package/dist/session-bank/types.js.map +1 -0
- package/dist/surfacing/index.d.ts +4 -0
- package/dist/surfacing/index.d.ts.map +1 -1
- package/dist/surfacing/index.js +3 -0
- package/dist/surfacing/index.js.map +1 -1
- package/dist/surfacing/publisher.d.ts +22 -0
- package/dist/surfacing/publisher.d.ts.map +1 -0
- package/dist/surfacing/publisher.js +9 -0
- package/dist/surfacing/publisher.js.map +1 -0
- package/dist/surfacing/skill-library.d.ts +12 -0
- package/dist/surfacing/skill-library.d.ts.map +1 -1
- package/dist/surfacing/skill-library.js +26 -0
- package/dist/surfacing/skill-library.js.map +1 -1
- package/dist/surfacing/skill-publisher.d.ts +43 -0
- package/dist/surfacing/skill-publisher.d.ts.map +1 -0
- package/dist/surfacing/skill-publisher.js +169 -0
- package/dist/surfacing/skill-publisher.js.map +1 -0
- package/dist/surfacing/sqlite-storage-adapter.d.ts +42 -0
- package/dist/surfacing/sqlite-storage-adapter.d.ts.map +1 -0
- package/dist/surfacing/sqlite-storage-adapter.js +199 -0
- package/dist/surfacing/sqlite-storage-adapter.js.map +1 -0
- package/dist/surfacing/team-skill-library.d.ts +180 -0
- package/dist/surfacing/team-skill-library.d.ts.map +1 -0
- package/dist/surfacing/team-skill-library.js +384 -0
- package/dist/surfacing/team-skill-library.js.map +1 -0
- package/dist/types/config.d.ts +1318 -44
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +243 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/dataclaw.d.ts +286 -0
- package/dist/types/dataclaw.d.ts.map +1 -0
- package/dist/types/dataclaw.js +84 -0
- package/dist/types/dataclaw.js.map +1 -0
- package/dist/types/index.d.ts +9 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +13 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/knowledge-graph.d.ts +148 -0
- package/dist/types/knowledge-graph.d.ts.map +1 -0
- package/dist/types/knowledge-graph.js +40 -0
- package/dist/types/knowledge-graph.js.map +1 -0
- package/dist/types/knowledge.d.ts +280 -0
- package/dist/types/knowledge.d.ts.map +1 -0
- package/dist/types/knowledge.js +191 -0
- package/dist/types/knowledge.js.map +1 -0
- 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/types/team-meta.d.ts +160 -0
- package/dist/types/team-meta.d.ts.map +1 -0
- package/dist/types/team-meta.js +42 -0
- package/dist/types/team-meta.js.map +1 -0
- package/dist/types/team-playbook.d.ts +276 -0
- package/dist/types/team-playbook.d.ts.map +1 -0
- package/dist/types/team-playbook.js +85 -0
- package/dist/types/team-playbook.js.map +1 -0
- package/dist/types/team-trajectory.d.ts +305 -0
- package/dist/types/team-trajectory.d.ts.map +1 -0
- package/dist/types/team-trajectory.js +304 -0
- package/dist/types/team-trajectory.js.map +1 -0
- package/dist/types/trajectory-source.d.ts +39 -0
- package/dist/types/trajectory-source.d.ts.map +1 -0
- package/dist/types/trajectory-source.js +2 -0
- package/dist/types/trajectory-source.js.map +1 -0
- 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/frontmatter.d.ts +34 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +93 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -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/index.d.ts +6 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +11 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/runner.d.ts +49 -0
- package/dist/workspace/runner.d.ts.map +1 -0
- package/dist/workspace/runner.js +219 -0
- package/dist/workspace/runner.js.map +1 -0
- package/dist/workspace/skill-converter.d.ts +18 -0
- package/dist/workspace/skill-converter.d.ts.map +1 -0
- package/dist/workspace/skill-converter.js +257 -0
- package/dist/workspace/skill-converter.js.map +1 -0
- package/dist/workspace/templates/index.d.ts +11 -0
- package/dist/workspace/templates/index.d.ts.map +1 -0
- package/dist/workspace/templates/index.js +21 -0
- package/dist/workspace/templates/index.js.map +1 -0
- package/dist/workspace/templates/knowledge-defrag.d.ts +25 -0
- package/dist/workspace/templates/knowledge-defrag.d.ts.map +1 -0
- package/dist/workspace/templates/knowledge-defrag.js +154 -0
- package/dist/workspace/templates/knowledge-defrag.js.map +1 -0
- package/dist/workspace/templates/knowledge-extraction.d.ts +25 -0
- package/dist/workspace/templates/knowledge-extraction.d.ts.map +1 -0
- package/dist/workspace/templates/knowledge-extraction.js +246 -0
- package/dist/workspace/templates/knowledge-extraction.js.map +1 -0
- package/dist/workspace/templates/meta-reflection.d.ts +47 -0
- package/dist/workspace/templates/meta-reflection.d.ts.map +1 -0
- package/dist/workspace/templates/meta-reflection.js +135 -0
- package/dist/workspace/templates/meta-reflection.js.map +1 -0
- package/dist/workspace/templates/playbook-extraction.d.ts +20 -0
- package/dist/workspace/templates/playbook-extraction.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-extraction.js +189 -0
- package/dist/workspace/templates/playbook-extraction.js.map +1 -0
- package/dist/workspace/templates/refinement-analysis.d.ts +31 -0
- package/dist/workspace/templates/refinement-analysis.d.ts.map +1 -0
- package/dist/workspace/templates/refinement-analysis.js +107 -0
- package/dist/workspace/templates/refinement-analysis.js.map +1 -0
- package/dist/workspace/templates/solution-evaluation.d.ts +21 -0
- package/dist/workspace/templates/solution-evaluation.d.ts.map +1 -0
- package/dist/workspace/templates/solution-evaluation.js +131 -0
- package/dist/workspace/templates/solution-evaluation.js.map +1 -0
- package/dist/workspace/templates/team-playbook-extraction.d.ts +44 -0
- package/dist/workspace/templates/team-playbook-extraction.d.ts.map +1 -0
- package/dist/workspace/templates/team-playbook-extraction.js +497 -0
- package/dist/workspace/templates/team-playbook-extraction.js.map +1 -0
- package/dist/workspace/templates/team-trajectory-analysis.d.ts +19 -0
- package/dist/workspace/templates/team-trajectory-analysis.d.ts.map +1 -0
- package/dist/workspace/templates/team-trajectory-analysis.js +442 -0
- package/dist/workspace/templates/team-trajectory-analysis.js.map +1 -0
- package/dist/workspace/templates/trajectory-analysis.d.ts +19 -0
- package/dist/workspace/templates/trajectory-analysis.d.ts.map +1 -0
- package/dist/workspace/templates/trajectory-analysis.js +170 -0
- package/dist/workspace/templates/trajectory-analysis.js.map +1 -0
- package/dist/workspace/templates/usage-inference.d.ts +19 -0
- package/dist/workspace/templates/usage-inference.d.ts.map +1 -0
- package/dist/workspace/templates/usage-inference.js +125 -0
- package/dist/workspace/templates/usage-inference.js.map +1 -0
- package/dist/workspace/types.d.ts +152 -0
- package/dist/workspace/types.d.ts.map +1 -0
- package/dist/workspace/types.js +17 -0
- package/dist/workspace/types.js.map +1 -0
- package/docs/DESIGN-agentic-workspace.md +2057 -0
- package/docs/DESIGN-semantic-memory-knowledge-bank.md +1789 -0
- package/docs/DESIGN-session-bank.md +1134 -0
- package/docs/DESIGN-team-extraction-pipeline.md +1369 -0
- package/docs/PROPOSAL-team-aware-learning.md +1080 -0
- package/docs/RESEARCH-semantic-memory-knowledge-structures.md +517 -0
- package/docs/RESEARCH-team-trajectory-learning.md +553 -0
- package/gaps.md +204 -0
- package/package.json +27 -7
- package/references/agent-workspace/CLAUDE.md +74 -0
- package/references/agent-workspace/README.md +587 -0
- package/references/agent-workspace/media/banner.png +0 -0
- package/references/agent-workspace/package-lock.json +2061 -0
- package/references/agent-workspace/package.json +54 -0
- package/references/agent-workspace/src/handle.ts +122 -0
- package/references/agent-workspace/src/index.ts +32 -0
- package/references/agent-workspace/src/manager.ts +102 -0
- package/references/agent-workspace/src/readers/json.ts +71 -0
- package/references/agent-workspace/src/readers/markdown.ts +37 -0
- package/references/agent-workspace/src/readers/raw.ts +27 -0
- package/references/agent-workspace/src/types.ts +68 -0
- package/references/agent-workspace/src/validation.ts +93 -0
- package/references/agent-workspace/src/writers/json.ts +17 -0
- package/references/agent-workspace/src/writers/markdown.ts +27 -0
- package/references/agent-workspace/src/writers/raw.ts +22 -0
- package/references/agent-workspace/tests/errors.test.ts +652 -0
- package/references/agent-workspace/tests/handle.test.ts +144 -0
- package/references/agent-workspace/tests/manager.test.ts +124 -0
- package/references/agent-workspace/tests/readers.test.ts +205 -0
- package/references/agent-workspace/tests/validation.test.ts +196 -0
- package/references/agent-workspace/tests/writers.test.ts +108 -0
- package/references/agent-workspace/tsconfig.json +20 -0
- package/references/agent-workspace/tsup.config.ts +9 -0
- package/references/minimem/.claude/settings.json +7 -0
- package/references/minimem/.sudocode/issues.jsonl +18 -0
- package/references/minimem/.sudocode/specs.jsonl +1 -0
- package/references/minimem/CLAUDE.md +310 -0
- package/references/minimem/README.md +556 -0
- package/references/minimem/claude-plugin/.claude-plugin/plugin.json +10 -0
- package/references/minimem/claude-plugin/.mcp.json +7 -0
- package/references/minimem/claude-plugin/README.md +158 -0
- package/references/minimem/claude-plugin/commands/recall.md +47 -0
- package/references/minimem/claude-plugin/commands/remember.md +41 -0
- package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +272 -0
- package/references/minimem/claude-plugin/hooks/hooks.json +27 -0
- package/references/minimem/claude-plugin/hooks/session-end.sh +86 -0
- package/references/minimem/claude-plugin/hooks/session-start.sh +85 -0
- package/references/minimem/claude-plugin/skills/memory/SKILL.md +108 -0
- package/references/minimem/package-lock.json +5373 -0
- package/references/minimem/package.json +60 -0
- package/references/minimem/scripts/postbuild.js +35 -0
- package/references/minimem/src/__tests__/edge-cases.test.ts +371 -0
- package/references/minimem/src/__tests__/errors.test.ts +265 -0
- package/references/minimem/src/__tests__/helpers.ts +199 -0
- package/references/minimem/src/__tests__/internal.test.ts +407 -0
- package/references/minimem/src/__tests__/knowledge.test.ts +287 -0
- package/references/minimem/src/__tests__/minimem.integration.test.ts +1127 -0
- package/references/minimem/src/__tests__/session.test.ts +190 -0
- package/references/minimem/src/cli/__tests__/commands.test.ts +759 -0
- package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +141 -0
- package/references/minimem/src/cli/commands/append.ts +76 -0
- package/references/minimem/src/cli/commands/config.ts +262 -0
- package/references/minimem/src/cli/commands/conflicts.ts +413 -0
- package/references/minimem/src/cli/commands/daemon.ts +169 -0
- package/references/minimem/src/cli/commands/index.ts +12 -0
- package/references/minimem/src/cli/commands/init.ts +88 -0
- package/references/minimem/src/cli/commands/mcp.ts +177 -0
- package/references/minimem/src/cli/commands/push-pull.ts +213 -0
- package/references/minimem/src/cli/commands/search.ts +158 -0
- package/references/minimem/src/cli/commands/status.ts +84 -0
- package/references/minimem/src/cli/commands/sync-init.ts +290 -0
- package/references/minimem/src/cli/commands/sync.ts +70 -0
- package/references/minimem/src/cli/commands/upsert.ts +197 -0
- package/references/minimem/src/cli/config.ts +584 -0
- package/references/minimem/src/cli/index.ts +264 -0
- package/references/minimem/src/cli/shared.ts +161 -0
- package/references/minimem/src/cli/sync/__tests__/central.test.ts +152 -0
- package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +209 -0
- package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +118 -0
- package/references/minimem/src/cli/sync/__tests__/detection.test.ts +207 -0
- package/references/minimem/src/cli/sync/__tests__/integration.test.ts +476 -0
- package/references/minimem/src/cli/sync/__tests__/registry.test.ts +363 -0
- package/references/minimem/src/cli/sync/__tests__/state.test.ts +255 -0
- package/references/minimem/src/cli/sync/__tests__/validation.test.ts +193 -0
- package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +178 -0
- package/references/minimem/src/cli/sync/central.ts +292 -0
- package/references/minimem/src/cli/sync/conflicts.ts +204 -0
- package/references/minimem/src/cli/sync/daemon.ts +407 -0
- package/references/minimem/src/cli/sync/detection.ts +138 -0
- package/references/minimem/src/cli/sync/index.ts +107 -0
- package/references/minimem/src/cli/sync/operations.ts +373 -0
- package/references/minimem/src/cli/sync/registry.ts +279 -0
- package/references/minimem/src/cli/sync/state.ts +355 -0
- package/references/minimem/src/cli/sync/validation.ts +206 -0
- package/references/minimem/src/cli/sync/watcher.ts +234 -0
- package/references/minimem/src/cli/version.ts +34 -0
- package/references/minimem/src/core/index.ts +9 -0
- package/references/minimem/src/core/indexer.ts +628 -0
- package/references/minimem/src/core/searcher.ts +221 -0
- package/references/minimem/src/db/schema.ts +183 -0
- package/references/minimem/src/db/sqlite-vec.ts +24 -0
- package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +431 -0
- package/references/minimem/src/embeddings/batch-gemini.ts +392 -0
- package/references/minimem/src/embeddings/batch-openai.ts +409 -0
- package/references/minimem/src/embeddings/embeddings.ts +434 -0
- package/references/minimem/src/index.ts +109 -0
- package/references/minimem/src/internal.ts +299 -0
- package/references/minimem/src/minimem.ts +1276 -0
- package/references/minimem/src/search/__tests__/hybrid.test.ts +247 -0
- package/references/minimem/src/search/graph.ts +234 -0
- package/references/minimem/src/search/hybrid.ts +151 -0
- package/references/minimem/src/search/search.ts +256 -0
- package/references/minimem/src/server/__tests__/mcp.test.ts +341 -0
- package/references/minimem/src/server/__tests__/tools.test.ts +364 -0
- package/references/minimem/src/server/mcp.ts +326 -0
- package/references/minimem/src/server/tools.ts +720 -0
- package/references/minimem/src/session.ts +460 -0
- package/references/minimem/tsconfig.json +19 -0
- package/references/minimem/tsup.config.ts +26 -0
- package/references/minimem/vitest.config.ts +24 -0
- 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/.claude/settings.json +6 -0
- package/references/skill-tree/.sudocode/issues.jsonl +19 -0
- package/references/skill-tree/.sudocode/specs.jsonl +3 -0
- package/references/skill-tree/CLAUDE.md +126 -0
- package/references/skill-tree/README.md +372 -0
- package/references/skill-tree/docs/GAPS_v1.md +221 -0
- package/references/skill-tree/docs/INTEGRATION_PLAN.md +467 -0
- package/references/skill-tree/docs/TODOS.md +91 -0
- package/references/skill-tree/docs/anthropic_skill_guide.md +1364 -0
- package/references/skill-tree/docs/design/federated-skill-trees.md +524 -0
- package/references/skill-tree/docs/design/multi-agent-sync.md +759 -0
- package/references/skill-tree/docs/scraper/BRAINSTORM.md +583 -0
- package/references/skill-tree/docs/scraper/POC_PLAN.md +420 -0
- package/references/skill-tree/docs/scraper/README.md +170 -0
- package/references/skill-tree/examples/basic-usage.ts +164 -0
- package/references/skill-tree/package-lock.json +1852 -0
- package/references/skill-tree/package.json +66 -0
- package/references/skill-tree/scraper/README.md +123 -0
- package/references/skill-tree/scraper/docs/DESIGN.md +683 -0
- package/references/skill-tree/scraper/docs/PLAN.md +336 -0
- package/references/skill-tree/scraper/drizzle.config.ts +10 -0
- package/references/skill-tree/scraper/package-lock.json +6329 -0
- package/references/skill-tree/scraper/package.json +68 -0
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +7 -0
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +7 -0
- package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +27 -0
- package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +21 -0
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +54 -0
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +24 -0
- package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +93 -0
- package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +22 -0
- package/references/skill-tree/scraper/tsup.config.ts +14 -0
- package/references/skill-tree/scraper/vitest.config.ts +17 -0
- package/references/skill-tree/scripts/convert-to-vitest.ts +166 -0
- package/references/skill-tree/skills/skill-writer/SKILL.md +339 -0
- package/references/skill-tree/skills/skill-writer/references/examples.md +326 -0
- package/references/skill-tree/skills/skill-writer/references/patterns.md +210 -0
- package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +123 -0
- package/references/skill-tree/test/run-all.ts +106 -0
- package/references/skill-tree/test/utils.ts +128 -0
- package/references/skill-tree/vitest.config.ts +16 -0
- package/src/atlas.ts +583 -41
- 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/provider.ts +10 -3
- package/src/embeddings/vector-store.ts +21 -9
- package/src/factory.ts +33 -16
- package/src/index.ts +231 -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 +104 -13
- package/src/learning/instant-loop.ts +357 -0
- package/src/learning/knowledge-extractor.ts +470 -0
- package/src/learning/maintenance-scheduler.ts +271 -0
- package/src/learning/meta-learner.ts +59 -23
- package/src/learning/reflexion-generator.ts +273 -0
- package/src/learning/team-ingester.ts +499 -0
- package/src/learning/team-meta-learner.ts +558 -0
- package/src/learning/team-pipeline.ts +364 -0
- package/src/learning/trajectory-sources/dataclaw.ts +403 -0
- package/src/learning/trajectory-sources/entire.ts +251 -0
- package/src/learning/trajectory-sources/file.ts +136 -0
- package/src/learning/trajectory-sources/huggingface.ts +248 -0
- package/src/learning/trajectory-sources/in-memory.ts +61 -0
- package/src/learning/trajectory-sources/index.ts +15 -0
- package/src/learning/trajectory-sources/pipeline.ts +69 -0
- 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/graph-layers/base.ts +184 -0
- package/src/memory/graph-layers/causal.ts +16 -0
- package/src/memory/graph-layers/entity.ts +16 -0
- package/src/memory/graph-layers/index.ts +5 -0
- package/src/memory/graph-layers/semantic.ts +16 -0
- package/src/memory/graph-layers/temporal.ts +16 -0
- package/src/memory/index.ts +88 -0
- package/src/memory/knowledge-bank.ts +1317 -0
- package/src/memory/knowledge-defrag.ts +329 -0
- package/src/memory/knowledge-graph.ts +361 -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/search-provider.ts +35 -0
- package/src/memory/search-providers/index.ts +3 -0
- package/src/memory/search-providers/minimem.ts +84 -0
- package/src/memory/search-providers/text-similarity.ts +35 -0
- package/src/memory/skill-exporter.ts +357 -0
- package/src/memory/system.ts +80 -11
- package/src/memory/team-experience.ts +604 -0
- 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/backends/acp-protocol.ts +231 -0
- package/src/runtime/backends/acp.ts +57 -196
- package/src/runtime/backends/index.ts +14 -0
- package/src/runtime/backends/macro-agent.ts +177 -0
- package/src/runtime/compute-provider.ts +206 -0
- package/src/runtime/flows/learning.ts +25 -42
- package/src/runtime/index.ts +22 -0
- package/src/runtime/manager.ts +167 -23
- package/src/runtime/types.ts +41 -0
- package/src/search/evaluator.ts +29 -4
- package/src/search/index.ts +19 -0
- package/src/search/moe-gate.ts +304 -0
- package/src/search/refinement-loop.ts +106 -12
- package/src/search/router.ts +111 -4
- package/src/search/team-router.ts +459 -0
- package/src/session-bank/git-reader.ts +200 -0
- package/src/session-bank/index.ts +26 -0
- package/src/session-bank/parser.ts +548 -0
- package/src/session-bank/session-bank.ts +485 -0
- package/src/session-bank/types.ts +176 -0
- package/src/surfacing/index.ts +23 -0
- package/src/surfacing/publisher.ts +23 -0
- package/src/surfacing/skill-library.ts +31 -0
- package/src/surfacing/skill-publisher.ts +191 -0
- package/src/surfacing/sqlite-storage-adapter.ts +285 -0
- package/src/surfacing/team-skill-library.ts +610 -0
- package/src/types/config.ts +282 -0
- package/src/types/dataclaw.ts +99 -0
- package/src/types/huggingface-transformers.d.ts +12 -0
- package/src/types/index.ts +159 -0
- package/src/types/knowledge-graph.ts +246 -0
- package/src/types/knowledge.ts +388 -0
- package/src/types/memory.ts +30 -0
- package/src/types/playbook.ts +4 -0
- package/src/types/team-meta.ts +212 -0
- package/src/types/team-playbook.ts +384 -0
- package/src/types/team-trajectory.ts +673 -0
- package/src/types/trajectory-source.ts +47 -0
- package/src/utils/error-classifier.ts +113 -0
- package/src/utils/frontmatter.ts +118 -0
- package/src/utils/index.ts +25 -0
- package/src/utils/partitioned-store.ts +299 -0
- package/src/utils/trajectory-helpers.ts +79 -0
- package/src/workspace/index.ts +48 -0
- package/src/workspace/runner.ts +281 -0
- package/src/workspace/skill-converter.ts +288 -0
- package/src/workspace/templates/index.ts +64 -0
- package/src/workspace/templates/knowledge-defrag.ts +223 -0
- package/src/workspace/templates/knowledge-extraction.ts +337 -0
- package/src/workspace/templates/meta-reflection.ts +208 -0
- package/src/workspace/templates/playbook-extraction.ts +240 -0
- package/src/workspace/templates/refinement-analysis.ts +162 -0
- package/src/workspace/templates/solution-evaluation.ts +199 -0
- package/src/workspace/templates/team-playbook-extraction.ts +631 -0
- package/src/workspace/templates/team-trajectory-analysis.ts +564 -0
- package/src/workspace/templates/trajectory-analysis.ts +234 -0
- package/src/workspace/templates/usage-inference.ts +163 -0
- package/src/workspace/types.ts +241 -0
- package/tests/atlas-knowledge.test.ts +165 -0
- package/tests/embeddings/inverted-index.test.ts +138 -0
- package/tests/feature-toggles.test.ts +275 -0
- package/tests/gap-fixes.test.ts +1116 -0
- package/tests/integration/cli-e2e.test.ts +621 -0
- package/tests/integration/dataclaw-e2e.test.ts +559 -0
- package/tests/integration/e2e.test.ts +412 -4
- package/tests/integration/entire-e2e.test.ts +376 -0
- package/tests/integration/huggingface-e2e.test.ts +627 -0
- 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 +231 -0
- package/tests/integration/sessionlog-e2e.test.ts +329 -0
- package/tests/integration/skill-tree-wiring.test.ts +152 -0
- package/tests/integration/unified-pipeline-e2e.test.ts +634 -0
- package/tests/learning/analyzer.test.ts +1 -1
- package/tests/learning/dataclaw-trajectory-source.test.ts +642 -0
- package/tests/learning/energy-evaluator.test.ts +180 -0
- package/tests/learning/entire-trajectory-source.test.ts +380 -0
- package/tests/learning/healing-orchestrator.test.ts +269 -0
- package/tests/learning/huggingface-trajectory-source.test.ts +817 -0
- package/tests/learning/instant-loop.test.ts +243 -0
- package/tests/learning/knowledge-extractor.test.ts +491 -0
- package/tests/learning/maintenance-scheduler.test.ts +191 -0
- package/tests/learning/reflexion-generator.test.ts +411 -0
- package/tests/learning/team-ingester.test.ts +349 -0
- package/tests/learning/team-meta-learner.test.ts +618 -0
- package/tests/learning/team-pipeline.test.ts +334 -0
- package/tests/learning/trajectory-sources.test.ts +320 -0
- 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/graph-layers/semantic.test.ts +219 -0
- package/tests/memory/knowledge-bank-extraction.test.ts +558 -0
- package/tests/memory/knowledge-bank.test.ts +705 -0
- package/tests/memory/knowledge-defrag.test.ts +366 -0
- package/tests/memory/knowledge-evolution.test.ts +563 -0
- package/tests/memory/knowledge-graph.test.ts +492 -0
- package/tests/memory/knowledge-inbox.test.ts +258 -0
- package/tests/memory/knowledge-minimem.test.ts +251 -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 +475 -0
- package/tests/memory/system.test.ts +6 -1
- package/tests/memory/team-experience.test.ts +411 -0
- 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 +7 -2
- package/tests/runtime/compute-provider.test.ts +288 -0
- package/tests/runtime/delegate.test.ts +354 -0
- package/tests/runtime/macro-agent-backend.test.ts +266 -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/team-router.test.ts +376 -0
- package/tests/session-bank/fixtures/multi-tool-session/full.jsonl +12 -0
- package/tests/session-bank/fixtures/multi-tool-session/metadata.json +28 -0
- package/tests/session-bank/fixtures/root-metadata.json +18 -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/fixtures/simple-session/full.jsonl +6 -0
- package/tests/session-bank/fixtures/simple-session/metadata.json +38 -0
- package/tests/session-bank/git-reader.test.ts +232 -0
- package/tests/session-bank/parser.test.ts +453 -0
- package/tests/session-bank/session-bank.test.ts +546 -0
- package/tests/surfacing/skill-library.test.ts +6 -1
- package/tests/surfacing/skill-publisher.test.ts +364 -0
- package/tests/surfacing/sqlite-storage-adapter.test.ts +206 -0
- package/tests/surfacing/team-skill-library.test.ts +444 -0
- package/tests/types/team-meta.test.ts +147 -0
- package/tests/types/team-playbook.test.ts +246 -0
- package/tests/types/team-trajectory.test.ts +557 -0
- package/tests/utils/frontmatter.test.ts +208 -0
- package/tests/utils/partitioned-store.test.ts +230 -0
- package/tests/workspace/full-flow.test.ts +845 -0
- package/tests/workspace/manager.test.ts +215 -0
- package/tests/workspace/runner.test.ts +336 -0
- package/tests/workspace/skill-converter.test.ts +205 -0
- package/tests/workspace/templates/knowledge-extraction.test.ts +235 -0
- package/tests/workspace/templates/team-playbook-extraction.test.ts +341 -0
- package/tests/workspace/templates/team-trajectory-analysis.test.ts +417 -0
- package/src/learning/llm-extractor.ts +0 -542
- package/src/learning/pipeline.ts +0 -244
- package/tests/learning/pipeline.test.ts +0 -176
|
@@ -0,0 +1,1143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* End-to-end integration tests for Phase 0-5 modules.
|
|
3
|
+
*
|
|
4
|
+
* Exercises the full data flow:
|
|
5
|
+
* Trajectory → UnifiedLearningPipeline (instant + batch + maintenance)
|
|
6
|
+
* → TemporalCompressor → ReasoningBank clustering
|
|
7
|
+
* + CausalStore edges, ReflexionMemory episodes, CoherenceChecker,
|
|
8
|
+
* MoEGate routing, InvertedIndex narrowing, PartitionedStore
|
|
9
|
+
*
|
|
10
|
+
* These tests use real (non-mocked) components wired together to catch
|
|
11
|
+
* integration bugs that unit tests miss.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
15
|
+
import * as fs from 'node:fs/promises';
|
|
16
|
+
import * as path from 'node:path';
|
|
17
|
+
|
|
18
|
+
import {
|
|
19
|
+
createTrajectory,
|
|
20
|
+
createStep,
|
|
21
|
+
createTask,
|
|
22
|
+
successOutcome,
|
|
23
|
+
failureOutcome,
|
|
24
|
+
type Trajectory,
|
|
25
|
+
} from '../../src/types/index.js';
|
|
26
|
+
|
|
27
|
+
import { MemorySystem } from '../../src/memory/system.js';
|
|
28
|
+
import { createSqlitePersistence } from '../../src/persistence/index.js';
|
|
29
|
+
import { UnifiedLearningPipeline, createUnifiedPipeline } from '../../src/learning/unified-pipeline.js';
|
|
30
|
+
import { InstantLoop, createInstantLoop } from '../../src/learning/instant-loop.js';
|
|
31
|
+
import { ReflexionGenerator, createReflexionGenerator } from '../../src/learning/reflexion-generator.js';
|
|
32
|
+
import { ReasoningBank, createReasoningBank } from '../../src/memory/reasoning-bank.js';
|
|
33
|
+
import { TemporalCompressor, createTemporalCompressor } from '../../src/memory/temporal-compressor.js';
|
|
34
|
+
import { CausalStore, createCausalStore } from '../../src/memory/causal-store.js';
|
|
35
|
+
import { CoherenceChecker, createCoherenceChecker } from '../../src/memory/coherence.js';
|
|
36
|
+
import { InvertedIndex } from '../../src/embeddings/inverted-index.js';
|
|
37
|
+
import { PartitionedStore } from '../../src/utils/partitioned-store.js';
|
|
38
|
+
import {
|
|
39
|
+
MoEGate,
|
|
40
|
+
createMoEGate,
|
|
41
|
+
extractTaskFeatures,
|
|
42
|
+
MOE_FEATURE_SIZE,
|
|
43
|
+
MOE_STRATEGIES,
|
|
44
|
+
} from '../../src/search/moe-gate.js';
|
|
45
|
+
import { createObservation, type KnowledgeNote } from '../../src/types/knowledge.js';
|
|
46
|
+
|
|
47
|
+
// ============================================================================
|
|
48
|
+
// Helpers
|
|
49
|
+
// ============================================================================
|
|
50
|
+
|
|
51
|
+
let testDir: string;
|
|
52
|
+
|
|
53
|
+
function makeTrajectory(
|
|
54
|
+
description: string,
|
|
55
|
+
success: boolean,
|
|
56
|
+
domain = 'code',
|
|
57
|
+
opts?: {
|
|
58
|
+
steps?: ReturnType<typeof createStep>[];
|
|
59
|
+
errorInfo?: string;
|
|
60
|
+
solution?: unknown;
|
|
61
|
+
}
|
|
62
|
+
): Trajectory {
|
|
63
|
+
const defaultSteps = [
|
|
64
|
+
createStep({
|
|
65
|
+
thought: 'Analyzing the task requirements',
|
|
66
|
+
action: 'Read src/main.ts',
|
|
67
|
+
observation: 'file contents: export function main() {}',
|
|
68
|
+
attributionScore: 0.6,
|
|
69
|
+
}),
|
|
70
|
+
createStep({
|
|
71
|
+
thought: 'Implementing the solution',
|
|
72
|
+
action: 'Edit src/main.ts',
|
|
73
|
+
observation: success ? 'file updated successfully' : 'error: syntax error in file',
|
|
74
|
+
attributionScore: success ? 0.9 : 0.2,
|
|
75
|
+
}),
|
|
76
|
+
createStep({
|
|
77
|
+
thought: 'Verifying the result',
|
|
78
|
+
action: 'Bash npm test',
|
|
79
|
+
observation: success
|
|
80
|
+
? 'All tests passed'
|
|
81
|
+
: `error: test failed - ${opts?.errorInfo ?? 'assertion error'}`,
|
|
82
|
+
attributionScore: success ? 0.8 : 0.1,
|
|
83
|
+
}),
|
|
84
|
+
];
|
|
85
|
+
|
|
86
|
+
return createTrajectory({
|
|
87
|
+
task: createTask({ domain, description }),
|
|
88
|
+
steps: opts?.steps ?? defaultSteps,
|
|
89
|
+
outcome: success
|
|
90
|
+
? successOutcome({ result: opts?.solution ?? 'completed' })
|
|
91
|
+
: failureOutcome(opts?.errorInfo ?? 'Task failed'),
|
|
92
|
+
agentId: 'test-agent',
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function makeVariedTrajectories(count: number, successRate: number, domain = 'code'): Trajectory[] {
|
|
97
|
+
const trajectories: Trajectory[] = [];
|
|
98
|
+
const successCount = Math.round(count * successRate);
|
|
99
|
+
const topics = [
|
|
100
|
+
'Fix authentication bug in login form',
|
|
101
|
+
'Implement user registration endpoint',
|
|
102
|
+
'Add pagination to user list API',
|
|
103
|
+
'Fix database connection timeout error',
|
|
104
|
+
'Implement rate limiting middleware',
|
|
105
|
+
'Add input validation to payment form',
|
|
106
|
+
'Fix memory leak in event handler',
|
|
107
|
+
'Implement caching layer for API responses',
|
|
108
|
+
'Add error handling to file upload',
|
|
109
|
+
'Fix CSS layout issue in dashboard',
|
|
110
|
+
'Implement search functionality with filters',
|
|
111
|
+
'Add unit tests for authentication module',
|
|
112
|
+
'Fix type error in configuration parser',
|
|
113
|
+
'Implement webhook notification system',
|
|
114
|
+
'Add logging middleware for request tracing',
|
|
115
|
+
];
|
|
116
|
+
|
|
117
|
+
for (let i = 0; i < count; i++) {
|
|
118
|
+
const isSuccess = i < successCount;
|
|
119
|
+
const desc = topics[i % topics.length] + ` (variant ${Math.floor(i / topics.length)})`;
|
|
120
|
+
trajectories.push(
|
|
121
|
+
makeTrajectory(desc, isSuccess, domain, {
|
|
122
|
+
errorInfo: isSuccess ? undefined : 'TypeError: Cannot read property of undefined',
|
|
123
|
+
})
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
return trajectories;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// ============================================================================
|
|
130
|
+
// Tests
|
|
131
|
+
// ============================================================================
|
|
132
|
+
|
|
133
|
+
describe('Phase 0-5 End-to-End Integration', () => {
|
|
134
|
+
let memory: MemorySystem;
|
|
135
|
+
let persistence: any;
|
|
136
|
+
|
|
137
|
+
beforeEach(async () => {
|
|
138
|
+
testDir = path.join(process.cwd(), `.test-e2e-phase-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`);
|
|
139
|
+
await fs.mkdir(testDir, { recursive: true });
|
|
140
|
+
persistence = createSqlitePersistence({ baseDir: testDir });
|
|
141
|
+
await persistence.init();
|
|
142
|
+
memory = new MemorySystem(persistence, testDir);
|
|
143
|
+
await memory.init();
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
afterEach(async () => {
|
|
147
|
+
await memory.close();
|
|
148
|
+
persistence.close();
|
|
149
|
+
await fs.rm(testDir, { recursive: true, force: true });
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
// --------------------------------------------------------------------------
|
|
153
|
+
// 1. InvertedIndex — standalone candidate narrowing
|
|
154
|
+
// --------------------------------------------------------------------------
|
|
155
|
+
describe('InvertedIndex', () => {
|
|
156
|
+
it('should index documents and return ranked candidates', () => {
|
|
157
|
+
const idx = new InvertedIndex();
|
|
158
|
+
idx.add('a', 'fix authentication bug in login form');
|
|
159
|
+
idx.add('b', 'implement user registration endpoint');
|
|
160
|
+
idx.add('c', 'fix database connection timeout bug');
|
|
161
|
+
idx.add('d', 'add pagination to user list API');
|
|
162
|
+
|
|
163
|
+
const candidates = idx.getCandidates('authentication bug fix');
|
|
164
|
+
expect(candidates.length).toBeGreaterThan(0);
|
|
165
|
+
// "a" has the most token overlap with the query
|
|
166
|
+
expect(candidates[0]).toBe('a');
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('should handle remove and size', () => {
|
|
170
|
+
const idx = new InvertedIndex();
|
|
171
|
+
idx.add('x', 'hello world');
|
|
172
|
+
idx.add('y', 'goodbye world');
|
|
173
|
+
expect(idx.size()).toBe(2);
|
|
174
|
+
|
|
175
|
+
idx.remove('x');
|
|
176
|
+
expect(idx.size()).toBe(1);
|
|
177
|
+
expect(idx.has('x')).toBe(false);
|
|
178
|
+
expect(idx.has('y')).toBe(true);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
// --------------------------------------------------------------------------
|
|
183
|
+
// 2. PartitionedStore — domain-partitioned persistence
|
|
184
|
+
// --------------------------------------------------------------------------
|
|
185
|
+
describe('PartitionedStore', () => {
|
|
186
|
+
it('should partition data by key and retrieve per-partition', async () => {
|
|
187
|
+
const store = new PartitionedStore<{ name: string; domain: string }>(
|
|
188
|
+
testDir,
|
|
189
|
+
'items',
|
|
190
|
+
(item) => item.domain,
|
|
191
|
+
);
|
|
192
|
+
await store.init();
|
|
193
|
+
|
|
194
|
+
store.set('a', { name: 'alpha', domain: 'code' });
|
|
195
|
+
store.set('b', { name: 'beta', domain: 'ops' });
|
|
196
|
+
store.set('c', { name: 'gamma', domain: 'code' });
|
|
197
|
+
|
|
198
|
+
expect(store.size()).toBe(3);
|
|
199
|
+
expect(store.valuesInPartition('code').length).toBe(2);
|
|
200
|
+
expect(store.valuesInPartition('ops').length).toBe(1);
|
|
201
|
+
expect(store.getPartitionNames()).toContain('code');
|
|
202
|
+
expect(store.getPartitionNames()).toContain('ops');
|
|
203
|
+
|
|
204
|
+
// Delete and verify
|
|
205
|
+
store.delete('a');
|
|
206
|
+
expect(store.size()).toBe(2);
|
|
207
|
+
expect(store.valuesInPartition('code').length).toBe(1);
|
|
208
|
+
|
|
209
|
+
await store.close();
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
// --------------------------------------------------------------------------
|
|
214
|
+
// 3. ReflexionGenerator — standalone episode creation
|
|
215
|
+
// --------------------------------------------------------------------------
|
|
216
|
+
describe('ReflexionGenerator', () => {
|
|
217
|
+
it('should generate a reflexion episode from a successful trajectory', async () => {
|
|
218
|
+
const gen = createReflexionGenerator({ maxInsights: 3 });
|
|
219
|
+
const traj = makeTrajectory('Fix authentication bug in login form', true);
|
|
220
|
+
const episode = await gen.generate(traj);
|
|
221
|
+
|
|
222
|
+
expect(episode.trajectoryId).toBe(traj.id);
|
|
223
|
+
expect(episode.outcome).toBe('success');
|
|
224
|
+
expect(episode.taskSummary).toContain('authentication');
|
|
225
|
+
expect(episode.selfCritique.length).toBeGreaterThan(0);
|
|
226
|
+
expect(episode.keyInsights.length).toBeGreaterThanOrEqual(0);
|
|
227
|
+
expect(episode.strategyAssessment).toContain('without playbook guidance');
|
|
228
|
+
expect(episode.suggestedPlaybookUpdates.length).toBeGreaterThan(0);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
it('should generate a reflexion episode from a failed trajectory', async () => {
|
|
232
|
+
const gen = createReflexionGenerator();
|
|
233
|
+
const traj = makeTrajectory('Implement search functionality', false, 'code', {
|
|
234
|
+
errorInfo: 'TypeError: Cannot read property of undefined',
|
|
235
|
+
});
|
|
236
|
+
const episode = await gen.generate(traj);
|
|
237
|
+
|
|
238
|
+
expect(episode.outcome).toBe('failure');
|
|
239
|
+
expect(episode.selfCritique).toContain('TypeError');
|
|
240
|
+
expect(episode.keyInsights.some((i) => i.includes('Error pattern'))).toBe(true);
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
// --------------------------------------------------------------------------
|
|
245
|
+
// 4. CausalStore — edge storage, merging, and chain traversal
|
|
246
|
+
// --------------------------------------------------------------------------
|
|
247
|
+
describe('CausalStore', () => {
|
|
248
|
+
it('should store edges and retrieve by domain', async () => {
|
|
249
|
+
const now = new Date();
|
|
250
|
+
await memory.causal.add({
|
|
251
|
+
id: 'e1',
|
|
252
|
+
cause: 'Missing input validation on payment form',
|
|
253
|
+
effect: 'SQL injection vulnerability in production',
|
|
254
|
+
confidence: 0.6,
|
|
255
|
+
domain: 'security',
|
|
256
|
+
sourceTrajectoryIds: ['t1'],
|
|
257
|
+
observedCount: 1,
|
|
258
|
+
createdAt: now,
|
|
259
|
+
updatedAt: now,
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
await memory.causal.add({
|
|
263
|
+
id: 'e2',
|
|
264
|
+
cause: 'Uncached database query in hot path',
|
|
265
|
+
effect: 'API latency spike under load',
|
|
266
|
+
confidence: 0.7,
|
|
267
|
+
domain: 'performance',
|
|
268
|
+
sourceTrajectoryIds: ['t2'],
|
|
269
|
+
observedCount: 1,
|
|
270
|
+
createdAt: now,
|
|
271
|
+
updatedAt: now,
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
const securityEdges = await memory.causal.getByDomain('security');
|
|
275
|
+
expect(securityEdges.length).toBe(1);
|
|
276
|
+
expect(securityEdges[0].cause).toContain('validation');
|
|
277
|
+
|
|
278
|
+
const allEdges = await memory.causal.getAll();
|
|
279
|
+
expect(allEdges.length).toBe(2);
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
it('should merge similar edges and boost confidence', async () => {
|
|
283
|
+
const now = new Date();
|
|
284
|
+
const baseEdge = {
|
|
285
|
+
cause: 'Missing null check on user input',
|
|
286
|
+
effect: 'Runtime TypeError crash in production',
|
|
287
|
+
confidence: 0.4,
|
|
288
|
+
domain: 'code',
|
|
289
|
+
observedCount: 1,
|
|
290
|
+
createdAt: now,
|
|
291
|
+
updatedAt: now,
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
await memory.causal.add({ ...baseEdge, id: 'e1', sourceTrajectoryIds: ['t1'] });
|
|
295
|
+
await memory.causal.add({
|
|
296
|
+
...baseEdge,
|
|
297
|
+
id: 'e2',
|
|
298
|
+
cause: 'Missing null check on user input field',
|
|
299
|
+
effect: 'Runtime TypeError crash in production server',
|
|
300
|
+
sourceTrajectoryIds: ['t2'],
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
const edges = await memory.causal.getAll();
|
|
304
|
+
// Should have merged into one edge with boosted confidence
|
|
305
|
+
expect(edges.length).toBe(1);
|
|
306
|
+
expect(edges[0].observedCount).toBe(2);
|
|
307
|
+
expect(edges[0].confidence).toBeGreaterThan(0.4);
|
|
308
|
+
expect(edges[0].sourceTrajectoryIds).toContain('t1');
|
|
309
|
+
expect(edges[0].sourceTrajectoryIds).toContain('t2');
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
it('should find similar edges by query', async () => {
|
|
313
|
+
const now = new Date();
|
|
314
|
+
await memory.causal.add({
|
|
315
|
+
id: 'e1',
|
|
316
|
+
cause: 'Authentication token expired',
|
|
317
|
+
effect: 'User session terminated unexpectedly',
|
|
318
|
+
confidence: 0.8,
|
|
319
|
+
domain: 'auth',
|
|
320
|
+
sourceTrajectoryIds: ['t1'],
|
|
321
|
+
observedCount: 3,
|
|
322
|
+
createdAt: now,
|
|
323
|
+
updatedAt: now,
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
const results = await memory.causal.findSimilar('token expiration problem');
|
|
327
|
+
expect(results.length).toBeGreaterThan(0);
|
|
328
|
+
expect(results[0].cause).toContain('token');
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
// --------------------------------------------------------------------------
|
|
333
|
+
// 5. CoherenceChecker — contradiction detection
|
|
334
|
+
// --------------------------------------------------------------------------
|
|
335
|
+
describe('CoherenceChecker', () => {
|
|
336
|
+
it('should detect contradictions between knowledge notes', async () => {
|
|
337
|
+
const checker = createCoherenceChecker({ contradictionThreshold: 0.3 });
|
|
338
|
+
|
|
339
|
+
const noteA: KnowledgeNote = {
|
|
340
|
+
frontmatter: {
|
|
341
|
+
id: 'n1',
|
|
342
|
+
type: 'observation',
|
|
343
|
+
domain: ['code'],
|
|
344
|
+
entities: ['authentication'],
|
|
345
|
+
tags: [],
|
|
346
|
+
confidence: 0.7,
|
|
347
|
+
source: { origin: 'extracted', trajectories: ['t1'] },
|
|
348
|
+
links: [],
|
|
349
|
+
created: new Date().toISOString(),
|
|
350
|
+
updated: new Date().toISOString(),
|
|
351
|
+
},
|
|
352
|
+
body: 'Always use JWT tokens for authentication in production APIs',
|
|
353
|
+
filePath: '/notes/n1.md',
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
const noteB: KnowledgeNote = {
|
|
357
|
+
frontmatter: {
|
|
358
|
+
id: 'n2',
|
|
359
|
+
type: 'observation',
|
|
360
|
+
domain: ['code'],
|
|
361
|
+
entities: ['authentication'],
|
|
362
|
+
tags: [],
|
|
363
|
+
confidence: 0.6,
|
|
364
|
+
source: { origin: 'extracted', trajectories: ['t2'] },
|
|
365
|
+
links: [],
|
|
366
|
+
created: new Date().toISOString(),
|
|
367
|
+
updated: new Date().toISOString(),
|
|
368
|
+
},
|
|
369
|
+
body: 'Never use JWT tokens for authentication in production APIs',
|
|
370
|
+
filePath: '/notes/n2.md',
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
const result = await checker.check(noteB, [noteA]);
|
|
374
|
+
expect(result.isCoherent).toBe(false);
|
|
375
|
+
expect(result.contradictions.length).toBeGreaterThan(0);
|
|
376
|
+
expect(result.contradictions[0].residualEnergy).toBeGreaterThan(0);
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
it('should return coherent for non-contradictory notes', async () => {
|
|
380
|
+
const checker = createCoherenceChecker();
|
|
381
|
+
|
|
382
|
+
const noteA: KnowledgeNote = {
|
|
383
|
+
frontmatter: {
|
|
384
|
+
id: 'n1',
|
|
385
|
+
type: 'observation',
|
|
386
|
+
domain: ['code'],
|
|
387
|
+
entities: ['caching'],
|
|
388
|
+
tags: [],
|
|
389
|
+
confidence: 0.7,
|
|
390
|
+
source: { origin: 'extracted', trajectories: ['t1'] },
|
|
391
|
+
links: [],
|
|
392
|
+
created: new Date().toISOString(),
|
|
393
|
+
updated: new Date().toISOString(),
|
|
394
|
+
},
|
|
395
|
+
body: 'Use Redis for caching API responses',
|
|
396
|
+
filePath: '/notes/n1.md',
|
|
397
|
+
};
|
|
398
|
+
|
|
399
|
+
const noteB: KnowledgeNote = {
|
|
400
|
+
frontmatter: {
|
|
401
|
+
id: 'n2',
|
|
402
|
+
type: 'observation',
|
|
403
|
+
domain: ['code'],
|
|
404
|
+
entities: ['caching'],
|
|
405
|
+
tags: [],
|
|
406
|
+
confidence: 0.6,
|
|
407
|
+
source: { origin: 'extracted', trajectories: ['t2'] },
|
|
408
|
+
links: [],
|
|
409
|
+
created: new Date().toISOString(),
|
|
410
|
+
updated: new Date().toISOString(),
|
|
411
|
+
},
|
|
412
|
+
body: 'Use Redis for caching database query results',
|
|
413
|
+
filePath: '/notes/n2.md',
|
|
414
|
+
};
|
|
415
|
+
|
|
416
|
+
const result = await checker.check(noteB, [noteA]);
|
|
417
|
+
expect(result.isCoherent).toBe(true);
|
|
418
|
+
expect(result.contradictions.length).toBe(0);
|
|
419
|
+
});
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
// --------------------------------------------------------------------------
|
|
423
|
+
// 6. ReasoningBank — K-means++ clustering and retrieval
|
|
424
|
+
// --------------------------------------------------------------------------
|
|
425
|
+
describe('ReasoningBank', () => {
|
|
426
|
+
it('should cluster experiences and enable cluster-based retrieval', () => {
|
|
427
|
+
const bank = createReasoningBank({ minClusterSize: 2, maxClusters: 5 });
|
|
428
|
+
|
|
429
|
+
// Generate enough experiences to form clusters (need diverse topics)
|
|
430
|
+
const experiences = [
|
|
431
|
+
// Auth cluster
|
|
432
|
+
...['Fix login authentication', 'Debug login session issue', 'Authentication token refresh', 'Fix OAuth login flow'].map(
|
|
433
|
+
(desc, i) => ({
|
|
434
|
+
id: `auth-${i}`,
|
|
435
|
+
taskInput: desc,
|
|
436
|
+
solutionOutput: 'Fixed auth issue',
|
|
437
|
+
feedback: 'Success',
|
|
438
|
+
success: true,
|
|
439
|
+
domain: 'code',
|
|
440
|
+
createdAt: new Date(),
|
|
441
|
+
metadata: {},
|
|
442
|
+
trajectoryId: `t-auth-${i}`,
|
|
443
|
+
accessScore: 0.5,
|
|
444
|
+
})
|
|
445
|
+
),
|
|
446
|
+
// Database cluster
|
|
447
|
+
...['Fix database query timeout', 'Optimize slow database query', 'Database connection pooling fix', 'Repair database index'].map(
|
|
448
|
+
(desc, i) => ({
|
|
449
|
+
id: `db-${i}`,
|
|
450
|
+
taskInput: desc,
|
|
451
|
+
solutionOutput: 'Fixed DB issue',
|
|
452
|
+
feedback: 'Success',
|
|
453
|
+
success: true,
|
|
454
|
+
domain: 'code',
|
|
455
|
+
createdAt: new Date(),
|
|
456
|
+
metadata: {},
|
|
457
|
+
trajectoryId: `t-db-${i}`,
|
|
458
|
+
accessScore: 0.5,
|
|
459
|
+
})
|
|
460
|
+
),
|
|
461
|
+
];
|
|
462
|
+
|
|
463
|
+
bank.buildClusters(experiences);
|
|
464
|
+
|
|
465
|
+
expect(bank.clusterCount).toBeGreaterThan(0);
|
|
466
|
+
const clusters = bank.getClusters();
|
|
467
|
+
expect(clusters.length).toBeGreaterThan(0);
|
|
468
|
+
|
|
469
|
+
// Cluster stats should reflect cluster sizes
|
|
470
|
+
const stats = bank.getClusterStats();
|
|
471
|
+
for (const stat of stats) {
|
|
472
|
+
expect(stat.size).toBeGreaterThanOrEqual(2);
|
|
473
|
+
expect(stat.successRate).toBe(1); // All successful
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
// Retrieval: query related to auth should find auth experiences
|
|
477
|
+
const results = bank.findInCluster('login authentication problem');
|
|
478
|
+
expect(results.length).toBeGreaterThan(0);
|
|
479
|
+
// At least one auth-related experience in the results
|
|
480
|
+
expect(results.some((r) => r.experience.taskInput.includes('login') || r.experience.taskInput.includes('auth'))).toBe(true);
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
it('should only cluster successful experiences', () => {
|
|
484
|
+
const bank = createReasoningBank({ minClusterSize: 2 });
|
|
485
|
+
|
|
486
|
+
const experiences = [
|
|
487
|
+
{ id: 's1', taskInput: 'Fix bug A', solutionOutput: 'done', feedback: 'ok', success: true, domain: 'code', createdAt: new Date(), metadata: {}, trajectoryId: 't1', accessScore: 0.5 },
|
|
488
|
+
{ id: 's2', taskInput: 'Fix bug B', solutionOutput: 'done', feedback: 'ok', success: true, domain: 'code', createdAt: new Date(), metadata: {}, trajectoryId: 't2', accessScore: 0.5 },
|
|
489
|
+
{ id: 'f1', taskInput: 'Fix bug C', solutionOutput: 'failed', feedback: 'error', success: false, domain: 'code', createdAt: new Date(), metadata: {}, trajectoryId: 't3', accessScore: 0.5 },
|
|
490
|
+
];
|
|
491
|
+
|
|
492
|
+
bank.buildClusters(experiences);
|
|
493
|
+
|
|
494
|
+
// Failed experience should not appear in any cluster
|
|
495
|
+
const clusters = bank.getClusters();
|
|
496
|
+
for (const cluster of clusters) {
|
|
497
|
+
expect(cluster.experienceIds).not.toContain('f1');
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
it('should track recluster intervals', () => {
|
|
502
|
+
const bank = createReasoningBank({ reclusterInterval: 3 });
|
|
503
|
+
|
|
504
|
+
expect(bank.shouldRecluster()).toBe(false);
|
|
505
|
+
bank.notifyNewExperience();
|
|
506
|
+
bank.notifyNewExperience();
|
|
507
|
+
expect(bank.shouldRecluster()).toBe(false);
|
|
508
|
+
bank.notifyNewExperience();
|
|
509
|
+
expect(bank.shouldRecluster()).toBe(true);
|
|
510
|
+
});
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
// --------------------------------------------------------------------------
|
|
514
|
+
// 7. TemporalCompressor — tier transitions with hysteresis
|
|
515
|
+
// --------------------------------------------------------------------------
|
|
516
|
+
describe('TemporalCompressor', () => {
|
|
517
|
+
it('should classify experiences into tiers by accessScore', async () => {
|
|
518
|
+
const compressor = createTemporalCompressor({
|
|
519
|
+
hotThreshold: 0.5,
|
|
520
|
+
warmThreshold: 0.2,
|
|
521
|
+
evictionThreshold: 0.05,
|
|
522
|
+
});
|
|
523
|
+
|
|
524
|
+
const experiences = [
|
|
525
|
+
{ id: 'hot1', taskInput: 'hot task', solutionOutput: 'result', feedback: 'ok', success: true, domain: 'code', createdAt: new Date(), metadata: {}, trajectoryId: 't1', tier: 'hot' as const, accessScore: 0.8 },
|
|
526
|
+
{ id: 'warm1', taskInput: 'warm task', solutionOutput: 'result', feedback: 'ok', success: true, domain: 'code', createdAt: new Date(), metadata: {}, trajectoryId: 't2', tier: 'hot' as const, accessScore: 0.3 },
|
|
527
|
+
{ id: 'cold1', taskInput: 'cold task', solutionOutput: 'result', feedback: 'ok', success: true, domain: 'code', createdAt: new Date(), metadata: {}, trajectoryId: 't3', tier: 'hot' as const, accessScore: 0.1 },
|
|
528
|
+
];
|
|
529
|
+
|
|
530
|
+
// First pass — marks pending demotion (hysteresis)
|
|
531
|
+
const pass1 = await compressor.compress(experiences);
|
|
532
|
+
// warm1 and cold1 should be marked pending, not yet demoted
|
|
533
|
+
expect(pass1.demoted.length).toBe(0);
|
|
534
|
+
expect(pass1.unchanged).toContain('warm1');
|
|
535
|
+
expect(pass1.unchanged).toContain('cold1');
|
|
536
|
+
|
|
537
|
+
// Second pass — should actually demote
|
|
538
|
+
const pass2 = await compressor.compress(experiences);
|
|
539
|
+
expect(pass2.demoted).toContain('warm1');
|
|
540
|
+
expect(pass2.demoted).toContain('cold1');
|
|
541
|
+
});
|
|
542
|
+
|
|
543
|
+
it('should compress data when demoting to warm', () => {
|
|
544
|
+
const compressor = createTemporalCompressor();
|
|
545
|
+
const exp = {
|
|
546
|
+
id: 'e1',
|
|
547
|
+
taskInput: 'Fix authentication bug',
|
|
548
|
+
solutionOutput: 'Applied fix to auth module\nUpdated token refresh\nAll tests passed',
|
|
549
|
+
feedback: 'Success',
|
|
550
|
+
success: true,
|
|
551
|
+
domain: 'code',
|
|
552
|
+
createdAt: new Date(),
|
|
553
|
+
metadata: { steps: [{ action: 'Read auth.ts', observation: 'found bug' }] },
|
|
554
|
+
trajectoryId: 't1',
|
|
555
|
+
tier: 'hot' as const,
|
|
556
|
+
accessScore: 0.3,
|
|
557
|
+
};
|
|
558
|
+
|
|
559
|
+
const warm = compressor.compressToWarm(exp);
|
|
560
|
+
expect(warm.tier).toBe('warm');
|
|
561
|
+
expect(warm.compressed).toBeDefined();
|
|
562
|
+
expect(warm.compressed!.keySteps.length).toBeGreaterThanOrEqual(0);
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
it('should generate summary when demoting to cold', () => {
|
|
566
|
+
const compressor = createTemporalCompressor();
|
|
567
|
+
const exp = {
|
|
568
|
+
id: 'e1',
|
|
569
|
+
taskInput: 'Fix authentication bug in login form',
|
|
570
|
+
solutionOutput: 'Applied fix to auth module',
|
|
571
|
+
feedback: 'Success',
|
|
572
|
+
success: true,
|
|
573
|
+
domain: 'code',
|
|
574
|
+
createdAt: new Date(),
|
|
575
|
+
metadata: {},
|
|
576
|
+
trajectoryId: 't1',
|
|
577
|
+
tier: 'warm' as const,
|
|
578
|
+
accessScore: 0.1,
|
|
579
|
+
compressed: { keySteps: ['Read auth module', 'Applied fix'], summary: '', originalStepCount: 3 },
|
|
580
|
+
};
|
|
581
|
+
|
|
582
|
+
const cold = compressor.compressToCold(exp);
|
|
583
|
+
expect(cold.tier).toBe('cold');
|
|
584
|
+
expect(cold.compressed!.summary.length).toBeGreaterThan(0);
|
|
585
|
+
expect(cold.compressed!.summary).toContain('code');
|
|
586
|
+
});
|
|
587
|
+
|
|
588
|
+
it('should require hysteresis gap for promotion', async () => {
|
|
589
|
+
const compressor = createTemporalCompressor({
|
|
590
|
+
hotThreshold: 0.5,
|
|
591
|
+
warmThreshold: 0.2,
|
|
592
|
+
hysteresis: 0.05,
|
|
593
|
+
});
|
|
594
|
+
|
|
595
|
+
// Experience at warm tier with score just above warm threshold but below warm+hysteresis
|
|
596
|
+
const exp = {
|
|
597
|
+
id: 'e1',
|
|
598
|
+
taskInput: 'task',
|
|
599
|
+
solutionOutput: 'result',
|
|
600
|
+
feedback: 'ok',
|
|
601
|
+
success: true,
|
|
602
|
+
domain: 'code',
|
|
603
|
+
createdAt: new Date(),
|
|
604
|
+
metadata: {},
|
|
605
|
+
trajectoryId: 't1',
|
|
606
|
+
tier: 'cold' as const,
|
|
607
|
+
accessScore: 0.22, // Above warm threshold (0.2) but below warm+hysteresis (0.25)
|
|
608
|
+
};
|
|
609
|
+
|
|
610
|
+
const result = await compressor.compress([exp]);
|
|
611
|
+
// Should NOT be promoted because accessScore < warmThreshold + hysteresis
|
|
612
|
+
expect(result.promoted.length).toBe(0);
|
|
613
|
+
expect(result.unchanged).toContain('e1');
|
|
614
|
+
});
|
|
615
|
+
});
|
|
616
|
+
|
|
617
|
+
// --------------------------------------------------------------------------
|
|
618
|
+
// 8. MoEGate — learned routing with online gradient
|
|
619
|
+
// --------------------------------------------------------------------------
|
|
620
|
+
describe('MoEGate', () => {
|
|
621
|
+
it('should produce uniform probabilities before training', () => {
|
|
622
|
+
const gate = createMoEGate();
|
|
623
|
+
expect(gate.isTrained).toBe(false);
|
|
624
|
+
|
|
625
|
+
const features = [0.5, 0.3, 0.4, 0.6, 0.5, 0, 1, 0.2];
|
|
626
|
+
const probs = gate.gate(features);
|
|
627
|
+
|
|
628
|
+
// Should be roughly uniform with small random weights
|
|
629
|
+
const values = [...probs.values()];
|
|
630
|
+
const maxDiff = Math.max(...values) - Math.min(...values);
|
|
631
|
+
// Small random weights = near-uniform, but not exact
|
|
632
|
+
expect(maxDiff).toBeLessThan(0.3);
|
|
633
|
+
// All 4 strategies present
|
|
634
|
+
expect(probs.size).toBe(4);
|
|
635
|
+
});
|
|
636
|
+
|
|
637
|
+
it('should shift probabilities after training with reward signal', () => {
|
|
638
|
+
const gate = new MoEGate([...MOE_STRATEGIES], MOE_FEATURE_SIZE);
|
|
639
|
+
const features = [0.5, 0.8, 0.7, 0.9, 0.8, 1, 0, 0.3];
|
|
640
|
+
|
|
641
|
+
// Train: reward "adapt" strategy heavily
|
|
642
|
+
for (let i = 0; i < 50; i++) {
|
|
643
|
+
gate.update(features, 'adapt', 1.0, 0.1);
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
expect(gate.isTrained).toBe(true);
|
|
647
|
+
expect(gate.totalUpdates).toBe(50);
|
|
648
|
+
|
|
649
|
+
const strategy = gate.selectStrategy(features);
|
|
650
|
+
expect(strategy).toBe('adapt');
|
|
651
|
+
});
|
|
652
|
+
|
|
653
|
+
it('should learn domain-specific weights', () => {
|
|
654
|
+
const gate = new MoEGate([...MOE_STRATEGIES], MOE_FEATURE_SIZE);
|
|
655
|
+
const features = [0.5, 0.5, 0.5, 0.5, 0.5, 0, 0, 0.5];
|
|
656
|
+
|
|
657
|
+
// Train 'direct' for domain A
|
|
658
|
+
for (let i = 0; i < 30; i++) {
|
|
659
|
+
gate.update(features, 'direct', 1.0, 0.1, 'domainA');
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
// Train 'explore' for domain B
|
|
663
|
+
for (let i = 0; i < 30; i++) {
|
|
664
|
+
gate.update(features, 'explore', 1.0, 0.1, 'domainB');
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
expect(gate.selectStrategy(features, 'domainA')).toBe('direct');
|
|
668
|
+
expect(gate.selectStrategy(features, 'domainB')).toBe('explore');
|
|
669
|
+
});
|
|
670
|
+
|
|
671
|
+
it('should serialize and restore state', () => {
|
|
672
|
+
const gate = new MoEGate([...MOE_STRATEGIES], MOE_FEATURE_SIZE);
|
|
673
|
+
const features = [0.5, 0.5, 0.5, 0.5, 0.5, 1, 0, 0.5];
|
|
674
|
+
|
|
675
|
+
gate.update(features, 'fallback', 1.0, 0.1, 'test-domain');
|
|
676
|
+
gate.update(features, 'fallback', 1.0, 0.1, 'test-domain');
|
|
677
|
+
|
|
678
|
+
const state = gate.toJSON();
|
|
679
|
+
const restored = MoEGate.fromJSON(state);
|
|
680
|
+
|
|
681
|
+
expect(restored.totalUpdates).toBe(2);
|
|
682
|
+
expect(restored.isTrained).toBe(true);
|
|
683
|
+
expect(restored.selectStrategy(features, 'test-domain')).toBe(
|
|
684
|
+
gate.selectStrategy(features, 'test-domain')
|
|
685
|
+
);
|
|
686
|
+
});
|
|
687
|
+
|
|
688
|
+
it('should extract task features correctly', () => {
|
|
689
|
+
const features = extractTaskFeatures(
|
|
690
|
+
'Fix the authentication bug in the login form',
|
|
691
|
+
{
|
|
692
|
+
experiences: [{ score: 0.8 }, { score: 0.5 }],
|
|
693
|
+
playbooks: [{ score: 0.7, playbook: { confidence: 0.9 } }],
|
|
694
|
+
},
|
|
695
|
+
15
|
|
696
|
+
);
|
|
697
|
+
|
|
698
|
+
expect(features.length).toBe(MOE_FEATURE_SIZE);
|
|
699
|
+
expect(features[2]).toBe(0.8); // best experience match score
|
|
700
|
+
expect(features[3]).toBe(0.7); // best playbook match score
|
|
701
|
+
expect(features[4]).toBe(0.9); // best playbook confidence
|
|
702
|
+
expect(features[5]).toBe(1); // is bug fix ("fix" keyword)
|
|
703
|
+
expect(features[6]).toBe(0); // not a new feature
|
|
704
|
+
});
|
|
705
|
+
});
|
|
706
|
+
|
|
707
|
+
// --------------------------------------------------------------------------
|
|
708
|
+
// 9. InstantLoop — per-trajectory hot-path learning
|
|
709
|
+
// --------------------------------------------------------------------------
|
|
710
|
+
describe('InstantLoop', () => {
|
|
711
|
+
it('should store experience and generate reflexion on successful trajectory', async () => {
|
|
712
|
+
const loop = createInstantLoop(memory, {
|
|
713
|
+
enableReflexion: true,
|
|
714
|
+
maxPlaybookMatches: 3,
|
|
715
|
+
});
|
|
716
|
+
|
|
717
|
+
const traj = makeTrajectory(
|
|
718
|
+
'Fix authentication bug in login form',
|
|
719
|
+
true,
|
|
720
|
+
'code',
|
|
721
|
+
{ solution: 'applied fix to auth module' },
|
|
722
|
+
);
|
|
723
|
+
|
|
724
|
+
const result = await loop.process(traj);
|
|
725
|
+
|
|
726
|
+
expect(result.experienceId).toBeDefined();
|
|
727
|
+
expect(result.durationMs).toBeGreaterThanOrEqual(0);
|
|
728
|
+
|
|
729
|
+
// Should have generated a reflexion episode
|
|
730
|
+
expect(result.reflexionEpisodeId).toBeDefined();
|
|
731
|
+
const episode = await memory.reflexion.getByTrajectory(traj.id);
|
|
732
|
+
expect(episode).toBeDefined();
|
|
733
|
+
expect(episode!.outcome).toBe('success');
|
|
734
|
+
|
|
735
|
+
// Should have extracted at least one causal edge
|
|
736
|
+
expect(result.causalEdgesExtracted).toBeGreaterThan(0);
|
|
737
|
+
const edges = await memory.causal.getAll();
|
|
738
|
+
expect(edges.length).toBeGreaterThan(0);
|
|
739
|
+
|
|
740
|
+
// Experience should be stored
|
|
741
|
+
const expCount = await memory.experiences.count();
|
|
742
|
+
expect(expCount).toBe(1);
|
|
743
|
+
});
|
|
744
|
+
|
|
745
|
+
it('should extract error causal edge from failed trajectory', async () => {
|
|
746
|
+
const loop = createInstantLoop(memory);
|
|
747
|
+
|
|
748
|
+
const traj = makeTrajectory(
|
|
749
|
+
'Implement payment processing',
|
|
750
|
+
false,
|
|
751
|
+
'code',
|
|
752
|
+
{ errorInfo: 'TypeError: Cannot read property amount of undefined' },
|
|
753
|
+
);
|
|
754
|
+
|
|
755
|
+
const result = await loop.process(traj);
|
|
756
|
+
|
|
757
|
+
expect(result.causalEdgesExtracted).toBeGreaterThan(0);
|
|
758
|
+
const edges = await memory.causal.getAll();
|
|
759
|
+
const errorEdge = edges.find((e) => e.effect.includes('TypeError'));
|
|
760
|
+
expect(errorEdge).toBeDefined();
|
|
761
|
+
expect(errorEdge!.confidence).toBe(0.4); // Lower confidence for errors
|
|
762
|
+
});
|
|
763
|
+
});
|
|
764
|
+
|
|
765
|
+
// --------------------------------------------------------------------------
|
|
766
|
+
// 10. UnifiedLearningPipeline — instant + batch + latency
|
|
767
|
+
// --------------------------------------------------------------------------
|
|
768
|
+
describe('UnifiedLearningPipeline orchestration', () => {
|
|
769
|
+
it('should track accumulated count and process trajectories', async () => {
|
|
770
|
+
const pipeline = createUnifiedPipeline(memory, {
|
|
771
|
+
batch: { learning: { minTrajectories: 3 }, energy: { countThreshold: 100 } },
|
|
772
|
+
}, persistence);
|
|
773
|
+
await pipeline.init();
|
|
774
|
+
|
|
775
|
+
expect(pipeline.getAccumulatedCount()).toBe(0);
|
|
776
|
+
|
|
777
|
+
for (let i = 0; i < 3; i++) {
|
|
778
|
+
const traj = makeTrajectory(`Task ${i}`, true);
|
|
779
|
+
await pipeline.processTrajectory(traj);
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
expect(pipeline.getAccumulatedCount()).toBe(3);
|
|
783
|
+
});
|
|
784
|
+
|
|
785
|
+
it('should invoke latency warning callback when budget exceeded', async () => {
|
|
786
|
+
const pipeline = createUnifiedPipeline(memory, {
|
|
787
|
+
maxInstantLatencyMs: -1,
|
|
788
|
+
batch: { learning: {}, energy: { countThreshold: 100 } },
|
|
789
|
+
}, persistence);
|
|
790
|
+
await pipeline.init();
|
|
791
|
+
|
|
792
|
+
let warningMs = -1;
|
|
793
|
+
pipeline.onLatencyWarning((ms) => {
|
|
794
|
+
warningMs = ms;
|
|
795
|
+
});
|
|
796
|
+
|
|
797
|
+
const traj = makeTrajectory('Task', true);
|
|
798
|
+
await pipeline.processTrajectory(traj);
|
|
799
|
+
|
|
800
|
+
expect(warningMs).toBeGreaterThanOrEqual(0);
|
|
801
|
+
});
|
|
802
|
+
});
|
|
803
|
+
|
|
804
|
+
// --------------------------------------------------------------------------
|
|
805
|
+
// 11. Full pipeline: InstantLoop → batch → compression → clustering
|
|
806
|
+
// --------------------------------------------------------------------------
|
|
807
|
+
describe('Full Learning Pipeline Integration', () => {
|
|
808
|
+
it('should process trajectories through unified pipeline (instant + batch)', async () => {
|
|
809
|
+
const pipeline = createUnifiedPipeline(memory, {
|
|
810
|
+
batch: {
|
|
811
|
+
learning: { minTrajectories: 3, minSuccessRate: 0.3, maxExperiences: 100 },
|
|
812
|
+
energy: { countThreshold: 100 }, // Don't auto-trigger batch
|
|
813
|
+
},
|
|
814
|
+
}, persistence);
|
|
815
|
+
await pipeline.init();
|
|
816
|
+
|
|
817
|
+
const trajectories = makeVariedTrajectories(4, 0.75); // 3 success, 1 failure
|
|
818
|
+
|
|
819
|
+
// Process all trajectories through unified pipeline (instant + accumulate)
|
|
820
|
+
for (const traj of trajectories) {
|
|
821
|
+
await pipeline.processTrajectory(traj);
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
// Verify instant loop stored experiences
|
|
825
|
+
const expCount = await memory.experiences.count();
|
|
826
|
+
expect(expCount).toBe(4);
|
|
827
|
+
|
|
828
|
+
// Verify reflexion episodes generated
|
|
829
|
+
const reflexionCount = await memory.reflexion.count();
|
|
830
|
+
expect(reflexionCount).toBe(4);
|
|
831
|
+
|
|
832
|
+
// Verify causal edges extracted
|
|
833
|
+
const causalCount = await memory.causal.count();
|
|
834
|
+
expect(causalCount).toBeGreaterThan(0);
|
|
835
|
+
|
|
836
|
+
// Force batch learning
|
|
837
|
+
const batchResult = await pipeline.runBatch();
|
|
838
|
+
|
|
839
|
+
expect(batchResult.trajectoriesProcessed).toBe(4);
|
|
840
|
+
expect(batchResult.successRate).toBeCloseTo(0.75, 1);
|
|
841
|
+
expect(batchResult.experiencesClustered).toBeGreaterThanOrEqual(0);
|
|
842
|
+
expect(batchResult.experiencesCompressed).toBeDefined();
|
|
843
|
+
|
|
844
|
+
expect(pipeline.getAccumulatedCount()).toBe(0);
|
|
845
|
+
});
|
|
846
|
+
|
|
847
|
+
it('should populate ReasoningBank clusters during batch learning', async () => {
|
|
848
|
+
const pipeline = createUnifiedPipeline(memory, {
|
|
849
|
+
batch: {
|
|
850
|
+
learning: { minTrajectories: 1, maxExperiences: 100 },
|
|
851
|
+
energy: { countThreshold: 100 },
|
|
852
|
+
},
|
|
853
|
+
}, persistence);
|
|
854
|
+
await pipeline.init();
|
|
855
|
+
|
|
856
|
+
const trajectories = makeVariedTrajectories(8, 1.0);
|
|
857
|
+
|
|
858
|
+
for (const traj of trajectories) {
|
|
859
|
+
await pipeline.processTrajectory(traj);
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
const batchResult = await pipeline.runBatch();
|
|
863
|
+
|
|
864
|
+
expect(batchResult.experiencesClustered).toBeGreaterThan(0);
|
|
865
|
+
expect(batchResult.trajectoriesProcessed).toBe(8);
|
|
866
|
+
});
|
|
867
|
+
|
|
868
|
+
it('should include compression results in batch output', async () => {
|
|
869
|
+
const pipeline = createUnifiedPipeline(memory, {
|
|
870
|
+
batch: {
|
|
871
|
+
learning: { minTrajectories: 1, maxExperiences: 100 },
|
|
872
|
+
energy: { countThreshold: 100 },
|
|
873
|
+
},
|
|
874
|
+
}, persistence);
|
|
875
|
+
await pipeline.init();
|
|
876
|
+
|
|
877
|
+
const trajectories = makeVariedTrajectories(5, 0.8);
|
|
878
|
+
|
|
879
|
+
for (const traj of trajectories) {
|
|
880
|
+
await pipeline.processTrajectory(traj);
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
const result = await pipeline.runBatch();
|
|
884
|
+
|
|
885
|
+
expect(result.experiencesCompressed).toHaveProperty('promoted');
|
|
886
|
+
expect(result.experiencesCompressed).toHaveProperty('demoted');
|
|
887
|
+
expect(result.experiencesCompressed).toHaveProperty('evicted');
|
|
888
|
+
expect(result.experiencesCompressed.demoted).toBe(0);
|
|
889
|
+
});
|
|
890
|
+
});
|
|
891
|
+
|
|
892
|
+
// --------------------------------------------------------------------------
|
|
893
|
+
// 12. Cross-module: CausalStore + ReflexionMemory populated by InstantLoop
|
|
894
|
+
// --------------------------------------------------------------------------
|
|
895
|
+
describe('Cross-module: CausalStore + ReflexionMemory via InstantLoop', () => {
|
|
896
|
+
it('should build causal edges from multiple trajectories and query them', async () => {
|
|
897
|
+
const loop = createInstantLoop(memory);
|
|
898
|
+
|
|
899
|
+
// Process several trajectories with related themes
|
|
900
|
+
const authTraj1 = makeTrajectory('Fix OAuth token refresh logic', true, 'auth');
|
|
901
|
+
const authTraj2 = makeTrajectory('Fix OAuth token validation bug', false, 'auth', {
|
|
902
|
+
errorInfo: 'Token validation failed: expired token not rejected',
|
|
903
|
+
});
|
|
904
|
+
const dbTraj = makeTrajectory('Optimize database query performance', true, 'database');
|
|
905
|
+
|
|
906
|
+
await loop.process(authTraj1);
|
|
907
|
+
await loop.process(authTraj2);
|
|
908
|
+
await loop.process(dbTraj);
|
|
909
|
+
|
|
910
|
+
// Query causal store for auth-related edges
|
|
911
|
+
const authEdges = await memory.causal.getByDomain('auth');
|
|
912
|
+
expect(authEdges.length).toBeGreaterThan(0);
|
|
913
|
+
|
|
914
|
+
// Query by similarity
|
|
915
|
+
const tokenEdges = await memory.causal.findSimilar('token authentication issue');
|
|
916
|
+
expect(tokenEdges.length).toBeGreaterThan(0);
|
|
917
|
+
|
|
918
|
+
// Reflexion episodes should exist for all trajectories
|
|
919
|
+
const authEp1 = await memory.reflexion.getByTrajectory(authTraj1.id);
|
|
920
|
+
const authEp2 = await memory.reflexion.getByTrajectory(authTraj2.id);
|
|
921
|
+
expect(authEp1).toBeDefined();
|
|
922
|
+
expect(authEp2).toBeDefined();
|
|
923
|
+
expect(authEp1!.outcome).toBe('success');
|
|
924
|
+
expect(authEp2!.outcome).toBe('failure');
|
|
925
|
+
});
|
|
926
|
+
|
|
927
|
+
it('should retrieve recent reflexion episodes by domain and outcome', async () => {
|
|
928
|
+
const loop = createInstantLoop(memory);
|
|
929
|
+
|
|
930
|
+
// Process mixed trajectories
|
|
931
|
+
await loop.process(makeTrajectory('Fix login form', true, 'frontend'));
|
|
932
|
+
await loop.process(makeTrajectory('Fix signup page', false, 'frontend', { errorInfo: 'test failure' }));
|
|
933
|
+
await loop.process(makeTrajectory('Optimize API query', true, 'backend'));
|
|
934
|
+
|
|
935
|
+
// Get recent episodes for frontend domain
|
|
936
|
+
const frontendEpisodes = await memory.reflexion.getRecent({
|
|
937
|
+
domain: 'frontend',
|
|
938
|
+
});
|
|
939
|
+
expect(frontendEpisodes.length).toBe(2);
|
|
940
|
+
|
|
941
|
+
// Get only failed episodes
|
|
942
|
+
const failedEpisodes = await memory.reflexion.getRecent({
|
|
943
|
+
outcome: 'failure',
|
|
944
|
+
});
|
|
945
|
+
expect(failedEpisodes.length).toBe(1);
|
|
946
|
+
expect(failedEpisodes[0].outcome).toBe('failure');
|
|
947
|
+
});
|
|
948
|
+
});
|
|
949
|
+
|
|
950
|
+
// --------------------------------------------------------------------------
|
|
951
|
+
// 13. MoEGate + extractTaskFeatures + MemorySystem query integration
|
|
952
|
+
// --------------------------------------------------------------------------
|
|
953
|
+
describe('MoEGate + Memory Query Integration', () => {
|
|
954
|
+
it('should extract features from memory context and route tasks', async () => {
|
|
955
|
+
const gate = createMoEGate();
|
|
956
|
+
|
|
957
|
+
// Store some experiences so memory queries return results
|
|
958
|
+
const loop = createInstantLoop(memory);
|
|
959
|
+
await loop.process(makeTrajectory('Fix authentication bug', true, 'code'));
|
|
960
|
+
await loop.process(makeTrajectory('Implement new API endpoint', true, 'code'));
|
|
961
|
+
|
|
962
|
+
// Query memory for a new task
|
|
963
|
+
const queryResult = await memory.queryV2('Fix login authentication error');
|
|
964
|
+
|
|
965
|
+
// Extract features from the memory context
|
|
966
|
+
const features = extractTaskFeatures(
|
|
967
|
+
'Fix login authentication error',
|
|
968
|
+
{
|
|
969
|
+
experiences: queryResult.experiences.map((e) => ({ score: e.score })),
|
|
970
|
+
playbooks: queryResult.playbooks.map((p) => ({
|
|
971
|
+
score: p.score,
|
|
972
|
+
playbook: { confidence: p.playbook.confidence },
|
|
973
|
+
})),
|
|
974
|
+
},
|
|
975
|
+
queryResult.experiences.length,
|
|
976
|
+
);
|
|
977
|
+
|
|
978
|
+
expect(features.length).toBe(MOE_FEATURE_SIZE);
|
|
979
|
+
expect(features[5]).toBe(1); // "fix" → isBugFix
|
|
980
|
+
|
|
981
|
+
// Gate should return a valid strategy
|
|
982
|
+
const strategy = gate.selectStrategy(features);
|
|
983
|
+
expect(MOE_STRATEGIES).toContain(strategy);
|
|
984
|
+
|
|
985
|
+
// After some training, gate should specialize
|
|
986
|
+
gate.update(features, 'adapt', 1.0, 0.1, 'code');
|
|
987
|
+
gate.update(features, 'adapt', 1.0, 0.1, 'code');
|
|
988
|
+
expect(gate.isTrained).toBe(true);
|
|
989
|
+
});
|
|
990
|
+
});
|
|
991
|
+
|
|
992
|
+
// --------------------------------------------------------------------------
|
|
993
|
+
// 14. MemorySystem.storeTrajectory + queryV2 round-trip
|
|
994
|
+
// --------------------------------------------------------------------------
|
|
995
|
+
describe('MemorySystem round-trip', () => {
|
|
996
|
+
it('should store and retrieve experiences via queryV2', async () => {
|
|
997
|
+
const traj = makeTrajectory('Fix CSS layout bug in dashboard component', true, 'frontend');
|
|
998
|
+
const exp = await memory.storeTrajectory(traj);
|
|
999
|
+
|
|
1000
|
+
expect(exp.id).toBeDefined();
|
|
1001
|
+
expect(exp.domain).toBe('frontend');
|
|
1002
|
+
expect(exp.success).toBe(true);
|
|
1003
|
+
|
|
1004
|
+
// Query should return the stored experience
|
|
1005
|
+
const result = await memory.queryV2('CSS layout dashboard');
|
|
1006
|
+
expect(result.experiences.length).toBeGreaterThan(0);
|
|
1007
|
+
expect(result.experiences[0].experience.id).toBe(exp.id);
|
|
1008
|
+
});
|
|
1009
|
+
|
|
1010
|
+
it('should track experience count in stats', async () => {
|
|
1011
|
+
await memory.storeTrajectory(makeTrajectory('Task A', true));
|
|
1012
|
+
await memory.storeTrajectory(makeTrajectory('Task B', false));
|
|
1013
|
+
|
|
1014
|
+
const stats = await memory.getStats();
|
|
1015
|
+
expect(stats.experienceCount).toBe(2);
|
|
1016
|
+
});
|
|
1017
|
+
});
|
|
1018
|
+
|
|
1019
|
+
// --------------------------------------------------------------------------
|
|
1020
|
+
// 15. ReflexionMemory persistence
|
|
1021
|
+
// --------------------------------------------------------------------------
|
|
1022
|
+
describe('ReflexionMemory persistence', () => {
|
|
1023
|
+
it('should persist episodes and retrieve by ID', async () => {
|
|
1024
|
+
const gen = createReflexionGenerator();
|
|
1025
|
+
const traj = makeTrajectory('Implement search feature', true, 'code');
|
|
1026
|
+
const episode = await gen.generate(traj);
|
|
1027
|
+
|
|
1028
|
+
await memory.reflexion.add(episode);
|
|
1029
|
+
|
|
1030
|
+
const retrieved = await memory.reflexion.get(episode.id);
|
|
1031
|
+
expect(retrieved).toBeDefined();
|
|
1032
|
+
expect(retrieved!.trajectoryId).toBe(traj.id);
|
|
1033
|
+
expect(retrieved!.outcome).toBe('success');
|
|
1034
|
+
});
|
|
1035
|
+
});
|
|
1036
|
+
|
|
1037
|
+
// --------------------------------------------------------------------------
|
|
1038
|
+
// 16. Full data flow: trajectory → all subsystems
|
|
1039
|
+
// --------------------------------------------------------------------------
|
|
1040
|
+
describe('Full data flow smoke test', () => {
|
|
1041
|
+
it('should exercise every Phase 0-5 subsystem in sequence', async () => {
|
|
1042
|
+
// Phase 0: PartitionedStore and InvertedIndex (standalone)
|
|
1043
|
+
const idx = new InvertedIndex();
|
|
1044
|
+
idx.add('doc1', 'authentication token refresh');
|
|
1045
|
+
expect(idx.getCandidates('auth token').length).toBeGreaterThan(0);
|
|
1046
|
+
|
|
1047
|
+
// Phase 1+2: UnifiedLearningPipeline processes trajectories (instant + accumulate)
|
|
1048
|
+
const pipeline = createUnifiedPipeline(memory, {
|
|
1049
|
+
features: { reflexion: true },
|
|
1050
|
+
batch: {
|
|
1051
|
+
learning: { minTrajectories: 2, maxExperiences: 100 },
|
|
1052
|
+
energy: { countThreshold: 100 }, // Don't auto-trigger batch
|
|
1053
|
+
},
|
|
1054
|
+
}, persistence);
|
|
1055
|
+
await pipeline.init();
|
|
1056
|
+
|
|
1057
|
+
const traj1 = makeTrajectory('Fix authentication token refresh bug', true, 'auth');
|
|
1058
|
+
const traj2 = makeTrajectory('Implement user profile endpoint', true, 'api');
|
|
1059
|
+
const traj3 = makeTrajectory('Fix database connection pool leak', false, 'database', {
|
|
1060
|
+
errorInfo: 'Connection pool exhausted: max connections reached',
|
|
1061
|
+
});
|
|
1062
|
+
|
|
1063
|
+
const r1 = await pipeline.processTrajectory(traj1);
|
|
1064
|
+
const r2 = await pipeline.processTrajectory(traj2);
|
|
1065
|
+
const r3 = await pipeline.processTrajectory(traj3);
|
|
1066
|
+
|
|
1067
|
+
// Verify InstantLoop results
|
|
1068
|
+
expect(r1.instantLoop.experienceId).toBeDefined();
|
|
1069
|
+
expect(r1.instantLoop.reflexionEpisodeId).toBeDefined();
|
|
1070
|
+
expect(r2.instantLoop.causalEdgesExtracted).toBeGreaterThan(0);
|
|
1071
|
+
expect(r3.instantLoop.causalEdgesExtracted).toBeGreaterThan(0);
|
|
1072
|
+
|
|
1073
|
+
// Force batch
|
|
1074
|
+
const batchResult = await pipeline.runBatch();
|
|
1075
|
+
|
|
1076
|
+
expect(batchResult.trajectoriesProcessed).toBe(3);
|
|
1077
|
+
expect(batchResult.experiencesClustered).toBeGreaterThanOrEqual(0);
|
|
1078
|
+
expect(typeof batchResult.experiencesCompressed.promoted).toBe('number');
|
|
1079
|
+
expect(typeof batchResult.experiencesCompressed.demoted).toBe('number');
|
|
1080
|
+
expect(typeof batchResult.experiencesCompressed.evicted).toBe('number');
|
|
1081
|
+
|
|
1082
|
+
// Phase 3: CoherenceChecker (standalone)
|
|
1083
|
+
const checker = createCoherenceChecker();
|
|
1084
|
+
const noteA = createObservation({
|
|
1085
|
+
title: 'connection-pool',
|
|
1086
|
+
body: 'Always use connection pooling for database access',
|
|
1087
|
+
domain: ['database'],
|
|
1088
|
+
entities: ['connection-pool'],
|
|
1089
|
+
confidence: 0.7,
|
|
1090
|
+
source: { origin: 'extracted', trajectories: [traj3.id] },
|
|
1091
|
+
});
|
|
1092
|
+
const noteB = createObservation({
|
|
1093
|
+
title: 'connection-pool',
|
|
1094
|
+
body: 'Avoid connection pooling for database access',
|
|
1095
|
+
domain: ['database'],
|
|
1096
|
+
entities: ['connection-pool'],
|
|
1097
|
+
confidence: 0.5,
|
|
1098
|
+
source: { origin: 'extracted', trajectories: ['other'] },
|
|
1099
|
+
});
|
|
1100
|
+
const coherenceResult = await checker.check(noteB, [noteA]);
|
|
1101
|
+
// "Always" vs "Avoid" should flag contradiction
|
|
1102
|
+
expect(coherenceResult.isCoherent).toBe(false);
|
|
1103
|
+
|
|
1104
|
+
// Phase 4: MoEGate routing
|
|
1105
|
+
const gate = createMoEGate();
|
|
1106
|
+
const queryResult = await memory.queryV2('Fix database connection issue');
|
|
1107
|
+
const features = extractTaskFeatures(
|
|
1108
|
+
'Fix database connection issue',
|
|
1109
|
+
{
|
|
1110
|
+
experiences: queryResult.experiences.map((e) => ({ score: e.score })),
|
|
1111
|
+
playbooks: queryResult.playbooks.map((p) => ({
|
|
1112
|
+
score: p.score,
|
|
1113
|
+
playbook: { confidence: p.playbook.confidence },
|
|
1114
|
+
})),
|
|
1115
|
+
},
|
|
1116
|
+
queryResult.experiences.length,
|
|
1117
|
+
);
|
|
1118
|
+
const strategy = gate.selectStrategy(features);
|
|
1119
|
+
expect(MOE_STRATEGIES).toContain(strategy);
|
|
1120
|
+
|
|
1121
|
+
// Phase 5: TemporalCompressor (standalone verification)
|
|
1122
|
+
const compressor = createTemporalCompressor();
|
|
1123
|
+
const allExperiences = await memory.experiences.getAll();
|
|
1124
|
+
const compressionResult = await compressor.compress(allExperiences);
|
|
1125
|
+
expect(compressionResult).toHaveProperty('promoted');
|
|
1126
|
+
expect(compressionResult).toHaveProperty('demoted');
|
|
1127
|
+
expect(compressionResult).toHaveProperty('evicted');
|
|
1128
|
+
expect(compressionResult).toHaveProperty('unchanged');
|
|
1129
|
+
|
|
1130
|
+
// Phase 4 (CausalStore): query causal edges
|
|
1131
|
+
const edges = await memory.causal.findSimilar('database connection error');
|
|
1132
|
+
expect(edges.length).toBeGreaterThan(0);
|
|
1133
|
+
|
|
1134
|
+
// ReflexionMemory: verify all episodes stored
|
|
1135
|
+
const totalReflexions = await memory.reflexion.count();
|
|
1136
|
+
expect(totalReflexions).toBe(3);
|
|
1137
|
+
|
|
1138
|
+
// Final stats
|
|
1139
|
+
const stats = await memory.getStats();
|
|
1140
|
+
expect(stats.experienceCount).toBeGreaterThanOrEqual(3);
|
|
1141
|
+
});
|
|
1142
|
+
});
|
|
1143
|
+
});
|