@soleri/core 9.0.4 → 9.2.0

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 (701) hide show
  1. package/dist/brain/intelligence.d.ts +27 -0
  2. package/dist/brain/intelligence.d.ts.map +1 -1
  3. package/dist/brain/intelligence.js +160 -14
  4. package/dist/brain/intelligence.js.map +1 -1
  5. package/dist/brain/learning-radar.d.ts +4 -0
  6. package/dist/brain/learning-radar.d.ts.map +1 -1
  7. package/dist/brain/learning-radar.js +20 -1
  8. package/dist/brain/learning-radar.js.map +1 -1
  9. package/dist/brain/strength-scorer.d.ts +31 -0
  10. package/dist/brain/strength-scorer.d.ts.map +1 -0
  11. package/dist/brain/strength-scorer.js +264 -0
  12. package/dist/brain/strength-scorer.js.map +1 -0
  13. package/dist/chat/agent-loop.d.ts.map +1 -1
  14. package/dist/chat/agent-loop.js +2 -0
  15. package/dist/chat/agent-loop.js.map +1 -1
  16. package/dist/chat/notifications.d.ts.map +1 -1
  17. package/dist/chat/notifications.js +2 -0
  18. package/dist/chat/notifications.js.map +1 -1
  19. package/dist/claudemd/compose.js +1 -1
  20. package/dist/claudemd/compose.js.map +1 -1
  21. package/dist/control/intent-router.d.ts.map +1 -1
  22. package/dist/control/intent-router.js +12 -4
  23. package/dist/control/intent-router.js.map +1 -1
  24. package/dist/curator/contradiction-detector.d.ts +27 -0
  25. package/dist/curator/contradiction-detector.d.ts.map +1 -0
  26. package/dist/curator/contradiction-detector.js +62 -0
  27. package/dist/curator/contradiction-detector.js.map +1 -0
  28. package/dist/curator/curator.d.ts +3 -4
  29. package/dist/curator/curator.d.ts.map +1 -1
  30. package/dist/curator/curator.js +90 -525
  31. package/dist/curator/curator.js.map +1 -1
  32. package/dist/curator/duplicate-detector.d.ts +14 -0
  33. package/dist/curator/duplicate-detector.d.ts.map +1 -0
  34. package/dist/curator/duplicate-detector.js +77 -0
  35. package/dist/curator/duplicate-detector.js.map +1 -0
  36. package/dist/curator/health-audit.d.ts +15 -0
  37. package/dist/curator/health-audit.d.ts.map +1 -0
  38. package/dist/curator/health-audit.js +97 -0
  39. package/dist/curator/health-audit.js.map +1 -0
  40. package/dist/curator/metadata-enricher.d.ts +17 -0
  41. package/dist/curator/metadata-enricher.d.ts.map +1 -0
  42. package/dist/curator/metadata-enricher.js +60 -0
  43. package/dist/curator/metadata-enricher.js.map +1 -0
  44. package/dist/curator/schema.d.ts +7 -0
  45. package/dist/curator/schema.d.ts.map +1 -0
  46. package/dist/curator/schema.js +62 -0
  47. package/dist/curator/schema.js.map +1 -0
  48. package/dist/curator/tag-manager.d.ts +36 -0
  49. package/dist/curator/tag-manager.d.ts.map +1 -0
  50. package/dist/curator/tag-manager.js +78 -0
  51. package/dist/curator/tag-manager.js.map +1 -0
  52. package/dist/engine/bin/soleri-engine.js +24 -3
  53. package/dist/engine/bin/soleri-engine.js.map +1 -1
  54. package/dist/engine/core-ops.d.ts.map +1 -1
  55. package/dist/engine/core-ops.js +23 -8
  56. package/dist/engine/core-ops.js.map +1 -1
  57. package/dist/engine/module-manifest.d.ts.map +1 -1
  58. package/dist/engine/module-manifest.js +22 -2
  59. package/dist/engine/module-manifest.js.map +1 -1
  60. package/dist/engine/register-engine.d.ts.map +1 -1
  61. package/dist/engine/register-engine.js +26 -2
  62. package/dist/engine/register-engine.js.map +1 -1
  63. package/dist/errors/retry.d.ts.map +1 -1
  64. package/dist/errors/retry.js +2 -0
  65. package/dist/errors/retry.js.map +1 -1
  66. package/dist/facades/types.d.ts +1 -1
  67. package/dist/flows/chain-types.d.ts +18 -18
  68. package/dist/flows/gate-evaluator.d.ts.map +1 -1
  69. package/dist/flows/gate-evaluator.js +22 -0
  70. package/dist/flows/gate-evaluator.js.map +1 -1
  71. package/dist/flows/types.d.ts +157 -28
  72. package/dist/flows/types.d.ts.map +1 -1
  73. package/dist/flows/types.js +4 -0
  74. package/dist/flows/types.js.map +1 -1
  75. package/dist/index.d.ts +10 -2
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +9 -1
  78. package/dist/index.js.map +1 -1
  79. package/dist/intake/intake-pipeline.d.ts.map +1 -1
  80. package/dist/intake/intake-pipeline.js +1 -0
  81. package/dist/intake/intake-pipeline.js.map +1 -1
  82. package/dist/intake/text-ingester.d.ts.map +1 -1
  83. package/dist/intake/text-ingester.js +2 -0
  84. package/dist/intake/text-ingester.js.map +1 -1
  85. package/dist/llm/key-pool.d.ts +1 -1
  86. package/dist/llm/key-pool.d.ts.map +1 -1
  87. package/dist/llm/key-pool.js +3 -4
  88. package/dist/llm/key-pool.js.map +1 -1
  89. package/dist/llm/utils.d.ts.map +1 -1
  90. package/dist/llm/utils.js +2 -0
  91. package/dist/llm/utils.js.map +1 -1
  92. package/dist/migrations/migration-runner.test-helpers.d.ts +13 -0
  93. package/dist/migrations/migration-runner.test-helpers.d.ts.map +1 -0
  94. package/dist/migrations/migration-runner.test-helpers.js +47 -0
  95. package/dist/migrations/migration-runner.test-helpers.js.map +1 -0
  96. package/dist/operator/operator-profile.d.ts +44 -0
  97. package/dist/operator/operator-profile.d.ts.map +1 -0
  98. package/dist/operator/operator-profile.js +377 -0
  99. package/dist/operator/operator-profile.js.map +1 -0
  100. package/dist/operator/operator-signals.d.ts +45 -0
  101. package/dist/operator/operator-signals.d.ts.map +1 -0
  102. package/dist/operator/operator-signals.js +228 -0
  103. package/dist/operator/operator-signals.js.map +1 -0
  104. package/dist/operator/operator-types.d.ts +360 -0
  105. package/dist/operator/operator-types.d.ts.map +1 -0
  106. package/dist/operator/operator-types.js +24 -0
  107. package/dist/operator/operator-types.js.map +1 -0
  108. package/dist/packs/types.d.ts +27 -27
  109. package/dist/paths.d.ts +40 -0
  110. package/dist/paths.d.ts.map +1 -0
  111. package/dist/paths.js +98 -0
  112. package/dist/paths.js.map +1 -0
  113. package/dist/persistence/index.d.ts +1 -1
  114. package/dist/persistence/index.d.ts.map +1 -1
  115. package/dist/persistence/index.js +1 -1
  116. package/dist/persistence/index.js.map +1 -1
  117. package/dist/persistence/sqlite-provider.d.ts +2 -0
  118. package/dist/persistence/sqlite-provider.d.ts.map +1 -1
  119. package/dist/persistence/sqlite-provider.js +8 -5
  120. package/dist/persistence/sqlite-provider.js.map +1 -1
  121. package/dist/planning/evidence-collector.d.ts +13 -1
  122. package/dist/planning/evidence-collector.d.ts.map +1 -1
  123. package/dist/planning/evidence-collector.js +33 -0
  124. package/dist/planning/evidence-collector.js.map +1 -1
  125. package/dist/planning/gap-analysis.d.ts +5 -4
  126. package/dist/planning/gap-analysis.d.ts.map +1 -1
  127. package/dist/planning/gap-analysis.js +7 -341
  128. package/dist/planning/gap-analysis.js.map +1 -1
  129. package/dist/planning/gap-passes.d.ts +19 -0
  130. package/dist/planning/gap-passes.d.ts.map +1 -0
  131. package/dist/planning/gap-passes.js +157 -0
  132. package/dist/planning/gap-passes.js.map +1 -0
  133. package/dist/planning/gap-patterns.d.ts +29 -0
  134. package/dist/planning/gap-patterns.d.ts.map +1 -0
  135. package/dist/planning/gap-patterns.js +129 -0
  136. package/dist/planning/gap-patterns.js.map +1 -0
  137. package/dist/planning/gap-types.d.ts +1 -1
  138. package/dist/planning/gap-types.d.ts.map +1 -1
  139. package/dist/planning/gap-types.js +1 -0
  140. package/dist/planning/gap-types.js.map +1 -1
  141. package/dist/planning/github-projection.d.ts +122 -0
  142. package/dist/planning/github-projection.d.ts.map +1 -0
  143. package/dist/planning/github-projection.js +294 -0
  144. package/dist/planning/github-projection.js.map +1 -0
  145. package/dist/planning/impact-analyzer.d.ts +26 -0
  146. package/dist/planning/impact-analyzer.d.ts.map +1 -0
  147. package/dist/planning/impact-analyzer.js +199 -0
  148. package/dist/planning/impact-analyzer.js.map +1 -0
  149. package/dist/planning/plan-lifecycle.d.ts +136 -0
  150. package/dist/planning/plan-lifecycle.d.ts.map +1 -0
  151. package/dist/planning/plan-lifecycle.js +296 -0
  152. package/dist/planning/plan-lifecycle.js.map +1 -0
  153. package/dist/planning/planner-types.d.ts +202 -0
  154. package/dist/planning/planner-types.d.ts.map +1 -0
  155. package/dist/planning/planner-types.js +6 -0
  156. package/dist/planning/planner-types.js.map +1 -0
  157. package/dist/planning/planner.d.ts +31 -383
  158. package/dist/planning/planner.d.ts.map +1 -1
  159. package/dist/planning/planner.js +154 -878
  160. package/dist/planning/planner.js.map +1 -1
  161. package/dist/planning/rationalization-detector.d.ts +32 -0
  162. package/dist/planning/rationalization-detector.d.ts.map +1 -0
  163. package/dist/planning/rationalization-detector.js +89 -0
  164. package/dist/planning/rationalization-detector.js.map +1 -0
  165. package/dist/planning/reconciliation-engine.d.ts +47 -0
  166. package/dist/planning/reconciliation-engine.d.ts.map +1 -0
  167. package/dist/planning/reconciliation-engine.js +128 -0
  168. package/dist/planning/reconciliation-engine.js.map +1 -0
  169. package/dist/planning/task-verifier.d.ts +85 -0
  170. package/dist/planning/task-verifier.d.ts.map +1 -0
  171. package/dist/planning/task-verifier.js +227 -0
  172. package/dist/planning/task-verifier.js.map +1 -0
  173. package/dist/plugins/types.d.ts +4 -4
  174. package/dist/runtime/admin-ops.d.ts +2 -2
  175. package/dist/runtime/admin-ops.d.ts.map +1 -1
  176. package/dist/runtime/admin-ops.js +44 -17
  177. package/dist/runtime/admin-ops.js.map +1 -1
  178. package/dist/runtime/admin-setup-ops.d.ts.map +1 -1
  179. package/dist/runtime/admin-setup-ops.js +21 -46
  180. package/dist/runtime/admin-setup-ops.js.map +1 -1
  181. package/dist/runtime/archive-ops.d.ts +10 -0
  182. package/dist/runtime/archive-ops.d.ts.map +1 -0
  183. package/dist/runtime/archive-ops.js +310 -0
  184. package/dist/runtime/archive-ops.js.map +1 -0
  185. package/dist/runtime/capture-ops.d.ts.map +1 -1
  186. package/dist/runtime/capture-ops.js +42 -7
  187. package/dist/runtime/capture-ops.js.map +1 -1
  188. package/dist/runtime/claude-md-helpers.js +1 -1
  189. package/dist/runtime/claude-md-helpers.js.map +1 -1
  190. package/dist/runtime/context-health.d.ts +31 -0
  191. package/dist/runtime/context-health.d.ts.map +1 -0
  192. package/dist/runtime/context-health.js +57 -0
  193. package/dist/runtime/context-health.js.map +1 -0
  194. package/dist/runtime/facades/archive-facade.d.ts +10 -0
  195. package/dist/runtime/facades/archive-facade.d.ts.map +1 -0
  196. package/dist/runtime/facades/archive-facade.js +11 -0
  197. package/dist/runtime/facades/archive-facade.js.map +1 -0
  198. package/dist/runtime/facades/brain-facade.d.ts.map +1 -1
  199. package/dist/runtime/facades/brain-facade.js +2 -0
  200. package/dist/runtime/facades/brain-facade.js.map +1 -1
  201. package/dist/runtime/facades/chat-facade.d.ts +7 -0
  202. package/dist/runtime/facades/chat-facade.d.ts.map +1 -1
  203. package/dist/runtime/facades/chat-facade.js +15 -800
  204. package/dist/runtime/facades/chat-facade.js.map +1 -1
  205. package/dist/runtime/facades/chat-service-ops.d.ts +9 -0
  206. package/dist/runtime/facades/chat-service-ops.d.ts.map +1 -0
  207. package/dist/runtime/facades/chat-service-ops.js +330 -0
  208. package/dist/runtime/facades/chat-service-ops.js.map +1 -0
  209. package/dist/runtime/facades/chat-session-ops.d.ts +8 -0
  210. package/dist/runtime/facades/chat-session-ops.d.ts.map +1 -0
  211. package/dist/runtime/facades/chat-session-ops.js +136 -0
  212. package/dist/runtime/facades/chat-session-ops.js.map +1 -0
  213. package/dist/runtime/facades/chat-state.d.ts +31 -0
  214. package/dist/runtime/facades/chat-state.d.ts.map +1 -0
  215. package/dist/runtime/facades/chat-state.js +32 -0
  216. package/dist/runtime/facades/chat-state.js.map +1 -0
  217. package/dist/runtime/facades/chat-transport-ops.d.ts +9 -0
  218. package/dist/runtime/facades/chat-transport-ops.d.ts.map +1 -0
  219. package/dist/runtime/facades/chat-transport-ops.js +337 -0
  220. package/dist/runtime/facades/chat-transport-ops.js.map +1 -0
  221. package/dist/runtime/facades/control-facade.d.ts.map +1 -1
  222. package/dist/runtime/facades/control-facade.js +4 -1
  223. package/dist/runtime/facades/control-facade.js.map +1 -1
  224. package/dist/runtime/facades/index.d.ts.map +1 -1
  225. package/dist/runtime/facades/index.js +6 -0
  226. package/dist/runtime/facades/index.js.map +1 -1
  227. package/dist/runtime/facades/memory-facade.d.ts.map +1 -1
  228. package/dist/runtime/facades/memory-facade.js +75 -6
  229. package/dist/runtime/facades/memory-facade.js.map +1 -1
  230. package/dist/runtime/facades/operator-facade.d.ts +8 -0
  231. package/dist/runtime/facades/operator-facade.d.ts.map +1 -0
  232. package/dist/runtime/facades/operator-facade.js +220 -0
  233. package/dist/runtime/facades/operator-facade.js.map +1 -0
  234. package/dist/runtime/facades/orchestrate-facade.js +3 -3
  235. package/dist/runtime/facades/orchestrate-facade.js.map +1 -1
  236. package/dist/runtime/facades/plan-facade.d.ts.map +1 -1
  237. package/dist/runtime/facades/plan-facade.js +39 -6
  238. package/dist/runtime/facades/plan-facade.js.map +1 -1
  239. package/dist/runtime/facades/review-facade.d.ts +7 -0
  240. package/dist/runtime/facades/review-facade.d.ts.map +1 -0
  241. package/dist/runtime/facades/review-facade.js +8 -0
  242. package/dist/runtime/facades/review-facade.js.map +1 -0
  243. package/dist/runtime/facades/sync-facade.d.ts +7 -0
  244. package/dist/runtime/facades/sync-facade.d.ts.map +1 -0
  245. package/dist/runtime/facades/sync-facade.js +8 -0
  246. package/dist/runtime/facades/sync-facade.js.map +1 -0
  247. package/dist/runtime/facades/vault-facade.d.ts +4 -1
  248. package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
  249. package/dist/runtime/facades/vault-facade.js +13 -66
  250. package/dist/runtime/facades/vault-facade.js.map +1 -1
  251. package/dist/runtime/github-integration.d.ts +49 -0
  252. package/dist/runtime/github-integration.d.ts.map +1 -0
  253. package/dist/runtime/github-integration.js +113 -0
  254. package/dist/runtime/github-integration.js.map +1 -0
  255. package/dist/runtime/grading-ops.js +1 -1
  256. package/dist/runtime/grading-ops.js.map +1 -1
  257. package/dist/runtime/memory-extra-ops.d.ts.map +1 -1
  258. package/dist/runtime/memory-extra-ops.js +6 -2
  259. package/dist/runtime/memory-extra-ops.js.map +1 -1
  260. package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
  261. package/dist/runtime/orchestrate-ops.js +367 -40
  262. package/dist/runtime/orchestrate-ops.js.map +1 -1
  263. package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
  264. package/dist/runtime/planning-extra-ops.js +69 -4
  265. package/dist/runtime/planning-extra-ops.js.map +1 -1
  266. package/dist/runtime/review-ops.d.ts +10 -0
  267. package/dist/runtime/review-ops.d.ts.map +1 -0
  268. package/dist/runtime/review-ops.js +97 -0
  269. package/dist/runtime/review-ops.js.map +1 -0
  270. package/dist/runtime/runtime.d.ts.map +1 -1
  271. package/dist/runtime/runtime.js +27 -12
  272. package/dist/runtime/runtime.js.map +1 -1
  273. package/dist/runtime/session-briefing.d.ts +3 -0
  274. package/dist/runtime/session-briefing.d.ts.map +1 -1
  275. package/dist/runtime/session-briefing.js +68 -1
  276. package/dist/runtime/session-briefing.js.map +1 -1
  277. package/dist/runtime/sync-ops.d.ts +12 -0
  278. package/dist/runtime/sync-ops.d.ts.map +1 -0
  279. package/dist/runtime/sync-ops.js +288 -0
  280. package/dist/runtime/sync-ops.js.map +1 -0
  281. package/dist/runtime/types.d.ts +10 -4
  282. package/dist/runtime/types.d.ts.map +1 -1
  283. package/dist/runtime/vault-extra-ops.d.ts +5 -4
  284. package/dist/runtime/vault-extra-ops.d.ts.map +1 -1
  285. package/dist/runtime/vault-extra-ops.js +5 -300
  286. package/dist/runtime/vault-extra-ops.js.map +1 -1
  287. package/dist/runtime/vault-sharing-ops.d.ts +4 -4
  288. package/dist/runtime/vault-sharing-ops.d.ts.map +1 -1
  289. package/dist/runtime/vault-sharing-ops.js +5 -300
  290. package/dist/runtime/vault-sharing-ops.js.map +1 -1
  291. package/dist/skills/sync-skills.d.ts +27 -0
  292. package/dist/skills/sync-skills.d.ts.map +1 -0
  293. package/dist/skills/sync-skills.js +81 -0
  294. package/dist/skills/sync-skills.js.map +1 -0
  295. package/dist/update-check.d.ts +14 -0
  296. package/dist/update-check.d.ts.map +1 -0
  297. package/dist/update-check.js +96 -0
  298. package/dist/update-check.js.map +1 -0
  299. package/dist/vault/linking.d.ts +10 -12
  300. package/dist/vault/linking.d.ts.map +1 -1
  301. package/dist/vault/linking.js +104 -161
  302. package/dist/vault/linking.js.map +1 -1
  303. package/dist/vault/vault-entries.d.ts +69 -0
  304. package/dist/vault/vault-entries.d.ts.map +1 -0
  305. package/dist/vault/vault-entries.js +257 -0
  306. package/dist/vault/vault-entries.js.map +1 -0
  307. package/dist/vault/vault-interfaces.d.ts +153 -0
  308. package/dist/vault/vault-interfaces.d.ts.map +1 -0
  309. package/dist/vault/vault-interfaces.js +2 -0
  310. package/dist/vault/vault-interfaces.js.map +1 -0
  311. package/dist/vault/vault-maintenance.d.ts +40 -0
  312. package/dist/vault/vault-maintenance.d.ts.map +1 -0
  313. package/dist/vault/vault-maintenance.js +142 -0
  314. package/dist/vault/vault-maintenance.js.map +1 -0
  315. package/dist/vault/vault-markdown-sync.d.ts +22 -0
  316. package/dist/vault/vault-markdown-sync.d.ts.map +1 -0
  317. package/dist/vault/vault-markdown-sync.js +143 -0
  318. package/dist/vault/vault-markdown-sync.js.map +1 -0
  319. package/dist/vault/vault-memories.d.ts +61 -0
  320. package/dist/vault/vault-memories.d.ts.map +1 -0
  321. package/dist/vault/vault-memories.js +240 -0
  322. package/dist/vault/vault-memories.js.map +1 -0
  323. package/dist/vault/vault-schema.d.ts +9 -0
  324. package/dist/vault/vault-schema.d.ts.map +1 -0
  325. package/dist/vault/vault-schema.js +179 -0
  326. package/dist/vault/vault-schema.js.map +1 -0
  327. package/dist/vault/vault.d.ts +29 -81
  328. package/dist/vault/vault.d.ts.map +1 -1
  329. package/dist/vault/vault.js +78 -931
  330. package/dist/vault/vault.js.map +1 -1
  331. package/package.json +1 -1
  332. package/src/agency/agency-manager.test.ts +600 -0
  333. package/src/agency/default-rules.test.ts +228 -0
  334. package/src/{__tests__ → brain}/brain-intelligence.test.ts +37 -14
  335. package/src/{__tests__ → brain}/brain.test.ts +1 -1
  336. package/src/brain/intelligence.ts +196 -15
  337. package/src/brain/learning-radar.ts +22 -1
  338. package/src/{__tests__ → brain}/second-brain-features.test.ts +4 -4
  339. package/src/{__tests__ → brain}/session-lifecycle.test.ts +2 -2
  340. package/src/brain/strength-scorer.ts +404 -0
  341. package/src/capabilities/chain-mapping.test.ts +66 -0
  342. package/src/capabilities/registry.test.ts +369 -0
  343. package/src/chat/agent-loop.test.ts +394 -0
  344. package/src/chat/agent-loop.ts +2 -0
  345. package/src/{__tests__ → chat}/chat-differentiators.test.ts +3 -3
  346. package/src/{__tests__ → chat}/chat-enhanced.test.ts +4 -4
  347. package/src/{__tests__ → chat}/chat-transport.test.ts +6 -6
  348. package/src/chat/mcp-bridge.test.ts +173 -0
  349. package/src/chat/notifications.ts +2 -0
  350. package/src/chat/output-compressor.test.ts +164 -0
  351. package/src/claudemd/compose.test.ts +178 -0
  352. package/src/claudemd/compose.ts +1 -1
  353. package/src/claudemd/inject.test.ts +211 -0
  354. package/src/context/context-engine.test.ts +461 -0
  355. package/src/control/identity-manager.test.ts +305 -0
  356. package/src/control/intent-router.test.ts +360 -0
  357. package/src/control/intent-router.ts +13 -4
  358. package/src/curator/classifier.test.ts +104 -0
  359. package/src/curator/contradiction-detector.test.ts +180 -0
  360. package/src/curator/contradiction-detector.ts +87 -0
  361. package/src/{__tests__ → curator}/curator-pipeline-e2e.test.ts +10 -10
  362. package/src/{__tests__ → curator}/curator.test.ts +77 -1
  363. package/src/curator/curator.ts +115 -777
  364. package/src/curator/duplicate-detector.test.ts +183 -0
  365. package/src/curator/duplicate-detector.ts +103 -0
  366. package/src/curator/health-audit.ts +126 -0
  367. package/src/curator/metadata-enricher.ts +84 -0
  368. package/src/curator/quality-gate.test.ts +135 -0
  369. package/src/curator/schema.ts +65 -0
  370. package/src/curator/tag-manager.test.ts +165 -0
  371. package/src/curator/tag-manager.ts +109 -0
  372. package/src/domain-packs/inject-rules.test.ts +117 -0
  373. package/src/domain-packs/knowledge-installer.test.ts +171 -0
  374. package/src/domain-packs/loader.test.ts +86 -0
  375. package/src/domain-packs/pack-runtime.test.ts +140 -0
  376. package/src/domain-packs/skills-installer.test.ts +135 -0
  377. package/src/domain-packs/token-resolver.test.ts +150 -0
  378. package/src/domain-packs/types.test.ts +130 -0
  379. package/src/enforcement/adapters/claude-code.test.ts +216 -0
  380. package/src/enforcement/registry.test.ts +264 -0
  381. package/src/engine/bin/soleri-engine.ts +28 -4
  382. package/src/engine/core-ops.test.ts +254 -0
  383. package/src/engine/core-ops.ts +25 -8
  384. package/src/engine/module-manifest.test.ts +124 -0
  385. package/src/engine/module-manifest.ts +22 -2
  386. package/src/engine/register-engine.test.ts +230 -0
  387. package/src/engine/register-engine.ts +26 -2
  388. package/src/errors/classify.test.ts +199 -0
  389. package/src/errors/retry.test.ts +156 -0
  390. package/src/errors/retry.ts +2 -0
  391. package/src/errors/types.test.ts +108 -0
  392. package/src/events/event-bus.test.ts +149 -0
  393. package/src/extensions/middleware.test.ts +234 -0
  394. package/src/facades/facade-factory.test.ts +424 -0
  395. package/src/flows/chain-runner.test.ts +273 -0
  396. package/src/flows/context-router.test.ts +52 -0
  397. package/src/flows/dispatch-registry.test.ts +128 -0
  398. package/src/flows/epilogue.test.ts +107 -0
  399. package/src/flows/executor.test.ts +263 -0
  400. package/src/flows/gate-evaluator.test.ts +194 -0
  401. package/src/flows/gate-evaluator.ts +25 -0
  402. package/src/flows/types.ts +4 -0
  403. package/src/governance/governance.test.ts +726 -0
  404. package/src/health/health-registry.test.ts +186 -0
  405. package/src/health/vault-integrity.test.ts +110 -0
  406. package/src/index.ts +92 -0
  407. package/src/intake/content-classifier.test.ts +209 -0
  408. package/src/intake/dedup-gate.test.ts +131 -0
  409. package/src/intake/intake-pipeline.test.ts +506 -0
  410. package/src/intake/intake-pipeline.ts +1 -0
  411. package/src/intake/text-ingester.test.ts +194 -0
  412. package/src/intake/text-ingester.ts +2 -0
  413. package/src/llm/key-pool.test.ts +236 -0
  414. package/src/llm/key-pool.ts +3 -4
  415. package/src/llm/llm-client.test.ts +345 -0
  416. package/src/llm/oauth-discovery.test.ts +180 -0
  417. package/src/llm/utils.test.ts +327 -0
  418. package/src/llm/utils.ts +2 -0
  419. package/src/{__tests__ → logging}/logger.test.ts +41 -62
  420. package/src/loop/loop-manager.test.ts +519 -0
  421. package/src/migrations/migration-runner.edge-cases.test.ts +319 -0
  422. package/src/migrations/migration-runner.test-helpers.ts +64 -0
  423. package/src/migrations/migration-runner.test.ts +385 -0
  424. package/src/operator/auto-signal-pipeline.test.ts +207 -0
  425. package/src/operator/operator-profile-extended.test.ts +320 -0
  426. package/src/operator/operator-profile.test.ts +314 -0
  427. package/src/operator/operator-profile.ts +469 -0
  428. package/src/operator/operator-signals-extended.test.ts +245 -0
  429. package/src/operator/operator-signals.test.ts +281 -0
  430. package/src/operator/operator-signals.ts +261 -0
  431. package/src/operator/operator-types.ts +444 -0
  432. package/src/operator/prompts/hook-precompact-operator-dispatch.md +94 -0
  433. package/src/operator/prompts/subagent-soft-signal-extractor.md +125 -0
  434. package/src/operator/prompts/subagent-synthesis-cognition.md +181 -0
  435. package/src/operator/prompts/subagent-synthesis-communication.md +140 -0
  436. package/src/operator/prompts/subagent-synthesis-technical.md +160 -0
  437. package/src/operator/prompts/subagent-synthesis-trust.md +143 -0
  438. package/src/{__tests__ → packs}/pack-lockfile.test.ts +3 -3
  439. package/src/{__tests__ → packs}/pack-system.test.ts +2 -2
  440. package/src/paths.ts +115 -0
  441. package/src/persistence/index.ts +1 -1
  442. package/src/persistence/sqlite-provider.test.ts +540 -0
  443. package/src/persistence/sqlite-provider.ts +8 -5
  444. package/src/persona/defaults.test.ts +59 -0
  445. package/src/persona/loader.test.ts +67 -0
  446. package/src/persona/prompt-generator.test.ts +127 -0
  447. package/src/planning/evidence-collector.test.ts +406 -0
  448. package/src/planning/evidence-collector.ts +50 -0
  449. package/src/planning/gap-analysis-alternatives.test.ts +169 -0
  450. package/src/planning/gap-analysis.ts +21 -636
  451. package/src/planning/gap-passes.test.ts +372 -0
  452. package/src/planning/gap-passes.ts +298 -0
  453. package/src/planning/gap-patterns.test.ts +320 -0
  454. package/src/planning/gap-patterns.ts +234 -0
  455. package/src/planning/gap-types.ts +4 -1
  456. package/src/planning/github-projection.test.ts +177 -0
  457. package/src/planning/github-projection.ts +425 -0
  458. package/src/planning/impact-analyzer.test.ts +180 -0
  459. package/src/planning/impact-analyzer.ts +264 -0
  460. package/src/planning/plan-lifecycle.test.ts +312 -0
  461. package/src/planning/plan-lifecycle.ts +346 -0
  462. package/src/planning/planner-types.ts +215 -0
  463. package/src/{__tests__ → planning}/planner.test.ts +169 -15
  464. package/src/planning/planner.ts +197 -1228
  465. package/src/planning/rationalization-detector.test.ts +171 -0
  466. package/src/planning/rationalization-detector.ts +138 -0
  467. package/src/planning/reconciliation-engine.test.ts +141 -0
  468. package/src/planning/reconciliation-engine.ts +162 -0
  469. package/src/planning/task-verifier.test.ts +235 -0
  470. package/src/planning/task-verifier.ts +303 -0
  471. package/src/planning/verification-protocol.test.ts +201 -0
  472. package/src/playbooks/generic/generic-playbooks.test.ts +438 -0
  473. package/src/playbooks/index.test.ts +77 -0
  474. package/src/playbooks/playbook-executor.test.ts +255 -0
  475. package/src/playbooks/playbook-registry.test.ts +232 -0
  476. package/src/playbooks/playbook-seeder.test.ts +153 -0
  477. package/src/plugins/plugin-loader.test.ts +212 -0
  478. package/src/plugins/plugin-registry.test.ts +272 -0
  479. package/src/project/project-registry.test.ts +428 -0
  480. package/src/prompts/parser.test.ts +100 -0
  481. package/src/prompts/template-manager.test.ts +109 -0
  482. package/src/{__tests__ → queue}/async-infrastructure.test.ts +3 -3
  483. package/src/queue/job-queue.test.ts +331 -0
  484. package/src/queue/pipeline-runner.test.ts +209 -0
  485. package/src/runtime/admin-extra-ops.test.ts +527 -0
  486. package/src/runtime/admin-ops.test.ts +257 -0
  487. package/src/runtime/admin-ops.ts +45 -17
  488. package/src/runtime/admin-setup-ops.test.ts +328 -0
  489. package/src/runtime/admin-setup-ops.ts +20 -43
  490. package/src/runtime/archive-ops.test.ts +269 -0
  491. package/src/runtime/archive-ops.ts +347 -0
  492. package/src/runtime/capture-ops.test.ts +433 -0
  493. package/src/runtime/capture-ops.ts +50 -8
  494. package/src/runtime/chain-ops.test.ts +149 -0
  495. package/src/runtime/claude-md-helpers.test.ts +191 -0
  496. package/src/runtime/claude-md-helpers.ts +1 -1
  497. package/src/runtime/context-health.test.ts +78 -0
  498. package/src/runtime/context-health.ts +85 -0
  499. package/src/runtime/curator-extra-ops.test.ts +202 -0
  500. package/src/runtime/deprecation.test.ts +98 -0
  501. package/src/runtime/domain-ops.test.ts +268 -0
  502. package/src/runtime/facades/admin-facade.test.ts +333 -0
  503. package/src/runtime/facades/agency-facade.test.ts +278 -0
  504. package/src/runtime/facades/archive-facade.test.ts +294 -0
  505. package/src/runtime/facades/archive-facade.ts +14 -0
  506. package/src/runtime/facades/brain-facade.test.ts +714 -0
  507. package/src/runtime/facades/brain-facade.ts +2 -0
  508. package/src/runtime/facades/chat-facade.test.ts +166 -0
  509. package/src/runtime/facades/chat-facade.ts +15 -906
  510. package/src/runtime/facades/chat-service-ops.test.ts +276 -0
  511. package/src/runtime/facades/chat-service-ops.ts +374 -0
  512. package/src/runtime/facades/chat-session-ops.test.ts +197 -0
  513. package/src/runtime/facades/chat-session-ops.ts +146 -0
  514. package/src/runtime/facades/chat-state.ts +60 -0
  515. package/src/runtime/facades/chat-transport-ops.test.ts +269 -0
  516. package/src/runtime/facades/chat-transport-ops.ts +380 -0
  517. package/src/runtime/facades/context-facade.test.ts +108 -0
  518. package/src/runtime/facades/control-facade.test.ts +436 -0
  519. package/src/runtime/facades/control-facade.ts +6 -1
  520. package/src/runtime/facades/curator-facade.test.ts +303 -0
  521. package/src/runtime/facades/index.ts +6 -0
  522. package/src/runtime/facades/loop-facade.test.ts +245 -0
  523. package/src/runtime/facades/memory-facade.test.ts +269 -0
  524. package/src/runtime/facades/memory-facade.ts +78 -6
  525. package/src/runtime/facades/operator-facade.test.ts +208 -0
  526. package/src/runtime/facades/operator-facade.ts +236 -0
  527. package/src/runtime/facades/orchestrate-facade.test.ts +185 -0
  528. package/src/runtime/facades/orchestrate-facade.ts +3 -3
  529. package/src/runtime/facades/plan-facade.test.ts +266 -0
  530. package/src/runtime/facades/plan-facade.ts +42 -6
  531. package/src/runtime/facades/review-facade.test.ts +82 -0
  532. package/src/runtime/facades/review-facade.ts +11 -0
  533. package/src/runtime/facades/sync-facade.test.ts +113 -0
  534. package/src/runtime/facades/sync-facade.ts +11 -0
  535. package/src/runtime/facades/vault-facade.test.ts +631 -0
  536. package/src/runtime/facades/vault-facade.ts +15 -70
  537. package/src/runtime/feature-flags.test.ts +140 -0
  538. package/src/runtime/github-integration.test.ts +89 -0
  539. package/src/runtime/github-integration.ts +159 -0
  540. package/src/runtime/grading-ops.test.ts +141 -0
  541. package/src/runtime/grading-ops.ts +1 -1
  542. package/src/runtime/intake-ops.test.ts +208 -0
  543. package/src/runtime/loop-ops.test.ts +238 -0
  544. package/src/runtime/memory-cross-project-ops.test.ts +177 -0
  545. package/src/runtime/memory-extra-ops.test.ts +453 -0
  546. package/src/runtime/memory-extra-ops.ts +6 -2
  547. package/src/runtime/orchestrate-ops.test.ts +302 -0
  548. package/src/runtime/orchestrate-ops.ts +435 -46
  549. package/src/runtime/pack-ops.test.ts +158 -0
  550. package/src/runtime/planning-extra-ops.test.ts +583 -0
  551. package/src/runtime/planning-extra-ops.ts +72 -4
  552. package/src/{__tests__ → runtime}/playbook-ops-execution.test.ts +3 -3
  553. package/src/runtime/playbook-ops.test.ts +262 -0
  554. package/src/runtime/plugin-ops.test.ts +201 -0
  555. package/src/runtime/project-ops.test.ts +235 -0
  556. package/src/runtime/review-ops.test.ts +142 -0
  557. package/src/runtime/review-ops.ts +99 -0
  558. package/src/runtime/runtime.test.ts +363 -0
  559. package/src/runtime/runtime.ts +39 -12
  560. package/src/runtime/session-briefing.test.ts +302 -0
  561. package/src/runtime/session-briefing.ts +80 -1
  562. package/src/runtime/sync-ops.test.ts +221 -0
  563. package/src/runtime/sync-ops.ts +325 -0
  564. package/src/runtime/telemetry-ops.test.ts +132 -0
  565. package/src/runtime/types.ts +10 -4
  566. package/src/runtime/vault-extra-ops.test.ts +246 -0
  567. package/src/runtime/vault-extra-ops.ts +5 -332
  568. package/src/runtime/vault-linking-ops.test.ts +237 -0
  569. package/src/runtime/vault-sharing-ops.test.ts +130 -0
  570. package/src/runtime/vault-sharing-ops.ts +5 -329
  571. package/src/skills/sync-skills.ts +108 -0
  572. package/src/streams/normalize.test.ts +95 -0
  573. package/src/streams/replayable-stream.test.ts +166 -0
  574. package/src/telemetry/telemetry.test.ts +143 -0
  575. package/src/transport/http-server.test.ts +394 -0
  576. package/src/transport/lsp-server.test.ts +458 -0
  577. package/src/transport/rate-limiter.test.ts +126 -0
  578. package/src/transport/session-manager.test.ts +133 -0
  579. package/src/transport/token-auth.test.ts +136 -0
  580. package/src/transport/ws-server.test.ts +294 -0
  581. package/src/update-check.ts +111 -0
  582. package/src/vault/__tests__/vault-characterization.test.ts +168 -0
  583. package/src/vault/content-hash.test.ts +78 -0
  584. package/src/vault/git-vault-sync.test.ts +234 -0
  585. package/src/vault/knowledge-review.test.ts +269 -0
  586. package/src/vault/linking.test.ts +358 -0
  587. package/src/vault/linking.ts +149 -183
  588. package/src/vault/obsidian-sync.test.ts +342 -0
  589. package/src/vault/playbook.test.ts +152 -0
  590. package/src/vault/scope-detector.test.ts +187 -0
  591. package/src/vault/vault-branching.test.ts +250 -0
  592. package/src/{__tests__ → vault}/vault-connect.test.ts +1 -1
  593. package/src/vault/vault-entries.ts +282 -0
  594. package/src/vault/vault-interfaces.ts +56 -0
  595. package/src/vault/vault-maintenance.ts +205 -0
  596. package/src/vault/vault-manager.test.ts +206 -0
  597. package/src/vault/vault-markdown-sync.test.ts +203 -0
  598. package/src/vault/vault-markdown-sync.ts +160 -0
  599. package/src/vault/vault-memories.ts +339 -0
  600. package/src/{__tests__ → vault}/vault-scaling.test.ts +1 -1
  601. package/src/vault/vault-schema.ts +181 -0
  602. package/src/{__tests__ → vault}/vault-sharing.test.ts +4 -4
  603. package/src/{__tests__ → vault}/vault.test.ts +2 -2
  604. package/src/vault/vault.ts +89 -1171
  605. package/dist/cognee/client.d.ts +0 -43
  606. package/dist/cognee/client.d.ts.map +0 -1
  607. package/dist/cognee/client.js +0 -375
  608. package/dist/cognee/client.js.map +0 -1
  609. package/dist/cognee/sync-manager.d.ts +0 -153
  610. package/dist/cognee/sync-manager.d.ts.map +0 -1
  611. package/dist/cognee/sync-manager.js +0 -390
  612. package/dist/cognee/sync-manager.js.map +0 -1
  613. package/dist/cognee/types.d.ts +0 -62
  614. package/dist/cognee/types.d.ts.map +0 -1
  615. package/dist/cognee/types.js +0 -3
  616. package/dist/cognee/types.js.map +0 -1
  617. package/dist/governance/index.d.ts +0 -3
  618. package/dist/governance/index.d.ts.map +0 -1
  619. package/dist/governance/index.js +0 -2
  620. package/dist/governance/index.js.map +0 -1
  621. package/dist/health/doctor-checks.d.ts +0 -15
  622. package/dist/health/doctor-checks.d.ts.map +0 -1
  623. package/dist/health/doctor-checks.js +0 -98
  624. package/dist/health/doctor-checks.js.map +0 -1
  625. package/dist/persistence/postgres-provider.d.ts +0 -81
  626. package/dist/persistence/postgres-provider.d.ts.map +0 -1
  627. package/dist/persistence/postgres-provider.js +0 -256
  628. package/dist/persistence/postgres-provider.js.map +0 -1
  629. package/dist/runtime/cognee-sync-ops.d.ts +0 -12
  630. package/dist/runtime/cognee-sync-ops.d.ts.map +0 -1
  631. package/dist/runtime/cognee-sync-ops.js +0 -93
  632. package/dist/runtime/cognee-sync-ops.js.map +0 -1
  633. package/dist/runtime/core-ops.d.ts +0 -23
  634. package/dist/runtime/core-ops.d.ts.map +0 -1
  635. package/dist/runtime/core-ops.js +0 -1296
  636. package/dist/runtime/core-ops.js.map +0 -1
  637. package/dist/runtime/facades/cognee-facade.d.ts +0 -8
  638. package/dist/runtime/facades/cognee-facade.d.ts.map +0 -1
  639. package/dist/runtime/facades/cognee-facade.js +0 -156
  640. package/dist/runtime/facades/cognee-facade.js.map +0 -1
  641. package/src/__tests__/admin-extra-ops.test.ts +0 -484
  642. package/src/__tests__/admin-ops.test.ts +0 -268
  643. package/src/__tests__/admin-setup-ops.test.ts +0 -355
  644. package/src/__tests__/agency-manager.test.ts +0 -374
  645. package/src/__tests__/agent-loop.test.ts +0 -256
  646. package/src/__tests__/capture-ops.test.ts +0 -784
  647. package/src/__tests__/claudemd.test.ts +0 -282
  648. package/src/__tests__/content-hash.test.ts +0 -60
  649. package/src/__tests__/context-engine.test.ts +0 -251
  650. package/src/__tests__/core-ops.test.ts +0 -550
  651. package/src/__tests__/curator-extra-ops.test.ts +0 -383
  652. package/src/__tests__/deprecation.test.ts +0 -78
  653. package/src/__tests__/domain-ops.test.ts +0 -226
  654. package/src/__tests__/domain-packs.test.ts +0 -421
  655. package/src/__tests__/enforcement.test.ts +0 -153
  656. package/src/__tests__/errors.test.ts +0 -388
  657. package/src/__tests__/extensions.test.ts +0 -233
  658. package/src/__tests__/facade-factory.test.ts +0 -271
  659. package/src/__tests__/feature-flags.test.ts +0 -137
  660. package/src/__tests__/flows.test.ts +0 -604
  661. package/src/__tests__/git-vault-sync.test.ts +0 -230
  662. package/src/__tests__/governance.test.ts +0 -522
  663. package/src/__tests__/grading-ops.test.ts +0 -361
  664. package/src/__tests__/health-registry.test.ts +0 -173
  665. package/src/__tests__/identity-manager.test.ts +0 -243
  666. package/src/__tests__/intake-pipeline.test.ts +0 -162
  667. package/src/__tests__/intent-router.test.ts +0 -222
  668. package/src/__tests__/knowledge-review.test.ts +0 -104
  669. package/src/__tests__/llm-client.test.ts +0 -69
  670. package/src/__tests__/llm.test.ts +0 -556
  671. package/src/__tests__/loader.test.ts +0 -176
  672. package/src/__tests__/loop-ops.test.ts +0 -469
  673. package/src/__tests__/lsp-transport.test.ts +0 -442
  674. package/src/__tests__/memory-cross-project-ops.test.ts +0 -248
  675. package/src/__tests__/memory-extra-ops.test.ts +0 -352
  676. package/src/__tests__/migration-runner.test.ts +0 -170
  677. package/src/__tests__/module-manifest-drift.test.ts +0 -59
  678. package/src/__tests__/normalize.test.ts +0 -85
  679. package/src/__tests__/obsidian-sync.test.ts +0 -354
  680. package/src/__tests__/orchestrate-ops.test.ts +0 -289
  681. package/src/__tests__/pack-ops.test.ts +0 -146
  682. package/src/__tests__/persistence.test.ts +0 -291
  683. package/src/__tests__/planning-extra-ops.test.ts +0 -706
  684. package/src/__tests__/playbook-executor.test.ts +0 -249
  685. package/src/__tests__/playbook-registry.test.ts +0 -326
  686. package/src/__tests__/playbook-seeder.test.ts +0 -163
  687. package/src/__tests__/playbook.test.ts +0 -389
  688. package/src/__tests__/plugin-ops.test.ts +0 -411
  689. package/src/__tests__/plugin-system.test.ts +0 -509
  690. package/src/__tests__/project-ops.test.ts +0 -381
  691. package/src/__tests__/replayable-stream.test.ts +0 -177
  692. package/src/__tests__/runtime.test.ts +0 -95
  693. package/src/__tests__/scope-detector.test.ts +0 -121
  694. package/src/__tests__/template-manager.test.ts +0 -222
  695. package/src/__tests__/token-resolver.test.ts +0 -79
  696. package/src/__tests__/transport.test.ts +0 -758
  697. package/src/__tests__/vault-branching.test.ts +0 -274
  698. package/src/__tests__/vault-extra-ops.test.ts +0 -482
  699. package/src/__tests__/vault-integrity.test.ts +0 -71
  700. package/src/__tests__/vault-manager.test.ts +0 -238
  701. package/src/__tests__/ws-transport.test.ts +0 -479
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Context router — colocated contract tests.
3
+ *
4
+ * Lighter coverage since __tests__/flows.test.ts covers detectContext and
5
+ * applyContextOverrides thoroughly. Focus: getFlowOverrides and edge cases.
6
+ */
7
+
8
+ import { describe, it, expect } from 'vitest';
9
+ import { getFlowOverrides, detectContext } from './context-router.js';
10
+
11
+ describe('getFlowOverrides', () => {
12
+ it('returns overrides for BUILD-flow', () => {
13
+ const overrides = getFlowOverrides('BUILD-flow');
14
+ expect(overrides.length).toBeGreaterThan(0);
15
+ const contexts = overrides.map((o) => o.context);
16
+ expect(contexts).toContain('small-component');
17
+ expect(contexts).toContain('large-component');
18
+ });
19
+
20
+ it('returns overrides for FIX-flow', () => {
21
+ const overrides = getFlowOverrides('FIX-flow');
22
+ expect(overrides.length).toBeGreaterThan(0);
23
+ const contexts = overrides.map((o) => o.context);
24
+ expect(contexts).toContain('design-fix');
25
+ expect(contexts).toContain('a11y-fix');
26
+ });
27
+
28
+ it('returns overrides for REVIEW-flow', () => {
29
+ const overrides = getFlowOverrides('REVIEW-flow');
30
+ expect(overrides.length).toBeGreaterThan(0);
31
+ const contexts = overrides.map((o) => o.context);
32
+ expect(contexts).toContain('pr-review');
33
+ expect(contexts).toContain('architecture-review');
34
+ });
35
+
36
+ it('returns empty array for unknown flow', () => {
37
+ expect(getFlowOverrides('NONEXISTENT-flow')).toEqual([]);
38
+ });
39
+ });
40
+
41
+ describe('detectContext (edge cases)', () => {
42
+ it('matches case-insensitively', () => {
43
+ const contexts = detectContext('Build a BUTTON component', { components: [], actions: [] });
44
+ expect(contexts).toContain('small-component');
45
+ });
46
+
47
+ it('does not duplicate contexts', () => {
48
+ const contexts = detectContext('button and icon and badge', { components: [], actions: [] });
49
+ const smallCount = contexts.filter((c) => c === 'small-component').length;
50
+ expect(smallCount).toBe(1);
51
+ });
52
+ });
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Dispatch registry — colocated contract tests.
3
+ *
4
+ * Contract:
5
+ * - createDispatcher() returns a function that routes tool calls to facade ops
6
+ * - Tool names follow convention: {agentId}_{facadeName}_{opName}
7
+ * - Strips agent prefix, splits remaining into facade + op
8
+ * - Tries progressively shorter facade prefixes for multi-segment names
9
+ * - Falls back to params.op when tool name matches a whole facade
10
+ * - Returns { status: 'unregistered' } for unknown tools
11
+ * - Catches handler errors and returns { status: 'error' }
12
+ */
13
+
14
+ import { describe, it, expect, vi } from 'vitest';
15
+ import { createDispatcher } from './dispatch-registry.js';
16
+ import type { FacadeConfig } from '../facades/types.js';
17
+
18
+ function facade(name: string, ops: Array<{ name: string; result?: unknown }>): FacadeConfig {
19
+ return {
20
+ name,
21
+ description: `Test facade ${name}`,
22
+ ops: ops.map((o) => ({
23
+ name: o.name,
24
+ description: `op ${o.name}`,
25
+ auth: 'read' as const,
26
+ handler: vi.fn(async () => o.result ?? { ok: true }),
27
+ })),
28
+ };
29
+ }
30
+
31
+ describe('createDispatcher', () => {
32
+ it('routes a prefixed tool call to the correct facade op', async () => {
33
+ const f = facade('agent_vault', [{ name: 'search', result: { items: [] } }]);
34
+ const dispatch = createDispatcher('agent', [f]);
35
+
36
+ const result = await dispatch('agent_vault_search', { query: 'test' });
37
+
38
+ expect(result.status).toBe('ok');
39
+ expect(result.data).toEqual({ items: [] });
40
+ expect(result.tool).toBe('agent_vault_search');
41
+ expect(f.ops[0].handler).toHaveBeenCalledWith({ query: 'test' });
42
+ });
43
+
44
+ it('handles multi-segment facade names', async () => {
45
+ const f = facade('agent_design_rules', [{ name: 'get', result: { rules: [] } }]);
46
+ const dispatch = createDispatcher('agent', [f]);
47
+
48
+ const result = await dispatch('agent_design_rules_get', {});
49
+
50
+ expect(result.status).toBe('ok');
51
+ expect(result.data).toEqual({ rules: [] });
52
+ });
53
+
54
+ it('returns unregistered for unknown tool', async () => {
55
+ const dispatch = createDispatcher('agent', []);
56
+
57
+ const result = await dispatch('agent_unknown_op', {});
58
+
59
+ expect(result.status).toBe('unregistered');
60
+ expect(result.tool).toBe('agent_unknown_op');
61
+ });
62
+
63
+ it('returns unregistered for known facade but unknown op', async () => {
64
+ const f = facade('agent_vault', [{ name: 'search' }]);
65
+ const dispatch = createDispatcher('agent', [f]);
66
+
67
+ const result = await dispatch('agent_vault_nonexistent', {});
68
+
69
+ expect(result.status).toBe('unregistered');
70
+ });
71
+
72
+ it('catches handler errors and returns error status', async () => {
73
+ const f: FacadeConfig = {
74
+ name: 'agent_vault',
75
+ description: 'Vault',
76
+ ops: [
77
+ {
78
+ name: 'search',
79
+ description: 'search',
80
+ auth: 'read',
81
+ handler: vi.fn(async () => {
82
+ throw new Error('DB connection failed');
83
+ }),
84
+ },
85
+ ],
86
+ };
87
+ const dispatch = createDispatcher('agent', [f]);
88
+
89
+ const result = await dispatch('agent_vault_search', {});
90
+
91
+ expect(result.status).toBe('error');
92
+ expect(result.error).toBe('DB connection failed');
93
+ });
94
+
95
+ it('supports params.op fallback for whole-facade tool names', async () => {
96
+ const f = facade('agent_vault', [{ name: 'search', result: { found: true } }]);
97
+ const dispatch = createDispatcher('agent', [f]);
98
+
99
+ const result = await dispatch('agent_vault', { op: 'search', query: 'x' });
100
+
101
+ expect(result.status).toBe('ok');
102
+ expect(result.data).toEqual({ found: true });
103
+ });
104
+
105
+ it('routes tool names without agent prefix by prepending it', async () => {
106
+ const f = facade('agent_brain', [{ name: 'recommend' }]);
107
+ const dispatch = createDispatcher('agent', [f]);
108
+
109
+ // Tool name without agent_ prefix — dispatcher tries unprefixed path
110
+ // which becomes "brain_recommend", then tries facade "agent_brain" + op "recommend"
111
+ const result = await dispatch('brain_recommend', {});
112
+
113
+ // The dispatcher prepends the prefix internally, so it still resolves
114
+ expect(result.status).toBe('ok');
115
+ });
116
+
117
+ it('dispatches to multiple facades independently', async () => {
118
+ const vaultFacade = facade('agent_vault', [{ name: 'search', result: { v: 1 } }]);
119
+ const brainFacade = facade('agent_brain', [{ name: 'recommend', result: { b: 2 } }]);
120
+ const dispatch = createDispatcher('agent', [vaultFacade, brainFacade]);
121
+
122
+ const r1 = await dispatch('agent_vault_search', {});
123
+ const r2 = await dispatch('agent_brain_recommend', {});
124
+
125
+ expect(r1.data).toEqual({ v: 1 });
126
+ expect(r2.data).toEqual({ b: 2 });
127
+ });
128
+ });
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Epilogue — colocated contract tests.
3
+ *
4
+ * Contract:
5
+ * - runEpilogue() calls capture_knowledge when vault is available
6
+ * - runEpilogue() calls session_capture when sessionStore is available
7
+ * - Returns { captured: true, sessionId } on success
8
+ * - Silently ignores errors from dispatch (best-effort)
9
+ * - Returns { captured: false } when no probes are available
10
+ */
11
+
12
+ import { describe, it, expect, vi } from 'vitest';
13
+ import { runEpilogue } from './epilogue.js';
14
+ import type { ProbeResults } from './types.js';
15
+
16
+ function probes(overrides?: Partial<ProbeResults>): ProbeResults {
17
+ return {
18
+ vault: false,
19
+ brain: false,
20
+ designSystem: false,
21
+ sessionStore: false,
22
+ projectRules: false,
23
+ active: true,
24
+ ...overrides,
25
+ };
26
+ }
27
+
28
+ describe('runEpilogue', () => {
29
+ it('captures knowledge when vault is available', async () => {
30
+ const dispatch = vi.fn(async () => ({ tool: 'capture_knowledge', status: 'ok', data: {} }));
31
+ const result = await runEpilogue(dispatch, probes({ vault: true }), '/project', 'summary');
32
+
33
+ expect(dispatch).toHaveBeenCalledWith('capture_knowledge', expect.objectContaining({
34
+ title: 'Flow execution summary',
35
+ content: 'summary',
36
+ type: 'workflow',
37
+ projectPath: '/project',
38
+ }));
39
+ expect(result.captured).toBe(true);
40
+ });
41
+
42
+ it('captures session when sessionStore is available', async () => {
43
+ const dispatch = vi.fn(async () => ({
44
+ tool: 'session_capture',
45
+ status: 'ok',
46
+ data: { sessionId: 'sess-123' },
47
+ }));
48
+ const result = await runEpilogue(
49
+ dispatch,
50
+ probes({ sessionStore: true }),
51
+ '/project',
52
+ 'summary',
53
+ );
54
+
55
+ expect(dispatch).toHaveBeenCalledWith('session_capture', expect.objectContaining({
56
+ summary: 'summary',
57
+ projectPath: '/project',
58
+ }));
59
+ expect(result.captured).toBe(true);
60
+ expect(result.sessionId).toBe('sess-123');
61
+ });
62
+
63
+ it('calls both when vault and sessionStore are available', async () => {
64
+ const dispatch = vi.fn(async (tool: string) => ({
65
+ tool,
66
+ status: 'ok',
67
+ data: tool === 'session_capture' ? { sessionId: 's-1' } : {},
68
+ }));
69
+ const result = await runEpilogue(
70
+ dispatch,
71
+ probes({ vault: true, sessionStore: true }),
72
+ '/p',
73
+ 'done',
74
+ );
75
+
76
+ expect(dispatch).toHaveBeenCalledTimes(2);
77
+ expect(result.captured).toBe(true);
78
+ expect(result.sessionId).toBe('s-1');
79
+ });
80
+
81
+ it('returns captured=false when no probes are active', async () => {
82
+ const dispatch = vi.fn();
83
+ const result = await runEpilogue(dispatch, probes(), '/project', 'summary');
84
+
85
+ expect(dispatch).not.toHaveBeenCalled();
86
+ expect(result.captured).toBe(false);
87
+ expect(result.sessionId).toBeUndefined();
88
+ });
89
+
90
+ it('silently ignores dispatch errors for vault capture', async () => {
91
+ const dispatch = vi.fn(async () => {
92
+ throw new Error('vault down');
93
+ });
94
+ const result = await runEpilogue(dispatch, probes({ vault: true }), '/p', 'test');
95
+
96
+ expect(result.captured).toBe(false);
97
+ });
98
+
99
+ it('silently ignores dispatch errors for session capture', async () => {
100
+ const dispatch = vi.fn(async () => {
101
+ throw new Error('session store down');
102
+ });
103
+ const result = await runEpilogue(dispatch, probes({ sessionStore: true }), '/p', 'test');
104
+
105
+ expect(result.captured).toBe(false);
106
+ });
107
+ });
@@ -0,0 +1,263 @@
1
+ /**
2
+ * FlowExecutor — colocated contract tests.
3
+ *
4
+ * Contract:
5
+ * - execute() runs plan steps sequentially, parallel tools within a step
6
+ * - Gates are evaluated after each step via evaluateGate()
7
+ * - STOP gate halts execution and returns partial result
8
+ * - BRANCH gate jumps to a target step (with max iteration guard)
9
+ * - Tool errors are captured per-tool without aborting the step
10
+ * - ExecutionResult includes toolsCalled (deduplicated), stepResults, timing
11
+ *
12
+ * Lighter coverage for basic happy path (covered in __tests__/flows.test.ts).
13
+ * Focus: BRANCH handling, error resilience, SCORE gates, edge cases.
14
+ */
15
+
16
+ import { describe, it, expect, vi } from 'vitest';
17
+ import { FlowExecutor } from './executor.js';
18
+ import type { OrchestrationPlan, PlanStep } from './types.js';
19
+
20
+ // ---------------------------------------------------------------------------
21
+ // Helpers
22
+ // ---------------------------------------------------------------------------
23
+
24
+ function makePlan(steps: PlanStep[], overrides?: Partial<OrchestrationPlan>): OrchestrationPlan {
25
+ return {
26
+ planId: 'test-plan',
27
+ intent: 'BUILD',
28
+ flowId: 'BUILD-flow',
29
+ steps,
30
+ skipped: [],
31
+ epilogue: [],
32
+ warnings: [],
33
+ summary: 'Test plan',
34
+ estimatedTools: steps.reduce((a, s) => a + s.tools.length, 0),
35
+ context: {
36
+ intent: 'BUILD',
37
+ probes: {
38
+ vault: true,
39
+ brain: false,
40
+ designSystem: false,
41
+ sessionStore: true,
42
+ projectRules: false,
43
+ active: true,
44
+ },
45
+ entities: { components: [], actions: [] },
46
+ projectPath: '/test',
47
+ },
48
+ ...overrides,
49
+ };
50
+ }
51
+
52
+ function step(id: string, tools: string[], opts?: Partial<PlanStep>): PlanStep {
53
+ return {
54
+ id,
55
+ name: id,
56
+ tools,
57
+ parallel: false,
58
+ requires: [],
59
+ status: 'pending',
60
+ ...opts,
61
+ };
62
+ }
63
+
64
+ // ---------------------------------------------------------------------------
65
+ // Tests
66
+ // ---------------------------------------------------------------------------
67
+
68
+ describe('FlowExecutor', () => {
69
+ describe('error resilience', () => {
70
+ it('captures tool error without aborting entire step', async () => {
71
+ const dispatch = vi.fn(async (tool: string) => {
72
+ if (tool === 'fail-tool') throw new Error('tool broke');
73
+ return { tool, status: 'ok', data: {} };
74
+ });
75
+
76
+ const executor = new FlowExecutor(dispatch);
77
+ const plan = makePlan([step('s1', ['ok-tool', 'fail-tool'])]);
78
+ const result = await executor.execute(plan);
79
+
80
+ // Both tools were called
81
+ expect(result.toolsCalled).toContain('ok-tool');
82
+ expect(result.toolsCalled).toContain('fail-tool');
83
+ // Step still completes (gate evaluation may mark it passed/failed)
84
+ expect(result.stepResults).toHaveLength(1);
85
+ expect(result.stepResults[0].toolResults['fail-tool'].status).toBe('error');
86
+ expect(result.stepResults[0].toolResults['fail-tool'].error).toBe('tool broke');
87
+ });
88
+
89
+ it('deduplicates toolsCalled', async () => {
90
+ const dispatch = vi.fn(async (tool: string) => ({ tool, status: 'ok', data: {} }));
91
+ const executor = new FlowExecutor(dispatch);
92
+ const plan = makePlan([step('s1', ['tool-a']), step('s2', ['tool-a'])]);
93
+ const result = await executor.execute(plan);
94
+
95
+ expect(result.toolsCalled).toEqual(['tool-a']);
96
+ });
97
+ });
98
+
99
+ describe('BRANCH gate', () => {
100
+ it('jumps to target step on BRANCH action', async () => {
101
+ const callOrder: string[] = [];
102
+ const dispatch = vi.fn(async (tool: string) => {
103
+ callOrder.push(tool);
104
+ return { tool, status: 'ok', data: { branch: true } };
105
+ });
106
+
107
+ const executor = new FlowExecutor(dispatch);
108
+ const plan = makePlan([
109
+ step('s1', ['check'], {
110
+ gate: {
111
+ type: 'BRANCH',
112
+ onFail: { action: 'BRANCH', goto: 's3' },
113
+ },
114
+ }),
115
+ step('s2', ['skipped']),
116
+ step('s3', ['target']),
117
+ ]);
118
+
119
+ const result = await executor.execute(plan);
120
+
121
+ // s1 → branch to s3, skipping s2
122
+ expect(callOrder).toContain('check');
123
+ expect(callOrder).toContain('target');
124
+ expect(callOrder).not.toContain('skipped');
125
+ expect(result.status).toBe('completed');
126
+ });
127
+
128
+ it('stops after MAX_BRANCH_ITERATIONS to prevent infinite loops', async () => {
129
+ const dispatch = vi.fn(async (tool: string) => ({
130
+ tool,
131
+ status: 'ok',
132
+ data: {},
133
+ }));
134
+
135
+ const executor = new FlowExecutor(dispatch);
136
+ // Create a loop: s1 branches back to s1
137
+ const plan = makePlan([
138
+ step('s1', ['loop-tool'], {
139
+ gate: {
140
+ type: 'BRANCH',
141
+ onFail: { action: 'BRANCH', goto: 's1' },
142
+ },
143
+ }),
144
+ step('s2', ['after']),
145
+ ]);
146
+
147
+ const result = await executor.execute(plan);
148
+
149
+ // Should eventually stop with partial status
150
+ expect(result.status).toBe('partial');
151
+ expect(dispatch).toHaveBeenCalled();
152
+ });
153
+ });
154
+
155
+ describe('SCORE gate', () => {
156
+ it('stops execution when score is below minimum', async () => {
157
+ const dispatch = vi.fn(async (tool: string) => ({
158
+ tool,
159
+ status: 'ok',
160
+ data: { score: 30 },
161
+ }));
162
+
163
+ const executor = new FlowExecutor(dispatch);
164
+ const plan = makePlan([
165
+ step('s1', ['validate'], {
166
+ gate: {
167
+ type: 'SCORE',
168
+ min: 80,
169
+ onFail: { action: 'STOP', message: 'Score too low' },
170
+ },
171
+ }),
172
+ step('s2', ['next']),
173
+ ]);
174
+
175
+ const result = await executor.execute(plan);
176
+
177
+ expect(result.status).toBe('partial');
178
+ expect(result.stepsCompleted).toBe(0);
179
+ expect(result.stepResults[0].gateResult?.action).toBe('STOP');
180
+ });
181
+
182
+ it('continues when score meets minimum', async () => {
183
+ const dispatch = vi.fn(async (tool: string) => ({
184
+ tool,
185
+ status: 'ok',
186
+ data: { score: 95 },
187
+ }));
188
+
189
+ const executor = new FlowExecutor(dispatch);
190
+ const plan = makePlan([
191
+ step('s1', ['validate'], {
192
+ gate: { type: 'SCORE', min: 80, onFail: { action: 'STOP' } },
193
+ }),
194
+ step('s2', ['next']),
195
+ ]);
196
+
197
+ const result = await executor.execute(plan);
198
+
199
+ expect(result.status).toBe('completed');
200
+ expect(result.stepsCompleted).toBe(2);
201
+ });
202
+ });
203
+
204
+ describe('parallel tool execution', () => {
205
+ it('handles mixed success/failure in parallel tools', async () => {
206
+ const dispatch = vi.fn(async (tool: string) => {
207
+ if (tool === 'bad') throw new Error('parallel fail');
208
+ return { tool, status: 'ok', data: {} };
209
+ });
210
+
211
+ const executor = new FlowExecutor(dispatch);
212
+ const plan = makePlan([step('s1', ['good', 'bad'], { parallel: true })]);
213
+ const result = await executor.execute(plan);
214
+
215
+ const toolResults = result.stepResults[0].toolResults;
216
+ expect(toolResults['good'].status).toBe('ok');
217
+ expect(toolResults['bad'].status).toBe('error');
218
+ expect(toolResults['bad'].error).toBe('parallel fail');
219
+ });
220
+ });
221
+
222
+ describe('result structure', () => {
223
+ it('includes correct timing and counts', async () => {
224
+ const dispatch = vi.fn(async (tool: string) => ({ tool, status: 'ok', data: {} }));
225
+ const executor = new FlowExecutor(dispatch);
226
+ const plan = makePlan([step('s1', ['t1']), step('s2', ['t2'])]);
227
+
228
+ const result = await executor.execute(plan);
229
+
230
+ expect(result.planId).toBe('test-plan');
231
+ expect(result.totalSteps).toBe(2);
232
+ expect(result.stepsCompleted).toBe(2);
233
+ expect(result.durationMs).toBeGreaterThanOrEqual(0);
234
+ expect(result.stepResults).toHaveLength(2);
235
+ expect(result.stepResults[0].durationMs).toBeGreaterThanOrEqual(0);
236
+ });
237
+
238
+ it('returns failed status when a step has a STOP gate that fails', async () => {
239
+ const dispatch = vi.fn(async (tool: string) => ({
240
+ tool,
241
+ status: 'ok',
242
+ data: { pass: false },
243
+ }));
244
+
245
+ const executor = new FlowExecutor(dispatch);
246
+ const plan = makePlan([
247
+ step('s1', ['check'], {
248
+ gate: {
249
+ type: 'GATE',
250
+ condition: 'pass == true',
251
+ onFail: { action: 'STOP', message: 'Blocked' },
252
+ },
253
+ }),
254
+ ]);
255
+
256
+ const result = await executor.execute(plan);
257
+
258
+ expect(result.status).toBe('partial');
259
+ expect(result.stepResults[0].status).toBe('failed');
260
+ expect(result.stepResults[0].gateResult?.message).toBe('Blocked');
261
+ });
262
+ });
263
+ });