@soleri/core 2.1.0 → 2.5.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 (377) hide show
  1. package/dist/brain/brain.d.ts +10 -1
  2. package/dist/brain/brain.d.ts.map +1 -1
  3. package/dist/brain/brain.js +116 -13
  4. package/dist/brain/brain.js.map +1 -1
  5. package/dist/brain/intelligence.d.ts +36 -1
  6. package/dist/brain/intelligence.d.ts.map +1 -1
  7. package/dist/brain/intelligence.js +119 -14
  8. package/dist/brain/intelligence.js.map +1 -1
  9. package/dist/brain/types.d.ts +34 -2
  10. package/dist/brain/types.d.ts.map +1 -1
  11. package/dist/cognee/client.d.ts +3 -0
  12. package/dist/cognee/client.d.ts.map +1 -1
  13. package/dist/cognee/client.js +17 -0
  14. package/dist/cognee/client.js.map +1 -1
  15. package/dist/cognee/sync-manager.d.ts +94 -0
  16. package/dist/cognee/sync-manager.d.ts.map +1 -0
  17. package/dist/cognee/sync-manager.js +293 -0
  18. package/dist/cognee/sync-manager.js.map +1 -0
  19. package/dist/control/identity-manager.d.ts +22 -0
  20. package/dist/control/identity-manager.d.ts.map +1 -0
  21. package/dist/control/identity-manager.js +233 -0
  22. package/dist/control/identity-manager.js.map +1 -0
  23. package/dist/control/intent-router.d.ts +32 -0
  24. package/dist/control/intent-router.d.ts.map +1 -0
  25. package/dist/control/intent-router.js +242 -0
  26. package/dist/control/intent-router.js.map +1 -0
  27. package/dist/control/types.d.ts +68 -0
  28. package/dist/control/types.d.ts.map +1 -0
  29. package/dist/control/types.js +9 -0
  30. package/dist/control/types.js.map +1 -0
  31. package/dist/curator/curator.d.ts +37 -1
  32. package/dist/curator/curator.d.ts.map +1 -1
  33. package/dist/curator/curator.js +199 -1
  34. package/dist/curator/curator.js.map +1 -1
  35. package/dist/errors/classify.d.ts +13 -0
  36. package/dist/errors/classify.d.ts.map +1 -0
  37. package/dist/errors/classify.js +97 -0
  38. package/dist/errors/classify.js.map +1 -0
  39. package/dist/errors/index.d.ts +6 -0
  40. package/dist/errors/index.d.ts.map +1 -0
  41. package/dist/errors/index.js +4 -0
  42. package/dist/errors/index.js.map +1 -0
  43. package/dist/errors/retry.d.ts +40 -0
  44. package/dist/errors/retry.d.ts.map +1 -0
  45. package/dist/errors/retry.js +97 -0
  46. package/dist/errors/retry.js.map +1 -0
  47. package/dist/errors/types.d.ts +48 -0
  48. package/dist/errors/types.d.ts.map +1 -0
  49. package/dist/errors/types.js +59 -0
  50. package/dist/errors/types.js.map +1 -0
  51. package/dist/facades/types.d.ts +1 -1
  52. package/dist/governance/governance.d.ts +42 -0
  53. package/dist/governance/governance.d.ts.map +1 -0
  54. package/dist/governance/governance.js +488 -0
  55. package/dist/governance/governance.js.map +1 -0
  56. package/dist/governance/index.d.ts +3 -0
  57. package/dist/governance/index.d.ts.map +1 -0
  58. package/dist/governance/index.js +2 -0
  59. package/dist/governance/index.js.map +1 -0
  60. package/dist/governance/types.d.ts +102 -0
  61. package/dist/governance/types.d.ts.map +1 -0
  62. package/dist/governance/types.js +3 -0
  63. package/dist/governance/types.js.map +1 -0
  64. package/dist/index.d.ts +52 -3
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +47 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/intake/content-classifier.d.ts +14 -0
  69. package/dist/intake/content-classifier.d.ts.map +1 -0
  70. package/dist/intake/content-classifier.js +125 -0
  71. package/dist/intake/content-classifier.js.map +1 -0
  72. package/dist/intake/dedup-gate.d.ts +17 -0
  73. package/dist/intake/dedup-gate.d.ts.map +1 -0
  74. package/dist/intake/dedup-gate.js +66 -0
  75. package/dist/intake/dedup-gate.js.map +1 -0
  76. package/dist/intake/intake-pipeline.d.ts +63 -0
  77. package/dist/intake/intake-pipeline.d.ts.map +1 -0
  78. package/dist/intake/intake-pipeline.js +373 -0
  79. package/dist/intake/intake-pipeline.js.map +1 -0
  80. package/dist/intake/types.d.ts +65 -0
  81. package/dist/intake/types.d.ts.map +1 -0
  82. package/dist/intake/types.js +3 -0
  83. package/dist/intake/types.js.map +1 -0
  84. package/dist/intelligence/loader.js +1 -1
  85. package/dist/intelligence/loader.js.map +1 -1
  86. package/dist/intelligence/types.d.ts +3 -1
  87. package/dist/intelligence/types.d.ts.map +1 -1
  88. package/dist/logging/logger.d.ts +37 -0
  89. package/dist/logging/logger.d.ts.map +1 -0
  90. package/dist/logging/logger.js +145 -0
  91. package/dist/logging/logger.js.map +1 -0
  92. package/dist/logging/types.d.ts +19 -0
  93. package/dist/logging/types.d.ts.map +1 -0
  94. package/dist/logging/types.js +2 -0
  95. package/dist/logging/types.js.map +1 -0
  96. package/dist/loop/loop-manager.d.ts +100 -0
  97. package/dist/loop/loop-manager.d.ts.map +1 -0
  98. package/dist/loop/loop-manager.js +379 -0
  99. package/dist/loop/loop-manager.js.map +1 -0
  100. package/dist/loop/types.d.ts +103 -0
  101. package/dist/loop/types.d.ts.map +1 -0
  102. package/dist/loop/types.js +11 -0
  103. package/dist/loop/types.js.map +1 -0
  104. package/dist/persistence/index.d.ts +3 -0
  105. package/dist/persistence/index.d.ts.map +1 -0
  106. package/dist/persistence/index.js +2 -0
  107. package/dist/persistence/index.js.map +1 -0
  108. package/dist/persistence/sqlite-provider.d.ts +25 -0
  109. package/dist/persistence/sqlite-provider.d.ts.map +1 -0
  110. package/dist/persistence/sqlite-provider.js +59 -0
  111. package/dist/persistence/sqlite-provider.js.map +1 -0
  112. package/dist/persistence/types.d.ts +36 -0
  113. package/dist/persistence/types.d.ts.map +1 -0
  114. package/dist/persistence/types.js +8 -0
  115. package/dist/persistence/types.js.map +1 -0
  116. package/dist/planning/gap-analysis.d.ts +72 -0
  117. package/dist/planning/gap-analysis.d.ts.map +1 -0
  118. package/dist/planning/gap-analysis.js +442 -0
  119. package/dist/planning/gap-analysis.js.map +1 -0
  120. package/dist/planning/gap-types.d.ts +29 -0
  121. package/dist/planning/gap-types.d.ts.map +1 -0
  122. package/dist/planning/gap-types.js +28 -0
  123. package/dist/planning/gap-types.js.map +1 -0
  124. package/dist/planning/planner.d.ts +421 -4
  125. package/dist/planning/planner.d.ts.map +1 -1
  126. package/dist/planning/planner.js +949 -21
  127. package/dist/planning/planner.js.map +1 -1
  128. package/dist/playbooks/generic/brainstorming.d.ts +9 -0
  129. package/dist/playbooks/generic/brainstorming.d.ts.map +1 -0
  130. package/dist/playbooks/generic/brainstorming.js +105 -0
  131. package/dist/playbooks/generic/brainstorming.js.map +1 -0
  132. package/dist/playbooks/generic/code-review.d.ts +11 -0
  133. package/dist/playbooks/generic/code-review.d.ts.map +1 -0
  134. package/dist/playbooks/generic/code-review.js +176 -0
  135. package/dist/playbooks/generic/code-review.js.map +1 -0
  136. package/dist/playbooks/generic/subagent-execution.d.ts +9 -0
  137. package/dist/playbooks/generic/subagent-execution.d.ts.map +1 -0
  138. package/dist/playbooks/generic/subagent-execution.js +68 -0
  139. package/dist/playbooks/generic/subagent-execution.js.map +1 -0
  140. package/dist/playbooks/generic/systematic-debugging.d.ts +9 -0
  141. package/dist/playbooks/generic/systematic-debugging.d.ts.map +1 -0
  142. package/dist/playbooks/generic/systematic-debugging.js +87 -0
  143. package/dist/playbooks/generic/systematic-debugging.js.map +1 -0
  144. package/dist/playbooks/generic/tdd.d.ts +9 -0
  145. package/dist/playbooks/generic/tdd.d.ts.map +1 -0
  146. package/dist/playbooks/generic/tdd.js +70 -0
  147. package/dist/playbooks/generic/tdd.js.map +1 -0
  148. package/dist/playbooks/generic/verification.d.ts +9 -0
  149. package/dist/playbooks/generic/verification.d.ts.map +1 -0
  150. package/dist/playbooks/generic/verification.js +74 -0
  151. package/dist/playbooks/generic/verification.js.map +1 -0
  152. package/dist/playbooks/index.d.ts +4 -0
  153. package/dist/playbooks/index.d.ts.map +1 -0
  154. package/dist/playbooks/index.js +5 -0
  155. package/dist/playbooks/index.js.map +1 -0
  156. package/dist/playbooks/playbook-registry.d.ts +42 -0
  157. package/dist/playbooks/playbook-registry.d.ts.map +1 -0
  158. package/dist/playbooks/playbook-registry.js +227 -0
  159. package/dist/playbooks/playbook-registry.js.map +1 -0
  160. package/dist/playbooks/playbook-seeder.d.ts +47 -0
  161. package/dist/playbooks/playbook-seeder.d.ts.map +1 -0
  162. package/dist/playbooks/playbook-seeder.js +104 -0
  163. package/dist/playbooks/playbook-seeder.js.map +1 -0
  164. package/dist/playbooks/playbook-types.d.ts +132 -0
  165. package/dist/playbooks/playbook-types.d.ts.map +1 -0
  166. package/dist/playbooks/playbook-types.js +12 -0
  167. package/dist/playbooks/playbook-types.js.map +1 -0
  168. package/dist/project/project-registry.d.ts +79 -0
  169. package/dist/project/project-registry.d.ts.map +1 -0
  170. package/dist/project/project-registry.js +274 -0
  171. package/dist/project/project-registry.js.map +1 -0
  172. package/dist/project/types.d.ts +28 -0
  173. package/dist/project/types.d.ts.map +1 -0
  174. package/dist/project/types.js +5 -0
  175. package/dist/project/types.js.map +1 -0
  176. package/dist/prompts/index.d.ts +4 -0
  177. package/dist/prompts/index.d.ts.map +1 -0
  178. package/dist/prompts/index.js +3 -0
  179. package/dist/prompts/index.js.map +1 -0
  180. package/dist/prompts/parser.d.ts +17 -0
  181. package/dist/prompts/parser.d.ts.map +1 -0
  182. package/dist/prompts/parser.js +47 -0
  183. package/dist/prompts/parser.js.map +1 -0
  184. package/dist/prompts/template-manager.d.ts +25 -0
  185. package/dist/prompts/template-manager.d.ts.map +1 -0
  186. package/dist/prompts/template-manager.js +71 -0
  187. package/dist/prompts/template-manager.js.map +1 -0
  188. package/dist/prompts/types.d.ts +26 -0
  189. package/dist/prompts/types.d.ts.map +1 -0
  190. package/dist/prompts/types.js +5 -0
  191. package/dist/prompts/types.js.map +1 -0
  192. package/dist/runtime/admin-extra-ops.d.ts +15 -0
  193. package/dist/runtime/admin-extra-ops.d.ts.map +1 -0
  194. package/dist/runtime/admin-extra-ops.js +595 -0
  195. package/dist/runtime/admin-extra-ops.js.map +1 -0
  196. package/dist/runtime/admin-ops.d.ts +15 -0
  197. package/dist/runtime/admin-ops.d.ts.map +1 -0
  198. package/dist/runtime/admin-ops.js +329 -0
  199. package/dist/runtime/admin-ops.js.map +1 -0
  200. package/dist/runtime/capture-ops.d.ts +15 -0
  201. package/dist/runtime/capture-ops.d.ts.map +1 -0
  202. package/dist/runtime/capture-ops.js +363 -0
  203. package/dist/runtime/capture-ops.js.map +1 -0
  204. package/dist/runtime/cognee-sync-ops.d.ts +12 -0
  205. package/dist/runtime/cognee-sync-ops.d.ts.map +1 -0
  206. package/dist/runtime/cognee-sync-ops.js +55 -0
  207. package/dist/runtime/cognee-sync-ops.js.map +1 -0
  208. package/dist/runtime/core-ops.d.ts +9 -3
  209. package/dist/runtime/core-ops.d.ts.map +1 -1
  210. package/dist/runtime/core-ops.js +693 -10
  211. package/dist/runtime/core-ops.js.map +1 -1
  212. package/dist/runtime/curator-extra-ops.d.ts +9 -0
  213. package/dist/runtime/curator-extra-ops.d.ts.map +1 -0
  214. package/dist/runtime/curator-extra-ops.js +71 -0
  215. package/dist/runtime/curator-extra-ops.js.map +1 -0
  216. package/dist/runtime/domain-ops.d.ts.map +1 -1
  217. package/dist/runtime/domain-ops.js +61 -15
  218. package/dist/runtime/domain-ops.js.map +1 -1
  219. package/dist/runtime/grading-ops.d.ts +14 -0
  220. package/dist/runtime/grading-ops.d.ts.map +1 -0
  221. package/dist/runtime/grading-ops.js +105 -0
  222. package/dist/runtime/grading-ops.js.map +1 -0
  223. package/dist/runtime/intake-ops.d.ts +14 -0
  224. package/dist/runtime/intake-ops.d.ts.map +1 -0
  225. package/dist/runtime/intake-ops.js +110 -0
  226. package/dist/runtime/intake-ops.js.map +1 -0
  227. package/dist/runtime/loop-ops.d.ts +14 -0
  228. package/dist/runtime/loop-ops.d.ts.map +1 -0
  229. package/dist/runtime/loop-ops.js +251 -0
  230. package/dist/runtime/loop-ops.js.map +1 -0
  231. package/dist/runtime/memory-cross-project-ops.d.ts +12 -0
  232. package/dist/runtime/memory-cross-project-ops.d.ts.map +1 -0
  233. package/dist/runtime/memory-cross-project-ops.js +165 -0
  234. package/dist/runtime/memory-cross-project-ops.js.map +1 -0
  235. package/dist/runtime/memory-extra-ops.d.ts +13 -0
  236. package/dist/runtime/memory-extra-ops.d.ts.map +1 -0
  237. package/dist/runtime/memory-extra-ops.js +173 -0
  238. package/dist/runtime/memory-extra-ops.js.map +1 -0
  239. package/dist/runtime/orchestrate-ops.d.ts +17 -0
  240. package/dist/runtime/orchestrate-ops.d.ts.map +1 -0
  241. package/dist/runtime/orchestrate-ops.js +246 -0
  242. package/dist/runtime/orchestrate-ops.js.map +1 -0
  243. package/dist/runtime/planning-extra-ops.d.ts +25 -0
  244. package/dist/runtime/planning-extra-ops.d.ts.map +1 -0
  245. package/dist/runtime/planning-extra-ops.js +663 -0
  246. package/dist/runtime/planning-extra-ops.js.map +1 -0
  247. package/dist/runtime/playbook-ops.d.ts +14 -0
  248. package/dist/runtime/playbook-ops.d.ts.map +1 -0
  249. package/dist/runtime/playbook-ops.js +141 -0
  250. package/dist/runtime/playbook-ops.js.map +1 -0
  251. package/dist/runtime/project-ops.d.ts +15 -0
  252. package/dist/runtime/project-ops.d.ts.map +1 -0
  253. package/dist/runtime/project-ops.js +186 -0
  254. package/dist/runtime/project-ops.js.map +1 -0
  255. package/dist/runtime/runtime.d.ts.map +1 -1
  256. package/dist/runtime/runtime.js +65 -3
  257. package/dist/runtime/runtime.js.map +1 -1
  258. package/dist/runtime/types.d.ts +29 -0
  259. package/dist/runtime/types.d.ts.map +1 -1
  260. package/dist/runtime/vault-extra-ops.d.ts +10 -0
  261. package/dist/runtime/vault-extra-ops.d.ts.map +1 -0
  262. package/dist/runtime/vault-extra-ops.js +536 -0
  263. package/dist/runtime/vault-extra-ops.js.map +1 -0
  264. package/dist/telemetry/telemetry.d.ts +48 -0
  265. package/dist/telemetry/telemetry.d.ts.map +1 -0
  266. package/dist/telemetry/telemetry.js +87 -0
  267. package/dist/telemetry/telemetry.js.map +1 -0
  268. package/dist/vault/playbook.d.ts +34 -0
  269. package/dist/vault/playbook.d.ts.map +1 -0
  270. package/dist/vault/playbook.js +60 -0
  271. package/dist/vault/playbook.js.map +1 -0
  272. package/dist/vault/vault.d.ts +97 -4
  273. package/dist/vault/vault.d.ts.map +1 -1
  274. package/dist/vault/vault.js +424 -65
  275. package/dist/vault/vault.js.map +1 -1
  276. package/package.json +7 -3
  277. package/src/__tests__/admin-extra-ops.test.ts +467 -0
  278. package/src/__tests__/admin-ops.test.ts +271 -0
  279. package/src/__tests__/brain-intelligence.test.ts +205 -0
  280. package/src/__tests__/brain.test.ts +134 -3
  281. package/src/__tests__/capture-ops.test.ts +509 -0
  282. package/src/__tests__/cognee-integration.test.ts +80 -0
  283. package/src/__tests__/cognee-sync-manager.test.ts +103 -0
  284. package/src/__tests__/core-ops.test.ts +292 -2
  285. package/src/__tests__/curator-extra-ops.test.ts +381 -0
  286. package/src/__tests__/domain-ops.test.ts +66 -0
  287. package/src/__tests__/errors.test.ts +388 -0
  288. package/src/__tests__/governance.test.ts +522 -0
  289. package/src/__tests__/grading-ops.test.ts +361 -0
  290. package/src/__tests__/identity-manager.test.ts +243 -0
  291. package/src/__tests__/intake-pipeline.test.ts +162 -0
  292. package/src/__tests__/intent-router.test.ts +222 -0
  293. package/src/__tests__/logger.test.ts +200 -0
  294. package/src/__tests__/loop-ops.test.ts +469 -0
  295. package/src/__tests__/memory-cross-project-ops.test.ts +248 -0
  296. package/src/__tests__/memory-extra-ops.test.ts +352 -0
  297. package/src/__tests__/orchestrate-ops.test.ts +289 -0
  298. package/src/__tests__/persistence.test.ts +225 -0
  299. package/src/__tests__/planner.test.ts +416 -7
  300. package/src/__tests__/planning-extra-ops.test.ts +706 -0
  301. package/src/__tests__/playbook-registry.test.ts +326 -0
  302. package/src/__tests__/playbook-seeder.test.ts +163 -0
  303. package/src/__tests__/playbook.test.ts +389 -0
  304. package/src/__tests__/project-ops.test.ts +381 -0
  305. package/src/__tests__/template-manager.test.ts +222 -0
  306. package/src/__tests__/vault-extra-ops.test.ts +482 -0
  307. package/src/brain/brain.ts +185 -16
  308. package/src/brain/intelligence.ts +179 -10
  309. package/src/brain/types.ts +40 -2
  310. package/src/cognee/client.ts +18 -0
  311. package/src/cognee/sync-manager.ts +389 -0
  312. package/src/control/identity-manager.ts +354 -0
  313. package/src/control/intent-router.ts +326 -0
  314. package/src/control/types.ts +102 -0
  315. package/src/curator/curator.ts +295 -1
  316. package/src/errors/classify.ts +102 -0
  317. package/src/errors/index.ts +5 -0
  318. package/src/errors/retry.ts +132 -0
  319. package/src/errors/types.ts +81 -0
  320. package/src/governance/governance.ts +698 -0
  321. package/src/governance/index.ts +18 -0
  322. package/src/governance/types.ts +111 -0
  323. package/src/index.ts +213 -2
  324. package/src/intake/content-classifier.ts +146 -0
  325. package/src/intake/dedup-gate.ts +92 -0
  326. package/src/intake/intake-pipeline.ts +503 -0
  327. package/src/intake/types.ts +69 -0
  328. package/src/intelligence/loader.ts +1 -1
  329. package/src/intelligence/types.ts +3 -1
  330. package/src/logging/logger.ts +154 -0
  331. package/src/logging/types.ts +21 -0
  332. package/src/loop/loop-manager.ts +448 -0
  333. package/src/loop/types.ts +115 -0
  334. package/src/persistence/index.ts +7 -0
  335. package/src/persistence/sqlite-provider.ts +62 -0
  336. package/src/persistence/types.ts +44 -0
  337. package/src/planning/gap-analysis.ts +775 -0
  338. package/src/planning/gap-types.ts +61 -0
  339. package/src/planning/planner.ts +1273 -24
  340. package/src/playbooks/generic/brainstorming.ts +110 -0
  341. package/src/playbooks/generic/code-review.ts +181 -0
  342. package/src/playbooks/generic/subagent-execution.ts +74 -0
  343. package/src/playbooks/generic/systematic-debugging.ts +92 -0
  344. package/src/playbooks/generic/tdd.ts +75 -0
  345. package/src/playbooks/generic/verification.ts +79 -0
  346. package/src/playbooks/index.ts +27 -0
  347. package/src/playbooks/playbook-registry.ts +284 -0
  348. package/src/playbooks/playbook-seeder.ts +119 -0
  349. package/src/playbooks/playbook-types.ts +162 -0
  350. package/src/project/project-registry.ts +370 -0
  351. package/src/project/types.ts +31 -0
  352. package/src/prompts/index.ts +3 -0
  353. package/src/prompts/parser.ts +59 -0
  354. package/src/prompts/template-manager.ts +77 -0
  355. package/src/prompts/types.ts +28 -0
  356. package/src/runtime/admin-extra-ops.ts +652 -0
  357. package/src/runtime/admin-ops.ts +340 -0
  358. package/src/runtime/capture-ops.ts +404 -0
  359. package/src/runtime/cognee-sync-ops.ts +63 -0
  360. package/src/runtime/core-ops.ts +787 -9
  361. package/src/runtime/curator-extra-ops.ts +85 -0
  362. package/src/runtime/domain-ops.ts +67 -15
  363. package/src/runtime/grading-ops.ts +130 -0
  364. package/src/runtime/intake-ops.ts +126 -0
  365. package/src/runtime/loop-ops.ts +277 -0
  366. package/src/runtime/memory-cross-project-ops.ts +191 -0
  367. package/src/runtime/memory-extra-ops.ts +186 -0
  368. package/src/runtime/orchestrate-ops.ts +278 -0
  369. package/src/runtime/planning-extra-ops.ts +718 -0
  370. package/src/runtime/playbook-ops.ts +169 -0
  371. package/src/runtime/project-ops.ts +202 -0
  372. package/src/runtime/runtime.ts +77 -3
  373. package/src/runtime/types.ts +29 -0
  374. package/src/runtime/vault-extra-ops.ts +606 -0
  375. package/src/telemetry/telemetry.ts +118 -0
  376. package/src/vault/playbook.ts +87 -0
  377. package/src/vault/vault.ts +575 -98
@@ -0,0 +1,289 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { mkdirSync, rmSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { createAgentRuntime } from '../runtime/runtime.js';
6
+ import { createOrchestrateOps } from '../runtime/orchestrate-ops.js';
7
+ import type { AgentRuntime } from '../runtime/types.js';
8
+ import type { OpDefinition } from '../facades/types.js';
9
+
10
+ describe('createOrchestrateOps', () => {
11
+ let runtime: AgentRuntime;
12
+ let ops: OpDefinition[];
13
+ let plannerDir: string;
14
+
15
+ beforeEach(() => {
16
+ plannerDir = join(tmpdir(), 'orchestrate-ops-test-' + Date.now());
17
+ mkdirSync(plannerDir, { recursive: true });
18
+ runtime = createAgentRuntime({
19
+ agentId: 'test-orchestrate',
20
+ vaultPath: ':memory:',
21
+ plansPath: join(plannerDir, 'plans.json'),
22
+ });
23
+ ops = createOrchestrateOps(runtime);
24
+ });
25
+
26
+ afterEach(() => {
27
+ runtime.close();
28
+ rmSync(plannerDir, { recursive: true, force: true });
29
+ });
30
+
31
+ function findOp(name: string): OpDefinition {
32
+ const op = ops.find((o) => o.name === name);
33
+ if (!op) throw new Error(`Op "${name}" not found`);
34
+ return op;
35
+ }
36
+
37
+ it('should return 5 ops', () => {
38
+ expect(ops.length).toBe(5);
39
+ });
40
+
41
+ it('should have all expected op names', () => {
42
+ const names = ops.map((o) => o.name);
43
+ expect(names).toContain('orchestrate_plan');
44
+ expect(names).toContain('orchestrate_execute');
45
+ expect(names).toContain('orchestrate_complete');
46
+ expect(names).toContain('orchestrate_status');
47
+ expect(names).toContain('orchestrate_quick_capture');
48
+ });
49
+
50
+ it('should assign correct auth levels', () => {
51
+ expect(findOp('orchestrate_plan').auth).toBe('write');
52
+ expect(findOp('orchestrate_execute').auth).toBe('write');
53
+ expect(findOp('orchestrate_complete').auth).toBe('write');
54
+ expect(findOp('orchestrate_status').auth).toBe('read');
55
+ expect(findOp('orchestrate_quick_capture').auth).toBe('write');
56
+ });
57
+
58
+ // ─── orchestrate_plan ───────────────────────────────────────────
59
+
60
+ describe('orchestrate_plan', () => {
61
+ it('should create a plan with empty recommendations when brain has no data', async () => {
62
+ const op = findOp('orchestrate_plan');
63
+ const result = (await op.handler({
64
+ objective: 'Build a new button component',
65
+ scope: 'src/components/Button',
66
+ domain: 'component',
67
+ })) as {
68
+ plan: { id: string; objective: string; decisions: string[] };
69
+ recommendations: unknown[];
70
+ };
71
+
72
+ expect(result.plan).toBeDefined();
73
+ expect(result.plan.objective).toBe('Build a new button component');
74
+ expect(result.recommendations).toEqual([]);
75
+ expect(result.plan.decisions).toEqual([]);
76
+ });
77
+
78
+ it('should create a plan with tasks when provided', async () => {
79
+ const op = findOp('orchestrate_plan');
80
+ const result = (await op.handler({
81
+ objective: 'Refactor auth module',
82
+ scope: 'src/auth',
83
+ tasks: [
84
+ { title: 'Extract interfaces', description: 'Pull out shared types' },
85
+ { title: 'Add tests', description: 'Cover edge cases' },
86
+ ],
87
+ })) as { plan: { tasks: Array<{ title: string }> } };
88
+
89
+ expect(result.plan.tasks).toHaveLength(2);
90
+ expect(result.plan.tasks[0].title).toBe('Extract interfaces');
91
+ expect(result.plan.tasks[1].title).toBe('Add tests');
92
+ });
93
+
94
+ it('should work without optional domain parameter', async () => {
95
+ const op = findOp('orchestrate_plan');
96
+ const result = (await op.handler({
97
+ objective: 'Quick fix',
98
+ scope: 'all',
99
+ })) as { plan: { id: string } };
100
+
101
+ expect(result.plan.id).toBeDefined();
102
+ });
103
+ });
104
+
105
+ // ─── orchestrate_execute ────────────────────────────────────────
106
+
107
+ describe('orchestrate_execute', () => {
108
+ it('should start plan execution and open a brain session', async () => {
109
+ // Create and approve a plan first
110
+ const plan = runtime.planner.create({
111
+ objective: 'Test execution',
112
+ scope: 'test',
113
+ });
114
+ runtime.planner.approve(plan.id);
115
+
116
+ const op = findOp('orchestrate_execute');
117
+ const result = (await op.handler({
118
+ planId: plan.id,
119
+ domain: 'testing',
120
+ context: 'Running orchestration test',
121
+ })) as { plan: { status: string }; session: { id: string; domain: string | null } };
122
+
123
+ expect(result.plan.status).toBe('executing');
124
+ expect(result.session).toBeDefined();
125
+ expect(result.session.id).toBeDefined();
126
+ expect(result.session.domain).toBe('testing');
127
+ });
128
+
129
+ it('should throw when plan is not approved', async () => {
130
+ const plan = runtime.planner.create({
131
+ objective: 'Not approved',
132
+ scope: 'test',
133
+ });
134
+
135
+ const op = findOp('orchestrate_execute');
136
+ await expect(op.handler({ planId: plan.id })).rejects.toThrow(/Invalid transition/);
137
+ });
138
+ });
139
+
140
+ // ─── orchestrate_complete ───────────────────────────────────────
141
+
142
+ describe('orchestrate_complete', () => {
143
+ it('should complete plan, end session, and extract knowledge', async () => {
144
+ // Full lifecycle: create -> approve -> execute -> reconciling -> complete
145
+ const plan = runtime.planner.create({
146
+ objective: 'Full lifecycle test',
147
+ scope: 'test',
148
+ });
149
+ runtime.planner.approve(plan.id);
150
+ runtime.planner.startExecution(plan.id);
151
+ runtime.planner.startReconciliation(plan.id);
152
+
153
+ // Start a brain session
154
+ const session = runtime.brainIntelligence.lifecycle({
155
+ action: 'start',
156
+ domain: 'testing',
157
+ planId: plan.id,
158
+ });
159
+
160
+ const op = findOp('orchestrate_complete');
161
+ const result = (await op.handler({
162
+ planId: plan.id,
163
+ sessionId: session.id,
164
+ outcome: 'completed',
165
+ toolsUsed: ['tool1', 'tool2', 'tool1', 'tool1'],
166
+ filesModified: ['a.ts', 'b.ts'],
167
+ })) as {
168
+ plan: { status: string };
169
+ session: { endedAt: string | null; planOutcome: string | null };
170
+ extraction: unknown;
171
+ };
172
+
173
+ expect(result.plan.status).toBe('completed');
174
+ expect(result.session.endedAt).toBeDefined();
175
+ expect(result.session.planOutcome).toBe('completed');
176
+ // extraction may or may not produce proposals depending on heuristics
177
+ });
178
+
179
+ it('should handle abandoned outcome', async () => {
180
+ const plan = runtime.planner.create({ objective: 'Abandoned test', scope: 'test' });
181
+ runtime.planner.approve(plan.id);
182
+ runtime.planner.startExecution(plan.id);
183
+ runtime.planner.startReconciliation(plan.id);
184
+
185
+ const session = runtime.brainIntelligence.lifecycle({
186
+ action: 'start',
187
+ domain: 'testing',
188
+ });
189
+
190
+ const op = findOp('orchestrate_complete');
191
+ const result = (await op.handler({
192
+ planId: plan.id,
193
+ sessionId: session.id,
194
+ outcome: 'abandoned',
195
+ })) as { plan: { status: string }; session: { planOutcome: string | null } };
196
+
197
+ expect(result.plan.status).toBe('completed');
198
+ expect(result.session.planOutcome).toBe('abandoned');
199
+ });
200
+ });
201
+
202
+ // ─── orchestrate_status ─────────────────────────────────────────
203
+
204
+ describe('orchestrate_status', () => {
205
+ it('should return combined status', async () => {
206
+ const op = findOp('orchestrate_status');
207
+ const result = (await op.handler({})) as {
208
+ activePlans: unknown[];
209
+ sessionContext: { recentSessions: unknown[] };
210
+ vaultStats: { totalEntries: number };
211
+ recommendations: unknown[];
212
+ brainStats: { sessions: number };
213
+ };
214
+
215
+ expect(result.activePlans).toBeDefined();
216
+ expect(Array.isArray(result.activePlans)).toBe(true);
217
+ expect(result.sessionContext).toBeDefined();
218
+ expect(result.vaultStats).toBeDefined();
219
+ expect(result.recommendations).toBeDefined();
220
+ expect(result.brainStats).toBeDefined();
221
+ });
222
+
223
+ it('should include active plans in status', async () => {
224
+ runtime.planner.create({ objective: 'Active plan 1', scope: 'test' });
225
+ runtime.planner.create({ objective: 'Active plan 2', scope: 'test' });
226
+
227
+ const op = findOp('orchestrate_status');
228
+ const result = (await op.handler({})) as {
229
+ activePlans: Array<{ objective: string }>;
230
+ };
231
+
232
+ expect(result.activePlans).toHaveLength(2);
233
+ });
234
+
235
+ it('should respect sessionLimit parameter', async () => {
236
+ const op = findOp('orchestrate_status');
237
+ const result = (await op.handler({ sessionLimit: 2 })) as {
238
+ sessionContext: { recentSessions: unknown[] };
239
+ };
240
+
241
+ // No sessions exist, but the limit should be respected
242
+ expect(result.sessionContext.recentSessions).toBeDefined();
243
+ });
244
+ });
245
+
246
+ // ─── orchestrate_quick_capture ──────────────────────────────────
247
+
248
+ describe('orchestrate_quick_capture', () => {
249
+ it('should create, end, and extract in one call', async () => {
250
+ const op = findOp('orchestrate_quick_capture');
251
+ const result = (await op.handler({
252
+ domain: 'component',
253
+ context: 'Built a new date picker with keyboard navigation',
254
+ toolsUsed: ['validate_component_code', 'check_contrast'],
255
+ filesModified: ['src/DatePicker.tsx', 'src/DatePicker.test.tsx'],
256
+ outcome: 'completed',
257
+ })) as {
258
+ session: { id: string; endedAt: string | null; domain: string | null };
259
+ extraction: unknown;
260
+ };
261
+
262
+ expect(result.session).toBeDefined();
263
+ expect(result.session.endedAt).toBeDefined();
264
+ expect(result.session.domain).toBe('component');
265
+ });
266
+
267
+ it('should work with minimal params', async () => {
268
+ const op = findOp('orchestrate_quick_capture');
269
+ const result = (await op.handler({
270
+ domain: 'misc',
271
+ context: 'Fixed a typo',
272
+ })) as { session: { id: string } };
273
+
274
+ expect(result.session).toBeDefined();
275
+ expect(result.session.id).toBeDefined();
276
+ });
277
+
278
+ it('should handle abandoned outcome', async () => {
279
+ const op = findOp('orchestrate_quick_capture');
280
+ const result = (await op.handler({
281
+ domain: 'refactor',
282
+ context: 'Started refactor but rolled back',
283
+ outcome: 'abandoned',
284
+ })) as { session: { planOutcome: string | null } };
285
+
286
+ expect(result.session.planOutcome).toBe('abandoned');
287
+ });
288
+ });
289
+ });
@@ -0,0 +1,225 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { SQLitePersistenceProvider } from '../persistence/sqlite-provider.js';
3
+ import { Vault } from '../vault/vault.js';
4
+
5
+ // ─── SQLitePersistenceProvider ────────────────────────────────────────
6
+
7
+ describe('SQLitePersistenceProvider', () => {
8
+ it('execSql creates tables', () => {
9
+ const p = new SQLitePersistenceProvider(':memory:');
10
+ p.execSql('CREATE TABLE test (id TEXT PRIMARY KEY, val TEXT)');
11
+ p.run('INSERT INTO test (id, val) VALUES (?, ?)', ['a', 'hello']);
12
+ const row = p.get<{ id: string; val: string }>('SELECT * FROM test WHERE id = ?', ['a']);
13
+ expect(row).toEqual({ id: 'a', val: 'hello' });
14
+ p.close();
15
+ });
16
+
17
+ it('run with named params', () => {
18
+ const p = new SQLitePersistenceProvider(':memory:');
19
+ p.execSql('CREATE TABLE t (id TEXT PRIMARY KEY, name TEXT)');
20
+ const result = p.run('INSERT INTO t (id, name) VALUES (@id, @name)', {
21
+ id: '1',
22
+ name: 'test',
23
+ });
24
+ expect(result.changes).toBe(1);
25
+ p.close();
26
+ });
27
+
28
+ it('run with positional params', () => {
29
+ const p = new SQLitePersistenceProvider(':memory:');
30
+ p.execSql('CREATE TABLE t (id TEXT PRIMARY KEY)');
31
+ const result = p.run('INSERT INTO t (id) VALUES (?)', ['x']);
32
+ expect(result.changes).toBe(1);
33
+ p.close();
34
+ });
35
+
36
+ it('run with no params', () => {
37
+ const p = new SQLitePersistenceProvider(':memory:');
38
+ p.execSql('CREATE TABLE t (id INTEGER PRIMARY KEY AUTOINCREMENT)');
39
+ const result = p.run('INSERT INTO t DEFAULT VALUES');
40
+ expect(result.changes).toBe(1);
41
+ expect(result.lastInsertRowid).toBe(1);
42
+ p.close();
43
+ });
44
+
45
+ it('get returns undefined for no match', () => {
46
+ const p = new SQLitePersistenceProvider(':memory:');
47
+ p.execSql('CREATE TABLE t (id TEXT PRIMARY KEY)');
48
+ const row = p.get('SELECT * FROM t WHERE id = ?', ['nonexistent']);
49
+ expect(row).toBeUndefined();
50
+ p.close();
51
+ });
52
+
53
+ it('all returns empty for no matches', () => {
54
+ const p = new SQLitePersistenceProvider(':memory:');
55
+ p.execSql('CREATE TABLE t (id TEXT PRIMARY KEY)');
56
+ const rows = p.all('SELECT * FROM t');
57
+ expect(rows).toEqual([]);
58
+ p.close();
59
+ });
60
+
61
+ it('all returns multiple rows', () => {
62
+ const p = new SQLitePersistenceProvider(':memory:');
63
+ p.execSql('CREATE TABLE t (id TEXT PRIMARY KEY, val INTEGER)');
64
+ p.run('INSERT INTO t VALUES (?, ?)', ['a', 1]);
65
+ p.run('INSERT INTO t VALUES (?, ?)', ['b', 2]);
66
+ p.run('INSERT INTO t VALUES (?, ?)', ['c', 3]);
67
+ const rows = p.all<{ id: string; val: number }>('SELECT * FROM t ORDER BY id');
68
+ expect(rows).toHaveLength(3);
69
+ expect(rows[0].id).toBe('a');
70
+ expect(rows[2].val).toBe(3);
71
+ p.close();
72
+ });
73
+
74
+ it('transaction commits on success', () => {
75
+ const p = new SQLitePersistenceProvider(':memory:');
76
+ p.execSql('CREATE TABLE t (id TEXT PRIMARY KEY)');
77
+ p.transaction(() => {
78
+ p.run('INSERT INTO t VALUES (?)', ['a']);
79
+ p.run('INSERT INTO t VALUES (?)', ['b']);
80
+ });
81
+ const rows = p.all('SELECT * FROM t');
82
+ expect(rows).toHaveLength(2);
83
+ p.close();
84
+ });
85
+
86
+ it('transaction rolls back on error', () => {
87
+ const p = new SQLitePersistenceProvider(':memory:');
88
+ p.execSql('CREATE TABLE t (id TEXT PRIMARY KEY)');
89
+ expect(() =>
90
+ p.transaction(() => {
91
+ p.run('INSERT INTO t VALUES (?)', ['a']);
92
+ throw new Error('rollback');
93
+ }),
94
+ ).toThrow('rollback');
95
+ const rows = p.all('SELECT * FROM t');
96
+ expect(rows).toHaveLength(0);
97
+ p.close();
98
+ });
99
+
100
+ it('transaction returns value', () => {
101
+ const p = new SQLitePersistenceProvider(':memory:');
102
+ p.execSql('CREATE TABLE t (id TEXT PRIMARY KEY)');
103
+ const result = p.transaction(() => {
104
+ p.run('INSERT INTO t VALUES (?)', ['a']);
105
+ return 42;
106
+ });
107
+ expect(result).toBe(42);
108
+ p.close();
109
+ });
110
+
111
+ it('getDatabase returns raw db', () => {
112
+ const p = new SQLitePersistenceProvider(':memory:');
113
+ const db = p.getDatabase();
114
+ expect(db).toBeDefined();
115
+ // Verify it's a real better-sqlite3 database
116
+ expect(typeof db.prepare).toBe('function');
117
+ p.close();
118
+ });
119
+
120
+ it('close prevents further operations', () => {
121
+ const p = new SQLitePersistenceProvider(':memory:');
122
+ p.close();
123
+ expect(() => p.run('SELECT 1')).toThrow();
124
+ });
125
+ });
126
+
127
+ // ─── Vault with PersistenceProvider ───────────────────────────────────
128
+
129
+ describe('Vault with PersistenceProvider', () => {
130
+ it('accepts string path (backward compat)', () => {
131
+ const vault = new Vault(':memory:');
132
+ expect(vault.stats().totalEntries).toBe(0);
133
+ vault.close();
134
+ });
135
+
136
+ it('accepts SQLitePersistenceProvider', () => {
137
+ const provider = new SQLitePersistenceProvider(':memory:');
138
+ provider.run('PRAGMA journal_mode = WAL');
139
+ provider.run('PRAGMA foreign_keys = ON');
140
+ const vault = new Vault(provider);
141
+ expect(vault.stats().totalEntries).toBe(0);
142
+ vault.close();
143
+ });
144
+
145
+ it('createWithSQLite factory works', () => {
146
+ const vault = Vault.createWithSQLite(':memory:');
147
+ vault.add({
148
+ id: 'test-1',
149
+ type: 'pattern',
150
+ domain: 'core',
151
+ title: 'Test Pattern',
152
+ severity: 'suggestion',
153
+ description: 'A test',
154
+ tags: ['test'],
155
+ });
156
+ expect(vault.stats().totalEntries).toBe(1);
157
+ vault.close();
158
+ });
159
+
160
+ it('getProvider returns the provider', () => {
161
+ const provider = new SQLitePersistenceProvider(':memory:');
162
+ provider.run('PRAGMA journal_mode = WAL');
163
+ provider.run('PRAGMA foreign_keys = ON');
164
+ const vault = new Vault(provider);
165
+ expect(vault.getProvider()).toBe(provider);
166
+ vault.close();
167
+ });
168
+
169
+ it('getDb works with SQLite provider', () => {
170
+ const vault = new Vault(':memory:');
171
+ const db = vault.getDb();
172
+ expect(typeof db.prepare).toBe('function');
173
+ vault.close();
174
+ });
175
+
176
+ it('all vault operations work through provider', () => {
177
+ const vault = new Vault(':memory:');
178
+
179
+ // seed + get
180
+ vault.seed([
181
+ {
182
+ id: 'e1',
183
+ type: 'pattern',
184
+ domain: 'test',
185
+ title: 'Pattern One',
186
+ severity: 'suggestion',
187
+ description: 'First pattern',
188
+ tags: ['a', 'b'],
189
+ },
190
+ {
191
+ id: 'e2',
192
+ type: 'anti-pattern',
193
+ domain: 'test',
194
+ title: 'Anti Pattern',
195
+ severity: 'warning',
196
+ description: 'Avoid this',
197
+ tags: ['c'],
198
+ },
199
+ ]);
200
+ expect(vault.get('e1')?.title).toBe('Pattern One');
201
+ expect(vault.stats().totalEntries).toBe(2);
202
+
203
+ // search
204
+ const results = vault.search('pattern');
205
+ expect(results.length).toBeGreaterThan(0);
206
+
207
+ // list
208
+ const all = vault.list({ domain: 'test' });
209
+ expect(all).toHaveLength(2);
210
+
211
+ // update
212
+ const updated = vault.update('e1', { title: 'Updated' });
213
+ expect(updated?.title).toBe('Updated');
214
+
215
+ // remove
216
+ expect(vault.remove('e2')).toBe(true);
217
+ expect(vault.stats().totalEntries).toBe(1);
218
+
219
+ // bulk remove
220
+ expect(vault.bulkRemove(['e1'])).toBe(1);
221
+ expect(vault.stats().totalEntries).toBe(0);
222
+
223
+ vault.close();
224
+ });
225
+ });