cognitive-core 0.1.2 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.json +111 -2
- package/.sessionlog/settings.json +4 -0
- package/CLAUDE.md +233 -0
- package/README.md +370 -54
- package/dist/atlas.d.ts +10 -10
- package/dist/atlas.d.ts.map +1 -1
- package/dist/atlas.js +79 -48
- package/dist/atlas.js.map +1 -1
- package/dist/bin/cli-utils.d.ts +37 -0
- package/dist/bin/cli-utils.d.ts.map +1 -0
- package/dist/bin/cli-utils.js +176 -0
- package/dist/bin/cli-utils.js.map +1 -0
- package/dist/bin/cognitive-core.d.ts +2 -12
- package/dist/bin/cognitive-core.d.ts.map +1 -1
- package/dist/bin/cognitive-core.js +76 -351
- package/dist/bin/cognitive-core.js.map +1 -1
- package/dist/bin/commands/kb.d.ts +6 -0
- package/dist/bin/commands/kb.d.ts.map +1 -0
- package/dist/bin/commands/kb.js +240 -0
- package/dist/bin/commands/kb.js.map +1 -0
- package/dist/bin/commands/learn.d.ts +6 -0
- package/dist/bin/commands/learn.d.ts.map +1 -0
- package/dist/bin/commands/learn.js +91 -0
- package/dist/bin/commands/learn.js.map +1 -0
- package/dist/bin/commands/legacy.d.ts +12 -0
- package/dist/bin/commands/legacy.d.ts.map +1 -0
- package/dist/bin/commands/legacy.js +142 -0
- package/dist/bin/commands/legacy.js.map +1 -0
- package/dist/bin/commands/run.d.ts +3 -0
- package/dist/bin/commands/run.d.ts.map +1 -0
- package/dist/bin/commands/run.js +99 -0
- package/dist/bin/commands/run.js.map +1 -0
- package/dist/bin/commands/sessions.d.ts +9 -0
- package/dist/bin/commands/sessions.d.ts.map +1 -0
- package/dist/bin/commands/sessions.js +183 -0
- package/dist/bin/commands/sessions.js.map +1 -0
- package/dist/bin/commands/skills.d.ts +6 -0
- package/dist/bin/commands/skills.d.ts.map +1 -0
- package/dist/bin/commands/skills.js +135 -0
- package/dist/bin/commands/skills.js.map +1 -0
- package/dist/embeddings/index.d.ts +1 -0
- package/dist/embeddings/index.d.ts.map +1 -1
- package/dist/embeddings/index.js +2 -0
- package/dist/embeddings/index.js.map +1 -1
- package/dist/embeddings/inverted-index.d.ts +47 -0
- package/dist/embeddings/inverted-index.d.ts.map +1 -0
- package/dist/embeddings/inverted-index.js +122 -0
- package/dist/embeddings/inverted-index.js.map +1 -0
- package/dist/embeddings/manager.d.ts +3 -1
- package/dist/embeddings/manager.d.ts.map +1 -1
- package/dist/embeddings/manager.js +12 -7
- package/dist/embeddings/manager.js.map +1 -1
- package/dist/embeddings/vector-store.d.ts +7 -3
- package/dist/embeddings/vector-store.d.ts.map +1 -1
- package/dist/embeddings/vector-store.js +22 -6
- package/dist/embeddings/vector-store.js.map +1 -1
- package/dist/factory.d.ts +11 -12
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +20 -7
- package/dist/factory.js.map +1 -1
- package/dist/index.d.ts +8 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -6
- package/dist/index.js.map +1 -1
- package/dist/learning/analyzer.d.ts.map +1 -1
- package/dist/learning/analyzer.js +17 -35
- package/dist/learning/analyzer.js.map +1 -1
- package/dist/learning/energy-evaluator.d.ts +128 -0
- package/dist/learning/energy-evaluator.d.ts.map +1 -0
- package/dist/learning/energy-evaluator.js +175 -0
- package/dist/learning/energy-evaluator.js.map +1 -0
- package/dist/learning/healing-orchestrator.d.ts +182 -0
- package/dist/learning/healing-orchestrator.d.ts.map +1 -0
- package/dist/learning/healing-orchestrator.js +250 -0
- package/dist/learning/healing-orchestrator.js.map +1 -0
- package/dist/learning/index.d.ts +7 -2
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +13 -2
- package/dist/learning/index.js.map +1 -1
- package/dist/learning/instant-loop.d.ts +87 -0
- package/dist/learning/instant-loop.d.ts.map +1 -0
- package/dist/learning/instant-loop.js +264 -0
- package/dist/learning/instant-loop.js.map +1 -0
- package/dist/learning/loop-coordinator.d.ts +61 -0
- package/dist/learning/loop-coordinator.d.ts.map +1 -0
- package/dist/learning/loop-coordinator.js +96 -0
- package/dist/learning/loop-coordinator.js.map +1 -0
- package/dist/learning/maintenance-scheduler.d.ts +141 -0
- package/dist/learning/maintenance-scheduler.d.ts.map +1 -0
- package/dist/learning/maintenance-scheduler.js +186 -0
- package/dist/learning/maintenance-scheduler.js.map +1 -0
- package/dist/learning/meta-learner.d.ts.map +1 -1
- package/dist/learning/meta-learner.js +4 -21
- package/dist/learning/meta-learner.js.map +1 -1
- package/dist/learning/pipeline.d.ts +31 -4
- package/dist/learning/pipeline.d.ts.map +1 -1
- package/dist/learning/pipeline.js +64 -12
- package/dist/learning/pipeline.js.map +1 -1
- package/dist/learning/reflexion-generator.d.ts +64 -0
- package/dist/learning/reflexion-generator.d.ts.map +1 -0
- package/dist/learning/reflexion-generator.js +194 -0
- package/dist/learning/reflexion-generator.js.map +1 -0
- package/dist/learning/trajectory-sources/entire.d.ts +8 -5
- package/dist/learning/trajectory-sources/entire.d.ts.map +1 -1
- package/dist/learning/trajectory-sources/entire.js +13 -6
- package/dist/learning/trajectory-sources/entire.js.map +1 -1
- package/dist/learning/trajectory-sources/index.d.ts +1 -1
- package/dist/learning/trajectory-sources/index.d.ts.map +1 -1
- package/dist/learning/trajectory-sources/index.js +1 -1
- package/dist/learning/trajectory-sources/index.js.map +1 -1
- package/dist/learning/trajectory-sources/pipeline.d.ts +4 -4
- package/dist/learning/trajectory-sources/pipeline.d.ts.map +1 -1
- package/dist/learning/trajectory-sources/pipeline.js +2 -2
- package/dist/learning/trajectory-sources/pipeline.js.map +1 -1
- package/dist/learning/unified-pipeline.d.ts +311 -0
- package/dist/learning/unified-pipeline.d.ts.map +1 -0
- package/dist/learning/unified-pipeline.js +844 -0
- package/dist/learning/unified-pipeline.js.map +1 -0
- package/dist/memory/candidate-retrieval.d.ts +43 -0
- package/dist/memory/candidate-retrieval.d.ts.map +1 -0
- package/dist/memory/candidate-retrieval.js +43 -0
- package/dist/memory/candidate-retrieval.js.map +1 -0
- package/dist/memory/causal-store.d.ts +97 -0
- package/dist/memory/causal-store.d.ts.map +1 -0
- package/dist/memory/causal-store.js +209 -0
- package/dist/memory/causal-store.js.map +1 -0
- package/dist/memory/coherence.d.ts +71 -0
- package/dist/memory/coherence.d.ts.map +1 -0
- package/dist/memory/coherence.js +176 -0
- package/dist/memory/coherence.js.map +1 -0
- package/dist/memory/experience.d.ts +39 -6
- package/dist/memory/experience.d.ts.map +1 -1
- package/dist/memory/experience.js +193 -49
- package/dist/memory/experience.js.map +1 -1
- package/dist/memory/index.d.ts +7 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +12 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/knowledge-bank.d.ts +14 -0
- package/dist/memory/knowledge-bank.d.ts.map +1 -1
- package/dist/memory/knowledge-bank.js +45 -0
- package/dist/memory/knowledge-bank.js.map +1 -1
- package/dist/memory/meta.d.ts +7 -8
- package/dist/memory/meta.d.ts.map +1 -1
- package/dist/memory/meta.js +73 -79
- package/dist/memory/meta.js.map +1 -1
- package/dist/memory/playbook.d.ts +26 -9
- package/dist/memory/playbook.d.ts.map +1 -1
- package/dist/memory/playbook.js +198 -74
- package/dist/memory/playbook.js.map +1 -1
- package/dist/memory/reasoning-bank.d.ts +130 -0
- package/dist/memory/reasoning-bank.d.ts.map +1 -0
- package/dist/memory/reasoning-bank.js +342 -0
- package/dist/memory/reasoning-bank.js.map +1 -0
- package/dist/memory/reflexion.d.ts +59 -0
- package/dist/memory/reflexion.d.ts.map +1 -0
- package/dist/memory/reflexion.js +96 -0
- package/dist/memory/reflexion.js.map +1 -0
- package/dist/memory/system.d.ts +7 -2
- package/dist/memory/system.d.ts.map +1 -1
- package/dist/memory/system.js +19 -7
- package/dist/memory/system.js.map +1 -1
- package/dist/memory/temporal-compressor.d.ts +126 -0
- package/dist/memory/temporal-compressor.d.ts.map +1 -0
- package/dist/memory/temporal-compressor.js +335 -0
- package/dist/memory/temporal-compressor.js.map +1 -0
- package/dist/persistence/index.d.ts +11 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +11 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/migrator.d.ts +40 -0
- package/dist/persistence/migrator.d.ts.map +1 -0
- package/dist/persistence/migrator.js +238 -0
- package/dist/persistence/migrator.js.map +1 -0
- package/dist/persistence/serializers.d.ts +45 -0
- package/dist/persistence/serializers.d.ts.map +1 -0
- package/dist/persistence/serializers.js +80 -0
- package/dist/persistence/serializers.js.map +1 -0
- package/dist/persistence/sqlite-persistence.d.ts +228 -0
- package/dist/persistence/sqlite-persistence.d.ts.map +1 -0
- package/dist/persistence/sqlite-persistence.js +588 -0
- package/dist/persistence/sqlite-persistence.js.map +1 -0
- package/dist/runtime/flows/learning.d.ts +10 -12
- package/dist/runtime/flows/learning.d.ts.map +1 -1
- package/dist/runtime/flows/learning.js +10 -23
- package/dist/runtime/flows/learning.js.map +1 -1
- package/dist/search/index.d.ts +1 -0
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +2 -0
- package/dist/search/index.js.map +1 -1
- package/dist/search/moe-gate.d.ts +124 -0
- package/dist/search/moe-gate.d.ts.map +1 -0
- package/dist/search/moe-gate.js +234 -0
- package/dist/search/moe-gate.js.map +1 -0
- package/dist/search/router.d.ts +32 -2
- package/dist/search/router.d.ts.map +1 -1
- package/dist/search/router.js +87 -4
- package/dist/search/router.js.map +1 -1
- package/dist/session-bank/git-reader.d.ts +9 -4
- package/dist/session-bank/git-reader.d.ts.map +1 -1
- package/dist/session-bank/git-reader.js +22 -15
- package/dist/session-bank/git-reader.js.map +1 -1
- package/dist/session-bank/index.d.ts +2 -2
- package/dist/session-bank/index.d.ts.map +1 -1
- package/dist/session-bank/index.js +2 -2
- package/dist/session-bank/index.js.map +1 -1
- package/dist/session-bank/parser.d.ts +16 -5
- package/dist/session-bank/parser.d.ts.map +1 -1
- package/dist/session-bank/parser.js +187 -80
- package/dist/session-bank/parser.js.map +1 -1
- package/dist/session-bank/session-bank.d.ts +5 -0
- package/dist/session-bank/session-bank.d.ts.map +1 -1
- package/dist/session-bank/session-bank.js +30 -9
- package/dist/session-bank/session-bank.js.map +1 -1
- package/dist/session-bank/types.d.ts +4 -1
- package/dist/session-bank/types.d.ts.map +1 -1
- package/dist/session-bank/types.js +3 -3
- package/dist/session-bank/types.js.map +1 -1
- package/dist/surfacing/skill-publisher.d.ts.map +1 -1
- package/dist/surfacing/skill-publisher.js +15 -43
- package/dist/surfacing/skill-publisher.js.map +1 -1
- package/dist/surfacing/sqlite-storage-adapter.d.ts.map +1 -1
- package/dist/surfacing/sqlite-storage-adapter.js +13 -21
- package/dist/surfacing/sqlite-storage-adapter.js.map +1 -1
- package/dist/types/config.d.ts +100 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +27 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/memory.d.ts +52 -0
- package/dist/types/memory.d.ts.map +1 -1
- package/dist/types/memory.js +13 -0
- package/dist/types/memory.js.map +1 -1
- package/dist/types/playbook.d.ts +4 -0
- package/dist/types/playbook.d.ts.map +1 -1
- package/dist/types/playbook.js.map +1 -1
- package/dist/utils/error-classifier.d.ts +30 -0
- package/dist/utils/error-classifier.d.ts.map +1 -0
- package/dist/utils/error-classifier.js +85 -0
- package/dist/utils/error-classifier.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/partitioned-store.d.ts +93 -0
- package/dist/utils/partitioned-store.d.ts.map +1 -0
- package/dist/utils/partitioned-store.js +251 -0
- package/dist/utils/partitioned-store.js.map +1 -0
- package/dist/utils/trajectory-helpers.d.ts +39 -0
- package/dist/utils/trajectory-helpers.d.ts.map +1 -0
- package/dist/utils/trajectory-helpers.js +57 -0
- package/dist/utils/trajectory-helpers.js.map +1 -0
- package/dist/workspace/efficacy-toolkit.d.ts +164 -0
- package/dist/workspace/efficacy-toolkit.d.ts.map +1 -0
- package/dist/workspace/efficacy-toolkit.js +281 -0
- package/dist/workspace/efficacy-toolkit.js.map +1 -0
- package/dist/workspace/index.d.ts +2 -1
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js +3 -1
- package/dist/workspace/index.js.map +1 -1
- package/dist/workspace/runner.d.ts +3 -4
- package/dist/workspace/runner.d.ts.map +1 -1
- package/dist/workspace/runner.js.map +1 -1
- package/dist/workspace/templates/index.d.ts +3 -0
- package/dist/workspace/templates/index.d.ts.map +1 -1
- package/dist/workspace/templates/index.js +6 -0
- package/dist/workspace/templates/index.js.map +1 -1
- package/dist/workspace/templates/playbook-decay-detection.d.ts +46 -0
- package/dist/workspace/templates/playbook-decay-detection.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-decay-detection.js +197 -0
- package/dist/workspace/templates/playbook-decay-detection.js.map +1 -0
- package/dist/workspace/templates/playbook-efficacy-audit.d.ts +46 -0
- package/dist/workspace/templates/playbook-efficacy-audit.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-efficacy-audit.js +160 -0
- package/dist/workspace/templates/playbook-efficacy-audit.js.map +1 -0
- package/dist/workspace/templates/playbook-lifecycle-review.d.ts +51 -0
- package/dist/workspace/templates/playbook-lifecycle-review.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-lifecycle-review.js +187 -0
- package/dist/workspace/templates/playbook-lifecycle-review.js.map +1 -0
- package/dist/workspace/types.d.ts +9 -2
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/types.js.map +1 -1
- package/package.json +12 -4
- package/references/sessionlog/.husky/pre-commit +1 -0
- package/references/sessionlog/.lintstagedrc.json +4 -0
- package/references/sessionlog/.prettierignore +4 -0
- package/references/sessionlog/.prettierrc.json +11 -0
- package/references/sessionlog/LICENSE +21 -0
- package/references/sessionlog/README.md +453 -0
- package/references/sessionlog/eslint.config.js +58 -0
- package/references/sessionlog/package-lock.json +3672 -0
- package/references/sessionlog/package.json +65 -0
- package/references/sessionlog/src/__tests__/agent-hooks.test.ts +570 -0
- package/references/sessionlog/src/__tests__/agent-registry.test.ts +127 -0
- package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +225 -0
- package/references/sessionlog/src/__tests__/claude-generator.test.ts +46 -0
- package/references/sessionlog/src/__tests__/commit-msg.test.ts +86 -0
- package/references/sessionlog/src/__tests__/cursor-agent.test.ts +224 -0
- package/references/sessionlog/src/__tests__/e2e-live.test.ts +890 -0
- package/references/sessionlog/src/__tests__/event-log.test.ts +183 -0
- package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +105 -0
- package/references/sessionlog/src/__tests__/gemini-agent.test.ts +375 -0
- package/references/sessionlog/src/__tests__/git-hooks.test.ts +78 -0
- package/references/sessionlog/src/__tests__/hook-managers.test.ts +121 -0
- package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +759 -0
- package/references/sessionlog/src/__tests__/opencode-agent.test.ts +338 -0
- package/references/sessionlog/src/__tests__/redaction.test.ts +136 -0
- package/references/sessionlog/src/__tests__/session-repo.test.ts +353 -0
- package/references/sessionlog/src/__tests__/session-store.test.ts +166 -0
- package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +466 -0
- package/references/sessionlog/src/__tests__/skill-live.test.ts +461 -0
- package/references/sessionlog/src/__tests__/summarize.test.ts +348 -0
- package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +610 -0
- package/references/sessionlog/src/__tests__/task-plan-live.test.ts +632 -0
- package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +121 -0
- package/references/sessionlog/src/__tests__/types.test.ts +166 -0
- package/references/sessionlog/src/__tests__/utils.test.ts +333 -0
- package/references/sessionlog/src/__tests__/validation.test.ts +103 -0
- package/references/sessionlog/src/__tests__/worktree.test.ts +57 -0
- package/references/sessionlog/src/agent/agents/claude-code.ts +1089 -0
- package/references/sessionlog/src/agent/agents/cursor.ts +361 -0
- package/references/sessionlog/src/agent/agents/gemini-cli.ts +632 -0
- package/references/sessionlog/src/agent/agents/opencode.ts +540 -0
- package/references/sessionlog/src/agent/registry.ts +143 -0
- package/references/sessionlog/src/agent/session-types.ts +113 -0
- package/references/sessionlog/src/agent/types.ts +220 -0
- package/references/sessionlog/src/cli.ts +597 -0
- package/references/sessionlog/src/commands/clean.ts +133 -0
- package/references/sessionlog/src/commands/disable.ts +84 -0
- package/references/sessionlog/src/commands/doctor.ts +145 -0
- package/references/sessionlog/src/commands/enable.ts +202 -0
- package/references/sessionlog/src/commands/explain.ts +261 -0
- package/references/sessionlog/src/commands/reset.ts +105 -0
- package/references/sessionlog/src/commands/resume.ts +180 -0
- package/references/sessionlog/src/commands/rewind.ts +195 -0
- package/references/sessionlog/src/commands/setup-ccweb.ts +275 -0
- package/references/sessionlog/src/commands/status.ts +172 -0
- package/references/sessionlog/src/config.ts +165 -0
- package/references/sessionlog/src/events/event-log.ts +126 -0
- package/references/sessionlog/src/git-operations.ts +558 -0
- package/references/sessionlog/src/hooks/git-hooks.ts +165 -0
- package/references/sessionlog/src/hooks/lifecycle.ts +391 -0
- package/references/sessionlog/src/index.ts +650 -0
- package/references/sessionlog/src/security/redaction.ts +283 -0
- package/references/sessionlog/src/session/state-machine.ts +452 -0
- package/references/sessionlog/src/store/checkpoint-store.ts +509 -0
- package/references/sessionlog/src/store/native-store.ts +173 -0
- package/references/sessionlog/src/store/provider-types.ts +99 -0
- package/references/sessionlog/src/store/session-store.ts +266 -0
- package/references/sessionlog/src/strategy/attribution.ts +296 -0
- package/references/sessionlog/src/strategy/common.ts +207 -0
- package/references/sessionlog/src/strategy/content-overlap.ts +228 -0
- package/references/sessionlog/src/strategy/manual-commit.ts +988 -0
- package/references/sessionlog/src/strategy/types.ts +279 -0
- package/references/sessionlog/src/summarize/claude-generator.ts +115 -0
- package/references/sessionlog/src/summarize/summarize.ts +432 -0
- package/references/sessionlog/src/types.ts +508 -0
- package/references/sessionlog/src/utils/chunk-files.ts +49 -0
- package/references/sessionlog/src/utils/commit-message.ts +65 -0
- package/references/sessionlog/src/utils/detect-agent.ts +36 -0
- package/references/sessionlog/src/utils/hook-managers.ts +125 -0
- package/references/sessionlog/src/utils/ide-tags.ts +32 -0
- package/references/sessionlog/src/utils/paths.ts +79 -0
- package/references/sessionlog/src/utils/preview-rewind.ts +80 -0
- package/references/sessionlog/src/utils/rewind-conflict.ts +121 -0
- package/references/sessionlog/src/utils/shadow-branch.ts +109 -0
- package/references/sessionlog/src/utils/string-utils.ts +46 -0
- package/references/sessionlog/src/utils/todo-extract.ts +188 -0
- package/references/sessionlog/src/utils/trailers.ts +187 -0
- package/references/sessionlog/src/utils/transcript-parse.ts +177 -0
- package/references/sessionlog/src/utils/transcript-timestamp.ts +59 -0
- package/references/sessionlog/src/utils/tree-ops.ts +219 -0
- package/references/sessionlog/src/utils/tty.ts +72 -0
- package/references/sessionlog/src/utils/validation.ts +65 -0
- package/references/sessionlog/src/utils/worktree.ts +58 -0
- package/references/sessionlog/src/wire-types.ts +59 -0
- package/references/sessionlog/templates/setup-env.sh +153 -0
- package/references/sessionlog/tsconfig.json +18 -0
- package/references/sessionlog/vitest.config.ts +12 -0
- package/references/skill-tree/.sudocode/issues.jsonl +8 -0
- package/references/skill-tree/.sudocode/specs.jsonl +2 -0
- package/references/skill-tree/CLAUDE.md +56 -80
- package/references/skill-tree/README.md +188 -140
- package/references/skill-tree/examples/basic-usage.ts +95 -121
- package/references/skill-tree/package-lock.json +369 -26
- package/references/skill-tree/package.json +1 -1
- package/src/atlas.ts +97 -67
- package/src/bin/cli-utils.ts +220 -0
- package/src/bin/cognitive-core.ts +84 -392
- package/src/bin/commands/kb.ts +266 -0
- package/src/bin/commands/learn.ts +100 -0
- package/src/bin/commands/legacy.ts +182 -0
- package/src/bin/commands/run.ts +113 -0
- package/src/bin/commands/sessions.ts +221 -0
- package/src/bin/commands/skills.ts +146 -0
- package/src/embeddings/index.ts +3 -0
- package/src/embeddings/inverted-index.ts +134 -0
- package/src/embeddings/manager.ts +13 -8
- package/src/embeddings/vector-store.ts +21 -9
- package/src/factory.ts +33 -16
- package/src/index.ts +136 -9
- package/src/learning/analyzer.ts +21 -37
- package/src/learning/energy-evaluator.ts +282 -0
- package/src/learning/healing-orchestrator.ts +383 -0
- package/src/learning/index.ts +66 -9
- package/src/learning/instant-loop.ts +357 -0
- package/src/learning/maintenance-scheduler.ts +271 -0
- package/src/learning/meta-learner.ts +5 -23
- package/src/learning/reflexion-generator.ts +273 -0
- package/src/learning/trajectory-sources/entire.ts +24 -13
- package/src/learning/trajectory-sources/index.ts +2 -2
- package/src/learning/trajectory-sources/pipeline.ts +5 -5
- package/src/learning/unified-pipeline.ts +1191 -0
- package/src/memory/candidate-retrieval.ts +72 -0
- package/src/memory/causal-store.ts +273 -0
- package/src/memory/coherence.ts +252 -0
- package/src/memory/experience.ts +217 -50
- package/src/memory/index.ts +43 -0
- package/src/memory/knowledge-bank.ts +57 -0
- package/src/memory/meta.ts +78 -96
- package/src/memory/playbook.ts +239 -75
- package/src/memory/reasoning-bank.ts +458 -0
- package/src/memory/reflexion.ts +122 -0
- package/src/memory/system.ts +21 -5
- package/src/memory/temporal-compressor.ts +409 -0
- package/src/persistence/index.ts +37 -0
- package/src/persistence/migrator.ts +298 -0
- package/src/persistence/serializers.ts +79 -0
- package/src/persistence/sqlite-persistence.ts +925 -0
- package/src/runtime/flows/learning.ts +25 -42
- package/src/search/index.ts +10 -0
- package/src/search/moe-gate.ts +304 -0
- package/src/search/router.ts +111 -4
- package/src/session-bank/git-reader.ts +29 -19
- package/src/session-bank/index.ts +4 -2
- package/src/session-bank/parser.ts +280 -98
- package/src/session-bank/session-bank.ts +33 -12
- package/src/session-bank/types.ts +8 -5
- package/src/surfacing/skill-publisher.ts +17 -49
- package/src/surfacing/sqlite-storage-adapter.ts +16 -32
- package/src/types/config.ts +30 -0
- package/src/types/index.ts +3 -0
- package/src/types/memory.ts +30 -0
- package/src/types/playbook.ts +4 -0
- package/src/utils/error-classifier.ts +113 -0
- package/src/utils/index.ts +18 -0
- package/src/utils/partitioned-store.ts +299 -0
- package/src/utils/trajectory-helpers.ts +79 -0
- package/src/workspace/efficacy-toolkit.ts +496 -0
- package/src/workspace/index.ts +29 -0
- package/src/workspace/runner.ts +3 -3
- package/src/workspace/templates/index.ts +24 -0
- package/src/workspace/templates/playbook-decay-detection.ts +272 -0
- package/src/workspace/templates/playbook-efficacy-audit.ts +246 -0
- package/src/workspace/templates/playbook-lifecycle-review.ts +274 -0
- package/src/workspace/types.ts +10 -2
- package/tests/embeddings/inverted-index.test.ts +138 -0
- package/tests/feature-toggles.test.ts +275 -0
- package/tests/fixtures/behavioral-trajectories.ts +210 -0
- package/tests/gap-fixes.test.ts +17 -4
- package/tests/integration/cli-e2e.test.ts +621 -0
- package/tests/integration/e2e.test.ts +6 -5
- package/tests/integration/entire-e2e.test.ts +314 -125
- package/tests/integration/persistence-e2e.test.ts +741 -0
- package/tests/integration/phase-e2e.test.ts +1143 -0
- package/tests/integration/pipeline-data-correctness.test.ts +794 -0
- package/tests/integration/session-bank.test.ts +20 -14
- package/tests/integration/sessionlog-e2e.test.ts +329 -0
- package/tests/integration/unified-pipeline-e2e.test.ts +634 -0
- package/tests/learning/analyzer.test.ts +1 -1
- package/tests/learning/energy-evaluator.test.ts +180 -0
- package/tests/learning/entire-trajectory-source.test.ts +25 -25
- package/tests/learning/healing-orchestrator.test.ts +269 -0
- package/tests/learning/instant-loop.test.ts +243 -0
- package/tests/learning/maintenance-scheduler.test.ts +191 -0
- package/tests/learning/meta-learner.test.ts +418 -0
- package/tests/learning/pipeline-memory-updates.test.ts +721 -0
- package/tests/learning/reflexion-generator.test.ts +411 -0
- package/tests/learning/trajectory-sources.test.ts +12 -4
- package/tests/learning/unified-pipeline-efficacy.test.ts +232 -0
- package/tests/learning/unified-pipeline.test.ts +322 -0
- package/tests/mcp/playbook-server.test.ts +6 -1
- package/tests/memory/candidate-retrieval.test.ts +167 -0
- package/tests/memory/causal-store.test.ts +276 -0
- package/tests/memory/coherence.test.ts +232 -0
- package/tests/memory/experience.test.ts +8 -3
- package/tests/memory/meta.test.ts +399 -0
- package/tests/memory/playbook.test.ts +307 -1
- package/tests/memory/provenance.test.ts +11 -2
- package/tests/memory/reasoning-bank.test.ts +239 -0
- package/tests/memory/reflexion.test.ts +166 -0
- package/tests/memory/skill-exporter.test.ts +6 -1
- package/tests/memory/system.test.ts +6 -1
- package/tests/memory/temporal-compressor.test.ts +318 -0
- package/tests/persistence/migrator.test.ts +1009 -0
- package/tests/persistence/sqlite-persistence.test.ts +635 -0
- package/tests/runtime/agent-manager.test.ts +6 -1
- package/tests/runtime/delegate.test.ts +6 -1
- package/tests/search/evaluator.test.ts +257 -0
- package/tests/search/moe-gate.test.ts +250 -0
- package/tests/search/refinement-loop.test.ts +11 -2
- package/tests/search/router.test.ts +81 -2
- package/tests/search/verification-runner.test.ts +357 -0
- package/tests/session-bank/fixtures/sessionlog-root-metadata.json +16 -0
- package/tests/session-bank/fixtures/sessionlog-session/full.jsonl +6 -0
- package/tests/session-bank/fixtures/sessionlog-session/metadata.json +55 -0
- package/tests/session-bank/git-reader.test.ts +13 -13
- package/tests/session-bank/parser.test.ts +135 -3
- package/tests/session-bank/session-bank.test.ts +1 -1
- package/tests/surfacing/skill-library.test.ts +6 -1
- package/tests/surfacing/skill-publisher.test.ts +24 -58
- package/tests/surfacing/sqlite-storage-adapter.test.ts +11 -23
- package/tests/utils/error-classifier.test.ts +149 -0
- package/tests/utils/partitioned-store.test.ts +230 -0
- package/tests/utils/trajectory-helpers.test.ts +163 -0
- package/tests/workspace/efficacy-toolkit.test.ts +404 -0
- package/tests/workspace/full-flow.test.ts +10 -4
- package/tests/workspace/runner.test.ts +10 -4
- package/tests/workspace/templates/playbook-efficacy.test.ts +377 -0
- package/docs/DESIGN-workspace-migration.md +0 -1079
- package/docs/PLAN-agentic-workspace-implementation.md +0 -717
- package/docs/PLAN-graph-migration.md +0 -299
- package/docs/PLAN-session-bank-implementation.md +0 -474
- package/src/learning/pipeline.ts +0 -323
- package/tests/learning/pipeline.test.ts +0 -176
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { Task } from '../../types/index.js';
|
|
2
2
|
import type { MemorySystem } from '../../memory/system.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type {
|
|
4
|
+
UnifiedLearningPipeline,
|
|
5
|
+
ImmediateResult,
|
|
6
|
+
UnifiedBatchResult,
|
|
7
|
+
} from '../../learning/unified-pipeline.js';
|
|
4
8
|
import type { AgentManager } from '../manager.js';
|
|
5
9
|
import type { AgentResult, AgentSession, AgentObserverCallbacks } from '../types.js';
|
|
6
10
|
|
|
@@ -10,9 +14,7 @@ import type { AgentResult, AgentSession, AgentObserverCallbacks } from '../types
|
|
|
10
14
|
export interface LearningFlowConfig {
|
|
11
15
|
/** Agent type to use for execution */
|
|
12
16
|
agentType: string;
|
|
13
|
-
/**
|
|
14
|
-
batchThreshold?: number;
|
|
15
|
-
/** Whether to auto-run batch learning when threshold is reached */
|
|
17
|
+
/** Whether to auto-run batch learning when energy threshold is reached */
|
|
16
18
|
autoBatch?: boolean;
|
|
17
19
|
/** Observer callbacks for real-time monitoring */
|
|
18
20
|
observer?: AgentObserverCallbacks;
|
|
@@ -24,10 +26,10 @@ export interface LearningFlowConfig {
|
|
|
24
26
|
export interface LearningFlowResult {
|
|
25
27
|
/** The agent result */
|
|
26
28
|
agentResult: AgentResult;
|
|
27
|
-
/** Processing result from learning pipeline */
|
|
28
|
-
|
|
29
|
-
/** Batch result if batch learning was triggered */
|
|
30
|
-
batchResult?:
|
|
29
|
+
/** Processing result from learning pipeline (immediate phase) */
|
|
30
|
+
immediateResult: ImmediateResult;
|
|
31
|
+
/** Batch result if batch learning was triggered (included in immediateResult) */
|
|
32
|
+
batchResult?: UnifiedBatchResult;
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
/**
|
|
@@ -41,19 +43,18 @@ export interface LearningFlowResult {
|
|
|
41
43
|
*/
|
|
42
44
|
export class LearningFlow {
|
|
43
45
|
private manager: AgentManager;
|
|
44
|
-
private pipeline:
|
|
46
|
+
private pipeline: UnifiedLearningPipeline;
|
|
45
47
|
private config: LearningFlowConfig;
|
|
46
48
|
|
|
47
49
|
constructor(
|
|
48
50
|
manager: AgentManager,
|
|
49
|
-
pipeline:
|
|
51
|
+
pipeline: UnifiedLearningPipeline,
|
|
50
52
|
_memory: MemorySystem,
|
|
51
53
|
config: LearningFlowConfig
|
|
52
54
|
) {
|
|
53
55
|
this.manager = manager;
|
|
54
56
|
this.pipeline = pipeline;
|
|
55
57
|
this.config = {
|
|
56
|
-
batchThreshold: 10,
|
|
57
58
|
autoBatch: true,
|
|
58
59
|
...config,
|
|
59
60
|
};
|
|
@@ -75,24 +76,15 @@ export class LearningFlow {
|
|
|
75
76
|
captureToolCalls: true,
|
|
76
77
|
});
|
|
77
78
|
|
|
78
|
-
// 2. Process trajectory through
|
|
79
|
-
const
|
|
79
|
+
// 2. Process trajectory through unified pipeline (immediate + optional batch)
|
|
80
|
+
const immediateResult = await this.pipeline.processTrajectory(
|
|
80
81
|
agentResult.trajectory
|
|
81
82
|
);
|
|
82
83
|
|
|
83
|
-
// 3. Run batch learning if threshold reached
|
|
84
|
-
let batchResult: BatchResult | undefined;
|
|
85
|
-
if (
|
|
86
|
-
this.config.autoBatch &&
|
|
87
|
-
this.pipeline.getAccumulatedCount() >= (this.config.batchThreshold ?? 10)
|
|
88
|
-
) {
|
|
89
|
-
batchResult = await this.pipeline.runBatchLearning();
|
|
90
|
-
}
|
|
91
|
-
|
|
92
84
|
return {
|
|
93
85
|
agentResult,
|
|
94
|
-
|
|
95
|
-
batchResult,
|
|
86
|
+
immediateResult,
|
|
87
|
+
batchResult: immediateResult.batchResult,
|
|
96
88
|
};
|
|
97
89
|
}
|
|
98
90
|
|
|
@@ -119,17 +111,8 @@ export class LearningFlow {
|
|
|
119
111
|
// Extract trajectory from session
|
|
120
112
|
const trajectory = await this.manager.observeAndLearn(session, task);
|
|
121
113
|
|
|
122
|
-
// Process through
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
// Check for batch learning
|
|
126
|
-
let batchResult: BatchResult | undefined;
|
|
127
|
-
if (
|
|
128
|
-
this.config.autoBatch &&
|
|
129
|
-
this.pipeline.getAccumulatedCount() >= (this.config.batchThreshold ?? 10)
|
|
130
|
-
) {
|
|
131
|
-
batchResult = await this.pipeline.runBatchLearning();
|
|
132
|
-
}
|
|
114
|
+
// Process through unified pipeline
|
|
115
|
+
const immediateResult = await this.pipeline.processTrajectory(trajectory);
|
|
133
116
|
|
|
134
117
|
return {
|
|
135
118
|
agentResult: {
|
|
@@ -144,16 +127,16 @@ export class LearningFlow {
|
|
|
144
127
|
messageCount: session.messages.length,
|
|
145
128
|
},
|
|
146
129
|
},
|
|
147
|
-
|
|
148
|
-
batchResult,
|
|
130
|
+
immediateResult,
|
|
131
|
+
batchResult: immediateResult.batchResult,
|
|
149
132
|
};
|
|
150
133
|
}
|
|
151
134
|
|
|
152
135
|
/**
|
|
153
136
|
* Force batch learning
|
|
154
137
|
*/
|
|
155
|
-
async runBatchLearning(): Promise<
|
|
156
|
-
return this.pipeline.
|
|
138
|
+
async runBatchLearning(): Promise<UnifiedBatchResult> {
|
|
139
|
+
return this.pipeline.runBatch();
|
|
157
140
|
}
|
|
158
141
|
|
|
159
142
|
/**
|
|
@@ -161,11 +144,11 @@ export class LearningFlow {
|
|
|
161
144
|
*/
|
|
162
145
|
getStats(): {
|
|
163
146
|
pendingTrajectories: number;
|
|
164
|
-
|
|
147
|
+
pipelineStats: ReturnType<UnifiedLearningPipeline['getStats']>;
|
|
165
148
|
} {
|
|
166
149
|
return {
|
|
167
150
|
pendingTrajectories: this.pipeline.getAccumulatedCount(),
|
|
168
|
-
|
|
151
|
+
pipelineStats: this.pipeline.getStats(),
|
|
169
152
|
};
|
|
170
153
|
}
|
|
171
154
|
}
|
|
@@ -175,7 +158,7 @@ export class LearningFlow {
|
|
|
175
158
|
*/
|
|
176
159
|
export function createLearningFlow(
|
|
177
160
|
manager: AgentManager,
|
|
178
|
-
pipeline:
|
|
161
|
+
pipeline: UnifiedLearningPipeline,
|
|
179
162
|
memory: MemorySystem,
|
|
180
163
|
config: LearningFlowConfig
|
|
181
164
|
): LearningFlow {
|
package/src/search/index.ts
CHANGED
|
@@ -4,6 +4,16 @@ export {
|
|
|
4
4
|
type RoutingDecision,
|
|
5
5
|
} from './router.js';
|
|
6
6
|
|
|
7
|
+
// MoE-inspired routing gate
|
|
8
|
+
export {
|
|
9
|
+
MoEGate,
|
|
10
|
+
createMoEGate,
|
|
11
|
+
extractTaskFeatures,
|
|
12
|
+
MOE_FEATURE_SIZE,
|
|
13
|
+
MOE_STRATEGIES,
|
|
14
|
+
type MoEGateState,
|
|
15
|
+
} from './moe-gate.js';
|
|
16
|
+
|
|
7
17
|
export {
|
|
8
18
|
DirectSolver,
|
|
9
19
|
createSolver,
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MoEGate — Mixture-of-Experts inspired gating for task routing.
|
|
3
|
+
*
|
|
4
|
+
* Learns per-domain weight vectors over routing strategies from outcome
|
|
5
|
+
* feedback. Replaces threshold-based strategy selection with a learned
|
|
6
|
+
* linear gate:
|
|
7
|
+
*
|
|
8
|
+
* gate(features) = softmax(W · features)
|
|
9
|
+
*
|
|
10
|
+
* where W is a weight matrix (one row per strategy), and features are
|
|
11
|
+
* extracted from the task + memory state.
|
|
12
|
+
*
|
|
13
|
+
* Online gradient update:
|
|
14
|
+
* w[chosen] += learningRate * reward * features
|
|
15
|
+
* w[others] -= learningRate * (1 - reward) * features / (numStrategies - 1)
|
|
16
|
+
*
|
|
17
|
+
* Cold start: uniform weights → falls back to existing threshold logic.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Serialized gate state for persistence
|
|
22
|
+
*/
|
|
23
|
+
export interface MoEGateState {
|
|
24
|
+
strategies: string[];
|
|
25
|
+
featureSize: number;
|
|
26
|
+
globalWeights: number[][];
|
|
27
|
+
domainWeights: Record<string, number[][]>;
|
|
28
|
+
updateCount: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* MoE-inspired gating function over routing strategies
|
|
33
|
+
*/
|
|
34
|
+
export class MoEGate {
|
|
35
|
+
private strategies: string[];
|
|
36
|
+
private featureSize: number;
|
|
37
|
+
private globalWeights: number[][];
|
|
38
|
+
private domainWeights: Map<string, number[][]> = new Map();
|
|
39
|
+
private updateCount = 0;
|
|
40
|
+
|
|
41
|
+
constructor(strategies: string[], featureSize: number) {
|
|
42
|
+
this.strategies = strategies;
|
|
43
|
+
this.featureSize = featureSize;
|
|
44
|
+
|
|
45
|
+
// Initialize global weights to small random values (near-uniform gate)
|
|
46
|
+
this.globalWeights = strategies.map(() =>
|
|
47
|
+
Array.from({ length: featureSize }, () => (Math.random() - 0.5) * 0.01)
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Compute gate weights for a task given its feature vector.
|
|
53
|
+
* Returns a map of strategy → probability.
|
|
54
|
+
*/
|
|
55
|
+
gate(features: number[], domain?: string): Map<string, number> {
|
|
56
|
+
const weights = this.getWeights(domain);
|
|
57
|
+
const logits = this.computeLogits(weights, features);
|
|
58
|
+
const probs = this.softmax(logits);
|
|
59
|
+
|
|
60
|
+
const result = new Map<string, number>();
|
|
61
|
+
for (let i = 0; i < this.strategies.length; i++) {
|
|
62
|
+
result.set(this.strategies[i], probs[i]);
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Select the best strategy (argmax of gate output).
|
|
69
|
+
*/
|
|
70
|
+
selectStrategy(features: number[], domain?: string): string {
|
|
71
|
+
const gateOutput = this.gate(features, domain);
|
|
72
|
+
|
|
73
|
+
let bestStrategy = this.strategies[0];
|
|
74
|
+
let bestProb = -1;
|
|
75
|
+
for (const [strategy, prob] of gateOutput) {
|
|
76
|
+
if (prob > bestProb) {
|
|
77
|
+
bestProb = prob;
|
|
78
|
+
bestStrategy = strategy;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return bestStrategy;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Update weights from outcome feedback (online gradient).
|
|
87
|
+
*
|
|
88
|
+
* Positive reward → increase weight for chosen strategy's features.
|
|
89
|
+
* Negative reward → decrease weight.
|
|
90
|
+
*/
|
|
91
|
+
update(
|
|
92
|
+
features: number[],
|
|
93
|
+
chosenStrategy: string,
|
|
94
|
+
reward: number,
|
|
95
|
+
learningRate = 0.01,
|
|
96
|
+
domain?: string
|
|
97
|
+
): void {
|
|
98
|
+
const chosenIdx = this.strategies.indexOf(chosenStrategy);
|
|
99
|
+
if (chosenIdx === -1) return;
|
|
100
|
+
|
|
101
|
+
// Update global weights
|
|
102
|
+
this.updateWeightMatrix(this.globalWeights, features, chosenIdx, reward, learningRate);
|
|
103
|
+
|
|
104
|
+
// Update domain-specific weights if domain provided
|
|
105
|
+
if (domain) {
|
|
106
|
+
if (!this.domainWeights.has(domain)) {
|
|
107
|
+
// Initialize domain weights as copy of global
|
|
108
|
+
this.domainWeights.set(
|
|
109
|
+
domain,
|
|
110
|
+
this.globalWeights.map((row) => [...row])
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
const domainW = this.domainWeights.get(domain)!;
|
|
114
|
+
this.updateWeightMatrix(domainW, features, chosenIdx, reward, learningRate);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
this.updateCount++;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Whether the gate has been trained (has seen any updates).
|
|
122
|
+
*/
|
|
123
|
+
get isTrained(): boolean {
|
|
124
|
+
return this.updateCount > 0;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Number of updates the gate has seen.
|
|
129
|
+
*/
|
|
130
|
+
get totalUpdates(): number {
|
|
131
|
+
return this.updateCount;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Serialize for persistence.
|
|
136
|
+
*/
|
|
137
|
+
toJSON(): MoEGateState {
|
|
138
|
+
const domainWeights: Record<string, number[][]> = {};
|
|
139
|
+
for (const [domain, weights] of this.domainWeights) {
|
|
140
|
+
domainWeights[domain] = weights;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
strategies: this.strategies,
|
|
145
|
+
featureSize: this.featureSize,
|
|
146
|
+
globalWeights: this.globalWeights,
|
|
147
|
+
domainWeights,
|
|
148
|
+
updateCount: this.updateCount,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Deserialize from persisted state.
|
|
154
|
+
*/
|
|
155
|
+
static fromJSON(data: MoEGateState): MoEGate {
|
|
156
|
+
const gate = new MoEGate(data.strategies, data.featureSize);
|
|
157
|
+
gate.globalWeights = data.globalWeights;
|
|
158
|
+
gate.updateCount = data.updateCount;
|
|
159
|
+
|
|
160
|
+
for (const [domain, weights] of Object.entries(data.domainWeights)) {
|
|
161
|
+
gate.domainWeights.set(domain, weights);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return gate;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// === Internal ===
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Get the weight matrix for a domain (with fallback to global).
|
|
171
|
+
*/
|
|
172
|
+
private getWeights(domain?: string): number[][] {
|
|
173
|
+
if (domain && this.domainWeights.has(domain)) {
|
|
174
|
+
return this.domainWeights.get(domain)!;
|
|
175
|
+
}
|
|
176
|
+
return this.globalWeights;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Compute logits = W · features for each strategy.
|
|
181
|
+
*/
|
|
182
|
+
private computeLogits(weights: number[][], features: number[]): number[] {
|
|
183
|
+
return weights.map((row) => {
|
|
184
|
+
let sum = 0;
|
|
185
|
+
for (let j = 0; j < Math.min(row.length, features.length); j++) {
|
|
186
|
+
sum += row[j] * features[j];
|
|
187
|
+
}
|
|
188
|
+
return sum;
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Softmax with numerical stability (subtract max).
|
|
194
|
+
*/
|
|
195
|
+
private softmax(logits: number[]): number[] {
|
|
196
|
+
const max = Math.max(...logits);
|
|
197
|
+
const exps = logits.map((l) => Math.exp(l - max));
|
|
198
|
+
const sum = exps.reduce((a, b) => a + b, 0);
|
|
199
|
+
return exps.map((e) => e / sum);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Online gradient update on a weight matrix.
|
|
204
|
+
*
|
|
205
|
+
* Uses centered reward (reward - 0.5) so that:
|
|
206
|
+
* reward=1 → positive update for chosen, negative for others
|
|
207
|
+
* reward=0 → negative update for chosen, positive for others
|
|
208
|
+
*/
|
|
209
|
+
private updateWeightMatrix(
|
|
210
|
+
weights: number[][],
|
|
211
|
+
features: number[],
|
|
212
|
+
chosenIdx: number,
|
|
213
|
+
reward: number,
|
|
214
|
+
learningRate: number
|
|
215
|
+
): void {
|
|
216
|
+
const numStrategies = this.strategies.length;
|
|
217
|
+
const centered = reward - 0.5; // range: [-0.5, 0.5]
|
|
218
|
+
|
|
219
|
+
for (let i = 0; i < numStrategies; i++) {
|
|
220
|
+
for (let j = 0; j < this.featureSize; j++) {
|
|
221
|
+
if (i === chosenIdx) {
|
|
222
|
+
// Positive reward → boost chosen; negative → penalize chosen
|
|
223
|
+
weights[i][j] += learningRate * centered * features[j];
|
|
224
|
+
} else {
|
|
225
|
+
// Opposite direction for unchosen strategies
|
|
226
|
+
weights[i][j] -=
|
|
227
|
+
learningRate * centered * features[j] / (numStrategies - 1);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Extract feature vector from a task and memory context for the MoE gate.
|
|
236
|
+
*
|
|
237
|
+
* Features (8 dimensions):
|
|
238
|
+
* 0: task description length (normalized)
|
|
239
|
+
* 1: domain familiarity (experience count, normalized)
|
|
240
|
+
* 2: best experience match score
|
|
241
|
+
* 3: best playbook match score
|
|
242
|
+
* 4: best playbook confidence
|
|
243
|
+
* 5: is bug fix (0/1)
|
|
244
|
+
* 6: is new feature (0/1)
|
|
245
|
+
* 7: task complexity proxy (word count, normalized)
|
|
246
|
+
*/
|
|
247
|
+
export function extractTaskFeatures(
|
|
248
|
+
taskDescription: string,
|
|
249
|
+
memoryContext: {
|
|
250
|
+
experiences: Array<{ score: number }>;
|
|
251
|
+
playbooks: Array<{ score: number; playbook: { confidence: number } }>;
|
|
252
|
+
},
|
|
253
|
+
experienceCountInDomain = 0
|
|
254
|
+
): number[] {
|
|
255
|
+
const desc = taskDescription.toLowerCase();
|
|
256
|
+
|
|
257
|
+
const bestExpScore = memoryContext.experiences.length > 0
|
|
258
|
+
? Math.max(...memoryContext.experiences.map((e) => e.score))
|
|
259
|
+
: 0;
|
|
260
|
+
|
|
261
|
+
const bestPlaybookScore = memoryContext.playbooks.length > 0
|
|
262
|
+
? Math.max(...memoryContext.playbooks.map((p) => p.score))
|
|
263
|
+
: 0;
|
|
264
|
+
|
|
265
|
+
const bestPlaybookConfidence = memoryContext.playbooks.length > 0
|
|
266
|
+
? Math.max(...memoryContext.playbooks.map((p) => p.playbook.confidence))
|
|
267
|
+
: 0;
|
|
268
|
+
|
|
269
|
+
const isBugFix =
|
|
270
|
+
desc.includes('bug') || desc.includes('fix') || desc.includes('error')
|
|
271
|
+
? 1
|
|
272
|
+
: 0;
|
|
273
|
+
|
|
274
|
+
const isNewFeature =
|
|
275
|
+
desc.includes('implement') || desc.includes('create') || desc.includes('add')
|
|
276
|
+
? 1
|
|
277
|
+
: 0;
|
|
278
|
+
|
|
279
|
+
const wordCount = taskDescription.split(/\s+/).length;
|
|
280
|
+
|
|
281
|
+
return [
|
|
282
|
+
Math.min(taskDescription.length / 1000, 1), // [0] length, normalized
|
|
283
|
+
Math.min(experienceCountInDomain / 100, 1), // [1] domain familiarity
|
|
284
|
+
bestExpScore, // [2] best experience match
|
|
285
|
+
bestPlaybookScore, // [3] best playbook match
|
|
286
|
+
bestPlaybookConfidence, // [4] best playbook confidence
|
|
287
|
+
isBugFix, // [5] bug fix indicator
|
|
288
|
+
isNewFeature, // [6] new feature indicator
|
|
289
|
+
Math.min(wordCount / 100, 1), // [7] complexity proxy
|
|
290
|
+
];
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/** Default feature size for the MoE gate */
|
|
294
|
+
export const MOE_FEATURE_SIZE = 8;
|
|
295
|
+
|
|
296
|
+
/** Default strategies for the MoE gate */
|
|
297
|
+
export const MOE_STRATEGIES = ['direct', 'adapt', 'explore', 'fallback'] as const;
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Create a MoEGate with default settings
|
|
301
|
+
*/
|
|
302
|
+
export function createMoEGate(): MoEGate {
|
|
303
|
+
return new MoEGate([...MOE_STRATEGIES], MOE_FEATURE_SIZE);
|
|
304
|
+
}
|
package/src/search/router.ts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import type { Task, RouterConfig } from '../types/index.js';
|
|
2
2
|
import type { MemorySystem, MemoryQueryResultV2 } from '../memory/system.js';
|
|
3
3
|
import type { MetaLearner } from '../learning/meta-learner.js';
|
|
4
|
+
import type { SqlitePersistence } from '../persistence/index.js';
|
|
5
|
+
import {
|
|
6
|
+
MoEGate,
|
|
7
|
+
extractTaskFeatures,
|
|
8
|
+
createMoEGate,
|
|
9
|
+
type MoEGateState,
|
|
10
|
+
} from './moe-gate.js';
|
|
4
11
|
|
|
5
12
|
/**
|
|
6
13
|
* Routing decision with context
|
|
@@ -29,11 +36,15 @@ export class TaskRouter {
|
|
|
29
36
|
private memory: MemorySystem;
|
|
30
37
|
private config: RouterConfig;
|
|
31
38
|
private metaLearner?: MetaLearner;
|
|
39
|
+
private moeGate: MoEGate;
|
|
40
|
+
private persistence?: SqlitePersistence;
|
|
41
|
+
private gateUpdatesSinceLastPersist = 0;
|
|
32
42
|
|
|
33
43
|
constructor(
|
|
34
44
|
memory: MemorySystem,
|
|
35
45
|
config?: Partial<RouterConfig>,
|
|
36
|
-
metaLearner?: MetaLearner
|
|
46
|
+
metaLearner?: MetaLearner,
|
|
47
|
+
persistence?: SqlitePersistence
|
|
37
48
|
) {
|
|
38
49
|
this.memory = memory;
|
|
39
50
|
this.config = {
|
|
@@ -42,6 +53,16 @@ export class TaskRouter {
|
|
|
42
53
|
defaultStrategy: config?.defaultStrategy ?? 'direct',
|
|
43
54
|
};
|
|
44
55
|
this.metaLearner = metaLearner;
|
|
56
|
+
this.persistence = persistence;
|
|
57
|
+
this.moeGate = createMoEGate();
|
|
58
|
+
|
|
59
|
+
// Load persisted gate state if available
|
|
60
|
+
if (persistence?.isInitialized) {
|
|
61
|
+
const saved = persistence.getSystemState<MoEGateState>('moe_gate');
|
|
62
|
+
if (saved) {
|
|
63
|
+
this.moeGate = MoEGate.fromJSON(saved);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
45
66
|
}
|
|
46
67
|
|
|
47
68
|
/**
|
|
@@ -61,9 +82,30 @@ export class TaskRouter {
|
|
|
61
82
|
domains: task.domain ? [task.domain] : undefined,
|
|
62
83
|
});
|
|
63
84
|
|
|
64
|
-
// Compute base routing from playbook memory
|
|
85
|
+
// Compute base routing from playbook memory (threshold heuristics)
|
|
65
86
|
let decision = this.computeBaseRouting(memoryContext);
|
|
66
87
|
|
|
88
|
+
// If MoE gate is trained, use it to override the base strategy
|
|
89
|
+
if (this.moeGate.isTrained) {
|
|
90
|
+
try {
|
|
91
|
+
const features = extractTaskFeatures(
|
|
92
|
+
task.description,
|
|
93
|
+
memoryContext,
|
|
94
|
+
);
|
|
95
|
+
const gateStrategy = this.moeGate.selectStrategy(features, task.domain);
|
|
96
|
+
if (this.isValidStrategy(gateStrategy)) {
|
|
97
|
+
decision.strategy = gateStrategy as RoutingDecision['strategy'];
|
|
98
|
+
decision.reasoning = `MoE gate selected strategy (${this.moeGate.totalUpdates} updates). ${decision.reasoning}`;
|
|
99
|
+
decision.appliedMetaStrategies = [
|
|
100
|
+
...(decision.appliedMetaStrategies ?? []),
|
|
101
|
+
'moe-gate',
|
|
102
|
+
];
|
|
103
|
+
}
|
|
104
|
+
} catch {
|
|
105
|
+
// Gate failed — continue with base routing
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
67
109
|
// Apply meta-learning adjustments if available
|
|
68
110
|
if (this.metaLearner) {
|
|
69
111
|
const taskCharacteristics = this.extractTaskCharacteristics(task);
|
|
@@ -241,12 +283,76 @@ export class TaskRouter {
|
|
|
241
283
|
return state;
|
|
242
284
|
}
|
|
243
285
|
|
|
286
|
+
/**
|
|
287
|
+
* Update MoE gate weights after a trajectory completes.
|
|
288
|
+
* reward: 1 = success, 0.5 = partial, 0 = failure
|
|
289
|
+
*/
|
|
290
|
+
updateGate(
|
|
291
|
+
task: Task,
|
|
292
|
+
memoryContext: MemoryQueryResultV2,
|
|
293
|
+
chosenStrategy: string,
|
|
294
|
+
reward: number
|
|
295
|
+
): void {
|
|
296
|
+
const features = extractTaskFeatures(task.description, memoryContext);
|
|
297
|
+
this.moeGate.update(features, chosenStrategy, reward, 0.01, task.domain);
|
|
298
|
+
|
|
299
|
+
// Persist gate state every 10 updates
|
|
300
|
+
this.gateUpdatesSinceLastPersist++;
|
|
301
|
+
if (this.persistence && this.gateUpdatesSinceLastPersist >= 10) {
|
|
302
|
+
this.persistence.setSystemState('moe_gate', this.moeGate.toJSON());
|
|
303
|
+
this.gateUpdatesSinceLastPersist = 0;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Flush gate state to persistence (e.g., on shutdown).
|
|
309
|
+
*/
|
|
310
|
+
persistGateState(): void {
|
|
311
|
+
if (this.persistence && this.moeGate.isTrained) {
|
|
312
|
+
this.persistence.setSystemState('moe_gate', this.moeGate.toJSON());
|
|
313
|
+
this.gateUpdatesSinceLastPersist = 0;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Load persisted gate state. Call after persistence is initialized.
|
|
319
|
+
*/
|
|
320
|
+
loadPersistedState(): void {
|
|
321
|
+
if (this.persistence?.isInitialized) {
|
|
322
|
+
const saved = this.persistence.getSystemState<MoEGateState>('moe_gate');
|
|
323
|
+
if (saved) {
|
|
324
|
+
this.moeGate = MoEGate.fromJSON(saved);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Get the MoE gate (for persistence or inspection).
|
|
331
|
+
*/
|
|
332
|
+
getMoEGate(): MoEGate {
|
|
333
|
+
return this.moeGate;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Load MoE gate state from persisted data.
|
|
338
|
+
*/
|
|
339
|
+
loadGateState(state: MoEGateState): void {
|
|
340
|
+
this.moeGate = MoEGate.fromJSON(state);
|
|
341
|
+
}
|
|
342
|
+
|
|
244
343
|
/**
|
|
245
344
|
* Update configuration
|
|
246
345
|
*/
|
|
247
346
|
updateConfig(config: Partial<RouterConfig>): void {
|
|
248
347
|
this.config = { ...this.config, ...config };
|
|
249
348
|
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Check if a string is a valid routing strategy.
|
|
352
|
+
*/
|
|
353
|
+
private isValidStrategy(s: string): boolean {
|
|
354
|
+
return ['direct', 'adapt', 'explore', 'fallback'].includes(s);
|
|
355
|
+
}
|
|
250
356
|
}
|
|
251
357
|
|
|
252
358
|
/**
|
|
@@ -255,7 +361,8 @@ export class TaskRouter {
|
|
|
255
361
|
export function createRouter(
|
|
256
362
|
memory: MemorySystem,
|
|
257
363
|
config?: Partial<RouterConfig>,
|
|
258
|
-
metaLearner?: MetaLearner
|
|
364
|
+
metaLearner?: MetaLearner,
|
|
365
|
+
persistence?: SqlitePersistence
|
|
259
366
|
): TaskRouter {
|
|
260
|
-
return new TaskRouter(memory, config, metaLearner);
|
|
367
|
+
return new TaskRouter(memory, config, metaLearner, persistence);
|
|
261
368
|
}
|