cognitive-core 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.json +88 -0
- package/.claude/settings.local.json +11 -0
- package/.entire/settings.json +4 -0
- package/README.md +524 -254
- package/dist/atlas.d.ts +144 -6
- package/dist/atlas.d.ts.map +1 -1
- package/dist/atlas.js +339 -10
- package/dist/atlas.js.map +1 -1
- package/dist/embeddings/provider.d.ts.map +1 -1
- package/dist/embeddings/provider.js +6 -3
- package/dist/embeddings/provider.js.map +1 -1
- package/dist/index.d.ts +8 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -6
- package/dist/index.js.map +1 -1
- package/dist/learning/index.d.ts +5 -1
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +8 -2
- package/dist/learning/index.js.map +1 -1
- package/dist/learning/knowledge-extractor.d.ts +56 -0
- package/dist/learning/knowledge-extractor.d.ts.map +1 -0
- package/dist/learning/knowledge-extractor.js +336 -0
- package/dist/learning/knowledge-extractor.js.map +1 -0
- package/dist/learning/meta-learner.d.ts +7 -0
- package/dist/learning/meta-learner.d.ts.map +1 -1
- package/dist/learning/meta-learner.js +43 -0
- package/dist/learning/meta-learner.js.map +1 -1
- package/dist/learning/pipeline.d.ts +24 -0
- package/dist/learning/pipeline.d.ts.map +1 -1
- package/dist/learning/pipeline.js +70 -4
- package/dist/learning/pipeline.js.map +1 -1
- package/dist/learning/team-ingester.d.ts +152 -0
- package/dist/learning/team-ingester.d.ts.map +1 -0
- package/dist/learning/team-ingester.js +333 -0
- package/dist/learning/team-ingester.js.map +1 -0
- package/dist/learning/team-meta-learner.d.ts +50 -0
- package/dist/learning/team-meta-learner.d.ts.map +1 -0
- package/dist/learning/team-meta-learner.js +417 -0
- package/dist/learning/team-meta-learner.js.map +1 -0
- package/dist/learning/team-pipeline.d.ts +76 -0
- package/dist/learning/team-pipeline.d.ts.map +1 -0
- package/dist/learning/team-pipeline.js +266 -0
- package/dist/learning/team-pipeline.js.map +1 -0
- package/dist/learning/trajectory-sources/dataclaw.d.ts +41 -0
- package/dist/learning/trajectory-sources/dataclaw.d.ts.map +1 -0
- package/dist/learning/trajectory-sources/dataclaw.js +330 -0
- package/dist/learning/trajectory-sources/dataclaw.js.map +1 -0
- package/dist/learning/trajectory-sources/entire.d.ts +28 -0
- package/dist/learning/trajectory-sources/entire.d.ts.map +1 -0
- package/dist/learning/trajectory-sources/entire.js +182 -0
- package/dist/learning/trajectory-sources/entire.js.map +1 -0
- package/dist/learning/trajectory-sources/file.d.ts +23 -0
- package/dist/learning/trajectory-sources/file.d.ts.map +1 -0
- package/dist/learning/trajectory-sources/file.js +101 -0
- package/dist/learning/trajectory-sources/file.js.map +1 -0
- package/dist/learning/trajectory-sources/huggingface.d.ts +36 -0
- package/dist/learning/trajectory-sources/huggingface.d.ts.map +1 -0
- package/dist/learning/trajectory-sources/huggingface.js +157 -0
- package/dist/learning/trajectory-sources/huggingface.js.map +1 -0
- package/dist/learning/trajectory-sources/in-memory.d.ts +21 -0
- package/dist/learning/trajectory-sources/in-memory.d.ts.map +1 -0
- package/dist/learning/trajectory-sources/in-memory.js +43 -0
- package/dist/learning/trajectory-sources/in-memory.js.map +1 -0
- package/dist/learning/trajectory-sources/index.d.ts +7 -0
- package/dist/learning/trajectory-sources/index.d.ts.map +1 -0
- package/dist/learning/trajectory-sources/index.js +7 -0
- package/dist/learning/trajectory-sources/index.js.map +1 -0
- package/dist/learning/trajectory-sources/pipeline.d.ts +24 -0
- package/dist/learning/trajectory-sources/pipeline.d.ts.map +1 -0
- package/dist/learning/trajectory-sources/pipeline.js +47 -0
- package/dist/learning/trajectory-sources/pipeline.js.map +1 -0
- package/dist/memory/graph-layers/base.d.ts +29 -0
- package/dist/memory/graph-layers/base.d.ts.map +1 -0
- package/dist/memory/graph-layers/base.js +143 -0
- package/dist/memory/graph-layers/base.js.map +1 -0
- package/dist/memory/graph-layers/causal.d.ts +14 -0
- package/dist/memory/graph-layers/causal.d.ts.map +1 -0
- package/dist/memory/graph-layers/causal.js +14 -0
- package/dist/memory/graph-layers/causal.js.map +1 -0
- package/dist/memory/graph-layers/entity.d.ts +14 -0
- package/dist/memory/graph-layers/entity.d.ts.map +1 -0
- package/dist/memory/graph-layers/entity.js +14 -0
- package/dist/memory/graph-layers/entity.js.map +1 -0
- package/dist/memory/graph-layers/index.d.ts +6 -0
- package/dist/memory/graph-layers/index.d.ts.map +1 -0
- package/dist/memory/graph-layers/index.js +6 -0
- package/dist/memory/graph-layers/index.js.map +1 -0
- package/dist/memory/graph-layers/semantic.d.ts +14 -0
- package/dist/memory/graph-layers/semantic.d.ts.map +1 -0
- package/dist/memory/graph-layers/semantic.js +14 -0
- package/dist/memory/graph-layers/semantic.js.map +1 -0
- package/dist/memory/graph-layers/temporal.d.ts +14 -0
- package/dist/memory/graph-layers/temporal.d.ts.map +1 -0
- package/dist/memory/graph-layers/temporal.js +14 -0
- package/dist/memory/graph-layers/temporal.js.map +1 -0
- package/dist/memory/index.d.ts +8 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +10 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/knowledge-bank.d.ts +220 -0
- package/dist/memory/knowledge-bank.d.ts.map +1 -0
- package/dist/memory/knowledge-bank.js +1003 -0
- package/dist/memory/knowledge-bank.js.map +1 -0
- package/dist/memory/knowledge-defrag.d.ts +49 -0
- package/dist/memory/knowledge-defrag.d.ts.map +1 -0
- package/dist/memory/knowledge-defrag.js +257 -0
- package/dist/memory/knowledge-defrag.js.map +1 -0
- package/dist/memory/knowledge-graph.d.ts +41 -0
- package/dist/memory/knowledge-graph.d.ts.map +1 -0
- package/dist/memory/knowledge-graph.js +273 -0
- package/dist/memory/knowledge-graph.js.map +1 -0
- package/dist/memory/search-provider.d.ts +31 -0
- package/dist/memory/search-provider.d.ts.map +1 -0
- package/dist/memory/search-provider.js +2 -0
- package/dist/memory/search-provider.js.map +1 -0
- package/dist/memory/search-providers/index.d.ts +3 -0
- package/dist/memory/search-providers/index.d.ts.map +1 -0
- package/dist/memory/search-providers/index.js +3 -0
- package/dist/memory/search-providers/index.js.map +1 -0
- package/dist/memory/search-providers/minimem.d.ts +43 -0
- package/dist/memory/search-providers/minimem.d.ts.map +1 -0
- package/dist/memory/search-providers/minimem.js +56 -0
- package/dist/memory/search-providers/minimem.js.map +1 -0
- package/dist/memory/search-providers/text-similarity.d.ts +15 -0
- package/dist/memory/search-providers/text-similarity.d.ts.map +1 -0
- package/dist/memory/search-providers/text-similarity.js +21 -0
- package/dist/memory/search-providers/text-similarity.js.map +1 -0
- package/dist/memory/skill-exporter.d.ts +75 -0
- package/dist/memory/skill-exporter.d.ts.map +1 -0
- package/dist/memory/skill-exporter.js +248 -0
- package/dist/memory/skill-exporter.js.map +1 -0
- package/dist/memory/system.d.ts +15 -3
- package/dist/memory/system.d.ts.map +1 -1
- package/dist/memory/system.js +46 -8
- package/dist/memory/system.js.map +1 -1
- package/dist/memory/team-experience.d.ts +298 -0
- package/dist/memory/team-experience.d.ts.map +1 -0
- package/dist/memory/team-experience.js +355 -0
- package/dist/memory/team-experience.js.map +1 -0
- package/dist/runtime/backends/acp-protocol.d.ts +49 -0
- package/dist/runtime/backends/acp-protocol.d.ts.map +1 -0
- package/dist/runtime/backends/acp-protocol.js +166 -0
- package/dist/runtime/backends/acp-protocol.js.map +1 -0
- package/dist/runtime/backends/acp.d.ts +26 -26
- package/dist/runtime/backends/acp.d.ts.map +1 -1
- package/dist/runtime/backends/acp.js +32 -156
- package/dist/runtime/backends/acp.js.map +1 -1
- package/dist/runtime/backends/index.d.ts +3 -1
- package/dist/runtime/backends/index.d.ts.map +1 -1
- package/dist/runtime/backends/index.js +3 -1
- package/dist/runtime/backends/index.js.map +1 -1
- package/dist/runtime/backends/macro-agent.d.ts +104 -0
- package/dist/runtime/backends/macro-agent.d.ts.map +1 -0
- package/dist/runtime/backends/macro-agent.js +107 -0
- package/dist/runtime/backends/macro-agent.js.map +1 -0
- package/dist/runtime/compute-provider.d.ts +87 -0
- package/dist/runtime/compute-provider.d.ts.map +1 -0
- package/dist/runtime/compute-provider.js +87 -0
- package/dist/runtime/compute-provider.js.map +1 -0
- package/dist/runtime/index.d.ts +3 -2
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +3 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/manager.d.ts +37 -4
- package/dist/runtime/manager.d.ts.map +1 -1
- package/dist/runtime/manager.js +139 -20
- package/dist/runtime/manager.js.map +1 -1
- package/dist/runtime/types.d.ts +38 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/search/evaluator.d.ts +7 -0
- package/dist/search/evaluator.d.ts.map +1 -1
- package/dist/search/evaluator.js +24 -4
- package/dist/search/evaluator.js.map +1 -1
- package/dist/search/index.d.ts +1 -0
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +2 -0
- package/dist/search/index.js.map +1 -1
- package/dist/search/refinement-loop.d.ts +17 -0
- package/dist/search/refinement-loop.d.ts.map +1 -1
- package/dist/search/refinement-loop.js +77 -6
- package/dist/search/refinement-loop.js.map +1 -1
- package/dist/search/refinement-types.d.ts +2 -2
- package/dist/search/team-router.d.ts +91 -0
- package/dist/search/team-router.d.ts.map +1 -0
- package/dist/search/team-router.js +315 -0
- package/dist/search/team-router.js.map +1 -0
- package/dist/session-bank/git-reader.d.ts +39 -0
- package/dist/session-bank/git-reader.d.ts.map +1 -0
- package/dist/session-bank/git-reader.js +165 -0
- package/dist/session-bank/git-reader.js.map +1 -0
- package/dist/session-bank/index.d.ts +5 -0
- package/dist/session-bank/index.d.ts.map +1 -0
- package/dist/session-bank/index.js +4 -0
- package/dist/session-bank/index.js.map +1 -0
- package/dist/session-bank/parser.d.ts +39 -0
- package/dist/session-bank/parser.d.ts.map +1 -0
- package/dist/session-bank/parser.js +231 -0
- package/dist/session-bank/parser.js.map +1 -0
- package/dist/session-bank/session-bank.d.ts +35 -0
- package/dist/session-bank/session-bank.d.ts.map +1 -0
- package/dist/session-bank/session-bank.js +326 -0
- package/dist/session-bank/session-bank.js.map +1 -0
- package/dist/session-bank/types.d.ts +129 -0
- package/dist/session-bank/types.d.ts.map +1 -0
- package/dist/session-bank/types.js +7 -0
- package/dist/session-bank/types.js.map +1 -0
- package/dist/surfacing/index.d.ts +4 -0
- package/dist/surfacing/index.d.ts.map +1 -1
- package/dist/surfacing/index.js +3 -0
- package/dist/surfacing/index.js.map +1 -1
- package/dist/surfacing/publisher.d.ts +22 -0
- package/dist/surfacing/publisher.d.ts.map +1 -0
- package/dist/surfacing/publisher.js +9 -0
- package/dist/surfacing/publisher.js.map +1 -0
- package/dist/surfacing/skill-library.d.ts +12 -0
- package/dist/surfacing/skill-library.d.ts.map +1 -1
- package/dist/surfacing/skill-library.js +26 -0
- package/dist/surfacing/skill-library.js.map +1 -1
- package/dist/surfacing/skill-publisher.d.ts +43 -0
- package/dist/surfacing/skill-publisher.d.ts.map +1 -0
- package/dist/surfacing/skill-publisher.js +197 -0
- package/dist/surfacing/skill-publisher.js.map +1 -0
- package/dist/surfacing/sqlite-storage-adapter.d.ts +42 -0
- package/dist/surfacing/sqlite-storage-adapter.d.ts.map +1 -0
- package/dist/surfacing/sqlite-storage-adapter.js +207 -0
- package/dist/surfacing/sqlite-storage-adapter.js.map +1 -0
- package/dist/surfacing/team-skill-library.d.ts +180 -0
- package/dist/surfacing/team-skill-library.d.ts.map +1 -0
- package/dist/surfacing/team-skill-library.js +384 -0
- package/dist/surfacing/team-skill-library.js.map +1 -0
- package/dist/types/config.d.ts +1218 -44
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +216 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/dataclaw.d.ts +286 -0
- package/dist/types/dataclaw.d.ts.map +1 -0
- package/dist/types/dataclaw.js +84 -0
- package/dist/types/dataclaw.js.map +1 -0
- package/dist/types/index.d.ts +8 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +13 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/knowledge-graph.d.ts +148 -0
- package/dist/types/knowledge-graph.d.ts.map +1 -0
- package/dist/types/knowledge-graph.js +40 -0
- package/dist/types/knowledge-graph.js.map +1 -0
- package/dist/types/knowledge.d.ts +280 -0
- package/dist/types/knowledge.d.ts.map +1 -0
- package/dist/types/knowledge.js +191 -0
- package/dist/types/knowledge.js.map +1 -0
- package/dist/types/team-meta.d.ts +160 -0
- package/dist/types/team-meta.d.ts.map +1 -0
- package/dist/types/team-meta.js +42 -0
- package/dist/types/team-meta.js.map +1 -0
- package/dist/types/team-playbook.d.ts +276 -0
- package/dist/types/team-playbook.d.ts.map +1 -0
- package/dist/types/team-playbook.js +85 -0
- package/dist/types/team-playbook.js.map +1 -0
- package/dist/types/team-trajectory.d.ts +305 -0
- package/dist/types/team-trajectory.d.ts.map +1 -0
- package/dist/types/team-trajectory.js +304 -0
- package/dist/types/team-trajectory.js.map +1 -0
- package/dist/types/trajectory-source.d.ts +39 -0
- package/dist/types/trajectory-source.d.ts.map +1 -0
- package/dist/types/trajectory-source.js +2 -0
- package/dist/types/trajectory-source.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +34 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +93 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/workspace/index.d.ts +6 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +11 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/runner.d.ts +50 -0
- package/dist/workspace/runner.d.ts.map +1 -0
- package/dist/workspace/runner.js +219 -0
- package/dist/workspace/runner.js.map +1 -0
- package/dist/workspace/skill-converter.d.ts +18 -0
- package/dist/workspace/skill-converter.d.ts.map +1 -0
- package/dist/workspace/skill-converter.js +257 -0
- package/dist/workspace/skill-converter.js.map +1 -0
- package/dist/workspace/templates/index.d.ts +11 -0
- package/dist/workspace/templates/index.d.ts.map +1 -0
- package/dist/workspace/templates/index.js +21 -0
- package/dist/workspace/templates/index.js.map +1 -0
- package/dist/workspace/templates/knowledge-defrag.d.ts +25 -0
- package/dist/workspace/templates/knowledge-defrag.d.ts.map +1 -0
- package/dist/workspace/templates/knowledge-defrag.js +154 -0
- package/dist/workspace/templates/knowledge-defrag.js.map +1 -0
- package/dist/workspace/templates/knowledge-extraction.d.ts +25 -0
- package/dist/workspace/templates/knowledge-extraction.d.ts.map +1 -0
- package/dist/workspace/templates/knowledge-extraction.js +246 -0
- package/dist/workspace/templates/knowledge-extraction.js.map +1 -0
- package/dist/workspace/templates/meta-reflection.d.ts +47 -0
- package/dist/workspace/templates/meta-reflection.d.ts.map +1 -0
- package/dist/workspace/templates/meta-reflection.js +135 -0
- package/dist/workspace/templates/meta-reflection.js.map +1 -0
- package/dist/workspace/templates/playbook-extraction.d.ts +20 -0
- package/dist/workspace/templates/playbook-extraction.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-extraction.js +189 -0
- package/dist/workspace/templates/playbook-extraction.js.map +1 -0
- package/dist/workspace/templates/refinement-analysis.d.ts +31 -0
- package/dist/workspace/templates/refinement-analysis.d.ts.map +1 -0
- package/dist/workspace/templates/refinement-analysis.js +107 -0
- package/dist/workspace/templates/refinement-analysis.js.map +1 -0
- package/dist/workspace/templates/solution-evaluation.d.ts +21 -0
- package/dist/workspace/templates/solution-evaluation.d.ts.map +1 -0
- package/dist/workspace/templates/solution-evaluation.js +131 -0
- package/dist/workspace/templates/solution-evaluation.js.map +1 -0
- package/dist/workspace/templates/team-playbook-extraction.d.ts +44 -0
- package/dist/workspace/templates/team-playbook-extraction.d.ts.map +1 -0
- package/dist/workspace/templates/team-playbook-extraction.js +497 -0
- package/dist/workspace/templates/team-playbook-extraction.js.map +1 -0
- package/dist/workspace/templates/team-trajectory-analysis.d.ts +19 -0
- package/dist/workspace/templates/team-trajectory-analysis.d.ts.map +1 -0
- package/dist/workspace/templates/team-trajectory-analysis.js +442 -0
- package/dist/workspace/templates/team-trajectory-analysis.js.map +1 -0
- package/dist/workspace/templates/trajectory-analysis.d.ts +19 -0
- package/dist/workspace/templates/trajectory-analysis.d.ts.map +1 -0
- package/dist/workspace/templates/trajectory-analysis.js +170 -0
- package/dist/workspace/templates/trajectory-analysis.js.map +1 -0
- package/dist/workspace/templates/usage-inference.d.ts +19 -0
- package/dist/workspace/templates/usage-inference.d.ts.map +1 -0
- package/dist/workspace/templates/usage-inference.js +125 -0
- package/dist/workspace/templates/usage-inference.js.map +1 -0
- package/dist/workspace/types.d.ts +145 -0
- package/dist/workspace/types.d.ts.map +1 -0
- package/dist/workspace/types.js +17 -0
- package/dist/workspace/types.js.map +1 -0
- package/docs/DESIGN-agentic-workspace.md +2057 -0
- package/docs/DESIGN-semantic-memory-knowledge-bank.md +1789 -0
- package/docs/DESIGN-session-bank.md +1134 -0
- package/docs/DESIGN-team-extraction-pipeline.md +1369 -0
- package/docs/DESIGN-workspace-migration.md +1079 -0
- package/docs/PLAN-agentic-workspace-implementation.md +717 -0
- package/docs/PLAN-graph-migration.md +299 -0
- package/docs/PLAN-session-bank-implementation.md +474 -0
- package/docs/PROPOSAL-team-aware-learning.md +1080 -0
- package/docs/RESEARCH-semantic-memory-knowledge-structures.md +517 -0
- package/docs/RESEARCH-team-trajectory-learning.md +553 -0
- package/gaps.md +204 -0
- package/package.json +24 -6
- package/references/agent-workspace/CLAUDE.md +74 -0
- package/references/agent-workspace/README.md +587 -0
- package/references/agent-workspace/media/banner.png +0 -0
- package/references/agent-workspace/package-lock.json +2061 -0
- package/references/agent-workspace/package.json +54 -0
- package/references/agent-workspace/src/handle.ts +122 -0
- package/references/agent-workspace/src/index.ts +32 -0
- package/references/agent-workspace/src/manager.ts +102 -0
- package/references/agent-workspace/src/readers/json.ts +71 -0
- package/references/agent-workspace/src/readers/markdown.ts +37 -0
- package/references/agent-workspace/src/readers/raw.ts +27 -0
- package/references/agent-workspace/src/types.ts +68 -0
- package/references/agent-workspace/src/validation.ts +93 -0
- package/references/agent-workspace/src/writers/json.ts +17 -0
- package/references/agent-workspace/src/writers/markdown.ts +27 -0
- package/references/agent-workspace/src/writers/raw.ts +22 -0
- package/references/agent-workspace/tests/errors.test.ts +652 -0
- package/references/agent-workspace/tests/handle.test.ts +144 -0
- package/references/agent-workspace/tests/manager.test.ts +124 -0
- package/references/agent-workspace/tests/readers.test.ts +205 -0
- package/references/agent-workspace/tests/validation.test.ts +196 -0
- package/references/agent-workspace/tests/writers.test.ts +108 -0
- package/references/agent-workspace/tsconfig.json +20 -0
- package/references/agent-workspace/tsup.config.ts +9 -0
- package/references/minimem/.claude/settings.json +7 -0
- package/references/minimem/.sudocode/issues.jsonl +18 -0
- package/references/minimem/.sudocode/specs.jsonl +1 -0
- package/references/minimem/CLAUDE.md +310 -0
- package/references/minimem/README.md +556 -0
- package/references/minimem/claude-plugin/.claude-plugin/plugin.json +10 -0
- package/references/minimem/claude-plugin/.mcp.json +7 -0
- package/references/minimem/claude-plugin/README.md +158 -0
- package/references/minimem/claude-plugin/commands/recall.md +47 -0
- package/references/minimem/claude-plugin/commands/remember.md +41 -0
- package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +272 -0
- package/references/minimem/claude-plugin/hooks/hooks.json +27 -0
- package/references/minimem/claude-plugin/hooks/session-end.sh +86 -0
- package/references/minimem/claude-plugin/hooks/session-start.sh +85 -0
- package/references/minimem/claude-plugin/skills/memory/SKILL.md +108 -0
- package/references/minimem/package-lock.json +5373 -0
- package/references/minimem/package.json +60 -0
- package/references/minimem/scripts/postbuild.js +35 -0
- package/references/minimem/src/__tests__/edge-cases.test.ts +371 -0
- package/references/minimem/src/__tests__/errors.test.ts +265 -0
- package/references/minimem/src/__tests__/helpers.ts +199 -0
- package/references/minimem/src/__tests__/internal.test.ts +407 -0
- package/references/minimem/src/__tests__/knowledge.test.ts +287 -0
- package/references/minimem/src/__tests__/minimem.integration.test.ts +1127 -0
- package/references/minimem/src/__tests__/session.test.ts +190 -0
- package/references/minimem/src/cli/__tests__/commands.test.ts +759 -0
- package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +141 -0
- package/references/minimem/src/cli/commands/append.ts +76 -0
- package/references/minimem/src/cli/commands/config.ts +262 -0
- package/references/minimem/src/cli/commands/conflicts.ts +413 -0
- package/references/minimem/src/cli/commands/daemon.ts +169 -0
- package/references/minimem/src/cli/commands/index.ts +12 -0
- package/references/minimem/src/cli/commands/init.ts +88 -0
- package/references/minimem/src/cli/commands/mcp.ts +177 -0
- package/references/minimem/src/cli/commands/push-pull.ts +213 -0
- package/references/minimem/src/cli/commands/search.ts +158 -0
- package/references/minimem/src/cli/commands/status.ts +84 -0
- package/references/minimem/src/cli/commands/sync-init.ts +290 -0
- package/references/minimem/src/cli/commands/sync.ts +70 -0
- package/references/minimem/src/cli/commands/upsert.ts +197 -0
- package/references/minimem/src/cli/config.ts +584 -0
- package/references/minimem/src/cli/index.ts +264 -0
- package/references/minimem/src/cli/shared.ts +161 -0
- package/references/minimem/src/cli/sync/__tests__/central.test.ts +152 -0
- package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +209 -0
- package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +118 -0
- package/references/minimem/src/cli/sync/__tests__/detection.test.ts +207 -0
- package/references/minimem/src/cli/sync/__tests__/integration.test.ts +476 -0
- package/references/minimem/src/cli/sync/__tests__/registry.test.ts +363 -0
- package/references/minimem/src/cli/sync/__tests__/state.test.ts +255 -0
- package/references/minimem/src/cli/sync/__tests__/validation.test.ts +193 -0
- package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +178 -0
- package/references/minimem/src/cli/sync/central.ts +292 -0
- package/references/minimem/src/cli/sync/conflicts.ts +204 -0
- package/references/minimem/src/cli/sync/daemon.ts +407 -0
- package/references/minimem/src/cli/sync/detection.ts +138 -0
- package/references/minimem/src/cli/sync/index.ts +107 -0
- package/references/minimem/src/cli/sync/operations.ts +373 -0
- package/references/minimem/src/cli/sync/registry.ts +279 -0
- package/references/minimem/src/cli/sync/state.ts +355 -0
- package/references/minimem/src/cli/sync/validation.ts +206 -0
- package/references/minimem/src/cli/sync/watcher.ts +234 -0
- package/references/minimem/src/cli/version.ts +34 -0
- package/references/minimem/src/core/index.ts +9 -0
- package/references/minimem/src/core/indexer.ts +628 -0
- package/references/minimem/src/core/searcher.ts +221 -0
- package/references/minimem/src/db/schema.ts +183 -0
- package/references/minimem/src/db/sqlite-vec.ts +24 -0
- package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +431 -0
- package/references/minimem/src/embeddings/batch-gemini.ts +392 -0
- package/references/minimem/src/embeddings/batch-openai.ts +409 -0
- package/references/minimem/src/embeddings/embeddings.ts +434 -0
- package/references/minimem/src/index.ts +109 -0
- package/references/minimem/src/internal.ts +299 -0
- package/references/minimem/src/minimem.ts +1276 -0
- package/references/minimem/src/search/__tests__/hybrid.test.ts +247 -0
- package/references/minimem/src/search/graph.ts +234 -0
- package/references/minimem/src/search/hybrid.ts +151 -0
- package/references/minimem/src/search/search.ts +256 -0
- package/references/minimem/src/server/__tests__/mcp.test.ts +341 -0
- package/references/minimem/src/server/__tests__/tools.test.ts +364 -0
- package/references/minimem/src/server/mcp.ts +326 -0
- package/references/minimem/src/server/tools.ts +720 -0
- package/references/minimem/src/session.ts +460 -0
- package/references/minimem/tsconfig.json +19 -0
- package/references/minimem/tsup.config.ts +26 -0
- package/references/minimem/vitest.config.ts +24 -0
- package/references/skill-tree/.claude/settings.json +6 -0
- package/references/skill-tree/.sudocode/issues.jsonl +11 -0
- package/references/skill-tree/.sudocode/specs.jsonl +1 -0
- package/references/skill-tree/CLAUDE.md +150 -0
- package/references/skill-tree/README.md +324 -0
- package/references/skill-tree/docs/GAPS_v1.md +221 -0
- package/references/skill-tree/docs/INTEGRATION_PLAN.md +467 -0
- package/references/skill-tree/docs/TODOS.md +91 -0
- package/references/skill-tree/docs/anthropic_skill_guide.md +1364 -0
- package/references/skill-tree/docs/design/federated-skill-trees.md +524 -0
- package/references/skill-tree/docs/design/multi-agent-sync.md +759 -0
- package/references/skill-tree/docs/scraper/BRAINSTORM.md +583 -0
- package/references/skill-tree/docs/scraper/POC_PLAN.md +420 -0
- package/references/skill-tree/docs/scraper/README.md +170 -0
- package/references/skill-tree/examples/basic-usage.ts +190 -0
- package/references/skill-tree/package-lock.json +1509 -0
- package/references/skill-tree/package.json +66 -0
- package/references/skill-tree/scraper/README.md +123 -0
- package/references/skill-tree/scraper/docs/DESIGN.md +683 -0
- package/references/skill-tree/scraper/docs/PLAN.md +336 -0
- package/references/skill-tree/scraper/drizzle.config.ts +10 -0
- package/references/skill-tree/scraper/package-lock.json +6329 -0
- package/references/skill-tree/scraper/package.json +68 -0
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +7 -0
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +7 -0
- package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +27 -0
- package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +21 -0
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +54 -0
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +24 -0
- package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +93 -0
- package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +22 -0
- package/references/skill-tree/scraper/tsup.config.ts +14 -0
- package/references/skill-tree/scraper/vitest.config.ts +17 -0
- package/references/skill-tree/scripts/convert-to-vitest.ts +166 -0
- package/references/skill-tree/skills/skill-writer/SKILL.md +339 -0
- package/references/skill-tree/skills/skill-writer/references/examples.md +326 -0
- package/references/skill-tree/skills/skill-writer/references/patterns.md +210 -0
- package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +123 -0
- package/references/skill-tree/test/run-all.ts +106 -0
- package/references/skill-tree/test/utils.ts +128 -0
- package/references/skill-tree/vitest.config.ts +16 -0
- package/src/atlas.ts +525 -13
- package/src/embeddings/provider.ts +10 -3
- package/src/index.ts +127 -5
- package/src/learning/index.ts +41 -6
- package/src/learning/knowledge-extractor.ts +470 -0
- package/src/learning/meta-learner.ts +54 -0
- package/src/learning/pipeline.ts +87 -8
- package/src/learning/team-ingester.ts +499 -0
- package/src/learning/team-meta-learner.ts +558 -0
- package/src/learning/team-pipeline.ts +364 -0
- package/src/learning/trajectory-sources/dataclaw.ts +403 -0
- package/src/learning/trajectory-sources/entire.ts +240 -0
- package/src/learning/trajectory-sources/file.ts +136 -0
- package/src/learning/trajectory-sources/huggingface.ts +248 -0
- package/src/learning/trajectory-sources/in-memory.ts +61 -0
- package/src/learning/trajectory-sources/index.ts +15 -0
- package/src/learning/trajectory-sources/pipeline.ts +69 -0
- package/src/memory/graph-layers/base.ts +184 -0
- package/src/memory/graph-layers/causal.ts +16 -0
- package/src/memory/graph-layers/entity.ts +16 -0
- package/src/memory/graph-layers/index.ts +5 -0
- package/src/memory/graph-layers/semantic.ts +16 -0
- package/src/memory/graph-layers/temporal.ts +16 -0
- package/src/memory/index.ts +45 -0
- package/src/memory/knowledge-bank.ts +1260 -0
- package/src/memory/knowledge-defrag.ts +329 -0
- package/src/memory/knowledge-graph.ts +361 -0
- package/src/memory/search-provider.ts +35 -0
- package/src/memory/search-providers/index.ts +3 -0
- package/src/memory/search-providers/minimem.ts +84 -0
- package/src/memory/search-providers/text-similarity.ts +35 -0
- package/src/memory/skill-exporter.ts +357 -0
- package/src/memory/system.ts +61 -8
- package/src/memory/team-experience.ts +604 -0
- package/src/runtime/backends/acp-protocol.ts +231 -0
- package/src/runtime/backends/acp.ts +57 -196
- package/src/runtime/backends/index.ts +14 -0
- package/src/runtime/backends/macro-agent.ts +177 -0
- package/src/runtime/compute-provider.ts +206 -0
- package/src/runtime/index.ts +22 -0
- package/src/runtime/manager.ts +167 -23
- package/src/runtime/types.ts +41 -0
- package/src/search/evaluator.ts +29 -4
- package/src/search/index.ts +9 -0
- package/src/search/refinement-loop.ts +106 -12
- package/src/search/team-router.ts +459 -0
- package/src/session-bank/git-reader.ts +190 -0
- package/src/session-bank/index.ts +24 -0
- package/src/session-bank/parser.ts +366 -0
- package/src/session-bank/session-bank.ts +464 -0
- package/src/session-bank/types.ts +173 -0
- package/src/surfacing/index.ts +23 -0
- package/src/surfacing/publisher.ts +23 -0
- package/src/surfacing/skill-library.ts +31 -0
- package/src/surfacing/skill-publisher.ts +223 -0
- package/src/surfacing/sqlite-storage-adapter.ts +301 -0
- package/src/surfacing/team-skill-library.ts +610 -0
- package/src/types/config.ts +252 -0
- package/src/types/dataclaw.ts +99 -0
- package/src/types/huggingface-transformers.d.ts +12 -0
- package/src/types/index.ts +156 -0
- package/src/types/knowledge-graph.ts +246 -0
- package/src/types/knowledge.ts +388 -0
- package/src/types/team-meta.ts +212 -0
- package/src/types/team-playbook.ts +384 -0
- package/src/types/team-trajectory.ts +673 -0
- package/src/types/trajectory-source.ts +47 -0
- package/src/utils/frontmatter.ts +118 -0
- package/src/utils/index.ts +7 -0
- package/src/workspace/index.ts +48 -0
- package/src/workspace/runner.ts +281 -0
- package/src/workspace/skill-converter.ts +288 -0
- package/src/workspace/templates/index.ts +64 -0
- package/src/workspace/templates/knowledge-defrag.ts +223 -0
- package/src/workspace/templates/knowledge-extraction.ts +337 -0
- package/src/workspace/templates/meta-reflection.ts +208 -0
- package/src/workspace/templates/playbook-extraction.ts +240 -0
- package/src/workspace/templates/refinement-analysis.ts +162 -0
- package/src/workspace/templates/solution-evaluation.ts +199 -0
- package/src/workspace/templates/team-playbook-extraction.ts +631 -0
- package/src/workspace/templates/team-trajectory-analysis.ts +564 -0
- package/src/workspace/templates/trajectory-analysis.ts +234 -0
- package/src/workspace/templates/usage-inference.ts +163 -0
- package/src/workspace/types.ts +233 -0
- package/tests/atlas-knowledge.test.ts +165 -0
- package/tests/gap-fixes.test.ts +1103 -0
- package/tests/integration/dataclaw-e2e.test.ts +559 -0
- package/tests/integration/e2e.test.ts +407 -0
- package/tests/integration/entire-e2e.test.ts +187 -0
- package/tests/integration/huggingface-e2e.test.ts +627 -0
- package/tests/integration/session-bank.test.ts +225 -0
- package/tests/integration/skill-tree-wiring.test.ts +152 -0
- package/tests/learning/dataclaw-trajectory-source.test.ts +642 -0
- package/tests/learning/entire-trajectory-source.test.ts +380 -0
- package/tests/learning/huggingface-trajectory-source.test.ts +817 -0
- package/tests/learning/knowledge-extractor.test.ts +491 -0
- package/tests/learning/team-ingester.test.ts +349 -0
- package/tests/learning/team-meta-learner.test.ts +618 -0
- package/tests/learning/team-pipeline.test.ts +334 -0
- package/tests/learning/trajectory-sources.test.ts +312 -0
- package/tests/memory/graph-layers/semantic.test.ts +219 -0
- package/tests/memory/knowledge-bank-extraction.test.ts +558 -0
- package/tests/memory/knowledge-bank.test.ts +705 -0
- package/tests/memory/knowledge-defrag.test.ts +366 -0
- package/tests/memory/knowledge-evolution.test.ts +563 -0
- package/tests/memory/knowledge-graph.test.ts +492 -0
- package/tests/memory/knowledge-inbox.test.ts +258 -0
- package/tests/memory/knowledge-minimem.test.ts +251 -0
- package/tests/memory/skill-exporter.test.ts +470 -0
- package/tests/memory/team-experience.test.ts +411 -0
- package/tests/runtime/agent-manager.test.ts +1 -1
- package/tests/runtime/compute-provider.test.ts +288 -0
- package/tests/runtime/delegate.test.ts +349 -0
- package/tests/runtime/macro-agent-backend.test.ts +266 -0
- package/tests/search/team-router.test.ts +376 -0
- package/tests/session-bank/fixtures/multi-tool-session/full.jsonl +12 -0
- package/tests/session-bank/fixtures/multi-tool-session/metadata.json +28 -0
- package/tests/session-bank/fixtures/root-metadata.json +18 -0
- package/tests/session-bank/fixtures/simple-session/full.jsonl +6 -0
- package/tests/session-bank/fixtures/simple-session/metadata.json +38 -0
- package/tests/session-bank/git-reader.test.ts +232 -0
- package/tests/session-bank/parser.test.ts +321 -0
- package/tests/session-bank/session-bank.test.ts +546 -0
- package/tests/surfacing/skill-publisher.test.ts +398 -0
- package/tests/surfacing/sqlite-storage-adapter.test.ts +218 -0
- package/tests/surfacing/team-skill-library.test.ts +444 -0
- package/tests/types/team-meta.test.ts +147 -0
- package/tests/types/team-playbook.test.ts +246 -0
- package/tests/types/team-trajectory.test.ts +557 -0
- package/tests/utils/frontmatter.test.ts +208 -0
- package/tests/workspace/full-flow.test.ts +839 -0
- package/tests/workspace/manager.test.ts +215 -0
- package/tests/workspace/runner.test.ts +330 -0
- package/tests/workspace/skill-converter.test.ts +205 -0
- package/tests/workspace/templates/knowledge-extraction.test.ts +235 -0
- package/tests/workspace/templates/team-playbook-extraction.test.ts +341 -0
- package/tests/workspace/templates/team-trajectory-analysis.test.ts +417 -0
- package/src/learning/llm-extractor.ts +0 -542
|
@@ -0,0 +1,839 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { readFile, readdir, access } from 'node:fs/promises';
|
|
5
|
+
import { randomUUID } from 'node:crypto';
|
|
6
|
+
import { WorkspaceManager } from 'agent-workspace';
|
|
7
|
+
import type { WorkspaceHandle } from 'agent-workspace';
|
|
8
|
+
import { AgenticTaskRunner } from '../../src/workspace/runner.js';
|
|
9
|
+
import { AgenticTaskOutputError } from '../../src/workspace/types.js';
|
|
10
|
+
import type {
|
|
11
|
+
AgenticTaskTemplate,
|
|
12
|
+
AgentSkillSpec,
|
|
13
|
+
ResourceSpec,
|
|
14
|
+
ProcessingContext,
|
|
15
|
+
} from '../../src/workspace/types.js';
|
|
16
|
+
import type { AgenticTaskRunnerConfig } from '../../src/types/config.js';
|
|
17
|
+
import { createMockBackend } from '../../src/runtime/backends/mock.js';
|
|
18
|
+
import { AgentManager, createAgentManager } from '../../src/runtime/manager.js';
|
|
19
|
+
import { MemorySystem, createMemorySystem } from '../../src/memory/system.js';
|
|
20
|
+
import type { MemoryQueryResultV2 } from '../../src/memory/system.js';
|
|
21
|
+
import { LearningPipeline, createLearningPipeline } from '../../src/learning/pipeline.js';
|
|
22
|
+
import { createPlaybook } from '../../src/types/playbook.js';
|
|
23
|
+
import { convertPlaybooksToSkills, generateSkillMd } from '../../src/workspace/skill-converter.js';
|
|
24
|
+
|
|
25
|
+
// --------------------------------------------------------------------------
|
|
26
|
+
// Test types
|
|
27
|
+
// --------------------------------------------------------------------------
|
|
28
|
+
interface AnalysisInput {
|
|
29
|
+
code: string;
|
|
30
|
+
language: string;
|
|
31
|
+
complexity?: 'simple' | 'complex';
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
interface AnalysisOutput {
|
|
35
|
+
issues: Array<{ line: number; message: string; severity: string }>;
|
|
36
|
+
summary: string;
|
|
37
|
+
score: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// --------------------------------------------------------------------------
|
|
41
|
+
// Helpers
|
|
42
|
+
// --------------------------------------------------------------------------
|
|
43
|
+
|
|
44
|
+
function makePlaybook(name: string, domain: string) {
|
|
45
|
+
return createPlaybook({
|
|
46
|
+
name,
|
|
47
|
+
applicability: {
|
|
48
|
+
situations: [`Analyzing ${domain} code for issues`],
|
|
49
|
+
triggers: [`${domain}-analysis`, 'code-review'],
|
|
50
|
+
antiPatterns: ['Runtime profiling (not static analysis)'],
|
|
51
|
+
domains: [domain, 'analysis'],
|
|
52
|
+
},
|
|
53
|
+
guidance: {
|
|
54
|
+
strategy: `Parse the ${domain} code and identify issues by category.`,
|
|
55
|
+
tactics: [
|
|
56
|
+
'Check for type errors first',
|
|
57
|
+
'Look for unused variables',
|
|
58
|
+
'Identify potential null dereferences',
|
|
59
|
+
],
|
|
60
|
+
steps: [
|
|
61
|
+
'Read the source file',
|
|
62
|
+
'Run static analysis',
|
|
63
|
+
'Categorize findings by severity',
|
|
64
|
+
'Produce output/result.json',
|
|
65
|
+
],
|
|
66
|
+
codeExample: `analyze(source, { language: '${domain}' })`,
|
|
67
|
+
},
|
|
68
|
+
verification: {
|
|
69
|
+
successIndicators: ['Output file is valid JSON', 'All issues have line numbers'],
|
|
70
|
+
failureIndicators: ['Empty output', 'Invalid JSON'],
|
|
71
|
+
},
|
|
72
|
+
confidence: 0.9,
|
|
73
|
+
complexity: 'moderate',
|
|
74
|
+
evolution: {
|
|
75
|
+
version: '2.0.0',
|
|
76
|
+
createdFrom: ['traj-100', 'traj-101'],
|
|
77
|
+
failures: [],
|
|
78
|
+
refinements: [
|
|
79
|
+
{
|
|
80
|
+
context: 'monorepo',
|
|
81
|
+
addition: 'Resolve workspace paths before analysis',
|
|
82
|
+
source: 'failure' as const,
|
|
83
|
+
addedAt: new Date('2025-06-01'),
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
successCount: 12,
|
|
87
|
+
failureCount: 1,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function createFullTemplate(options?: {
|
|
93
|
+
skills?: AgentSkillSpec[];
|
|
94
|
+
resources?: ResourceSpec[];
|
|
95
|
+
additionalKnowledge?: boolean;
|
|
96
|
+
outputData?: AnalysisOutput;
|
|
97
|
+
failOnCollect?: boolean;
|
|
98
|
+
failOnCollectOnce?: boolean;
|
|
99
|
+
processOutputSpy?: (output: AnalysisOutput, input: AnalysisInput, ctx: ProcessingContext) => Promise<void>;
|
|
100
|
+
}): AgenticTaskTemplate<AnalysisInput, AnalysisOutput> {
|
|
101
|
+
const defaultOutput: AnalysisOutput = options?.outputData ?? {
|
|
102
|
+
issues: [
|
|
103
|
+
{ line: 10, message: 'Unused variable "x"', severity: 'warning' },
|
|
104
|
+
{ line: 25, message: 'Possible null dereference', severity: 'error' },
|
|
105
|
+
],
|
|
106
|
+
summary: 'Found 2 issues: 1 error, 1 warning',
|
|
107
|
+
score: 0.7,
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
let collectAttempts = 0;
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
taskType: 'code-analysis',
|
|
114
|
+
domain: 'static-analysis',
|
|
115
|
+
description: 'Analyze source code for issues and produce a structured report',
|
|
116
|
+
|
|
117
|
+
assessComplexity(input: AnalysisInput) {
|
|
118
|
+
if (input.complexity === 'simple') return 'heuristic';
|
|
119
|
+
if (input.complexity === 'complex') return 'thorough';
|
|
120
|
+
return 'standard';
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
agentType: 'mock',
|
|
124
|
+
|
|
125
|
+
heuristicFallback: async (input: AnalysisInput) => ({
|
|
126
|
+
issues: [],
|
|
127
|
+
summary: `Heuristic: ${input.language} code looks fine`,
|
|
128
|
+
score: 1.0,
|
|
129
|
+
}),
|
|
130
|
+
|
|
131
|
+
async prepareWorkspace(input: AnalysisInput, handle: WorkspaceHandle) {
|
|
132
|
+
await handle.writeRaw('input', `source.${input.language === 'typescript' ? 'ts' : 'py'}`, input.code);
|
|
133
|
+
await handle.writeJson('input', 'config.json', {
|
|
134
|
+
language: input.language,
|
|
135
|
+
rules: ['no-unused-vars', 'no-null-deref'],
|
|
136
|
+
});
|
|
137
|
+
// Pre-write output (simulating what a real agent would produce)
|
|
138
|
+
if (!options?.failOnCollect && !options?.failOnCollectOnce) {
|
|
139
|
+
await handle.writeJson('output', 'result.json', defaultOutput);
|
|
140
|
+
}
|
|
141
|
+
if (options?.failOnCollectOnce) {
|
|
142
|
+
// Write output so it's there for the retry
|
|
143
|
+
await handle.writeJson('output', 'result.json', defaultOutput);
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
|
|
147
|
+
buildTaskPrompt(input: AnalysisInput) {
|
|
148
|
+
return `Analyze the ${input.language} source code in input/ for issues. ` +
|
|
149
|
+
`Write a JSON report to output/result.json with fields: issues (array), summary (string), score (number).`;
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
getSkills(_input: AnalysisInput) {
|
|
153
|
+
return options?.skills ?? [];
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
getResources(_input: AnalysisInput) {
|
|
157
|
+
return options?.resources ?? [];
|
|
158
|
+
},
|
|
159
|
+
|
|
160
|
+
getAdditionalKnowledge: options?.additionalKnowledge
|
|
161
|
+
? async (_input: AnalysisInput, memory: MemorySystem) => {
|
|
162
|
+
return memory.queryV2('code quality patterns', { domains: ['quality'] });
|
|
163
|
+
}
|
|
164
|
+
: undefined,
|
|
165
|
+
|
|
166
|
+
outputConfig: {
|
|
167
|
+
files: [
|
|
168
|
+
{
|
|
169
|
+
path: 'result.json',
|
|
170
|
+
format: 'json' as const,
|
|
171
|
+
required: true,
|
|
172
|
+
description: 'Analysis result with issues, summary, and score',
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
async collectOutput(handle: WorkspaceHandle) {
|
|
178
|
+
collectAttempts++;
|
|
179
|
+
if (options?.failOnCollect) {
|
|
180
|
+
throw new Error('Output malformed');
|
|
181
|
+
}
|
|
182
|
+
if (options?.failOnCollectOnce && collectAttempts === 1) {
|
|
183
|
+
throw new Error('Transient parse error');
|
|
184
|
+
}
|
|
185
|
+
return handle.readJson<AnalysisOutput>('output', 'result.json');
|
|
186
|
+
},
|
|
187
|
+
|
|
188
|
+
async processOutput(
|
|
189
|
+
output: AnalysisOutput,
|
|
190
|
+
input: AnalysisInput,
|
|
191
|
+
context: ProcessingContext
|
|
192
|
+
) {
|
|
193
|
+
if (options?.processOutputSpy) {
|
|
194
|
+
await options.processOutputSpy(output, input, context);
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
|
|
198
|
+
timeout: 60_000,
|
|
199
|
+
captureToolCalls: true,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// --------------------------------------------------------------------------
|
|
204
|
+
// Test suite
|
|
205
|
+
// --------------------------------------------------------------------------
|
|
206
|
+
describe('Full Flow: AgenticTaskRunner end-to-end', () => {
|
|
207
|
+
let testBaseDir: string;
|
|
208
|
+
let workspaceManager: WorkspaceManager;
|
|
209
|
+
let agentManager: AgentManager;
|
|
210
|
+
let memory: MemorySystem;
|
|
211
|
+
let learning: LearningPipeline;
|
|
212
|
+
let runner: AgenticTaskRunner;
|
|
213
|
+
let config: AgenticTaskRunnerConfig;
|
|
214
|
+
|
|
215
|
+
beforeEach(async () => {
|
|
216
|
+
testBaseDir = join(tmpdir(), `atlas-full-flow-${randomUUID().slice(0, 8)}`);
|
|
217
|
+
|
|
218
|
+
workspaceManager = new WorkspaceManager({
|
|
219
|
+
baseDir: testBaseDir,
|
|
220
|
+
prefix: 'atlas-workspaces',
|
|
221
|
+
});
|
|
222
|
+
memory = createMemorySystem(join(testBaseDir, '.atlas'));
|
|
223
|
+
await memory.init();
|
|
224
|
+
learning = createLearningPipeline(memory);
|
|
225
|
+
agentManager = createAgentManager(memory);
|
|
226
|
+
|
|
227
|
+
const mockBackend = createMockBackend({
|
|
228
|
+
success: true,
|
|
229
|
+
result: 'Analysis complete — output written to output/result.json',
|
|
230
|
+
durationMs: 50,
|
|
231
|
+
toolCalls: [
|
|
232
|
+
{ name: 'read_file', input: { path: 'input/source.ts' }, output: 'code content' },
|
|
233
|
+
{ name: 'write_file', input: { path: 'output/result.json' }, output: 'written' },
|
|
234
|
+
],
|
|
235
|
+
});
|
|
236
|
+
agentManager.registerBackend(mockBackend);
|
|
237
|
+
|
|
238
|
+
config = {
|
|
239
|
+
cleanupWorkspaces: false, // keep workspaces so tests can inspect
|
|
240
|
+
keepFailedWorkspaces: true,
|
|
241
|
+
maxConcurrentAgents: 3,
|
|
242
|
+
staleWorkspaceMaxAgeMs: 3600_000,
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
runner = new AgenticTaskRunner(
|
|
246
|
+
workspaceManager,
|
|
247
|
+
agentManager,
|
|
248
|
+
memory,
|
|
249
|
+
learning,
|
|
250
|
+
config,
|
|
251
|
+
);
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
afterEach(async () => {
|
|
255
|
+
const active = await workspaceManager.list();
|
|
256
|
+
for (const ws of active) {
|
|
257
|
+
await workspaceManager.cleanup(ws);
|
|
258
|
+
}
|
|
259
|
+
await memory.close();
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
// ========================================================================
|
|
263
|
+
// 1. Complete lifecycle — every step verified
|
|
264
|
+
// ========================================================================
|
|
265
|
+
describe('complete lifecycle', () => {
|
|
266
|
+
it('should execute all 12 runner steps from workspace creation through meta-learning', async () => {
|
|
267
|
+
const processOutputSpy = vi.fn();
|
|
268
|
+
const processTrajectory = vi.spyOn(learning, 'processTrajectory');
|
|
269
|
+
const queryV2 = vi.spyOn(memory, 'queryV2');
|
|
270
|
+
|
|
271
|
+
const playbook = makePlaybook('typescript-analysis', 'typescript');
|
|
272
|
+
const skills = convertPlaybooksToSkills([playbook]);
|
|
273
|
+
|
|
274
|
+
const template = createFullTemplate({
|
|
275
|
+
skills,
|
|
276
|
+
processOutputSpy,
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
const input: AnalysisInput = {
|
|
280
|
+
code: 'const x = 1;\nconst y: string | null = null;\ny.length;',
|
|
281
|
+
language: 'typescript',
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
const result = await runner.run(template, input);
|
|
285
|
+
|
|
286
|
+
// Result shape
|
|
287
|
+
expect(result.method).toBe('agentic');
|
|
288
|
+
expect(result.agentTrajectoryId).toBeDefined();
|
|
289
|
+
expect(result.metrics.totalTimeMs).toBeGreaterThan(0);
|
|
290
|
+
expect(result.metrics.toolCalls).toBeGreaterThanOrEqual(0);
|
|
291
|
+
|
|
292
|
+
// Output is correct
|
|
293
|
+
expect(result.output.issues).toHaveLength(2);
|
|
294
|
+
expect(result.output.summary).toContain('2 issues');
|
|
295
|
+
expect(result.output.score).toBe(0.7);
|
|
296
|
+
|
|
297
|
+
// Knowledge was queried (domain-scoped)
|
|
298
|
+
expect(queryV2).toHaveBeenCalledWith(
|
|
299
|
+
expect.any(String),
|
|
300
|
+
expect.objectContaining({ domains: ['static-analysis'] }),
|
|
301
|
+
);
|
|
302
|
+
|
|
303
|
+
// processOutput was called with correct args
|
|
304
|
+
expect(processOutputSpy).toHaveBeenCalledTimes(1);
|
|
305
|
+
expect(processOutputSpy).toHaveBeenCalledWith(
|
|
306
|
+
result.output,
|
|
307
|
+
input,
|
|
308
|
+
expect.objectContaining({
|
|
309
|
+
memory: expect.anything(),
|
|
310
|
+
learningPipeline: expect.anything(),
|
|
311
|
+
}),
|
|
312
|
+
);
|
|
313
|
+
|
|
314
|
+
// Meta-learning processed the trajectory
|
|
315
|
+
expect(processTrajectory).toHaveBeenCalledTimes(1);
|
|
316
|
+
});
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
// ========================================================================
|
|
320
|
+
// 2. Skills injection through runner
|
|
321
|
+
// ========================================================================
|
|
322
|
+
describe('skills injection', () => {
|
|
323
|
+
it('should write playbook-converted skills as SKILL.md files into workspace', async () => {
|
|
324
|
+
let capturedHandle: WorkspaceHandle | null = null;
|
|
325
|
+
|
|
326
|
+
const playbooks = [
|
|
327
|
+
makePlaybook('typescript-analysis', 'typescript'),
|
|
328
|
+
makePlaybook('null-safety-check', 'safety'),
|
|
329
|
+
];
|
|
330
|
+
const skills = convertPlaybooksToSkills(playbooks);
|
|
331
|
+
|
|
332
|
+
const template = createFullTemplate({ skills });
|
|
333
|
+
const origPrepare = template.prepareWorkspace.bind(template);
|
|
334
|
+
template.prepareWorkspace = async (input, handle) => {
|
|
335
|
+
capturedHandle = handle;
|
|
336
|
+
await origPrepare(input, handle);
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
await runner.run(template, { code: 'x', language: 'typescript' });
|
|
340
|
+
|
|
341
|
+
expect(capturedHandle).not.toBeNull();
|
|
342
|
+
const skillsDir = capturedHandle!.dir('skills');
|
|
343
|
+
|
|
344
|
+
// Both skills should have SKILL.md files
|
|
345
|
+
const entries = await readdir(skillsDir);
|
|
346
|
+
expect(entries).toContain('typescript-analysis');
|
|
347
|
+
expect(entries).toContain('null-safety-check');
|
|
348
|
+
|
|
349
|
+
// Content should be valid SKILL.md
|
|
350
|
+
const tsSkillMd = await readFile(
|
|
351
|
+
join(skillsDir, 'typescript-analysis', 'SKILL.md'),
|
|
352
|
+
'utf-8',
|
|
353
|
+
);
|
|
354
|
+
expect(tsSkillMd).toContain('# Typescript Analysis');
|
|
355
|
+
expect(tsSkillMd).toContain('## When to Use');
|
|
356
|
+
expect(tsSkillMd).toContain('## Strategy');
|
|
357
|
+
expect(tsSkillMd).toContain('Confidence: 90%');
|
|
358
|
+
|
|
359
|
+
const safetySkillMd = await readFile(
|
|
360
|
+
join(skillsDir, 'null-safety-check', 'SKILL.md'),
|
|
361
|
+
'utf-8',
|
|
362
|
+
);
|
|
363
|
+
expect(safetySkillMd).toContain('# Null Safety Check');
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
// ========================================================================
|
|
368
|
+
// 3. Resources injection through runner
|
|
369
|
+
// ========================================================================
|
|
370
|
+
describe('resources injection', () => {
|
|
371
|
+
it('should populate file resources into workspace resources/ directory', async () => {
|
|
372
|
+
let capturedHandle: WorkspaceHandle | null = null;
|
|
373
|
+
|
|
374
|
+
const resources: ResourceSpec[] = [
|
|
375
|
+
{
|
|
376
|
+
path: 'rules/no-unused-vars.md',
|
|
377
|
+
type: 'file',
|
|
378
|
+
source: '# No Unused Variables\n\nFlag variables that are declared but never read.',
|
|
379
|
+
description: 'Linting rule documentation',
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
path: 'rules/no-null-deref.md',
|
|
383
|
+
type: 'file',
|
|
384
|
+
source: '# No Null Dereference\n\nFlag accesses on potentially null values.',
|
|
385
|
+
description: 'Null safety rule documentation',
|
|
386
|
+
},
|
|
387
|
+
];
|
|
388
|
+
|
|
389
|
+
const template = createFullTemplate({ resources });
|
|
390
|
+
const origPrepare = template.prepareWorkspace.bind(template);
|
|
391
|
+
template.prepareWorkspace = async (input, handle) => {
|
|
392
|
+
capturedHandle = handle;
|
|
393
|
+
await origPrepare(input, handle);
|
|
394
|
+
};
|
|
395
|
+
|
|
396
|
+
await runner.run(template, { code: 'x', language: 'typescript' });
|
|
397
|
+
|
|
398
|
+
expect(capturedHandle).not.toBeNull();
|
|
399
|
+
|
|
400
|
+
const rule1 = await readFile(
|
|
401
|
+
join(capturedHandle!.resourcesDir, 'rules', 'no-unused-vars.md'),
|
|
402
|
+
'utf-8',
|
|
403
|
+
);
|
|
404
|
+
expect(rule1).toContain('No Unused Variables');
|
|
405
|
+
|
|
406
|
+
const rule2 = await readFile(
|
|
407
|
+
join(capturedHandle!.resourcesDir, 'rules', 'no-null-deref.md'),
|
|
408
|
+
'utf-8',
|
|
409
|
+
);
|
|
410
|
+
expect(rule2).toContain('No Null Dereference');
|
|
411
|
+
});
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
// ========================================================================
|
|
415
|
+
// 4. Knowledge injection and merging
|
|
416
|
+
// ========================================================================
|
|
417
|
+
describe('knowledge injection with additional queries', () => {
|
|
418
|
+
it('should merge domain knowledge with additional knowledge queries', async () => {
|
|
419
|
+
const queryV2 = vi.spyOn(memory, 'queryV2');
|
|
420
|
+
|
|
421
|
+
const template = createFullTemplate({ additionalKnowledge: true });
|
|
422
|
+
|
|
423
|
+
await runner.run(template, { code: 'x', language: 'typescript' });
|
|
424
|
+
|
|
425
|
+
// Should have been called twice: once for domain, once for additional
|
|
426
|
+
expect(queryV2).toHaveBeenCalledTimes(2);
|
|
427
|
+
|
|
428
|
+
// First call: domain-scoped
|
|
429
|
+
expect(queryV2).toHaveBeenCalledWith(
|
|
430
|
+
expect.stringContaining('Analyze source code'),
|
|
431
|
+
expect.objectContaining({ domains: ['static-analysis'] }),
|
|
432
|
+
);
|
|
433
|
+
|
|
434
|
+
// Second call: additional knowledge
|
|
435
|
+
expect(queryV2).toHaveBeenCalledWith(
|
|
436
|
+
'code quality patterns',
|
|
437
|
+
expect.objectContaining({ domains: ['quality'] }),
|
|
438
|
+
);
|
|
439
|
+
});
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
// ========================================================================
|
|
443
|
+
// 5. Heuristic fallback for simple inputs
|
|
444
|
+
// ========================================================================
|
|
445
|
+
describe('heuristic fallback', () => {
|
|
446
|
+
it('should bypass workspace entirely for simple inputs', async () => {
|
|
447
|
+
const processTrajectory = vi.spyOn(learning, 'processTrajectory');
|
|
448
|
+
|
|
449
|
+
const template = createFullTemplate();
|
|
450
|
+
const result = await runner.run(template, {
|
|
451
|
+
code: 'console.log("hi")',
|
|
452
|
+
language: 'typescript',
|
|
453
|
+
complexity: 'simple',
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
expect(result.method).toBe('heuristic');
|
|
457
|
+
expect(result.output.score).toBe(1.0);
|
|
458
|
+
expect(result.output.summary).toContain('Heuristic');
|
|
459
|
+
expect(result.metrics.tokensUsed).toBe(0);
|
|
460
|
+
expect(result.metrics.toolCalls).toBe(0);
|
|
461
|
+
expect(result.agentTrajectoryId).toBeUndefined();
|
|
462
|
+
|
|
463
|
+
// No workspace activity, no meta-learning
|
|
464
|
+
expect(processTrajectory).not.toHaveBeenCalled();
|
|
465
|
+
const active = await workspaceManager.list();
|
|
466
|
+
expect(active).toHaveLength(0);
|
|
467
|
+
});
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
// ========================================================================
|
|
471
|
+
// 6. Thorough complexity doubles timeout
|
|
472
|
+
// ========================================================================
|
|
473
|
+
describe('thorough complexity', () => {
|
|
474
|
+
it('should double the timeout for complex inputs and still complete', async () => {
|
|
475
|
+
let capturedTimeout = 0;
|
|
476
|
+
const origSpawn = agentManager.spawn.bind(agentManager);
|
|
477
|
+
agentManager.spawn = async (spawnConfig) => {
|
|
478
|
+
capturedTimeout = spawnConfig.timeout ?? 0;
|
|
479
|
+
return origSpawn(spawnConfig);
|
|
480
|
+
};
|
|
481
|
+
|
|
482
|
+
const template = createFullTemplate();
|
|
483
|
+
|
|
484
|
+
const result = await runner.run(template, {
|
|
485
|
+
code: 'complex code...',
|
|
486
|
+
language: 'typescript',
|
|
487
|
+
complexity: 'complex',
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
expect(result.method).toBe('agentic');
|
|
491
|
+
expect(capturedTimeout).toBe(120_000); // 60_000 * 2
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
// ========================================================================
|
|
496
|
+
// 7. Output validation and collection with retry
|
|
497
|
+
// ========================================================================
|
|
498
|
+
describe('output collection retry', () => {
|
|
499
|
+
it('should retry collectOutput on transient failure and succeed', async () => {
|
|
500
|
+
const template = createFullTemplate({ failOnCollectOnce: true });
|
|
501
|
+
|
|
502
|
+
const result = await runner.run(template, {
|
|
503
|
+
code: 'x',
|
|
504
|
+
language: 'typescript',
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
// Should succeed on retry
|
|
508
|
+
expect(result.method).toBe('agentic');
|
|
509
|
+
expect(result.output.issues).toHaveLength(2);
|
|
510
|
+
});
|
|
511
|
+
|
|
512
|
+
it('should throw AgenticTaskOutputError when collection permanently fails', async () => {
|
|
513
|
+
const template = createFullTemplate({ failOnCollect: true });
|
|
514
|
+
|
|
515
|
+
await expect(
|
|
516
|
+
runner.run(template, { code: 'x', language: 'typescript' }),
|
|
517
|
+
).rejects.toThrow(AgenticTaskOutputError);
|
|
518
|
+
});
|
|
519
|
+
});
|
|
520
|
+
|
|
521
|
+
// ========================================================================
|
|
522
|
+
// 8. processOutput receives correct context
|
|
523
|
+
// ========================================================================
|
|
524
|
+
describe('processOutput integration', () => {
|
|
525
|
+
it('should pass memory and learningPipeline in ProcessingContext', async () => {
|
|
526
|
+
let receivedContext: ProcessingContext | null = null;
|
|
527
|
+
|
|
528
|
+
const template = createFullTemplate({
|
|
529
|
+
processOutputSpy: async (_output, _input, ctx) => {
|
|
530
|
+
receivedContext = ctx;
|
|
531
|
+
},
|
|
532
|
+
});
|
|
533
|
+
|
|
534
|
+
await runner.run(template, { code: 'x', language: 'typescript' });
|
|
535
|
+
|
|
536
|
+
expect(receivedContext).not.toBeNull();
|
|
537
|
+
expect(receivedContext!.memory).toBe(memory);
|
|
538
|
+
expect(receivedContext!.learningPipeline).toBe(learning);
|
|
539
|
+
});
|
|
540
|
+
|
|
541
|
+
it('should allow processOutput to store results back into memory', async () => {
|
|
542
|
+
const template = createFullTemplate({
|
|
543
|
+
processOutputSpy: async (output, input, ctx) => {
|
|
544
|
+
await ctx.memory.experiences.add({
|
|
545
|
+
id: `analysis-${randomUUID().slice(0, 8)}`,
|
|
546
|
+
taskInput: `Analyze ${input.language} code`,
|
|
547
|
+
solutionOutput: output.summary,
|
|
548
|
+
feedback: output.score > 0.5 ? 'acceptable' : 'needs-improvement',
|
|
549
|
+
success: output.score > 0.5,
|
|
550
|
+
domain: 'static-analysis',
|
|
551
|
+
trajectoryId: 'test',
|
|
552
|
+
usageCount: 0,
|
|
553
|
+
createdAt: new Date(),
|
|
554
|
+
metadata: { issueCount: output.issues.length },
|
|
555
|
+
});
|
|
556
|
+
},
|
|
557
|
+
});
|
|
558
|
+
|
|
559
|
+
await runner.run(template, { code: 'x', language: 'typescript' });
|
|
560
|
+
|
|
561
|
+
// Verify experience was stored
|
|
562
|
+
const results = await memory.queryV2('static analysis', {
|
|
563
|
+
domains: ['static-analysis'],
|
|
564
|
+
});
|
|
565
|
+
expect(results.experiences.length).toBeGreaterThanOrEqual(1);
|
|
566
|
+
});
|
|
567
|
+
});
|
|
568
|
+
|
|
569
|
+
// ========================================================================
|
|
570
|
+
// 9. Workspace filesystem structure
|
|
571
|
+
// ========================================================================
|
|
572
|
+
describe('workspace filesystem', () => {
|
|
573
|
+
it('should produce correct directory structure with all populated dirs', async () => {
|
|
574
|
+
let capturedHandle: WorkspaceHandle | null = null;
|
|
575
|
+
|
|
576
|
+
const playbooks = [makePlaybook('ts-analysis', 'typescript')];
|
|
577
|
+
const skills = convertPlaybooksToSkills(playbooks);
|
|
578
|
+
const resources: ResourceSpec[] = [
|
|
579
|
+
{ path: 'docs/guide.md', type: 'file', source: '# Guide\n\nAnalysis guide.' },
|
|
580
|
+
];
|
|
581
|
+
|
|
582
|
+
const template = createFullTemplate({ skills, resources });
|
|
583
|
+
const origPrepare = template.prepareWorkspace.bind(template);
|
|
584
|
+
template.prepareWorkspace = async (input, handle) => {
|
|
585
|
+
capturedHandle = handle;
|
|
586
|
+
await origPrepare(input, handle);
|
|
587
|
+
};
|
|
588
|
+
|
|
589
|
+
await runner.run(template, { code: 'const a = 1;', language: 'typescript' });
|
|
590
|
+
|
|
591
|
+
expect(capturedHandle).not.toBeNull();
|
|
592
|
+
const wsPath = capturedHandle!.path;
|
|
593
|
+
|
|
594
|
+
// All expected directories exist
|
|
595
|
+
for (const dir of ['input', 'output', 'resources', 'scratch', 'skills']) {
|
|
596
|
+
await expect(access(join(wsPath, dir))).resolves.toBeUndefined();
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
// Input files
|
|
600
|
+
const inputJson = JSON.parse(
|
|
601
|
+
await readFile(join(wsPath, 'input', 'config.json'), 'utf-8'),
|
|
602
|
+
);
|
|
603
|
+
expect(inputJson.language).toBe('typescript');
|
|
604
|
+
|
|
605
|
+
const sourceContent = await readFile(join(wsPath, 'input', 'source.ts'), 'utf-8');
|
|
606
|
+
expect(sourceContent).toBe('const a = 1;');
|
|
607
|
+
|
|
608
|
+
// Output files
|
|
609
|
+
const outputJson = JSON.parse(
|
|
610
|
+
await readFile(join(wsPath, 'output', 'result.json'), 'utf-8'),
|
|
611
|
+
);
|
|
612
|
+
expect(outputJson.issues).toHaveLength(2);
|
|
613
|
+
|
|
614
|
+
// Skills
|
|
615
|
+
await expect(
|
|
616
|
+
access(join(wsPath, 'skills', 'ts-analysis', 'SKILL.md')),
|
|
617
|
+
).resolves.toBeUndefined();
|
|
618
|
+
|
|
619
|
+
// Resources
|
|
620
|
+
const guide = await readFile(join(wsPath, 'resources', 'docs', 'guide.md'), 'utf-8');
|
|
621
|
+
expect(guide).toContain('Analysis guide');
|
|
622
|
+
});
|
|
623
|
+
});
|
|
624
|
+
|
|
625
|
+
// ========================================================================
|
|
626
|
+
// 10. Workspace cleanup on success
|
|
627
|
+
// ========================================================================
|
|
628
|
+
describe('workspace cleanup', () => {
|
|
629
|
+
it('should cleanup workspace on success when cleanupWorkspaces is true', async () => {
|
|
630
|
+
const cleanupRunner = new AgenticTaskRunner(
|
|
631
|
+
workspaceManager,
|
|
632
|
+
agentManager,
|
|
633
|
+
memory,
|
|
634
|
+
learning,
|
|
635
|
+
{ ...config, cleanupWorkspaces: true },
|
|
636
|
+
);
|
|
637
|
+
|
|
638
|
+
let capturedPath = '';
|
|
639
|
+
const template = createFullTemplate();
|
|
640
|
+
const origPrepare = template.prepareWorkspace.bind(template);
|
|
641
|
+
template.prepareWorkspace = async (input, handle) => {
|
|
642
|
+
capturedPath = handle.path;
|
|
643
|
+
await origPrepare(input, handle);
|
|
644
|
+
};
|
|
645
|
+
|
|
646
|
+
await cleanupRunner.run(template, { code: 'x', language: 'typescript' });
|
|
647
|
+
|
|
648
|
+
await expect(access(capturedPath)).rejects.toThrow();
|
|
649
|
+
});
|
|
650
|
+
|
|
651
|
+
it('should keep failed workspace when keepFailedWorkspaces is true', async () => {
|
|
652
|
+
const template = createFullTemplate({ failOnCollect: true });
|
|
653
|
+
|
|
654
|
+
try {
|
|
655
|
+
await runner.run(template, { code: 'x', language: 'typescript' });
|
|
656
|
+
} catch {
|
|
657
|
+
// Expected
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
const active = await workspaceManager.list();
|
|
661
|
+
expect(active.length).toBeGreaterThanOrEqual(1);
|
|
662
|
+
});
|
|
663
|
+
});
|
|
664
|
+
|
|
665
|
+
// ========================================================================
|
|
666
|
+
// 11. Agent spawn receives correct configuration
|
|
667
|
+
// ========================================================================
|
|
668
|
+
describe('agent spawn configuration', () => {
|
|
669
|
+
it('should pass workspace path as cwd, task prompt, and agent type to agent', async () => {
|
|
670
|
+
let capturedCwd = '';
|
|
671
|
+
let capturedTask: { description?: string; domain?: string } = {};
|
|
672
|
+
let capturedAgentType = '';
|
|
673
|
+
|
|
674
|
+
const origSpawn = agentManager.spawn.bind(agentManager);
|
|
675
|
+
agentManager.spawn = async (spawnConfig) => {
|
|
676
|
+
capturedCwd = spawnConfig.cwd ?? '';
|
|
677
|
+
capturedTask = { description: spawnConfig.task.description, domain: spawnConfig.task.domain };
|
|
678
|
+
capturedAgentType = spawnConfig.agentType;
|
|
679
|
+
return origSpawn(spawnConfig);
|
|
680
|
+
};
|
|
681
|
+
|
|
682
|
+
const template = createFullTemplate();
|
|
683
|
+
|
|
684
|
+
await runner.run(template, { code: 'x', language: 'typescript' });
|
|
685
|
+
|
|
686
|
+
expect(capturedCwd).toContain('atlas-workspaces');
|
|
687
|
+
expect(capturedTask.description).toContain('Analyze the typescript source code');
|
|
688
|
+
expect(capturedTask.domain).toBe('static-analysis');
|
|
689
|
+
expect(capturedAgentType).toBe('mock');
|
|
690
|
+
});
|
|
691
|
+
|
|
692
|
+
it('should inject knowledge into the agent spawn config', async () => {
|
|
693
|
+
let capturedKnowledge: MemoryQueryResultV2 | undefined;
|
|
694
|
+
|
|
695
|
+
const origSpawn = agentManager.spawn.bind(agentManager);
|
|
696
|
+
agentManager.spawn = async (spawnConfig) => {
|
|
697
|
+
capturedKnowledge = spawnConfig.injectedKnowledge as MemoryQueryResultV2 | undefined;
|
|
698
|
+
return origSpawn(spawnConfig);
|
|
699
|
+
};
|
|
700
|
+
|
|
701
|
+
const template = createFullTemplate();
|
|
702
|
+
await runner.run(template, { code: 'x', language: 'typescript' });
|
|
703
|
+
|
|
704
|
+
expect(capturedKnowledge).toBeDefined();
|
|
705
|
+
expect(capturedKnowledge).toHaveProperty('playbooks');
|
|
706
|
+
expect(capturedKnowledge).toHaveProperty('experiences');
|
|
707
|
+
});
|
|
708
|
+
});
|
|
709
|
+
|
|
710
|
+
// ========================================================================
|
|
711
|
+
// 12. Playbook → Skill → Workspace round-trip
|
|
712
|
+
// ========================================================================
|
|
713
|
+
describe('playbook to workspace round-trip', () => {
|
|
714
|
+
it('should convert playbook to skill, write to workspace, and verify content integrity', async () => {
|
|
715
|
+
let capturedHandle: WorkspaceHandle | null = null;
|
|
716
|
+
|
|
717
|
+
const playbook = makePlaybook('null-safety-check', 'typescript');
|
|
718
|
+
const skills = convertPlaybooksToSkills([playbook]);
|
|
719
|
+
|
|
720
|
+
expect(skills).toHaveLength(1);
|
|
721
|
+
expect(skills[0].name).toBe('null-safety-check');
|
|
722
|
+
expect(skills[0].source).toBe('playbook-conversion');
|
|
723
|
+
|
|
724
|
+
const template = createFullTemplate({ skills });
|
|
725
|
+
const origPrepare = template.prepareWorkspace.bind(template);
|
|
726
|
+
template.prepareWorkspace = async (input, handle) => {
|
|
727
|
+
capturedHandle = handle;
|
|
728
|
+
await origPrepare(input, handle);
|
|
729
|
+
};
|
|
730
|
+
|
|
731
|
+
await runner.run(template, { code: 'x', language: 'typescript' });
|
|
732
|
+
|
|
733
|
+
// Read the SKILL.md that was written to workspace
|
|
734
|
+
const skillMd = await readFile(
|
|
735
|
+
join(capturedHandle!.dir('skills'), 'null-safety-check', 'SKILL.md'),
|
|
736
|
+
'utf-8',
|
|
737
|
+
);
|
|
738
|
+
|
|
739
|
+
// Verify all key sections from the playbook survived the conversion
|
|
740
|
+
expect(skillMd).toContain('# Null Safety Check');
|
|
741
|
+
expect(skillMd).toContain('## When to Use');
|
|
742
|
+
expect(skillMd).toContain('Analyzing typescript code for issues');
|
|
743
|
+
expect(skillMd).toContain('## Triggers');
|
|
744
|
+
expect(skillMd).toContain('typescript-analysis');
|
|
745
|
+
expect(skillMd).toContain('## When NOT to Use');
|
|
746
|
+
expect(skillMd).toContain('Runtime profiling');
|
|
747
|
+
expect(skillMd).toContain('## Strategy');
|
|
748
|
+
expect(skillMd).toContain('Parse the typescript code');
|
|
749
|
+
expect(skillMd).toContain('## Tactics');
|
|
750
|
+
expect(skillMd).toContain('Check for type errors first');
|
|
751
|
+
expect(skillMd).toContain('## Steps');
|
|
752
|
+
expect(skillMd).toContain('1. Read the source file');
|
|
753
|
+
expect(skillMd).toContain('## Example');
|
|
754
|
+
expect(skillMd).toContain("analyze(source, { language: 'typescript' })");
|
|
755
|
+
expect(skillMd).toContain('## Verification');
|
|
756
|
+
expect(skillMd).toContain('Output file is valid JSON');
|
|
757
|
+
expect(skillMd).toContain('## Context Notes');
|
|
758
|
+
expect(skillMd).toContain('monorepo');
|
|
759
|
+
expect(skillMd).toContain('Confidence: 90%');
|
|
760
|
+
});
|
|
761
|
+
});
|
|
762
|
+
|
|
763
|
+
// ========================================================================
|
|
764
|
+
// 13. Multiple sequential runs don't interfere
|
|
765
|
+
// ========================================================================
|
|
766
|
+
describe('sequential run isolation', () => {
|
|
767
|
+
it('should produce independent results across multiple runs', async () => {
|
|
768
|
+
const template1 = createFullTemplate({
|
|
769
|
+
outputData: {
|
|
770
|
+
issues: [{ line: 1, message: 'Issue A', severity: 'error' }],
|
|
771
|
+
summary: 'Run 1',
|
|
772
|
+
score: 0.5,
|
|
773
|
+
},
|
|
774
|
+
});
|
|
775
|
+
|
|
776
|
+
const template2 = createFullTemplate({
|
|
777
|
+
outputData: {
|
|
778
|
+
issues: [
|
|
779
|
+
{ line: 2, message: 'Issue B', severity: 'warning' },
|
|
780
|
+
{ line: 3, message: 'Issue C', severity: 'info' },
|
|
781
|
+
],
|
|
782
|
+
summary: 'Run 2',
|
|
783
|
+
score: 0.9,
|
|
784
|
+
},
|
|
785
|
+
});
|
|
786
|
+
|
|
787
|
+
const result1 = await runner.run(template1, { code: 'a', language: 'typescript' });
|
|
788
|
+
const result2 = await runner.run(template2, { code: 'b', language: 'typescript' });
|
|
789
|
+
|
|
790
|
+
expect(result1.output.summary).toBe('Run 1');
|
|
791
|
+
expect(result1.output.issues).toHaveLength(1);
|
|
792
|
+
expect(result1.output.score).toBe(0.5);
|
|
793
|
+
|
|
794
|
+
expect(result2.output.summary).toBe('Run 2');
|
|
795
|
+
expect(result2.output.issues).toHaveLength(2);
|
|
796
|
+
expect(result2.output.score).toBe(0.9);
|
|
797
|
+
|
|
798
|
+
// Both should have unique trajectory IDs
|
|
799
|
+
expect(result1.agentTrajectoryId).not.toBe(result2.agentTrajectoryId);
|
|
800
|
+
});
|
|
801
|
+
});
|
|
802
|
+
|
|
803
|
+
// ========================================================================
|
|
804
|
+
// 14. Error propagation and workspace retention
|
|
805
|
+
// ========================================================================
|
|
806
|
+
describe('error propagation', () => {
|
|
807
|
+
it('should include taskType in AgenticTaskOutputError', async () => {
|
|
808
|
+
const template = createFullTemplate({ failOnCollect: true });
|
|
809
|
+
|
|
810
|
+
try {
|
|
811
|
+
await runner.run(template, { code: 'x', language: 'typescript' });
|
|
812
|
+
expect.fail('Should have thrown');
|
|
813
|
+
} catch (error) {
|
|
814
|
+
expect(error).toBeInstanceOf(AgenticTaskOutputError);
|
|
815
|
+
expect((error as AgenticTaskOutputError).taskType).toBe('code-analysis');
|
|
816
|
+
expect((error as AgenticTaskOutputError).message).toContain('code-analysis');
|
|
817
|
+
}
|
|
818
|
+
});
|
|
819
|
+
});
|
|
820
|
+
|
|
821
|
+
// ========================================================================
|
|
822
|
+
// 15. Meta-learning receives the correct trajectory
|
|
823
|
+
// ========================================================================
|
|
824
|
+
describe('meta-learning integration', () => {
|
|
825
|
+
it('should feed the analysis agent trajectory to the learning pipeline', async () => {
|
|
826
|
+
const processTrajectory = vi.spyOn(learning, 'processTrajectory');
|
|
827
|
+
|
|
828
|
+
const template = createFullTemplate();
|
|
829
|
+
const result = await runner.run(template, { code: 'x', language: 'typescript' });
|
|
830
|
+
|
|
831
|
+
expect(processTrajectory).toHaveBeenCalledTimes(1);
|
|
832
|
+
|
|
833
|
+
const trajectory = processTrajectory.mock.calls[0][0];
|
|
834
|
+
expect(trajectory.id).toBe(result.agentTrajectoryId);
|
|
835
|
+
expect(trajectory.task.domain).toBe('static-analysis');
|
|
836
|
+
expect(trajectory.task.description).toContain('Analyze the typescript source code');
|
|
837
|
+
});
|
|
838
|
+
});
|
|
839
|
+
});
|