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.
Files changed (637) hide show
  1. package/.claude/settings.json +88 -0
  2. package/.claude/settings.local.json +11 -0
  3. package/.entire/settings.json +4 -0
  4. package/README.md +524 -254
  5. package/dist/atlas.d.ts +144 -6
  6. package/dist/atlas.d.ts.map +1 -1
  7. package/dist/atlas.js +339 -10
  8. package/dist/atlas.js.map +1 -1
  9. package/dist/embeddings/provider.d.ts.map +1 -1
  10. package/dist/embeddings/provider.js +6 -3
  11. package/dist/embeddings/provider.js.map +1 -1
  12. package/dist/index.d.ts +8 -6
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +37 -6
  15. package/dist/index.js.map +1 -1
  16. package/dist/learning/index.d.ts +5 -1
  17. package/dist/learning/index.d.ts.map +1 -1
  18. package/dist/learning/index.js +8 -2
  19. package/dist/learning/index.js.map +1 -1
  20. package/dist/learning/knowledge-extractor.d.ts +56 -0
  21. package/dist/learning/knowledge-extractor.d.ts.map +1 -0
  22. package/dist/learning/knowledge-extractor.js +336 -0
  23. package/dist/learning/knowledge-extractor.js.map +1 -0
  24. package/dist/learning/meta-learner.d.ts +7 -0
  25. package/dist/learning/meta-learner.d.ts.map +1 -1
  26. package/dist/learning/meta-learner.js +43 -0
  27. package/dist/learning/meta-learner.js.map +1 -1
  28. package/dist/learning/pipeline.d.ts +24 -0
  29. package/dist/learning/pipeline.d.ts.map +1 -1
  30. package/dist/learning/pipeline.js +70 -4
  31. package/dist/learning/pipeline.js.map +1 -1
  32. package/dist/learning/team-ingester.d.ts +152 -0
  33. package/dist/learning/team-ingester.d.ts.map +1 -0
  34. package/dist/learning/team-ingester.js +333 -0
  35. package/dist/learning/team-ingester.js.map +1 -0
  36. package/dist/learning/team-meta-learner.d.ts +50 -0
  37. package/dist/learning/team-meta-learner.d.ts.map +1 -0
  38. package/dist/learning/team-meta-learner.js +417 -0
  39. package/dist/learning/team-meta-learner.js.map +1 -0
  40. package/dist/learning/team-pipeline.d.ts +76 -0
  41. package/dist/learning/team-pipeline.d.ts.map +1 -0
  42. package/dist/learning/team-pipeline.js +266 -0
  43. package/dist/learning/team-pipeline.js.map +1 -0
  44. package/dist/learning/trajectory-sources/dataclaw.d.ts +41 -0
  45. package/dist/learning/trajectory-sources/dataclaw.d.ts.map +1 -0
  46. package/dist/learning/trajectory-sources/dataclaw.js +330 -0
  47. package/dist/learning/trajectory-sources/dataclaw.js.map +1 -0
  48. package/dist/learning/trajectory-sources/entire.d.ts +28 -0
  49. package/dist/learning/trajectory-sources/entire.d.ts.map +1 -0
  50. package/dist/learning/trajectory-sources/entire.js +182 -0
  51. package/dist/learning/trajectory-sources/entire.js.map +1 -0
  52. package/dist/learning/trajectory-sources/file.d.ts +23 -0
  53. package/dist/learning/trajectory-sources/file.d.ts.map +1 -0
  54. package/dist/learning/trajectory-sources/file.js +101 -0
  55. package/dist/learning/trajectory-sources/file.js.map +1 -0
  56. package/dist/learning/trajectory-sources/huggingface.d.ts +36 -0
  57. package/dist/learning/trajectory-sources/huggingface.d.ts.map +1 -0
  58. package/dist/learning/trajectory-sources/huggingface.js +157 -0
  59. package/dist/learning/trajectory-sources/huggingface.js.map +1 -0
  60. package/dist/learning/trajectory-sources/in-memory.d.ts +21 -0
  61. package/dist/learning/trajectory-sources/in-memory.d.ts.map +1 -0
  62. package/dist/learning/trajectory-sources/in-memory.js +43 -0
  63. package/dist/learning/trajectory-sources/in-memory.js.map +1 -0
  64. package/dist/learning/trajectory-sources/index.d.ts +7 -0
  65. package/dist/learning/trajectory-sources/index.d.ts.map +1 -0
  66. package/dist/learning/trajectory-sources/index.js +7 -0
  67. package/dist/learning/trajectory-sources/index.js.map +1 -0
  68. package/dist/learning/trajectory-sources/pipeline.d.ts +24 -0
  69. package/dist/learning/trajectory-sources/pipeline.d.ts.map +1 -0
  70. package/dist/learning/trajectory-sources/pipeline.js +47 -0
  71. package/dist/learning/trajectory-sources/pipeline.js.map +1 -0
  72. package/dist/memory/graph-layers/base.d.ts +29 -0
  73. package/dist/memory/graph-layers/base.d.ts.map +1 -0
  74. package/dist/memory/graph-layers/base.js +143 -0
  75. package/dist/memory/graph-layers/base.js.map +1 -0
  76. package/dist/memory/graph-layers/causal.d.ts +14 -0
  77. package/dist/memory/graph-layers/causal.d.ts.map +1 -0
  78. package/dist/memory/graph-layers/causal.js +14 -0
  79. package/dist/memory/graph-layers/causal.js.map +1 -0
  80. package/dist/memory/graph-layers/entity.d.ts +14 -0
  81. package/dist/memory/graph-layers/entity.d.ts.map +1 -0
  82. package/dist/memory/graph-layers/entity.js +14 -0
  83. package/dist/memory/graph-layers/entity.js.map +1 -0
  84. package/dist/memory/graph-layers/index.d.ts +6 -0
  85. package/dist/memory/graph-layers/index.d.ts.map +1 -0
  86. package/dist/memory/graph-layers/index.js +6 -0
  87. package/dist/memory/graph-layers/index.js.map +1 -0
  88. package/dist/memory/graph-layers/semantic.d.ts +14 -0
  89. package/dist/memory/graph-layers/semantic.d.ts.map +1 -0
  90. package/dist/memory/graph-layers/semantic.js +14 -0
  91. package/dist/memory/graph-layers/semantic.js.map +1 -0
  92. package/dist/memory/graph-layers/temporal.d.ts +14 -0
  93. package/dist/memory/graph-layers/temporal.d.ts.map +1 -0
  94. package/dist/memory/graph-layers/temporal.js +14 -0
  95. package/dist/memory/graph-layers/temporal.js.map +1 -0
  96. package/dist/memory/index.d.ts +8 -0
  97. package/dist/memory/index.d.ts.map +1 -1
  98. package/dist/memory/index.js +10 -0
  99. package/dist/memory/index.js.map +1 -1
  100. package/dist/memory/knowledge-bank.d.ts +220 -0
  101. package/dist/memory/knowledge-bank.d.ts.map +1 -0
  102. package/dist/memory/knowledge-bank.js +1003 -0
  103. package/dist/memory/knowledge-bank.js.map +1 -0
  104. package/dist/memory/knowledge-defrag.d.ts +49 -0
  105. package/dist/memory/knowledge-defrag.d.ts.map +1 -0
  106. package/dist/memory/knowledge-defrag.js +257 -0
  107. package/dist/memory/knowledge-defrag.js.map +1 -0
  108. package/dist/memory/knowledge-graph.d.ts +41 -0
  109. package/dist/memory/knowledge-graph.d.ts.map +1 -0
  110. package/dist/memory/knowledge-graph.js +273 -0
  111. package/dist/memory/knowledge-graph.js.map +1 -0
  112. package/dist/memory/search-provider.d.ts +31 -0
  113. package/dist/memory/search-provider.d.ts.map +1 -0
  114. package/dist/memory/search-provider.js +2 -0
  115. package/dist/memory/search-provider.js.map +1 -0
  116. package/dist/memory/search-providers/index.d.ts +3 -0
  117. package/dist/memory/search-providers/index.d.ts.map +1 -0
  118. package/dist/memory/search-providers/index.js +3 -0
  119. package/dist/memory/search-providers/index.js.map +1 -0
  120. package/dist/memory/search-providers/minimem.d.ts +43 -0
  121. package/dist/memory/search-providers/minimem.d.ts.map +1 -0
  122. package/dist/memory/search-providers/minimem.js +56 -0
  123. package/dist/memory/search-providers/minimem.js.map +1 -0
  124. package/dist/memory/search-providers/text-similarity.d.ts +15 -0
  125. package/dist/memory/search-providers/text-similarity.d.ts.map +1 -0
  126. package/dist/memory/search-providers/text-similarity.js +21 -0
  127. package/dist/memory/search-providers/text-similarity.js.map +1 -0
  128. package/dist/memory/skill-exporter.d.ts +75 -0
  129. package/dist/memory/skill-exporter.d.ts.map +1 -0
  130. package/dist/memory/skill-exporter.js +248 -0
  131. package/dist/memory/skill-exporter.js.map +1 -0
  132. package/dist/memory/system.d.ts +15 -3
  133. package/dist/memory/system.d.ts.map +1 -1
  134. package/dist/memory/system.js +46 -8
  135. package/dist/memory/system.js.map +1 -1
  136. package/dist/memory/team-experience.d.ts +298 -0
  137. package/dist/memory/team-experience.d.ts.map +1 -0
  138. package/dist/memory/team-experience.js +355 -0
  139. package/dist/memory/team-experience.js.map +1 -0
  140. package/dist/runtime/backends/acp-protocol.d.ts +49 -0
  141. package/dist/runtime/backends/acp-protocol.d.ts.map +1 -0
  142. package/dist/runtime/backends/acp-protocol.js +166 -0
  143. package/dist/runtime/backends/acp-protocol.js.map +1 -0
  144. package/dist/runtime/backends/acp.d.ts +26 -26
  145. package/dist/runtime/backends/acp.d.ts.map +1 -1
  146. package/dist/runtime/backends/acp.js +32 -156
  147. package/dist/runtime/backends/acp.js.map +1 -1
  148. package/dist/runtime/backends/index.d.ts +3 -1
  149. package/dist/runtime/backends/index.d.ts.map +1 -1
  150. package/dist/runtime/backends/index.js +3 -1
  151. package/dist/runtime/backends/index.js.map +1 -1
  152. package/dist/runtime/backends/macro-agent.d.ts +104 -0
  153. package/dist/runtime/backends/macro-agent.d.ts.map +1 -0
  154. package/dist/runtime/backends/macro-agent.js +107 -0
  155. package/dist/runtime/backends/macro-agent.js.map +1 -0
  156. package/dist/runtime/compute-provider.d.ts +87 -0
  157. package/dist/runtime/compute-provider.d.ts.map +1 -0
  158. package/dist/runtime/compute-provider.js +87 -0
  159. package/dist/runtime/compute-provider.js.map +1 -0
  160. package/dist/runtime/index.d.ts +3 -2
  161. package/dist/runtime/index.d.ts.map +1 -1
  162. package/dist/runtime/index.js +3 -1
  163. package/dist/runtime/index.js.map +1 -1
  164. package/dist/runtime/manager.d.ts +37 -4
  165. package/dist/runtime/manager.d.ts.map +1 -1
  166. package/dist/runtime/manager.js +139 -20
  167. package/dist/runtime/manager.js.map +1 -1
  168. package/dist/runtime/types.d.ts +38 -0
  169. package/dist/runtime/types.d.ts.map +1 -1
  170. package/dist/search/evaluator.d.ts +7 -0
  171. package/dist/search/evaluator.d.ts.map +1 -1
  172. package/dist/search/evaluator.js +24 -4
  173. package/dist/search/evaluator.js.map +1 -1
  174. package/dist/search/index.d.ts +1 -0
  175. package/dist/search/index.d.ts.map +1 -1
  176. package/dist/search/index.js +2 -0
  177. package/dist/search/index.js.map +1 -1
  178. package/dist/search/refinement-loop.d.ts +17 -0
  179. package/dist/search/refinement-loop.d.ts.map +1 -1
  180. package/dist/search/refinement-loop.js +77 -6
  181. package/dist/search/refinement-loop.js.map +1 -1
  182. package/dist/search/refinement-types.d.ts +2 -2
  183. package/dist/search/team-router.d.ts +91 -0
  184. package/dist/search/team-router.d.ts.map +1 -0
  185. package/dist/search/team-router.js +315 -0
  186. package/dist/search/team-router.js.map +1 -0
  187. package/dist/session-bank/git-reader.d.ts +39 -0
  188. package/dist/session-bank/git-reader.d.ts.map +1 -0
  189. package/dist/session-bank/git-reader.js +165 -0
  190. package/dist/session-bank/git-reader.js.map +1 -0
  191. package/dist/session-bank/index.d.ts +5 -0
  192. package/dist/session-bank/index.d.ts.map +1 -0
  193. package/dist/session-bank/index.js +4 -0
  194. package/dist/session-bank/index.js.map +1 -0
  195. package/dist/session-bank/parser.d.ts +39 -0
  196. package/dist/session-bank/parser.d.ts.map +1 -0
  197. package/dist/session-bank/parser.js +231 -0
  198. package/dist/session-bank/parser.js.map +1 -0
  199. package/dist/session-bank/session-bank.d.ts +35 -0
  200. package/dist/session-bank/session-bank.d.ts.map +1 -0
  201. package/dist/session-bank/session-bank.js +326 -0
  202. package/dist/session-bank/session-bank.js.map +1 -0
  203. package/dist/session-bank/types.d.ts +129 -0
  204. package/dist/session-bank/types.d.ts.map +1 -0
  205. package/dist/session-bank/types.js +7 -0
  206. package/dist/session-bank/types.js.map +1 -0
  207. package/dist/surfacing/index.d.ts +4 -0
  208. package/dist/surfacing/index.d.ts.map +1 -1
  209. package/dist/surfacing/index.js +3 -0
  210. package/dist/surfacing/index.js.map +1 -1
  211. package/dist/surfacing/publisher.d.ts +22 -0
  212. package/dist/surfacing/publisher.d.ts.map +1 -0
  213. package/dist/surfacing/publisher.js +9 -0
  214. package/dist/surfacing/publisher.js.map +1 -0
  215. package/dist/surfacing/skill-library.d.ts +12 -0
  216. package/dist/surfacing/skill-library.d.ts.map +1 -1
  217. package/dist/surfacing/skill-library.js +26 -0
  218. package/dist/surfacing/skill-library.js.map +1 -1
  219. package/dist/surfacing/skill-publisher.d.ts +43 -0
  220. package/dist/surfacing/skill-publisher.d.ts.map +1 -0
  221. package/dist/surfacing/skill-publisher.js +197 -0
  222. package/dist/surfacing/skill-publisher.js.map +1 -0
  223. package/dist/surfacing/sqlite-storage-adapter.d.ts +42 -0
  224. package/dist/surfacing/sqlite-storage-adapter.d.ts.map +1 -0
  225. package/dist/surfacing/sqlite-storage-adapter.js +207 -0
  226. package/dist/surfacing/sqlite-storage-adapter.js.map +1 -0
  227. package/dist/surfacing/team-skill-library.d.ts +180 -0
  228. package/dist/surfacing/team-skill-library.d.ts.map +1 -0
  229. package/dist/surfacing/team-skill-library.js +384 -0
  230. package/dist/surfacing/team-skill-library.js.map +1 -0
  231. package/dist/types/config.d.ts +1218 -44
  232. package/dist/types/config.d.ts.map +1 -1
  233. package/dist/types/config.js +216 -0
  234. package/dist/types/config.js.map +1 -1
  235. package/dist/types/dataclaw.d.ts +286 -0
  236. package/dist/types/dataclaw.d.ts.map +1 -0
  237. package/dist/types/dataclaw.js +84 -0
  238. package/dist/types/dataclaw.js.map +1 -0
  239. package/dist/types/index.d.ts +8 -1
  240. package/dist/types/index.d.ts.map +1 -1
  241. package/dist/types/index.js +13 -1
  242. package/dist/types/index.js.map +1 -1
  243. package/dist/types/knowledge-graph.d.ts +148 -0
  244. package/dist/types/knowledge-graph.d.ts.map +1 -0
  245. package/dist/types/knowledge-graph.js +40 -0
  246. package/dist/types/knowledge-graph.js.map +1 -0
  247. package/dist/types/knowledge.d.ts +280 -0
  248. package/dist/types/knowledge.d.ts.map +1 -0
  249. package/dist/types/knowledge.js +191 -0
  250. package/dist/types/knowledge.js.map +1 -0
  251. package/dist/types/team-meta.d.ts +160 -0
  252. package/dist/types/team-meta.d.ts.map +1 -0
  253. package/dist/types/team-meta.js +42 -0
  254. package/dist/types/team-meta.js.map +1 -0
  255. package/dist/types/team-playbook.d.ts +276 -0
  256. package/dist/types/team-playbook.d.ts.map +1 -0
  257. package/dist/types/team-playbook.js +85 -0
  258. package/dist/types/team-playbook.js.map +1 -0
  259. package/dist/types/team-trajectory.d.ts +305 -0
  260. package/dist/types/team-trajectory.d.ts.map +1 -0
  261. package/dist/types/team-trajectory.js +304 -0
  262. package/dist/types/team-trajectory.js.map +1 -0
  263. package/dist/types/trajectory-source.d.ts +39 -0
  264. package/dist/types/trajectory-source.d.ts.map +1 -0
  265. package/dist/types/trajectory-source.js +2 -0
  266. package/dist/types/trajectory-source.js.map +1 -0
  267. package/dist/utils/frontmatter.d.ts +34 -0
  268. package/dist/utils/frontmatter.d.ts.map +1 -0
  269. package/dist/utils/frontmatter.js +93 -0
  270. package/dist/utils/frontmatter.js.map +1 -0
  271. package/dist/utils/index.d.ts +1 -0
  272. package/dist/utils/index.d.ts.map +1 -1
  273. package/dist/utils/index.js +1 -0
  274. package/dist/utils/index.js.map +1 -1
  275. package/dist/workspace/index.d.ts +6 -0
  276. package/dist/workspace/index.d.ts.map +1 -0
  277. package/dist/workspace/index.js +11 -0
  278. package/dist/workspace/index.js.map +1 -0
  279. package/dist/workspace/runner.d.ts +50 -0
  280. package/dist/workspace/runner.d.ts.map +1 -0
  281. package/dist/workspace/runner.js +219 -0
  282. package/dist/workspace/runner.js.map +1 -0
  283. package/dist/workspace/skill-converter.d.ts +18 -0
  284. package/dist/workspace/skill-converter.d.ts.map +1 -0
  285. package/dist/workspace/skill-converter.js +257 -0
  286. package/dist/workspace/skill-converter.js.map +1 -0
  287. package/dist/workspace/templates/index.d.ts +11 -0
  288. package/dist/workspace/templates/index.d.ts.map +1 -0
  289. package/dist/workspace/templates/index.js +21 -0
  290. package/dist/workspace/templates/index.js.map +1 -0
  291. package/dist/workspace/templates/knowledge-defrag.d.ts +25 -0
  292. package/dist/workspace/templates/knowledge-defrag.d.ts.map +1 -0
  293. package/dist/workspace/templates/knowledge-defrag.js +154 -0
  294. package/dist/workspace/templates/knowledge-defrag.js.map +1 -0
  295. package/dist/workspace/templates/knowledge-extraction.d.ts +25 -0
  296. package/dist/workspace/templates/knowledge-extraction.d.ts.map +1 -0
  297. package/dist/workspace/templates/knowledge-extraction.js +246 -0
  298. package/dist/workspace/templates/knowledge-extraction.js.map +1 -0
  299. package/dist/workspace/templates/meta-reflection.d.ts +47 -0
  300. package/dist/workspace/templates/meta-reflection.d.ts.map +1 -0
  301. package/dist/workspace/templates/meta-reflection.js +135 -0
  302. package/dist/workspace/templates/meta-reflection.js.map +1 -0
  303. package/dist/workspace/templates/playbook-extraction.d.ts +20 -0
  304. package/dist/workspace/templates/playbook-extraction.d.ts.map +1 -0
  305. package/dist/workspace/templates/playbook-extraction.js +189 -0
  306. package/dist/workspace/templates/playbook-extraction.js.map +1 -0
  307. package/dist/workspace/templates/refinement-analysis.d.ts +31 -0
  308. package/dist/workspace/templates/refinement-analysis.d.ts.map +1 -0
  309. package/dist/workspace/templates/refinement-analysis.js +107 -0
  310. package/dist/workspace/templates/refinement-analysis.js.map +1 -0
  311. package/dist/workspace/templates/solution-evaluation.d.ts +21 -0
  312. package/dist/workspace/templates/solution-evaluation.d.ts.map +1 -0
  313. package/dist/workspace/templates/solution-evaluation.js +131 -0
  314. package/dist/workspace/templates/solution-evaluation.js.map +1 -0
  315. package/dist/workspace/templates/team-playbook-extraction.d.ts +44 -0
  316. package/dist/workspace/templates/team-playbook-extraction.d.ts.map +1 -0
  317. package/dist/workspace/templates/team-playbook-extraction.js +497 -0
  318. package/dist/workspace/templates/team-playbook-extraction.js.map +1 -0
  319. package/dist/workspace/templates/team-trajectory-analysis.d.ts +19 -0
  320. package/dist/workspace/templates/team-trajectory-analysis.d.ts.map +1 -0
  321. package/dist/workspace/templates/team-trajectory-analysis.js +442 -0
  322. package/dist/workspace/templates/team-trajectory-analysis.js.map +1 -0
  323. package/dist/workspace/templates/trajectory-analysis.d.ts +19 -0
  324. package/dist/workspace/templates/trajectory-analysis.d.ts.map +1 -0
  325. package/dist/workspace/templates/trajectory-analysis.js +170 -0
  326. package/dist/workspace/templates/trajectory-analysis.js.map +1 -0
  327. package/dist/workspace/templates/usage-inference.d.ts +19 -0
  328. package/dist/workspace/templates/usage-inference.d.ts.map +1 -0
  329. package/dist/workspace/templates/usage-inference.js +125 -0
  330. package/dist/workspace/templates/usage-inference.js.map +1 -0
  331. package/dist/workspace/types.d.ts +145 -0
  332. package/dist/workspace/types.d.ts.map +1 -0
  333. package/dist/workspace/types.js +17 -0
  334. package/dist/workspace/types.js.map +1 -0
  335. package/docs/DESIGN-agentic-workspace.md +2057 -0
  336. package/docs/DESIGN-semantic-memory-knowledge-bank.md +1789 -0
  337. package/docs/DESIGN-session-bank.md +1134 -0
  338. package/docs/DESIGN-team-extraction-pipeline.md +1369 -0
  339. package/docs/DESIGN-workspace-migration.md +1079 -0
  340. package/docs/PLAN-agentic-workspace-implementation.md +717 -0
  341. package/docs/PLAN-graph-migration.md +299 -0
  342. package/docs/PLAN-session-bank-implementation.md +474 -0
  343. package/docs/PROPOSAL-team-aware-learning.md +1080 -0
  344. package/docs/RESEARCH-semantic-memory-knowledge-structures.md +517 -0
  345. package/docs/RESEARCH-team-trajectory-learning.md +553 -0
  346. package/gaps.md +204 -0
  347. package/package.json +24 -6
  348. package/references/agent-workspace/CLAUDE.md +74 -0
  349. package/references/agent-workspace/README.md +587 -0
  350. package/references/agent-workspace/media/banner.png +0 -0
  351. package/references/agent-workspace/package-lock.json +2061 -0
  352. package/references/agent-workspace/package.json +54 -0
  353. package/references/agent-workspace/src/handle.ts +122 -0
  354. package/references/agent-workspace/src/index.ts +32 -0
  355. package/references/agent-workspace/src/manager.ts +102 -0
  356. package/references/agent-workspace/src/readers/json.ts +71 -0
  357. package/references/agent-workspace/src/readers/markdown.ts +37 -0
  358. package/references/agent-workspace/src/readers/raw.ts +27 -0
  359. package/references/agent-workspace/src/types.ts +68 -0
  360. package/references/agent-workspace/src/validation.ts +93 -0
  361. package/references/agent-workspace/src/writers/json.ts +17 -0
  362. package/references/agent-workspace/src/writers/markdown.ts +27 -0
  363. package/references/agent-workspace/src/writers/raw.ts +22 -0
  364. package/references/agent-workspace/tests/errors.test.ts +652 -0
  365. package/references/agent-workspace/tests/handle.test.ts +144 -0
  366. package/references/agent-workspace/tests/manager.test.ts +124 -0
  367. package/references/agent-workspace/tests/readers.test.ts +205 -0
  368. package/references/agent-workspace/tests/validation.test.ts +196 -0
  369. package/references/agent-workspace/tests/writers.test.ts +108 -0
  370. package/references/agent-workspace/tsconfig.json +20 -0
  371. package/references/agent-workspace/tsup.config.ts +9 -0
  372. package/references/minimem/.claude/settings.json +7 -0
  373. package/references/minimem/.sudocode/issues.jsonl +18 -0
  374. package/references/minimem/.sudocode/specs.jsonl +1 -0
  375. package/references/minimem/CLAUDE.md +310 -0
  376. package/references/minimem/README.md +556 -0
  377. package/references/minimem/claude-plugin/.claude-plugin/plugin.json +10 -0
  378. package/references/minimem/claude-plugin/.mcp.json +7 -0
  379. package/references/minimem/claude-plugin/README.md +158 -0
  380. package/references/minimem/claude-plugin/commands/recall.md +47 -0
  381. package/references/minimem/claude-plugin/commands/remember.md +41 -0
  382. package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +272 -0
  383. package/references/minimem/claude-plugin/hooks/hooks.json +27 -0
  384. package/references/minimem/claude-plugin/hooks/session-end.sh +86 -0
  385. package/references/minimem/claude-plugin/hooks/session-start.sh +85 -0
  386. package/references/minimem/claude-plugin/skills/memory/SKILL.md +108 -0
  387. package/references/minimem/package-lock.json +5373 -0
  388. package/references/minimem/package.json +60 -0
  389. package/references/minimem/scripts/postbuild.js +35 -0
  390. package/references/minimem/src/__tests__/edge-cases.test.ts +371 -0
  391. package/references/minimem/src/__tests__/errors.test.ts +265 -0
  392. package/references/minimem/src/__tests__/helpers.ts +199 -0
  393. package/references/minimem/src/__tests__/internal.test.ts +407 -0
  394. package/references/minimem/src/__tests__/knowledge.test.ts +287 -0
  395. package/references/minimem/src/__tests__/minimem.integration.test.ts +1127 -0
  396. package/references/minimem/src/__tests__/session.test.ts +190 -0
  397. package/references/minimem/src/cli/__tests__/commands.test.ts +759 -0
  398. package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +141 -0
  399. package/references/minimem/src/cli/commands/append.ts +76 -0
  400. package/references/minimem/src/cli/commands/config.ts +262 -0
  401. package/references/minimem/src/cli/commands/conflicts.ts +413 -0
  402. package/references/minimem/src/cli/commands/daemon.ts +169 -0
  403. package/references/minimem/src/cli/commands/index.ts +12 -0
  404. package/references/minimem/src/cli/commands/init.ts +88 -0
  405. package/references/minimem/src/cli/commands/mcp.ts +177 -0
  406. package/references/minimem/src/cli/commands/push-pull.ts +213 -0
  407. package/references/minimem/src/cli/commands/search.ts +158 -0
  408. package/references/minimem/src/cli/commands/status.ts +84 -0
  409. package/references/minimem/src/cli/commands/sync-init.ts +290 -0
  410. package/references/minimem/src/cli/commands/sync.ts +70 -0
  411. package/references/minimem/src/cli/commands/upsert.ts +197 -0
  412. package/references/minimem/src/cli/config.ts +584 -0
  413. package/references/minimem/src/cli/index.ts +264 -0
  414. package/references/minimem/src/cli/shared.ts +161 -0
  415. package/references/minimem/src/cli/sync/__tests__/central.test.ts +152 -0
  416. package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +209 -0
  417. package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +118 -0
  418. package/references/minimem/src/cli/sync/__tests__/detection.test.ts +207 -0
  419. package/references/minimem/src/cli/sync/__tests__/integration.test.ts +476 -0
  420. package/references/minimem/src/cli/sync/__tests__/registry.test.ts +363 -0
  421. package/references/minimem/src/cli/sync/__tests__/state.test.ts +255 -0
  422. package/references/minimem/src/cli/sync/__tests__/validation.test.ts +193 -0
  423. package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +178 -0
  424. package/references/minimem/src/cli/sync/central.ts +292 -0
  425. package/references/minimem/src/cli/sync/conflicts.ts +204 -0
  426. package/references/minimem/src/cli/sync/daemon.ts +407 -0
  427. package/references/minimem/src/cli/sync/detection.ts +138 -0
  428. package/references/minimem/src/cli/sync/index.ts +107 -0
  429. package/references/minimem/src/cli/sync/operations.ts +373 -0
  430. package/references/minimem/src/cli/sync/registry.ts +279 -0
  431. package/references/minimem/src/cli/sync/state.ts +355 -0
  432. package/references/minimem/src/cli/sync/validation.ts +206 -0
  433. package/references/minimem/src/cli/sync/watcher.ts +234 -0
  434. package/references/minimem/src/cli/version.ts +34 -0
  435. package/references/minimem/src/core/index.ts +9 -0
  436. package/references/minimem/src/core/indexer.ts +628 -0
  437. package/references/minimem/src/core/searcher.ts +221 -0
  438. package/references/minimem/src/db/schema.ts +183 -0
  439. package/references/minimem/src/db/sqlite-vec.ts +24 -0
  440. package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +431 -0
  441. package/references/minimem/src/embeddings/batch-gemini.ts +392 -0
  442. package/references/minimem/src/embeddings/batch-openai.ts +409 -0
  443. package/references/minimem/src/embeddings/embeddings.ts +434 -0
  444. package/references/minimem/src/index.ts +109 -0
  445. package/references/minimem/src/internal.ts +299 -0
  446. package/references/minimem/src/minimem.ts +1276 -0
  447. package/references/minimem/src/search/__tests__/hybrid.test.ts +247 -0
  448. package/references/minimem/src/search/graph.ts +234 -0
  449. package/references/minimem/src/search/hybrid.ts +151 -0
  450. package/references/minimem/src/search/search.ts +256 -0
  451. package/references/minimem/src/server/__tests__/mcp.test.ts +341 -0
  452. package/references/minimem/src/server/__tests__/tools.test.ts +364 -0
  453. package/references/minimem/src/server/mcp.ts +326 -0
  454. package/references/minimem/src/server/tools.ts +720 -0
  455. package/references/minimem/src/session.ts +460 -0
  456. package/references/minimem/tsconfig.json +19 -0
  457. package/references/minimem/tsup.config.ts +26 -0
  458. package/references/minimem/vitest.config.ts +24 -0
  459. package/references/skill-tree/.claude/settings.json +6 -0
  460. package/references/skill-tree/.sudocode/issues.jsonl +11 -0
  461. package/references/skill-tree/.sudocode/specs.jsonl +1 -0
  462. package/references/skill-tree/CLAUDE.md +150 -0
  463. package/references/skill-tree/README.md +324 -0
  464. package/references/skill-tree/docs/GAPS_v1.md +221 -0
  465. package/references/skill-tree/docs/INTEGRATION_PLAN.md +467 -0
  466. package/references/skill-tree/docs/TODOS.md +91 -0
  467. package/references/skill-tree/docs/anthropic_skill_guide.md +1364 -0
  468. package/references/skill-tree/docs/design/federated-skill-trees.md +524 -0
  469. package/references/skill-tree/docs/design/multi-agent-sync.md +759 -0
  470. package/references/skill-tree/docs/scraper/BRAINSTORM.md +583 -0
  471. package/references/skill-tree/docs/scraper/POC_PLAN.md +420 -0
  472. package/references/skill-tree/docs/scraper/README.md +170 -0
  473. package/references/skill-tree/examples/basic-usage.ts +190 -0
  474. package/references/skill-tree/package-lock.json +1509 -0
  475. package/references/skill-tree/package.json +66 -0
  476. package/references/skill-tree/scraper/README.md +123 -0
  477. package/references/skill-tree/scraper/docs/DESIGN.md +683 -0
  478. package/references/skill-tree/scraper/docs/PLAN.md +336 -0
  479. package/references/skill-tree/scraper/drizzle.config.ts +10 -0
  480. package/references/skill-tree/scraper/package-lock.json +6329 -0
  481. package/references/skill-tree/scraper/package.json +68 -0
  482. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +7 -0
  483. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +7 -0
  484. package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +27 -0
  485. package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +21 -0
  486. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +54 -0
  487. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +24 -0
  488. package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +93 -0
  489. package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +22 -0
  490. package/references/skill-tree/scraper/tsup.config.ts +14 -0
  491. package/references/skill-tree/scraper/vitest.config.ts +17 -0
  492. package/references/skill-tree/scripts/convert-to-vitest.ts +166 -0
  493. package/references/skill-tree/skills/skill-writer/SKILL.md +339 -0
  494. package/references/skill-tree/skills/skill-writer/references/examples.md +326 -0
  495. package/references/skill-tree/skills/skill-writer/references/patterns.md +210 -0
  496. package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +123 -0
  497. package/references/skill-tree/test/run-all.ts +106 -0
  498. package/references/skill-tree/test/utils.ts +128 -0
  499. package/references/skill-tree/vitest.config.ts +16 -0
  500. package/src/atlas.ts +525 -13
  501. package/src/embeddings/provider.ts +10 -3
  502. package/src/index.ts +127 -5
  503. package/src/learning/index.ts +41 -6
  504. package/src/learning/knowledge-extractor.ts +470 -0
  505. package/src/learning/meta-learner.ts +54 -0
  506. package/src/learning/pipeline.ts +87 -8
  507. package/src/learning/team-ingester.ts +499 -0
  508. package/src/learning/team-meta-learner.ts +558 -0
  509. package/src/learning/team-pipeline.ts +364 -0
  510. package/src/learning/trajectory-sources/dataclaw.ts +403 -0
  511. package/src/learning/trajectory-sources/entire.ts +240 -0
  512. package/src/learning/trajectory-sources/file.ts +136 -0
  513. package/src/learning/trajectory-sources/huggingface.ts +248 -0
  514. package/src/learning/trajectory-sources/in-memory.ts +61 -0
  515. package/src/learning/trajectory-sources/index.ts +15 -0
  516. package/src/learning/trajectory-sources/pipeline.ts +69 -0
  517. package/src/memory/graph-layers/base.ts +184 -0
  518. package/src/memory/graph-layers/causal.ts +16 -0
  519. package/src/memory/graph-layers/entity.ts +16 -0
  520. package/src/memory/graph-layers/index.ts +5 -0
  521. package/src/memory/graph-layers/semantic.ts +16 -0
  522. package/src/memory/graph-layers/temporal.ts +16 -0
  523. package/src/memory/index.ts +45 -0
  524. package/src/memory/knowledge-bank.ts +1260 -0
  525. package/src/memory/knowledge-defrag.ts +329 -0
  526. package/src/memory/knowledge-graph.ts +361 -0
  527. package/src/memory/search-provider.ts +35 -0
  528. package/src/memory/search-providers/index.ts +3 -0
  529. package/src/memory/search-providers/minimem.ts +84 -0
  530. package/src/memory/search-providers/text-similarity.ts +35 -0
  531. package/src/memory/skill-exporter.ts +357 -0
  532. package/src/memory/system.ts +61 -8
  533. package/src/memory/team-experience.ts +604 -0
  534. package/src/runtime/backends/acp-protocol.ts +231 -0
  535. package/src/runtime/backends/acp.ts +57 -196
  536. package/src/runtime/backends/index.ts +14 -0
  537. package/src/runtime/backends/macro-agent.ts +177 -0
  538. package/src/runtime/compute-provider.ts +206 -0
  539. package/src/runtime/index.ts +22 -0
  540. package/src/runtime/manager.ts +167 -23
  541. package/src/runtime/types.ts +41 -0
  542. package/src/search/evaluator.ts +29 -4
  543. package/src/search/index.ts +9 -0
  544. package/src/search/refinement-loop.ts +106 -12
  545. package/src/search/team-router.ts +459 -0
  546. package/src/session-bank/git-reader.ts +190 -0
  547. package/src/session-bank/index.ts +24 -0
  548. package/src/session-bank/parser.ts +366 -0
  549. package/src/session-bank/session-bank.ts +464 -0
  550. package/src/session-bank/types.ts +173 -0
  551. package/src/surfacing/index.ts +23 -0
  552. package/src/surfacing/publisher.ts +23 -0
  553. package/src/surfacing/skill-library.ts +31 -0
  554. package/src/surfacing/skill-publisher.ts +223 -0
  555. package/src/surfacing/sqlite-storage-adapter.ts +301 -0
  556. package/src/surfacing/team-skill-library.ts +610 -0
  557. package/src/types/config.ts +252 -0
  558. package/src/types/dataclaw.ts +99 -0
  559. package/src/types/huggingface-transformers.d.ts +12 -0
  560. package/src/types/index.ts +156 -0
  561. package/src/types/knowledge-graph.ts +246 -0
  562. package/src/types/knowledge.ts +388 -0
  563. package/src/types/team-meta.ts +212 -0
  564. package/src/types/team-playbook.ts +384 -0
  565. package/src/types/team-trajectory.ts +673 -0
  566. package/src/types/trajectory-source.ts +47 -0
  567. package/src/utils/frontmatter.ts +118 -0
  568. package/src/utils/index.ts +7 -0
  569. package/src/workspace/index.ts +48 -0
  570. package/src/workspace/runner.ts +281 -0
  571. package/src/workspace/skill-converter.ts +288 -0
  572. package/src/workspace/templates/index.ts +64 -0
  573. package/src/workspace/templates/knowledge-defrag.ts +223 -0
  574. package/src/workspace/templates/knowledge-extraction.ts +337 -0
  575. package/src/workspace/templates/meta-reflection.ts +208 -0
  576. package/src/workspace/templates/playbook-extraction.ts +240 -0
  577. package/src/workspace/templates/refinement-analysis.ts +162 -0
  578. package/src/workspace/templates/solution-evaluation.ts +199 -0
  579. package/src/workspace/templates/team-playbook-extraction.ts +631 -0
  580. package/src/workspace/templates/team-trajectory-analysis.ts +564 -0
  581. package/src/workspace/templates/trajectory-analysis.ts +234 -0
  582. package/src/workspace/templates/usage-inference.ts +163 -0
  583. package/src/workspace/types.ts +233 -0
  584. package/tests/atlas-knowledge.test.ts +165 -0
  585. package/tests/gap-fixes.test.ts +1103 -0
  586. package/tests/integration/dataclaw-e2e.test.ts +559 -0
  587. package/tests/integration/e2e.test.ts +407 -0
  588. package/tests/integration/entire-e2e.test.ts +187 -0
  589. package/tests/integration/huggingface-e2e.test.ts +627 -0
  590. package/tests/integration/session-bank.test.ts +225 -0
  591. package/tests/integration/skill-tree-wiring.test.ts +152 -0
  592. package/tests/learning/dataclaw-trajectory-source.test.ts +642 -0
  593. package/tests/learning/entire-trajectory-source.test.ts +380 -0
  594. package/tests/learning/huggingface-trajectory-source.test.ts +817 -0
  595. package/tests/learning/knowledge-extractor.test.ts +491 -0
  596. package/tests/learning/team-ingester.test.ts +349 -0
  597. package/tests/learning/team-meta-learner.test.ts +618 -0
  598. package/tests/learning/team-pipeline.test.ts +334 -0
  599. package/tests/learning/trajectory-sources.test.ts +312 -0
  600. package/tests/memory/graph-layers/semantic.test.ts +219 -0
  601. package/tests/memory/knowledge-bank-extraction.test.ts +558 -0
  602. package/tests/memory/knowledge-bank.test.ts +705 -0
  603. package/tests/memory/knowledge-defrag.test.ts +366 -0
  604. package/tests/memory/knowledge-evolution.test.ts +563 -0
  605. package/tests/memory/knowledge-graph.test.ts +492 -0
  606. package/tests/memory/knowledge-inbox.test.ts +258 -0
  607. package/tests/memory/knowledge-minimem.test.ts +251 -0
  608. package/tests/memory/skill-exporter.test.ts +470 -0
  609. package/tests/memory/team-experience.test.ts +411 -0
  610. package/tests/runtime/agent-manager.test.ts +1 -1
  611. package/tests/runtime/compute-provider.test.ts +288 -0
  612. package/tests/runtime/delegate.test.ts +349 -0
  613. package/tests/runtime/macro-agent-backend.test.ts +266 -0
  614. package/tests/search/team-router.test.ts +376 -0
  615. package/tests/session-bank/fixtures/multi-tool-session/full.jsonl +12 -0
  616. package/tests/session-bank/fixtures/multi-tool-session/metadata.json +28 -0
  617. package/tests/session-bank/fixtures/root-metadata.json +18 -0
  618. package/tests/session-bank/fixtures/simple-session/full.jsonl +6 -0
  619. package/tests/session-bank/fixtures/simple-session/metadata.json +38 -0
  620. package/tests/session-bank/git-reader.test.ts +232 -0
  621. package/tests/session-bank/parser.test.ts +321 -0
  622. package/tests/session-bank/session-bank.test.ts +546 -0
  623. package/tests/surfacing/skill-publisher.test.ts +398 -0
  624. package/tests/surfacing/sqlite-storage-adapter.test.ts +218 -0
  625. package/tests/surfacing/team-skill-library.test.ts +444 -0
  626. package/tests/types/team-meta.test.ts +147 -0
  627. package/tests/types/team-playbook.test.ts +246 -0
  628. package/tests/types/team-trajectory.test.ts +557 -0
  629. package/tests/utils/frontmatter.test.ts +208 -0
  630. package/tests/workspace/full-flow.test.ts +839 -0
  631. package/tests/workspace/manager.test.ts +215 -0
  632. package/tests/workspace/runner.test.ts +330 -0
  633. package/tests/workspace/skill-converter.test.ts +205 -0
  634. package/tests/workspace/templates/knowledge-extraction.test.ts +235 -0
  635. package/tests/workspace/templates/team-playbook-extraction.test.ts +341 -0
  636. package/tests/workspace/templates/team-trajectory-analysis.test.ts +417 -0
  637. 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
+ });