@soleri/core 2.9.0 → 2.11.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 (503) hide show
  1. package/dist/agency/agency-manager.d.ts +47 -0
  2. package/dist/agency/agency-manager.d.ts.map +1 -0
  3. package/dist/agency/agency-manager.js +281 -0
  4. package/dist/agency/agency-manager.js.map +1 -0
  5. package/dist/agency/index.d.ts +3 -0
  6. package/dist/agency/index.d.ts.map +1 -0
  7. package/dist/agency/index.js +2 -0
  8. package/dist/agency/index.js.map +1 -0
  9. package/dist/agency/types.d.ts +69 -0
  10. package/dist/agency/types.d.ts.map +1 -0
  11. package/dist/agency/types.js +5 -0
  12. package/dist/agency/types.js.map +1 -0
  13. package/dist/brain/brain.d.ts +0 -1
  14. package/dist/brain/brain.d.ts.map +1 -1
  15. package/dist/brain/brain.js +14 -0
  16. package/dist/brain/brain.js.map +1 -1
  17. package/dist/brain/intelligence.d.ts +5 -1
  18. package/dist/brain/intelligence.d.ts.map +1 -1
  19. package/dist/brain/intelligence.js +83 -0
  20. package/dist/brain/intelligence.js.map +1 -1
  21. package/dist/brain/types.d.ts +21 -0
  22. package/dist/brain/types.d.ts.map +1 -1
  23. package/dist/chat/agent-loop-types.d.ts +82 -0
  24. package/dist/chat/agent-loop-types.d.ts.map +1 -0
  25. package/dist/chat/agent-loop-types.js +8 -0
  26. package/dist/chat/agent-loop-types.js.map +1 -0
  27. package/dist/chat/agent-loop.d.ts +19 -0
  28. package/dist/chat/agent-loop.d.ts.map +1 -0
  29. package/dist/chat/agent-loop.js +261 -0
  30. package/dist/chat/agent-loop.js.map +1 -0
  31. package/dist/chat/auth-manager.d.ts +49 -0
  32. package/dist/chat/auth-manager.d.ts.map +1 -0
  33. package/dist/chat/auth-manager.js +152 -0
  34. package/dist/chat/auth-manager.js.map +1 -0
  35. package/dist/chat/browser-session.d.ts +86 -0
  36. package/dist/chat/browser-session.d.ts.map +1 -0
  37. package/dist/chat/browser-session.js +143 -0
  38. package/dist/chat/browser-session.js.map +1 -0
  39. package/dist/chat/cancellation.d.ts +54 -0
  40. package/dist/chat/cancellation.d.ts.map +1 -0
  41. package/dist/chat/cancellation.js +80 -0
  42. package/dist/chat/cancellation.js.map +1 -0
  43. package/dist/chat/chat-session.d.ts +86 -0
  44. package/dist/chat/chat-session.d.ts.map +1 -0
  45. package/dist/chat/chat-session.js +252 -0
  46. package/dist/chat/chat-session.js.map +1 -0
  47. package/dist/chat/file-handler.d.ts +63 -0
  48. package/dist/chat/file-handler.d.ts.map +1 -0
  49. package/dist/chat/file-handler.js +182 -0
  50. package/dist/chat/file-handler.js.map +1 -0
  51. package/dist/chat/fragment-buffer.d.ts +49 -0
  52. package/dist/chat/fragment-buffer.d.ts.map +1 -0
  53. package/dist/chat/fragment-buffer.js +130 -0
  54. package/dist/chat/fragment-buffer.js.map +1 -0
  55. package/dist/chat/index.d.ts +24 -0
  56. package/dist/chat/index.d.ts.map +1 -0
  57. package/dist/chat/index.js +15 -0
  58. package/dist/chat/index.js.map +1 -0
  59. package/dist/chat/mcp-bridge.d.ts +60 -0
  60. package/dist/chat/mcp-bridge.d.ts.map +1 -0
  61. package/dist/chat/mcp-bridge.js +111 -0
  62. package/dist/chat/mcp-bridge.js.map +1 -0
  63. package/dist/chat/notifications.d.ts +82 -0
  64. package/dist/chat/notifications.d.ts.map +1 -0
  65. package/dist/chat/notifications.js +119 -0
  66. package/dist/chat/notifications.js.map +1 -0
  67. package/dist/chat/output-compressor.d.ts +30 -0
  68. package/dist/chat/output-compressor.d.ts.map +1 -0
  69. package/dist/chat/output-compressor.js +95 -0
  70. package/dist/chat/output-compressor.js.map +1 -0
  71. package/dist/chat/queue.d.ts +91 -0
  72. package/dist/chat/queue.d.ts.map +1 -0
  73. package/dist/chat/queue.js +146 -0
  74. package/dist/chat/queue.js.map +1 -0
  75. package/dist/chat/response-chunker.d.ts +29 -0
  76. package/dist/chat/response-chunker.d.ts.map +1 -0
  77. package/dist/chat/response-chunker.js +163 -0
  78. package/dist/chat/response-chunker.js.map +1 -0
  79. package/dist/chat/self-update.d.ts +62 -0
  80. package/dist/chat/self-update.d.ts.map +1 -0
  81. package/dist/chat/self-update.js +90 -0
  82. package/dist/chat/self-update.js.map +1 -0
  83. package/dist/chat/types.d.ts +105 -0
  84. package/dist/chat/types.d.ts.map +1 -0
  85. package/dist/chat/types.js +8 -0
  86. package/dist/chat/types.js.map +1 -0
  87. package/dist/chat/voice.d.ts +39 -0
  88. package/dist/chat/voice.d.ts.map +1 -0
  89. package/dist/chat/voice.js +80 -0
  90. package/dist/chat/voice.js.map +1 -0
  91. package/dist/claudemd/compose.d.ts +31 -0
  92. package/dist/claudemd/compose.d.ts.map +1 -0
  93. package/dist/claudemd/compose.js +105 -0
  94. package/dist/claudemd/compose.js.map +1 -0
  95. package/dist/claudemd/index.d.ts +5 -0
  96. package/dist/claudemd/index.d.ts.map +1 -0
  97. package/dist/claudemd/index.js +3 -0
  98. package/dist/claudemd/index.js.map +1 -0
  99. package/dist/claudemd/inject.d.ts +31 -0
  100. package/dist/claudemd/inject.d.ts.map +1 -0
  101. package/dist/claudemd/inject.js +157 -0
  102. package/dist/claudemd/inject.js.map +1 -0
  103. package/dist/claudemd/types.d.ts +41 -0
  104. package/dist/claudemd/types.d.ts.map +1 -0
  105. package/dist/claudemd/types.js +5 -0
  106. package/dist/claudemd/types.js.map +1 -0
  107. package/dist/context/context-engine.d.ts +31 -0
  108. package/dist/context/context-engine.d.ts.map +1 -0
  109. package/dist/context/context-engine.js +245 -0
  110. package/dist/context/context-engine.js.map +1 -0
  111. package/dist/context/index.d.ts +3 -0
  112. package/dist/context/index.d.ts.map +1 -0
  113. package/dist/context/index.js +2 -0
  114. package/dist/context/index.js.map +1 -0
  115. package/dist/context/types.d.ts +54 -0
  116. package/dist/context/types.d.ts.map +1 -0
  117. package/dist/context/types.js +5 -0
  118. package/dist/context/types.js.map +1 -0
  119. package/dist/enforcement/adapters/claude-code.d.ts +18 -0
  120. package/dist/enforcement/adapters/claude-code.d.ts.map +1 -0
  121. package/dist/enforcement/adapters/claude-code.js +106 -0
  122. package/dist/enforcement/adapters/claude-code.js.map +1 -0
  123. package/dist/enforcement/adapters/index.d.ts +2 -0
  124. package/dist/enforcement/adapters/index.d.ts.map +1 -0
  125. package/dist/enforcement/adapters/index.js +2 -0
  126. package/dist/enforcement/adapters/index.js.map +1 -0
  127. package/dist/enforcement/index.d.ts +4 -0
  128. package/dist/enforcement/index.d.ts.map +1 -0
  129. package/dist/enforcement/index.js +3 -0
  130. package/dist/enforcement/index.js.map +1 -0
  131. package/dist/enforcement/registry.d.ts +23 -0
  132. package/dist/enforcement/registry.d.ts.map +1 -0
  133. package/dist/enforcement/registry.js +63 -0
  134. package/dist/enforcement/registry.js.map +1 -0
  135. package/dist/enforcement/types.d.ts +51 -0
  136. package/dist/enforcement/types.d.ts.map +1 -0
  137. package/dist/enforcement/types.js +8 -0
  138. package/dist/enforcement/types.js.map +1 -0
  139. package/dist/facades/facade-factory.d.ts +10 -3
  140. package/dist/facades/facade-factory.d.ts.map +1 -1
  141. package/dist/facades/facade-factory.js +94 -5
  142. package/dist/facades/facade-factory.js.map +1 -1
  143. package/dist/facades/types.d.ts +15 -1
  144. package/dist/facades/types.d.ts.map +1 -1
  145. package/dist/facades/types.js +6 -0
  146. package/dist/facades/types.js.map +1 -1
  147. package/dist/health/health-registry.d.ts +40 -0
  148. package/dist/health/health-registry.d.ts.map +1 -0
  149. package/dist/health/health-registry.js +134 -0
  150. package/dist/health/health-registry.js.map +1 -0
  151. package/dist/health/index.d.ts +5 -0
  152. package/dist/health/index.d.ts.map +1 -0
  153. package/dist/health/index.js +3 -0
  154. package/dist/health/index.js.map +1 -0
  155. package/dist/health/vault-integrity.d.ts +13 -0
  156. package/dist/health/vault-integrity.d.ts.map +1 -0
  157. package/dist/health/vault-integrity.js +49 -0
  158. package/dist/health/vault-integrity.js.map +1 -0
  159. package/dist/index.d.ts +67 -6
  160. package/dist/index.d.ts.map +1 -1
  161. package/dist/index.js +51 -3
  162. package/dist/index.js.map +1 -1
  163. package/dist/intake/intake-pipeline.d.ts +0 -7
  164. package/dist/intake/intake-pipeline.d.ts.map +1 -1
  165. package/dist/intake/intake-pipeline.js +1 -1
  166. package/dist/intake/intake-pipeline.js.map +1 -1
  167. package/dist/intelligence/types.d.ts +1 -0
  168. package/dist/intelligence/types.d.ts.map +1 -1
  169. package/dist/migrations/index.d.ts +6 -0
  170. package/dist/migrations/index.d.ts.map +1 -0
  171. package/dist/migrations/index.js +5 -0
  172. package/dist/migrations/index.js.map +1 -0
  173. package/dist/migrations/migration-runner.d.ts +51 -0
  174. package/dist/migrations/migration-runner.d.ts.map +1 -0
  175. package/dist/migrations/migration-runner.js +141 -0
  176. package/dist/migrations/migration-runner.js.map +1 -0
  177. package/dist/packs/index.d.ts +10 -0
  178. package/dist/packs/index.d.ts.map +1 -0
  179. package/dist/packs/index.js +8 -0
  180. package/dist/packs/index.js.map +1 -0
  181. package/dist/packs/lockfile.d.ts +97 -0
  182. package/dist/packs/lockfile.d.ts.map +1 -0
  183. package/dist/packs/lockfile.js +129 -0
  184. package/dist/packs/lockfile.js.map +1 -0
  185. package/dist/packs/pack-installer.d.ts +41 -0
  186. package/dist/packs/pack-installer.d.ts.map +1 -0
  187. package/dist/packs/pack-installer.js +253 -0
  188. package/dist/packs/pack-installer.js.map +1 -0
  189. package/dist/packs/resolver.d.ts +51 -0
  190. package/dist/packs/resolver.d.ts.map +1 -0
  191. package/dist/packs/resolver.js +195 -0
  192. package/dist/packs/resolver.js.map +1 -0
  193. package/dist/packs/types.d.ts +186 -0
  194. package/dist/packs/types.d.ts.map +1 -0
  195. package/dist/packs/types.js +69 -0
  196. package/dist/packs/types.js.map +1 -0
  197. package/dist/persistence/postgres-provider.d.ts +42 -7
  198. package/dist/persistence/postgres-provider.d.ts.map +1 -1
  199. package/dist/persistence/postgres-provider.js +187 -46
  200. package/dist/persistence/postgres-provider.js.map +1 -1
  201. package/dist/planning/gap-analysis.d.ts.map +1 -1
  202. package/dist/planning/gap-analysis.js +3 -1
  203. package/dist/planning/gap-analysis.js.map +1 -1
  204. package/dist/playbooks/index.d.ts +2 -0
  205. package/dist/playbooks/index.d.ts.map +1 -1
  206. package/dist/playbooks/index.js +2 -0
  207. package/dist/playbooks/index.js.map +1 -1
  208. package/dist/playbooks/playbook-executor.d.ts +100 -0
  209. package/dist/playbooks/playbook-executor.d.ts.map +1 -0
  210. package/dist/playbooks/playbook-executor.js +207 -0
  211. package/dist/playbooks/playbook-executor.js.map +1 -0
  212. package/dist/plugins/index.d.ts +7 -0
  213. package/dist/plugins/index.d.ts.map +1 -0
  214. package/dist/plugins/index.js +7 -0
  215. package/dist/plugins/index.js.map +1 -0
  216. package/dist/plugins/plugin-loader.d.ts +28 -0
  217. package/dist/plugins/plugin-loader.d.ts.map +1 -0
  218. package/dist/plugins/plugin-loader.js +150 -0
  219. package/dist/plugins/plugin-loader.js.map +1 -0
  220. package/dist/plugins/plugin-registry.d.ts +58 -0
  221. package/dist/plugins/plugin-registry.d.ts.map +1 -0
  222. package/dist/plugins/plugin-registry.js +157 -0
  223. package/dist/plugins/plugin-registry.js.map +1 -0
  224. package/dist/plugins/types.d.ts +180 -0
  225. package/dist/plugins/types.d.ts.map +1 -0
  226. package/dist/plugins/types.js +48 -0
  227. package/dist/plugins/types.js.map +1 -0
  228. package/dist/runtime/admin-extra-ops.d.ts.map +1 -1
  229. package/dist/runtime/admin-extra-ops.js +181 -8
  230. package/dist/runtime/admin-extra-ops.js.map +1 -1
  231. package/dist/runtime/capture-ops.d.ts.map +1 -1
  232. package/dist/runtime/capture-ops.js +106 -7
  233. package/dist/runtime/capture-ops.js.map +1 -1
  234. package/dist/runtime/deprecation.d.ts +33 -0
  235. package/dist/runtime/deprecation.d.ts.map +1 -0
  236. package/dist/runtime/deprecation.js +41 -0
  237. package/dist/runtime/deprecation.js.map +1 -0
  238. package/dist/runtime/facades/admin-facade.d.ts.map +1 -1
  239. package/dist/runtime/facades/admin-facade.js +12 -1
  240. package/dist/runtime/facades/admin-facade.js.map +1 -1
  241. package/dist/runtime/facades/agency-facade.d.ts +7 -0
  242. package/dist/runtime/facades/agency-facade.d.ts.map +1 -0
  243. package/dist/runtime/facades/agency-facade.js +103 -0
  244. package/dist/runtime/facades/agency-facade.js.map +1 -0
  245. package/dist/runtime/facades/brain-facade.d.ts.map +1 -1
  246. package/dist/runtime/facades/brain-facade.js +58 -0
  247. package/dist/runtime/facades/brain-facade.js.map +1 -1
  248. package/dist/runtime/facades/chat-facade.d.ts +7 -0
  249. package/dist/runtime/facades/chat-facade.d.ts.map +1 -0
  250. package/dist/runtime/facades/chat-facade.js +808 -0
  251. package/dist/runtime/facades/chat-facade.js.map +1 -0
  252. package/dist/runtime/facades/context-facade.d.ts +7 -0
  253. package/dist/runtime/facades/context-facade.d.ts.map +1 -0
  254. package/dist/runtime/facades/context-facade.js +45 -0
  255. package/dist/runtime/facades/context-facade.js.map +1 -0
  256. package/dist/runtime/facades/index.d.ts.map +1 -1
  257. package/dist/runtime/facades/index.js +18 -0
  258. package/dist/runtime/facades/index.js.map +1 -1
  259. package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
  260. package/dist/runtime/facades/vault-facade.js +247 -1
  261. package/dist/runtime/facades/vault-facade.js.map +1 -1
  262. package/dist/runtime/feature-flags.d.ts +18 -0
  263. package/dist/runtime/feature-flags.d.ts.map +1 -0
  264. package/dist/runtime/feature-flags.js +90 -0
  265. package/dist/runtime/feature-flags.js.map +1 -0
  266. package/dist/runtime/pack-ops.d.ts +9 -0
  267. package/dist/runtime/pack-ops.d.ts.map +1 -0
  268. package/dist/runtime/pack-ops.js +76 -0
  269. package/dist/runtime/pack-ops.js.map +1 -0
  270. package/dist/runtime/playbook-ops.d.ts +3 -7
  271. package/dist/runtime/playbook-ops.d.ts.map +1 -1
  272. package/dist/runtime/playbook-ops.js +101 -10
  273. package/dist/runtime/playbook-ops.js.map +1 -1
  274. package/dist/runtime/plugin-ops.d.ts +9 -0
  275. package/dist/runtime/plugin-ops.d.ts.map +1 -0
  276. package/dist/runtime/plugin-ops.js +235 -0
  277. package/dist/runtime/plugin-ops.js.map +1 -0
  278. package/dist/runtime/runtime.d.ts.map +1 -1
  279. package/dist/runtime/runtime.js +72 -5
  280. package/dist/runtime/runtime.js.map +1 -1
  281. package/dist/runtime/telemetry-ops.d.ts +10 -0
  282. package/dist/runtime/telemetry-ops.d.ts.map +1 -0
  283. package/dist/runtime/telemetry-ops.js +53 -0
  284. package/dist/runtime/telemetry-ops.js.map +1 -0
  285. package/dist/runtime/types.d.ts +35 -0
  286. package/dist/runtime/types.d.ts.map +1 -1
  287. package/dist/runtime/vault-sharing-ops.d.ts +13 -0
  288. package/dist/runtime/vault-sharing-ops.d.ts.map +1 -0
  289. package/dist/runtime/vault-sharing-ops.js +345 -0
  290. package/dist/runtime/vault-sharing-ops.js.map +1 -0
  291. package/dist/streams/index.d.ts +1 -1
  292. package/dist/streams/index.d.ts.map +1 -1
  293. package/dist/streams/index.js +1 -1
  294. package/dist/streams/index.js.map +1 -1
  295. package/dist/streams/replayable-stream.d.ts +13 -1
  296. package/dist/streams/replayable-stream.d.ts.map +1 -1
  297. package/dist/streams/replayable-stream.js +27 -3
  298. package/dist/streams/replayable-stream.js.map +1 -1
  299. package/dist/text/similarity.d.ts +0 -1
  300. package/dist/text/similarity.d.ts.map +1 -1
  301. package/dist/text/similarity.js +1 -1
  302. package/dist/text/similarity.js.map +1 -1
  303. package/dist/transport/http-server.d.ts +56 -0
  304. package/dist/transport/http-server.d.ts.map +1 -0
  305. package/dist/transport/http-server.js +210 -0
  306. package/dist/transport/http-server.js.map +1 -0
  307. package/dist/transport/index.d.ts +11 -0
  308. package/dist/transport/index.d.ts.map +1 -0
  309. package/dist/transport/index.js +10 -0
  310. package/dist/transport/index.js.map +1 -0
  311. package/dist/transport/lsp-server.d.ts +140 -0
  312. package/dist/transport/lsp-server.d.ts.map +1 -0
  313. package/dist/transport/lsp-server.js +239 -0
  314. package/dist/transport/lsp-server.js.map +1 -0
  315. package/dist/transport/rate-limiter.d.ts +35 -0
  316. package/dist/transport/rate-limiter.d.ts.map +1 -0
  317. package/dist/transport/rate-limiter.js +72 -0
  318. package/dist/transport/rate-limiter.js.map +1 -0
  319. package/dist/transport/session-manager.d.ts +49 -0
  320. package/dist/transport/session-manager.d.ts.map +1 -0
  321. package/dist/transport/session-manager.js +83 -0
  322. package/dist/transport/session-manager.js.map +1 -0
  323. package/dist/transport/token-auth.d.ts +29 -0
  324. package/dist/transport/token-auth.d.ts.map +1 -0
  325. package/dist/transport/token-auth.js +84 -0
  326. package/dist/transport/token-auth.js.map +1 -0
  327. package/dist/transport/types.d.ts +61 -0
  328. package/dist/transport/types.d.ts.map +1 -0
  329. package/dist/transport/types.js +5 -0
  330. package/dist/transport/types.js.map +1 -0
  331. package/dist/transport/ws-server.d.ts +78 -0
  332. package/dist/transport/ws-server.d.ts.map +1 -0
  333. package/dist/transport/ws-server.js +342 -0
  334. package/dist/transport/ws-server.js.map +1 -0
  335. package/dist/vault/git-vault-sync.d.ts +107 -0
  336. package/dist/vault/git-vault-sync.d.ts.map +1 -0
  337. package/dist/vault/git-vault-sync.js +251 -0
  338. package/dist/vault/git-vault-sync.js.map +1 -0
  339. package/dist/vault/knowledge-review.d.ts +67 -0
  340. package/dist/vault/knowledge-review.d.ts.map +1 -0
  341. package/dist/vault/knowledge-review.js +133 -0
  342. package/dist/vault/knowledge-review.js.map +1 -0
  343. package/dist/vault/obsidian-sync.d.ts +94 -0
  344. package/dist/vault/obsidian-sync.d.ts.map +1 -0
  345. package/dist/vault/obsidian-sync.js +247 -0
  346. package/dist/vault/obsidian-sync.js.map +1 -0
  347. package/dist/vault/scope-detector.d.ts +31 -0
  348. package/dist/vault/scope-detector.d.ts.map +1 -0
  349. package/dist/vault/scope-detector.js +182 -0
  350. package/dist/vault/scope-detector.js.map +1 -0
  351. package/dist/vault/vault-branching.d.ts +71 -0
  352. package/dist/vault/vault-branching.d.ts.map +1 -0
  353. package/dist/vault/vault-branching.js +180 -0
  354. package/dist/vault/vault-branching.js.map +1 -0
  355. package/dist/vault/vault-manager.d.ts +89 -0
  356. package/dist/vault/vault-manager.d.ts.map +1 -0
  357. package/dist/vault/vault-manager.js +199 -0
  358. package/dist/vault/vault-manager.js.map +1 -0
  359. package/dist/vault/vault-types.d.ts +30 -0
  360. package/dist/vault/vault-types.d.ts.map +1 -0
  361. package/dist/vault/vault-types.js +10 -0
  362. package/dist/vault/vault-types.js.map +1 -0
  363. package/dist/vault/vault.d.ts +10 -0
  364. package/dist/vault/vault.d.ts.map +1 -1
  365. package/dist/vault/vault.js +36 -3
  366. package/dist/vault/vault.js.map +1 -1
  367. package/package.json +1 -1
  368. package/src/__tests__/admin-extra-ops.test.ts +31 -11
  369. package/src/__tests__/agency-manager.test.ts +374 -0
  370. package/src/__tests__/agent-loop.test.ts +256 -0
  371. package/src/__tests__/capture-ops.test.ts +275 -0
  372. package/src/__tests__/chat-differentiators.test.ts +251 -0
  373. package/src/__tests__/chat-enhanced.test.ts +390 -0
  374. package/src/__tests__/chat-transport.test.ts +665 -0
  375. package/src/__tests__/claudemd.test.ts +282 -0
  376. package/src/__tests__/context-engine.test.ts +256 -0
  377. package/src/__tests__/core-ops.test.ts +97 -5
  378. package/src/__tests__/deprecation.test.ts +78 -0
  379. package/src/__tests__/enforcement.test.ts +153 -0
  380. package/src/__tests__/facade-factory.test.ts +271 -0
  381. package/src/__tests__/feature-flags.test.ts +138 -0
  382. package/src/__tests__/git-vault-sync.test.ts +230 -0
  383. package/src/__tests__/health-registry.test.ts +173 -0
  384. package/src/__tests__/knowledge-review.test.ts +104 -0
  385. package/src/__tests__/lsp-transport.test.ts +442 -0
  386. package/src/__tests__/migration-runner.test.ts +170 -0
  387. package/src/__tests__/normalize.test.ts +10 -0
  388. package/src/__tests__/obsidian-sync.test.ts +354 -0
  389. package/src/__tests__/pack-lockfile.test.ts +261 -0
  390. package/src/__tests__/pack-ops.test.ts +146 -0
  391. package/src/__tests__/pack-system.test.ts +423 -0
  392. package/src/__tests__/playbook-executor.test.ts +249 -0
  393. package/src/__tests__/playbook-ops-execution.test.ts +189 -0
  394. package/src/__tests__/plugin-ops.test.ts +411 -0
  395. package/src/__tests__/plugin-system.test.ts +509 -0
  396. package/src/__tests__/postgres-provider.test.ts +64 -6
  397. package/src/__tests__/replayable-stream.test.ts +112 -1
  398. package/src/__tests__/scope-detector.test.ts +121 -0
  399. package/src/__tests__/session-lifecycle.test.ts +259 -0
  400. package/src/__tests__/transport.test.ts +758 -0
  401. package/src/__tests__/vault-branching.test.ts +274 -0
  402. package/src/__tests__/vault-connect.test.ts +179 -0
  403. package/src/__tests__/vault-integrity.test.ts +71 -0
  404. package/src/__tests__/vault-manager.test.ts +238 -0
  405. package/src/__tests__/vault-scaling.test.ts +281 -0
  406. package/src/__tests__/vault-sharing.test.ts +270 -0
  407. package/src/__tests__/ws-transport.test.ts +479 -0
  408. package/src/agency/agency-manager.ts +326 -0
  409. package/src/agency/index.ts +13 -0
  410. package/src/agency/types.ts +88 -0
  411. package/src/brain/brain.ts +15 -11
  412. package/src/brain/intelligence.ts +103 -0
  413. package/src/brain/types.ts +26 -0
  414. package/src/chat/agent-loop-types.ts +99 -0
  415. package/src/chat/agent-loop.ts +357 -0
  416. package/src/chat/auth-manager.ts +171 -0
  417. package/src/chat/browser-session.ts +188 -0
  418. package/src/chat/cancellation.ts +99 -0
  419. package/src/chat/chat-session.ts +283 -0
  420. package/src/chat/file-handler.ts +230 -0
  421. package/src/chat/fragment-buffer.ts +160 -0
  422. package/src/chat/index.ts +72 -0
  423. package/src/chat/mcp-bridge.ts +135 -0
  424. package/src/chat/notifications.ts +164 -0
  425. package/src/chat/output-compressor.ts +116 -0
  426. package/src/chat/queue.ts +208 -0
  427. package/src/chat/response-chunker.ts +200 -0
  428. package/src/chat/self-update.ts +117 -0
  429. package/src/chat/types.ts +126 -0
  430. package/src/chat/voice.ts +134 -0
  431. package/src/claudemd/compose.ts +142 -0
  432. package/src/claudemd/index.ts +17 -0
  433. package/src/claudemd/inject.ts +170 -0
  434. package/src/claudemd/types.ts +45 -0
  435. package/src/context/context-engine.ts +302 -0
  436. package/src/context/index.ts +11 -0
  437. package/src/context/types.ts +69 -0
  438. package/src/enforcement/adapters/claude-code.ts +135 -0
  439. package/src/enforcement/adapters/index.ts +1 -0
  440. package/src/enforcement/index.ts +10 -0
  441. package/src/enforcement/registry.ts +82 -0
  442. package/src/enforcement/types.ts +56 -0
  443. package/src/facades/facade-factory.ts +138 -5
  444. package/src/facades/types.ts +21 -0
  445. package/src/health/health-registry.ts +165 -0
  446. package/src/health/index.ts +11 -0
  447. package/src/health/vault-integrity.ts +66 -0
  448. package/src/index.ts +294 -2
  449. package/src/intake/intake-pipeline.ts +1 -1
  450. package/src/intelligence/types.ts +1 -0
  451. package/src/migrations/index.ts +6 -0
  452. package/src/migrations/migration-runner.ts +185 -0
  453. package/src/packs/index.ts +20 -0
  454. package/src/packs/lockfile.ts +180 -0
  455. package/src/packs/pack-installer.ts +289 -0
  456. package/src/packs/resolver.ts +237 -0
  457. package/src/packs/types.ts +125 -0
  458. package/src/persistence/postgres-provider.ts +211 -58
  459. package/src/planning/gap-analysis.ts +52 -7
  460. package/src/playbooks/index.ts +11 -0
  461. package/src/playbooks/playbook-executor.ts +301 -0
  462. package/src/plugins/index.ts +19 -0
  463. package/src/plugins/plugin-loader.ts +183 -0
  464. package/src/plugins/plugin-registry.ts +187 -0
  465. package/src/plugins/types.ts +119 -0
  466. package/src/runtime/admin-extra-ops.ts +193 -8
  467. package/src/runtime/capture-ops.ts +113 -8
  468. package/src/runtime/deprecation.ts +58 -0
  469. package/src/runtime/facades/admin-facade.ts +16 -1
  470. package/src/runtime/facades/agency-facade.ts +111 -0
  471. package/src/runtime/facades/brain-facade.ts +60 -0
  472. package/src/runtime/facades/chat-facade.ts +918 -0
  473. package/src/runtime/facades/context-facade.ts +55 -0
  474. package/src/runtime/facades/index.ts +22 -1
  475. package/src/runtime/facades/vault-facade.ts +261 -1
  476. package/src/runtime/feature-flags.ts +101 -0
  477. package/src/runtime/pack-ops.ts +85 -0
  478. package/src/runtime/playbook-ops.ts +113 -9
  479. package/src/runtime/plugin-ops.ts +258 -0
  480. package/src/runtime/runtime.ts +84 -5
  481. package/src/runtime/telemetry-ops.ts +57 -0
  482. package/src/runtime/types.ts +35 -0
  483. package/src/runtime/vault-sharing-ops.ts +372 -0
  484. package/src/streams/index.ts +1 -1
  485. package/src/streams/replayable-stream.ts +34 -3
  486. package/src/text/similarity.ts +1 -1
  487. package/src/transport/http-server.ts +269 -0
  488. package/src/transport/index.ts +48 -0
  489. package/src/transport/lsp-server.ts +401 -0
  490. package/src/transport/rate-limiter.ts +97 -0
  491. package/src/transport/session-manager.ts +120 -0
  492. package/src/transport/token-auth.ts +96 -0
  493. package/src/transport/types.ts +66 -0
  494. package/src/transport/ws-server.ts +415 -0
  495. package/src/vault/git-vault-sync.ts +318 -0
  496. package/src/vault/knowledge-review.ts +221 -0
  497. package/src/vault/obsidian-sync.ts +346 -0
  498. package/src/vault/scope-detector.ts +219 -0
  499. package/src/vault/vault-branching.ts +264 -0
  500. package/src/vault/vault-manager.ts +237 -0
  501. package/src/vault/vault-types.ts +50 -0
  502. package/src/vault/vault.ts +41 -3
  503. package/src/governance/index.ts +0 -18
@@ -0,0 +1,282 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { join } from 'node:path';
3
+ import { mkdtempSync, rmSync, readFileSync, writeFileSync } from 'node:fs';
4
+ import { tmpdir } from 'node:os';
5
+ import {
6
+ composeCLAUDEmd,
7
+ OPEN_MARKER,
8
+ CLOSE_MARKER,
9
+ USER_ZONE_OPEN,
10
+ USER_ZONE_CLOSE,
11
+ } from '../claudemd/compose.js';
12
+ import {
13
+ injectCLAUDEmd,
14
+ removeCLAUDEmd,
15
+ hasCLAUDEmdBlock,
16
+ extractUserZone,
17
+ } from '../claudemd/inject.js';
18
+ import type { AgentMeta } from '../claudemd/types.js';
19
+ import type { FacadeConfig } from '../facades/types.js';
20
+
21
+ const testAgent: AgentMeta = {
22
+ id: 'test-agent',
23
+ name: 'TestAgent',
24
+ activationPhrase: 'Hello, TestAgent!',
25
+ deactivationPhrase: 'Goodbye, TestAgent!',
26
+ activateCommand: 'test-agent_core op:activate params:{ projectPath: "." }',
27
+ deactivateCommand: 'test-agent_core op:activate params:{ deactivate: true }',
28
+ };
29
+
30
+ const testFacades: FacadeConfig[] = [
31
+ {
32
+ name: 'test-agent_core',
33
+ description: 'Core facade',
34
+ ops: [
35
+ { name: 'health', description: 'Health check', auth: 'read', handler: async () => ({}) },
36
+ { name: 'search', description: 'Search vault', auth: 'read', handler: async () => ({}) },
37
+ { name: 'capture', description: 'Capture', auth: 'write', handler: async () => ({}) },
38
+ ],
39
+ },
40
+ {
41
+ name: 'test-agent_design',
42
+ description: 'Design facade',
43
+ ops: [
44
+ { name: 'check_contrast', description: 'Contrast', auth: 'read', handler: async () => ({}) },
45
+ { name: 'validate_token', description: 'Validate', auth: 'read', handler: async () => ({}) },
46
+ ],
47
+ },
48
+ ];
49
+
50
+ describe('composeCLAUDEmd', () => {
51
+ it('produces content wrapped in versioned markers', () => {
52
+ const result = composeCLAUDEmd(testAgent, testFacades);
53
+ expect(result).toContain(OPEN_MARKER);
54
+ expect(result).toContain(CLOSE_MARKER);
55
+ expect(result).toContain('v1');
56
+ });
57
+
58
+ it('includes activation phrases', () => {
59
+ const result = composeCLAUDEmd(testAgent, testFacades);
60
+ expect(result).toContain('Hello, TestAgent!');
61
+ expect(result).toContain('Goodbye, TestAgent!');
62
+ });
63
+
64
+ it('includes session start protocol', () => {
65
+ const result = composeCLAUDEmd(testAgent, testFacades);
66
+ expect(result).toContain('Session Start Protocol');
67
+ expect(result).toContain('test-agent_core op:register');
68
+ });
69
+
70
+ it('generates facade reference table', () => {
71
+ const result = composeCLAUDEmd(testAgent, testFacades);
72
+ expect(result).toContain('| Facade | Key Ops |');
73
+ expect(result).toContain('`test-agent_core`');
74
+ expect(result).toContain('`test-agent_design`');
75
+ expect(result).toContain('`health`');
76
+ expect(result).toContain('`check_contrast`');
77
+ });
78
+
79
+ it('includes global instructions sorted by priority', () => {
80
+ const agent: AgentMeta = {
81
+ ...testAgent,
82
+ globalInstructions: [
83
+ { heading: 'Low Priority', content: 'Come last', priority: 90 },
84
+ { heading: 'High Priority', content: 'Come first', priority: 10 },
85
+ ],
86
+ };
87
+ const result = composeCLAUDEmd(agent, testFacades);
88
+ const highIdx = result.indexOf('High Priority');
89
+ const lowIdx = result.indexOf('Low Priority');
90
+ expect(highIdx).toBeLessThan(lowIdx);
91
+ });
92
+
93
+ it('includes facade behavioral rules', () => {
94
+ const instructions = new Map([
95
+ [
96
+ 'test-agent_core',
97
+ {
98
+ heading: 'Planning',
99
+ rules: ['Always plan before coding', 'Wait for approval'],
100
+ priority: 10,
101
+ },
102
+ ],
103
+ ]);
104
+ const result = composeCLAUDEmd(testAgent, testFacades, { facadeInstructions: instructions });
105
+ expect(result).toContain('## Planning');
106
+ expect(result).toContain('- Always plan before coding');
107
+ expect(result).toContain('- Wait for approval');
108
+ });
109
+
110
+ it('includes user-safe zone when requested', () => {
111
+ const result = composeCLAUDEmd(testAgent, testFacades, { includeUserZone: true });
112
+ expect(result).toContain(USER_ZONE_OPEN);
113
+ expect(result).toContain(USER_ZONE_CLOSE);
114
+ });
115
+ });
116
+
117
+ describe('injectCLAUDEmd', () => {
118
+ let tempDir: string;
119
+ let filePath: string;
120
+
121
+ beforeEach(() => {
122
+ tempDir = mkdtempSync(join(tmpdir(), 'soleri-claudemd-'));
123
+ filePath = join(tempDir, 'CLAUDE.md');
124
+ });
125
+
126
+ afterEach(() => {
127
+ rmSync(tempDir, { recursive: true, force: true });
128
+ });
129
+
130
+ it('creates a new file if none exists', () => {
131
+ const block = composeCLAUDEmd(testAgent, testFacades);
132
+ const result = injectCLAUDEmd(filePath, block);
133
+ expect(result.success).toBe(true);
134
+ expect(result.action).toBe('injected');
135
+ const content = readFileSync(filePath, 'utf-8');
136
+ expect(content).toContain(OPEN_MARKER);
137
+ });
138
+
139
+ it('appends to existing file without markers', () => {
140
+ writeFileSync(filePath, '# My Project\n\nSome user content.\n');
141
+ const block = composeCLAUDEmd(testAgent, testFacades);
142
+ const result = injectCLAUDEmd(filePath, block);
143
+ expect(result.action).toBe('injected');
144
+ const content = readFileSync(filePath, 'utf-8');
145
+ expect(content).toContain('# My Project');
146
+ expect(content).toContain(OPEN_MARKER);
147
+ });
148
+
149
+ it('replaces existing block', () => {
150
+ const block1 = composeCLAUDEmd(testAgent, testFacades);
151
+ writeFileSync(filePath, `# Header\n\n${block1}\n\n# Footer\n`);
152
+
153
+ const newAgent = { ...testAgent, name: 'UpdatedAgent' };
154
+ const block2 = composeCLAUDEmd(newAgent, testFacades);
155
+ const result = injectCLAUDEmd(filePath, block2);
156
+
157
+ expect(result.action).toBe('replaced');
158
+ expect(result.diffDetected).toBe(true);
159
+ const content = readFileSync(filePath, 'utf-8');
160
+ expect(content).toContain('UpdatedAgent');
161
+ expect(content).not.toContain('TestAgent Mode');
162
+ expect(content).toContain('# Header');
163
+ expect(content).toContain('# Footer');
164
+ });
165
+
166
+ it('skips write when content is identical', () => {
167
+ const block = composeCLAUDEmd(testAgent, testFacades);
168
+ writeFileSync(filePath, block);
169
+ const result = injectCLAUDEmd(filePath, block);
170
+ expect(result.action).toBe('skipped');
171
+ expect(result.diffDetected).toBe(false);
172
+ });
173
+
174
+ it('preserves user-safe zone content on regeneration', () => {
175
+ const block1 = composeCLAUDEmd(testAgent, testFacades, { includeUserZone: true });
176
+ // Simulate user adding custom content inside the zone
177
+ const customContent = 'My custom instructions here';
178
+ const withCustom = block1.replace(
179
+ `${USER_ZONE_OPEN}\n\n${USER_ZONE_CLOSE}`,
180
+ `${USER_ZONE_OPEN}\n${customContent}\n${USER_ZONE_CLOSE}`,
181
+ );
182
+ writeFileSync(filePath, withCustom);
183
+
184
+ // Regenerate — should preserve user content
185
+ const block2 = composeCLAUDEmd(testAgent, testFacades, { includeUserZone: true });
186
+ const result = injectCLAUDEmd(filePath, block2);
187
+ expect(result.success).toBe(true);
188
+ const content = readFileSync(filePath, 'utf-8');
189
+ expect(content).toContain(customContent);
190
+ });
191
+
192
+ it('migrates legacy unversioned markers', () => {
193
+ const legacyBlock = '<!-- agent:mode -->\n\nOld content\n\n<!-- /agent:mode -->';
194
+ writeFileSync(filePath, `# Header\n\n${legacyBlock}\n`);
195
+
196
+ const block = composeCLAUDEmd(testAgent, testFacades);
197
+ const result = injectCLAUDEmd(filePath, block);
198
+ expect(result.action).toBe('replaced');
199
+ const content = readFileSync(filePath, 'utf-8');
200
+ expect(content).toContain(OPEN_MARKER); // v1 marker
201
+ expect(content).not.toContain('Old content');
202
+ });
203
+ });
204
+
205
+ describe('removeCLAUDEmd', () => {
206
+ let tempDir: string;
207
+ let filePath: string;
208
+
209
+ beforeEach(() => {
210
+ tempDir = mkdtempSync(join(tmpdir(), 'soleri-claudemd-'));
211
+ filePath = join(tempDir, 'CLAUDE.md');
212
+ });
213
+
214
+ afterEach(() => {
215
+ rmSync(tempDir, { recursive: true, force: true });
216
+ });
217
+
218
+ it('removes agent block and preserves surrounding content', () => {
219
+ const block = composeCLAUDEmd(testAgent, testFacades);
220
+ writeFileSync(filePath, `# Header\n\n${block}\n\n# Footer\n`);
221
+ const result = removeCLAUDEmd(filePath);
222
+ expect(result.action).toBe('removed');
223
+ const content = readFileSync(filePath, 'utf-8');
224
+ expect(content).toContain('# Header');
225
+ expect(content).toContain('# Footer');
226
+ expect(content).not.toContain(OPEN_MARKER);
227
+ });
228
+
229
+ it('returns not_present when no block exists', () => {
230
+ writeFileSync(filePath, '# Just a file\n');
231
+ expect(removeCLAUDEmd(filePath).action).toBe('not_present');
232
+ });
233
+
234
+ it('returns not_present for missing file', () => {
235
+ expect(removeCLAUDEmd(filePath).action).toBe('not_present');
236
+ });
237
+ });
238
+
239
+ describe('hasCLAUDEmdBlock', () => {
240
+ let tempDir: string;
241
+ let filePath: string;
242
+
243
+ beforeEach(() => {
244
+ tempDir = mkdtempSync(join(tmpdir(), 'soleri-claudemd-'));
245
+ filePath = join(tempDir, 'CLAUDE.md');
246
+ });
247
+
248
+ afterEach(() => {
249
+ rmSync(tempDir, { recursive: true, force: true });
250
+ });
251
+
252
+ it('returns true when block exists', () => {
253
+ const block = composeCLAUDEmd(testAgent, testFacades);
254
+ writeFileSync(filePath, block);
255
+ expect(hasCLAUDEmdBlock(filePath)).toBe(true);
256
+ });
257
+
258
+ it('returns false when no block', () => {
259
+ writeFileSync(filePath, '# No agent block\n');
260
+ expect(hasCLAUDEmdBlock(filePath)).toBe(false);
261
+ });
262
+
263
+ it('returns false for missing file', () => {
264
+ expect(hasCLAUDEmdBlock(filePath)).toBe(false);
265
+ });
266
+ });
267
+
268
+ describe('extractUserZone', () => {
269
+ it('extracts content between user zone markers', () => {
270
+ const content = `Some stuff\n${USER_ZONE_OPEN}\nMy custom stuff\n${USER_ZONE_CLOSE}\nMore`;
271
+ expect(extractUserZone(content)).toBe('My custom stuff');
272
+ });
273
+
274
+ it('returns null for empty zone', () => {
275
+ const content = `${USER_ZONE_OPEN}\n\n${USER_ZONE_CLOSE}`;
276
+ expect(extractUserZone(content)).toBeNull();
277
+ });
278
+
279
+ it('returns null when no zone markers', () => {
280
+ expect(extractUserZone('just text')).toBeNull();
281
+ });
282
+ });
@@ -0,0 +1,256 @@
1
+ /**
2
+ * Context Engine Tests — entity extraction, knowledge retrieval, confidence scoring.
3
+ */
4
+
5
+ import { describe, test, expect, beforeEach } from 'vitest';
6
+ import { Vault } from '../vault/vault.js';
7
+ import { Brain } from '../brain/brain.js';
8
+ import { BrainIntelligence } from '../brain/intelligence.js';
9
+ import { ContextEngine } from '../context/context-engine.js';
10
+
11
+ describe('ContextEngine', () => {
12
+ let vault: Vault;
13
+ let brain: Brain;
14
+ let intelligence: BrainIntelligence;
15
+ let engine: ContextEngine;
16
+
17
+ beforeEach(() => {
18
+ vault = new Vault(':memory:');
19
+ brain = new Brain(vault);
20
+ intelligence = new BrainIntelligence(vault, brain);
21
+ engine = new ContextEngine(vault, brain, intelligence, null);
22
+ });
23
+
24
+ // ─── Entity Extraction ───────────────────────────────────────────
25
+
26
+ describe('extractEntities', () => {
27
+ test('extracts file paths', () => {
28
+ const result = engine.extractEntities('Fix the bug in src/vault/vault.ts');
29
+ const files = result.byType.file ?? [];
30
+ expect(files.length).toBeGreaterThan(0);
31
+ expect(files.some((f) => f.value.includes('vault.ts'))).toBe(true);
32
+ });
33
+
34
+ test('extracts function calls', () => {
35
+ const result = engine.extractEntities('The search() method returns wrong results');
36
+ const functions = result.byType.function ?? [];
37
+ expect(functions.length).toBeGreaterThan(0);
38
+ expect(functions.some((f) => f.value === 'search()')).toBe(true);
39
+ });
40
+
41
+ test('extracts domain keywords', () => {
42
+ const result = engine.extractEntities('Improve accessibility and performance');
43
+ const domains = result.byType.domain ?? [];
44
+ expect(domains.length).toBe(2);
45
+ expect(domains.some((d) => d.value === 'accessibility')).toBe(true);
46
+ expect(domains.some((d) => d.value === 'performance')).toBe(true);
47
+ });
48
+
49
+ test('extracts action verbs', () => {
50
+ const result = engine.extractEntities('Create a new component and test it');
51
+ const actions = result.byType.action ?? [];
52
+ expect(actions.some((a) => a.value === 'create')).toBe(true);
53
+ expect(actions.some((a) => a.value === 'test')).toBe(true);
54
+ });
55
+
56
+ test('extracts technologies', () => {
57
+ const result = engine.extractEntities('Build a React component with TypeScript');
58
+ const techs = result.byType.technology ?? [];
59
+ expect(techs.some((t) => t.value === 'react')).toBe(true);
60
+ expect(techs.some((t) => t.value === 'typescript')).toBe(true);
61
+ });
62
+
63
+ test('deduplicates entities', () => {
64
+ const result = engine.extractEntities('Fix the fix for the fix');
65
+ const actions = result.byType.action ?? [];
66
+ const fixActions = actions.filter((a) => a.value === 'fix');
67
+ expect(fixActions.length).toBe(1);
68
+ });
69
+
70
+ test('filters stop patterns', () => {
71
+ const result = engine.extractEntities('This is a real-time built-in feature');
72
+ const patterns = result.byType.pattern ?? [];
73
+ expect(patterns.some((p) => p.value === 'real-time')).toBe(false);
74
+ expect(patterns.some((p) => p.value === 'built-in')).toBe(false);
75
+ });
76
+
77
+ test('returns empty for empty prompt', () => {
78
+ const result = engine.extractEntities('');
79
+ expect(result.entities.length).toBe(0);
80
+ });
81
+
82
+ test('groups entities by type', () => {
83
+ const result = engine.extractEntities('Create a React component in src/app.tsx for security');
84
+ expect(result.byType.action).toBeDefined();
85
+ expect(result.byType.technology).toBeDefined();
86
+ expect(result.byType.file).toBeDefined();
87
+ expect(result.byType.domain).toBeDefined();
88
+ });
89
+ });
90
+
91
+ // ─── Knowledge Retrieval ─────────────────────────────────────────
92
+
93
+ describe('retrieveKnowledge', () => {
94
+ test('retrieves from vault FTS', async () => {
95
+ vault.seed([
96
+ {
97
+ id: 'p1',
98
+ type: 'pattern',
99
+ domain: 'design',
100
+ title: 'Button component pattern',
101
+ severity: 'suggestion',
102
+ description: 'Use semantic HTML for buttons',
103
+ tags: ['design', 'component'],
104
+ },
105
+ ]);
106
+
107
+ // Use single term for FTS5 compatibility
108
+ const result = await engine.retrieveKnowledge('button');
109
+ expect(result.vaultHits).toBeGreaterThan(0);
110
+ expect(result.items.length).toBeGreaterThan(0);
111
+ expect(result.items[0].source).toBe('vault');
112
+ });
113
+
114
+ test('returns empty when vault has no matches', async () => {
115
+ const result = await engine.retrieveKnowledge('xyzzy nonexistent query');
116
+ expect(result.items.length).toBe(0);
117
+ expect(result.vaultHits).toBe(0);
118
+ });
119
+
120
+ test('handles null cognee gracefully', async () => {
121
+ const result = await engine.retrieveKnowledge('anything');
122
+ expect(result.cogneeHits).toBe(0);
123
+ });
124
+
125
+ test('filters by domain', async () => {
126
+ vault.seed([
127
+ {
128
+ id: 'p1',
129
+ type: 'pattern',
130
+ domain: 'design',
131
+ title: 'Design pattern one',
132
+ severity: 'suggestion',
133
+ description: 'A design domain pattern',
134
+ tags: ['design'],
135
+ },
136
+ {
137
+ id: 'p2',
138
+ type: 'pattern',
139
+ domain: 'security',
140
+ title: 'Security pattern one',
141
+ severity: 'warning',
142
+ description: 'A security domain pattern',
143
+ tags: ['security'],
144
+ },
145
+ ]);
146
+
147
+ // Search for "pattern" (exists in both entries) filtered to design domain
148
+ const result = await engine.retrieveKnowledge('pattern', 'design');
149
+ expect(result.vaultHits).toBe(1);
150
+ expect(result.items.length).toBeGreaterThan(0);
151
+ expect(result.items[0].domain).toBe('design');
152
+ });
153
+ });
154
+
155
+ // ─── Context Analysis ────────────────────────────────────────────
156
+
157
+ describe('analyze', () => {
158
+ test('returns full context analysis', async () => {
159
+ vault.seed([
160
+ {
161
+ id: 'r1',
162
+ type: 'rule',
163
+ domain: 'accessibility',
164
+ title: 'All buttons must have labels',
165
+ severity: 'critical',
166
+ description: 'Screen readers require button labels for navigation',
167
+ tags: ['accessibility', 'button'],
168
+ },
169
+ ]);
170
+
171
+ const result = await engine.analyze('Fix the accessibility issue with buttons');
172
+
173
+ expect(result.prompt).toBe('Fix the accessibility issue with buttons');
174
+ expect(result.entities.entities.length).toBeGreaterThan(0);
175
+ expect(result.confidence).toBeGreaterThan(0);
176
+ expect(result.confidenceLevel).toBeDefined();
177
+ expect(result.detectedDomains).toContain('accessibility');
178
+ expect(result.processingTimeMs).toBeGreaterThanOrEqual(0);
179
+ });
180
+
181
+ test('detects domains from entities and knowledge', async () => {
182
+ vault.seed([
183
+ {
184
+ id: 'r1',
185
+ type: 'rule',
186
+ domain: 'performance',
187
+ title: 'Avoid N+1 queries',
188
+ severity: 'warning',
189
+ description: 'Batch database queries to avoid N+1 problems',
190
+ tags: ['performance', 'database'],
191
+ },
192
+ ]);
193
+
194
+ const result = await engine.analyze('Optimize the performance of database queries');
195
+ expect(result.detectedDomains).toContain('performance');
196
+ });
197
+
198
+ test('low confidence for vague prompts', async () => {
199
+ const result = await engine.analyze('do something');
200
+ expect(result.confidenceLevel).toBe('low');
201
+ });
202
+
203
+ test('higher confidence with entities and knowledge', async () => {
204
+ vault.seed([
205
+ {
206
+ id: 'r1',
207
+ type: 'pattern',
208
+ domain: 'testing',
209
+ title: 'Unit test best practices',
210
+ severity: 'suggestion',
211
+ description: 'Write focused unit tests that test one thing',
212
+ tags: ['testing'],
213
+ },
214
+ ]);
215
+
216
+ const result = await engine.analyze(
217
+ 'Create unit tests for the search() function in src/vault/vault.ts with TypeScript',
218
+ );
219
+ expect(result.confidence).toBeGreaterThan(0.4);
220
+ expect(result.entities.entities.length).toBeGreaterThan(3);
221
+ });
222
+
223
+ test('includes processing time', async () => {
224
+ const result = await engine.analyze('test query');
225
+ expect(typeof result.processingTimeMs).toBe('number');
226
+ expect(result.processingTimeMs).toBeGreaterThanOrEqual(0);
227
+ });
228
+ });
229
+
230
+ // ─── Configuration ───────────────────────────────────────────────
231
+
232
+ describe('configuration', () => {
233
+ test('respects custom config', async () => {
234
+ const customEngine = new ContextEngine(vault, brain, intelligence, null, {
235
+ vaultSearchLimit: 2,
236
+ minScoreThreshold: 0.9,
237
+ });
238
+
239
+ vault.seed(
240
+ Array.from({ length: 10 }, (_, i) => ({
241
+ id: `entry-${i}`,
242
+ type: 'pattern' as const,
243
+ domain: 'general',
244
+ title: `Pattern ${i} for testing`,
245
+ severity: 'suggestion' as const,
246
+ description: `Description for pattern ${i}`,
247
+ tags: ['general'],
248
+ })),
249
+ );
250
+
251
+ const result = await customEngine.retrieveKnowledge('pattern testing');
252
+ // High threshold filters out low-score items
253
+ expect(result.items.every((i) => i.score >= 0.9)).toBe(true);
254
+ });
255
+ });
256
+ });
@@ -20,7 +20,7 @@ describe('createSemanticFacades', () => {
20
20
  vaultPath: ':memory:',
21
21
  plansPath: join(plannerDir, 'plans.json'),
22
22
  });
23
- ops = createSemanticFacades(runtime, 'test').flatMap(f => f.ops);
23
+ ops = createSemanticFacades(runtime, 'test').flatMap((f) => f.ops);
24
24
  });
25
25
 
26
26
  afterEach(() => {
@@ -34,8 +34,8 @@ describe('createSemanticFacades', () => {
34
34
  return op;
35
35
  }
36
36
 
37
- it('should return 209 ops', () => {
38
- expect(ops.length).toBe(209);
37
+ it('should return 232 ops', () => {
38
+ expect(ops.length).toBe(314);
39
39
  });
40
40
 
41
41
  it('should have all expected op names', () => {
@@ -78,6 +78,11 @@ describe('createSemanticFacades', () => {
78
78
  expect(names).toContain('brain_promote_proposals');
79
79
  expect(names).toContain('brain_lifecycle');
80
80
  expect(names).toContain('brain_reset_extracted');
81
+ // Session management (#178)
82
+ expect(names).toContain('session_list');
83
+ expect(names).toContain('session_get');
84
+ expect(names).toContain('session_quality');
85
+ expect(names).toContain('session_replay');
81
86
  // Brain decay report (#89)
82
87
  expect(names).toContain('brain_decay_report');
83
88
  // Curator
@@ -104,6 +109,69 @@ describe('createSemanticFacades', () => {
104
109
  expect(names).toContain('cognee_add');
105
110
  expect(names).toContain('cognee_cognify');
106
111
  expect(names).toContain('cognee_config');
112
+ // Context Engine (#172)
113
+ expect(names).toContain('context_extract_entities');
114
+ expect(names).toContain('context_retrieve_knowledge');
115
+ expect(names).toContain('context_analyze');
116
+ // Agency Mode (#171)
117
+ expect(names).toContain('agency_enable');
118
+ expect(names).toContain('agency_disable');
119
+ expect(names).toContain('agency_status');
120
+ expect(names).toContain('agency_config');
121
+ expect(names).toContain('agency_scan_file');
122
+ expect(names).toContain('agency_warnings');
123
+ expect(names).toContain('agency_surface_patterns');
124
+ expect(names).toContain('agency_clarify');
125
+ // Chat transport (12)
126
+ expect(names).toContain('chat_session_init');
127
+ expect(names).toContain('chat_session_get');
128
+ expect(names).toContain('chat_session_append');
129
+ expect(names).toContain('chat_session_clear');
130
+ expect(names).toContain('chat_session_delete');
131
+ expect(names).toContain('chat_session_list');
132
+ expect(names).toContain('chat_chunk_response');
133
+ expect(names).toContain('chat_auth_init');
134
+ expect(names).toContain('chat_auth_check');
135
+ expect(names).toContain('chat_auth_authenticate');
136
+ expect(names).toContain('chat_auth_revoke');
137
+ expect(names).toContain('chat_auth_status');
138
+ // Chat bridge + compressor (5)
139
+ expect(names).toContain('chat_bridge_init');
140
+ expect(names).toContain('chat_bridge_register');
141
+ expect(names).toContain('chat_bridge_list');
142
+ expect(names).toContain('chat_bridge_execute');
143
+ expect(names).toContain('chat_compress_output');
144
+ // Chat cancellation (3)
145
+ expect(names).toContain('chat_cancel_create');
146
+ expect(names).toContain('chat_cancel_stop');
147
+ expect(names).toContain('chat_cancel_status');
148
+ // Chat self-update (3)
149
+ expect(names).toContain('chat_update_init');
150
+ expect(names).toContain('chat_update_request');
151
+ expect(names).toContain('chat_update_confirm');
152
+ // Chat file handling (3)
153
+ expect(names).toContain('chat_file_detect_intent');
154
+ expect(names).toContain('chat_file_build_content');
155
+ expect(names).toContain('chat_file_cleanup');
156
+ // Chat notifications (5)
157
+ expect(names).toContain('chat_notify_init');
158
+ expect(names).toContain('chat_notify_start');
159
+ expect(names).toContain('chat_notify_stop');
160
+ expect(names).toContain('chat_notify_poll');
161
+ expect(names).toContain('chat_notify_status');
162
+ // Chat voice (2)
163
+ expect(names).toContain('chat_voice_transcribe');
164
+ expect(names).toContain('chat_voice_synthesize');
165
+ // Chat queue (4)
166
+ expect(names).toContain('chat_queue_init');
167
+ expect(names).toContain('chat_queue_inbox');
168
+ expect(names).toContain('chat_queue_reply');
169
+ expect(names).toContain('chat_queue_drain');
170
+ // Chat browser (4)
171
+ expect(names).toContain('chat_browser_init');
172
+ expect(names).toContain('chat_browser_acquire');
173
+ expect(names).toContain('chat_browser_release');
174
+ expect(names).toContain('chat_browser_status');
107
175
  // LLM
108
176
  expect(names).toContain('llm_rotate');
109
177
  expect(names).toContain('llm_call');
@@ -162,6 +230,27 @@ describe('createSemanticFacades', () => {
162
230
  // Vault content hashing (#166)
163
231
  expect(names).toContain('vault_content_hash');
164
232
  expect(names).toContain('vault_dedup_status');
233
+ // Obsidian sync (#127)
234
+ expect(names).toContain('obsidian_export');
235
+ expect(names).toContain('obsidian_import');
236
+ expect(names).toContain('obsidian_sync');
237
+ // Vault Sharing — Scoping (#105)
238
+ expect(names).toContain('vault_detect_scope');
239
+ expect(names).toContain('vault_set_scope');
240
+ expect(names).toContain('vault_list_by_scope');
241
+ // Vault Sharing — Export (#104)
242
+ expect(names).toContain('vault_export_pack');
243
+ expect(names).toContain('vault_import_pack');
244
+ // Vault Sharing — Git Sync (#67)
245
+ expect(names).toContain('vault_git_push');
246
+ expect(names).toContain('vault_git_pull');
247
+ expect(names).toContain('vault_git_sync');
248
+ // Vault Sharing — Review (#65)
249
+ expect(names).toContain('vault_submit_review');
250
+ expect(names).toContain('vault_approve');
251
+ expect(names).toContain('vault_reject');
252
+ expect(names).toContain('vault_pending_reviews');
253
+ expect(names).toContain('vault_review_stats');
165
254
  // Admin (8)
166
255
  expect(names).toContain('admin_health');
167
256
  expect(names).toContain('admin_tool_list');
@@ -184,6 +273,9 @@ describe('createSemanticFacades', () => {
184
273
  expect(names).toContain('admin_export_config');
185
274
  // Admin persistence (#85)
186
275
  expect(names).toContain('admin_persistence_info');
276
+ // Telemetry extended (#181)
277
+ expect(names).toContain('telemetry_errors');
278
+ expect(names).toContain('telemetry_slow_ops');
187
279
  // Loop (7)
188
280
  expect(names).toContain('loop_start');
189
281
  expect(names).toContain('loop_iterate');
@@ -267,7 +359,7 @@ describe('createSemanticFacades', () => {
267
359
  runtime.brain.rebuildVocabulary();
268
360
 
269
361
  // Re-create ops since brain state changed
270
- ops = createSemanticFacades(runtime, 'test').flatMap(f => f.ops);
362
+ ops = createSemanticFacades(runtime, 'test').flatMap((f) => f.ops);
271
363
  const results = (await findOp('search').handler({ query: 'core ops test' })) as unknown[];
272
364
  expect(results.length).toBeGreaterThan(0);
273
365
  });
@@ -374,7 +466,7 @@ describe('createSemanticFacades', () => {
374
466
  tags: ['test'],
375
467
  },
376
468
  ]);
377
- ops = createSemanticFacades(runtime, 'test').flatMap(f => f.ops);
469
+ ops = createSemanticFacades(runtime, 'test').flatMap((f) => f.ops);
378
470
  const result = (await findOp('brain_feedback').handler({
379
471
  query: 'test',
380
472
  entryId: 'bf-1',