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
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InstantLoop — Hot-path, per-trajectory learning
|
|
3
|
+
*
|
|
4
|
+
* Runs synchronously after every trajectory completion (<200ms budget).
|
|
5
|
+
* No LLM calls. No batch thresholds. Pure in-memory updates:
|
|
6
|
+
*
|
|
7
|
+
* 1. Store experience via MemorySystem.storeTrajectory()
|
|
8
|
+
* 2. Bump matched playbooks (recordSuccess / recordFailure)
|
|
9
|
+
* 3. Extract lightweight knowledge notes (heuristic only)
|
|
10
|
+
* 4. Access scores are bumped automatically by the memory layer
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { Trajectory } from '../types/index.js';
|
|
14
|
+
import { createObservation } from '../types/knowledge.js';
|
|
15
|
+
import type { MemorySystem } from '../memory/system.js';
|
|
16
|
+
import type { PlaybookMatch } from '../memory/playbook.js';
|
|
17
|
+
import type { CausalEdge } from '../memory/causal-store.js';
|
|
18
|
+
import { ReflexionGenerator, type ReflexionGeneratorConfig } from './reflexion-generator.js';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Result of a single instant-loop pass
|
|
22
|
+
*/
|
|
23
|
+
export interface InstantLoopResult {
|
|
24
|
+
/** ID of the stored experience */
|
|
25
|
+
experienceId: string;
|
|
26
|
+
/** Playbooks whose confidence was updated */
|
|
27
|
+
matchedPlaybooks: Array<{ id: string; confidenceDelta: number }>;
|
|
28
|
+
/** Number of knowledge notes extracted (0 if knowledge bank disabled) */
|
|
29
|
+
knowledgeNotesExtracted: number;
|
|
30
|
+
/** Number of causal edges extracted */
|
|
31
|
+
causalEdgesExtracted: number;
|
|
32
|
+
/** ID of the generated reflexion episode (if reflexion is enabled) */
|
|
33
|
+
reflexionEpisodeId?: string;
|
|
34
|
+
/** Wall-clock duration of the instant loop in ms */
|
|
35
|
+
durationMs: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* InstantLoop configuration
|
|
40
|
+
*/
|
|
41
|
+
export interface InstantLoopConfig {
|
|
42
|
+
/** Max knowledge notes to extract per trajectory (default: 3) */
|
|
43
|
+
maxInstantKnowledgeNotes?: number;
|
|
44
|
+
/** Max playbooks to match per trajectory (default: 3) */
|
|
45
|
+
maxPlaybookMatches?: number;
|
|
46
|
+
/** Enable reflexion episode generation (default: true) */
|
|
47
|
+
enableReflexion?: boolean;
|
|
48
|
+
/** Enable causal edge extraction (default: true) */
|
|
49
|
+
enableCausalExtraction?: boolean;
|
|
50
|
+
/** Configuration for the reflexion generator */
|
|
51
|
+
reflexionConfig?: ReflexionGeneratorConfig;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* InstantLoop — lightweight, per-trajectory learning
|
|
56
|
+
*/
|
|
57
|
+
export class InstantLoop {
|
|
58
|
+
private memory: MemorySystem;
|
|
59
|
+
private config: Required<Pick<InstantLoopConfig, 'maxInstantKnowledgeNotes' | 'maxPlaybookMatches' | 'enableReflexion' | 'enableCausalExtraction'>>;
|
|
60
|
+
private reflexionGenerator: ReflexionGenerator;
|
|
61
|
+
|
|
62
|
+
constructor(memory: MemorySystem, config?: InstantLoopConfig) {
|
|
63
|
+
this.memory = memory;
|
|
64
|
+
this.config = {
|
|
65
|
+
maxInstantKnowledgeNotes: config?.maxInstantKnowledgeNotes ?? 3,
|
|
66
|
+
maxPlaybookMatches: config?.maxPlaybookMatches ?? 3,
|
|
67
|
+
enableReflexion: config?.enableReflexion ?? true,
|
|
68
|
+
enableCausalExtraction: config?.enableCausalExtraction ?? true,
|
|
69
|
+
};
|
|
70
|
+
this.reflexionGenerator = new ReflexionGenerator(config?.reflexionConfig);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Process a single trajectory immediately after completion.
|
|
75
|
+
* Target: <200ms for typical trajectories.
|
|
76
|
+
*/
|
|
77
|
+
async process(trajectory: Trajectory): Promise<InstantLoopResult> {
|
|
78
|
+
const start = Date.now();
|
|
79
|
+
|
|
80
|
+
// 1. Store experience
|
|
81
|
+
const experience = await this.memory.storeTrajectory(trajectory);
|
|
82
|
+
|
|
83
|
+
// 2. Find matching playbooks and bump confidence
|
|
84
|
+
const matchResult = await this.bumpPlaybooks(trajectory);
|
|
85
|
+
|
|
86
|
+
// 3. Extract lightweight knowledge (heuristic, no LLM)
|
|
87
|
+
const knowledgeNotesExtracted = await this.extractKnowledge(trajectory);
|
|
88
|
+
|
|
89
|
+
// 4. Extract lightweight causal edges (if enabled)
|
|
90
|
+
const causalEdgesExtracted = this.config.enableCausalExtraction
|
|
91
|
+
? await this.extractCausalEdges(trajectory)
|
|
92
|
+
: 0;
|
|
93
|
+
|
|
94
|
+
// 5. Generate and store reflexion episode
|
|
95
|
+
let reflexionEpisodeId: string | undefined;
|
|
96
|
+
if (this.config.enableReflexion) {
|
|
97
|
+
try {
|
|
98
|
+
const episode = await this.reflexionGenerator.generate(
|
|
99
|
+
trajectory,
|
|
100
|
+
matchResult.playbookMatches
|
|
101
|
+
);
|
|
102
|
+
await this.memory.reflexion.add(episode);
|
|
103
|
+
reflexionEpisodeId = episode.id;
|
|
104
|
+
} catch {
|
|
105
|
+
// Non-critical — don't fail the instant loop for reflexion errors
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return {
|
|
110
|
+
experienceId: experience.id,
|
|
111
|
+
matchedPlaybooks: matchResult.deltas,
|
|
112
|
+
knowledgeNotesExtracted,
|
|
113
|
+
causalEdgesExtracted,
|
|
114
|
+
reflexionEpisodeId,
|
|
115
|
+
durationMs: Date.now() - start,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Find matching playbooks and update their confidence based on trajectory outcome.
|
|
121
|
+
* Returns both confidence deltas and the original PlaybookMatch objects for reflexion.
|
|
122
|
+
*/
|
|
123
|
+
private async bumpPlaybooks(
|
|
124
|
+
trajectory: Trajectory
|
|
125
|
+
): Promise<{
|
|
126
|
+
deltas: Array<{ id: string; confidenceDelta: number }>;
|
|
127
|
+
playbookMatches: PlaybookMatch[];
|
|
128
|
+
}> {
|
|
129
|
+
const deltas: Array<{ id: string; confidenceDelta: number }> = [];
|
|
130
|
+
|
|
131
|
+
// Find playbooks matching this trajectory's task description
|
|
132
|
+
let matches: PlaybookMatch[];
|
|
133
|
+
try {
|
|
134
|
+
matches = await this.memory.playbooks.findMatching(
|
|
135
|
+
trajectory.task.description,
|
|
136
|
+
{
|
|
137
|
+
k: this.config.maxPlaybookMatches,
|
|
138
|
+
domains: trajectory.task.domain ? [trajectory.task.domain] : undefined,
|
|
139
|
+
minScore: 0.3,
|
|
140
|
+
}
|
|
141
|
+
);
|
|
142
|
+
} catch {
|
|
143
|
+
return { deltas, playbookMatches: [] };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
for (const match of matches) {
|
|
147
|
+
const before = match.playbook.confidence;
|
|
148
|
+
|
|
149
|
+
if (trajectory.outcome.success) {
|
|
150
|
+
await this.memory.playbooks.recordSuccess(
|
|
151
|
+
match.playbook.id,
|
|
152
|
+
trajectory.id,
|
|
153
|
+
trajectory.task.domain,
|
|
154
|
+
);
|
|
155
|
+
} else {
|
|
156
|
+
await this.memory.playbooks.recordFailure(
|
|
157
|
+
match.playbook.id,
|
|
158
|
+
trajectory.id,
|
|
159
|
+
trajectory.task.domain ?? 'unknown',
|
|
160
|
+
trajectory.outcome.errorInfo ?? 'Unknown failure',
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Read back the updated confidence
|
|
165
|
+
const updated = await this.memory.playbooks.get(match.playbook.id);
|
|
166
|
+
const after = updated?.confidence ?? before;
|
|
167
|
+
|
|
168
|
+
deltas.push({
|
|
169
|
+
id: match.playbook.id,
|
|
170
|
+
confidenceDelta: after - before,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return { deltas, playbookMatches: matches };
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Extract lightweight knowledge from a trajectory (heuristic, no LLM).
|
|
179
|
+
*
|
|
180
|
+
* Parses error messages, tool names, and file paths from trajectory steps
|
|
181
|
+
* and stores them as KnowledgeNote observations.
|
|
182
|
+
*/
|
|
183
|
+
private async extractKnowledge(trajectory: Trajectory): Promise<number> {
|
|
184
|
+
const kb = this.memory.knowledgeBank;
|
|
185
|
+
if (!kb) return 0;
|
|
186
|
+
|
|
187
|
+
const notes: Array<{ subject: string; content: string }> = [];
|
|
188
|
+
|
|
189
|
+
// Extract error patterns from failed steps
|
|
190
|
+
if (!trajectory.outcome.success && trajectory.outcome.errorInfo) {
|
|
191
|
+
notes.push({
|
|
192
|
+
subject: `error:${trajectory.task.domain ?? 'general'}`,
|
|
193
|
+
content: `Error encountered: ${trajectory.outcome.errorInfo.slice(0, 300)}`,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Extract tool usage patterns from steps
|
|
198
|
+
const toolNames = new Set<string>();
|
|
199
|
+
const filePaths = new Set<string>();
|
|
200
|
+
|
|
201
|
+
for (const step of trajectory.steps) {
|
|
202
|
+
// Extract tool names from action strings
|
|
203
|
+
const toolMatch = step.action?.match(/^(\w+(?:[A-Z]\w*)*)\s/);
|
|
204
|
+
if (toolMatch) {
|
|
205
|
+
toolNames.add(toolMatch[1]);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Extract file paths from observations
|
|
209
|
+
const pathMatches = step.observation?.match(
|
|
210
|
+
/(?:\/[\w.-]+)+(?:\.[\w]+)/g
|
|
211
|
+
);
|
|
212
|
+
if (pathMatches) {
|
|
213
|
+
for (const p of pathMatches.slice(0, 5)) {
|
|
214
|
+
filePaths.add(p);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Create a tool-usage note if tools were used
|
|
220
|
+
if (toolNames.size > 0 && trajectory.outcome.success) {
|
|
221
|
+
notes.push({
|
|
222
|
+
subject: `tools:${trajectory.task.domain ?? 'general'}`,
|
|
223
|
+
content: `Successful approach used tools: ${[...toolNames].join(', ')}`,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Create a file-paths note for context
|
|
228
|
+
if (filePaths.size > 0) {
|
|
229
|
+
notes.push({
|
|
230
|
+
subject: `files:${trajectory.task.domain ?? 'general'}`,
|
|
231
|
+
content: `Files involved: ${[...filePaths].slice(0, 10).join(', ')}`,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Store up to maxInstantKnowledgeNotes
|
|
236
|
+
const domain = trajectory.task.domain ?? 'general';
|
|
237
|
+
let stored = 0;
|
|
238
|
+
for (const note of notes.slice(0, this.config.maxInstantKnowledgeNotes)) {
|
|
239
|
+
try {
|
|
240
|
+
const observation = createObservation({
|
|
241
|
+
title: note.subject,
|
|
242
|
+
body: note.content,
|
|
243
|
+
domain: [domain],
|
|
244
|
+
entities: [note.subject],
|
|
245
|
+
confidence: trajectory.outcome.success ? 0.7 : 0.4,
|
|
246
|
+
source: {
|
|
247
|
+
origin: 'extracted',
|
|
248
|
+
trajectories: [trajectory.id],
|
|
249
|
+
},
|
|
250
|
+
});
|
|
251
|
+
await kb.addObservation(observation);
|
|
252
|
+
stored++;
|
|
253
|
+
} catch {
|
|
254
|
+
// Non-critical — don't fail the instant loop for knowledge extraction errors
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return stored;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Extract lightweight causal edges from a trajectory.
|
|
263
|
+
*
|
|
264
|
+
* From failed trajectories: error message → root cause (if identifiable)
|
|
265
|
+
* From successful trajectories: approach → outcome patterns
|
|
266
|
+
*/
|
|
267
|
+
private async extractCausalEdges(trajectory: Trajectory): Promise<number> {
|
|
268
|
+
const causalStore = this.memory.causal;
|
|
269
|
+
let extracted = 0;
|
|
270
|
+
const domain = trajectory.task.domain ?? 'general';
|
|
271
|
+
const now = new Date();
|
|
272
|
+
|
|
273
|
+
try {
|
|
274
|
+
if (!trajectory.outcome.success && trajectory.outcome.errorInfo) {
|
|
275
|
+
// Failed trajectory: extract error → root cause pattern
|
|
276
|
+
const errorInfo = trajectory.outcome.errorInfo.slice(0, 300);
|
|
277
|
+
const taskDesc = trajectory.task.description.slice(0, 200);
|
|
278
|
+
|
|
279
|
+
const edge: CausalEdge = {
|
|
280
|
+
id: `ce-fail-${trajectory.id}`,
|
|
281
|
+
cause: `Task: ${taskDesc}`,
|
|
282
|
+
effect: `Error: ${errorInfo}`,
|
|
283
|
+
confidence: 0.4,
|
|
284
|
+
domain,
|
|
285
|
+
sourceTrajectoryIds: [trajectory.id],
|
|
286
|
+
observedCount: 1,
|
|
287
|
+
createdAt: now,
|
|
288
|
+
updatedAt: now,
|
|
289
|
+
};
|
|
290
|
+
await causalStore.add(edge);
|
|
291
|
+
extracted++;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
if (trajectory.outcome.success) {
|
|
295
|
+
// Successful trajectory: approach → outcome
|
|
296
|
+
const taskDesc = trajectory.task.description.slice(0, 200);
|
|
297
|
+
const solutionSummary = trajectory.outcome.solution !== undefined
|
|
298
|
+
? String(trajectory.outcome.solution).slice(0, 200)
|
|
299
|
+
: 'Task completed successfully';
|
|
300
|
+
|
|
301
|
+
const edge: CausalEdge = {
|
|
302
|
+
id: `ce-succ-${trajectory.id}`,
|
|
303
|
+
cause: `Approach: ${taskDesc}`,
|
|
304
|
+
effect: `Outcome: ${solutionSummary}`,
|
|
305
|
+
confidence: 0.7,
|
|
306
|
+
domain,
|
|
307
|
+
sourceTrajectoryIds: [trajectory.id],
|
|
308
|
+
observedCount: 1,
|
|
309
|
+
createdAt: now,
|
|
310
|
+
updatedAt: now,
|
|
311
|
+
};
|
|
312
|
+
await causalStore.add(edge);
|
|
313
|
+
extracted++;
|
|
314
|
+
|
|
315
|
+
// Extract tool → outcome edges from steps with high attribution
|
|
316
|
+
for (const step of trajectory.steps) {
|
|
317
|
+
if (
|
|
318
|
+
step.attributionScore !== undefined &&
|
|
319
|
+
step.attributionScore > 0.7 &&
|
|
320
|
+
step.action
|
|
321
|
+
) {
|
|
322
|
+
const toolMatch = step.action.match(/^(\w+(?:[A-Z]\w*)*)\s/);
|
|
323
|
+
if (toolMatch) {
|
|
324
|
+
const toolEdge: CausalEdge = {
|
|
325
|
+
id: `ce-tool-${trajectory.id}-${toolMatch[1]}`,
|
|
326
|
+
cause: `Used tool ${toolMatch[1]} for ${domain} task`,
|
|
327
|
+
effect: `Contributed to successful outcome (attribution: ${step.attributionScore.toFixed(2)})`,
|
|
328
|
+
confidence: 0.5,
|
|
329
|
+
domain,
|
|
330
|
+
sourceTrajectoryIds: [trajectory.id],
|
|
331
|
+
observedCount: 1,
|
|
332
|
+
createdAt: now,
|
|
333
|
+
updatedAt: now,
|
|
334
|
+
};
|
|
335
|
+
await causalStore.add(toolEdge);
|
|
336
|
+
extracted++;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
} catch {
|
|
342
|
+
// Non-critical — don't fail the instant loop for causal extraction errors
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
return extracted;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Create an InstantLoop
|
|
351
|
+
*/
|
|
352
|
+
export function createInstantLoop(
|
|
353
|
+
memory: MemorySystem,
|
|
354
|
+
config?: InstantLoopConfig
|
|
355
|
+
): InstantLoop {
|
|
356
|
+
return new InstantLoop(memory, config);
|
|
357
|
+
}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MaintenanceScheduler — Circadian-style duty-gated maintenance scheduling.
|
|
3
|
+
*
|
|
4
|
+
* Inspired by ruvector's CircadianController (ruvector-nervous-system/routing/circadian.rs).
|
|
5
|
+
* Gates background maintenance work using configurable triggers:
|
|
6
|
+
*
|
|
7
|
+
* - 'manual': Only runs when explicitly requested
|
|
8
|
+
* - 'afterNBatches': Runs after N batch cycles complete
|
|
9
|
+
* - 'periodic': Runs on a time interval
|
|
10
|
+
*
|
|
11
|
+
* Maintenance tasks are deferred during active batch processing to avoid
|
|
12
|
+
* contention. A duty-factor model ensures maintenance doesn't starve
|
|
13
|
+
* the primary learning pipeline.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Maintenance trigger mode.
|
|
18
|
+
*/
|
|
19
|
+
export type MaintenanceMode = 'manual' | 'afterNBatches' | 'periodic';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Configuration for the MaintenanceScheduler.
|
|
23
|
+
*/
|
|
24
|
+
export interface MaintenanceSchedulerConfig {
|
|
25
|
+
/** Trigger mode (default: 'afterNBatches') */
|
|
26
|
+
mode: MaintenanceMode;
|
|
27
|
+
/** For 'afterNBatches' mode: batches between maintenance runs (default: 5) */
|
|
28
|
+
batchInterval: number;
|
|
29
|
+
/** For 'periodic' mode: milliseconds between runs (default: 3600000 = 1h) */
|
|
30
|
+
intervalMs: number;
|
|
31
|
+
/** Skip maintenance if a batch is currently running (default: true) */
|
|
32
|
+
deferDuringBatch: boolean;
|
|
33
|
+
/** Maximum queued maintenance tasks before dropping oldest (default: 10) */
|
|
34
|
+
maxQueueSize: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const DEFAULT_CONFIG: MaintenanceSchedulerConfig = {
|
|
38
|
+
mode: 'afterNBatches',
|
|
39
|
+
batchInterval: 5,
|
|
40
|
+
intervalMs: 3_600_000,
|
|
41
|
+
deferDuringBatch: true,
|
|
42
|
+
maxQueueSize: 10,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* A maintenance task that can be scheduled.
|
|
47
|
+
*/
|
|
48
|
+
export interface MaintenanceTask {
|
|
49
|
+
/** Unique name for this task (e.g., 'knowledge-defrag', 'temporal-compression') */
|
|
50
|
+
name: string;
|
|
51
|
+
/** Priority (higher = run first) */
|
|
52
|
+
priority: number;
|
|
53
|
+
/** The async work to perform */
|
|
54
|
+
execute: () => Promise<MaintenanceTaskResult>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Result of a maintenance task execution.
|
|
59
|
+
*/
|
|
60
|
+
export interface MaintenanceTaskResult {
|
|
61
|
+
taskName: string;
|
|
62
|
+
success: boolean;
|
|
63
|
+
durationMs: number;
|
|
64
|
+
details?: Record<string, unknown>;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Result of a full maintenance cycle.
|
|
69
|
+
*/
|
|
70
|
+
export interface MaintenanceCycleResult {
|
|
71
|
+
/** Whether the cycle actually ran (false if deferred or not due) */
|
|
72
|
+
ran: boolean;
|
|
73
|
+
/** Reason the cycle was skipped, if applicable */
|
|
74
|
+
skipReason?: 'not_due' | 'batch_in_progress' | 'manual_mode' | 'queue_empty';
|
|
75
|
+
/** Results from each task that ran */
|
|
76
|
+
taskResults: MaintenanceTaskResult[];
|
|
77
|
+
/** Total duration of the cycle in ms */
|
|
78
|
+
totalDurationMs: number;
|
|
79
|
+
/** Timestamp of this cycle */
|
|
80
|
+
timestamp: Date;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* MaintenanceScheduler — duty-gated background maintenance scheduling.
|
|
85
|
+
*/
|
|
86
|
+
export class MaintenanceScheduler {
|
|
87
|
+
private config: MaintenanceSchedulerConfig;
|
|
88
|
+
private registeredTasks: MaintenanceTask[] = [];
|
|
89
|
+
private batchesSinceLastMaintenance = 0;
|
|
90
|
+
private lastMaintenanceTime = 0;
|
|
91
|
+
private isBatchRunning = false;
|
|
92
|
+
private cycleHistory: MaintenanceCycleResult[] = [];
|
|
93
|
+
|
|
94
|
+
constructor(config?: Partial<MaintenanceSchedulerConfig>) {
|
|
95
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Register a maintenance task.
|
|
100
|
+
* Tasks are sorted by priority (descending) before execution.
|
|
101
|
+
*/
|
|
102
|
+
registerTask(task: MaintenanceTask): void {
|
|
103
|
+
// Replace existing task with same name
|
|
104
|
+
this.registeredTasks = this.registeredTasks.filter(t => t.name !== task.name);
|
|
105
|
+
this.registeredTasks.push(task);
|
|
106
|
+
this.registeredTasks.sort((a, b) => b.priority - a.priority);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Unregister a maintenance task by name.
|
|
111
|
+
*/
|
|
112
|
+
unregisterTask(name: string): void {
|
|
113
|
+
this.registeredTasks = this.registeredTasks.filter(t => t.name !== name);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Signal that a batch cycle has completed.
|
|
118
|
+
* For 'afterNBatches' mode, this increments the counter.
|
|
119
|
+
*/
|
|
120
|
+
onBatchComplete(): void {
|
|
121
|
+
this.batchesSinceLastMaintenance++;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Signal that a batch is starting (for deferral logic).
|
|
126
|
+
*/
|
|
127
|
+
onBatchStart(): void {
|
|
128
|
+
this.isBatchRunning = true;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Signal that a batch has finished running.
|
|
133
|
+
*/
|
|
134
|
+
onBatchEnd(): void {
|
|
135
|
+
this.isBatchRunning = false;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Check whether maintenance should run now.
|
|
140
|
+
*/
|
|
141
|
+
shouldRunMaintenance(): boolean {
|
|
142
|
+
if (this.config.mode === 'manual') return false;
|
|
143
|
+
if (this.config.deferDuringBatch && this.isBatchRunning) return false;
|
|
144
|
+
if (this.registeredTasks.length === 0) return false;
|
|
145
|
+
|
|
146
|
+
if (this.config.mode === 'afterNBatches') {
|
|
147
|
+
return this.batchesSinceLastMaintenance >= this.config.batchInterval;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (this.config.mode === 'periodic') {
|
|
151
|
+
const now = Date.now();
|
|
152
|
+
return (now - this.lastMaintenanceTime) >= this.config.intervalMs;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Run a maintenance cycle.
|
|
160
|
+
* Executes all registered tasks in priority order.
|
|
161
|
+
*
|
|
162
|
+
* Can be called manually regardless of mode — bypasses trigger checks.
|
|
163
|
+
*/
|
|
164
|
+
async runMaintenance(options?: { force?: boolean }): Promise<MaintenanceCycleResult> {
|
|
165
|
+
const start = Date.now();
|
|
166
|
+
|
|
167
|
+
// Check if we should run (unless forced)
|
|
168
|
+
if (!options?.force) {
|
|
169
|
+
if (this.config.deferDuringBatch && this.isBatchRunning) {
|
|
170
|
+
return this.skipResult('batch_in_progress', start);
|
|
171
|
+
}
|
|
172
|
+
if (this.registeredTasks.length === 0) {
|
|
173
|
+
return this.skipResult('queue_empty', start);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Execute tasks in priority order
|
|
178
|
+
const taskResults: MaintenanceTaskResult[] = [];
|
|
179
|
+
for (const task of this.registeredTasks) {
|
|
180
|
+
const taskStart = Date.now();
|
|
181
|
+
try {
|
|
182
|
+
const result = await task.execute();
|
|
183
|
+
taskResults.push(result);
|
|
184
|
+
} catch (error) {
|
|
185
|
+
taskResults.push({
|
|
186
|
+
taskName: task.name,
|
|
187
|
+
success: false,
|
|
188
|
+
durationMs: Date.now() - taskStart,
|
|
189
|
+
details: {
|
|
190
|
+
error: error instanceof Error ? error.message : String(error),
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Reset counters
|
|
197
|
+
this.batchesSinceLastMaintenance = 0;
|
|
198
|
+
this.lastMaintenanceTime = Date.now();
|
|
199
|
+
|
|
200
|
+
const result: MaintenanceCycleResult = {
|
|
201
|
+
ran: true,
|
|
202
|
+
taskResults,
|
|
203
|
+
totalDurationMs: Date.now() - start,
|
|
204
|
+
timestamp: new Date(),
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
this.cycleHistory.push(result);
|
|
208
|
+
if (this.cycleHistory.length > this.config.maxQueueSize) {
|
|
209
|
+
this.cycleHistory.shift();
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Get the list of registered tasks.
|
|
217
|
+
*/
|
|
218
|
+
getRegisteredTasks(): readonly MaintenanceTask[] {
|
|
219
|
+
return this.registeredTasks;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Get maintenance cycle history.
|
|
224
|
+
*/
|
|
225
|
+
getCycleHistory(): readonly MaintenanceCycleResult[] {
|
|
226
|
+
return this.cycleHistory;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Get the number of batches since last maintenance.
|
|
231
|
+
*/
|
|
232
|
+
getBatchesSinceLastMaintenance(): number {
|
|
233
|
+
return this.batchesSinceLastMaintenance;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Get current configuration.
|
|
238
|
+
*/
|
|
239
|
+
getConfig(): Readonly<MaintenanceSchedulerConfig> {
|
|
240
|
+
return this.config;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Update configuration.
|
|
245
|
+
*/
|
|
246
|
+
updateConfig(config: Partial<MaintenanceSchedulerConfig>): void {
|
|
247
|
+
this.config = { ...this.config, ...config };
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
private skipResult(
|
|
251
|
+
reason: MaintenanceCycleResult['skipReason'],
|
|
252
|
+
start: number,
|
|
253
|
+
): MaintenanceCycleResult {
|
|
254
|
+
return {
|
|
255
|
+
ran: false,
|
|
256
|
+
skipReason: reason,
|
|
257
|
+
taskResults: [],
|
|
258
|
+
totalDurationMs: Date.now() - start,
|
|
259
|
+
timestamp: new Date(),
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Create a MaintenanceScheduler.
|
|
266
|
+
*/
|
|
267
|
+
export function createMaintenanceScheduler(
|
|
268
|
+
config?: Partial<MaintenanceSchedulerConfig>,
|
|
269
|
+
): MaintenanceScheduler {
|
|
270
|
+
return new MaintenanceScheduler(config);
|
|
271
|
+
}
|
|
@@ -17,6 +17,7 @@ import { createMetaObservation, createMetaStrategy } from '../types/index.js';
|
|
|
17
17
|
import type { MetaMemory } from '../memory/meta.js';
|
|
18
18
|
import type { PlaybookMatch } from '../memory/playbook.js';
|
|
19
19
|
import type { MetaReflectionOutput } from '../workspace/templates/meta-reflection.js';
|
|
20
|
+
import { detectRepeatedActions, extractToolNames } from '../utils/trajectory-helpers.js';
|
|
20
21
|
|
|
21
22
|
/**
|
|
22
23
|
* Routing decision from the router
|
|
@@ -375,31 +376,12 @@ export class MetaLearner {
|
|
|
375
376
|
toolsUsed: string[];
|
|
376
377
|
} {
|
|
377
378
|
const steps = trajectory.steps;
|
|
378
|
-
const toolsUsed = new Set<string>();
|
|
379
|
-
let backtrackingOccurred = false;
|
|
380
|
-
|
|
381
|
-
// Collect tools used (extract from action)
|
|
382
|
-
for (const step of steps) {
|
|
383
|
-
// Try to extract tool name from action (e.g., "tool_use: Bash" or just "Bash")
|
|
384
|
-
const toolMatch = step.action.match(/^(?:tool_use:\s*)?(\w+)/);
|
|
385
|
-
if (toolMatch) {
|
|
386
|
-
toolsUsed.add(toolMatch[1]);
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
379
|
|
|
390
|
-
//
|
|
391
|
-
const
|
|
392
|
-
for (const step of steps) {
|
|
393
|
-
const normalized = step.action.toLowerCase().slice(0, 50);
|
|
394
|
-
actionCounts.set(normalized, (actionCounts.get(normalized) ?? 0) + 1);
|
|
395
|
-
}
|
|
380
|
+
// Collect tools used
|
|
381
|
+
const toolsUsed = extractToolNames(steps);
|
|
396
382
|
|
|
397
|
-
for (
|
|
398
|
-
|
|
399
|
-
backtrackingOccurred = true;
|
|
400
|
-
break;
|
|
401
|
-
}
|
|
402
|
-
}
|
|
383
|
+
// Check for backtracking (similar actions repeated)
|
|
384
|
+
const backtrackingOccurred = detectRepeatedActions(steps, 3).length > 0;
|
|
403
385
|
|
|
404
386
|
// Check for decomposition (multiple sub-tasks)
|
|
405
387
|
const decompositionUsed =
|