cognitive-core 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +233 -0
- package/README.md +370 -54
- package/dist/atlas.d.ts +10 -10
- package/dist/atlas.d.ts.map +1 -1
- package/dist/atlas.js +79 -48
- package/dist/atlas.js.map +1 -1
- package/dist/bin/cli-utils.d.ts +37 -0
- package/dist/bin/cli-utils.d.ts.map +1 -0
- package/dist/bin/cli-utils.js +176 -0
- package/dist/bin/cli-utils.js.map +1 -0
- package/dist/bin/cognitive-core.d.ts +2 -12
- package/dist/bin/cognitive-core.d.ts.map +1 -1
- package/dist/bin/cognitive-core.js +76 -351
- package/dist/bin/cognitive-core.js.map +1 -1
- package/dist/bin/commands/kb.d.ts +6 -0
- package/dist/bin/commands/kb.d.ts.map +1 -0
- package/dist/bin/commands/kb.js +240 -0
- package/dist/bin/commands/kb.js.map +1 -0
- package/dist/bin/commands/learn.d.ts +6 -0
- package/dist/bin/commands/learn.d.ts.map +1 -0
- package/dist/bin/commands/learn.js +91 -0
- package/dist/bin/commands/learn.js.map +1 -0
- package/dist/bin/commands/legacy.d.ts +12 -0
- package/dist/bin/commands/legacy.d.ts.map +1 -0
- package/dist/bin/commands/legacy.js +142 -0
- package/dist/bin/commands/legacy.js.map +1 -0
- package/dist/bin/commands/run.d.ts +3 -0
- package/dist/bin/commands/run.d.ts.map +1 -0
- package/dist/bin/commands/run.js +99 -0
- package/dist/bin/commands/run.js.map +1 -0
- package/dist/bin/commands/sessions.d.ts +9 -0
- package/dist/bin/commands/sessions.d.ts.map +1 -0
- package/dist/bin/commands/sessions.js +183 -0
- package/dist/bin/commands/sessions.js.map +1 -0
- package/dist/bin/commands/skills.d.ts +6 -0
- package/dist/bin/commands/skills.d.ts.map +1 -0
- package/dist/bin/commands/skills.js +135 -0
- package/dist/bin/commands/skills.js.map +1 -0
- package/dist/embeddings/index.d.ts +1 -0
- package/dist/embeddings/index.d.ts.map +1 -1
- package/dist/embeddings/index.js +2 -0
- package/dist/embeddings/index.js.map +1 -1
- package/dist/embeddings/inverted-index.d.ts +47 -0
- package/dist/embeddings/inverted-index.d.ts.map +1 -0
- package/dist/embeddings/inverted-index.js +122 -0
- package/dist/embeddings/inverted-index.js.map +1 -0
- package/dist/embeddings/manager.d.ts +3 -1
- package/dist/embeddings/manager.d.ts.map +1 -1
- package/dist/embeddings/manager.js +12 -7
- package/dist/embeddings/manager.js.map +1 -1
- package/dist/embeddings/vector-store.d.ts +7 -3
- package/dist/embeddings/vector-store.d.ts.map +1 -1
- package/dist/embeddings/vector-store.js +22 -6
- package/dist/embeddings/vector-store.js.map +1 -1
- package/dist/factory.d.ts +11 -12
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +20 -7
- package/dist/factory.js.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -5
- package/dist/index.js.map +1 -1
- package/dist/learning/analyzer.d.ts.map +1 -1
- package/dist/learning/analyzer.js +17 -35
- package/dist/learning/analyzer.js.map +1 -1
- package/dist/learning/energy-evaluator.d.ts +128 -0
- package/dist/learning/energy-evaluator.d.ts.map +1 -0
- package/dist/learning/energy-evaluator.js +175 -0
- package/dist/learning/energy-evaluator.js.map +1 -0
- package/dist/learning/healing-orchestrator.d.ts +182 -0
- package/dist/learning/healing-orchestrator.d.ts.map +1 -0
- package/dist/learning/healing-orchestrator.js +250 -0
- package/dist/learning/healing-orchestrator.js.map +1 -0
- package/dist/learning/index.d.ts +7 -2
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +13 -2
- package/dist/learning/index.js.map +1 -1
- package/dist/learning/instant-loop.d.ts +87 -0
- package/dist/learning/instant-loop.d.ts.map +1 -0
- package/dist/learning/instant-loop.js +264 -0
- package/dist/learning/instant-loop.js.map +1 -0
- package/dist/learning/loop-coordinator.d.ts +61 -0
- package/dist/learning/loop-coordinator.d.ts.map +1 -0
- package/dist/learning/loop-coordinator.js +96 -0
- package/dist/learning/loop-coordinator.js.map +1 -0
- package/dist/learning/maintenance-scheduler.d.ts +141 -0
- package/dist/learning/maintenance-scheduler.d.ts.map +1 -0
- package/dist/learning/maintenance-scheduler.js +186 -0
- package/dist/learning/maintenance-scheduler.js.map +1 -0
- package/dist/learning/meta-learner.d.ts.map +1 -1
- package/dist/learning/meta-learner.js +4 -21
- package/dist/learning/meta-learner.js.map +1 -1
- package/dist/learning/pipeline.d.ts +31 -4
- package/dist/learning/pipeline.d.ts.map +1 -1
- package/dist/learning/pipeline.js +64 -12
- package/dist/learning/pipeline.js.map +1 -1
- package/dist/learning/reflexion-generator.d.ts +64 -0
- package/dist/learning/reflexion-generator.d.ts.map +1 -0
- package/dist/learning/reflexion-generator.js +194 -0
- package/dist/learning/reflexion-generator.js.map +1 -0
- package/dist/learning/trajectory-sources/entire.d.ts +8 -5
- package/dist/learning/trajectory-sources/entire.d.ts.map +1 -1
- package/dist/learning/trajectory-sources/entire.js +13 -6
- package/dist/learning/trajectory-sources/entire.js.map +1 -1
- package/dist/learning/trajectory-sources/index.d.ts +1 -1
- package/dist/learning/trajectory-sources/index.d.ts.map +1 -1
- package/dist/learning/trajectory-sources/index.js +1 -1
- package/dist/learning/trajectory-sources/index.js.map +1 -1
- package/dist/learning/trajectory-sources/pipeline.d.ts +4 -4
- package/dist/learning/trajectory-sources/pipeline.d.ts.map +1 -1
- package/dist/learning/trajectory-sources/pipeline.js +2 -2
- package/dist/learning/trajectory-sources/pipeline.js.map +1 -1
- package/dist/learning/unified-pipeline.d.ts +281 -0
- package/dist/learning/unified-pipeline.d.ts.map +1 -0
- package/dist/learning/unified-pipeline.js +637 -0
- package/dist/learning/unified-pipeline.js.map +1 -0
- package/dist/memory/candidate-retrieval.d.ts +43 -0
- package/dist/memory/candidate-retrieval.d.ts.map +1 -0
- package/dist/memory/candidate-retrieval.js +41 -0
- package/dist/memory/candidate-retrieval.js.map +1 -0
- package/dist/memory/causal-store.d.ts +97 -0
- package/dist/memory/causal-store.d.ts.map +1 -0
- package/dist/memory/causal-store.js +209 -0
- package/dist/memory/causal-store.js.map +1 -0
- package/dist/memory/coherence.d.ts +71 -0
- package/dist/memory/coherence.d.ts.map +1 -0
- package/dist/memory/coherence.js +176 -0
- package/dist/memory/coherence.js.map +1 -0
- package/dist/memory/experience.d.ts +39 -6
- package/dist/memory/experience.d.ts.map +1 -1
- package/dist/memory/experience.js +193 -49
- package/dist/memory/experience.js.map +1 -1
- package/dist/memory/index.d.ts +7 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +12 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/knowledge-bank.d.ts +14 -0
- package/dist/memory/knowledge-bank.d.ts.map +1 -1
- package/dist/memory/knowledge-bank.js +45 -0
- package/dist/memory/knowledge-bank.js.map +1 -1
- package/dist/memory/meta.d.ts +7 -8
- package/dist/memory/meta.d.ts.map +1 -1
- package/dist/memory/meta.js +73 -79
- package/dist/memory/meta.js.map +1 -1
- package/dist/memory/playbook.d.ts +26 -9
- package/dist/memory/playbook.d.ts.map +1 -1
- package/dist/memory/playbook.js +198 -74
- package/dist/memory/playbook.js.map +1 -1
- package/dist/memory/reasoning-bank.d.ts +130 -0
- package/dist/memory/reasoning-bank.d.ts.map +1 -0
- package/dist/memory/reasoning-bank.js +342 -0
- package/dist/memory/reasoning-bank.js.map +1 -0
- package/dist/memory/reflexion.d.ts +59 -0
- package/dist/memory/reflexion.d.ts.map +1 -0
- package/dist/memory/reflexion.js +96 -0
- package/dist/memory/reflexion.js.map +1 -0
- package/dist/memory/system.d.ts +7 -2
- package/dist/memory/system.d.ts.map +1 -1
- package/dist/memory/system.js +19 -7
- package/dist/memory/system.js.map +1 -1
- package/dist/memory/temporal-compressor.d.ts +126 -0
- package/dist/memory/temporal-compressor.d.ts.map +1 -0
- package/dist/memory/temporal-compressor.js +335 -0
- package/dist/memory/temporal-compressor.js.map +1 -0
- package/dist/persistence/index.d.ts +11 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +11 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/migrator.d.ts +40 -0
- package/dist/persistence/migrator.d.ts.map +1 -0
- package/dist/persistence/migrator.js +238 -0
- package/dist/persistence/migrator.js.map +1 -0
- package/dist/persistence/serializers.d.ts +45 -0
- package/dist/persistence/serializers.d.ts.map +1 -0
- package/dist/persistence/serializers.js +80 -0
- package/dist/persistence/serializers.js.map +1 -0
- package/dist/persistence/sqlite-persistence.d.ts +228 -0
- package/dist/persistence/sqlite-persistence.d.ts.map +1 -0
- package/dist/persistence/sqlite-persistence.js +588 -0
- package/dist/persistence/sqlite-persistence.js.map +1 -0
- package/dist/runtime/flows/learning.d.ts +10 -12
- package/dist/runtime/flows/learning.d.ts.map +1 -1
- package/dist/runtime/flows/learning.js +10 -23
- package/dist/runtime/flows/learning.js.map +1 -1
- package/dist/search/index.d.ts +1 -0
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +2 -0
- package/dist/search/index.js.map +1 -1
- package/dist/search/moe-gate.d.ts +124 -0
- package/dist/search/moe-gate.d.ts.map +1 -0
- package/dist/search/moe-gate.js +234 -0
- package/dist/search/moe-gate.js.map +1 -0
- package/dist/search/router.d.ts +32 -2
- package/dist/search/router.d.ts.map +1 -1
- package/dist/search/router.js +87 -4
- package/dist/search/router.js.map +1 -1
- package/dist/session-bank/git-reader.d.ts +9 -4
- package/dist/session-bank/git-reader.d.ts.map +1 -1
- package/dist/session-bank/git-reader.js +22 -15
- package/dist/session-bank/git-reader.js.map +1 -1
- package/dist/session-bank/index.d.ts +2 -2
- package/dist/session-bank/index.d.ts.map +1 -1
- package/dist/session-bank/index.js +2 -2
- package/dist/session-bank/index.js.map +1 -1
- package/dist/session-bank/parser.d.ts +16 -5
- package/dist/session-bank/parser.d.ts.map +1 -1
- package/dist/session-bank/parser.js +187 -80
- package/dist/session-bank/parser.js.map +1 -1
- package/dist/session-bank/session-bank.d.ts +5 -0
- package/dist/session-bank/session-bank.d.ts.map +1 -1
- package/dist/session-bank/session-bank.js +30 -9
- package/dist/session-bank/session-bank.js.map +1 -1
- package/dist/session-bank/types.d.ts +4 -1
- package/dist/session-bank/types.d.ts.map +1 -1
- package/dist/session-bank/types.js +3 -3
- package/dist/session-bank/types.js.map +1 -1
- package/dist/surfacing/skill-publisher.d.ts.map +1 -1
- package/dist/surfacing/skill-publisher.js +15 -43
- package/dist/surfacing/skill-publisher.js.map +1 -1
- package/dist/surfacing/sqlite-storage-adapter.d.ts.map +1 -1
- package/dist/surfacing/sqlite-storage-adapter.js +13 -21
- package/dist/surfacing/sqlite-storage-adapter.js.map +1 -1
- package/dist/types/config.d.ts +100 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +27 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/memory.d.ts +52 -0
- package/dist/types/memory.d.ts.map +1 -1
- package/dist/types/memory.js +13 -0
- package/dist/types/memory.js.map +1 -1
- package/dist/types/playbook.d.ts +4 -0
- package/dist/types/playbook.d.ts.map +1 -1
- package/dist/types/playbook.js.map +1 -1
- package/dist/utils/error-classifier.d.ts +30 -0
- package/dist/utils/error-classifier.d.ts.map +1 -0
- package/dist/utils/error-classifier.js +85 -0
- package/dist/utils/error-classifier.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/partitioned-store.d.ts +93 -0
- package/dist/utils/partitioned-store.d.ts.map +1 -0
- package/dist/utils/partitioned-store.js +251 -0
- package/dist/utils/partitioned-store.js.map +1 -0
- package/dist/utils/trajectory-helpers.d.ts +39 -0
- package/dist/utils/trajectory-helpers.d.ts.map +1 -0
- package/dist/utils/trajectory-helpers.js +57 -0
- package/dist/utils/trajectory-helpers.js.map +1 -0
- package/dist/workspace/runner.d.ts +3 -4
- package/dist/workspace/runner.d.ts.map +1 -1
- package/dist/workspace/runner.js.map +1 -1
- package/dist/workspace/types.d.ts +9 -2
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/types.js.map +1 -1
- package/package.json +6 -4
- package/references/sessionlog/.husky/pre-commit +1 -0
- package/references/sessionlog/.lintstagedrc.json +4 -0
- package/references/sessionlog/.prettierignore +4 -0
- package/references/sessionlog/.prettierrc.json +11 -0
- package/references/sessionlog/LICENSE +21 -0
- package/references/sessionlog/README.md +453 -0
- package/references/sessionlog/eslint.config.js +58 -0
- package/references/sessionlog/package-lock.json +3672 -0
- package/references/sessionlog/package.json +65 -0
- package/references/sessionlog/src/__tests__/agent-hooks.test.ts +570 -0
- package/references/sessionlog/src/__tests__/agent-registry.test.ts +127 -0
- package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +225 -0
- package/references/sessionlog/src/__tests__/claude-generator.test.ts +46 -0
- package/references/sessionlog/src/__tests__/commit-msg.test.ts +86 -0
- package/references/sessionlog/src/__tests__/cursor-agent.test.ts +224 -0
- package/references/sessionlog/src/__tests__/e2e-live.test.ts +890 -0
- package/references/sessionlog/src/__tests__/event-log.test.ts +183 -0
- package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +105 -0
- package/references/sessionlog/src/__tests__/gemini-agent.test.ts +375 -0
- package/references/sessionlog/src/__tests__/git-hooks.test.ts +78 -0
- package/references/sessionlog/src/__tests__/hook-managers.test.ts +121 -0
- package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +759 -0
- package/references/sessionlog/src/__tests__/opencode-agent.test.ts +338 -0
- package/references/sessionlog/src/__tests__/redaction.test.ts +136 -0
- package/references/sessionlog/src/__tests__/session-repo.test.ts +353 -0
- package/references/sessionlog/src/__tests__/session-store.test.ts +166 -0
- package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +466 -0
- package/references/sessionlog/src/__tests__/skill-live.test.ts +461 -0
- package/references/sessionlog/src/__tests__/summarize.test.ts +348 -0
- package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +610 -0
- package/references/sessionlog/src/__tests__/task-plan-live.test.ts +632 -0
- package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +121 -0
- package/references/sessionlog/src/__tests__/types.test.ts +166 -0
- package/references/sessionlog/src/__tests__/utils.test.ts +333 -0
- package/references/sessionlog/src/__tests__/validation.test.ts +103 -0
- package/references/sessionlog/src/__tests__/worktree.test.ts +57 -0
- package/references/sessionlog/src/agent/agents/claude-code.ts +1089 -0
- package/references/sessionlog/src/agent/agents/cursor.ts +361 -0
- package/references/sessionlog/src/agent/agents/gemini-cli.ts +632 -0
- package/references/sessionlog/src/agent/agents/opencode.ts +540 -0
- package/references/sessionlog/src/agent/registry.ts +143 -0
- package/references/sessionlog/src/agent/session-types.ts +113 -0
- package/references/sessionlog/src/agent/types.ts +220 -0
- package/references/sessionlog/src/cli.ts +597 -0
- package/references/sessionlog/src/commands/clean.ts +133 -0
- package/references/sessionlog/src/commands/disable.ts +84 -0
- package/references/sessionlog/src/commands/doctor.ts +145 -0
- package/references/sessionlog/src/commands/enable.ts +202 -0
- package/references/sessionlog/src/commands/explain.ts +261 -0
- package/references/sessionlog/src/commands/reset.ts +105 -0
- package/references/sessionlog/src/commands/resume.ts +180 -0
- package/references/sessionlog/src/commands/rewind.ts +195 -0
- package/references/sessionlog/src/commands/setup-ccweb.ts +275 -0
- package/references/sessionlog/src/commands/status.ts +172 -0
- package/references/sessionlog/src/config.ts +165 -0
- package/references/sessionlog/src/events/event-log.ts +126 -0
- package/references/sessionlog/src/git-operations.ts +558 -0
- package/references/sessionlog/src/hooks/git-hooks.ts +165 -0
- package/references/sessionlog/src/hooks/lifecycle.ts +391 -0
- package/references/sessionlog/src/index.ts +650 -0
- package/references/sessionlog/src/security/redaction.ts +283 -0
- package/references/sessionlog/src/session/state-machine.ts +452 -0
- package/references/sessionlog/src/store/checkpoint-store.ts +509 -0
- package/references/sessionlog/src/store/native-store.ts +173 -0
- package/references/sessionlog/src/store/provider-types.ts +99 -0
- package/references/sessionlog/src/store/session-store.ts +266 -0
- package/references/sessionlog/src/strategy/attribution.ts +296 -0
- package/references/sessionlog/src/strategy/common.ts +207 -0
- package/references/sessionlog/src/strategy/content-overlap.ts +228 -0
- package/references/sessionlog/src/strategy/manual-commit.ts +988 -0
- package/references/sessionlog/src/strategy/types.ts +279 -0
- package/references/sessionlog/src/summarize/claude-generator.ts +115 -0
- package/references/sessionlog/src/summarize/summarize.ts +432 -0
- package/references/sessionlog/src/types.ts +508 -0
- package/references/sessionlog/src/utils/chunk-files.ts +49 -0
- package/references/sessionlog/src/utils/commit-message.ts +65 -0
- package/references/sessionlog/src/utils/detect-agent.ts +36 -0
- package/references/sessionlog/src/utils/hook-managers.ts +125 -0
- package/references/sessionlog/src/utils/ide-tags.ts +32 -0
- package/references/sessionlog/src/utils/paths.ts +79 -0
- package/references/sessionlog/src/utils/preview-rewind.ts +80 -0
- package/references/sessionlog/src/utils/rewind-conflict.ts +121 -0
- package/references/sessionlog/src/utils/shadow-branch.ts +109 -0
- package/references/sessionlog/src/utils/string-utils.ts +46 -0
- package/references/sessionlog/src/utils/todo-extract.ts +188 -0
- package/references/sessionlog/src/utils/trailers.ts +187 -0
- package/references/sessionlog/src/utils/transcript-parse.ts +177 -0
- package/references/sessionlog/src/utils/transcript-timestamp.ts +59 -0
- package/references/sessionlog/src/utils/tree-ops.ts +219 -0
- package/references/sessionlog/src/utils/tty.ts +72 -0
- package/references/sessionlog/src/utils/validation.ts +65 -0
- package/references/sessionlog/src/utils/worktree.ts +58 -0
- package/references/sessionlog/src/wire-types.ts +59 -0
- package/references/sessionlog/templates/setup-env.sh +153 -0
- package/references/sessionlog/tsconfig.json +18 -0
- package/references/sessionlog/vitest.config.ts +12 -0
- package/references/skill-tree/.sudocode/issues.jsonl +8 -0
- package/references/skill-tree/.sudocode/specs.jsonl +2 -0
- package/references/skill-tree/CLAUDE.md +56 -80
- package/references/skill-tree/README.md +188 -140
- package/references/skill-tree/examples/basic-usage.ts +95 -121
- package/references/skill-tree/package-lock.json +369 -26
- package/references/skill-tree/package.json +1 -1
- package/src/atlas.ts +97 -67
- package/src/bin/cli-utils.ts +220 -0
- package/src/bin/cognitive-core.ts +84 -392
- package/src/bin/commands/kb.ts +266 -0
- package/src/bin/commands/learn.ts +100 -0
- package/src/bin/commands/legacy.ts +182 -0
- package/src/bin/commands/run.ts +113 -0
- package/src/bin/commands/sessions.ts +221 -0
- package/src/bin/commands/skills.ts +146 -0
- package/src/embeddings/index.ts +3 -0
- package/src/embeddings/inverted-index.ts +134 -0
- package/src/embeddings/manager.ts +13 -8
- package/src/embeddings/vector-store.ts +21 -9
- package/src/factory.ts +33 -16
- package/src/index.ts +109 -9
- package/src/learning/analyzer.ts +21 -37
- package/src/learning/energy-evaluator.ts +282 -0
- package/src/learning/healing-orchestrator.ts +383 -0
- package/src/learning/index.ts +65 -9
- package/src/learning/instant-loop.ts +357 -0
- package/src/learning/maintenance-scheduler.ts +271 -0
- package/src/learning/meta-learner.ts +5 -23
- package/src/learning/reflexion-generator.ts +273 -0
- package/src/learning/trajectory-sources/entire.ts +24 -13
- package/src/learning/trajectory-sources/index.ts +2 -2
- package/src/learning/trajectory-sources/pipeline.ts +5 -5
- package/src/learning/unified-pipeline.ts +921 -0
- package/src/memory/candidate-retrieval.ts +71 -0
- package/src/memory/causal-store.ts +273 -0
- package/src/memory/coherence.ts +252 -0
- package/src/memory/experience.ts +217 -50
- package/src/memory/index.ts +43 -0
- package/src/memory/knowledge-bank.ts +57 -0
- package/src/memory/meta.ts +78 -96
- package/src/memory/playbook.ts +239 -75
- package/src/memory/reasoning-bank.ts +458 -0
- package/src/memory/reflexion.ts +122 -0
- package/src/memory/system.ts +21 -5
- package/src/memory/temporal-compressor.ts +409 -0
- package/src/persistence/index.ts +37 -0
- package/src/persistence/migrator.ts +298 -0
- package/src/persistence/serializers.ts +79 -0
- package/src/persistence/sqlite-persistence.ts +925 -0
- package/src/runtime/flows/learning.ts +25 -42
- package/src/search/index.ts +10 -0
- package/src/search/moe-gate.ts +304 -0
- package/src/search/router.ts +111 -4
- package/src/session-bank/git-reader.ts +29 -19
- package/src/session-bank/index.ts +4 -2
- package/src/session-bank/parser.ts +280 -98
- package/src/session-bank/session-bank.ts +33 -12
- package/src/session-bank/types.ts +8 -5
- package/src/surfacing/skill-publisher.ts +17 -49
- package/src/surfacing/sqlite-storage-adapter.ts +16 -32
- package/src/types/config.ts +30 -0
- package/src/types/index.ts +3 -0
- package/src/types/memory.ts +30 -0
- package/src/types/playbook.ts +4 -0
- package/src/utils/error-classifier.ts +113 -0
- package/src/utils/index.ts +18 -0
- package/src/utils/partitioned-store.ts +299 -0
- package/src/utils/trajectory-helpers.ts +79 -0
- package/src/workspace/runner.ts +3 -3
- package/src/workspace/types.ts +10 -2
- package/tests/embeddings/inverted-index.test.ts +138 -0
- package/tests/feature-toggles.test.ts +275 -0
- package/tests/gap-fixes.test.ts +17 -4
- package/tests/integration/cli-e2e.test.ts +621 -0
- package/tests/integration/e2e.test.ts +6 -5
- package/tests/integration/entire-e2e.test.ts +314 -125
- package/tests/integration/persistence-e2e.test.ts +741 -0
- package/tests/integration/phase-e2e.test.ts +1143 -0
- package/tests/integration/session-bank.test.ts +20 -14
- package/tests/integration/sessionlog-e2e.test.ts +329 -0
- package/tests/integration/unified-pipeline-e2e.test.ts +634 -0
- package/tests/learning/analyzer.test.ts +1 -1
- package/tests/learning/energy-evaluator.test.ts +180 -0
- package/tests/learning/entire-trajectory-source.test.ts +25 -25
- package/tests/learning/healing-orchestrator.test.ts +269 -0
- package/tests/learning/instant-loop.test.ts +243 -0
- package/tests/learning/maintenance-scheduler.test.ts +191 -0
- package/tests/learning/reflexion-generator.test.ts +411 -0
- package/tests/learning/trajectory-sources.test.ts +12 -4
- package/tests/learning/unified-pipeline.test.ts +322 -0
- package/tests/mcp/playbook-server.test.ts +6 -1
- package/tests/memory/causal-store.test.ts +276 -0
- package/tests/memory/coherence.test.ts +232 -0
- package/tests/memory/experience.test.ts +8 -3
- package/tests/memory/playbook.test.ts +307 -1
- package/tests/memory/provenance.test.ts +11 -2
- package/tests/memory/reasoning-bank.test.ts +239 -0
- package/tests/memory/reflexion.test.ts +166 -0
- package/tests/memory/skill-exporter.test.ts +6 -1
- package/tests/memory/system.test.ts +6 -1
- package/tests/memory/temporal-compressor.test.ts +318 -0
- package/tests/persistence/migrator.test.ts +1009 -0
- package/tests/persistence/sqlite-persistence.test.ts +635 -0
- package/tests/runtime/agent-manager.test.ts +6 -1
- package/tests/runtime/delegate.test.ts +6 -1
- package/tests/search/moe-gate.test.ts +250 -0
- package/tests/search/refinement-loop.test.ts +11 -2
- package/tests/search/router.test.ts +81 -2
- package/tests/session-bank/fixtures/sessionlog-root-metadata.json +16 -0
- package/tests/session-bank/fixtures/sessionlog-session/full.jsonl +6 -0
- package/tests/session-bank/fixtures/sessionlog-session/metadata.json +55 -0
- package/tests/session-bank/git-reader.test.ts +13 -13
- package/tests/session-bank/parser.test.ts +135 -3
- package/tests/session-bank/session-bank.test.ts +1 -1
- package/tests/surfacing/skill-library.test.ts +6 -1
- package/tests/surfacing/skill-publisher.test.ts +24 -58
- package/tests/surfacing/sqlite-storage-adapter.test.ts +11 -23
- package/tests/utils/partitioned-store.test.ts +230 -0
- package/tests/workspace/full-flow.test.ts +10 -4
- package/tests/workspace/runner.test.ts +10 -4
- package/docs/DESIGN-workspace-migration.md +0 -1079
- package/docs/PLAN-agentic-workspace-implementation.md +0 -717
- package/docs/PLAN-graph-migration.md +0 -299
- package/docs/PLAN-session-bank-implementation.md +0 -474
- package/src/learning/pipeline.ts +0 -323
- package/tests/learning/pipeline.test.ts +0 -176
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import {
|
|
3
|
+
MoEGate,
|
|
4
|
+
extractTaskFeatures,
|
|
5
|
+
MOE_FEATURE_SIZE,
|
|
6
|
+
MOE_STRATEGIES,
|
|
7
|
+
} from '../../src/search/moe-gate.js';
|
|
8
|
+
|
|
9
|
+
describe('MoEGate', () => {
|
|
10
|
+
const strategies = [...MOE_STRATEGIES];
|
|
11
|
+
const featureSize = MOE_FEATURE_SIZE;
|
|
12
|
+
|
|
13
|
+
describe('gate produces valid probability distribution', () => {
|
|
14
|
+
it('should produce probabilities that sum to 1', () => {
|
|
15
|
+
const gate = new MoEGate(strategies, featureSize);
|
|
16
|
+
const features = [0.5, 0.3, 0.8, 0.6, 0.9, 1, 0, 0.2];
|
|
17
|
+
|
|
18
|
+
const probs = gate.gate(features);
|
|
19
|
+
|
|
20
|
+
let sum = 0;
|
|
21
|
+
for (const [, prob] of probs) {
|
|
22
|
+
expect(prob).toBeGreaterThanOrEqual(0);
|
|
23
|
+
expect(prob).toBeLessThanOrEqual(1);
|
|
24
|
+
sum += prob;
|
|
25
|
+
}
|
|
26
|
+
expect(sum).toBeCloseTo(1.0, 5);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('should produce one weight per strategy', () => {
|
|
30
|
+
const gate = new MoEGate(strategies, featureSize);
|
|
31
|
+
const features = Array(featureSize).fill(0.5);
|
|
32
|
+
|
|
33
|
+
const probs = gate.gate(features);
|
|
34
|
+
expect(probs.size).toBe(strategies.length);
|
|
35
|
+
|
|
36
|
+
for (const strategy of strategies) {
|
|
37
|
+
expect(probs.has(strategy)).toBe(true);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
describe('cold start produces uniform weights', () => {
|
|
43
|
+
it('should produce near-uniform weights before any updates', () => {
|
|
44
|
+
const gate = new MoEGate(strategies, featureSize);
|
|
45
|
+
const features = Array(featureSize).fill(0.5);
|
|
46
|
+
|
|
47
|
+
const probs = gate.gate(features);
|
|
48
|
+
|
|
49
|
+
const expected = 1 / strategies.length;
|
|
50
|
+
for (const [, prob] of probs) {
|
|
51
|
+
// Near-uniform (within 10% of expected)
|
|
52
|
+
expect(Math.abs(prob - expected)).toBeLessThan(0.1);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('should not be marked as trained initially', () => {
|
|
57
|
+
const gate = new MoEGate(strategies, featureSize);
|
|
58
|
+
expect(gate.isTrained).toBe(false);
|
|
59
|
+
expect(gate.totalUpdates).toBe(0);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe('update shifts weights toward successful strategy', () => {
|
|
64
|
+
it('should increase probability of rewarded strategy', () => {
|
|
65
|
+
const gate = new MoEGate(strategies, featureSize);
|
|
66
|
+
const features = [0.5, 0.3, 0.8, 0.6, 0.9, 1, 0, 0.2];
|
|
67
|
+
|
|
68
|
+
const before = gate.gate(features).get('direct')!;
|
|
69
|
+
|
|
70
|
+
// Repeatedly reward 'direct' strategy
|
|
71
|
+
for (let i = 0; i < 50; i++) {
|
|
72
|
+
gate.update(features, 'direct', 1.0, 0.05);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const after = gate.gate(features).get('direct')!;
|
|
76
|
+
expect(after).toBeGreaterThan(before);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('should decrease probability of failing strategy', () => {
|
|
80
|
+
const gate = new MoEGate(strategies, featureSize);
|
|
81
|
+
const features = [0.5, 0.3, 0.8, 0.6, 0.9, 1, 0, 0.2];
|
|
82
|
+
|
|
83
|
+
// First train 'explore' to have high weight
|
|
84
|
+
for (let i = 0; i < 20; i++) {
|
|
85
|
+
gate.update(features, 'explore', 1.0, 0.05);
|
|
86
|
+
}
|
|
87
|
+
const beforeFail = gate.gate(features).get('explore')!;
|
|
88
|
+
|
|
89
|
+
// Then penalize 'explore' (reward=0)
|
|
90
|
+
for (let i = 0; i < 30; i++) {
|
|
91
|
+
gate.update(features, 'explore', 0.0, 0.05);
|
|
92
|
+
}
|
|
93
|
+
const afterFail = gate.gate(features).get('explore')!;
|
|
94
|
+
|
|
95
|
+
expect(afterFail).toBeLessThan(beforeFail);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('should be marked as trained after updates', () => {
|
|
99
|
+
const gate = new MoEGate(strategies, featureSize);
|
|
100
|
+
gate.update(Array(featureSize).fill(0.5), 'direct', 1.0);
|
|
101
|
+
expect(gate.isTrained).toBe(true);
|
|
102
|
+
expect(gate.totalUpdates).toBe(1);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
describe('repeated updates converge', () => {
|
|
107
|
+
it('should converge on the consistently rewarded strategy', () => {
|
|
108
|
+
const gate = new MoEGate(strategies, featureSize);
|
|
109
|
+
const features = [0.5, 0.3, 0.8, 0.6, 0.9, 1, 0, 0.2];
|
|
110
|
+
|
|
111
|
+
// Consistently reward 'adapt'
|
|
112
|
+
for (let i = 0; i < 100; i++) {
|
|
113
|
+
gate.update(features, 'adapt', 1.0, 0.02);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const selected = gate.selectStrategy(features);
|
|
117
|
+
expect(selected).toBe('adapt');
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
describe('domain-specific weights', () => {
|
|
122
|
+
it('should learn different strategies for different domains', () => {
|
|
123
|
+
const gate = new MoEGate(strategies, featureSize);
|
|
124
|
+
const features = [0.5, 0.3, 0.8, 0.6, 0.9, 1, 0, 0.2];
|
|
125
|
+
|
|
126
|
+
// TypeScript domain prefers 'direct'
|
|
127
|
+
for (let i = 0; i < 50; i++) {
|
|
128
|
+
gate.update(features, 'direct', 1.0, 0.05, 'typescript');
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Devops domain prefers 'explore'
|
|
132
|
+
for (let i = 0; i < 50; i++) {
|
|
133
|
+
gate.update(features, 'explore', 1.0, 0.05, 'devops');
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const tsStrategy = gate.selectStrategy(features, 'typescript');
|
|
137
|
+
const devopsStrategy = gate.selectStrategy(features, 'devops');
|
|
138
|
+
|
|
139
|
+
expect(tsStrategy).toBe('direct');
|
|
140
|
+
expect(devopsStrategy).toBe('explore');
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
describe('serialization round-trips correctly', () => {
|
|
145
|
+
it('should produce identical gate output after serialization', () => {
|
|
146
|
+
const gate = new MoEGate(strategies, featureSize);
|
|
147
|
+
const features = [0.5, 0.3, 0.8, 0.6, 0.9, 1, 0, 0.2];
|
|
148
|
+
|
|
149
|
+
// Train it
|
|
150
|
+
for (let i = 0; i < 20; i++) {
|
|
151
|
+
gate.update(features, 'adapt', 1.0, 0.05);
|
|
152
|
+
gate.update(features, 'direct', 0.5, 0.05, 'typescript');
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Serialize and deserialize
|
|
156
|
+
const json = gate.toJSON();
|
|
157
|
+
const restored = MoEGate.fromJSON(json);
|
|
158
|
+
|
|
159
|
+
// Compare outputs
|
|
160
|
+
const originalProbs = gate.gate(features);
|
|
161
|
+
const restoredProbs = restored.gate(features);
|
|
162
|
+
|
|
163
|
+
for (const strategy of strategies) {
|
|
164
|
+
expect(restoredProbs.get(strategy)).toBeCloseTo(
|
|
165
|
+
originalProbs.get(strategy)!,
|
|
166
|
+
10
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
expect(restored.isTrained).toBe(gate.isTrained);
|
|
171
|
+
expect(restored.totalUpdates).toBe(gate.totalUpdates);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('should preserve domain weights across serialization', () => {
|
|
175
|
+
const gate = new MoEGate(strategies, featureSize);
|
|
176
|
+
const features = [0.5, 0.3, 0.8, 0.6, 0.9, 1, 0, 0.2];
|
|
177
|
+
|
|
178
|
+
for (let i = 0; i < 30; i++) {
|
|
179
|
+
gate.update(features, 'direct', 1.0, 0.05, 'typescript');
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const json = gate.toJSON();
|
|
183
|
+
const restored = MoEGate.fromJSON(json);
|
|
184
|
+
|
|
185
|
+
const originalTs = gate.gate(features, 'typescript');
|
|
186
|
+
const restoredTs = restored.gate(features, 'typescript');
|
|
187
|
+
|
|
188
|
+
for (const strategy of strategies) {
|
|
189
|
+
expect(restoredTs.get(strategy)).toBeCloseTo(
|
|
190
|
+
originalTs.get(strategy)!,
|
|
191
|
+
10
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
describe('extractTaskFeatures', () => {
|
|
199
|
+
it('should produce feature vector of correct size', () => {
|
|
200
|
+
const features = extractTaskFeatures(
|
|
201
|
+
'Fix TypeScript type error in user module',
|
|
202
|
+
{ experiences: [], playbooks: [] },
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
expect(features).toHaveLength(MOE_FEATURE_SIZE);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it('should set bug fix indicator for bug-related tasks', () => {
|
|
209
|
+
const features = extractTaskFeatures(
|
|
210
|
+
'Fix the authentication bug in login flow',
|
|
211
|
+
{ experiences: [], playbooks: [] },
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
expect(features[5]).toBe(1); // isBugFix
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('should set new feature indicator for implementation tasks', () => {
|
|
218
|
+
const features = extractTaskFeatures(
|
|
219
|
+
'Implement user profile page with avatar upload',
|
|
220
|
+
{ experiences: [], playbooks: [] },
|
|
221
|
+
);
|
|
222
|
+
|
|
223
|
+
expect(features[6]).toBe(1); // isNewFeature
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
it('should reflect memory context scores', () => {
|
|
227
|
+
const features = extractTaskFeatures(
|
|
228
|
+
'Test task',
|
|
229
|
+
{
|
|
230
|
+
experiences: [{ score: 0.85 }],
|
|
231
|
+
playbooks: [{ score: 0.9, playbook: { confidence: 0.95 } }],
|
|
232
|
+
},
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
expect(features[2]).toBe(0.85); // best experience match
|
|
236
|
+
expect(features[3]).toBe(0.9); // best playbook match
|
|
237
|
+
expect(features[4]).toBe(0.95); // best playbook confidence
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it('should handle empty memory context', () => {
|
|
241
|
+
const features = extractTaskFeatures(
|
|
242
|
+
'Novel task',
|
|
243
|
+
{ experiences: [], playbooks: [] },
|
|
244
|
+
);
|
|
245
|
+
|
|
246
|
+
expect(features[2]).toBe(0); // no experiences
|
|
247
|
+
expect(features[3]).toBe(0); // no playbooks
|
|
248
|
+
expect(features[4]).toBe(0); // no playbook confidence
|
|
249
|
+
});
|
|
250
|
+
});
|
|
@@ -13,6 +13,7 @@ import type { AgentSpawnConfig } from '../../src/runtime/types.js';
|
|
|
13
13
|
import { mkdtemp, rm } from 'node:fs/promises';
|
|
14
14
|
import { join } from 'node:path';
|
|
15
15
|
import { tmpdir } from 'node:os';
|
|
16
|
+
import { createSqlitePersistence } from '../../src/persistence/index.js';
|
|
16
17
|
|
|
17
18
|
describe('RefinementLoop', () => {
|
|
18
19
|
let tempDir: string;
|
|
@@ -20,6 +21,7 @@ describe('RefinementLoop', () => {
|
|
|
20
21
|
let agentManager: AgentManager;
|
|
21
22
|
let mockBackend: MockBackend;
|
|
22
23
|
let refinementLoop: RefinementLoop;
|
|
24
|
+
let persistence: any;
|
|
23
25
|
|
|
24
26
|
const createTestTask = () => createTask({
|
|
25
27
|
domain: 'test',
|
|
@@ -48,7 +50,9 @@ describe('RefinementLoop', () => {
|
|
|
48
50
|
|
|
49
51
|
beforeEach(async () => {
|
|
50
52
|
tempDir = await mkdtemp(join(tmpdir(), 'refinement-loop-test-'));
|
|
51
|
-
|
|
53
|
+
persistence = createSqlitePersistence({ baseDir: tempDir });
|
|
54
|
+
await persistence.init();
|
|
55
|
+
memory = createMemorySystem(persistence, tempDir);
|
|
52
56
|
await memory.init();
|
|
53
57
|
|
|
54
58
|
agentManager = createAgentManager(memory);
|
|
@@ -67,6 +71,7 @@ describe('RefinementLoop', () => {
|
|
|
67
71
|
|
|
68
72
|
afterEach(async () => {
|
|
69
73
|
await memory.close();
|
|
74
|
+
persistence.close();
|
|
70
75
|
await rm(tempDir, { recursive: true, force: true });
|
|
71
76
|
});
|
|
72
77
|
|
|
@@ -432,10 +437,13 @@ describe('createRefinementLoop', () => {
|
|
|
432
437
|
let tempDir: string;
|
|
433
438
|
let memory: MemorySystem;
|
|
434
439
|
let agentManager: AgentManager;
|
|
440
|
+
let persistence: any;
|
|
435
441
|
|
|
436
442
|
beforeEach(async () => {
|
|
437
443
|
tempDir = await mkdtemp(join(tmpdir(), 'create-refinement-test-'));
|
|
438
|
-
|
|
444
|
+
persistence = createSqlitePersistence({ baseDir: tempDir });
|
|
445
|
+
await persistence.init();
|
|
446
|
+
memory = createMemorySystem(persistence, tempDir);
|
|
439
447
|
await memory.init();
|
|
440
448
|
agentManager = createAgentManager(memory);
|
|
441
449
|
agentManager.registerBackend(createMockBackend());
|
|
@@ -443,6 +451,7 @@ describe('createRefinementLoop', () => {
|
|
|
443
451
|
|
|
444
452
|
afterEach(async () => {
|
|
445
453
|
await memory.close();
|
|
454
|
+
persistence.close();
|
|
446
455
|
await rm(tempDir, { recursive: true, force: true });
|
|
447
456
|
});
|
|
448
457
|
|
|
@@ -7,21 +7,26 @@ import type { MetaLearner } from '../../src/learning/meta-learner.js';
|
|
|
7
7
|
import { mkdtemp, rm } from 'node:fs/promises';
|
|
8
8
|
import { join } from 'node:path';
|
|
9
9
|
import { tmpdir } from 'node:os';
|
|
10
|
+
import { createSqlitePersistence } from '../../src/persistence/index.js';
|
|
10
11
|
|
|
11
12
|
describe('TaskRouter', () => {
|
|
12
13
|
let tempDir: string;
|
|
13
14
|
let memory: MemorySystem;
|
|
14
15
|
let router: TaskRouter;
|
|
16
|
+
let persistence: any;
|
|
15
17
|
|
|
16
18
|
beforeEach(async () => {
|
|
17
19
|
tempDir = await mkdtemp(join(tmpdir(), 'router-test-'));
|
|
18
|
-
|
|
20
|
+
persistence = createSqlitePersistence({ baseDir: tempDir });
|
|
21
|
+
await persistence.init();
|
|
22
|
+
memory = createMemorySystem(persistence, tempDir);
|
|
19
23
|
await memory.init();
|
|
20
24
|
router = createRouter(memory);
|
|
21
25
|
});
|
|
22
26
|
|
|
23
27
|
afterEach(async () => {
|
|
24
28
|
await memory.close();
|
|
29
|
+
persistence.close();
|
|
25
30
|
await rm(tempDir, { recursive: true, force: true });
|
|
26
31
|
});
|
|
27
32
|
|
|
@@ -351,6 +356,76 @@ describe('TaskRouter', () => {
|
|
|
351
356
|
});
|
|
352
357
|
});
|
|
353
358
|
|
|
359
|
+
describe('MoE gate integration', () => {
|
|
360
|
+
it('should still select reasonable strategies with uninitialized gate', async () => {
|
|
361
|
+
const task = createTask({
|
|
362
|
+
domain: 'test',
|
|
363
|
+
description: 'A completely new task with no memory',
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
const decision = await router.route(task);
|
|
367
|
+
|
|
368
|
+
// Gate is untrained, should fall back to threshold heuristics
|
|
369
|
+
expect(decision.strategy).toBe('fallback');
|
|
370
|
+
expect(decision.appliedMetaStrategies).toBeUndefined();
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
it('should update gate after trajectory completion', async () => {
|
|
374
|
+
const task = createTask({
|
|
375
|
+
domain: 'typescript',
|
|
376
|
+
description: 'Fix TypeScript error in module',
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
const decision = await router.route(task);
|
|
380
|
+
|
|
381
|
+
// Update gate with outcome
|
|
382
|
+
router.updateGate(task, decision.memoryContext, decision.strategy, 1.0);
|
|
383
|
+
|
|
384
|
+
// Gate should now be trained
|
|
385
|
+
expect(router.getMoEGate().isTrained).toBe(true);
|
|
386
|
+
expect(router.getMoEGate().totalUpdates).toBe(1);
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
it('should use trained gate for routing when updates exist', async () => {
|
|
390
|
+
const features_task = createTask({
|
|
391
|
+
domain: 'typescript',
|
|
392
|
+
description: 'Fix TypeScript type error in user handler module',
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
// Train the gate heavily toward 'adapt' for this feature profile
|
|
396
|
+
const memoryContext = { experiences: [], playbooks: [] };
|
|
397
|
+
for (let i = 0; i < 50; i++) {
|
|
398
|
+
router.updateGate(features_task, memoryContext, 'adapt', 1.0);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
const decision = await router.route(features_task);
|
|
402
|
+
|
|
403
|
+
// With a trained gate, the applied strategies should include 'moe-gate'
|
|
404
|
+
expect(decision.appliedMetaStrategies).toContain('moe-gate');
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
it('should persist and restore gate state', () => {
|
|
408
|
+
const task = createTask({
|
|
409
|
+
domain: 'test',
|
|
410
|
+
description: 'Persistence test task',
|
|
411
|
+
});
|
|
412
|
+
const memoryContext = { experiences: [], playbooks: [] };
|
|
413
|
+
|
|
414
|
+
// Train
|
|
415
|
+
router.updateGate(task, memoryContext, 'direct', 1.0);
|
|
416
|
+
|
|
417
|
+
// Serialize
|
|
418
|
+
const state = router.getMoEGate().toJSON();
|
|
419
|
+
|
|
420
|
+
// Load into fresh router
|
|
421
|
+
const router2 = createRouter(memory);
|
|
422
|
+
router2.loadGateState(state);
|
|
423
|
+
|
|
424
|
+
expect(router2.getMoEGate().isTrained).toBe(true);
|
|
425
|
+
expect(router2.getMoEGate().totalUpdates).toBe(1);
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
|
|
354
429
|
describe('task characteristics extraction', () => {
|
|
355
430
|
it('should identify bug fix tasks', async () => {
|
|
356
431
|
const task = createTask({
|
|
@@ -387,15 +462,19 @@ describe('TaskRouter', () => {
|
|
|
387
462
|
describe('createRouter', () => {
|
|
388
463
|
let tempDir: string;
|
|
389
464
|
let memory: MemorySystem;
|
|
465
|
+
let persistence: any;
|
|
390
466
|
|
|
391
467
|
beforeEach(async () => {
|
|
392
468
|
tempDir = await mkdtemp(join(tmpdir(), 'create-router-test-'));
|
|
393
|
-
|
|
469
|
+
persistence = createSqlitePersistence({ baseDir: tempDir });
|
|
470
|
+
await persistence.init();
|
|
471
|
+
memory = createMemorySystem(persistence, tempDir);
|
|
394
472
|
await memory.init();
|
|
395
473
|
});
|
|
396
474
|
|
|
397
475
|
afterEach(async () => {
|
|
398
476
|
await memory.close();
|
|
477
|
+
persistence.close();
|
|
399
478
|
await rm(tempDir, { recursive: true, force: true });
|
|
400
479
|
});
|
|
401
480
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cliVersion": "opentasks-sessionlog",
|
|
3
|
+
"checkpointID": "c4d5e6f7a8b9",
|
|
4
|
+
"strategy": "manual-commit",
|
|
5
|
+
"branch": "main",
|
|
6
|
+
"checkpointsCount": 3,
|
|
7
|
+
"filesTouched": ["src/api.ts", "tests/api.test.ts"],
|
|
8
|
+
"sessions": [
|
|
9
|
+
{
|
|
10
|
+
"metadata": "1/metadata.json",
|
|
11
|
+
"transcript": "1/full.jsonl",
|
|
12
|
+
"context": "1/context.md",
|
|
13
|
+
"prompt": "1/prompt.txt"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{"type":"user","uuid":"msg-sl-001","message":{"content":"Add input validation to the API endpoint using Zod"}}
|
|
2
|
+
{"type":"assistant","uuid":"msg-sl-002","message":{"content":[{"type":"text","text":"I'll examine the API endpoint first."},{"type":"tool_use","id":"tool-sl-001","name":"Read","input":{"file_path":"/src/api.ts"}}]}}
|
|
3
|
+
{"type":"user","uuid":"msg-sl-003","message":{"content":[{"type":"tool_result","tool_use_id":"tool-sl-001","content":"export function handler(req, res) {\n const body = req.body;\n // TODO: validate\n res.json({ ok: true });\n}"}]}}
|
|
4
|
+
{"type":"assistant","uuid":"msg-sl-004","message":{"content":[{"type":"text","text":"I'll add Zod validation."},{"type":"tool_use","id":"tool-sl-002","name":"Edit","input":{"file_path":"/src/api.ts","old_string":"const body = req.body;","new_string":"const body = schema.parse(req.body);"}}]}}
|
|
5
|
+
{"type":"user","uuid":"msg-sl-005","message":{"content":[{"type":"tool_result","tool_use_id":"tool-sl-002","content":"File edited successfully"}]}}
|
|
6
|
+
{"type":"assistant","uuid":"msg-sl-006","message":{"content":[{"type":"text","text":"Validation added. The endpoint now validates input using the Zod schema before processing."}]}}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cliVersion": "opentasks-sessionlog",
|
|
3
|
+
"checkpointID": "c4d5e6f7a8b9",
|
|
4
|
+
"sessionID": "2026-02-15-aabbccdd-1122-3344-5566-778899aabbcc",
|
|
5
|
+
"strategy": "manual-commit",
|
|
6
|
+
"createdAt": "2026-02-15T09:00:00Z",
|
|
7
|
+
"branch": "main",
|
|
8
|
+
"filesTouched": ["src/api.ts", "tests/api.test.ts"],
|
|
9
|
+
"agent": "Claude Code",
|
|
10
|
+
"turnID": "turn-001",
|
|
11
|
+
"isTask": false,
|
|
12
|
+
"checkpointTranscriptStart": 0,
|
|
13
|
+
"tokenUsage": {
|
|
14
|
+
"inputTokens": 20000,
|
|
15
|
+
"cacheCreationTokens": 3000,
|
|
16
|
+
"cacheReadTokens": 6000,
|
|
17
|
+
"outputTokens": 4000,
|
|
18
|
+
"apiCallCount": 10,
|
|
19
|
+
"subagentTokens": {
|
|
20
|
+
"inputTokens": 2000,
|
|
21
|
+
"cacheCreationTokens": 0,
|
|
22
|
+
"cacheReadTokens": 0,
|
|
23
|
+
"outputTokens": 800,
|
|
24
|
+
"apiCallCount": 3
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"summary": {
|
|
28
|
+
"intent": "Add validation to the API endpoint",
|
|
29
|
+
"outcome": "Added input validation with Zod schema",
|
|
30
|
+
"learnings": {
|
|
31
|
+
"repo": ["API routes use Zod for validation"],
|
|
32
|
+
"code": [
|
|
33
|
+
{
|
|
34
|
+
"path": "src/api.ts",
|
|
35
|
+
"line": 15,
|
|
36
|
+
"finding": "Zod schema must be defined before route handler"
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"workflow": ["Run API tests with --reporter=verbose flag"]
|
|
40
|
+
},
|
|
41
|
+
"friction": ["Had to look up Zod coercion syntax"],
|
|
42
|
+
"openItems": ["Add validation for the PUT endpoint too"]
|
|
43
|
+
},
|
|
44
|
+
"initialAttribution": {
|
|
45
|
+
"calculatedAt": "2026-02-15T09:30:00Z",
|
|
46
|
+
"agentLines": 30,
|
|
47
|
+
"humanAdded": 3,
|
|
48
|
+
"humanModified": 1,
|
|
49
|
+
"humanRemoved": 0,
|
|
50
|
+
"totalCommitted": 34,
|
|
51
|
+
"agentPercentage": 0.88
|
|
52
|
+
},
|
|
53
|
+
"tasks": {},
|
|
54
|
+
"skillsUsed": []
|
|
55
|
+
}
|
|
@@ -3,7 +3,7 @@ import { mkdtemp, rm, readFile } from 'node:fs/promises';
|
|
|
3
3
|
import { tmpdir } from 'node:os';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
5
|
import { execFileSync } from 'node:child_process';
|
|
6
|
-
import {
|
|
6
|
+
import { CheckpointGitReader } from '../../src/session-bank/git-reader.js';
|
|
7
7
|
|
|
8
8
|
const FIXTURES = join(import.meta.dirname, 'fixtures');
|
|
9
9
|
|
|
@@ -126,14 +126,14 @@ async function createFixtureRepo(): Promise<string> {
|
|
|
126
126
|
const orphanCommit = commitTree(tmpDir, rootTree, 'checkpoint data');
|
|
127
127
|
git(tmpDir, [
|
|
128
128
|
'update-ref',
|
|
129
|
-
'refs/heads/
|
|
129
|
+
'refs/heads/sessionlog/checkpoints/v1',
|
|
130
130
|
orphanCommit,
|
|
131
131
|
]);
|
|
132
132
|
|
|
133
133
|
return tmpDir;
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
describe('
|
|
136
|
+
describe('CheckpointGitReader', () => {
|
|
137
137
|
let tmpDir: string;
|
|
138
138
|
|
|
139
139
|
beforeEach(async () => {
|
|
@@ -145,12 +145,12 @@ describe('EntireGitReader', () => {
|
|
|
145
145
|
});
|
|
146
146
|
|
|
147
147
|
it('should detect that the orphan branch exists', async () => {
|
|
148
|
-
const reader = new
|
|
148
|
+
const reader = new CheckpointGitReader({ repoPath: tmpDir });
|
|
149
149
|
expect(await reader.branchExists()).toBe(true);
|
|
150
150
|
});
|
|
151
151
|
|
|
152
152
|
it('should return false for non-existent branch', async () => {
|
|
153
|
-
const reader = new
|
|
153
|
+
const reader = new CheckpointGitReader({
|
|
154
154
|
repoPath: tmpDir,
|
|
155
155
|
branch: 'nonexistent/branch',
|
|
156
156
|
});
|
|
@@ -158,7 +158,7 @@ describe('EntireGitReader', () => {
|
|
|
158
158
|
});
|
|
159
159
|
|
|
160
160
|
it('should list checkpoint paths', async () => {
|
|
161
|
-
const reader = new
|
|
161
|
+
const reader = new CheckpointGitReader({ repoPath: tmpDir });
|
|
162
162
|
const checkpoints = await reader.listCheckpoints();
|
|
163
163
|
|
|
164
164
|
expect(checkpoints).toHaveLength(1);
|
|
@@ -166,7 +166,7 @@ describe('EntireGitReader', () => {
|
|
|
166
166
|
});
|
|
167
167
|
|
|
168
168
|
it('should list session indices', async () => {
|
|
169
|
-
const reader = new
|
|
169
|
+
const reader = new CheckpointGitReader({ repoPath: tmpDir });
|
|
170
170
|
const sessions = await reader.listSessions('a3/b2c4d5e6f7');
|
|
171
171
|
|
|
172
172
|
expect(sessions).toHaveLength(1);
|
|
@@ -174,7 +174,7 @@ describe('EntireGitReader', () => {
|
|
|
174
174
|
});
|
|
175
175
|
|
|
176
176
|
it('should read a file from the orphan branch', async () => {
|
|
177
|
-
const reader = new
|
|
177
|
+
const reader = new CheckpointGitReader({ repoPath: tmpDir });
|
|
178
178
|
const content = await reader.readFile(
|
|
179
179
|
'a3/b2c4d5e6f7/0/metadata.json',
|
|
180
180
|
);
|
|
@@ -185,7 +185,7 @@ describe('EntireGitReader', () => {
|
|
|
185
185
|
});
|
|
186
186
|
|
|
187
187
|
it('should batch-read multiple files', async () => {
|
|
188
|
-
const reader = new
|
|
188
|
+
const reader = new CheckpointGitReader({ repoPath: tmpDir });
|
|
189
189
|
const files = await reader.readFiles([
|
|
190
190
|
'a3/b2c4d5e6f7/0/metadata.json',
|
|
191
191
|
'a3/b2c4d5e6f7/0/full.jsonl',
|
|
@@ -199,13 +199,13 @@ describe('EntireGitReader', () => {
|
|
|
199
199
|
});
|
|
200
200
|
|
|
201
201
|
it('should return null for missing files', async () => {
|
|
202
|
-
const reader = new
|
|
202
|
+
const reader = new CheckpointGitReader({ repoPath: tmpDir });
|
|
203
203
|
const content = await reader.readFileOrNull('does/not/exist');
|
|
204
204
|
expect(content).toBeNull();
|
|
205
205
|
});
|
|
206
206
|
|
|
207
207
|
it('should get the orphan branch HEAD SHA', async () => {
|
|
208
|
-
const reader = new
|
|
208
|
+
const reader = new CheckpointGitReader({ repoPath: tmpDir });
|
|
209
209
|
const sha = await reader.getBranchHead();
|
|
210
210
|
|
|
211
211
|
expect(sha).toBeDefined();
|
|
@@ -213,7 +213,7 @@ describe('EntireGitReader', () => {
|
|
|
213
213
|
});
|
|
214
214
|
|
|
215
215
|
it('should return null for HEAD of non-existent branch', async () => {
|
|
216
|
-
const reader = new
|
|
216
|
+
const reader = new CheckpointGitReader({
|
|
217
217
|
repoPath: tmpDir,
|
|
218
218
|
branch: 'nope',
|
|
219
219
|
});
|
|
@@ -222,7 +222,7 @@ describe('EntireGitReader', () => {
|
|
|
222
222
|
});
|
|
223
223
|
|
|
224
224
|
it('should return empty checkpoints for non-existent branch', async () => {
|
|
225
|
-
const reader = new
|
|
225
|
+
const reader = new CheckpointGitReader({
|
|
226
226
|
repoPath: tmpDir,
|
|
227
227
|
branch: 'nope',
|
|
228
228
|
});
|