@soleri/core 2.12.0 → 8.0.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 (430) hide show
  1. package/data/flows/build.flow.yaml +128 -0
  2. package/data/flows/deliver.flow.yaml +110 -0
  3. package/data/flows/design.flow.yaml +108 -0
  4. package/data/flows/enhance.flow.yaml +90 -0
  5. package/data/flows/explore.flow.yaml +84 -0
  6. package/data/flows/fix.flow.yaml +90 -0
  7. package/data/flows/plan.flow.yaml +87 -0
  8. package/data/flows/review.flow.yaml +90 -0
  9. package/dist/agency/agency-manager.d.ts +27 -1
  10. package/dist/agency/agency-manager.d.ts.map +1 -1
  11. package/dist/agency/agency-manager.js +180 -9
  12. package/dist/agency/agency-manager.js.map +1 -1
  13. package/dist/agency/default-rules.d.ts +7 -0
  14. package/dist/agency/default-rules.d.ts.map +1 -0
  15. package/dist/agency/default-rules.js +79 -0
  16. package/dist/agency/default-rules.js.map +1 -0
  17. package/dist/agency/types.d.ts +48 -0
  18. package/dist/agency/types.d.ts.map +1 -1
  19. package/dist/brain/brain.d.ts +17 -2
  20. package/dist/brain/brain.d.ts.map +1 -1
  21. package/dist/brain/brain.js +118 -8
  22. package/dist/brain/brain.js.map +1 -1
  23. package/dist/brain/intelligence.d.ts.map +1 -1
  24. package/dist/brain/intelligence.js +16 -2
  25. package/dist/brain/intelligence.js.map +1 -1
  26. package/dist/brain/knowledge-synthesizer.d.ts +37 -0
  27. package/dist/brain/knowledge-synthesizer.d.ts.map +1 -0
  28. package/dist/brain/knowledge-synthesizer.js +161 -0
  29. package/dist/brain/knowledge-synthesizer.js.map +1 -0
  30. package/dist/brain/learning-radar.d.ts +96 -0
  31. package/dist/brain/learning-radar.d.ts.map +1 -0
  32. package/dist/brain/learning-radar.js +202 -0
  33. package/dist/brain/learning-radar.js.map +1 -0
  34. package/dist/brain/types.d.ts +15 -0
  35. package/dist/brain/types.d.ts.map +1 -1
  36. package/dist/capabilities/chain-mapping.d.ts +21 -0
  37. package/dist/capabilities/chain-mapping.d.ts.map +1 -0
  38. package/dist/capabilities/chain-mapping.js +86 -0
  39. package/dist/capabilities/chain-mapping.js.map +1 -0
  40. package/dist/capabilities/index.d.ts +10 -0
  41. package/dist/capabilities/index.d.ts.map +1 -0
  42. package/dist/capabilities/index.js +8 -0
  43. package/dist/capabilities/index.js.map +1 -0
  44. package/dist/capabilities/registry.d.ts +95 -0
  45. package/dist/capabilities/registry.d.ts.map +1 -0
  46. package/dist/capabilities/registry.js +227 -0
  47. package/dist/capabilities/registry.js.map +1 -0
  48. package/dist/capabilities/types.d.ts +106 -0
  49. package/dist/capabilities/types.d.ts.map +1 -0
  50. package/dist/capabilities/types.js +12 -0
  51. package/dist/capabilities/types.js.map +1 -0
  52. package/dist/context/context-engine.d.ts.map +1 -1
  53. package/dist/context/context-engine.js +82 -17
  54. package/dist/context/context-engine.js.map +1 -1
  55. package/dist/context/types.d.ts +5 -0
  56. package/dist/context/types.d.ts.map +1 -1
  57. package/dist/control/intent-router.d.ts +12 -1
  58. package/dist/control/intent-router.d.ts.map +1 -1
  59. package/dist/control/intent-router.js +126 -2
  60. package/dist/control/intent-router.js.map +1 -1
  61. package/dist/control/types.d.ts +17 -0
  62. package/dist/control/types.d.ts.map +1 -1
  63. package/dist/curator/classifier.d.ts +18 -0
  64. package/dist/curator/classifier.d.ts.map +1 -0
  65. package/dist/curator/classifier.js +61 -0
  66. package/dist/curator/classifier.js.map +1 -0
  67. package/dist/curator/quality-gate.d.ts +29 -0
  68. package/dist/curator/quality-gate.d.ts.map +1 -0
  69. package/dist/curator/quality-gate.js +88 -0
  70. package/dist/curator/quality-gate.js.map +1 -0
  71. package/dist/domain-packs/index.d.ts +8 -0
  72. package/dist/domain-packs/index.d.ts.map +1 -0
  73. package/dist/domain-packs/index.js +8 -0
  74. package/dist/domain-packs/index.js.map +1 -0
  75. package/dist/domain-packs/inject-rules.d.ts +24 -0
  76. package/dist/domain-packs/inject-rules.d.ts.map +1 -0
  77. package/dist/domain-packs/inject-rules.js +65 -0
  78. package/dist/domain-packs/inject-rules.js.map +1 -0
  79. package/dist/domain-packs/knowledge-installer.d.ts +27 -0
  80. package/dist/domain-packs/knowledge-installer.d.ts.map +1 -0
  81. package/dist/domain-packs/knowledge-installer.js +89 -0
  82. package/dist/domain-packs/knowledge-installer.js.map +1 -0
  83. package/dist/domain-packs/loader.d.ts +28 -0
  84. package/dist/domain-packs/loader.d.ts.map +1 -0
  85. package/dist/domain-packs/loader.js +105 -0
  86. package/dist/domain-packs/loader.js.map +1 -0
  87. package/dist/domain-packs/pack-runtime.d.ts +80 -0
  88. package/dist/domain-packs/pack-runtime.d.ts.map +1 -0
  89. package/dist/domain-packs/pack-runtime.js +36 -0
  90. package/dist/domain-packs/pack-runtime.js.map +1 -0
  91. package/dist/domain-packs/skills-installer.d.ts +21 -0
  92. package/dist/domain-packs/skills-installer.d.ts.map +1 -0
  93. package/dist/domain-packs/skills-installer.js +38 -0
  94. package/dist/domain-packs/skills-installer.js.map +1 -0
  95. package/dist/domain-packs/token-resolver.d.ts +37 -0
  96. package/dist/domain-packs/token-resolver.d.ts.map +1 -0
  97. package/dist/domain-packs/token-resolver.js +109 -0
  98. package/dist/domain-packs/token-resolver.js.map +1 -0
  99. package/dist/domain-packs/types.d.ts +91 -0
  100. package/dist/domain-packs/types.d.ts.map +1 -0
  101. package/dist/domain-packs/types.js +122 -0
  102. package/dist/domain-packs/types.js.map +1 -0
  103. package/dist/engine/bin/soleri-engine.d.ts +12 -0
  104. package/dist/engine/bin/soleri-engine.d.ts.map +1 -0
  105. package/dist/engine/bin/soleri-engine.js +184 -0
  106. package/dist/engine/bin/soleri-engine.js.map +1 -0
  107. package/dist/engine/core-ops.d.ts +27 -0
  108. package/dist/engine/core-ops.d.ts.map +1 -0
  109. package/dist/engine/core-ops.js +159 -0
  110. package/dist/engine/core-ops.js.map +1 -0
  111. package/dist/engine/index.d.ts +19 -0
  112. package/dist/engine/index.d.ts.map +1 -0
  113. package/dist/engine/index.js +17 -0
  114. package/dist/engine/index.js.map +1 -0
  115. package/dist/engine/register-engine.d.ts +54 -0
  116. package/dist/engine/register-engine.d.ts.map +1 -0
  117. package/dist/engine/register-engine.js +270 -0
  118. package/dist/engine/register-engine.js.map +1 -0
  119. package/dist/engine/test-helpers.d.ts +30 -0
  120. package/dist/engine/test-helpers.d.ts.map +1 -0
  121. package/dist/engine/test-helpers.js +59 -0
  122. package/dist/engine/test-helpers.js.map +1 -0
  123. package/dist/events/event-bus.d.ts +30 -0
  124. package/dist/events/event-bus.d.ts.map +1 -0
  125. package/dist/events/event-bus.js +51 -0
  126. package/dist/events/event-bus.js.map +1 -0
  127. package/dist/flows/chain-runner.d.ts +46 -0
  128. package/dist/flows/chain-runner.d.ts.map +1 -0
  129. package/dist/flows/chain-runner.js +271 -0
  130. package/dist/flows/chain-runner.js.map +1 -0
  131. package/dist/flows/chain-types.d.ts +103 -0
  132. package/dist/flows/chain-types.d.ts.map +1 -0
  133. package/dist/flows/chain-types.js +23 -0
  134. package/dist/flows/chain-types.js.map +1 -0
  135. package/dist/flows/context-router.d.ts +39 -0
  136. package/dist/flows/context-router.d.ts.map +1 -0
  137. package/dist/flows/context-router.js +206 -0
  138. package/dist/flows/context-router.js.map +1 -0
  139. package/dist/flows/dispatch-registry.d.ts +24 -0
  140. package/dist/flows/dispatch-registry.d.ts.map +1 -0
  141. package/dist/flows/dispatch-registry.js +70 -0
  142. package/dist/flows/dispatch-registry.js.map +1 -0
  143. package/dist/flows/epilogue.d.ts +24 -0
  144. package/dist/flows/epilogue.d.ts.map +1 -0
  145. package/dist/flows/epilogue.js +52 -0
  146. package/dist/flows/epilogue.js.map +1 -0
  147. package/dist/flows/executor.d.ts +25 -0
  148. package/dist/flows/executor.d.ts.map +1 -0
  149. package/dist/flows/executor.js +153 -0
  150. package/dist/flows/executor.js.map +1 -0
  151. package/dist/flows/gate-evaluator.d.ts +26 -0
  152. package/dist/flows/gate-evaluator.d.ts.map +1 -0
  153. package/dist/flows/gate-evaluator.js +162 -0
  154. package/dist/flows/gate-evaluator.js.map +1 -0
  155. package/dist/flows/index.d.ts +14 -0
  156. package/dist/flows/index.d.ts.map +1 -0
  157. package/dist/flows/index.js +20 -0
  158. package/dist/flows/index.js.map +1 -0
  159. package/dist/flows/loader.d.ts +17 -0
  160. package/dist/flows/loader.d.ts.map +1 -0
  161. package/dist/flows/loader.js +61 -0
  162. package/dist/flows/loader.js.map +1 -0
  163. package/dist/flows/plan-builder.d.ts +40 -0
  164. package/dist/flows/plan-builder.d.ts.map +1 -0
  165. package/dist/flows/plan-builder.js +213 -0
  166. package/dist/flows/plan-builder.js.map +1 -0
  167. package/dist/flows/probes.d.ts +11 -0
  168. package/dist/flows/probes.d.ts.map +1 -0
  169. package/dist/flows/probes.js +62 -0
  170. package/dist/flows/probes.js.map +1 -0
  171. package/dist/flows/types.d.ts +950 -0
  172. package/dist/flows/types.d.ts.map +1 -0
  173. package/dist/flows/types.js +105 -0
  174. package/dist/flows/types.js.map +1 -0
  175. package/dist/health/doctor-checks.d.ts +15 -0
  176. package/dist/health/doctor-checks.d.ts.map +1 -0
  177. package/dist/health/doctor-checks.js +98 -0
  178. package/dist/health/doctor-checks.js.map +1 -0
  179. package/dist/index.d.ts +11 -1
  180. package/dist/index.d.ts.map +1 -1
  181. package/dist/index.js +10 -1
  182. package/dist/index.js.map +1 -1
  183. package/dist/intake/text-ingester.d.ts +52 -0
  184. package/dist/intake/text-ingester.d.ts.map +1 -0
  185. package/dist/intake/text-ingester.js +181 -0
  186. package/dist/intake/text-ingester.js.map +1 -0
  187. package/dist/intelligence/loader.d.ts +19 -0
  188. package/dist/intelligence/loader.d.ts.map +1 -1
  189. package/dist/intelligence/loader.js +35 -0
  190. package/dist/intelligence/loader.js.map +1 -1
  191. package/dist/intelligence/types.d.ts +1 -0
  192. package/dist/intelligence/types.d.ts.map +1 -1
  193. package/dist/llm/llm-client.d.ts.map +1 -1
  194. package/dist/llm/llm-client.js +37 -1
  195. package/dist/llm/llm-client.js.map +1 -1
  196. package/dist/llm/oauth-discovery.d.ts +26 -0
  197. package/dist/llm/oauth-discovery.d.ts.map +1 -0
  198. package/dist/llm/oauth-discovery.js +149 -0
  199. package/dist/llm/oauth-discovery.js.map +1 -0
  200. package/dist/packs/types.d.ts +58 -19
  201. package/dist/packs/types.d.ts.map +1 -1
  202. package/dist/packs/types.js +14 -0
  203. package/dist/packs/types.js.map +1 -1
  204. package/dist/planning/evidence-collector.d.ts +41 -0
  205. package/dist/planning/evidence-collector.d.ts.map +1 -0
  206. package/dist/planning/evidence-collector.js +194 -0
  207. package/dist/planning/evidence-collector.js.map +1 -0
  208. package/dist/planning/planner.d.ts +4 -0
  209. package/dist/planning/planner.d.ts.map +1 -1
  210. package/dist/planning/planner.js +11 -0
  211. package/dist/planning/planner.js.map +1 -1
  212. package/dist/playbooks/generic/onboarding.d.ts +9 -0
  213. package/dist/playbooks/generic/onboarding.d.ts.map +1 -0
  214. package/dist/playbooks/generic/onboarding.js +74 -0
  215. package/dist/playbooks/generic/onboarding.js.map +1 -0
  216. package/dist/playbooks/playbook-registry.d.ts.map +1 -1
  217. package/dist/playbooks/playbook-registry.js +2 -0
  218. package/dist/playbooks/playbook-registry.js.map +1 -1
  219. package/dist/queue/job-queue.d.ts +92 -0
  220. package/dist/queue/job-queue.d.ts.map +1 -0
  221. package/dist/queue/job-queue.js +180 -0
  222. package/dist/queue/job-queue.js.map +1 -0
  223. package/dist/queue/pipeline-runner.d.ts +62 -0
  224. package/dist/queue/pipeline-runner.d.ts.map +1 -0
  225. package/dist/queue/pipeline-runner.js +126 -0
  226. package/dist/queue/pipeline-runner.js.map +1 -0
  227. package/dist/runtime/admin-extra-ops.d.ts.map +1 -1
  228. package/dist/runtime/admin-extra-ops.js +15 -9
  229. package/dist/runtime/admin-extra-ops.js.map +1 -1
  230. package/dist/runtime/admin-ops.js +4 -4
  231. package/dist/runtime/admin-ops.js.map +1 -1
  232. package/dist/runtime/admin-setup-ops.d.ts +20 -0
  233. package/dist/runtime/admin-setup-ops.d.ts.map +1 -0
  234. package/dist/runtime/admin-setup-ops.js +583 -0
  235. package/dist/runtime/admin-setup-ops.js.map +1 -0
  236. package/dist/runtime/capture-ops.d.ts.map +1 -1
  237. package/dist/runtime/capture-ops.js +33 -1
  238. package/dist/runtime/capture-ops.js.map +1 -1
  239. package/dist/runtime/chain-ops.d.ts +9 -0
  240. package/dist/runtime/chain-ops.d.ts.map +1 -0
  241. package/dist/runtime/chain-ops.js +107 -0
  242. package/dist/runtime/chain-ops.js.map +1 -0
  243. package/dist/runtime/claude-md-helpers.d.ts +65 -0
  244. package/dist/runtime/claude-md-helpers.d.ts.map +1 -0
  245. package/dist/runtime/claude-md-helpers.js +173 -0
  246. package/dist/runtime/claude-md-helpers.js.map +1 -0
  247. package/dist/runtime/curator-extra-ops.d.ts +3 -2
  248. package/dist/runtime/curator-extra-ops.d.ts.map +1 -1
  249. package/dist/runtime/curator-extra-ops.js +81 -3
  250. package/dist/runtime/curator-extra-ops.js.map +1 -1
  251. package/dist/runtime/domain-ops.d.ts +21 -5
  252. package/dist/runtime/domain-ops.d.ts.map +1 -1
  253. package/dist/runtime/domain-ops.js +64 -6
  254. package/dist/runtime/domain-ops.js.map +1 -1
  255. package/dist/runtime/facades/admin-facade.d.ts.map +1 -1
  256. package/dist/runtime/facades/admin-facade.js +4 -0
  257. package/dist/runtime/facades/admin-facade.js.map +1 -1
  258. package/dist/runtime/facades/agency-facade.d.ts.map +1 -1
  259. package/dist/runtime/facades/agency-facade.js +64 -0
  260. package/dist/runtime/facades/agency-facade.js.map +1 -1
  261. package/dist/runtime/facades/brain-facade.d.ts.map +1 -1
  262. package/dist/runtime/facades/brain-facade.js +122 -1
  263. package/dist/runtime/facades/brain-facade.js.map +1 -1
  264. package/dist/runtime/facades/cognee-facade.d.ts.map +1 -1
  265. package/dist/runtime/facades/cognee-facade.js +3 -1
  266. package/dist/runtime/facades/cognee-facade.js.map +1 -1
  267. package/dist/runtime/facades/control-facade.d.ts.map +1 -1
  268. package/dist/runtime/facades/control-facade.js +42 -0
  269. package/dist/runtime/facades/control-facade.js.map +1 -1
  270. package/dist/runtime/facades/index.d.ts.map +1 -1
  271. package/dist/runtime/facades/index.js +10 -6
  272. package/dist/runtime/facades/index.js.map +1 -1
  273. package/dist/runtime/facades/memory-facade.d.ts.map +1 -1
  274. package/dist/runtime/facades/memory-facade.js +20 -2
  275. package/dist/runtime/facades/memory-facade.js.map +1 -1
  276. package/dist/runtime/facades/plan-facade.d.ts.map +1 -1
  277. package/dist/runtime/facades/plan-facade.js +2 -0
  278. package/dist/runtime/facades/plan-facade.js.map +1 -1
  279. package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
  280. package/dist/runtime/facades/vault-facade.js +27 -5
  281. package/dist/runtime/facades/vault-facade.js.map +1 -1
  282. package/dist/runtime/intake-ops.d.ts +7 -5
  283. package/dist/runtime/intake-ops.d.ts.map +1 -1
  284. package/dist/runtime/intake-ops.js +98 -5
  285. package/dist/runtime/intake-ops.js.map +1 -1
  286. package/dist/runtime/memory-extra-ops.d.ts +6 -3
  287. package/dist/runtime/memory-extra-ops.d.ts.map +1 -1
  288. package/dist/runtime/memory-extra-ops.js +292 -4
  289. package/dist/runtime/memory-extra-ops.js.map +1 -1
  290. package/dist/runtime/orchestrate-ops.d.ts +8 -7
  291. package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
  292. package/dist/runtime/orchestrate-ops.js +217 -61
  293. package/dist/runtime/orchestrate-ops.js.map +1 -1
  294. package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
  295. package/dist/runtime/planning-extra-ops.js +85 -0
  296. package/dist/runtime/planning-extra-ops.js.map +1 -1
  297. package/dist/runtime/playbook-ops.js +1 -1
  298. package/dist/runtime/playbook-ops.js.map +1 -1
  299. package/dist/runtime/runtime.d.ts.map +1 -1
  300. package/dist/runtime/runtime.js +165 -18
  301. package/dist/runtime/runtime.js.map +1 -1
  302. package/dist/runtime/session-briefing.d.ts +23 -0
  303. package/dist/runtime/session-briefing.d.ts.map +1 -0
  304. package/dist/runtime/session-briefing.js +140 -0
  305. package/dist/runtime/session-briefing.js.map +1 -0
  306. package/dist/runtime/types.d.ts +29 -2
  307. package/dist/runtime/types.d.ts.map +1 -1
  308. package/dist/runtime/vault-linking-ops.d.ts +13 -0
  309. package/dist/runtime/vault-linking-ops.d.ts.map +1 -0
  310. package/dist/runtime/vault-linking-ops.js +365 -0
  311. package/dist/runtime/vault-linking-ops.js.map +1 -0
  312. package/dist/vault/linking.d.ts +46 -0
  313. package/dist/vault/linking.d.ts.map +1 -0
  314. package/dist/vault/linking.js +275 -0
  315. package/dist/vault/linking.js.map +1 -0
  316. package/dist/vault/vault-types.d.ts +37 -0
  317. package/dist/vault/vault-types.d.ts.map +1 -1
  318. package/dist/vault/vault.d.ts +37 -0
  319. package/dist/vault/vault.d.ts.map +1 -1
  320. package/dist/vault/vault.js +152 -9
  321. package/dist/vault/vault.js.map +1 -1
  322. package/package.json +4 -1
  323. package/src/__tests__/admin-extra-ops.test.ts +1 -1
  324. package/src/__tests__/admin-ops.test.ts +2 -1
  325. package/src/__tests__/admin-setup-ops.test.ts +355 -0
  326. package/src/__tests__/async-infrastructure.test.ts +307 -0
  327. package/src/__tests__/cognee-client-gaps.test.ts +474 -0
  328. package/src/__tests__/cognee-hybrid-search.test.ts +492 -0
  329. package/src/__tests__/cognee-sync-manager-deep.test.ts +654 -0
  330. package/src/__tests__/cognee-sync-manager.test.ts +1 -0
  331. package/src/__tests__/core-ops.test.ts +9 -61
  332. package/src/__tests__/curator-extra-ops.test.ts +6 -2
  333. package/src/__tests__/curator-pipeline-e2e.test.ts +358 -0
  334. package/src/__tests__/domain-packs.test.ts +421 -0
  335. package/src/__tests__/flows.test.ts +604 -0
  336. package/src/__tests__/memory-extra-ops.test.ts +2 -2
  337. package/src/__tests__/planning-extra-ops.test.ts +2 -2
  338. package/src/__tests__/playbook-registry.test.ts +2 -2
  339. package/src/__tests__/playbook-seeder.test.ts +8 -8
  340. package/src/__tests__/playbook.test.ts +5 -5
  341. package/src/__tests__/second-brain-features.test.ts +583 -0
  342. package/src/__tests__/token-resolver.test.ts +79 -0
  343. package/src/agency/agency-manager.ts +217 -9
  344. package/src/agency/default-rules.ts +83 -0
  345. package/src/agency/types.ts +61 -0
  346. package/src/brain/brain.ts +110 -8
  347. package/src/brain/intelligence.ts +21 -2
  348. package/src/brain/knowledge-synthesizer.ts +218 -0
  349. package/src/brain/learning-radar.ts +340 -0
  350. package/src/brain/types.ts +16 -0
  351. package/src/capabilities/chain-mapping.ts +93 -0
  352. package/src/capabilities/index.ts +21 -0
  353. package/src/capabilities/registry.ts +290 -0
  354. package/src/capabilities/types.ts +143 -0
  355. package/src/context/context-engine.ts +114 -15
  356. package/src/context/types.ts +5 -0
  357. package/src/control/intent-router.ts +153 -2
  358. package/src/control/types.ts +10 -0
  359. package/src/curator/classifier.ts +88 -0
  360. package/src/curator/quality-gate.ts +129 -0
  361. package/src/domain-packs/index.ts +27 -0
  362. package/src/domain-packs/inject-rules.ts +74 -0
  363. package/src/domain-packs/knowledge-installer.ts +116 -0
  364. package/src/domain-packs/loader.ts +124 -0
  365. package/src/domain-packs/pack-runtime.ts +99 -0
  366. package/src/domain-packs/skills-installer.ts +56 -0
  367. package/src/domain-packs/token-resolver.ts +126 -0
  368. package/src/domain-packs/types.ts +229 -0
  369. package/src/engine/__tests__/register-engine.test.ts +104 -0
  370. package/src/engine/bin/soleri-engine.ts +218 -0
  371. package/src/engine/core-ops.ts +178 -0
  372. package/src/engine/index.ts +19 -0
  373. package/src/engine/register-engine.ts +385 -0
  374. package/src/engine/test-helpers.ts +83 -0
  375. package/src/events/event-bus.ts +58 -0
  376. package/src/flows/chain-runner.ts +369 -0
  377. package/src/flows/chain-types.ts +57 -0
  378. package/src/flows/context-router.ts +257 -0
  379. package/src/flows/dispatch-registry.ts +80 -0
  380. package/src/flows/epilogue.ts +65 -0
  381. package/src/flows/executor.ts +182 -0
  382. package/src/flows/gate-evaluator.ts +171 -0
  383. package/src/flows/index.ts +52 -0
  384. package/src/flows/loader.ts +63 -0
  385. package/src/flows/plan-builder.ts +250 -0
  386. package/src/flows/probes.ts +70 -0
  387. package/src/flows/types.ts +217 -0
  388. package/src/health/doctor-checks.ts +115 -0
  389. package/src/index.ts +68 -1
  390. package/src/intake/text-ingester.ts +234 -0
  391. package/src/intelligence/loader.ts +38 -0
  392. package/src/intelligence/types.ts +1 -0
  393. package/src/llm/llm-client.ts +38 -1
  394. package/src/llm/oauth-discovery.ts +169 -0
  395. package/src/packs/types.ts +19 -0
  396. package/src/planning/evidence-collector.ts +247 -0
  397. package/src/planning/planner.ts +11 -0
  398. package/src/playbooks/generic/onboarding.ts +79 -0
  399. package/src/playbooks/playbook-registry.ts +2 -0
  400. package/src/queue/job-queue.ts +281 -0
  401. package/src/queue/pipeline-runner.ts +149 -0
  402. package/src/runtime/admin-extra-ops.ts +14 -8
  403. package/src/runtime/admin-ops.ts +4 -4
  404. package/src/runtime/admin-setup-ops.ts +664 -0
  405. package/src/runtime/capture-ops.ts +40 -1
  406. package/src/runtime/chain-ops.ts +121 -0
  407. package/src/runtime/claude-md-helpers.ts +236 -0
  408. package/src/runtime/curator-extra-ops.ts +86 -3
  409. package/src/runtime/domain-ops.ts +71 -5
  410. package/src/runtime/facades/admin-facade.ts +4 -0
  411. package/src/runtime/facades/agency-facade.ts +68 -0
  412. package/src/runtime/facades/brain-facade.ts +142 -1
  413. package/src/runtime/facades/cognee-facade.ts +3 -1
  414. package/src/runtime/facades/control-facade.ts +45 -0
  415. package/src/runtime/facades/index.ts +12 -6
  416. package/src/runtime/facades/memory-facade.ts +20 -2
  417. package/src/runtime/facades/plan-facade.ts +2 -0
  418. package/src/runtime/facades/vault-facade.ts +30 -5
  419. package/src/runtime/intake-ops.ts +107 -5
  420. package/src/runtime/memory-extra-ops.ts +312 -4
  421. package/src/runtime/orchestrate-ops.ts +261 -65
  422. package/src/runtime/planning-extra-ops.ts +94 -0
  423. package/src/runtime/playbook-ops.ts +1 -1
  424. package/src/runtime/runtime.ts +164 -19
  425. package/src/runtime/session-briefing.ts +161 -0
  426. package/src/runtime/types.ts +29 -2
  427. package/src/runtime/vault-linking-ops.ts +452 -0
  428. package/src/vault/linking.ts +333 -0
  429. package/src/vault/vault-types.ts +46 -0
  430. package/src/vault/vault.ts +173 -11
@@ -0,0 +1,492 @@
1
+ /**
2
+ * Hybrid search tests — validates the Cognee → FTS5 → Zettelkasten cascade.
3
+ *
4
+ * Source of truth: these tests define expected behavior.
5
+ * Code adapts to fulfill them.
6
+ *
7
+ * Tests Brain.intelligentSearch() which combines:
8
+ * 1. FTS5/BM25 keyword search (always runs)
9
+ * 2. Cognee vector similarity (when available)
10
+ * 3. 4-strategy cross-referencing (vault-id prefix, title match, substring, FTS fallback)
11
+ * 4. Weighted scoring (semantic + vector + severity + temporal + tags + domain)
12
+ * 5. Zettelkasten link traversal (via separate ops, not inside intelligentSearch)
13
+ *
14
+ * Uses real in-memory vault + mock CogneeClient.
15
+ */
16
+
17
+ import { describe, it, expect, beforeAll, afterAll, vi } from 'vitest';
18
+ import { Brain } from '../brain/brain.js';
19
+ import { Vault } from '../vault/vault.js';
20
+ import { CogneeClient } from '../cognee/client.js';
21
+ import { LinkManager } from '../vault/linking.js';
22
+ import type { IntelligenceEntry } from '../intelligence/types.js';
23
+ import type { CogneeSearchResult } from '../cognee/types.js';
24
+
25
+ // ─── Helpers ──────────────────────────────────────────────────────
26
+
27
+ function makeEntry(overrides: Partial<IntelligenceEntry> = {}): IntelligenceEntry {
28
+ return {
29
+ id: overrides.id ?? `entry-${Math.random().toString(36).slice(2, 8)}`,
30
+ type: overrides.type ?? 'pattern',
31
+ domain: overrides.domain ?? 'architecture',
32
+ title: overrides.title ?? 'Test Pattern',
33
+ severity: overrides.severity ?? 'warning',
34
+ description: overrides.description ?? 'A test pattern for search validation.',
35
+ tags: overrides.tags ?? ['test'],
36
+ ...(overrides.context ? { context: overrides.context } : {}),
37
+ ...(overrides.example ? { example: overrides.example } : {}),
38
+ ...(overrides.why ? { why: overrides.why } : {}),
39
+ };
40
+ }
41
+
42
+ /**
43
+ * Create a mock CogneeClient that returns controlled search results.
44
+ * isAvailable is a getter — can be toggled at runtime.
45
+ */
46
+ function makeMockCognee(
47
+ opts: {
48
+ available?: boolean;
49
+ searchResults?: CogneeSearchResult[];
50
+ } = {},
51
+ ): CogneeClient & { _setAvailable: (v: boolean) => void } {
52
+ let available = opts.available ?? true;
53
+ const searchResults = opts.searchResults ?? [];
54
+
55
+ return {
56
+ get isAvailable() {
57
+ return available;
58
+ },
59
+ _setAvailable(v: boolean) {
60
+ available = v;
61
+ },
62
+ healthCheck: vi.fn().mockResolvedValue({ available, url: 'mock', latencyMs: 1 }),
63
+ addEntries: vi.fn().mockResolvedValue({ added: 0 }),
64
+ deleteEntries: vi.fn().mockResolvedValue({ deleted: 0 }),
65
+ cognify: vi.fn().mockResolvedValue({ status: 'ok' }),
66
+ search: vi.fn().mockResolvedValue(searchResults),
67
+ getConfig: vi.fn().mockReturnValue({ baseUrl: 'mock', dataset: 'test' }),
68
+ getStatus: vi.fn().mockReturnValue({ available, url: 'mock', latencyMs: 1 }),
69
+ flushPendingCognify: vi.fn(),
70
+ resetPendingCognify: vi.fn(),
71
+ } as unknown as CogneeClient & { _setAvailable: (v: boolean) => void };
72
+ }
73
+
74
+ // ─── Seed data ────────────────────────────────────────────────────
75
+
76
+ const SEED_ENTRIES: IntelligenceEntry[] = [
77
+ makeEntry({
78
+ id: 'pattern-retry-backoff',
79
+ title: 'Retry with Exponential Backoff',
80
+ description:
81
+ 'Always use exponential backoff when retrying failed network requests to avoid thundering herd.',
82
+ domain: 'architecture',
83
+ severity: 'critical',
84
+ tags: ['networking', 'retry', 'resilience'],
85
+ context: 'HTTP clients, API gateways, queue consumers.',
86
+ }),
87
+ makeEntry({
88
+ id: 'pattern-circuit-breaker',
89
+ title: 'Circuit Breaker for External Services',
90
+ description:
91
+ 'Wrap external service calls in a circuit breaker to prevent cascade failures when downstream is unhealthy.',
92
+ domain: 'architecture',
93
+ severity: 'critical',
94
+ tags: ['networking', 'resilience', 'microservices'],
95
+ context: 'Service mesh, API gateway, client libraries.',
96
+ }),
97
+ makeEntry({
98
+ id: 'anti-pattern-polling-no-timeout',
99
+ type: 'anti-pattern',
100
+ title: 'Polling Without Timeout',
101
+ description:
102
+ 'Never poll an external service without a maximum timeout or circuit breaker. Leads to resource exhaustion.',
103
+ domain: 'architecture',
104
+ severity: 'critical',
105
+ tags: ['networking', 'polling', 'timeout'],
106
+ }),
107
+ makeEntry({
108
+ id: 'pattern-token-semantic',
109
+ title: 'Semantic Token Priority',
110
+ description:
111
+ 'Use semantic tokens over primitive tokens. Semantic tokens communicate intent, not just values.',
112
+ domain: 'design',
113
+ severity: 'warning',
114
+ tags: ['tokens', 'design-system', 'css'],
115
+ }),
116
+ makeEntry({
117
+ id: 'pattern-fts5-search',
118
+ title: 'FTS5 Full-Text Search with Porter Stemming',
119
+ description:
120
+ 'Use SQLite FTS5 with porter tokenizer for all text search in the vault. BM25 ranking for relevance.',
121
+ domain: 'architecture',
122
+ severity: 'suggestion',
123
+ tags: ['search', 'sqlite', 'fts5'],
124
+ }),
125
+ ];
126
+
127
+ // ─── Test Suite ───────────────────────────────────────────────────
128
+
129
+ describe('Hybrid search: Cognee → FTS5 → Zettelkasten', () => {
130
+ let vault: Vault;
131
+ let linkManager: LinkManager;
132
+
133
+ beforeAll(() => {
134
+ vault = new Vault(':memory:');
135
+ vault.seed(SEED_ENTRIES);
136
+ linkManager = new LinkManager(vault.getProvider());
137
+
138
+ // Create Zettelkasten links between related entries
139
+ linkManager.addLink('pattern-retry-backoff', 'pattern-circuit-breaker', 'extends');
140
+ linkManager.addLink(
141
+ 'anti-pattern-polling-no-timeout',
142
+ 'pattern-circuit-breaker',
143
+ 'contradicts',
144
+ );
145
+ linkManager.addLink('pattern-retry-backoff', 'anti-pattern-polling-no-timeout', 'contradicts');
146
+ });
147
+
148
+ afterAll(() => {
149
+ vault.close();
150
+ });
151
+
152
+ // ─── FTS5-only search (no Cognee) ─────────────────────────────
153
+
154
+ describe('FTS5-only (Cognee unavailable)', () => {
155
+ it('should return results from FTS5 when Cognee is unavailable', async () => {
156
+ const mockCognee = makeMockCognee({ available: false });
157
+ const brain = new Brain(vault, mockCognee);
158
+
159
+ const results = await brain.intelligentSearch('retry network requests');
160
+ expect(results.length).toBeGreaterThan(0);
161
+ // Vector score should be 0 for all results (no Cognee)
162
+ expect(results.every((r) => r.breakdown.vector === 0)).toBe(true);
163
+ });
164
+
165
+ it('should match by keyword in FTS5', async () => {
166
+ const brain = new Brain(vault); // No Cognee at all
167
+
168
+ const results = await brain.intelligentSearch('exponential backoff');
169
+ const ids = results.map((r) => r.entry.id);
170
+ expect(ids).toContain('pattern-retry-backoff');
171
+ });
172
+
173
+ it('should rank critical severity higher than suggestion', async () => {
174
+ const brain = new Brain(vault);
175
+
176
+ const results = await brain.intelligentSearch('networking resilience');
177
+ // Critical entries should rank above suggestion entries for same domain
178
+ const criticalIdx = results.findIndex((r) => r.entry.id === 'pattern-retry-backoff');
179
+ const suggestionIdx = results.findIndex((r) => r.entry.id === 'pattern-fts5-search');
180
+ if (criticalIdx >= 0 && suggestionIdx >= 0) {
181
+ expect(criticalIdx).toBeLessThan(suggestionIdx);
182
+ }
183
+ });
184
+ });
185
+
186
+ // ─── Hybrid search (Cognee available) ─────────────────────────
187
+
188
+ describe('Cognee + FTS5 hybrid', () => {
189
+ it('should boost results that appear in both FTS5 and Cognee', async () => {
190
+ // Cognee returns circuit-breaker with high vector score
191
+ const mockCognee = makeMockCognee({
192
+ available: true,
193
+ searchResults: [
194
+ {
195
+ id: 'cognee-uuid-1',
196
+ score: 0.95,
197
+ text: '[vault-id:pattern-circuit-breaker]\nCircuit Breaker for External Services\nWrap external service calls in a circuit breaker.',
198
+ searchType: 'CHUNKS',
199
+ },
200
+ ],
201
+ });
202
+ const brain = new Brain(vault, mockCognee);
203
+
204
+ const results = await brain.intelligentSearch('how to handle failing external services');
205
+
206
+ // Circuit breaker should rank high due to Cognee vector boost
207
+ const cbResult = results.find((r) => r.entry.id === 'pattern-circuit-breaker');
208
+ expect(cbResult).toBeDefined();
209
+ expect(cbResult!.breakdown.vector).toBeGreaterThan(0);
210
+ });
211
+
212
+ it('should cross-reference via [vault-id:] prefix', async () => {
213
+ const mockCognee = makeMockCognee({
214
+ available: true,
215
+ searchResults: [
216
+ {
217
+ id: 'cognee-chunk-uuid',
218
+ score: 0.88,
219
+ text: '[vault-id:pattern-retry-backoff]\nRetry with Exponential Backoff\nAlways use exponential backoff.',
220
+ searchType: 'CHUNKS',
221
+ },
222
+ ],
223
+ });
224
+ const brain = new Brain(vault, mockCognee);
225
+
226
+ const results = await brain.intelligentSearch('retry strategy');
227
+ const retryResult = results.find((r) => r.entry.id === 'pattern-retry-backoff');
228
+ expect(retryResult).toBeDefined();
229
+ // Should have vector score from Cognee cross-reference
230
+ expect(retryResult!.breakdown.vector).toBeGreaterThan(0);
231
+ });
232
+
233
+ it('should cross-reference via title matching when vault-id is missing', async () => {
234
+ // Cognee chunk without [vault-id:] prefix but with title on first line
235
+ const mockCognee = makeMockCognee({
236
+ available: true,
237
+ searchResults: [
238
+ {
239
+ id: 'cognee-no-prefix',
240
+ score: 0.82,
241
+ text: 'Semantic Token Priority\nUse semantic tokens over primitive tokens.',
242
+ searchType: 'CHUNKS',
243
+ },
244
+ ],
245
+ });
246
+ const brain = new Brain(vault, mockCognee);
247
+
248
+ const results = await brain.intelligentSearch('design tokens priority');
249
+ const tokenResult = results.find((r) => r.entry.id === 'pattern-token-semantic');
250
+ expect(tokenResult).toBeDefined();
251
+ expect(tokenResult!.breakdown.vector).toBeGreaterThan(0);
252
+ });
253
+
254
+ it('should use COGNEE_WEIGHTS when vector results are present', async () => {
255
+ const mockCognee = makeMockCognee({
256
+ available: true,
257
+ searchResults: [
258
+ {
259
+ id: 'uuid',
260
+ score: 0.9,
261
+ text: '[vault-id:pattern-retry-backoff]\nRetry',
262
+ searchType: 'CHUNKS',
263
+ },
264
+ ],
265
+ });
266
+ const brain = new Brain(vault, mockCognee);
267
+
268
+ const results = await brain.intelligentSearch('retry');
269
+ const retryResult = results.find((r) => r.entry.id === 'pattern-retry-backoff');
270
+ expect(retryResult).toBeDefined();
271
+ // With COGNEE_WEIGHTS, vector component is 35% of total
272
+ // So vector score should contribute meaningfully
273
+ expect(retryResult!.breakdown.vector).toBeGreaterThan(0);
274
+ expect(retryResult!.score).toBeGreaterThan(retryResult!.breakdown.semantic);
275
+ });
276
+
277
+ it('should use DEFAULT_WEIGHTS when Cognee returns no matches', async () => {
278
+ const mockCognee = makeMockCognee({
279
+ available: true,
280
+ searchResults: [], // Cognee returns nothing
281
+ });
282
+ const brain = new Brain(vault, mockCognee);
283
+
284
+ const results = await brain.intelligentSearch('exponential backoff');
285
+ // All results should have vector=0 (no Cognee matches)
286
+ expect(results.every((r) => r.breakdown.vector === 0)).toBe(true);
287
+ });
288
+ });
289
+
290
+ // ─── Graceful degradation ─────────────────────────────────────
291
+
292
+ describe('graceful degradation', () => {
293
+ it('should fall back to FTS5 when Cognee search throws', async () => {
294
+ const mockCognee = makeMockCognee({ available: true });
295
+ (mockCognee.search as ReturnType<typeof vi.fn>).mockRejectedValue(
296
+ new Error('Cognee crashed'),
297
+ );
298
+ const brain = new Brain(vault, mockCognee);
299
+
300
+ const results = await brain.intelligentSearch('retry backoff');
301
+ // Should still return FTS5 results despite Cognee failure
302
+ expect(results.length).toBeGreaterThan(0);
303
+ // All vector scores should be 0 (Cognee failed)
304
+ expect(results.every((r) => r.breakdown.vector === 0)).toBe(true);
305
+ });
306
+
307
+ it('should handle Cognee becoming unavailable mid-session', async () => {
308
+ const mockCognee = makeMockCognee({
309
+ available: true,
310
+ searchResults: [
311
+ {
312
+ id: 'uuid',
313
+ score: 0.9,
314
+ text: '[vault-id:pattern-retry-backoff]\nRetry',
315
+ searchType: 'CHUNKS',
316
+ },
317
+ ],
318
+ });
319
+ const brain = new Brain(vault, mockCognee);
320
+
321
+ // First search — Cognee available
322
+ const results1 = await brain.intelligentSearch('retry');
323
+ const hasVector1 = results1.some((r) => r.breakdown.vector > 0);
324
+ expect(hasVector1).toBe(true);
325
+
326
+ // Cognee goes down
327
+ mockCognee._setAvailable(false);
328
+
329
+ // Second search — should fall back gracefully
330
+ const results2 = await brain.intelligentSearch('retry');
331
+ expect(results2.length).toBeGreaterThan(0);
332
+ expect(results2.every((r) => r.breakdown.vector === 0)).toBe(true);
333
+ });
334
+ });
335
+
336
+ // ─── Score breakdown ──────────────────────────────────────────
337
+
338
+ describe('score breakdown', () => {
339
+ it('should include all scoring dimensions', async () => {
340
+ const brain = new Brain(vault);
341
+ const results = await brain.intelligentSearch('retry');
342
+ expect(results.length).toBeGreaterThan(0);
343
+
344
+ const breakdown = results[0].breakdown;
345
+ expect(breakdown).toHaveProperty('semantic');
346
+ expect(breakdown).toHaveProperty('vector');
347
+ expect(breakdown).toHaveProperty('severity');
348
+ expect(breakdown).toHaveProperty('temporalDecay');
349
+ expect(breakdown).toHaveProperty('tagOverlap');
350
+ expect(breakdown).toHaveProperty('domainMatch');
351
+ expect(breakdown).toHaveProperty('total');
352
+ });
353
+
354
+ it('should have total equal to weighted sum of components', async () => {
355
+ const brain = new Brain(vault);
356
+ const results = await brain.intelligentSearch('retry', { tags: ['networking'] });
357
+ expect(results.length).toBeGreaterThan(0);
358
+
359
+ // Total should be non-negative
360
+ for (const r of results) {
361
+ expect(r.breakdown.total).toBeGreaterThanOrEqual(0);
362
+ expect(r.score).toBe(r.breakdown.total);
363
+ }
364
+ });
365
+
366
+ it('should boost domain match when domain filter is applied', async () => {
367
+ const brain = new Brain(vault);
368
+
369
+ const withDomain = await brain.intelligentSearch('resilience', { domain: 'architecture' });
370
+ const withoutDomain = await brain.intelligentSearch('resilience');
371
+
372
+ // When domain filter matches, domainMatch should be higher
373
+ const archResult = withDomain.find((r) => r.entry.domain === 'architecture');
374
+ const noFilterResult = withoutDomain.find((r) => r.entry.id === archResult?.entry.id);
375
+
376
+ if (archResult && noFilterResult) {
377
+ expect(archResult.breakdown.domainMatch).toBeGreaterThanOrEqual(
378
+ noFilterResult.breakdown.domainMatch,
379
+ );
380
+ }
381
+ });
382
+ });
383
+
384
+ // ─── Zettelkasten link integration ────────────────────────────
385
+
386
+ describe('Zettelkasten links (post-search enrichment)', () => {
387
+ it('should find connected entries via link traversal', () => {
388
+ // Search finds retry-backoff → traverse links → discover circuit-breaker
389
+ const links = linkManager.getLinks('pattern-retry-backoff');
390
+ const linkedIds = links.map((l) =>
391
+ l.sourceId === 'pattern-retry-backoff' ? l.targetId : l.sourceId,
392
+ );
393
+ expect(linkedIds).toContain('pattern-circuit-breaker');
394
+ expect(linkedIds).toContain('anti-pattern-polling-no-timeout');
395
+ });
396
+
397
+ it('should traverse 2 hops to discover indirect connections', () => {
398
+ // retry-backoff → circuit-breaker → polling-no-timeout (via contradicts)
399
+ const traversed = linkManager.traverse('pattern-retry-backoff', 2);
400
+ const ids = traversed.map((e) => e.id);
401
+ expect(ids).toContain('pattern-circuit-breaker');
402
+ expect(ids).toContain('anti-pattern-polling-no-timeout');
403
+ });
404
+
405
+ it('should identify contradicting anti-patterns', () => {
406
+ const links = linkManager.getLinks('anti-pattern-polling-no-timeout');
407
+ const contradictions = links.filter((l) => l.linkType === 'contradicts');
408
+ expect(contradictions.length).toBeGreaterThan(0);
409
+ });
410
+ });
411
+
412
+ // ─── Edge cases ───────────────────────────────────────────────
413
+
414
+ describe('edge cases', () => {
415
+ it('should return empty array for query matching nothing', async () => {
416
+ const brain = new Brain(vault);
417
+ const results = await brain.intelligentSearch('xyzzy_nonexistent_term_12345');
418
+ expect(results).toEqual([]);
419
+ });
420
+
421
+ it('should respect limit option (small corpus guard may return more)', async () => {
422
+ const brain = new Brain(vault);
423
+ const results = await brain.intelligentSearch('pattern', { limit: 2 });
424
+ // Brain has a small corpus guard: when seed < 50 entries and limit would
425
+ // discard > half the seed, it returns all seed results sorted by score.
426
+ // With 5 seed entries and limit=2, the guard activates → returns all 5.
427
+ // This is by design to prevent over-filtering in small knowledge bases.
428
+ expect(results.length).toBeGreaterThan(0);
429
+ // Results should still be sorted by score (highest first)
430
+ for (let i = 1; i < results.length; i++) {
431
+ expect(results[i].score).toBeLessThanOrEqual(results[i - 1].score);
432
+ }
433
+ });
434
+
435
+ it('should filter by type when specified', async () => {
436
+ const brain = new Brain(vault);
437
+ const results = await brain.intelligentSearch('networking timeout', {
438
+ type: 'anti-pattern',
439
+ });
440
+ if (results.length > 0) {
441
+ expect(results.every((r) => r.entry.type === 'anti-pattern')).toBe(true);
442
+ }
443
+ });
444
+
445
+ it('should handle Cognee returning duplicate vault-ids gracefully', async () => {
446
+ const mockCognee = makeMockCognee({
447
+ available: true,
448
+ searchResults: [
449
+ {
450
+ id: 'chunk-1',
451
+ score: 0.9,
452
+ text: '[vault-id:pattern-retry-backoff]\nRetry chunk 1',
453
+ searchType: 'CHUNKS',
454
+ },
455
+ {
456
+ id: 'chunk-2',
457
+ score: 0.7,
458
+ text: '[vault-id:pattern-retry-backoff]\nRetry chunk 2',
459
+ searchType: 'CHUNKS',
460
+ },
461
+ ],
462
+ });
463
+ const brain = new Brain(vault, mockCognee);
464
+
465
+ const results = await brain.intelligentSearch('retry');
466
+ // Should not crash and should use the higher score
467
+ const retryResult = results.find((r) => r.entry.id === 'pattern-retry-backoff');
468
+ expect(retryResult).toBeDefined();
469
+ // Should use max score (0.9, not 0.7)
470
+ expect(retryResult!.breakdown.vector).toBeCloseTo(0.9, 1);
471
+ });
472
+
473
+ it('should handle Cognee returning results with no matching vault entry', async () => {
474
+ const mockCognee = makeMockCognee({
475
+ available: true,
476
+ searchResults: [
477
+ {
478
+ id: 'orphan-chunk',
479
+ score: 0.85,
480
+ text: 'Some completely unrelated text that matches nothing in the vault at all',
481
+ searchType: 'CHUNKS',
482
+ },
483
+ ],
484
+ });
485
+ const brain = new Brain(vault, mockCognee);
486
+
487
+ // Should not crash — unmatched Cognee results are silently dropped
488
+ const results = await brain.intelligentSearch('retry');
489
+ expect(Array.isArray(results)).toBe(true);
490
+ });
491
+ });
492
+ });