cognitive-core 0.2.4 → 0.3.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/LICENSE +21 -0
- package/README.md +88 -143
- package/dist/agents/mock-provider.d.ts.map +1 -1
- package/dist/agents/mock-provider.js.map +1 -1
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/types.js +5 -4
- package/dist/agents/types.js.map +1 -1
- package/dist/atlas.d.ts +309 -97
- package/dist/atlas.d.ts.map +1 -1
- package/dist/atlas.js +743 -277
- package/dist/atlas.js.map +1 -1
- package/dist/bin/cli-utils.d.ts +25 -2
- package/dist/bin/cli-utils.d.ts.map +1 -1
- package/dist/bin/cli-utils.js +79 -9
- package/dist/bin/cli-utils.js.map +1 -1
- package/dist/bin/cognitive-core.js +32 -0
- package/dist/bin/cognitive-core.js.map +1 -1
- package/dist/bin/commands/dream.d.ts +17 -0
- package/dist/bin/commands/dream.d.ts.map +1 -0
- package/dist/bin/commands/dream.js +168 -0
- package/dist/bin/commands/dream.js.map +1 -0
- package/dist/bin/commands/eval.d.ts +181 -0
- package/dist/bin/commands/eval.d.ts.map +1 -0
- package/dist/bin/commands/eval.js +1582 -0
- package/dist/bin/commands/eval.js.map +1 -0
- package/dist/bin/commands/kb.js +0 -8
- package/dist/bin/commands/kb.js.map +1 -1
- package/dist/bin/commands/learn.js +12 -4
- package/dist/bin/commands/learn.js.map +1 -1
- package/dist/bin/commands/legacy.d.ts.map +1 -1
- package/dist/bin/commands/legacy.js +1 -1
- package/dist/bin/commands/legacy.js.map +1 -1
- package/dist/bin/commands/run.d.ts.map +1 -1
- package/dist/bin/commands/run.js +10 -9
- package/dist/bin/commands/run.js.map +1 -1
- package/dist/bin/commands/sessions.d.ts.map +1 -1
- package/dist/bin/commands/sessions.js.map +1 -1
- package/dist/bin/commands/skills.d.ts.map +1 -1
- package/dist/bin/commands/skills.js +283 -1
- package/dist/bin/commands/skills.js.map +1 -1
- package/dist/embeddings/bm25.d.ts.map +1 -1
- package/dist/embeddings/bm25.js +1 -2
- package/dist/embeddings/bm25.js.map +1 -1
- package/dist/embeddings/index.d.ts +3 -3
- package/dist/embeddings/index.d.ts.map +1 -1
- package/dist/embeddings/index.js +3 -3
- package/dist/embeddings/index.js.map +1 -1
- package/dist/embeddings/inverted-index.js +62 -7
- package/dist/embeddings/inverted-index.js.map +1 -1
- package/dist/embeddings/manager.d.ts.map +1 -1
- package/dist/embeddings/manager.js +6 -5
- package/dist/embeddings/manager.js.map +1 -1
- package/dist/embeddings/provider.d.ts +96 -5
- package/dist/embeddings/provider.d.ts.map +1 -1
- package/dist/embeddings/provider.js +171 -48
- package/dist/embeddings/provider.js.map +1 -1
- package/dist/embeddings/vector-store.d.ts.map +1 -1
- package/dist/embeddings/vector-store.js +3 -1
- package/dist/embeddings/vector-store.js.map +1 -1
- package/dist/eval/ablation-validate.d.ts +12 -0
- package/dist/eval/ablation-validate.d.ts.map +1 -0
- package/dist/eval/ablation-validate.js +78 -0
- package/dist/eval/ablation-validate.js.map +1 -0
- package/dist/eval/ablation.d.ts +94 -0
- package/dist/eval/ablation.d.ts.map +1 -0
- package/dist/eval/ablation.js +161 -0
- package/dist/eval/ablation.js.map +1 -0
- package/dist/eval/ci-smoke.d.ts +11 -0
- package/dist/eval/ci-smoke.d.ts.map +1 -0
- package/dist/eval/ci-smoke.js +49 -0
- package/dist/eval/ci-smoke.js.map +1 -0
- package/dist/eval/diagnostics.d.ts +214 -0
- package/dist/eval/diagnostics.d.ts.map +1 -0
- package/dist/eval/diagnostics.js +107 -0
- package/dist/eval/diagnostics.js.map +1 -0
- package/dist/eval/index.d.ts +27 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +27 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/live/alfworld.d.ts +248 -0
- package/dist/eval/live/alfworld.d.ts.map +1 -0
- package/dist/eval/live/alfworld.js +637 -0
- package/dist/eval/live/alfworld.js.map +1 -0
- package/dist/eval/live/alfworld_h1.d.ts +16 -0
- package/dist/eval/live/alfworld_h1.d.ts.map +1 -0
- package/dist/eval/live/alfworld_h1.js +75 -0
- package/dist/eval/live/alfworld_h1.js.map +1 -0
- package/dist/eval/live/alfworld_memory.d.ts +38 -0
- package/dist/eval/live/alfworld_memory.d.ts.map +1 -0
- package/dist/eval/live/alfworld_memory.js +184 -0
- package/dist/eval/live/alfworld_memory.js.map +1 -0
- package/dist/eval/live/alfworld_strategy.d.ts +65 -0
- package/dist/eval/live/alfworld_strategy.d.ts.map +1 -0
- package/dist/eval/live/alfworld_strategy.js +89 -0
- package/dist/eval/live/alfworld_strategy.js.map +1 -0
- package/dist/eval/live/azure-openai-llm-provider.d.ts +41 -0
- package/dist/eval/live/azure-openai-llm-provider.d.ts.map +1 -0
- package/dist/eval/live/azure-openai-llm-provider.js +92 -0
- package/dist/eval/live/azure-openai-llm-provider.js.map +1 -0
- package/dist/eval/live/bridges/skillflow_e2b_bridge.d.ts +3 -0
- package/dist/eval/live/bridges/skillflow_e2b_bridge.d.ts.map +1 -0
- package/dist/eval/live/bridges/skillflow_e2b_bridge.js +12 -0
- package/dist/eval/live/bridges/skillflow_e2b_bridge.js.map +1 -0
- package/dist/eval/live/claude-cli-llm-provider.d.ts +53 -0
- package/dist/eval/live/claude-cli-llm-provider.d.ts.map +1 -0
- package/dist/eval/live/claude-cli-llm-provider.js +71 -0
- package/dist/eval/live/claude-cli-llm-provider.js.map +1 -0
- package/dist/eval/live/claude-cli.d.ts +96 -0
- package/dist/eval/live/claude-cli.d.ts.map +1 -0
- package/dist/eval/live/claude-cli.js +314 -0
- package/dist/eval/live/claude-cli.js.map +1 -0
- package/dist/eval/live/claude-delegate.d.ts +41 -0
- package/dist/eval/live/claude-delegate.d.ts.map +1 -0
- package/dist/eval/live/claude-delegate.js +59 -0
- package/dist/eval/live/claude-delegate.js.map +1 -0
- package/dist/eval/live/claude-workspace-backend.d.ts +24 -0
- package/dist/eval/live/claude-workspace-backend.d.ts.map +1 -0
- package/dist/eval/live/claude-workspace-backend.js +76 -0
- package/dist/eval/live/claude-workspace-backend.js.map +1 -0
- package/dist/eval/live/clbench.d.ts +64 -0
- package/dist/eval/live/clbench.d.ts.map +1 -0
- package/dist/eval/live/clbench.js +291 -0
- package/dist/eval/live/clbench.js.map +1 -0
- package/dist/eval/live/cold-reuse.d.ts +21 -0
- package/dist/eval/live/cold-reuse.d.ts.map +1 -0
- package/dist/eval/live/cold-reuse.js +102 -0
- package/dist/eval/live/cold-reuse.js.map +1 -0
- package/dist/eval/live/difficulty-registry.d.ts +68 -0
- package/dist/eval/live/difficulty-registry.d.ts.map +1 -0
- package/dist/eval/live/difficulty-registry.js +169 -0
- package/dist/eval/live/difficulty-registry.js.map +1 -0
- package/dist/eval/live/docker.d.ts +52 -0
- package/dist/eval/live/docker.d.ts.map +1 -0
- package/dist/eval/live/docker.js +164 -0
- package/dist/eval/live/docker.js.map +1 -0
- package/dist/eval/live/env-bridge.d.ts +68 -0
- package/dist/eval/live/env-bridge.d.ts.map +1 -0
- package/dist/eval/live/env-bridge.js +188 -0
- package/dist/eval/live/env-bridge.js.map +1 -0
- package/dist/eval/live/gsm8k.d.ts +44 -0
- package/dist/eval/live/gsm8k.d.ts.map +1 -0
- package/dist/eval/live/gsm8k.js +142 -0
- package/dist/eval/live/gsm8k.js.map +1 -0
- package/dist/eval/live/index.d.ts +38 -0
- package/dist/eval/live/index.d.ts.map +1 -0
- package/dist/eval/live/index.js +38 -0
- package/dist/eval/live/index.js.map +1 -0
- package/dist/eval/live/lifelongagent.d.ts +64 -0
- package/dist/eval/live/lifelongagent.d.ts.map +1 -0
- package/dist/eval/live/lifelongagent.js +216 -0
- package/dist/eval/live/lifelongagent.js.map +1 -0
- package/dist/eval/live/lift-registry.d.ts +128 -0
- package/dist/eval/live/lift-registry.d.ts.map +1 -0
- package/dist/eval/live/lift-registry.js +147 -0
- package/dist/eval/live/lift-registry.js.map +1 -0
- package/dist/eval/live/live-benchmark.d.ts +84 -0
- package/dist/eval/live/live-benchmark.d.ts.map +1 -0
- package/dist/eval/live/live-benchmark.js +2 -0
- package/dist/eval/live/live-benchmark.js.map +1 -0
- package/dist/eval/live/live-runner.d.ts +609 -0
- package/dist/eval/live/live-runner.d.ts.map +1 -0
- package/dist/eval/live/live-runner.js +1409 -0
- package/dist/eval/live/live-runner.js.map +1 -0
- package/dist/eval/live/refine.d.ts +88 -0
- package/dist/eval/live/refine.d.ts.map +1 -0
- package/dist/eval/live/refine.js +135 -0
- package/dist/eval/live/refine.js.map +1 -0
- package/dist/eval/live/registry-store.d.ts +109 -0
- package/dist/eval/live/registry-store.d.ts.map +1 -0
- package/dist/eval/live/registry-store.js +272 -0
- package/dist/eval/live/registry-store.js.map +1 -0
- package/dist/eval/live/run-checkpoint.d.ts +55 -0
- package/dist/eval/live/run-checkpoint.d.ts.map +1 -0
- package/dist/eval/live/run-checkpoint.js +86 -0
- package/dist/eval/live/run-checkpoint.js.map +1 -0
- package/dist/eval/live/run-resume.d.ts +22 -0
- package/dist/eval/live/run-resume.d.ts.map +1 -0
- package/dist/eval/live/run-resume.js +70 -0
- package/dist/eval/live/run-resume.js.map +1 -0
- package/dist/eval/live/skill-injector.d.ts +36 -0
- package/dist/eval/live/skill-injector.d.ts.map +1 -0
- package/dist/eval/live/skill-injector.js +81 -0
- package/dist/eval/live/skill-injector.js.map +1 -0
- package/dist/eval/live/skillflow-embedded-workbook-bundle.d.ts +3 -0
- package/dist/eval/live/skillflow-embedded-workbook-bundle.d.ts.map +1 -0
- package/dist/eval/live/skillflow-embedded-workbook-bundle.js +391 -0
- package/dist/eval/live/skillflow-embedded-workbook-bundle.js.map +1 -0
- package/dist/eval/live/skillflow.d.ts +154 -0
- package/dist/eval/live/skillflow.d.ts.map +1 -0
- package/dist/eval/live/skillflow.js +612 -0
- package/dist/eval/live/skillflow.js.map +1 -0
- package/dist/eval/live/skilllearnbench.d.ts +43 -0
- package/dist/eval/live/skilllearnbench.d.ts.map +1 -0
- package/dist/eval/live/skilllearnbench.js +154 -0
- package/dist/eval/live/skilllearnbench.js.map +1 -0
- package/dist/eval/live/skillopt_v1.d.ts +96 -0
- package/dist/eval/live/skillopt_v1.d.ts.map +1 -0
- package/dist/eval/live/skillopt_v1.js +0 -0
- package/dist/eval/live/skillopt_v1.js.map +1 -0
- package/dist/eval/live/skillopt_v1_causal.d.ts +26 -0
- package/dist/eval/live/skillopt_v1_causal.d.ts.map +1 -0
- package/dist/eval/live/skillopt_v1_causal.js +106 -0
- package/dist/eval/live/skillopt_v1_causal.js.map +1 -0
- package/dist/eval/live/skillopt_v1_memory.d.ts +53 -0
- package/dist/eval/live/skillopt_v1_memory.d.ts.map +1 -0
- package/dist/eval/live/skillopt_v1_memory.js +147 -0
- package/dist/eval/live/skillopt_v1_memory.js.map +1 -0
- package/dist/eval/live/skillopt_v1_rules.d.ts +39 -0
- package/dist/eval/live/skillopt_v1_rules.d.ts.map +1 -0
- package/dist/eval/live/skillopt_v1_rules.js +91 -0
- package/dist/eval/live/skillopt_v1_rules.js.map +1 -0
- package/dist/eval/live/skillsbench.d.ts +138 -0
- package/dist/eval/live/skillsbench.d.ts.map +1 -0
- package/dist/eval/live/skillsbench.js +626 -0
- package/dist/eval/live/skillsbench.js.map +1 -0
- package/dist/eval/live/stopping.d.ts +69 -0
- package/dist/eval/live/stopping.d.ts.map +1 -0
- package/dist/eval/live/stopping.js +213 -0
- package/dist/eval/live/stopping.js.map +1 -0
- package/dist/eval/live/trace.d.ts +20 -0
- package/dist/eval/live/trace.d.ts.map +1 -0
- package/dist/eval/live/trace.js +41 -0
- package/dist/eval/live/trace.js.map +1 -0
- package/dist/eval/mechanism-trace-adapter.d.ts +8 -0
- package/dist/eval/mechanism-trace-adapter.d.ts.map +1 -0
- package/dist/eval/mechanism-trace-adapter.js +118 -0
- package/dist/eval/mechanism-trace-adapter.js.map +1 -0
- package/dist/eval/memory-ab.d.ts +61 -0
- package/dist/eval/memory-ab.d.ts.map +1 -0
- package/dist/eval/memory-ab.js +161 -0
- package/dist/eval/memory-ab.js.map +1 -0
- package/dist/eval/memory-mock.d.ts +54 -0
- package/dist/eval/memory-mock.d.ts.map +1 -0
- package/dist/eval/memory-mock.js +129 -0
- package/dist/eval/memory-mock.js.map +1 -0
- package/dist/eval/memory-qa/index.d.ts +13 -0
- package/dist/eval/memory-qa/index.d.ts.map +1 -0
- package/dist/eval/memory-qa/index.js +13 -0
- package/dist/eval/memory-qa/index.js.map +1 -0
- package/dist/eval/memory-qa/iterative.d.ts +80 -0
- package/dist/eval/memory-qa/iterative.d.ts.map +1 -0
- package/dist/eval/memory-qa/iterative.js +107 -0
- package/dist/eval/memory-qa/iterative.js.map +1 -0
- package/dist/eval/memory-qa/loaders.d.ts +11 -0
- package/dist/eval/memory-qa/loaders.d.ts.map +1 -0
- package/dist/eval/memory-qa/loaders.js +21 -0
- package/dist/eval/memory-qa/loaders.js.map +1 -0
- package/dist/eval/memory-qa/metrics.d.ts +3 -0
- package/dist/eval/memory-qa/metrics.d.ts.map +1 -0
- package/dist/eval/memory-qa/metrics.js +2 -0
- package/dist/eval/memory-qa/metrics.js.map +1 -0
- package/dist/eval/memory-qa/qa.d.ts +186 -0
- package/dist/eval/memory-qa/qa.d.ts.map +1 -0
- package/dist/eval/memory-qa/qa.js +424 -0
- package/dist/eval/memory-qa/qa.js.map +1 -0
- package/dist/eval/memory-qa/retrieval.d.ts +33 -0
- package/dist/eval/memory-qa/retrieval.d.ts.map +1 -0
- package/dist/eval/memory-qa/retrieval.js +44 -0
- package/dist/eval/memory-qa/retrieval.js.map +1 -0
- package/dist/eval/memory-qa/serving.d.ts +60 -0
- package/dist/eval/memory-qa/serving.d.ts.map +1 -0
- package/dist/eval/memory-qa/serving.js +267 -0
- package/dist/eval/memory-qa/serving.js.map +1 -0
- package/dist/eval/memory-qa/types.d.ts +2 -0
- package/dist/eval/memory-qa/types.d.ts.map +1 -0
- package/dist/eval/memory-qa/types.js +2 -0
- package/dist/eval/memory-qa/types.js.map +1 -0
- package/dist/eval/metrics.d.ts +120 -0
- package/dist/eval/metrics.d.ts.map +1 -0
- package/dist/eval/metrics.js +361 -0
- package/dist/eval/metrics.js.map +1 -0
- package/dist/eval/oracle-smoke.d.ts +75 -0
- package/dist/eval/oracle-smoke.d.ts.map +1 -0
- package/dist/eval/oracle-smoke.js +143 -0
- package/dist/eval/oracle-smoke.js.map +1 -0
- package/dist/eval/playbook-calibration-report.d.ts +40 -0
- package/dist/eval/playbook-calibration-report.d.ts.map +1 -0
- package/dist/eval/playbook-calibration-report.js +246 -0
- package/dist/eval/playbook-calibration-report.js.map +1 -0
- package/dist/eval/playbook-candidate-decisions-report.d.ts +36 -0
- package/dist/eval/playbook-candidate-decisions-report.d.ts.map +1 -0
- package/dist/eval/playbook-candidate-decisions-report.js +201 -0
- package/dist/eval/playbook-candidate-decisions-report.js.map +1 -0
- package/dist/eval/playbook-usage-report.d.ts +7 -0
- package/dist/eval/playbook-usage-report.d.ts.map +1 -0
- package/dist/eval/playbook-usage-report.js +222 -0
- package/dist/eval/playbook-usage-report.js.map +1 -0
- package/dist/eval/report.d.ts +28 -0
- package/dist/eval/report.d.ts.map +1 -0
- package/dist/eval/report.js +567 -0
- package/dist/eval/report.js.map +1 -0
- package/dist/eval/retrieval/corpus.d.ts +41 -0
- package/dist/eval/retrieval/corpus.d.ts.map +1 -0
- package/dist/eval/retrieval/corpus.js +158 -0
- package/dist/eval/retrieval/corpus.js.map +1 -0
- package/dist/eval/retrieval/index.d.ts +12 -0
- package/dist/eval/retrieval/index.d.ts.map +1 -0
- package/dist/eval/retrieval/index.js +14 -0
- package/dist/eval/retrieval/index.js.map +1 -0
- package/dist/eval/retrieval/knowledge-corpus.d.ts +91 -0
- package/dist/eval/retrieval/knowledge-corpus.d.ts.map +1 -0
- package/dist/eval/retrieval/knowledge-corpus.js +268 -0
- package/dist/eval/retrieval/knowledge-corpus.js.map +1 -0
- package/dist/eval/retrieval/knowledge-quality.d.ts +91 -0
- package/dist/eval/retrieval/knowledge-quality.d.ts.map +1 -0
- package/dist/eval/retrieval/knowledge-quality.js +247 -0
- package/dist/eval/retrieval/knowledge-quality.js.map +1 -0
- package/dist/eval/retrieval/ladder.d.ts +69 -0
- package/dist/eval/retrieval/ladder.d.ts.map +1 -0
- package/dist/eval/retrieval/ladder.js +80 -0
- package/dist/eval/retrieval/ladder.js.map +1 -0
- package/dist/eval/retrieval/quality.d.ts +39 -0
- package/dist/eval/retrieval/quality.d.ts.map +1 -0
- package/dist/eval/retrieval/quality.js +75 -0
- package/dist/eval/retrieval/quality.js.map +1 -0
- package/dist/eval/rng.d.ts +25 -0
- package/dist/eval/rng.d.ts.map +1 -0
- package/dist/eval/rng.js +43 -0
- package/dist/eval/rng.js.map +1 -0
- package/dist/eval/runner.d.ts +65 -0
- package/dist/eval/runner.d.ts.map +1 -0
- package/dist/eval/runner.js +216 -0
- package/dist/eval/runner.js.map +1 -0
- package/dist/eval/skill-bundle.d.ts +18 -0
- package/dist/eval/skill-bundle.d.ts.map +1 -0
- package/dist/eval/skill-bundle.js +38 -0
- package/dist/eval/skill-bundle.js.map +1 -0
- package/dist/eval/swarmkit-report.d.ts +21 -0
- package/dist/eval/swarmkit-report.d.ts.map +1 -0
- package/dist/eval/swarmkit-report.js +93 -0
- package/dist/eval/swarmkit-report.js.map +1 -0
- package/dist/eval/task-stream.d.ts +22 -0
- package/dist/eval/task-stream.d.ts.map +1 -0
- package/dist/eval/task-stream.js +99 -0
- package/dist/eval/task-stream.js.map +1 -0
- package/dist/eval/types.d.ts +173 -0
- package/dist/eval/types.d.ts.map +1 -0
- package/dist/eval/types.js +11 -0
- package/dist/eval/types.js.map +1 -0
- package/dist/experimental/causal-store.d.ts +97 -0
- package/dist/experimental/causal-store.d.ts.map +1 -0
- package/dist/experimental/causal-store.js +213 -0
- package/dist/experimental/causal-store.js.map +1 -0
- package/dist/experimental/graph-layers/base.d.ts +29 -0
- package/dist/experimental/graph-layers/base.d.ts.map +1 -0
- package/dist/experimental/graph-layers/base.js +143 -0
- package/dist/experimental/graph-layers/base.js.map +1 -0
- package/dist/experimental/graph-layers/causal.d.ts +14 -0
- package/dist/experimental/graph-layers/causal.d.ts.map +1 -0
- package/dist/experimental/graph-layers/causal.js +14 -0
- package/dist/experimental/graph-layers/causal.js.map +1 -0
- package/dist/experimental/graph-layers/entity.d.ts +14 -0
- package/dist/experimental/graph-layers/entity.d.ts.map +1 -0
- package/dist/experimental/graph-layers/entity.js +14 -0
- package/dist/experimental/graph-layers/entity.js.map +1 -0
- package/dist/experimental/graph-layers/index.d.ts +6 -0
- package/dist/experimental/graph-layers/index.d.ts.map +1 -0
- package/dist/experimental/graph-layers/index.js +6 -0
- package/dist/experimental/graph-layers/index.js.map +1 -0
- package/dist/experimental/graph-layers/semantic.d.ts +14 -0
- package/dist/experimental/graph-layers/semantic.d.ts.map +1 -0
- package/dist/experimental/graph-layers/semantic.js +14 -0
- package/dist/experimental/graph-layers/semantic.js.map +1 -0
- package/dist/experimental/graph-layers/temporal.d.ts +14 -0
- package/dist/experimental/graph-layers/temporal.d.ts.map +1 -0
- package/dist/experimental/graph-layers/temporal.js +14 -0
- package/dist/experimental/graph-layers/temporal.js.map +1 -0
- package/dist/experimental/healing-orchestrator.d.ts +182 -0
- package/dist/experimental/healing-orchestrator.d.ts.map +1 -0
- package/dist/experimental/healing-orchestrator.js +250 -0
- package/dist/experimental/healing-orchestrator.js.map +1 -0
- package/dist/experimental/knowledge-graph-types.d.ts +148 -0
- package/dist/experimental/knowledge-graph-types.d.ts.map +1 -0
- package/dist/experimental/knowledge-graph-types.js +40 -0
- package/dist/experimental/knowledge-graph-types.js.map +1 -0
- package/dist/experimental/knowledge-graph.d.ts +41 -0
- package/dist/experimental/knowledge-graph.d.ts.map +1 -0
- package/dist/experimental/knowledge-graph.js +270 -0
- package/dist/experimental/knowledge-graph.js.map +1 -0
- package/dist/experimental/meta-reflection.d.ts +47 -0
- package/dist/experimental/meta-reflection.d.ts.map +1 -0
- package/dist/experimental/meta-reflection.js +143 -0
- package/dist/experimental/meta-reflection.js.map +1 -0
- package/dist/experimental/moe-gate.d.ts +134 -0
- package/dist/experimental/moe-gate.d.ts.map +1 -0
- package/dist/experimental/moe-gate.js +240 -0
- package/dist/experimental/moe-gate.js.map +1 -0
- package/dist/experimental/reasoning-bank.d.ts +130 -0
- package/dist/experimental/reasoning-bank.d.ts.map +1 -0
- package/dist/experimental/reasoning-bank.js +427 -0
- package/dist/experimental/reasoning-bank.js.map +1 -0
- package/dist/experimental/team/team-config.d.ts +127 -0
- package/dist/experimental/team/team-config.d.ts.map +1 -0
- package/dist/experimental/team/team-config.js +48 -0
- package/dist/experimental/team/team-config.js.map +1 -0
- package/dist/experimental/team/team-experience.d.ts +300 -0
- package/dist/experimental/team/team-experience.d.ts.map +1 -0
- package/dist/experimental/team/team-experience.js +355 -0
- package/dist/experimental/team/team-experience.js.map +1 -0
- package/dist/experimental/team/team-ingester.d.ts +152 -0
- package/dist/experimental/team/team-ingester.d.ts.map +1 -0
- package/dist/experimental/team/team-ingester.js +330 -0
- package/dist/experimental/team/team-ingester.js.map +1 -0
- package/dist/experimental/team/team-meta-learner.d.ts +51 -0
- package/dist/experimental/team/team-meta-learner.d.ts.map +1 -0
- package/dist/experimental/team/team-meta-learner.js +404 -0
- package/dist/experimental/team/team-meta-learner.js.map +1 -0
- package/dist/experimental/team/team-meta.d.ts +160 -0
- package/dist/experimental/team/team-meta.d.ts.map +1 -0
- package/dist/experimental/team/team-meta.js +42 -0
- package/dist/experimental/team/team-meta.js.map +1 -0
- package/dist/experimental/team/team-pipeline.d.ts +77 -0
- package/dist/experimental/team/team-pipeline.d.ts.map +1 -0
- package/dist/experimental/team/team-pipeline.js +262 -0
- package/dist/experimental/team/team-pipeline.js.map +1 -0
- package/dist/experimental/team/team-playbook-extraction.d.ts +45 -0
- package/dist/experimental/team/team-playbook-extraction.d.ts.map +1 -0
- package/dist/experimental/team/team-playbook-extraction.js +526 -0
- package/dist/experimental/team/team-playbook-extraction.js.map +1 -0
- package/dist/experimental/team/team-playbook.d.ts +276 -0
- package/dist/experimental/team/team-playbook.d.ts.map +1 -0
- package/dist/experimental/team/team-playbook.js +85 -0
- package/dist/experimental/team/team-playbook.js.map +1 -0
- package/dist/experimental/team/team-router.d.ts +98 -0
- package/dist/experimental/team/team-router.d.ts.map +1 -0
- package/dist/experimental/team/team-router.js +312 -0
- package/dist/experimental/team/team-router.js.map +1 -0
- package/dist/experimental/team/team-skill-library.d.ts +180 -0
- package/dist/experimental/team/team-skill-library.d.ts.map +1 -0
- package/dist/experimental/team/team-skill-library.js +385 -0
- package/dist/experimental/team/team-skill-library.js.map +1 -0
- package/dist/experimental/team/team-trajectory-analysis.d.ts +19 -0
- package/dist/experimental/team/team-trajectory-analysis.d.ts.map +1 -0
- package/dist/experimental/team/team-trajectory-analysis.js +442 -0
- package/dist/experimental/team/team-trajectory-analysis.js.map +1 -0
- package/dist/experimental/team/team-trajectory.d.ts +305 -0
- package/dist/experimental/team/team-trajectory.d.ts.map +1 -0
- package/dist/experimental/team/team-trajectory.js +315 -0
- package/dist/experimental/team/team-trajectory.js.map +1 -0
- package/dist/factory.d.ts +2 -3
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +12 -11
- package/dist/factory.js.map +1 -1
- package/dist/index.d.ts +9 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -32
- package/dist/index.js.map +1 -1
- package/dist/learning/analyzer.d.ts +26 -36
- package/dist/learning/analyzer.d.ts.map +1 -1
- package/dist/learning/analyzer.js +50 -11
- package/dist/learning/analyzer.js.map +1 -1
- package/dist/learning/compound-bootstrap/external-acquisition.d.ts +63 -0
- package/dist/learning/compound-bootstrap/external-acquisition.d.ts.map +1 -0
- package/dist/learning/compound-bootstrap/external-acquisition.js +255 -0
- package/dist/learning/compound-bootstrap/external-acquisition.js.map +1 -0
- package/dist/learning/compound-bootstrap/index.d.ts +3 -0
- package/dist/learning/compound-bootstrap/index.d.ts.map +1 -0
- package/dist/learning/compound-bootstrap/index.js +3 -0
- package/dist/learning/compound-bootstrap/index.js.map +1 -0
- package/dist/learning/compound-bootstrap/workspace-analyzer.d.ts +33 -0
- package/dist/learning/compound-bootstrap/workspace-analyzer.d.ts.map +1 -0
- package/dist/learning/compound-bootstrap/workspace-analyzer.js +379 -0
- package/dist/learning/compound-bootstrap/workspace-analyzer.js.map +1 -0
- package/dist/learning/consolidation-coordinator.d.ts +49 -0
- package/dist/learning/consolidation-coordinator.d.ts.map +1 -0
- package/dist/learning/consolidation-coordinator.js +75 -0
- package/dist/learning/consolidation-coordinator.js.map +1 -0
- package/dist/learning/convention-distiller.d.ts +84 -0
- package/dist/learning/convention-distiller.d.ts.map +1 -0
- package/dist/learning/convention-distiller.js +268 -0
- package/dist/learning/convention-distiller.js.map +1 -0
- package/dist/learning/distiller.d.ts +82 -0
- package/dist/learning/distiller.d.ts.map +1 -0
- package/dist/learning/distiller.js +353 -0
- package/dist/learning/distiller.js.map +1 -0
- package/dist/learning/effectiveness.d.ts +12 -2
- package/dist/learning/effectiveness.d.ts.map +1 -1
- package/dist/learning/effectiveness.js +18 -14
- package/dist/learning/effectiveness.js.map +1 -1
- package/dist/learning/escalation.d.ts +89 -0
- package/dist/learning/escalation.d.ts.map +1 -0
- package/dist/learning/escalation.js +168 -0
- package/dist/learning/escalation.js.map +1 -0
- package/dist/learning/external-exposure.d.ts +57 -0
- package/dist/learning/external-exposure.d.ts.map +1 -0
- package/dist/learning/external-exposure.js +95 -0
- package/dist/learning/external-exposure.js.map +1 -0
- package/dist/learning/gepa-proposer.d.ts +116 -0
- package/dist/learning/gepa-proposer.d.ts.map +1 -0
- package/dist/learning/gepa-proposer.js +258 -0
- package/dist/learning/gepa-proposer.js.map +1 -0
- package/dist/learning/index.d.ts +21 -8
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +28 -10
- package/dist/learning/index.js.map +1 -1
- package/dist/learning/instant-loop.d.ts +46 -16
- package/dist/learning/instant-loop.d.ts.map +1 -1
- package/dist/learning/instant-loop.js +114 -111
- package/dist/learning/instant-loop.js.map +1 -1
- package/dist/learning/knowledge-extractor.d.ts.map +1 -1
- package/dist/learning/knowledge-extractor.js +1 -2
- package/dist/learning/knowledge-extractor.js.map +1 -1
- package/dist/learning/llm-extractor.d.ts +88 -0
- package/dist/learning/llm-extractor.d.ts.map +1 -0
- package/dist/learning/llm-extractor.js +372 -0
- package/dist/learning/llm-extractor.js.map +1 -0
- package/dist/learning/loop-coordinator.d.ts +61 -0
- package/dist/learning/loop-coordinator.d.ts.map +1 -0
- package/dist/learning/loop-coordinator.js +96 -0
- package/dist/learning/loop-coordinator.js.map +1 -0
- package/dist/learning/maintenance-scheduler.d.ts +15 -4
- package/dist/learning/maintenance-scheduler.d.ts.map +1 -1
- package/dist/learning/maintenance-scheduler.js +19 -16
- package/dist/learning/maintenance-scheduler.js.map +1 -1
- package/dist/learning/mechanism-trace.d.ts +196 -0
- package/dist/learning/mechanism-trace.d.ts.map +1 -0
- package/dist/learning/mechanism-trace.js +81 -0
- package/dist/learning/mechanism-trace.js.map +1 -0
- package/dist/learning/merge-proposer.d.ts +102 -0
- package/dist/learning/merge-proposer.d.ts.map +1 -0
- package/dist/learning/merge-proposer.js +253 -0
- package/dist/learning/merge-proposer.js.map +1 -0
- package/dist/learning/meta-learner.d.ts +9 -7
- package/dist/learning/meta-learner.d.ts.map +1 -1
- package/dist/learning/meta-learner.js +16 -45
- package/dist/learning/meta-learner.js.map +1 -1
- package/dist/learning/mutation-gate.d.ts +218 -0
- package/dist/learning/mutation-gate.d.ts.map +1 -0
- package/dist/learning/mutation-gate.js +390 -0
- package/dist/learning/mutation-gate.js.map +1 -0
- package/dist/learning/oracle-signal.d.ts +67 -0
- package/dist/learning/oracle-signal.d.ts.map +1 -0
- package/dist/learning/oracle-signal.js +94 -0
- package/dist/learning/oracle-signal.js.map +1 -0
- 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/playbook-extractor.d.ts +8 -0
- package/dist/learning/playbook-extractor.d.ts.map +1 -1
- package/dist/learning/playbook-extractor.js +119 -34
- package/dist/learning/playbook-extractor.js.map +1 -1
- package/dist/learning/playbook-optimizer.d.ts +37 -0
- package/dist/learning/playbook-optimizer.d.ts.map +1 -0
- package/dist/learning/playbook-optimizer.js +125 -0
- package/dist/learning/playbook-optimizer.js.map +1 -0
- package/dist/learning/reflective-proposer.d.ts +173 -0
- package/dist/learning/reflective-proposer.d.ts.map +1 -0
- package/dist/learning/reflective-proposer.js +354 -0
- package/dist/learning/reflective-proposer.js.map +1 -0
- package/dist/learning/reflexion-generator.d.ts.map +1 -1
- package/dist/learning/reflexion-generator.js +4 -3
- package/dist/learning/reflexion-generator.js.map +1 -1
- package/dist/learning/replay-executor.d.ts +64 -0
- package/dist/learning/replay-executor.d.ts.map +1 -0
- package/dist/learning/replay-executor.js +92 -0
- package/dist/learning/replay-executor.js.map +1 -0
- package/dist/learning/replay-types.d.ts +150 -0
- package/dist/learning/replay-types.d.ts.map +1 -0
- package/dist/learning/replay-types.js +207 -0
- package/dist/learning/replay-types.js.map +1 -0
- package/dist/learning/replay.d.ts +166 -0
- package/dist/learning/replay.d.ts.map +1 -0
- package/dist/learning/replay.js +228 -0
- package/dist/learning/replay.js.map +1 -0
- package/dist/learning/seed-report.d.ts +88 -0
- package/dist/learning/seed-report.d.ts.map +1 -0
- package/dist/learning/seed-report.js +120 -0
- package/dist/learning/seed-report.js.map +1 -0
- package/dist/learning/trajectory-sources/dataclaw.d.ts.map +1 -1
- package/dist/learning/trajectory-sources/dataclaw.js +6 -18
- package/dist/learning/trajectory-sources/dataclaw.js.map +1 -1
- package/dist/learning/trajectory-sources/entire.d.ts.map +1 -1
- package/dist/learning/trajectory-sources/entire.js +30 -9
- package/dist/learning/trajectory-sources/entire.js.map +1 -1
- package/dist/learning/trajectory-sources/file.d.ts.map +1 -1
- package/dist/learning/trajectory-sources/file.js.map +1 -1
- package/dist/learning/trajectory-sources/huggingface.d.ts.map +1 -1
- package/dist/learning/trajectory-sources/huggingface.js +7 -7
- package/dist/learning/trajectory-sources/huggingface.js.map +1 -1
- package/dist/learning/trajectory-sources/in-memory.d.ts.map +1 -1
- package/dist/learning/trajectory-sources/in-memory.js.map +1 -1
- package/dist/learning/trajectory-sources/index.d.ts +3 -4
- package/dist/learning/trajectory-sources/index.d.ts.map +1 -1
- package/dist/learning/trajectory-sources/index.js +3 -4
- package/dist/learning/trajectory-sources/index.js.map +1 -1
- package/dist/learning/trajectory-sources/pipeline.d.ts +4 -3
- package/dist/learning/trajectory-sources/pipeline.d.ts.map +1 -1
- package/dist/learning/trajectory-sources/pipeline.js +4 -3
- package/dist/learning/trajectory-sources/pipeline.js.map +1 -1
- package/dist/learning/unified-pipeline.d.ts +486 -61
- package/dist/learning/unified-pipeline.d.ts.map +1 -1
- package/dist/learning/unified-pipeline.js +1501 -232
- package/dist/learning/unified-pipeline.js.map +1 -1
- package/dist/learning/usage-inference.d.ts.map +1 -1
- package/dist/learning/usage-inference.js +4 -9
- package/dist/learning/usage-inference.js.map +1 -1
- package/dist/learning/workspace-snapshot.d.ts +146 -0
- package/dist/learning/workspace-snapshot.d.ts.map +1 -0
- package/dist/learning/workspace-snapshot.js +269 -0
- package/dist/learning/workspace-snapshot.js.map +1 -0
- package/dist/mcp/playbook-server.d.ts +61 -2
- package/dist/mcp/playbook-server.d.ts.map +1 -1
- package/dist/mcp/playbook-server.js +179 -9
- package/dist/mcp/playbook-server.js.map +1 -1
- package/dist/memory/coherence.d.ts.map +1 -1
- package/dist/memory/coherence.js +5 -7
- package/dist/memory/coherence.js.map +1 -1
- package/dist/memory/curated-loader.d.ts +24 -0
- package/dist/memory/curated-loader.d.ts.map +1 -1
- package/dist/memory/curated-loader.js +22 -5
- package/dist/memory/curated-loader.js.map +1 -1
- package/dist/memory/evolution/llm-evolver.d.ts +36 -0
- package/dist/memory/evolution/llm-evolver.d.ts.map +1 -0
- package/dist/memory/evolution/llm-evolver.js +106 -0
- package/dist/memory/evolution/llm-evolver.js.map +1 -0
- package/dist/memory/experience.d.ts +34 -13
- package/dist/memory/experience.d.ts.map +1 -1
- package/dist/memory/experience.js +59 -48
- package/dist/memory/experience.js.map +1 -1
- package/dist/memory/extraction/conversation-extractor.d.ts +62 -0
- package/dist/memory/extraction/conversation-extractor.d.ts.map +1 -0
- package/dist/memory/extraction/conversation-extractor.js +169 -0
- package/dist/memory/extraction/conversation-extractor.js.map +1 -0
- package/dist/memory/filesystem-cascade.d.ts +116 -0
- package/dist/memory/filesystem-cascade.d.ts.map +1 -0
- package/dist/memory/filesystem-cascade.js +221 -0
- package/dist/memory/filesystem-cascade.js.map +1 -0
- package/dist/memory/index.d.ts +14 -10
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +15 -12
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/knowledge-bank.d.ts +145 -29
- package/dist/memory/knowledge-bank.d.ts.map +1 -1
- package/dist/memory/knowledge-bank.js +511 -200
- package/dist/memory/knowledge-bank.js.map +1 -1
- package/dist/memory/knowledge-defrag.d.ts +32 -9
- package/dist/memory/knowledge-defrag.d.ts.map +1 -1
- package/dist/memory/knowledge-defrag.js +57 -49
- package/dist/memory/knowledge-defrag.js.map +1 -1
- package/dist/memory/meta-playbook-bank.d.ts +24 -0
- package/dist/memory/meta-playbook-bank.d.ts.map +1 -0
- package/dist/memory/meta-playbook-bank.js +135 -0
- package/dist/memory/meta-playbook-bank.js.map +1 -0
- package/dist/memory/meta.d.ts.map +1 -1
- package/dist/memory/meta.js +33 -14
- package/dist/memory/meta.js.map +1 -1
- package/dist/memory/playbook-applicability.d.ts +43 -0
- package/dist/memory/playbook-applicability.d.ts.map +1 -0
- package/dist/memory/playbook-applicability.js +155 -0
- package/dist/memory/playbook-applicability.js.map +1 -0
- package/dist/memory/playbook-incorporation.d.ts +24 -0
- package/dist/memory/playbook-incorporation.d.ts.map +1 -0
- package/dist/memory/playbook-incorporation.js +41 -0
- package/dist/memory/playbook-incorporation.js.map +1 -0
- package/dist/memory/playbook.d.ts +444 -7
- package/dist/memory/playbook.d.ts.map +1 -1
- package/dist/memory/playbook.js +1231 -50
- package/dist/memory/playbook.js.map +1 -1
- package/dist/memory/procedural-skill.d.ts +142 -0
- package/dist/memory/procedural-skill.d.ts.map +1 -0
- package/dist/memory/procedural-skill.js +846 -0
- package/dist/memory/procedural-skill.js.map +1 -0
- package/dist/memory/search-provider.d.ts +8 -3
- package/dist/memory/search-provider.d.ts.map +1 -1
- package/dist/memory/search-providers/embedding.d.ts +64 -0
- package/dist/memory/search-providers/embedding.d.ts.map +1 -0
- package/dist/memory/search-providers/embedding.js +96 -0
- package/dist/memory/search-providers/embedding.js.map +1 -0
- package/dist/memory/search-providers/hybrid.d.ts +74 -0
- package/dist/memory/search-providers/hybrid.d.ts.map +1 -0
- package/dist/memory/search-providers/hybrid.js +94 -0
- package/dist/memory/search-providers/hybrid.js.map +1 -0
- package/dist/memory/search-providers/index.d.ts +3 -0
- package/dist/memory/search-providers/index.d.ts.map +1 -1
- package/dist/memory/search-providers/index.js +3 -0
- package/dist/memory/search-providers/index.js.map +1 -1
- package/dist/memory/search-providers/keyword-expanding.d.ts +22 -0
- package/dist/memory/search-providers/keyword-expanding.d.ts.map +1 -0
- package/dist/memory/search-providers/keyword-expanding.js +35 -0
- package/dist/memory/search-providers/keyword-expanding.js.map +1 -0
- package/dist/memory/search-providers/minimem.d.ts +16 -4
- package/dist/memory/search-providers/minimem.d.ts.map +1 -1
- package/dist/memory/search-providers/minimem.js +14 -3
- package/dist/memory/search-providers/minimem.js.map +1 -1
- package/dist/memory/search-providers/text-similarity.d.ts +2 -4
- package/dist/memory/search-providers/text-similarity.d.ts.map +1 -1
- package/dist/memory/search-providers/text-similarity.js.map +1 -1
- package/dist/memory/seeds/meta-playbook-seeds.d.ts +27 -0
- package/dist/memory/seeds/meta-playbook-seeds.d.ts.map +1 -0
- package/dist/memory/seeds/meta-playbook-seeds.js +560 -0
- package/dist/memory/seeds/meta-playbook-seeds.js.map +1 -0
- package/dist/memory/seeds/meta-strategy-seeds.d.ts +23 -0
- package/dist/memory/seeds/meta-strategy-seeds.d.ts.map +1 -0
- package/dist/memory/seeds/meta-strategy-seeds.js +82 -0
- package/dist/memory/seeds/meta-strategy-seeds.js.map +1 -0
- package/dist/memory/seeds/seed-loader.d.ts +34 -0
- package/dist/memory/seeds/seed-loader.d.ts.map +1 -0
- package/dist/memory/seeds/seed-loader.js +60 -0
- package/dist/memory/seeds/seed-loader.js.map +1 -0
- package/dist/memory/skill-exporter.d.ts.map +1 -1
- package/dist/memory/skill-exporter.js +1 -2
- package/dist/memory/skill-exporter.js.map +1 -1
- package/dist/memory/source-resolver.d.ts.map +1 -1
- package/dist/memory/source-resolver.js +7 -8
- package/dist/memory/source-resolver.js.map +1 -1
- package/dist/memory/system.d.ts +119 -14
- package/dist/memory/system.d.ts.map +1 -1
- package/dist/memory/system.js +416 -60
- package/dist/memory/system.js.map +1 -1
- package/dist/memory/temporal-compressor.d.ts +1 -1
- package/dist/memory/temporal-compressor.d.ts.map +1 -1
- package/dist/memory/temporal-compressor.js +26 -16
- package/dist/memory/temporal-compressor.js.map +1 -1
- package/dist/persistence/index.d.ts +2 -2
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +1 -1
- package/dist/persistence/index.js.map +1 -1
- package/dist/persistence/migrator.d.ts +34 -1
- package/dist/persistence/migrator.d.ts.map +1 -1
- package/dist/persistence/migrator.js +163 -33
- package/dist/persistence/migrator.js.map +1 -1
- package/dist/persistence/sqlite-persistence.d.ts +412 -1
- package/dist/persistence/sqlite-persistence.d.ts.map +1 -1
- package/dist/persistence/sqlite-persistence.js +1038 -47
- package/dist/persistence/sqlite-persistence.js.map +1 -1
- package/dist/runtime/backends/acp-protocol.d.ts.map +1 -1
- package/dist/runtime/backends/acp-protocol.js +2 -1
- package/dist/runtime/backends/acp-protocol.js.map +1 -1
- package/dist/runtime/backends/acp.d.ts.map +1 -1
- package/dist/runtime/backends/acp.js +5 -4
- package/dist/runtime/backends/acp.js.map +1 -1
- package/dist/runtime/backends/index.d.ts +2 -2
- package/dist/runtime/backends/index.d.ts.map +1 -1
- package/dist/runtime/backends/index.js +2 -2
- package/dist/runtime/backends/index.js.map +1 -1
- package/dist/runtime/backends/macro-agent.d.ts +17 -1
- package/dist/runtime/backends/macro-agent.d.ts.map +1 -1
- package/dist/runtime/backends/macro-agent.js +1 -1
- package/dist/runtime/backends/macro-agent.js.map +1 -1
- package/dist/runtime/backends/mock.d.ts.map +1 -1
- package/dist/runtime/backends/mock.js.map +1 -1
- package/dist/runtime/backends/subprocess.d.ts.map +1 -1
- package/dist/runtime/backends/subprocess.js +5 -4
- package/dist/runtime/backends/subprocess.js.map +1 -1
- package/dist/runtime/compute-provider.d.ts +2 -18
- package/dist/runtime/compute-provider.d.ts.map +1 -1
- package/dist/runtime/compute-provider.js +8 -8
- package/dist/runtime/compute-provider.js.map +1 -1
- package/dist/runtime/flows/learning.d.ts +2 -1
- package/dist/runtime/flows/learning.d.ts.map +1 -1
- package/dist/runtime/flows/learning.js +4 -5
- package/dist/runtime/flows/learning.js.map +1 -1
- package/dist/runtime/flows/validation.d.ts.map +1 -1
- package/dist/runtime/flows/validation.js +2 -5
- package/dist/runtime/flows/validation.js.map +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/manager.d.ts +128 -0
- package/dist/runtime/manager.d.ts.map +1 -1
- package/dist/runtime/manager.js +375 -64
- package/dist/runtime/manager.js.map +1 -1
- package/dist/runtime/types.d.ts +92 -1
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/search/evaluator.d.ts +71 -0
- package/dist/search/evaluator.d.ts.map +1 -1
- package/dist/search/evaluator.js +40 -5
- package/dist/search/evaluator.js.map +1 -1
- package/dist/search/index.d.ts +3 -5
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +4 -7
- package/dist/search/index.js.map +1 -1
- package/dist/search/moe-gate.d.ts +48 -2
- package/dist/search/moe-gate.d.ts.map +1 -1
- package/dist/search/moe-gate.js +117 -4
- package/dist/search/moe-gate.js.map +1 -1
- package/dist/search/refinement-loop.d.ts +63 -3
- package/dist/search/refinement-loop.d.ts.map +1 -1
- package/dist/search/refinement-loop.js +278 -23
- package/dist/search/refinement-loop.js.map +1 -1
- package/dist/search/refinement-types.d.ts +4 -2
- package/dist/search/refinement-types.d.ts.map +1 -1
- package/dist/search/refinement-types.js +2 -11
- package/dist/search/refinement-types.js.map +1 -1
- package/dist/search/router.d.ts +41 -34
- package/dist/search/router.d.ts.map +1 -1
- package/dist/search/router.js +156 -90
- package/dist/search/router.js.map +1 -1
- package/dist/search/solver.js +1 -1
- package/dist/search/solver.js.map +1 -1
- package/dist/search/task-difficulty.d.ts +54 -0
- package/dist/search/task-difficulty.d.ts.map +1 -0
- package/dist/search/task-difficulty.js +116 -0
- package/dist/search/task-difficulty.js.map +1 -0
- package/dist/search/tau-bench-verifier.d.ts +74 -0
- package/dist/search/tau-bench-verifier.d.ts.map +1 -0
- package/dist/search/tau-bench-verifier.js +96 -0
- package/dist/search/tau-bench-verifier.js.map +1 -0
- package/dist/search/verification-runner.d.ts.map +1 -1
- package/dist/search/verification-runner.js +6 -5
- package/dist/search/verification-runner.js.map +1 -1
- package/dist/session-bank/git-reader.d.ts.map +1 -1
- package/dist/session-bank/git-reader.js +5 -19
- package/dist/session-bank/git-reader.js.map +1 -1
- package/dist/session-bank/parser.d.ts.map +1 -1
- package/dist/session-bank/parser.js +26 -0
- package/dist/session-bank/parser.js.map +1 -1
- package/dist/session-bank/session-bank.d.ts.map +1 -1
- package/dist/session-bank/session-bank.js +2 -5
- package/dist/session-bank/session-bank.js.map +1 -1
- package/dist/session-bank/types.d.ts +24 -0
- package/dist/session-bank/types.d.ts.map +1 -1
- package/dist/surfacing/index.d.ts +3 -3
- package/dist/surfacing/index.d.ts.map +1 -1
- package/dist/surfacing/index.js +2 -2
- package/dist/surfacing/index.js.map +1 -1
- package/dist/surfacing/shared-bank.d.ts +43 -0
- package/dist/surfacing/shared-bank.d.ts.map +1 -0
- package/dist/surfacing/shared-bank.js +104 -0
- package/dist/surfacing/shared-bank.js.map +1 -0
- package/dist/surfacing/skill-library.d.ts +98 -2
- package/dist/surfacing/skill-library.d.ts.map +1 -1
- package/dist/surfacing/skill-library.js +192 -17
- package/dist/surfacing/skill-library.js.map +1 -1
- package/dist/surfacing/skill-publisher.d.ts +3 -1
- package/dist/surfacing/skill-publisher.d.ts.map +1 -1
- package/dist/surfacing/skill-publisher.js +28 -28
- package/dist/surfacing/skill-publisher.js.map +1 -1
- package/dist/surfacing/sqlite-storage-adapter.d.ts +2 -2
- package/dist/surfacing/sqlite-storage-adapter.d.ts.map +1 -1
- package/dist/surfacing/sqlite-storage-adapter.js +27 -18
- package/dist/surfacing/sqlite-storage-adapter.js.map +1 -1
- package/dist/types/analysis.d.ts +43 -0
- package/dist/types/analysis.d.ts.map +1 -0
- package/dist/types/analysis.js +10 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/config.d.ts +2178 -425
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +600 -88
- package/dist/types/config.js.map +1 -1
- package/dist/types/dataclaw.d.ts +3 -3
- package/dist/types/index.d.ts +4 -7
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -10
- package/dist/types/index.js.map +1 -1
- package/dist/types/knowledge-graph.d.ts +1 -1
- package/dist/types/knowledge-graph.d.ts.map +1 -1
- package/dist/types/knowledge.d.ts +219 -11
- package/dist/types/knowledge.d.ts.map +1 -1
- package/dist/types/knowledge.js +90 -30
- package/dist/types/knowledge.js.map +1 -1
- package/dist/types/memory.d.ts +8 -0
- package/dist/types/memory.d.ts.map +1 -1
- package/dist/types/memory.js +12 -4
- package/dist/types/memory.js.map +1 -1
- package/dist/types/outcome.d.ts +11 -0
- package/dist/types/outcome.d.ts.map +1 -1
- package/dist/types/outcome.js +9 -0
- package/dist/types/outcome.js.map +1 -1
- package/dist/types/playbook.d.ts +63 -0
- package/dist/types/playbook.d.ts.map +1 -1
- package/dist/types/playbook.js +51 -0
- package/dist/types/playbook.js.map +1 -1
- package/dist/types/trajectory-source.d.ts +1 -1
- package/dist/types/trajectory-source.d.ts.map +1 -1
- package/dist/types/trajectory.d.ts +61 -0
- package/dist/types/trajectory.d.ts.map +1 -1
- package/dist/types/trajectory.js +25 -0
- package/dist/types/trajectory.js.map +1 -1
- package/dist/utils/clock.d.ts +36 -0
- package/dist/utils/clock.d.ts.map +1 -0
- package/dist/utils/clock.js +48 -0
- package/dist/utils/clock.js.map +1 -0
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +10 -2
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/index.d.ts +4 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.d.ts +31 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +50 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/objectives.d.ts +45 -0
- package/dist/utils/objectives.d.ts.map +1 -0
- package/dist/utils/objectives.js +74 -0
- package/dist/utils/objectives.js.map +1 -0
- package/dist/utils/partitioned-store.d.ts.map +1 -1
- package/dist/utils/partitioned-store.js.map +1 -1
- package/dist/utils/playbook-hash.d.ts +19 -0
- package/dist/utils/playbook-hash.d.ts.map +1 -0
- package/dist/utils/playbook-hash.js +51 -0
- package/dist/utils/playbook-hash.js.map +1 -0
- package/dist/utils/similarity.d.ts.map +1 -1
- package/dist/utils/similarity.js.map +1 -1
- package/dist/utils/solver-canonicalizer.d.ts +22 -0
- package/dist/utils/solver-canonicalizer.d.ts.map +1 -0
- package/dist/utils/solver-canonicalizer.js +41 -0
- package/dist/utils/solver-canonicalizer.js.map +1 -0
- package/dist/utils/storage.d.ts.map +1 -1
- package/dist/utils/storage.js +1 -3
- package/dist/utils/storage.js.map +1 -1
- package/dist/utils/task-signature.d.ts +34 -0
- package/dist/utils/task-signature.d.ts.map +1 -0
- package/dist/utils/task-signature.js +112 -0
- package/dist/utils/task-signature.js.map +1 -0
- package/dist/utils/trajectory-helpers.d.ts.map +1 -1
- package/dist/utils/trajectory-helpers.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js.map +1 -1
- package/dist/workspace/efficacy-toolkit.d.ts.map +1 -1
- package/dist/workspace/efficacy-toolkit.js +18 -26
- package/dist/workspace/efficacy-toolkit.js.map +1 -1
- package/dist/workspace/index.d.ts +4 -3
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js +5 -3
- package/dist/workspace/index.js.map +1 -1
- package/dist/workspace/runner.d.ts.map +1 -1
- package/dist/workspace/runner.js +95 -21
- package/dist/workspace/runner.js.map +1 -1
- package/dist/workspace/skill-converter.d.ts +66 -1
- package/dist/workspace/skill-converter.d.ts.map +1 -1
- package/dist/workspace/skill-converter.js +238 -19
- package/dist/workspace/skill-converter.js.map +1 -1
- package/dist/workspace/skill-import.d.ts +43 -0
- package/dist/workspace/skill-import.d.ts.map +1 -0
- package/dist/workspace/skill-import.js +40 -0
- package/dist/workspace/skill-import.js.map +1 -0
- package/dist/workspace/templates/index.d.ts +6 -8
- package/dist/workspace/templates/index.d.ts.map +1 -1
- package/dist/workspace/templates/index.js +7 -11
- package/dist/workspace/templates/index.js.map +1 -1
- package/dist/workspace/templates/knowledge-defrag.d.ts.map +1 -1
- package/dist/workspace/templates/knowledge-defrag.js +0 -2
- package/dist/workspace/templates/knowledge-defrag.js.map +1 -1
- package/dist/workspace/templates/knowledge-extraction.d.ts +11 -0
- package/dist/workspace/templates/knowledge-extraction.d.ts.map +1 -1
- package/dist/workspace/templates/knowledge-extraction.js +11 -6
- package/dist/workspace/templates/knowledge-extraction.js.map +1 -1
- package/dist/workspace/templates/playbook-conditioning.d.ts +38 -0
- package/dist/workspace/templates/playbook-conditioning.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-conditioning.js +147 -0
- package/dist/workspace/templates/playbook-conditioning.js.map +1 -0
- package/dist/workspace/templates/playbook-decay-detection.d.ts.map +1 -1
- package/dist/workspace/templates/playbook-decay-detection.js +24 -18
- package/dist/workspace/templates/playbook-decay-detection.js.map +1 -1
- package/dist/workspace/templates/playbook-efficacy-audit.d.ts.map +1 -1
- package/dist/workspace/templates/playbook-efficacy-audit.js +26 -11
- package/dist/workspace/templates/playbook-efficacy-audit.js.map +1 -1
- package/dist/workspace/templates/playbook-extraction.d.ts.map +1 -1
- package/dist/workspace/templates/playbook-extraction.js +75 -15
- package/dist/workspace/templates/playbook-extraction.js.map +1 -1
- package/dist/workspace/templates/playbook-lifecycle-review.d.ts.map +1 -1
- package/dist/workspace/templates/playbook-lifecycle-review.js +12 -8
- package/dist/workspace/templates/playbook-lifecycle-review.js.map +1 -1
- package/dist/workspace/templates/refinement-analysis.d.ts.map +1 -1
- package/dist/workspace/templates/refinement-analysis.js +11 -5
- package/dist/workspace/templates/refinement-analysis.js.map +1 -1
- package/dist/workspace/templates/skill-enrichment.d.ts.map +1 -1
- package/dist/workspace/templates/skill-enrichment.js +7 -11
- package/dist/workspace/templates/skill-enrichment.js.map +1 -1
- package/dist/workspace/templates/solution-evaluation.d.ts.map +1 -1
- package/dist/workspace/templates/solution-evaluation.js +15 -8
- package/dist/workspace/templates/solution-evaluation.js.map +1 -1
- package/dist/workspace/templates/trajectory-analysis.d.ts.map +1 -1
- package/dist/workspace/templates/trajectory-analysis.js +1 -3
- package/dist/workspace/templates/trajectory-analysis.js.map +1 -1
- package/dist/workspace/templates/usage-inference.d.ts.map +1 -1
- package/dist/workspace/templates/usage-inference.js +9 -7
- package/dist/workspace/templates/usage-inference.js.map +1 -1
- package/dist/workspace/types.d.ts +32 -2
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/types.js +29 -0
- package/dist/workspace/types.js.map +1 -1
- package/package.json +43 -19
- package/playbooks/agent-ops/long-task-checkpointing.json +54 -0
- package/playbooks/agent-ops/progressive-context-gathering.json +56 -0
- package/playbooks/agent-ops/safe-destructive-operations.json +59 -0
- package/playbooks/agent-ops/scope-discipline.json +56 -0
- package/playbooks/agent-ops/stall-detection-strategy-switch.json +55 -0
- package/playbooks/agent-ops/verification-before-completion.json +54 -0
- package/playbooks/alfworld/clean-and-place.json +35 -0
- package/playbooks/alfworld/cool-and-place.json +35 -0
- package/playbooks/alfworld/examine-in-light.json +32 -0
- package/playbooks/alfworld/heat-and-place.json +35 -0
- package/playbooks/alfworld/pick-and-place.json +37 -0
- package/playbooks/alfworld/pick-two-and-place.json +35 -0
- package/.claude/settings.json +0 -197
- package/.entire/settings.json +0 -4
- package/.sessionlog/settings.json +0 -4
- package/CLAUDE.md +0 -233
- package/SKILL.md +0 -193
- package/docs/DESIGN-agentic-workspace.md +0 -2057
- package/docs/DESIGN-semantic-memory-knowledge-bank.md +0 -1789
- package/docs/DESIGN-session-bank.md +0 -1134
- package/docs/DESIGN-team-extraction-pipeline.md +0 -1369
- package/docs/PROPOSAL-team-aware-learning.md +0 -1080
- package/docs/RESEARCH-semantic-memory-knowledge-structures.md +0 -517
- package/docs/RESEARCH-team-trajectory-learning.md +0 -553
- package/gaps.md +0 -204
- package/scripts/migrate-to-playbooks.ts +0 -307
- package/src/agents/index.ts +0 -14
- package/src/agents/mock-provider.ts +0 -93
- package/src/agents/types.ts +0 -137
- package/src/atlas.ts +0 -1198
- package/src/bin/cli-utils.ts +0 -220
- package/src/bin/cognitive-core.ts +0 -162
- package/src/bin/commands/kb.ts +0 -266
- package/src/bin/commands/learn.ts +0 -100
- package/src/bin/commands/legacy.ts +0 -182
- package/src/bin/commands/run.ts +0 -113
- package/src/bin/commands/sessions.ts +0 -221
- package/src/bin/commands/skills.ts +0 -146
- package/src/embeddings/bm25.ts +0 -337
- package/src/embeddings/index.ts +0 -42
- package/src/embeddings/inverted-index.ts +0 -134
- package/src/embeddings/manager.ts +0 -293
- package/src/embeddings/provider.ts +0 -318
- package/src/embeddings/vector-store.ts +0 -365
- package/src/factory.ts +0 -280
- package/src/index.ts +0 -495
- package/src/learning/analyzer.ts +0 -319
- package/src/learning/effectiveness.ts +0 -428
- package/src/learning/energy-evaluator.ts +0 -282
- package/src/learning/healing-orchestrator.ts +0 -383
- package/src/learning/index.ts +0 -150
- package/src/learning/instant-loop.ts +0 -357
- package/src/learning/knowledge-extractor.ts +0 -470
- package/src/learning/maintenance-scheduler.ts +0 -271
- package/src/learning/meta-learner.ts +0 -552
- package/src/learning/playbook-extractor.ts +0 -702
- package/src/learning/reflexion-generator.ts +0 -273
- package/src/learning/team-ingester.ts +0 -499
- package/src/learning/team-meta-learner.ts +0 -558
- package/src/learning/team-pipeline.ts +0 -364
- package/src/learning/trajectory-sources/dataclaw.ts +0 -403
- package/src/learning/trajectory-sources/entire.ts +0 -251
- package/src/learning/trajectory-sources/file.ts +0 -136
- package/src/learning/trajectory-sources/huggingface.ts +0 -248
- package/src/learning/trajectory-sources/in-memory.ts +0 -61
- package/src/learning/trajectory-sources/index.ts +0 -15
- package/src/learning/trajectory-sources/pipeline.ts +0 -69
- package/src/learning/unified-pipeline.ts +0 -1191
- package/src/learning/usage-inference.ts +0 -372
- package/src/mcp/index.ts +0 -12
- package/src/mcp/playbook-server.ts +0 -565
- package/src/memory/candidate-retrieval.ts +0 -72
- package/src/memory/causal-store.ts +0 -273
- package/src/memory/coherence.ts +0 -252
- package/src/memory/curated-loader.ts +0 -213
- package/src/memory/experience.ts +0 -682
- package/src/memory/graph-layers/base.ts +0 -184
- package/src/memory/graph-layers/causal.ts +0 -16
- package/src/memory/graph-layers/entity.ts +0 -16
- package/src/memory/graph-layers/index.ts +0 -5
- package/src/memory/graph-layers/semantic.ts +0 -16
- package/src/memory/graph-layers/temporal.ts +0 -16
- package/src/memory/index.ts +0 -131
- package/src/memory/knowledge-bank.ts +0 -1317
- package/src/memory/knowledge-defrag.ts +0 -329
- package/src/memory/knowledge-graph.ts +0 -361
- package/src/memory/meta.ts +0 -488
- package/src/memory/playbook.ts +0 -676
- package/src/memory/reasoning-bank.ts +0 -458
- package/src/memory/reflexion.ts +0 -122
- package/src/memory/search-provider.ts +0 -35
- package/src/memory/search-providers/index.ts +0 -3
- package/src/memory/search-providers/minimem.ts +0 -84
- package/src/memory/search-providers/text-similarity.ts +0 -35
- package/src/memory/skill-exporter.ts +0 -357
- package/src/memory/source-resolver.ts +0 -422
- package/src/memory/system.ts +0 -620
- package/src/memory/team-experience.ts +0 -604
- package/src/memory/temporal-compressor.ts +0 -409
- package/src/persistence/index.ts +0 -37
- package/src/persistence/migrator.ts +0 -298
- package/src/persistence/serializers.ts +0 -79
- package/src/persistence/sqlite-persistence.ts +0 -925
- package/src/runtime/backends/acp-protocol.ts +0 -231
- package/src/runtime/backends/acp.ts +0 -239
- package/src/runtime/backends/index.ts +0 -38
- package/src/runtime/backends/macro-agent.ts +0 -177
- package/src/runtime/backends/mock.ts +0 -218
- package/src/runtime/backends/subprocess.ts +0 -356
- package/src/runtime/compute-provider.ts +0 -206
- package/src/runtime/flows/learning.ts +0 -166
- package/src/runtime/flows/validation.ts +0 -381
- package/src/runtime/index.ts +0 -75
- package/src/runtime/manager.ts +0 -685
- package/src/runtime/types.ts +0 -198
- package/src/search/evaluator.ts +0 -499
- package/src/search/index.ts +0 -78
- package/src/search/moe-gate.ts +0 -304
- package/src/search/refinement-loop.ts +0 -457
- package/src/search/refinement-types.ts +0 -159
- package/src/search/router.ts +0 -368
- package/src/search/solver.ts +0 -303
- package/src/search/team-router.ts +0 -459
- package/src/search/verification-runner.ts +0 -570
- package/src/session-bank/git-reader.ts +0 -200
- package/src/session-bank/index.ts +0 -26
- package/src/session-bank/parser.ts +0 -548
- package/src/session-bank/session-bank.ts +0 -485
- package/src/session-bank/types.ts +0 -176
- package/src/surfacing/index.ts +0 -29
- package/src/surfacing/publisher.ts +0 -23
- package/src/surfacing/skill-library.ts +0 -625
- package/src/surfacing/skill-publisher.ts +0 -257
- package/src/surfacing/sqlite-storage-adapter.ts +0 -285
- package/src/surfacing/team-skill-library.ts +0 -610
- package/src/types/config.ts +0 -661
- package/src/types/dataclaw.ts +0 -99
- package/src/types/huggingface-transformers.d.ts +0 -12
- package/src/types/index.ts +0 -293
- package/src/types/knowledge-graph.ts +0 -246
- package/src/types/knowledge.ts +0 -388
- package/src/types/memory.ts +0 -300
- package/src/types/meta.ts +0 -218
- package/src/types/outcome.ts +0 -66
- package/src/types/playbook.ts +0 -215
- package/src/types/step.ts +0 -40
- package/src/types/task.ts +0 -52
- package/src/types/team-meta.ts +0 -212
- package/src/types/team-playbook.ts +0 -384
- package/src/types/team-trajectory.ts +0 -673
- package/src/types/trajectory-source.ts +0 -47
- package/src/types/trajectory.ts +0 -80
- package/src/utils/error-classifier.ts +0 -113
- package/src/utils/frontmatter.ts +0 -118
- package/src/utils/index.ts +0 -63
- package/src/utils/partitioned-store.ts +0 -299
- package/src/utils/similarity.ts +0 -139
- package/src/utils/storage.ts +0 -249
- package/src/utils/trajectory-helpers.ts +0 -79
- package/src/utils/validation.ts +0 -286
- package/src/workspace/efficacy-toolkit.ts +0 -496
- package/src/workspace/index.ts +0 -77
- package/src/workspace/runner.ts +0 -281
- package/src/workspace/skill-converter.ts +0 -288
- package/src/workspace/templates/index.ts +0 -95
- package/src/workspace/templates/knowledge-defrag.ts +0 -223
- package/src/workspace/templates/knowledge-extraction.ts +0 -337
- package/src/workspace/templates/meta-reflection.ts +0 -208
- package/src/workspace/templates/playbook-decay-detection.ts +0 -272
- package/src/workspace/templates/playbook-efficacy-audit.ts +0 -246
- package/src/workspace/templates/playbook-extraction.ts +0 -240
- package/src/workspace/templates/playbook-lifecycle-review.ts +0 -274
- package/src/workspace/templates/refinement-analysis.ts +0 -162
- package/src/workspace/templates/skill-enrichment.ts +0 -275
- package/src/workspace/templates/solution-evaluation.ts +0 -199
- package/src/workspace/templates/team-playbook-extraction.ts +0 -631
- package/src/workspace/templates/team-trajectory-analysis.ts +0 -564
- package/src/workspace/templates/trajectory-analysis.ts +0 -234
- package/src/workspace/templates/usage-inference.ts +0 -163
- package/src/workspace/types.ts +0 -185
- package/tests/atlas-knowledge.test.ts +0 -165
- package/tests/embeddings/bm25.test.ts +0 -130
- package/tests/embeddings/inverted-index.test.ts +0 -138
- package/tests/embeddings/manager.test.ts +0 -205
- package/tests/feature-toggles.test.ts +0 -275
- package/tests/fixtures/behavioral-trajectories.ts +0 -210
- package/tests/gap-fixes.test.ts +0 -1116
- package/tests/integration/atlas.test.ts +0 -266
- package/tests/integration/cli-e2e.test.ts +0 -621
- package/tests/integration/curated-sources-e2e.test.ts +0 -502
- package/tests/integration/dataclaw-e2e.test.ts +0 -559
- package/tests/integration/e2e.test.ts +0 -1337
- package/tests/integration/entire-e2e.test.ts +0 -376
- package/tests/integration/huggingface-e2e.test.ts +0 -627
- package/tests/integration/persistence-e2e.test.ts +0 -741
- package/tests/integration/phase-e2e.test.ts +0 -1143
- package/tests/integration/pipeline-data-correctness.test.ts +0 -794
- package/tests/integration/session-bank.test.ts +0 -231
- package/tests/integration/sessionlog-e2e.test.ts +0 -329
- package/tests/integration/skill-tree-wiring.test.ts +0 -152
- package/tests/integration/unified-pipeline-e2e.test.ts +0 -634
- package/tests/learning/analyzer.test.ts +0 -426
- package/tests/learning/dataclaw-trajectory-source.test.ts +0 -642
- package/tests/learning/effectiveness.test.ts +0 -542
- package/tests/learning/energy-evaluator.test.ts +0 -180
- package/tests/learning/entire-trajectory-source.test.ts +0 -380
- package/tests/learning/healing-orchestrator.test.ts +0 -269
- package/tests/learning/huggingface-trajectory-source.test.ts +0 -817
- package/tests/learning/instant-loop.test.ts +0 -243
- package/tests/learning/knowledge-extractor.test.ts +0 -491
- package/tests/learning/maintenance-scheduler.test.ts +0 -191
- package/tests/learning/meta-learner.test.ts +0 -418
- package/tests/learning/pipeline-memory-updates.test.ts +0 -721
- package/tests/learning/playbook-extractor-provenance.test.ts +0 -114
- package/tests/learning/reflexion-generator.test.ts +0 -411
- package/tests/learning/team-ingester.test.ts +0 -349
- package/tests/learning/team-meta-learner.test.ts +0 -618
- package/tests/learning/team-pipeline.test.ts +0 -334
- package/tests/learning/trajectory-sources.test.ts +0 -320
- package/tests/learning/unified-pipeline-efficacy.test.ts +0 -232
- package/tests/learning/unified-pipeline.test.ts +0 -322
- package/tests/learning/usage-inference.test.ts +0 -254
- package/tests/mcp/playbook-server.test.ts +0 -257
- package/tests/memory/candidate-retrieval.test.ts +0 -167
- package/tests/memory/causal-store.test.ts +0 -276
- package/tests/memory/coherence.test.ts +0 -232
- package/tests/memory/compound-engineering-seed.test.ts +0 -338
- package/tests/memory/curated-loader-extended.test.ts +0 -225
- package/tests/memory/experience.test.ts +0 -203
- package/tests/memory/graph-layers/semantic.test.ts +0 -219
- package/tests/memory/knowledge-bank-extraction.test.ts +0 -558
- package/tests/memory/knowledge-bank.test.ts +0 -705
- package/tests/memory/knowledge-defrag.test.ts +0 -366
- package/tests/memory/knowledge-evolution.test.ts +0 -563
- package/tests/memory/knowledge-graph.test.ts +0 -492
- package/tests/memory/knowledge-inbox.test.ts +0 -258
- package/tests/memory/knowledge-minimem.test.ts +0 -251
- package/tests/memory/meta.test.ts +0 -399
- package/tests/memory/playbook-quality-validation.test.ts +0 -430
- package/tests/memory/playbook.test.ts +0 -644
- package/tests/memory/provenance.test.ts +0 -648
- package/tests/memory/reasoning-bank.test.ts +0 -239
- package/tests/memory/reflexion.test.ts +0 -166
- package/tests/memory/skill-exporter.test.ts +0 -475
- package/tests/memory/source-resolver.test.ts +0 -700
- package/tests/memory/system.test.ts +0 -330
- package/tests/memory/team-experience.test.ts +0 -411
- package/tests/memory/temporal-compressor.test.ts +0 -318
- package/tests/persistence/migrator.test.ts +0 -1009
- package/tests/persistence/sqlite-persistence.test.ts +0 -635
- package/tests/runtime/agent-manager.test.ts +0 -517
- package/tests/runtime/compute-provider.test.ts +0 -288
- package/tests/runtime/delegate.test.ts +0 -354
- package/tests/runtime/macro-agent-backend.test.ts +0 -266
- package/tests/runtime/mock-backend.test.ts +0 -248
- package/tests/search/evaluator.test.ts +0 -257
- package/tests/search/moe-gate.test.ts +0 -250
- package/tests/search/refinement-loop.test.ts +0 -477
- package/tests/search/refinement.test.ts +0 -267
- package/tests/search/router.test.ts +0 -506
- package/tests/search/team-router.test.ts +0 -376
- package/tests/search/verification-runner.test.ts +0 -357
- package/tests/session-bank/fixtures/multi-tool-session/full.jsonl +0 -12
- package/tests/session-bank/fixtures/multi-tool-session/metadata.json +0 -28
- package/tests/session-bank/fixtures/root-metadata.json +0 -18
- package/tests/session-bank/fixtures/sessionlog-root-metadata.json +0 -16
- package/tests/session-bank/fixtures/sessionlog-session/full.jsonl +0 -6
- package/tests/session-bank/fixtures/sessionlog-session/metadata.json +0 -55
- package/tests/session-bank/fixtures/simple-session/full.jsonl +0 -6
- package/tests/session-bank/fixtures/simple-session/metadata.json +0 -38
- package/tests/session-bank/git-reader.test.ts +0 -232
- package/tests/session-bank/parser.test.ts +0 -453
- package/tests/session-bank/session-bank.test.ts +0 -546
- package/tests/surfacing/skill-library.test.ts +0 -297
- package/tests/surfacing/skill-publisher.test.ts +0 -437
- package/tests/surfacing/sqlite-storage-adapter.test.ts +0 -206
- package/tests/surfacing/team-skill-library.test.ts +0 -444
- package/tests/types/outcome.test.ts +0 -147
- package/tests/types/step.test.ts +0 -133
- package/tests/types/task.test.ts +0 -158
- package/tests/types/team-meta.test.ts +0 -147
- package/tests/types/team-playbook.test.ts +0 -246
- package/tests/types/team-trajectory.test.ts +0 -557
- package/tests/types/trajectory.test.ts +0 -253
- package/tests/utils/error-classifier.test.ts +0 -149
- package/tests/utils/frontmatter.test.ts +0 -208
- package/tests/utils/partitioned-store.test.ts +0 -230
- package/tests/utils/similarity.test.ts +0 -188
- package/tests/utils/trajectory-helpers.test.ts +0 -163
- package/tests/utils/validation.test.ts +0 -252
- package/tests/workspace/efficacy-toolkit.test.ts +0 -404
- package/tests/workspace/full-flow.test.ts +0 -845
- package/tests/workspace/manager.test.ts +0 -215
- package/tests/workspace/runner.test.ts +0 -336
- package/tests/workspace/skill-converter.test.ts +0 -205
- package/tests/workspace/templates/knowledge-extraction.test.ts +0 -235
- package/tests/workspace/templates/playbook-efficacy.test.ts +0 -377
- package/tests/workspace/templates/team-playbook-extraction.test.ts +0 -341
- package/tests/workspace/templates/team-trajectory-analysis.test.ts +0 -417
- package/tsconfig.json +0 -25
- package/vitest.config.ts +0 -22
|
@@ -11,37 +11,49 @@
|
|
|
11
11
|
* Stores experience, bumps playbooks, extracts lightweight knowledge,
|
|
12
12
|
* causal edges, and reflexion episodes.
|
|
13
13
|
*
|
|
14
|
-
* 2. **Batch** (cold pipeline):
|
|
15
|
-
* (
|
|
14
|
+
* 2. **Batch** (cold pipeline): Drained from the durable dream queue via
|
|
15
|
+
* `dream()`. Runs full analysis, playbook extraction, temporal
|
|
16
16
|
* compression, and experience clustering.
|
|
17
17
|
*
|
|
18
18
|
* 3. **Maintenance** (circadian-gated): Runs periodically or after N batches.
|
|
19
|
-
* Knowledge defrag,
|
|
20
|
-
* effectiveness reporting.
|
|
19
|
+
* Knowledge defrag, meta-strategy generation, effectiveness reporting.
|
|
21
20
|
*
|
|
22
21
|
* The pipeline owns all components and coordinates them. Atlas delegates
|
|
23
22
|
* learning to this pipeline rather than managing components directly.
|
|
24
23
|
*/
|
|
24
|
+
import { randomUUID } from 'node:crypto';
|
|
25
|
+
import { logger } from '../utils/logger.js';
|
|
26
|
+
import { AgenticTaskOutputError, AgenticTaskRunError } from '../workspace/types.js';
|
|
25
27
|
// Immediate-phase components
|
|
26
28
|
import { InstantLoop } from './instant-loop.js';
|
|
27
29
|
// Batch-phase components
|
|
28
|
-
import { createAnalyzer
|
|
30
|
+
import { createAnalyzer } from './analyzer.js';
|
|
29
31
|
import { createPlaybookExtractor, } from './playbook-extractor.js';
|
|
30
32
|
import { KnowledgeExtractor } from './knowledge-extractor.js';
|
|
33
|
+
import { taskSignature } from '../utils/task-signature.js';
|
|
34
|
+
import { deriveObjectives } from '../utils/objectives.js';
|
|
35
|
+
import { canonicalizeSolver } from '../utils/solver-canonicalizer.js';
|
|
36
|
+
import { MergeProposer } from './merge-proposer.js';
|
|
37
|
+
import { MutationGate } from './mutation-gate.js';
|
|
38
|
+
import { ReflectiveMutationProposer } from './reflective-proposer.js';
|
|
39
|
+
import { createMechanismTraceEvent, noopMechanismTraceCollector, } from './mechanism-trace.js';
|
|
40
|
+
import { createTrajectoryDistiller } from './distiller.js';
|
|
41
|
+
import { readOracleSignal, oracleVerifierText } from './oracle-signal.js';
|
|
31
42
|
import { TemporalCompressor } from '../memory/temporal-compressor.js';
|
|
32
|
-
import { ReasoningBank } from '../memory/reasoning-bank.js';
|
|
33
43
|
import { trajectoryAnalysisTemplate } from '../workspace/templates/trajectory-analysis.js';
|
|
34
44
|
import { playbookExtractionTemplate } from '../workspace/templates/playbook-extraction.js';
|
|
35
45
|
// Efficacy templates (used in maintenance tasks)
|
|
36
|
-
import { playbookDecayDetectionTemplate } from '../workspace/templates/playbook-decay-detection.js';
|
|
46
|
+
import { playbookDecayDetectionTemplate, } from '../workspace/templates/playbook-decay-detection.js';
|
|
37
47
|
import { playbookEfficacyAuditTemplate } from '../workspace/templates/playbook-efficacy-audit.js';
|
|
38
48
|
import { playbookLifecycleReviewTemplate } from '../workspace/templates/playbook-lifecycle-review.js';
|
|
39
|
-
// Energy evaluator (batch trigger)
|
|
40
|
-
import { EnergyEvaluator, } from './energy-evaluator.js';
|
|
41
49
|
// Maintenance scheduler
|
|
42
50
|
import { MaintenanceScheduler, } from './maintenance-scheduler.js';
|
|
43
|
-
|
|
44
|
-
|
|
51
|
+
const DEFAULT_PIPELINE_DREAM_CONFIG = {
|
|
52
|
+
maxRowsPerDream: 200,
|
|
53
|
+
maxBatchesPerDream: 50,
|
|
54
|
+
leaseTtlMs: 900_000,
|
|
55
|
+
maxAttempts: 3,
|
|
56
|
+
};
|
|
45
57
|
const DEFAULT_EFFICACY_CONFIG = {
|
|
46
58
|
lifecycleReviewFrequency: 3,
|
|
47
59
|
minPlaybooks: 1,
|
|
@@ -51,14 +63,52 @@ const DEFAULT_UNIFIED_CONFIG = {
|
|
|
51
63
|
instant: {},
|
|
52
64
|
batch: {
|
|
53
65
|
learning: {},
|
|
54
|
-
energy: {},
|
|
55
66
|
},
|
|
56
67
|
maintenance: {},
|
|
57
68
|
metaLearner: {},
|
|
58
69
|
features: {},
|
|
59
70
|
efficacy: DEFAULT_EFFICACY_CONFIG,
|
|
71
|
+
dream: {},
|
|
60
72
|
maxInstantLatencyMs: 200,
|
|
73
|
+
validation: undefined,
|
|
61
74
|
};
|
|
75
|
+
/** Compute the Tier-0 quality signal from a batch of emitted playbooks. Pure. */
|
|
76
|
+
export function computeExtractionTier0(playbooks, trajectoryCount) {
|
|
77
|
+
const n = playbooks.length;
|
|
78
|
+
const frac = (pred) => n > 0 ? playbooks.filter(pred).length / n : 0;
|
|
79
|
+
return {
|
|
80
|
+
yieldPerTrajectory: trajectoryCount > 0 ? n / trajectoryCount : 0,
|
|
81
|
+
unconditionedRate: frac((p) => p.applicability.antiPatterns.length === 0),
|
|
82
|
+
triggerCoverage: frac((p) => p.applicability.triggers.length > 0),
|
|
83
|
+
situationCoverage: frac((p) => p.applicability.situations.length > 0),
|
|
84
|
+
meanConfidence: n > 0 ? playbooks.reduce((s, p) => s + p.confidence, 0) / n : 0,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function emptyMutationTaskStats() {
|
|
88
|
+
return {
|
|
89
|
+
runs: 0,
|
|
90
|
+
skipped: 0,
|
|
91
|
+
proposalsConsidered: 0,
|
|
92
|
+
proposalsAccepted: 0,
|
|
93
|
+
proposalsRejected: 0,
|
|
94
|
+
reasonCounts: {},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** Truncate `text` to `max` chars, appending an ellipsis when clipped. */
|
|
98
|
+
function truncate(text, max) {
|
|
99
|
+
return text.length > max ? text.slice(0, max) + '…' : text;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Compact one-line rendering of a playbook's guidance (strategy + tactics),
|
|
103
|
+
* truncated — used for the mutation trace's before/after diff and the journal
|
|
104
|
+
* entry. Returns undefined for a missing playbook.
|
|
105
|
+
*/
|
|
106
|
+
function compactGuidanceText(pb, max = 400) {
|
|
107
|
+
if (!pb)
|
|
108
|
+
return undefined;
|
|
109
|
+
const parts = [pb.guidance.strategy, ...(pb.guidance.tactics ?? [])].filter((p) => typeof p === 'string' && p.trim().length > 0);
|
|
110
|
+
return truncate(parts.join(' | '), max);
|
|
111
|
+
}
|
|
62
112
|
// =========================================================================
|
|
63
113
|
// Unified Pipeline
|
|
64
114
|
// =========================================================================
|
|
@@ -75,57 +125,102 @@ export class UnifiedLearningPipeline {
|
|
|
75
125
|
// Batch-phase components
|
|
76
126
|
analyzer;
|
|
77
127
|
playbookExtractor;
|
|
128
|
+
/** PR-D1: LLM-backed distiller; null when no LLM provider is wired. */
|
|
129
|
+
distiller = null;
|
|
78
130
|
knowledgeExtractor;
|
|
79
131
|
temporalCompressor;
|
|
80
|
-
reasoningBank;
|
|
81
132
|
// Meta-learning and effectiveness
|
|
82
133
|
metaLearner = null;
|
|
83
134
|
effectivenessTracker = null;
|
|
84
135
|
// Orchestration
|
|
85
|
-
energyEvaluator;
|
|
86
136
|
maintenanceScheduler;
|
|
87
|
-
healingOrchestrator;
|
|
88
137
|
// State
|
|
89
138
|
memory;
|
|
139
|
+
persistence;
|
|
140
|
+
judge;
|
|
141
|
+
llm;
|
|
90
142
|
taskRunner = null;
|
|
91
|
-
|
|
92
|
-
|
|
143
|
+
/**
|
|
144
|
+
* G2: tracks whether the "LLM extractor requested but no backend wired"
|
|
145
|
+
* warning has already fired this run, so we warn loudly but only once.
|
|
146
|
+
*/
|
|
147
|
+
warnedHeuristicFallback = false;
|
|
93
148
|
totalProcessed = 0;
|
|
94
149
|
batchCyclesRun = 0;
|
|
95
150
|
maintenanceCyclesRun = 0;
|
|
151
|
+
mutationActivity = {
|
|
152
|
+
maintenanceCyclesRun: 0,
|
|
153
|
+
reflective: emptyMutationTaskStats(),
|
|
154
|
+
merge: emptyMutationTaskStats(),
|
|
155
|
+
};
|
|
96
156
|
_onLatencyWarning = null;
|
|
157
|
+
diagnosticsCollector = null;
|
|
158
|
+
/**
|
|
159
|
+
* Sink for per-mutation-decision mechanism traces. Defaults to a no-op;
|
|
160
|
+
* callers (e.g. the eval runner) inject one via
|
|
161
|
+
* {@link setMechanismTraceCollector} to make the GEPA-style mutation loop
|
|
162
|
+
* observable (every considered proposal → one `mutation` trace event).
|
|
163
|
+
*/
|
|
164
|
+
mechanismTraceCollector = noopMechanismTraceCollector;
|
|
165
|
+
lastPlaybookExtractionDiagnostics = null;
|
|
97
166
|
lastDecayResult = null;
|
|
98
|
-
|
|
167
|
+
dreamConfig;
|
|
168
|
+
/** In-process guard so two dreams can't run concurrently in one process. */
|
|
169
|
+
dreaming = false;
|
|
170
|
+
constructor(memory, config, persistence,
|
|
171
|
+
/**
|
|
172
|
+
* Optional replay judge. Required only when `features.mergeProposing`
|
|
173
|
+
* is enabled — otherwise the merge maintenance task no-ops with a
|
|
174
|
+
* `skipped` result.
|
|
175
|
+
*/
|
|
176
|
+
judge,
|
|
177
|
+
/**
|
|
178
|
+
* Optional LLM provider. Required only when `features.reflectiveMutation`
|
|
179
|
+
* is enabled — the reflective proposer uses it to revise playbook
|
|
180
|
+
* guidance. The reflective maintenance task no-ops with a `skipped`
|
|
181
|
+
* result when it (or the judge) is absent.
|
|
182
|
+
*/
|
|
183
|
+
llm) {
|
|
99
184
|
this.config = {
|
|
100
185
|
...DEFAULT_UNIFIED_CONFIG,
|
|
101
186
|
...config,
|
|
102
187
|
instant: { ...DEFAULT_UNIFIED_CONFIG.instant, ...config?.instant },
|
|
103
188
|
batch: {
|
|
104
189
|
learning: { ...DEFAULT_UNIFIED_CONFIG.batch.learning, ...config?.batch?.learning },
|
|
105
|
-
energy: { ...DEFAULT_UNIFIED_CONFIG.batch.energy, ...config?.batch?.energy },
|
|
106
190
|
},
|
|
107
191
|
maintenance: { ...DEFAULT_UNIFIED_CONFIG.maintenance, ...config?.maintenance },
|
|
108
192
|
metaLearner: { ...DEFAULT_UNIFIED_CONFIG.metaLearner, ...config?.metaLearner },
|
|
109
193
|
features: { ...DEFAULT_UNIFIED_CONFIG.features, ...config?.features },
|
|
110
194
|
efficacy: { ...DEFAULT_EFFICACY_CONFIG, ...config?.efficacy },
|
|
195
|
+
dream: { ...DEFAULT_UNIFIED_CONFIG.dream, ...config?.dream },
|
|
196
|
+
validation: config?.validation,
|
|
111
197
|
};
|
|
112
198
|
this.memory = memory;
|
|
199
|
+
this.persistence = persistence;
|
|
200
|
+
this.judge = judge;
|
|
201
|
+
this.llm = llm;
|
|
202
|
+
this.dreamConfig = { ...DEFAULT_PIPELINE_DREAM_CONFIG, ...this.config.dream };
|
|
113
203
|
// Resolve learning config with defaults
|
|
114
204
|
const lc = this.config.batch.learning;
|
|
115
205
|
this.learningConfig = {
|
|
116
206
|
creditStrategy: lc.creditStrategy ?? 'simple',
|
|
117
207
|
patternExtractor: lc.patternExtractor ?? 'llm',
|
|
208
|
+
strictExtraction: lc.strictExtraction ?? false,
|
|
118
209
|
minTrajectories: lc.minTrajectories ?? 10,
|
|
119
210
|
minHoursSinceLast: lc.minHoursSinceLast,
|
|
120
211
|
minSuccessRate: lc.minSuccessRate,
|
|
121
212
|
deduplicationThreshold: lc.deduplicationThreshold ?? 0.9,
|
|
122
213
|
maxExperiences: lc.maxExperiences ?? 1000,
|
|
214
|
+
additiveMergeThreshold: lc.additiveMergeThreshold ?? 0.55,
|
|
123
215
|
};
|
|
124
216
|
// Immediate phase
|
|
125
217
|
this.instantLoop = new InstantLoop(memory, {
|
|
126
218
|
...this.config.instant,
|
|
127
219
|
enableReflexion: this.config.features.reflexion ?? true,
|
|
128
|
-
|
|
220
|
+
// Decoupled learning trims the hot path: knowledge and reflexion are
|
|
221
|
+
// replayed in the dream instead of on capture.
|
|
222
|
+
deferAnalytics: true,
|
|
223
|
+
validation: this.config.validation,
|
|
129
224
|
});
|
|
130
225
|
// Batch phase
|
|
131
226
|
this.analyzer = createAnalyzer(this.learningConfig.creditStrategy);
|
|
@@ -134,27 +229,14 @@ export class UnifiedLearningPipeline {
|
|
|
134
229
|
mergeThreshold: this.learningConfig.deduplicationThreshold,
|
|
135
230
|
minSuccessRate: this.learningConfig.minSuccessRate ?? 0.6,
|
|
136
231
|
});
|
|
137
|
-
this.knowledgeExtractor =
|
|
138
|
-
? new KnowledgeExtractor()
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
this.reasoningBank = (this.config.features.reasoningBank ?? true)
|
|
144
|
-
? new ReasoningBank(undefined, persistence)
|
|
145
|
-
: null;
|
|
232
|
+
this.knowledgeExtractor =
|
|
233
|
+
(this.config.features.knowledgeExtraction ?? true) ? new KnowledgeExtractor() : null;
|
|
234
|
+
this.temporalCompressor =
|
|
235
|
+
(this.config.features.temporalCompression ?? true)
|
|
236
|
+
? new TemporalCompressor(undefined, persistence)
|
|
237
|
+
: null;
|
|
146
238
|
// Orchestration
|
|
147
|
-
this.energyEvaluator = new EnergyEvaluator({
|
|
148
|
-
countThreshold: this.learningConfig.minTrajectories,
|
|
149
|
-
...this.config.batch.energy,
|
|
150
|
-
});
|
|
151
239
|
this.maintenanceScheduler = new MaintenanceScheduler(this.config.maintenance);
|
|
152
|
-
this.healingOrchestrator = new HealingOrchestrator();
|
|
153
|
-
// Register built-in healing detectors if healing feature is enabled
|
|
154
|
-
if (this.config.features.healing ?? true) {
|
|
155
|
-
this.healingOrchestrator.addDetector(new PlaybookDriftDetector());
|
|
156
|
-
this.healingOrchestrator.addDetector(new MemoryBloatDetector(this.learningConfig.maxExperiences));
|
|
157
|
-
}
|
|
158
240
|
// Register built-in maintenance tasks
|
|
159
241
|
this.registerBuiltInMaintenanceTasks();
|
|
160
242
|
}
|
|
@@ -164,21 +246,11 @@ export class UnifiedLearningPipeline {
|
|
|
164
246
|
*/
|
|
165
247
|
loadPersistedState() {
|
|
166
248
|
this.temporalCompressor?.loadPersistedState();
|
|
167
|
-
this.reasoningBank?.loadPersistedState();
|
|
168
249
|
}
|
|
169
250
|
/**
|
|
170
251
|
* Initialize components that require async setup.
|
|
171
252
|
*/
|
|
172
253
|
async init() {
|
|
173
|
-
// Seed known domains from existing playbooks for energy evaluator
|
|
174
|
-
const allPlaybooks = await this.memory.playbooks.getAll();
|
|
175
|
-
const domains = new Set();
|
|
176
|
-
for (const pb of allPlaybooks) {
|
|
177
|
-
for (const d of pb.applicability.domains) {
|
|
178
|
-
domains.add(d);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
this.energyEvaluator.seedKnownDomains([...domains]);
|
|
182
254
|
// Initialize meta-learner if enabled and meta memory available
|
|
183
255
|
if ((this.config.features.metaLearning ?? true) && this.memory.meta) {
|
|
184
256
|
const { createMetaLearner: createML } = await import('./meta-learner.js');
|
|
@@ -197,19 +269,126 @@ export class UnifiedLearningPipeline {
|
|
|
197
269
|
setTaskRunner(runner) {
|
|
198
270
|
this.taskRunner = runner;
|
|
199
271
|
}
|
|
272
|
+
setDiagnosticsCollector(collector) {
|
|
273
|
+
this.diagnosticsCollector = collector;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Inject a sink for per-mutation-decision mechanism traces. Pass `null`
|
|
277
|
+
* to reset to the no-op collector. Emitted for EVERY considered mutation
|
|
278
|
+
* proposal (accepted / rejected / regression / sparse- or empty-minibatch
|
|
279
|
+
* auto-accept), so a fired — or suppressed — mutation is recoverable.
|
|
280
|
+
*/
|
|
281
|
+
setMechanismTraceCollector(collector) {
|
|
282
|
+
this.mechanismTraceCollector = collector ?? noopMechanismTraceCollector;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Late-bind the LLM provider used by LLM-backed maintenance tasks
|
|
286
|
+
* (reflective mutation) and, optionally, the ReplayJudge used to gate
|
|
287
|
+
* mutations and merges.
|
|
288
|
+
*
|
|
289
|
+
* The maintenance-task closures read `this.llm` / `this.judge` at
|
|
290
|
+
* execution time, so this can be called any time after construction —
|
|
291
|
+
* e.g. when Atlas receives a provider via `setLearningProvider`,
|
|
292
|
+
* which happens after the pipeline is built.
|
|
293
|
+
*
|
|
294
|
+
* Without a judge, the merge and reflective-mutation tasks no-op (they
|
|
295
|
+
* have no way to gate candidates); callers that enable those features
|
|
296
|
+
* should pass one.
|
|
297
|
+
*/
|
|
298
|
+
setLearningLLM(llm, judge) {
|
|
299
|
+
this.llm = llm;
|
|
300
|
+
if (judge)
|
|
301
|
+
this.judge = judge;
|
|
302
|
+
// PR-D1: build/replace the distiller whenever the LLM provider is (re)wired.
|
|
303
|
+
this.distiller = createTrajectoryDistiller(llm, this.persistence);
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Set (or replace) the ReplayJudge used to gate mutations and merges,
|
|
307
|
+
* without binding an LLM generator. Used to upgrade gating to a
|
|
308
|
+
* {@link LiveReplay} judge for high-stakes acceptance, or to enable merge
|
|
309
|
+
* proposing (which needs only a judge) on the agent-backend path where
|
|
310
|
+
* there's no standalone LLMProvider.
|
|
311
|
+
*/
|
|
312
|
+
setJudge(judge) {
|
|
313
|
+
this.judge = judge;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Set the judge only if none is configured yet. Lets `setLearningProvider`
|
|
317
|
+
* install a default LLM judge without clobbering an explicitly-installed
|
|
318
|
+
* one (e.g. a LiveReplay judge from `enableLiveReplayGating`), regardless
|
|
319
|
+
* of call order.
|
|
320
|
+
*/
|
|
321
|
+
setJudgeIfUnset(judge) {
|
|
322
|
+
if (!this.judge)
|
|
323
|
+
this.judge = judge;
|
|
324
|
+
}
|
|
325
|
+
validationAllowsStableMutation() {
|
|
326
|
+
const validation = this.config.validation;
|
|
327
|
+
return !validation?.enabled || validation.mutationMode === 'active';
|
|
328
|
+
}
|
|
329
|
+
validationCanWrite(channel) {
|
|
330
|
+
const validation = this.config.validation;
|
|
331
|
+
if (!validation?.enabled)
|
|
332
|
+
return true;
|
|
333
|
+
if (validation.mutationMode !== 'active')
|
|
334
|
+
return false;
|
|
335
|
+
return validation.channelMasks.write.includes(channel);
|
|
336
|
+
}
|
|
337
|
+
validationAllowsExtraction() {
|
|
338
|
+
const validation = this.config.validation;
|
|
339
|
+
if (!validation?.enabled)
|
|
340
|
+
return true;
|
|
341
|
+
if (!validation.channelMasks.maintenance.extraction)
|
|
342
|
+
return false;
|
|
343
|
+
return (this.validationCanWrite('playbook') ||
|
|
344
|
+
this.validationCanWrite('metaPlaybook') ||
|
|
345
|
+
this.validationCanWrite('knowledgeNote') ||
|
|
346
|
+
this.validationCanWrite('reflexion') ||
|
|
347
|
+
this.validationCanWrite('causal') ||
|
|
348
|
+
this.validationCanWrite('frontier'));
|
|
349
|
+
}
|
|
350
|
+
validationAllowsScheduling() {
|
|
351
|
+
const validation = this.config.validation;
|
|
352
|
+
return !validation?.enabled || validation.channelMasks.maintenance.scheduling;
|
|
353
|
+
}
|
|
354
|
+
noopInstantLoopResult() {
|
|
355
|
+
return {
|
|
356
|
+
experienceId: '',
|
|
357
|
+
matchedPlaybooks: [],
|
|
358
|
+
knowledgeNotesExtracted: 0,
|
|
359
|
+
durationMs: 0,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
200
362
|
// =========================================================================
|
|
201
363
|
// IMMEDIATE PHASE
|
|
202
364
|
// =========================================================================
|
|
203
365
|
/**
|
|
204
|
-
* Process a single trajectory through the
|
|
366
|
+
* Process a single trajectory through the immediate phase and durably enqueue
|
|
367
|
+
* it for offline consolidation.
|
|
205
368
|
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
*
|
|
369
|
+
* Learning is always decoupled: the instant loop runs on the hot path, then
|
|
370
|
+
* the trajectory is enqueued on the durable dream queue. Consolidation happens
|
|
371
|
+
* only via `dream()` — explicitly, on a schedule, or at close.
|
|
209
372
|
*
|
|
210
373
|
* This is the primary entry point for trajectory processing.
|
|
211
374
|
*/
|
|
212
|
-
async processTrajectory(trajectory,
|
|
375
|
+
async processTrajectory(trajectory,
|
|
376
|
+
/**
|
|
377
|
+
* Optional serialized routing snapshot (a `DeferredRoutingSnapshot`). When
|
|
378
|
+
* present, the dream replays the deferred Phase-2 processing (meta-reflection
|
|
379
|
+
* + effectiveness) from it. Null/absent for external trajectories with no
|
|
380
|
+
* routing context.
|
|
381
|
+
*/
|
|
382
|
+
routingJson) {
|
|
383
|
+
if (!this.validationAllowsStableMutation()) {
|
|
384
|
+
const instantResult = this.noopInstantLoopResult();
|
|
385
|
+
this.totalProcessed++;
|
|
386
|
+
return {
|
|
387
|
+
instantLoop: instantResult,
|
|
388
|
+
batchTriggered: false,
|
|
389
|
+
maintenanceTriggered: false,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
213
392
|
// 1. Immediate phase — InstantLoop
|
|
214
393
|
const instantResult = await this.instantLoop.process(trajectory);
|
|
215
394
|
this.totalProcessed++;
|
|
@@ -217,90 +396,150 @@ export class UnifiedLearningPipeline {
|
|
|
217
396
|
if (instantResult.durationMs > this.config.maxInstantLatencyMs) {
|
|
218
397
|
this._onLatencyWarning?.(instantResult.durationMs);
|
|
219
398
|
}
|
|
220
|
-
// 2.
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
399
|
+
// 2. Durably enqueue the trajectory for offline consolidation — the dream is
|
|
400
|
+
// the consumer. Non-fatal: a queue-write failure must never break the
|
|
401
|
+
// learning hot path.
|
|
402
|
+
if ((this.config.features.dreamQueue ?? true) &&
|
|
403
|
+
this.validationAllowsScheduling() &&
|
|
404
|
+
this.validationAllowsExtraction() &&
|
|
405
|
+
this.persistence) {
|
|
406
|
+
try {
|
|
407
|
+
this.persistence.enqueueDreamRow({
|
|
408
|
+
trajectoryId: trajectory.id,
|
|
409
|
+
trajectoryJson: JSON.stringify(trajectory),
|
|
410
|
+
routingJson: routingJson ?? null,
|
|
411
|
+
source: 'pipeline',
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
catch {
|
|
415
|
+
// Non-fatal — consolidation is best-effort; a missed enqueue just means
|
|
416
|
+
// this trajectory isn't dreamed over.
|
|
417
|
+
}
|
|
227
418
|
}
|
|
228
|
-
|
|
229
|
-
this.accumulatedAnalyses.push(analysis);
|
|
230
|
-
// 3. Energy evaluation
|
|
231
|
-
const energyEval = this.energyEvaluator.evaluate(trajectory, instantResult, signals);
|
|
232
|
-
const result = {
|
|
419
|
+
return {
|
|
233
420
|
instantLoop: instantResult,
|
|
234
|
-
energyEval,
|
|
235
421
|
batchTriggered: false,
|
|
236
422
|
maintenanceTriggered: false,
|
|
237
423
|
};
|
|
238
|
-
// 4. Batch trigger
|
|
239
|
-
if (energyEval.shouldTriggerBatch) {
|
|
240
|
-
const batchResult = await this.runBatch(energyEval.reasons);
|
|
241
|
-
result.batchTriggered = true;
|
|
242
|
-
result.batchResult = batchResult;
|
|
243
|
-
// 5. Check maintenance after batch
|
|
244
|
-
this.maintenanceScheduler.onBatchComplete();
|
|
245
|
-
if (this.maintenanceScheduler.shouldRunMaintenance()) {
|
|
246
|
-
const maintenanceResult = await this.runMaintenance();
|
|
247
|
-
result.maintenanceTriggered = true;
|
|
248
|
-
result.maintenanceResult = maintenanceResult;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
return result;
|
|
252
424
|
}
|
|
253
425
|
// =========================================================================
|
|
254
426
|
// BATCH PHASE
|
|
255
427
|
// =========================================================================
|
|
256
428
|
/**
|
|
257
|
-
* Run batch
|
|
258
|
-
*
|
|
429
|
+
* Run a batch over an explicit set of trajectories + analyses. The caller
|
|
430
|
+
* supplies the working set — the durable dream_queue (via `dream`) — and this
|
|
431
|
+
* method never reads or mutates shared accumulation state.
|
|
259
432
|
*/
|
|
260
|
-
async
|
|
261
|
-
if (
|
|
433
|
+
async runBatchOver(trajectories, analyses, triggerReasons) {
|
|
434
|
+
if (trajectories.length === 0) {
|
|
262
435
|
return this.emptyBatchResult(triggerReasons ?? []);
|
|
263
436
|
}
|
|
264
437
|
this.maintenanceScheduler.onBatchStart();
|
|
265
438
|
try {
|
|
266
439
|
// Extract playbooks
|
|
267
440
|
let playbooksAdded = 0;
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
441
|
+
let playbooksSkippedDedup = 0;
|
|
442
|
+
let updatesApplied = 0;
|
|
443
|
+
const canWritePlaybooks = this.validationCanWrite('playbook');
|
|
444
|
+
const canWriteFrontier = this.validationCanWrite('frontier');
|
|
445
|
+
const canWriteKnowledge = this.validationCanWrite('knowledgeNote');
|
|
446
|
+
const canWriteExperiences = this.validationCanWrite('experience');
|
|
447
|
+
const canWriteMetaPlaybooks = this.validationCanWrite('metaPlaybook');
|
|
448
|
+
if (canWritePlaybooks) {
|
|
449
|
+
const existingPlaybooks = await this.memory.playbooks.getAll();
|
|
450
|
+
const playbookExtraction = await this.extractPlaybooks(existingPlaybooks, trajectories, analyses);
|
|
451
|
+
for (const playbook of playbookExtraction.new) {
|
|
452
|
+
// ADDITIVE LEARNING (PR-D2 hook, default OFF): before minting a new
|
|
453
|
+
// `distilled-<uuid>`, try to REFINE a sufficiently-similar existing
|
|
454
|
+
// playbook so evidence COMPOUNDS onto one record instead of
|
|
455
|
+
// proliferating 1:1 per trajectory. The scan is over the LIVE library
|
|
456
|
+
// which, mid-loop, already contains playbooks added earlier in THIS
|
|
457
|
+
// batch — so both the already-distilled-this-batch set and the
|
|
458
|
+
// persisted library are covered. Similarity is embeddings-optional
|
|
459
|
+
// and domain-gated (see PlaybookLibrary.findRefineTarget), so it works
|
|
460
|
+
// under the eval default of embedProvider:'none'.
|
|
461
|
+
//
|
|
462
|
+
// Over-merge tradeoff: a too-low threshold conflates distinct lessons
|
|
463
|
+
// into one bloated playbook; the domain-overlap hard gate + the
|
|
464
|
+
// `additiveMergeThreshold` floor bound that risk. See
|
|
465
|
+
// LearningConfig.additiveMergeThreshold.
|
|
466
|
+
if (this.config.features.additiveConsolidation) {
|
|
467
|
+
const targetId = await this.memory.playbooks.findRefineTarget(playbook, this.learningConfig.additiveMergeThreshold);
|
|
468
|
+
if (targetId) {
|
|
469
|
+
await this.applyReflexionAntiPatterns(playbook);
|
|
470
|
+
const refined = await this.memory.playbooks.refineWithDistilled(targetId, playbook);
|
|
471
|
+
updatesApplied++;
|
|
472
|
+
// Seed the frontier from this trajectory's experiences onto the
|
|
473
|
+
// refined (reused) playbook so it accrues attested evidence.
|
|
474
|
+
if (refined && canWriteFrontier) {
|
|
475
|
+
await this.seedFrontierForNewPlaybook(refined, trajectories);
|
|
476
|
+
}
|
|
477
|
+
continue;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
const exists = await this.memory.playbooks.exists(playbook.name, this.learningConfig.deduplicationThreshold);
|
|
481
|
+
if (!exists) {
|
|
482
|
+
// G3: durably apply reflexion `suggestedPlaybookUpdates` (esp.
|
|
483
|
+
// avoid/anti-pattern rules) from the source trajectories onto the
|
|
484
|
+
// playbook record before persisting, so reflexion is no longer
|
|
485
|
+
// write-only on the cross-run path (G1 only used it ephemerally).
|
|
486
|
+
await this.applyReflexionAntiPatterns(playbook);
|
|
286
487
|
await this.memory.playbooks.add(playbook);
|
|
488
|
+
playbooksAdded++;
|
|
489
|
+
// Seed the Pareto frontier from the source trajectories so the
|
|
490
|
+
// newly minted playbook starts with attested wins — otherwise
|
|
491
|
+
// the frontier stays empty until the playbook gets matched at
|
|
492
|
+
// routing time, which can take many solves.
|
|
493
|
+
if (canWriteFrontier) {
|
|
494
|
+
await this.seedFrontierForNewPlaybook(playbook, trajectories);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
else {
|
|
498
|
+
playbooksSkippedDedup++;
|
|
287
499
|
}
|
|
288
500
|
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
if (
|
|
292
|
-
|
|
293
|
-
|
|
501
|
+
// Apply updates to existing playbooks
|
|
502
|
+
for (const update of playbookExtraction.updates) {
|
|
503
|
+
if (update.refinement) {
|
|
504
|
+
await this.memory.playbooks.addRefinement(update.id, update.refinement.context, update.refinement.addition, update.refinement.source);
|
|
505
|
+
updatesApplied++;
|
|
506
|
+
}
|
|
507
|
+
if (update.newTrigger) {
|
|
508
|
+
const playbook = await this.memory.playbooks.get(update.id);
|
|
509
|
+
if (playbook && !playbook.applicability.triggers.includes(update.newTrigger)) {
|
|
510
|
+
playbook.applicability.triggers.push(update.newTrigger);
|
|
511
|
+
await this.memory.playbooks.add(playbook);
|
|
512
|
+
updatesApplied++;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
if (update.newAntiPattern) {
|
|
516
|
+
const playbook = await this.memory.playbooks.get(update.id);
|
|
517
|
+
if (playbook && !playbook.applicability.antiPatterns.includes(update.newAntiPattern)) {
|
|
518
|
+
playbook.applicability.antiPatterns.push(update.newAntiPattern);
|
|
519
|
+
await this.memory.playbooks.add(playbook);
|
|
520
|
+
updatesApplied++;
|
|
521
|
+
}
|
|
294
522
|
}
|
|
295
523
|
}
|
|
296
524
|
}
|
|
525
|
+
if (this.lastPlaybookExtractionDiagnostics) {
|
|
526
|
+
this.emitDiagnostics({
|
|
527
|
+
...this.lastPlaybookExtractionDiagnostics,
|
|
528
|
+
storage: {
|
|
529
|
+
added: playbooksAdded,
|
|
530
|
+
skippedDedup: playbooksSkippedDedup,
|
|
531
|
+
updatesApplied,
|
|
532
|
+
},
|
|
533
|
+
});
|
|
534
|
+
this.lastPlaybookExtractionDiagnostics = null;
|
|
535
|
+
}
|
|
297
536
|
// Knowledge extraction (batch-level, richer than instant-loop)
|
|
298
537
|
let knowledgeExtracted = 0;
|
|
299
|
-
if (this.knowledgeExtractor && this.memory.knowledgeBank) {
|
|
538
|
+
if (canWriteKnowledge && this.knowledgeExtractor && this.memory.knowledgeBank) {
|
|
300
539
|
const existingEntities = await this.memory.knowledgeBank.listEntities();
|
|
301
540
|
const context = { existingEntities };
|
|
302
|
-
for (let i = 0; i <
|
|
303
|
-
const extracted = this.knowledgeExtractor.extract(
|
|
541
|
+
for (let i = 0; i < trajectories.length; i++) {
|
|
542
|
+
const extracted = this.knowledgeExtractor.extract(trajectories[i], analyses[i], context);
|
|
304
543
|
for (const obs of extracted.observations) {
|
|
305
544
|
try {
|
|
306
545
|
await this.memory.knowledgeBank.addObservation(obs);
|
|
@@ -316,7 +555,7 @@ export class UnifiedLearningPipeline {
|
|
|
316
555
|
let compressionEvicted = 0;
|
|
317
556
|
let compressionPromoted = 0;
|
|
318
557
|
let compressionDemoted = 0;
|
|
319
|
-
if (this.temporalCompressor) {
|
|
558
|
+
if (canWriteExperiences && this.temporalCompressor) {
|
|
320
559
|
const allExperiences = await this.memory.experiences.getAll();
|
|
321
560
|
const compressionResult = await this.temporalCompressor.compress(allExperiences);
|
|
322
561
|
for (const [id, updates] of compressionResult.updates) {
|
|
@@ -329,20 +568,17 @@ export class UnifiedLearningPipeline {
|
|
|
329
568
|
compressionPromoted = compressionResult.promoted.length;
|
|
330
569
|
compressionDemoted = compressionResult.demoted.length;
|
|
331
570
|
}
|
|
332
|
-
// Re-cluster experiences
|
|
333
|
-
const currentExperiences = await this.memory.experiences.getAll();
|
|
334
|
-
if (this.reasoningBank) {
|
|
335
|
-
this.reasoningBank.buildClusters(currentExperiences);
|
|
336
|
-
}
|
|
337
571
|
// Prune experiences
|
|
338
|
-
const pruned =
|
|
339
|
-
|
|
340
|
-
|
|
572
|
+
const pruned = canWriteExperiences
|
|
573
|
+
? await this.memory.experiences.prune({
|
|
574
|
+
maxCount: this.learningConfig.maxExperiences,
|
|
575
|
+
})
|
|
576
|
+
: { totalPruned: 0 };
|
|
341
577
|
// Calculate success rate
|
|
342
|
-
const successCount =
|
|
343
|
-
const successRate = successCount /
|
|
578
|
+
const successCount = analyses.filter((a) => a.success).length;
|
|
579
|
+
const successRate = successCount / trajectories.length;
|
|
344
580
|
// Meta-learning: generate strategies periodically
|
|
345
|
-
if (this.metaLearner) {
|
|
581
|
+
if (canWriteMetaPlaybooks && this.metaLearner) {
|
|
346
582
|
try {
|
|
347
583
|
await this.metaLearner.learn();
|
|
348
584
|
}
|
|
@@ -350,11 +586,7 @@ export class UnifiedLearningPipeline {
|
|
|
350
586
|
// Non-critical
|
|
351
587
|
}
|
|
352
588
|
}
|
|
353
|
-
const trajectoriesProcessed =
|
|
354
|
-
// Clear accumulated and reset energy evaluator
|
|
355
|
-
this.accumulated = [];
|
|
356
|
-
this.accumulatedAnalyses = [];
|
|
357
|
-
this.energyEvaluator.resetAfterBatch();
|
|
589
|
+
const trajectoriesProcessed = trajectories.length;
|
|
358
590
|
this.batchCyclesRun++;
|
|
359
591
|
return {
|
|
360
592
|
trajectoriesProcessed,
|
|
@@ -365,7 +597,7 @@ export class UnifiedLearningPipeline {
|
|
|
365
597
|
demoted: compressionDemoted,
|
|
366
598
|
evicted: compressionEvicted,
|
|
367
599
|
},
|
|
368
|
-
experiencesClustered:
|
|
600
|
+
experiencesClustered: 0,
|
|
369
601
|
knowledgeExtracted,
|
|
370
602
|
successRate,
|
|
371
603
|
triggerReasons: triggerReasons ?? ['manual_override'],
|
|
@@ -380,33 +612,439 @@ export class UnifiedLearningPipeline {
|
|
|
380
612
|
// =========================================================================
|
|
381
613
|
/**
|
|
382
614
|
* Run a maintenance cycle.
|
|
383
|
-
* Executes registered maintenance tasks (defrag,
|
|
615
|
+
* Executes registered maintenance tasks (defrag, meta-strategies, etc.).
|
|
384
616
|
* Can be called manually regardless of mode.
|
|
385
617
|
*/
|
|
386
618
|
async runMaintenance(options) {
|
|
619
|
+
if (!this.validationAllowsStableMutation() || !this.validationAllowsScheduling()) {
|
|
620
|
+
return {
|
|
621
|
+
ran: false,
|
|
622
|
+
skipReason: 'validation_disabled',
|
|
623
|
+
taskResults: [],
|
|
624
|
+
totalDurationMs: 0,
|
|
625
|
+
timestamp: new Date(),
|
|
626
|
+
};
|
|
627
|
+
}
|
|
387
628
|
const result = await this.maintenanceScheduler.runMaintenance(options);
|
|
388
629
|
if (result.ran) {
|
|
389
630
|
this.maintenanceCyclesRun++;
|
|
631
|
+
this.recordMutationActivity(result);
|
|
390
632
|
}
|
|
391
633
|
return result;
|
|
392
634
|
}
|
|
393
635
|
/**
|
|
394
|
-
*
|
|
636
|
+
* Fold one maintenance cycle's mutation-task results into the accumulated
|
|
637
|
+
* activity counters. The task closures already report per-cycle counts in
|
|
638
|
+
* their `details`; this aggregates them so eval harnesses (and any caller
|
|
639
|
+
* of `getStats()` / `getMutationActivity()`) can prove whether the
|
|
640
|
+
* mutation path executed across a whole run without parsing cycle logs.
|
|
395
641
|
*/
|
|
396
|
-
|
|
397
|
-
this.
|
|
642
|
+
recordMutationActivity(result) {
|
|
643
|
+
this.mutationActivity.maintenanceCyclesRun++;
|
|
644
|
+
const tasks = [
|
|
645
|
+
['reflective-mutation', this.mutationActivity.reflective],
|
|
646
|
+
['pareto-merge-proposing', this.mutationActivity.merge],
|
|
647
|
+
];
|
|
648
|
+
for (const [taskName, stats] of tasks) {
|
|
649
|
+
const taskResult = result.taskResults.find((t) => t.taskName === taskName);
|
|
650
|
+
if (!taskResult)
|
|
651
|
+
continue;
|
|
652
|
+
stats.runs++;
|
|
653
|
+
const details = taskResult.details ?? {};
|
|
654
|
+
if (details.skipped) {
|
|
655
|
+
stats.skipped++;
|
|
656
|
+
stats.lastSkipReason = typeof details.reason === 'string' ? details.reason : 'unknown';
|
|
657
|
+
continue;
|
|
658
|
+
}
|
|
659
|
+
const considered = typeof details.proposalsConsidered === 'number' ? details.proposalsConsidered : 0;
|
|
660
|
+
const accepted = typeof details.proposalsAccepted === 'number' ? details.proposalsAccepted : 0;
|
|
661
|
+
stats.proposalsConsidered += considered;
|
|
662
|
+
stats.proposalsAccepted += accepted;
|
|
663
|
+
stats.proposalsRejected += Math.max(0, considered - accepted);
|
|
664
|
+
// Fold in the per-GateReason breakdown so reports can tell genuine
|
|
665
|
+
// `improved` accepts apart from sparse/empty-minibatch auto-accepts.
|
|
666
|
+
const reasonCounts = details.reasonCounts;
|
|
667
|
+
if (reasonCounts && typeof reasonCounts === 'object') {
|
|
668
|
+
for (const [reason, count] of Object.entries(reasonCounts)) {
|
|
669
|
+
if (typeof count !== 'number')
|
|
670
|
+
continue;
|
|
671
|
+
const key = reason;
|
|
672
|
+
stats.reasonCounts[key] = (stats.reasonCounts[key] ?? 0) + count;
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
/**
|
|
678
|
+
* Accumulated mutation/merge proposing activity across all maintenance
|
|
679
|
+
* cycles this pipeline has run.
|
|
680
|
+
*/
|
|
681
|
+
getMutationActivity() {
|
|
682
|
+
return this.mutationActivity;
|
|
683
|
+
}
|
|
684
|
+
/**
|
|
685
|
+
* Record one mutation gate decision to BOTH observability sinks:
|
|
686
|
+
* 1. the injected mechanism-trace collector (a `mutation` trace event
|
|
687
|
+
* for every considered proposal — accepted, rejected, or auto-accept),
|
|
688
|
+
* 2. the durable `mutation_journal` table (learning content fed back into
|
|
689
|
+
* the proposer's next prompt).
|
|
690
|
+
*
|
|
691
|
+
* Best-effort: a trace/journal write must never break the maintenance loop,
|
|
692
|
+
* so failures are swallowed. Returns nothing.
|
|
693
|
+
*/
|
|
694
|
+
recordMutationDecision(args) {
|
|
695
|
+
const guidanceAfter = compactGuidanceText(args.candidate);
|
|
696
|
+
const scoreDelta = args.childSum - args.parentSum;
|
|
697
|
+
try {
|
|
698
|
+
this.mechanismTraceCollector(createMechanismTraceEvent({
|
|
699
|
+
family: 'mutation',
|
|
700
|
+
source: `UnifiedLearningPipeline.${args.mutationType}-mutation`,
|
|
701
|
+
mutationType: args.mutationType,
|
|
702
|
+
taskSignature: args.taskSignature,
|
|
703
|
+
parentId: args.parentId,
|
|
704
|
+
secondaryParentId: args.secondaryParentId,
|
|
705
|
+
candidateId: args.candidate.id,
|
|
706
|
+
candidateName: args.candidate.name,
|
|
707
|
+
reason: args.reason,
|
|
708
|
+
accepted: args.accepted,
|
|
709
|
+
parentSum: args.parentSum,
|
|
710
|
+
childSum: args.childSum,
|
|
711
|
+
scoreDelta,
|
|
712
|
+
judgeCalls: args.judgeCalls,
|
|
713
|
+
guidanceBefore: args.guidanceBefore,
|
|
714
|
+
guidanceAfter,
|
|
715
|
+
rationale: args.rationale ? truncate(args.rationale, 400) : undefined,
|
|
716
|
+
}));
|
|
717
|
+
}
|
|
718
|
+
catch {
|
|
719
|
+
// best-effort trace emission must not affect the maintenance loop
|
|
720
|
+
}
|
|
721
|
+
try {
|
|
722
|
+
this.persistence?.recordMutationJournalEntry({
|
|
723
|
+
parentId: args.parentId,
|
|
724
|
+
taskSignature: args.taskSignature,
|
|
725
|
+
mutationType: args.mutationType,
|
|
726
|
+
candidateId: args.candidate.id,
|
|
727
|
+
candidateName: args.candidate.name,
|
|
728
|
+
guidanceAfter,
|
|
729
|
+
reason: args.reason,
|
|
730
|
+
accepted: args.accepted,
|
|
731
|
+
parentSum: args.parentSum,
|
|
732
|
+
childSum: args.childSum,
|
|
733
|
+
scoreDelta,
|
|
734
|
+
rationale: args.rationale ? truncate(args.rationale, 400) : undefined,
|
|
735
|
+
});
|
|
736
|
+
}
|
|
737
|
+
catch {
|
|
738
|
+
// best-effort journal write must not affect the maintenance loop
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
// =========================================================================
|
|
742
|
+
// DREAM PHASE (queue-sourced consolidation)
|
|
743
|
+
// =========================================================================
|
|
744
|
+
/**
|
|
745
|
+
* Drain the durable dream_queue and consolidate offline. Reclaims rows
|
|
746
|
+
* orphaned by a crashed dreamer, then repeatedly claims a batch of pending
|
|
747
|
+
* rows, re-derives analyses, and runs a batch over them — followed by a
|
|
748
|
+
* maintenance check. This is the decoupled replacement for the inline batch
|
|
749
|
+
* trigger; being queue-sourced it survives process restarts (and, in a later
|
|
750
|
+
* phase, runs from a separate process).
|
|
751
|
+
*
|
|
752
|
+
* Single-flight within a process: a concurrent call returns an empty result.
|
|
753
|
+
* No-op (empty result) when there is no persistence handle.
|
|
754
|
+
*/
|
|
755
|
+
async dream(opts) {
|
|
756
|
+
const start = Date.now();
|
|
757
|
+
const drainAll = opts?.drainAll ?? true;
|
|
758
|
+
if (!this.persistence ||
|
|
759
|
+
this.dreaming ||
|
|
760
|
+
!this.validationAllowsStableMutation() ||
|
|
761
|
+
!this.validationAllowsScheduling() ||
|
|
762
|
+
!this.validationAllowsExtraction()) {
|
|
763
|
+
return this.emptyDreamResult(start);
|
|
764
|
+
}
|
|
765
|
+
// Cross-process single-flight: bail if another process (e.g. a `dream` CLI
|
|
766
|
+
// or another server) currently holds the lock. The in-process `dreaming`
|
|
767
|
+
// flag guards within this process; the lock guards across processes.
|
|
768
|
+
const owner = randomUUID();
|
|
769
|
+
if (!this.persistence.acquireDreamLock(owner, this.dreamConfig.leaseTtlMs)) {
|
|
770
|
+
return this.emptyDreamResult(start);
|
|
771
|
+
}
|
|
772
|
+
this.dreaming = true;
|
|
773
|
+
let rowsClaimed = 0;
|
|
774
|
+
let rowsCompleted = 0;
|
|
775
|
+
let rowsFailed = 0;
|
|
776
|
+
const batches = [];
|
|
777
|
+
try {
|
|
778
|
+
const { reclaimed } = this.persistence.reclaimExpiredDreamRows(this.dreamConfig.maxAttempts);
|
|
779
|
+
for (let b = 0; b < this.dreamConfig.maxBatchesPerDream; b++) {
|
|
780
|
+
// Heartbeat the cross-process lock so a long multi-batch drain doesn't
|
|
781
|
+
// lose it mid-flight (which would let another process start a colliding
|
|
782
|
+
// dream and double-process). Same-owner re-acquire refreshes the lease;
|
|
783
|
+
// a false return means our lease expired and someone else took over —
|
|
784
|
+
// yield to them.
|
|
785
|
+
if (!this.persistence.acquireDreamLock(owner, this.dreamConfig.leaseTtlMs)) {
|
|
786
|
+
break;
|
|
787
|
+
}
|
|
788
|
+
const rows = this.persistence.claimDreamRows(this.dreamConfig.maxRowsPerDream, owner, this.dreamConfig.leaseTtlMs);
|
|
789
|
+
if (rows.length === 0)
|
|
790
|
+
break;
|
|
791
|
+
rowsClaimed += rows.length;
|
|
792
|
+
try {
|
|
793
|
+
// Keep (row, trajectory) pairs so the per-row routing snapshot is
|
|
794
|
+
// available for deferred Phase-2 replay.
|
|
795
|
+
const pairs = [];
|
|
796
|
+
const corruptIds = [];
|
|
797
|
+
for (const row of rows) {
|
|
798
|
+
const traj = parseQueuedTrajectory(row.trajectory_json);
|
|
799
|
+
if (traj)
|
|
800
|
+
pairs.push({ row, traj });
|
|
801
|
+
else
|
|
802
|
+
corruptIds.push(row.id);
|
|
803
|
+
}
|
|
804
|
+
const trajectories = pairs.map((p) => p.traj);
|
|
805
|
+
// Idempotency sentinel (B): a trajectory already consolidated by a
|
|
806
|
+
// prior (failed-then-retried) dream has a reflexion episode. Skip its
|
|
807
|
+
// per-trajectory replay so the one non-idempotent output (knowledge
|
|
808
|
+
// notes) isn't re-extracted. Reflexion + meta are also idempotent by
|
|
809
|
+
// construction (deterministic ids), so this is belt-and-suspenders;
|
|
810
|
+
// the skip mainly protects knowledge. NOTE: relies on reflexion being
|
|
811
|
+
// enabled (the default) as the sentinel.
|
|
812
|
+
const freshPairs = [];
|
|
813
|
+
for (const p of pairs) {
|
|
814
|
+
let alreadyConsolidated = false;
|
|
815
|
+
try {
|
|
816
|
+
alreadyConsolidated = !!(await this.memory.reflexion.getByTrajectory(p.traj.id));
|
|
817
|
+
}
|
|
818
|
+
catch {
|
|
819
|
+
// Treat a lookup failure as not-consolidated (safe: at worst re-runs).
|
|
820
|
+
}
|
|
821
|
+
if (!alreadyConsolidated)
|
|
822
|
+
freshPairs.push(p);
|
|
823
|
+
}
|
|
824
|
+
// Replay the deferred immediate-phase analytics (knowledge / causal /
|
|
825
|
+
// reflexion) the trimmed hot path skipped. Only when analytics were
|
|
826
|
+
// actually deferred (decoupled mode) — otherwise the capture already
|
|
827
|
+
// ran them inline and re-running would double-count.
|
|
828
|
+
if (this.instantLoop.deferAnalytics) {
|
|
829
|
+
for (const { traj } of freshPairs) {
|
|
830
|
+
try {
|
|
831
|
+
await this.instantLoop.runAnalytics(traj);
|
|
832
|
+
}
|
|
833
|
+
catch {
|
|
834
|
+
// Non-fatal — analytics are best-effort; the batch still runs.
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
// Replay the deferred Phase-2 processing (meta-reflection +
|
|
839
|
+
// effectiveness) from each row's routing snapshot. Skip
|
|
840
|
+
// already-consolidated trajectories (idempotent anyway, but avoids
|
|
841
|
+
// redundant work).
|
|
842
|
+
for (const { row, traj } of freshPairs) {
|
|
843
|
+
await this.runDeferredPhase2(traj, row.routing_json);
|
|
844
|
+
}
|
|
845
|
+
// Re-derive analyses from the drained trajectories — the in-memory
|
|
846
|
+
// analyses don't survive a separate process, so recomputing here
|
|
847
|
+
// makes the queue the single source of truth.
|
|
848
|
+
const analyses = [];
|
|
849
|
+
for (const traj of trajectories) {
|
|
850
|
+
analyses.push(this.taskRunner
|
|
851
|
+
? await this.analyzeWithTemplate(traj)
|
|
852
|
+
: await this.analyzer.analyze(traj));
|
|
853
|
+
}
|
|
854
|
+
const batch = await this.runBatchOver(trajectories, analyses, ['manual_override']);
|
|
855
|
+
batches.push(batch);
|
|
856
|
+
// Complete only successfully-parsed rows. Unparseable rows are parked
|
|
857
|
+
// as `failed` directly (corrupt JSON won't fix itself on retry) —
|
|
858
|
+
// observable via getDreamQueueStats, not silently DELETEd, and not
|
|
859
|
+
// requeued into an infinite re-parse loop.
|
|
860
|
+
this.persistence.completeDreamRows(pairs.map((p) => p.row.id));
|
|
861
|
+
rowsCompleted += pairs.length;
|
|
862
|
+
if (corruptIds.length > 0) {
|
|
863
|
+
this.persistence.failDreamRows(corruptIds);
|
|
864
|
+
rowsFailed += corruptIds.length;
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
catch {
|
|
868
|
+
// Recoverable: return the rows to pending for a later dream. The
|
|
869
|
+
// attempts counter (bumped on claim) eventually parks poison rows.
|
|
870
|
+
this.persistence.releaseDreamRows(rows.map((r) => r.id));
|
|
871
|
+
rowsFailed += rows.length;
|
|
872
|
+
break;
|
|
873
|
+
}
|
|
874
|
+
if (!drainAll)
|
|
875
|
+
break;
|
|
876
|
+
}
|
|
877
|
+
// Maintenance check after draining (mirrors the inline path's ordering).
|
|
878
|
+
let maintenance;
|
|
879
|
+
if (rowsCompleted > 0 && this.validationAllowsScheduling()) {
|
|
880
|
+
this.maintenanceScheduler.onBatchComplete();
|
|
881
|
+
if (this.maintenanceScheduler.shouldRunMaintenance()) {
|
|
882
|
+
maintenance = await this.runMaintenance();
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
return {
|
|
886
|
+
dreamedAt: new Date(),
|
|
887
|
+
rowsClaimed,
|
|
888
|
+
rowsCompleted,
|
|
889
|
+
rowsFailed,
|
|
890
|
+
reclaimed,
|
|
891
|
+
batch: aggregateBatchResults(batches),
|
|
892
|
+
maintenance,
|
|
893
|
+
durationMs: Date.now() - start,
|
|
894
|
+
};
|
|
895
|
+
}
|
|
896
|
+
finally {
|
|
897
|
+
this.dreaming = false;
|
|
898
|
+
this.persistence.releaseDreamLock(owner);
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
emptyDreamResult(start) {
|
|
902
|
+
return {
|
|
903
|
+
dreamedAt: new Date(),
|
|
904
|
+
rowsClaimed: 0,
|
|
905
|
+
rowsCompleted: 0,
|
|
906
|
+
rowsFailed: 0,
|
|
907
|
+
reclaimed: 0,
|
|
908
|
+
batch: this.emptyBatchResult(['manual_override']),
|
|
909
|
+
durationMs: Date.now() - start,
|
|
910
|
+
};
|
|
911
|
+
}
|
|
912
|
+
/**
|
|
913
|
+
* Replay deferred Phase-2 processing (C2) for one trajectory from its routing
|
|
914
|
+
* snapshot: meta-reflection (heuristic) + effectiveness annotation. Playbook
|
|
915
|
+
* matches are rehydrated by id from memory (current state). Best-effort —
|
|
916
|
+
* never fails the dream. (Usage inference stays inline in `solve()`; it is
|
|
917
|
+
* SkillLibrary-coupled and produces the synchronous solve result.)
|
|
918
|
+
*/
|
|
919
|
+
async runDeferredPhase2(trajectory, routingJson) {
|
|
920
|
+
if (!routingJson) {
|
|
921
|
+
// External trajectory (no routing happened). Meta-reflection and strategy
|
|
922
|
+
// credit are genuinely inapplicable — but effectiveness annotation is
|
|
923
|
+
// not: detect out-of-band exposure (declared metadata / explicit skill
|
|
924
|
+
// references in the transcript) so production learn/dream traffic feeds
|
|
925
|
+
// the guided-vs-unguided scorecard instead of being invisible to it.
|
|
926
|
+
await this.annotateExternalTrajectory(trajectory);
|
|
927
|
+
return;
|
|
928
|
+
}
|
|
929
|
+
let snap;
|
|
930
|
+
try {
|
|
931
|
+
snap = JSON.parse(routingJson);
|
|
932
|
+
}
|
|
933
|
+
catch {
|
|
934
|
+
return;
|
|
935
|
+
}
|
|
936
|
+
// Rehydrate playbook matches by id (skip any since-deleted playbooks).
|
|
937
|
+
const playbookMatches = [];
|
|
938
|
+
for (const ref of snap.playbookMatchRefs ?? []) {
|
|
939
|
+
try {
|
|
940
|
+
const pb = await this.memory.playbooks.get(ref.id);
|
|
941
|
+
if (pb) {
|
|
942
|
+
playbookMatches.push({
|
|
943
|
+
playbook: pb,
|
|
944
|
+
score: ref.score,
|
|
945
|
+
matchType: ref.matchType,
|
|
946
|
+
});
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
catch {
|
|
950
|
+
// Skip a bad ref.
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
if (this.validationCanWrite('metaPlaybook') && this.metaLearner) {
|
|
954
|
+
try {
|
|
955
|
+
await this.metaLearner.generateReflection(trajectory, snap.routingInfo, playbookMatches);
|
|
956
|
+
}
|
|
957
|
+
catch {
|
|
958
|
+
// Non-fatal.
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
if (this.validationCanWrite('diagnosticOnly') && this.effectivenessTracker) {
|
|
962
|
+
try {
|
|
963
|
+
await this.effectivenessTracker.annotate(trajectory, playbookMatches, snap.surfacedExperienceIds ?? [], snap.appliedPlaybookIds ?? [], snap.surfacedKnowledgeNoteIds ?? []);
|
|
964
|
+
// Guided = anything was surfaced (same definition the annotation's
|
|
965
|
+
// totalItems uses: playbooks + experiences + knowledge notes).
|
|
966
|
+
this.recordLiftCell(trajectory, playbookMatches.length +
|
|
967
|
+
(snap.surfacedExperienceIds?.length ?? 0) +
|
|
968
|
+
(snap.surfacedKnowledgeNoteIds?.length ?? 0) >
|
|
969
|
+
0);
|
|
970
|
+
}
|
|
971
|
+
catch {
|
|
972
|
+
// Non-fatal.
|
|
973
|
+
}
|
|
974
|
+
}
|
|
398
975
|
}
|
|
399
976
|
/**
|
|
400
|
-
*
|
|
977
|
+
* Production lift rollup: fold one annotated trajectory into its
|
|
978
|
+
* per-(scope, family, solver) `lift_cells` row in the instance DB.
|
|
979
|
+
* scope='production' (never pooled with eval scopes), family=task.domain,
|
|
980
|
+
* solver canonicalized from trajectory metadata. Write-only and cheap —
|
|
981
|
+
* one upsert, dream-time only. Best-effort: never fails the dream.
|
|
401
982
|
*/
|
|
402
|
-
|
|
403
|
-
this.
|
|
983
|
+
recordLiftCell(trajectory, guided) {
|
|
984
|
+
if (!(this.config.features.liftTracking ?? true))
|
|
985
|
+
return;
|
|
986
|
+
if (!this.persistence)
|
|
987
|
+
return;
|
|
988
|
+
try {
|
|
989
|
+
const rawModel = trajectory.metadata?.model;
|
|
990
|
+
this.persistence.recordLiftOutcome({
|
|
991
|
+
scope: 'production',
|
|
992
|
+
family: trajectory.task.domain || 'unknown',
|
|
993
|
+
solver: canonicalizeSolver(typeof rawModel === 'string' ? rawModel : undefined),
|
|
994
|
+
guided,
|
|
995
|
+
success: trajectory.outcome.success,
|
|
996
|
+
});
|
|
997
|
+
}
|
|
998
|
+
catch {
|
|
999
|
+
// Non-fatal.
|
|
1000
|
+
}
|
|
404
1001
|
}
|
|
405
1002
|
/**
|
|
406
|
-
*
|
|
1003
|
+
* Effectiveness annotation for an external trajectory (no routing snapshot).
|
|
1004
|
+
*
|
|
1005
|
+
* Exposure is inferred rather than known: playbooks declared in trajectory
|
|
1006
|
+
* metadata (`SURFACED_PLAYBOOKS_METADATA_KEY`, the serving-layer contract)
|
|
1007
|
+
* or explicitly referenced in the steps count as surfaced; explicit
|
|
1008
|
+
* references count as applied; declared-only playbooks go through the same
|
|
1009
|
+
* tactic-level usage inference `solve()` uses. Trajectories with no detected
|
|
1010
|
+
* exposure are annotated unguided — they form the lift baseline.
|
|
1011
|
+
* Best-effort — never fails the dream.
|
|
407
1012
|
*/
|
|
408
|
-
|
|
409
|
-
this.
|
|
1013
|
+
async annotateExternalTrajectory(trajectory) {
|
|
1014
|
+
if (!this.validationCanWrite('diagnosticOnly') || !this.effectivenessTracker)
|
|
1015
|
+
return;
|
|
1016
|
+
try {
|
|
1017
|
+
const { detectExternalPlaybookExposure } = await import('./external-exposure.js');
|
|
1018
|
+
const exposure = detectExternalPlaybookExposure(trajectory, await this.memory.playbooks.getAll());
|
|
1019
|
+
const appliedIds = new Set(exposure.applied.map((p) => p.id));
|
|
1020
|
+
// Declared-but-not-referenced playbooks: fall back to tactic-level
|
|
1021
|
+
// usage inference to decide whether they were actually followed.
|
|
1022
|
+
const declaredOnly = exposure.surfaced.filter((p) => !appliedIds.has(p.id));
|
|
1023
|
+
if (declaredOnly.length > 0) {
|
|
1024
|
+
const { createUsageInference } = await import('./usage-inference.js');
|
|
1025
|
+
const usage = await createUsageInference().inferUsage(trajectory, declaredOnly);
|
|
1026
|
+
for (const u of usage) {
|
|
1027
|
+
if (u.wasUsed)
|
|
1028
|
+
appliedIds.add(u.playbookId);
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1031
|
+
const surfacedMatches = exposure.surfaced.map((playbook) => ({
|
|
1032
|
+
playbook,
|
|
1033
|
+
score: 1,
|
|
1034
|
+
matchType: 'situation',
|
|
1035
|
+
}));
|
|
1036
|
+
await this.effectivenessTracker.annotate(trajectory, surfacedMatches, [], [...appliedIds]);
|
|
1037
|
+
this.recordLiftCell(trajectory, exposure.surfaced.length > 0);
|
|
1038
|
+
}
|
|
1039
|
+
catch {
|
|
1040
|
+
// Non-fatal.
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
/**
|
|
1044
|
+
* Register a custom maintenance task.
|
|
1045
|
+
*/
|
|
1046
|
+
registerMaintenanceTask(task) {
|
|
1047
|
+
this.maintenanceScheduler.registerTask(task);
|
|
410
1048
|
}
|
|
411
1049
|
// =========================================================================
|
|
412
1050
|
// ACCESSORS
|
|
@@ -423,12 +1061,6 @@ export class UnifiedLearningPipeline {
|
|
|
423
1061
|
getEffectivenessTracker() {
|
|
424
1062
|
return this.effectivenessTracker;
|
|
425
1063
|
}
|
|
426
|
-
/**
|
|
427
|
-
* Get the energy evaluator.
|
|
428
|
-
*/
|
|
429
|
-
getEnergyEvaluator() {
|
|
430
|
-
return this.energyEvaluator;
|
|
431
|
-
}
|
|
432
1064
|
/**
|
|
433
1065
|
* Get the maintenance scheduler.
|
|
434
1066
|
*/
|
|
@@ -436,25 +1068,18 @@ export class UnifiedLearningPipeline {
|
|
|
436
1068
|
return this.maintenanceScheduler;
|
|
437
1069
|
}
|
|
438
1070
|
/**
|
|
439
|
-
* Get
|
|
440
|
-
|
|
441
|
-
getHealingOrchestrator() {
|
|
442
|
-
return this.healingOrchestrator;
|
|
443
|
-
}
|
|
444
|
-
/**
|
|
445
|
-
* Get accumulated trajectory count.
|
|
1071
|
+
* Get accumulated trajectory count. Always 0 — learning is decoupled, so
|
|
1072
|
+
* trajectories are durably enqueued for `dream()` rather than held in memory.
|
|
446
1073
|
*/
|
|
447
1074
|
getAccumulatedCount() {
|
|
448
|
-
return
|
|
1075
|
+
return 0;
|
|
449
1076
|
}
|
|
450
1077
|
/**
|
|
451
|
-
* Get accumulated trajectories with analyses (read-only).
|
|
1078
|
+
* Get accumulated trajectories with analyses (read-only). Always empty —
|
|
1079
|
+
* learning is decoupled (see {@link getAccumulatedCount}).
|
|
452
1080
|
*/
|
|
453
1081
|
getAccumulated() {
|
|
454
|
-
return
|
|
455
|
-
trajectory,
|
|
456
|
-
analysis: this.accumulatedAnalyses[i],
|
|
457
|
-
}));
|
|
1082
|
+
return [];
|
|
458
1083
|
}
|
|
459
1084
|
/**
|
|
460
1085
|
* Get pipeline statistics.
|
|
@@ -464,11 +1089,9 @@ export class UnifiedLearningPipeline {
|
|
|
464
1089
|
totalProcessed: this.totalProcessed,
|
|
465
1090
|
batchCyclesRun: this.batchCyclesRun,
|
|
466
1091
|
maintenanceCyclesRun: this.maintenanceCyclesRun,
|
|
467
|
-
pendingForBatch: this.energyEvaluator.getPendingCount(),
|
|
468
1092
|
batchesSinceLastMaintenance: this.maintenanceScheduler.getBatchesSinceLastMaintenance(),
|
|
469
|
-
maintenanceTasks: this.maintenanceScheduler.getRegisteredTasks().map(t => t.name),
|
|
470
|
-
|
|
471
|
-
repairStrategies: this.healingOrchestrator.getRepairStrategies().map(s => s.name),
|
|
1093
|
+
maintenanceTasks: this.maintenanceScheduler.getRegisteredTasks().map((t) => t.name),
|
|
1094
|
+
mutation: this.mutationActivity,
|
|
472
1095
|
};
|
|
473
1096
|
}
|
|
474
1097
|
/**
|
|
@@ -493,26 +1116,6 @@ export class UnifiedLearningPipeline {
|
|
|
493
1116
|
* Register built-in maintenance tasks.
|
|
494
1117
|
*/
|
|
495
1118
|
registerBuiltInMaintenanceTasks() {
|
|
496
|
-
// Healing cycle
|
|
497
|
-
this.maintenanceScheduler.registerTask({
|
|
498
|
-
name: 'healing-cycle',
|
|
499
|
-
priority: 100,
|
|
500
|
-
execute: async () => {
|
|
501
|
-
const start = Date.now();
|
|
502
|
-
const context = await this.buildHealthContext();
|
|
503
|
-
const result = await this.healingOrchestrator.runCycle(context);
|
|
504
|
-
return {
|
|
505
|
-
taskName: 'healing-cycle',
|
|
506
|
-
success: true,
|
|
507
|
-
durationMs: Date.now() - start,
|
|
508
|
-
details: {
|
|
509
|
-
anomaliesDetected: result.anomaliesDetected.length,
|
|
510
|
-
repairsAttempted: result.repairs.length,
|
|
511
|
-
repairsSucceeded: result.repairs.filter(r => r.success).length,
|
|
512
|
-
},
|
|
513
|
-
};
|
|
514
|
-
},
|
|
515
|
-
});
|
|
516
1119
|
// Knowledge defrag (if knowledge bank is available)
|
|
517
1120
|
if (this.memory.knowledgeBank) {
|
|
518
1121
|
this.maintenanceScheduler.registerTask({
|
|
@@ -520,6 +1123,14 @@ export class UnifiedLearningPipeline {
|
|
|
520
1123
|
priority: 80,
|
|
521
1124
|
execute: async () => {
|
|
522
1125
|
const start = Date.now();
|
|
1126
|
+
if (!this.validationCanWrite('knowledgeNote')) {
|
|
1127
|
+
return {
|
|
1128
|
+
taskName: 'knowledge-defrag',
|
|
1129
|
+
success: true,
|
|
1130
|
+
durationMs: Date.now() - start,
|
|
1131
|
+
details: { skipped: true, reason: 'validation write mask excludes knowledgeNote' },
|
|
1132
|
+
};
|
|
1133
|
+
}
|
|
523
1134
|
const kb = this.memory.knowledgeBank;
|
|
524
1135
|
const shouldDefrag = await kb.shouldDefragment();
|
|
525
1136
|
if (!shouldDefrag) {
|
|
@@ -547,6 +1158,14 @@ export class UnifiedLearningPipeline {
|
|
|
547
1158
|
priority: 60,
|
|
548
1159
|
execute: async () => {
|
|
549
1160
|
const start = Date.now();
|
|
1161
|
+
if (!this.validationCanWrite('metaPlaybook')) {
|
|
1162
|
+
return {
|
|
1163
|
+
taskName: 'meta-strategy-generation',
|
|
1164
|
+
success: true,
|
|
1165
|
+
durationMs: Date.now() - start,
|
|
1166
|
+
details: { skipped: true, reason: 'validation write mask excludes metaPlaybook' },
|
|
1167
|
+
};
|
|
1168
|
+
}
|
|
550
1169
|
if (!this.metaLearner) {
|
|
551
1170
|
return {
|
|
552
1171
|
taskName: 'meta-strategy-generation',
|
|
@@ -567,6 +1186,302 @@ export class UnifiedLearningPipeline {
|
|
|
567
1186
|
}
|
|
568
1187
|
// Efficacy maintenance tasks
|
|
569
1188
|
this.registerEfficacyMaintenanceTasks();
|
|
1189
|
+
// Pareto merge proposing
|
|
1190
|
+
this.registerMergeProposingTask();
|
|
1191
|
+
// Reflective single-parent mutation
|
|
1192
|
+
this.registerReflectiveMutationTask();
|
|
1193
|
+
// PR-D2: harmful-playbook prune pass
|
|
1194
|
+
this.registerCurationPruneTask();
|
|
1195
|
+
}
|
|
1196
|
+
/**
|
|
1197
|
+
* Register the curation prune maintenance task (PR-D2).
|
|
1198
|
+
*
|
|
1199
|
+
* Prunes playbooks where failureCount >= successCount + MIN_EVIDENCE so
|
|
1200
|
+
* net-harmful guidance is retired before it degrades future injection.
|
|
1201
|
+
* MIN_EVIDENCE (default 3) prevents premature pruning of zero/low-count
|
|
1202
|
+
* items. Gated on features.curation — setting it false disables the prune
|
|
1203
|
+
* entirely (append-only ablation).
|
|
1204
|
+
*/
|
|
1205
|
+
registerCurationPruneTask() {
|
|
1206
|
+
this.maintenanceScheduler.registerTask({
|
|
1207
|
+
name: 'curation-prune',
|
|
1208
|
+
priority: 50,
|
|
1209
|
+
execute: async () => {
|
|
1210
|
+
const start = Date.now();
|
|
1211
|
+
if (!this.validationCanWrite('playbook')) {
|
|
1212
|
+
return {
|
|
1213
|
+
taskName: 'curation-prune',
|
|
1214
|
+
success: true,
|
|
1215
|
+
durationMs: Date.now() - start,
|
|
1216
|
+
details: { skipped: true, reason: 'validation write mask excludes playbook' },
|
|
1217
|
+
};
|
|
1218
|
+
}
|
|
1219
|
+
if (!this.config.features?.curation) {
|
|
1220
|
+
return {
|
|
1221
|
+
taskName: 'curation-prune',
|
|
1222
|
+
success: true,
|
|
1223
|
+
durationMs: Date.now() - start,
|
|
1224
|
+
details: { skipped: true, reason: 'features.curation disabled' },
|
|
1225
|
+
};
|
|
1226
|
+
}
|
|
1227
|
+
const pruned = await this.memory.playbooks.pruneHarmful();
|
|
1228
|
+
return {
|
|
1229
|
+
taskName: 'curation-prune',
|
|
1230
|
+
success: true,
|
|
1231
|
+
durationMs: Date.now() - start,
|
|
1232
|
+
details: { pruned: pruned.length, prunedIds: pruned },
|
|
1233
|
+
};
|
|
1234
|
+
},
|
|
1235
|
+
});
|
|
1236
|
+
}
|
|
1237
|
+
/**
|
|
1238
|
+
* Register the merge-proposing maintenance task. Scans active task
|
|
1239
|
+
* signatures, asks the MergeProposer for candidate pairs (Pareto
|
|
1240
|
+
* dominators with a common ancestor), then gates each proposal via
|
|
1241
|
+
* MutationGate. Skips if the feature is disabled, no judge was
|
|
1242
|
+
* provided, or there's no persistence handle to enumerate signatures.
|
|
1243
|
+
*/
|
|
1244
|
+
registerMergeProposingTask() {
|
|
1245
|
+
this.maintenanceScheduler.registerTask({
|
|
1246
|
+
name: 'pareto-merge-proposing',
|
|
1247
|
+
priority: 50,
|
|
1248
|
+
execute: async () => {
|
|
1249
|
+
const start = Date.now();
|
|
1250
|
+
if (!(this.config.features.mergeProposing ?? false)) {
|
|
1251
|
+
return {
|
|
1252
|
+
taskName: 'pareto-merge-proposing',
|
|
1253
|
+
success: true,
|
|
1254
|
+
durationMs: Date.now() - start,
|
|
1255
|
+
details: { skipped: true, reason: 'feature disabled' },
|
|
1256
|
+
};
|
|
1257
|
+
}
|
|
1258
|
+
if (!this.validationCanWrite('playbook')) {
|
|
1259
|
+
return {
|
|
1260
|
+
taskName: 'pareto-merge-proposing',
|
|
1261
|
+
success: true,
|
|
1262
|
+
durationMs: Date.now() - start,
|
|
1263
|
+
details: { skipped: true, reason: 'validation write mask excludes playbook' },
|
|
1264
|
+
};
|
|
1265
|
+
}
|
|
1266
|
+
if (!this.persistence) {
|
|
1267
|
+
return {
|
|
1268
|
+
taskName: 'pareto-merge-proposing',
|
|
1269
|
+
success: true,
|
|
1270
|
+
durationMs: Date.now() - start,
|
|
1271
|
+
details: { skipped: true, reason: 'no persistence handle' },
|
|
1272
|
+
};
|
|
1273
|
+
}
|
|
1274
|
+
if (!this.judge) {
|
|
1275
|
+
return {
|
|
1276
|
+
taskName: 'pareto-merge-proposing',
|
|
1277
|
+
success: true,
|
|
1278
|
+
durationMs: Date.now() - start,
|
|
1279
|
+
details: { skipped: true, reason: 'no judge configured' },
|
|
1280
|
+
};
|
|
1281
|
+
}
|
|
1282
|
+
const proposer = new MergeProposer(this.memory.playbooks, this.persistence);
|
|
1283
|
+
const gate = new MutationGate(this.memory.playbooks, this.persistence, this.judge);
|
|
1284
|
+
// Bound judge/LLM spend per cycle, symmetric with reflective mutation.
|
|
1285
|
+
const maxProposalsPerCycle = 5;
|
|
1286
|
+
const signatures = this.persistence.getActiveSignatures(20);
|
|
1287
|
+
let proposalsConsidered = 0;
|
|
1288
|
+
let proposalsAccepted = 0;
|
|
1289
|
+
const acceptedIds = [];
|
|
1290
|
+
const reasonCounts = {};
|
|
1291
|
+
outer: for (const sig of signatures) {
|
|
1292
|
+
const proposals = await proposer.proposePairsForSignature(sig);
|
|
1293
|
+
for (const proposal of proposals) {
|
|
1294
|
+
if (proposalsConsidered >= maxProposalsPerCycle)
|
|
1295
|
+
break outer;
|
|
1296
|
+
proposalsConsidered++;
|
|
1297
|
+
try {
|
|
1298
|
+
const primaryBefore = await this.memory.playbooks.get(proposal.primaryParentId);
|
|
1299
|
+
// Use the two-parent merge gate: stratified minibatch across
|
|
1300
|
+
// (A-beats-B, B-beats-A, tied) buckets + acceptance on
|
|
1301
|
+
// child >= max(parents). Matches GEPA's engine.py:688.
|
|
1302
|
+
const decision = await gate.proposeFromMerge(proposal.primaryParentId, proposal.secondaryParentId, proposal.merged, sig);
|
|
1303
|
+
reasonCounts[decision.reason] = (reasonCounts[decision.reason] ?? 0) + 1;
|
|
1304
|
+
// Trace + journal the merge decision. The acceptance threshold is
|
|
1305
|
+
// max(parents), so record that as the parent sum for the delta.
|
|
1306
|
+
this.recordMutationDecision({
|
|
1307
|
+
mutationType: 'merge',
|
|
1308
|
+
taskSignature: sig,
|
|
1309
|
+
parentId: proposal.primaryParentId,
|
|
1310
|
+
secondaryParentId: proposal.secondaryParentId,
|
|
1311
|
+
candidate: proposal.merged,
|
|
1312
|
+
reason: decision.reason,
|
|
1313
|
+
accepted: decision.accepted,
|
|
1314
|
+
parentSum: Math.max(decision.parentASum, decision.parentBSum),
|
|
1315
|
+
childSum: decision.childSum,
|
|
1316
|
+
judgeCalls: decision.judgeCalls,
|
|
1317
|
+
guidanceBefore: compactGuidanceText(primaryBefore),
|
|
1318
|
+
});
|
|
1319
|
+
// Record only definitive outcomes so transient sparse-data
|
|
1320
|
+
// attempts get retried next cycle when more data exists.
|
|
1321
|
+
if (decision.reason === 'improved' || decision.reason === 'regression') {
|
|
1322
|
+
this.persistence.recordMergeAttempt(proposal.primaryParentId, proposal.secondaryParentId, proposal.commonAncestorId, decision.reason === 'improved' ? 'accepted' : 'regression');
|
|
1323
|
+
}
|
|
1324
|
+
if (decision.accepted) {
|
|
1325
|
+
proposalsAccepted++;
|
|
1326
|
+
acceptedIds.push(proposal.merged.id);
|
|
1327
|
+
}
|
|
1328
|
+
}
|
|
1329
|
+
catch {
|
|
1330
|
+
// Non-fatal — one bad proposal shouldn't kill the cycle.
|
|
1331
|
+
}
|
|
1332
|
+
}
|
|
1333
|
+
}
|
|
1334
|
+
return {
|
|
1335
|
+
taskName: 'pareto-merge-proposing',
|
|
1336
|
+
success: true,
|
|
1337
|
+
durationMs: Date.now() - start,
|
|
1338
|
+
details: {
|
|
1339
|
+
signaturesScanned: signatures.length,
|
|
1340
|
+
proposalsConsidered,
|
|
1341
|
+
proposalsAccepted,
|
|
1342
|
+
acceptedIds,
|
|
1343
|
+
reasonCounts,
|
|
1344
|
+
},
|
|
1345
|
+
};
|
|
1346
|
+
},
|
|
1347
|
+
});
|
|
1348
|
+
}
|
|
1349
|
+
/**
|
|
1350
|
+
* Register the reflective-mutation maintenance task. Scans active task
|
|
1351
|
+
* signatures, asks the ReflectiveMutationProposer to revise one
|
|
1352
|
+
* Pareto-frontier playbook per signature from its failure traces, then
|
|
1353
|
+
* gates each candidate via the single-parent MutationGate. Skips if the
|
|
1354
|
+
* feature is disabled, there's no persistence handle, no judge, or no
|
|
1355
|
+
* LLM provider.
|
|
1356
|
+
*
|
|
1357
|
+
* Mirrors `registerMergeProposingTask` — same scan/gate shape — but uses
|
|
1358
|
+
* the generative single-parent path (`MutationGate.propose`) instead of
|
|
1359
|
+
* the recombination path (`proposeFromMerge`). A per-cycle cap bounds LLM
|
|
1360
|
+
* spend regardless of how many signatures are active.
|
|
1361
|
+
*/
|
|
1362
|
+
registerReflectiveMutationTask() {
|
|
1363
|
+
this.maintenanceScheduler.registerTask({
|
|
1364
|
+
name: 'reflective-mutation',
|
|
1365
|
+
priority: 50,
|
|
1366
|
+
execute: async () => {
|
|
1367
|
+
const start = Date.now();
|
|
1368
|
+
if (!(this.config.features.reflectiveMutation ?? false)) {
|
|
1369
|
+
return {
|
|
1370
|
+
taskName: 'reflective-mutation',
|
|
1371
|
+
success: true,
|
|
1372
|
+
durationMs: Date.now() - start,
|
|
1373
|
+
details: { skipped: true, reason: 'feature disabled' },
|
|
1374
|
+
};
|
|
1375
|
+
}
|
|
1376
|
+
if (!this.validationCanWrite('playbook')) {
|
|
1377
|
+
return {
|
|
1378
|
+
taskName: 'reflective-mutation',
|
|
1379
|
+
success: true,
|
|
1380
|
+
durationMs: Date.now() - start,
|
|
1381
|
+
details: { skipped: true, reason: 'validation write mask excludes playbook' },
|
|
1382
|
+
};
|
|
1383
|
+
}
|
|
1384
|
+
if (!this.persistence) {
|
|
1385
|
+
return {
|
|
1386
|
+
taskName: 'reflective-mutation',
|
|
1387
|
+
success: true,
|
|
1388
|
+
durationMs: Date.now() - start,
|
|
1389
|
+
details: { skipped: true, reason: 'no persistence handle' },
|
|
1390
|
+
};
|
|
1391
|
+
}
|
|
1392
|
+
if (!this.judge) {
|
|
1393
|
+
return {
|
|
1394
|
+
taskName: 'reflective-mutation',
|
|
1395
|
+
success: true,
|
|
1396
|
+
durationMs: Date.now() - start,
|
|
1397
|
+
details: { skipped: true, reason: 'no judge configured' },
|
|
1398
|
+
};
|
|
1399
|
+
}
|
|
1400
|
+
if (!this.llm) {
|
|
1401
|
+
return {
|
|
1402
|
+
taskName: 'reflective-mutation',
|
|
1403
|
+
success: true,
|
|
1404
|
+
durationMs: Date.now() - start,
|
|
1405
|
+
details: { skipped: true, reason: 'no llm provider configured' },
|
|
1406
|
+
};
|
|
1407
|
+
}
|
|
1408
|
+
const proposer = new ReflectiveMutationProposer(this.memory.playbooks, this.persistence, this.llm);
|
|
1409
|
+
const gate = new MutationGate(this.memory.playbooks, this.persistence, this.judge);
|
|
1410
|
+
// Bound LLM spend per cycle: one proposal per signature, capped.
|
|
1411
|
+
const maxProposalsPerCycle = 5;
|
|
1412
|
+
const signatures = this.persistence.getActiveSignatures(20);
|
|
1413
|
+
// Don't reflect the same parent on more than one signature this
|
|
1414
|
+
// cycle — a parent failing across signatures would otherwise spawn
|
|
1415
|
+
// several near-duplicate children at once.
|
|
1416
|
+
const proposedParents = new Set();
|
|
1417
|
+
let proposalsConsidered = 0;
|
|
1418
|
+
let proposalsAccepted = 0;
|
|
1419
|
+
const acceptedIds = [];
|
|
1420
|
+
const reasonCounts = {};
|
|
1421
|
+
for (const sig of signatures) {
|
|
1422
|
+
if (proposalsConsidered >= maxProposalsPerCycle)
|
|
1423
|
+
break;
|
|
1424
|
+
try {
|
|
1425
|
+
const proposal = await proposer.propose(sig, {
|
|
1426
|
+
excludeParents: proposedParents,
|
|
1427
|
+
});
|
|
1428
|
+
if (!proposal)
|
|
1429
|
+
continue;
|
|
1430
|
+
proposalsConsidered++;
|
|
1431
|
+
proposedParents.add(proposal.parentId);
|
|
1432
|
+
// Capture the parent's guidance BEFORE the gate commits/mutates so
|
|
1433
|
+
// the trace/journal record a faithful before→after diff.
|
|
1434
|
+
const parentBefore = await this.memory.playbooks.get(proposal.parentId);
|
|
1435
|
+
const decision = await gate.propose(proposal.parentId, proposal.candidate, sig);
|
|
1436
|
+
reasonCounts[decision.reason] = (reasonCounts[decision.reason] ?? 0) + 1;
|
|
1437
|
+
// Observability + statefulness: trace every considered proposal and
|
|
1438
|
+
// journal its learning content (candidate direction, reason, score
|
|
1439
|
+
// delta, rationale) for the proposer to reflect on next cycle.
|
|
1440
|
+
this.recordMutationDecision({
|
|
1441
|
+
mutationType: 'reflective',
|
|
1442
|
+
taskSignature: sig,
|
|
1443
|
+
parentId: proposal.parentId,
|
|
1444
|
+
candidate: proposal.candidate,
|
|
1445
|
+
rationale: proposal.rationale,
|
|
1446
|
+
reason: decision.reason,
|
|
1447
|
+
accepted: decision.accepted,
|
|
1448
|
+
parentSum: decision.parentSum,
|
|
1449
|
+
childSum: decision.childSum,
|
|
1450
|
+
judgeCalls: decision.judgeCalls,
|
|
1451
|
+
guidanceBefore: compactGuidanceText(parentBefore),
|
|
1452
|
+
});
|
|
1453
|
+
// Record any committed acceptance (incl. sparse/empty-minibatch
|
|
1454
|
+
// accepts) and definitive regressions, so the proposer doesn't
|
|
1455
|
+
// re-reflect the same parent on the same failures every cycle.
|
|
1456
|
+
// Non-definitive rejections (empty-minibatch policy reject,
|
|
1457
|
+
// no-mutation, parent-missing) are NOT recorded so they retry
|
|
1458
|
+
// once more data exists.
|
|
1459
|
+
if (decision.accepted || decision.reason === 'regression') {
|
|
1460
|
+
this.persistence.recordReflectionAttempt(proposal.parentId, proposal.failureFingerprint, decision.accepted ? 'accepted' : 'regression');
|
|
1461
|
+
}
|
|
1462
|
+
if (decision.accepted) {
|
|
1463
|
+
proposalsAccepted++;
|
|
1464
|
+
acceptedIds.push(proposal.candidate.id);
|
|
1465
|
+
}
|
|
1466
|
+
}
|
|
1467
|
+
catch {
|
|
1468
|
+
// Non-fatal — one bad proposal shouldn't kill the cycle.
|
|
1469
|
+
}
|
|
1470
|
+
}
|
|
1471
|
+
return {
|
|
1472
|
+
taskName: 'reflective-mutation',
|
|
1473
|
+
success: true,
|
|
1474
|
+
durationMs: Date.now() - start,
|
|
1475
|
+
details: {
|
|
1476
|
+
signaturesScanned: signatures.length,
|
|
1477
|
+
proposalsConsidered,
|
|
1478
|
+
proposalsAccepted,
|
|
1479
|
+
acceptedIds,
|
|
1480
|
+
reasonCounts,
|
|
1481
|
+
},
|
|
1482
|
+
};
|
|
1483
|
+
},
|
|
1484
|
+
});
|
|
570
1485
|
}
|
|
571
1486
|
/**
|
|
572
1487
|
* Register efficacy maintenance tasks (decay detection, audit, lifecycle review).
|
|
@@ -584,7 +1499,8 @@ export class UnifiedLearningPipeline {
|
|
|
584
1499
|
const start = Date.now();
|
|
585
1500
|
this.lastDecayResult = null;
|
|
586
1501
|
const { annotations, playbooks, playbookEffectiveness, unguidedSuccessRate } = await this.getEfficacyData();
|
|
587
|
-
if (playbooks.length < efficacyCfg.minPlaybooks ||
|
|
1502
|
+
if (playbooks.length < efficacyCfg.minPlaybooks ||
|
|
1503
|
+
annotations.length < efficacyCfg.minAnnotations) {
|
|
588
1504
|
return {
|
|
589
1505
|
taskName: 'playbook-decay-detection',
|
|
590
1506
|
success: true,
|
|
@@ -628,10 +1544,7 @@ export class UnifiedLearningPipeline {
|
|
|
628
1544
|
details: { skipped: true, reason: 'no decay detection results' },
|
|
629
1545
|
};
|
|
630
1546
|
}
|
|
631
|
-
const flagged = [
|
|
632
|
-
...this.lastDecayResult.decaying,
|
|
633
|
-
...this.lastDecayResult.atRisk,
|
|
634
|
-
];
|
|
1547
|
+
const flagged = [...this.lastDecayResult.decaying, ...this.lastDecayResult.atRisk];
|
|
635
1548
|
if (flagged.length === 0) {
|
|
636
1549
|
return {
|
|
637
1550
|
taskName: 'playbook-efficacy-audit',
|
|
@@ -641,8 +1554,8 @@ export class UnifiedLearningPipeline {
|
|
|
641
1554
|
};
|
|
642
1555
|
}
|
|
643
1556
|
const { annotations, playbooks, playbookEffectiveness, unguidedSuccessRate } = await this.getEfficacyData();
|
|
644
|
-
const playbookMap = new Map(playbooks.map(p => [p.id, p]));
|
|
645
|
-
const effectivenessMap = new Map(playbookEffectiveness.map(e => [e.playbookId, e]));
|
|
1557
|
+
const playbookMap = new Map(playbooks.map((p) => [p.id, p]));
|
|
1558
|
+
const effectivenessMap = new Map(playbookEffectiveness.map((e) => [e.playbookId, e]));
|
|
646
1559
|
const trajectoryDomainMap = this.buildTrajectoryDomainMap(annotations);
|
|
647
1560
|
const audits = [];
|
|
648
1561
|
for (const signal of flagged) {
|
|
@@ -693,7 +1606,8 @@ export class UnifiedLearningPipeline {
|
|
|
693
1606
|
};
|
|
694
1607
|
}
|
|
695
1608
|
const { annotations, playbooks, playbookEffectiveness, unguidedSuccessRate } = await this.getEfficacyData();
|
|
696
|
-
if (playbooks.length < efficacyCfg.minPlaybooks ||
|
|
1609
|
+
if (playbooks.length < efficacyCfg.minPlaybooks ||
|
|
1610
|
+
annotations.length < efficacyCfg.minAnnotations) {
|
|
697
1611
|
return {
|
|
698
1612
|
taskName: 'playbook-lifecycle-review',
|
|
699
1613
|
success: true,
|
|
@@ -749,41 +1663,13 @@ export class UnifiedLearningPipeline {
|
|
|
749
1663
|
}
|
|
750
1664
|
/**
|
|
751
1665
|
* Build a trajectoryId→domain map from annotations.
|
|
752
|
-
*
|
|
1666
|
+
*
|
|
1667
|
+
* Learning is decoupled, so there are no in-memory trajectories to map from
|
|
1668
|
+
* here. Annotations don't carry domain, so trajectories fall through to the
|
|
1669
|
+
* toolkit's 'unknown' default — acceptable for log-only mode.
|
|
753
1670
|
*/
|
|
754
1671
|
buildTrajectoryDomainMap(_annotations) {
|
|
755
|
-
|
|
756
|
-
// Map from accumulated trajectories (has task.domain directly).
|
|
757
|
-
// Annotations don't carry domain, so historical trajectories will
|
|
758
|
-
// fall through to the toolkit's 'unknown' default — acceptable for log-only mode.
|
|
759
|
-
for (const t of this.accumulated) {
|
|
760
|
-
domainMap.set(t.id, t.task.domain);
|
|
761
|
-
}
|
|
762
|
-
return domainMap;
|
|
763
|
-
}
|
|
764
|
-
/**
|
|
765
|
-
* Build health context for the healing orchestrator.
|
|
766
|
-
*/
|
|
767
|
-
async buildHealthContext() {
|
|
768
|
-
const [experienceCount, playbookCount] = await Promise.all([
|
|
769
|
-
this.memory.experiences.count(),
|
|
770
|
-
this.memory.playbooks.count(),
|
|
771
|
-
]);
|
|
772
|
-
// Compute recent success rate from accumulated analyses
|
|
773
|
-
const recentAnalyses = this.accumulatedAnalyses.length > 0
|
|
774
|
-
? this.accumulatedAnalyses
|
|
775
|
-
: [];
|
|
776
|
-
const recentSuccessRate = recentAnalyses.length > 0
|
|
777
|
-
? recentAnalyses.filter(a => a.success).length / recentAnalyses.length
|
|
778
|
-
: 1.0;
|
|
779
|
-
return {
|
|
780
|
-
trajectoriesProcessed: this.totalProcessed,
|
|
781
|
-
experienceCount,
|
|
782
|
-
playbookCount,
|
|
783
|
-
recentSuccessRate,
|
|
784
|
-
batchesSinceLastMaintenance: this.maintenanceScheduler.getBatchesSinceLastMaintenance(),
|
|
785
|
-
metrics: {},
|
|
786
|
-
};
|
|
1672
|
+
return new Map();
|
|
787
1673
|
}
|
|
788
1674
|
/**
|
|
789
1675
|
* Analyze a trajectory via workspace template or heuristic fallback.
|
|
@@ -800,24 +1686,338 @@ export class UnifiedLearningPipeline {
|
|
|
800
1686
|
return this.analyzer.analyze(trajectory);
|
|
801
1687
|
}
|
|
802
1688
|
}
|
|
1689
|
+
/**
|
|
1690
|
+
* Seed the Pareto frontier with rows attributing the source trajectories'
|
|
1691
|
+
* successful outcomes to the newly minted playbook. Walks
|
|
1692
|
+
* `playbook.evolution.createdFrom` (trajectory ids), looks up the
|
|
1693
|
+
* corresponding experience and trajectory, and writes a frontier row
|
|
1694
|
+
* (and live eval cache entry) per attested win.
|
|
1695
|
+
*
|
|
1696
|
+
* Without this, a freshly-extracted playbook starts with zero frontier
|
|
1697
|
+
* presence and only earns rows once the router happens to match it on
|
|
1698
|
+
* a live task — which can take weeks of solves before the frontier
|
|
1699
|
+
* starts being useful.
|
|
1700
|
+
*/
|
|
1701
|
+
/**
|
|
1702
|
+
* G3(b): apply stored reflexion `suggestedPlaybookUpdates` to a playbook's
|
|
1703
|
+
* `applicability.antiPatterns`, durably (cross-run). Walks the playbook's
|
|
1704
|
+
* source trajectories (`evolution.createdFrom`), reads each one's reflexion
|
|
1705
|
+
* episode, and lifts avoid/anti-pattern-style suggestions onto the record.
|
|
1706
|
+
*
|
|
1707
|
+
* G1 already feeds the same suggestions into the per-attempt *retry prompt*
|
|
1708
|
+
* (ephemeral); this is the persist-to-playbook side and does not duplicate
|
|
1709
|
+
* that path. Mutates `playbook` in place; the caller persists it.
|
|
1710
|
+
*/
|
|
1711
|
+
async applyReflexionAntiPatterns(playbook) {
|
|
1712
|
+
const trajectoryIds = playbook.evolution.createdFrom ?? [];
|
|
1713
|
+
if (trajectoryIds.length === 0)
|
|
1714
|
+
return;
|
|
1715
|
+
for (const trajId of trajectoryIds) {
|
|
1716
|
+
let episode;
|
|
1717
|
+
try {
|
|
1718
|
+
episode = await this.memory.reflexion.getByTrajectory(trajId);
|
|
1719
|
+
}
|
|
1720
|
+
catch {
|
|
1721
|
+
continue; // Reflexion lookup is best-effort.
|
|
1722
|
+
}
|
|
1723
|
+
if (!episode)
|
|
1724
|
+
continue;
|
|
1725
|
+
for (const suggestion of episode.suggestedPlaybookUpdates) {
|
|
1726
|
+
const antiPattern = reflexionSuggestionToAntiPattern(suggestion);
|
|
1727
|
+
if (antiPattern && !playbook.applicability.antiPatterns.includes(antiPattern)) {
|
|
1728
|
+
playbook.applicability.antiPatterns.push(antiPattern);
|
|
1729
|
+
}
|
|
1730
|
+
}
|
|
1731
|
+
}
|
|
1732
|
+
}
|
|
1733
|
+
async seedFrontierForNewPlaybook(playbook, batchTrajectories) {
|
|
1734
|
+
if (!this.validationCanWrite('frontier'))
|
|
1735
|
+
return;
|
|
1736
|
+
const trajectoryIds = playbook.evolution.createdFrom ?? [];
|
|
1737
|
+
if (trajectoryIds.length === 0)
|
|
1738
|
+
return;
|
|
1739
|
+
const trajById = new Map(batchTrajectories.map((t) => [t.id, t]));
|
|
1740
|
+
for (const trajId of trajectoryIds) {
|
|
1741
|
+
const traj = trajById.get(trajId);
|
|
1742
|
+
if (!traj)
|
|
1743
|
+
continue; // Trajectory not in current batch — skip.
|
|
1744
|
+
const experiences = this.persistence?.getExperiencesByTrajectory(trajId);
|
|
1745
|
+
if (!experiences || experiences.length === 0)
|
|
1746
|
+
continue;
|
|
1747
|
+
const sig = taskSignature(traj.task);
|
|
1748
|
+
const score = traj.outcome.success
|
|
1749
|
+
? Math.max(traj.outcome.partialScore, 1.0)
|
|
1750
|
+
: traj.outcome.partialScore;
|
|
1751
|
+
// Derive multi-objective scores the same way the instant loop does
|
|
1752
|
+
// (cost from totalTokens, latency from wallTimeSeconds, etc.) so the
|
|
1753
|
+
// cartesian frontier is populated alongside the single-objective one.
|
|
1754
|
+
// Otherwise `prefer: 'cheap' | 'fast'` routing treats freshly-extracted
|
|
1755
|
+
// playbooks as invisible until live traffic accumulates.
|
|
1756
|
+
const objectives = deriveObjectives(traj);
|
|
1757
|
+
for (const expRow of experiences) {
|
|
1758
|
+
try {
|
|
1759
|
+
await this.memory.playbooks.recordLiveOutcome(playbook.id, sig, expRow.id, score, objectives);
|
|
1760
|
+
}
|
|
1761
|
+
catch {
|
|
1762
|
+
// Non-fatal — playbook is still added, just lacks the seed row.
|
|
1763
|
+
}
|
|
1764
|
+
}
|
|
1765
|
+
}
|
|
1766
|
+
}
|
|
803
1767
|
/**
|
|
804
1768
|
* Extract playbooks via workspace template or heuristic fallback.
|
|
805
1769
|
*/
|
|
806
|
-
async extractPlaybooks(existingPlaybooks) {
|
|
1770
|
+
async extractPlaybooks(existingPlaybooks, trajectories, analyses) {
|
|
1771
|
+
const startTime = Date.now();
|
|
1772
|
+
// Routing domain(s) of this batch's trajectories — stamped onto every
|
|
1773
|
+
// extracted playbook so it is retrievable by the key future same-domain
|
|
1774
|
+
// tasks route with (see stampExtractionProvenance).
|
|
1775
|
+
const sourceDomains = [...new Set(trajectories.map((t) => t.task.domain).filter(Boolean))];
|
|
1776
|
+
const attemptedMethods = [];
|
|
1777
|
+
let workspaceFallbackReason;
|
|
1778
|
+
let workspaceDiag;
|
|
807
1779
|
if (this.taskRunner) {
|
|
808
1780
|
try {
|
|
1781
|
+
attemptedMethods.push('workspace-agent');
|
|
809
1782
|
const result = await this.taskRunner.run(playbookExtractionTemplate, {
|
|
810
|
-
trajectories
|
|
811
|
-
analyses
|
|
1783
|
+
trajectories,
|
|
1784
|
+
analyses,
|
|
1785
|
+
existingPlaybooks,
|
|
1786
|
+
});
|
|
1787
|
+
const output = this.stampExtractionProvenance(result.output, result.method === 'agentic' ? 'workspace-agent' : 'heuristic', {
|
|
1788
|
+
fallbackReason: result.method === 'heuristic'
|
|
1789
|
+
? 'template complexity assessed as heuristic'
|
|
1790
|
+
: undefined,
|
|
1791
|
+
template: playbookExtractionTemplate.taskType,
|
|
1792
|
+
templateVersion: playbookExtractionTemplate.templateVersion,
|
|
1793
|
+
sourceDomains,
|
|
1794
|
+
});
|
|
1795
|
+
this.recordPlaybookExtractionDiagnostics({
|
|
1796
|
+
trajectories,
|
|
1797
|
+
analyses,
|
|
1798
|
+
existingPlaybooks,
|
|
1799
|
+
attemptedMethods,
|
|
1800
|
+
selectedMethod: result.method === 'agentic' ? 'workspace-agent' : 'heuristic',
|
|
1801
|
+
extracted: output,
|
|
1802
|
+
durationMs: Date.now() - startTime,
|
|
1803
|
+
fallbackReason: result.method === 'heuristic' ? 'template complexity assessed as heuristic' : undefined,
|
|
1804
|
+
workspace: {
|
|
1805
|
+
id: result.workspaceId,
|
|
1806
|
+
path: result.workspacePath,
|
|
1807
|
+
complexity: result.complexity,
|
|
1808
|
+
},
|
|
1809
|
+
agent: {
|
|
1810
|
+
trajectoryId: result.agentTrajectoryId,
|
|
1811
|
+
totalTimeMs: result.metrics.totalTimeMs,
|
|
1812
|
+
tokensUsed: result.metrics.tokensUsed,
|
|
1813
|
+
toolCalls: result.metrics.toolCalls,
|
|
1814
|
+
},
|
|
1815
|
+
injectedMetaPlaybookIds: result.injectedMetaPlaybookIds,
|
|
1816
|
+
});
|
|
1817
|
+
return output;
|
|
1818
|
+
}
|
|
1819
|
+
catch (error) {
|
|
1820
|
+
if (error instanceof AgenticTaskRunError) {
|
|
1821
|
+
workspaceDiag = {
|
|
1822
|
+
id: error.workspaceId,
|
|
1823
|
+
path: error.workspacePath,
|
|
1824
|
+
complexity: error.complexity,
|
|
1825
|
+
elapsedMs: error.elapsedMs,
|
|
1826
|
+
error: error.cause.message,
|
|
1827
|
+
};
|
|
1828
|
+
}
|
|
1829
|
+
else if (error instanceof AgenticTaskOutputError) {
|
|
1830
|
+
workspaceDiag = {
|
|
1831
|
+
id: error.workspaceId,
|
|
1832
|
+
path: error.workspacePath,
|
|
1833
|
+
complexity: error.complexity,
|
|
1834
|
+
elapsedMs: error.elapsedMs,
|
|
1835
|
+
error: error.cause.message,
|
|
1836
|
+
agentState: error.agentState,
|
|
1837
|
+
agentResultPreview: error.agentResultPreview,
|
|
1838
|
+
agentMessageCount: error.agentMessageCount,
|
|
1839
|
+
};
|
|
1840
|
+
}
|
|
1841
|
+
workspaceFallbackReason = `workspace-agent failed: ${error instanceof Error ? error.message : String(error)}`;
|
|
1842
|
+
// Fall through to distiller or heuristic
|
|
1843
|
+
}
|
|
1844
|
+
}
|
|
1845
|
+
// PR-D1: LLM distillation path — when patternExtractor==='llm' and a
|
|
1846
|
+
// TrajectoryDistiller is wired, distill each trajectory individually and
|
|
1847
|
+
// return the results as new playbooks. Failures distill to anti-pattern-only
|
|
1848
|
+
// items. The heuristic PlaybookExtractor is the no-LLM fallback below.
|
|
1849
|
+
//
|
|
1850
|
+
// Design note: this runs in the batch/dream phase, never the <200ms hot
|
|
1851
|
+
// path. Cache in distillation_cache keyed by trajectory hash + prompt
|
|
1852
|
+
// version makes re-runs LLM-free.
|
|
1853
|
+
//
|
|
1854
|
+
// PR-D2 hook: near-dup check (embedding cosine > τ → merge instead of
|
|
1855
|
+
// append) will be added here before the return, replacing the simple
|
|
1856
|
+
// "add if not exists" check in runBatchOver. For now we return new items
|
|
1857
|
+
// as-is and let the existing deduplicationThreshold check in runBatchOver
|
|
1858
|
+
// handle coarse dedup by name similarity.
|
|
1859
|
+
const wantsDistiller = this.learningConfig.patternExtractor === 'llm' ||
|
|
1860
|
+
this.learningConfig.patternExtractor === 'both';
|
|
1861
|
+
if (wantsDistiller && this.distiller) {
|
|
1862
|
+
attemptedMethods.push('trajectory-distiller');
|
|
1863
|
+
const result = { new: [], updates: [] };
|
|
1864
|
+
for (let i = 0; i < trajectories.length; i++) {
|
|
1865
|
+
const traj = trajectories[i];
|
|
1866
|
+
try {
|
|
1867
|
+
// Thread the train-time oracle signal (verifier expected/diff/score)
|
|
1868
|
+
// so the distiller captures the output CONTRACT, not just process.
|
|
1869
|
+
// Legitimately available at dream time; never reaches the solver.
|
|
1870
|
+
// See docs/DESIGN-meta-learning-validation.md § "Train-time oracle
|
|
1871
|
+
// signal vs solve-time firewall".
|
|
1872
|
+
const verifierOutput = oracleVerifierText(readOracleSignal(traj.outcome.verificationDetails));
|
|
1873
|
+
const playbook = await this.distiller.distill(traj, traj.outcome, verifierOutput);
|
|
1874
|
+
if (playbook) {
|
|
1875
|
+
result.new.push(playbook);
|
|
1876
|
+
}
|
|
1877
|
+
}
|
|
1878
|
+
catch {
|
|
1879
|
+
// Non-fatal: skip this trajectory, heuristic fallback at the
|
|
1880
|
+
// trajectory level is omitted by design (distiller returns null on
|
|
1881
|
+
// failure; we just skip).
|
|
1882
|
+
}
|
|
1883
|
+
}
|
|
1884
|
+
// Return distilled results if we got any; otherwise fall through to
|
|
1885
|
+
// heuristic so a total LLM failure doesn't silently produce zero output.
|
|
1886
|
+
if (result.new.length > 0) {
|
|
1887
|
+
// eslint-disable-next-line no-console
|
|
1888
|
+
logger.error(`[distiller] distilled ${result.new.length}/${trajectories.length} trajectories into playbooks`);
|
|
1889
|
+
const output = this.stampExtractionProvenance(result, 'trajectory-distiller', {
|
|
1890
|
+
sourceDomains,
|
|
1891
|
+
});
|
|
1892
|
+
this.recordPlaybookExtractionDiagnostics({
|
|
1893
|
+
trajectories,
|
|
1894
|
+
analyses,
|
|
812
1895
|
existingPlaybooks,
|
|
1896
|
+
attemptedMethods,
|
|
1897
|
+
selectedMethod: 'trajectory-distiller',
|
|
1898
|
+
extracted: output,
|
|
1899
|
+
durationMs: Date.now() - startTime,
|
|
1900
|
+
fallbackReason: workspaceFallbackReason,
|
|
1901
|
+
workspace: workspaceDiag,
|
|
813
1902
|
});
|
|
814
|
-
return
|
|
1903
|
+
return output;
|
|
815
1904
|
}
|
|
816
|
-
|
|
817
|
-
|
|
1905
|
+
// eslint-disable-next-line no-console
|
|
1906
|
+
logger.error(`[distiller] produced 0 playbooks from ${trajectories.length} trajectories (self-check/parse rejects or LLM unavailable) — falling back to heuristic`);
|
|
1907
|
+
}
|
|
1908
|
+
// G2 / heuristic fallback: warn when LLM was requested but unavailable or
|
|
1909
|
+
// produced no output, then run the low-fidelity heuristic extractor.
|
|
1910
|
+
if (!this.taskRunner) {
|
|
1911
|
+
// Only warn when an LLM-backed path was explicitly requested but not
|
|
1912
|
+
// available — either no distiller (no LLM provider wired) or the
|
|
1913
|
+
// distiller produced nothing.
|
|
1914
|
+
this.warnHeuristicFallback();
|
|
1915
|
+
}
|
|
1916
|
+
attemptedMethods.push('heuristic');
|
|
1917
|
+
const output = this.stampExtractionProvenance(await this.playbookExtractor.extract(trajectories, analyses, existingPlaybooks), 'heuristic', {
|
|
1918
|
+
fallbackReason: workspaceFallbackReason,
|
|
1919
|
+
sourceDomains,
|
|
1920
|
+
});
|
|
1921
|
+
this.recordPlaybookExtractionDiagnostics({
|
|
1922
|
+
trajectories,
|
|
1923
|
+
analyses,
|
|
1924
|
+
existingPlaybooks,
|
|
1925
|
+
attemptedMethods,
|
|
1926
|
+
selectedMethod: 'heuristic',
|
|
1927
|
+
extracted: output,
|
|
1928
|
+
durationMs: Date.now() - startTime,
|
|
1929
|
+
fallbackReason: workspaceFallbackReason,
|
|
1930
|
+
workspace: workspaceDiag,
|
|
1931
|
+
});
|
|
1932
|
+
return output;
|
|
1933
|
+
}
|
|
1934
|
+
recordPlaybookExtractionDiagnostics(input) {
|
|
1935
|
+
this.lastPlaybookExtractionDiagnostics = {
|
|
1936
|
+
event: 'playbook-extraction',
|
|
1937
|
+
injectedMetaPlaybookIds: input.injectedMetaPlaybookIds ?? [],
|
|
1938
|
+
tier0: computeExtractionTier0(input.extracted.new, input.trajectories.length),
|
|
1939
|
+
batchSize: input.trajectories.length,
|
|
1940
|
+
existingPlaybookCount: input.existingPlaybooks.length,
|
|
1941
|
+
trajectoryIds: input.trajectories.map((t) => t.id),
|
|
1942
|
+
taskIds: input.trajectories.map((t) => t.task.id),
|
|
1943
|
+
domains: [...new Set(input.trajectories.map((t) => t.task.domain))],
|
|
1944
|
+
abstractableCount: input.analyses.filter((a) => a.abstractable).length,
|
|
1945
|
+
attemptedMethods: input.attemptedMethods,
|
|
1946
|
+
selectedMethod: input.selectedMethod,
|
|
1947
|
+
durationMs: input.durationMs,
|
|
1948
|
+
newCount: input.extracted.new.length,
|
|
1949
|
+
updateCount: input.extracted.updates.length,
|
|
1950
|
+
newPlaybooks: input.extracted.new.map((playbook) => ({
|
|
1951
|
+
id: playbook.id,
|
|
1952
|
+
name: playbook.name,
|
|
1953
|
+
extractionMethod: playbook.provenance?.extractionMethod,
|
|
1954
|
+
confidence: playbook.confidence,
|
|
1955
|
+
triggers: playbook.applicability.triggers,
|
|
1956
|
+
domains: playbook.applicability.domains,
|
|
1957
|
+
})),
|
|
1958
|
+
fallbackReason: input.fallbackReason,
|
|
1959
|
+
workspace: input.workspace,
|
|
1960
|
+
agent: input.agent,
|
|
1961
|
+
};
|
|
1962
|
+
}
|
|
1963
|
+
emitDiagnostics(event) {
|
|
1964
|
+
try {
|
|
1965
|
+
this.diagnosticsCollector?.(event);
|
|
1966
|
+
}
|
|
1967
|
+
catch {
|
|
1968
|
+
// diagnostics must never break learning
|
|
1969
|
+
}
|
|
1970
|
+
}
|
|
1971
|
+
stampExtractionProvenance(extracted, method, options = {}) {
|
|
1972
|
+
for (const playbook of extracted.new) {
|
|
1973
|
+
playbook.provenance = {
|
|
1974
|
+
...(playbook.provenance ?? { origin: 'extracted', recordedAt: new Date() }),
|
|
1975
|
+
origin: playbook.provenance?.origin ?? 'extracted',
|
|
1976
|
+
recordedAt: playbook.provenance?.recordedAt ?? new Date(),
|
|
1977
|
+
extractionMethod: method,
|
|
1978
|
+
fallbackReason: options.fallbackReason,
|
|
1979
|
+
template: options.template,
|
|
1980
|
+
templateVersion: options.templateVersion,
|
|
1981
|
+
};
|
|
1982
|
+
if (options.sourceDomains && options.sourceDomains.length > 0) {
|
|
1983
|
+
// PREPEND so the source routing domain becomes domains[0], which is what
|
|
1984
|
+
// persistence stores as `primary_domain` and `getPlaybooksByDomain` matches
|
|
1985
|
+
// on (sqlite-persistence.ts:791). Appending would leave the agent's invented
|
|
1986
|
+
// domain (e.g. "office-automation") as primary, so the playbook stays
|
|
1987
|
+
// unretrievable for its own family's tasks (e.g. domain "Office Operation").
|
|
1988
|
+
playbook.applicability.domains = [
|
|
1989
|
+
...new Set([...options.sourceDomains, ...playbook.applicability.domains]),
|
|
1990
|
+
];
|
|
818
1991
|
}
|
|
819
1992
|
}
|
|
820
|
-
return
|
|
1993
|
+
return extracted;
|
|
1994
|
+
}
|
|
1995
|
+
/**
|
|
1996
|
+
* G2: warn (or throw, under `strictExtraction`) when an LLM-backed
|
|
1997
|
+
* extraction/credit path was requested but no agent backend is wired, so
|
|
1998
|
+
* the silent heuristic fallback is no longer silent. Autonomous,
|
|
1999
|
+
* high-fidelity extraction requires a backend (call `Atlas.setAgentManager`).
|
|
2000
|
+
* Headless ingest still functions on the heuristic path when not strict.
|
|
2001
|
+
*/
|
|
2002
|
+
warnHeuristicFallback() {
|
|
2003
|
+
// Only relevant when an LLM-backed path was actually requested.
|
|
2004
|
+
const wantsLlm = this.learningConfig.patternExtractor === 'llm' ||
|
|
2005
|
+
this.learningConfig.patternExtractor === 'both' ||
|
|
2006
|
+
this.learningConfig.creditStrategy === 'llm';
|
|
2007
|
+
if (!wantsLlm)
|
|
2008
|
+
return;
|
|
2009
|
+
const msg = `[unified-pipeline] patternExtractor='${this.learningConfig.patternExtractor}'` +
|
|
2010
|
+
` (creditStrategy='${this.learningConfig.creditStrategy}') but no agent backend wired` +
|
|
2011
|
+
` (call Atlas.setAgentManager); using heuristic extractor — autonomous playbooks` +
|
|
2012
|
+
` will be low-fidelity.`;
|
|
2013
|
+
if (this.learningConfig.strictExtraction) {
|
|
2014
|
+
throw new Error(msg + ' [strictExtraction is ON]');
|
|
2015
|
+
}
|
|
2016
|
+
// Loud, but once-per-run.
|
|
2017
|
+
if (!this.warnedHeuristicFallback) {
|
|
2018
|
+
this.warnedHeuristicFallback = true;
|
|
2019
|
+
logger.warn(msg);
|
|
2020
|
+
}
|
|
821
2021
|
}
|
|
822
2022
|
/**
|
|
823
2023
|
* Empty batch result for when there's nothing to process.
|
|
@@ -835,10 +2035,79 @@ export class UnifiedLearningPipeline {
|
|
|
835
2035
|
};
|
|
836
2036
|
}
|
|
837
2037
|
}
|
|
2038
|
+
/**
|
|
2039
|
+
* G3(b): convert a reflexion `suggestedPlaybookUpdates` entry into a playbook
|
|
2040
|
+
* anti-pattern, conservatively. Only suggestions phrased as avoid/don't/never
|
|
2041
|
+
* rules become anti-patterns (a generic "improve X" suggestion is not an
|
|
2042
|
+
* anti-pattern and is left for other channels). Returns undefined when the
|
|
2043
|
+
* suggestion is not avoid-shaped, so no spurious anti-patterns are emitted.
|
|
2044
|
+
*/
|
|
2045
|
+
function reflexionSuggestionToAntiPattern(suggestion) {
|
|
2046
|
+
const trimmed = suggestion.trim();
|
|
2047
|
+
if (!trimmed)
|
|
2048
|
+
return undefined;
|
|
2049
|
+
// Match avoid-shaped guidance anywhere in the suggestion.
|
|
2050
|
+
const isAvoidShaped = /\b(avoid|don'?t|do not|never|stop|refrain from|should not|shouldn'?t)\b/i.test(trimmed);
|
|
2051
|
+
if (!isAvoidShaped)
|
|
2052
|
+
return undefined;
|
|
2053
|
+
// Already prefixed with an avoid verb — keep as-is; otherwise normalize.
|
|
2054
|
+
return /^(avoid|don'?t|do not|never)\b/i.test(trimmed) ? trimmed : `Avoid: ${trimmed}`;
|
|
2055
|
+
}
|
|
2056
|
+
/**
|
|
2057
|
+
* Deserialize a trajectory from a dream_queue row's JSON. `TrajectorySchema`
|
|
2058
|
+
* uses `z.date()` (no string coercion), so the top-level `timestamp` — turned
|
|
2059
|
+
* into an ISO string by JSON.stringify — is revived to a Date. The dream's
|
|
2060
|
+
* consumers (analyzer, extractors, frontier seeding) read fields/strings, not
|
|
2061
|
+
* nested dates, so a structural cast is sufficient. Returns undefined on a
|
|
2062
|
+
* parse failure so the dream can skip a corrupt row rather than abort.
|
|
2063
|
+
*/
|
|
2064
|
+
function parseQueuedTrajectory(json) {
|
|
2065
|
+
try {
|
|
2066
|
+
const obj = JSON.parse(json);
|
|
2067
|
+
if (typeof obj.timestamp === 'string') {
|
|
2068
|
+
obj.timestamp = new Date(obj.timestamp);
|
|
2069
|
+
}
|
|
2070
|
+
return obj;
|
|
2071
|
+
}
|
|
2072
|
+
catch {
|
|
2073
|
+
return undefined;
|
|
2074
|
+
}
|
|
2075
|
+
}
|
|
2076
|
+
/**
|
|
2077
|
+
* Combine the per-internal-batch results of a dream into one summary. Counts
|
|
2078
|
+
* sum; `experiencesClustered` takes the last (it reflects the final store
|
|
2079
|
+
* size); `successRate` is trajectory-weighted across batches.
|
|
2080
|
+
*/
|
|
2081
|
+
function aggregateBatchResults(batches) {
|
|
2082
|
+
const agg = {
|
|
2083
|
+
trajectoriesProcessed: 0,
|
|
2084
|
+
playbooksExtracted: 0,
|
|
2085
|
+
experiencesPruned: 0,
|
|
2086
|
+
experiencesCompressed: { promoted: 0, demoted: 0, evicted: 0 },
|
|
2087
|
+
experiencesClustered: 0,
|
|
2088
|
+
knowledgeExtracted: 0,
|
|
2089
|
+
successRate: 0,
|
|
2090
|
+
triggerReasons: ['manual_override'],
|
|
2091
|
+
};
|
|
2092
|
+
let weightedSuccess = 0;
|
|
2093
|
+
for (const b of batches) {
|
|
2094
|
+
agg.trajectoriesProcessed += b.trajectoriesProcessed;
|
|
2095
|
+
agg.playbooksExtracted += b.playbooksExtracted;
|
|
2096
|
+
agg.experiencesPruned += b.experiencesPruned;
|
|
2097
|
+
agg.experiencesCompressed.promoted += b.experiencesCompressed.promoted;
|
|
2098
|
+
agg.experiencesCompressed.demoted += b.experiencesCompressed.demoted;
|
|
2099
|
+
agg.experiencesCompressed.evicted += b.experiencesCompressed.evicted;
|
|
2100
|
+
agg.experiencesClustered = b.experiencesClustered;
|
|
2101
|
+
agg.knowledgeExtracted += b.knowledgeExtracted;
|
|
2102
|
+
weightedSuccess += b.successRate * b.trajectoriesProcessed;
|
|
2103
|
+
}
|
|
2104
|
+
agg.successRate = agg.trajectoriesProcessed > 0 ? weightedSuccess / agg.trajectoriesProcessed : 0;
|
|
2105
|
+
return agg;
|
|
2106
|
+
}
|
|
838
2107
|
/**
|
|
839
2108
|
* Create a UnifiedLearningPipeline.
|
|
840
2109
|
*/
|
|
841
|
-
export function createUnifiedPipeline(memory, config, persistence) {
|
|
842
|
-
return new UnifiedLearningPipeline(memory, config, persistence);
|
|
2110
|
+
export function createUnifiedPipeline(memory, config, persistence, judge, llm) {
|
|
2111
|
+
return new UnifiedLearningPipeline(memory, config, persistence, judge, llm);
|
|
843
2112
|
}
|
|
844
2113
|
//# sourceMappingURL=unified-pipeline.js.map
|