@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,326 @@
1
+ /**
2
+ * Agency Manager — proactive file watching, pattern surfacing, and warning detection.
3
+ *
4
+ * Orchestrates:
5
+ * 1. File watcher (fs.watch with debouncing)
6
+ * 2. Warning detectors (pluggable, domain-agnostic)
7
+ * 3. Pattern surfacer (vault search on file changes)
8
+ * 4. Clarifier (generate questions for ambiguous intent)
9
+ *
10
+ * Feature-flagged: disabled by default, opt-in via agency_enable.
11
+ * Uses Node.js fs.watch — no dependencies.
12
+ */
13
+
14
+ import { watch, readFileSync, existsSync } from 'node:fs';
15
+ import { join, extname } from 'node:path';
16
+ import type { FSWatcher } from 'node:fs';
17
+ import type { Vault } from '../vault/vault.js';
18
+ import type {
19
+ AgencyConfig,
20
+ AgencyStatus,
21
+ FileChange,
22
+ FileChangeListener,
23
+ Warning,
24
+ WarningDetector,
25
+ SurfacedPattern,
26
+ ClarificationQuestion,
27
+ } from './types.js';
28
+
29
+ // ─── Defaults ──────────────────────────────────────────────────────
30
+
31
+ const DEFAULT_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.css', '.json'];
32
+ const DEFAULT_IGNORE = [
33
+ 'node_modules',
34
+ '.git',
35
+ 'dist',
36
+ 'build',
37
+ '.next',
38
+ 'coverage',
39
+ '.turbo',
40
+ '.cache',
41
+ ];
42
+ const DEFAULT_DEBOUNCE_MS = 300;
43
+ const DEFAULT_COOLDOWN_MS = 300_000; // 5 minutes
44
+ const DEFAULT_MIN_CONFIDENCE = 0.5;
45
+
46
+ // ─── Class ──────────────────────────────────────────────────────────
47
+
48
+ export class AgencyManager {
49
+ private vault: Vault;
50
+ private config: Required<AgencyConfig>;
51
+ private watchers: FSWatcher[] = [];
52
+ private detectors: WarningDetector[] = [];
53
+ private changeListeners: FileChangeListener[] = [];
54
+ private pendingWarnings: Warning[] = [];
55
+ private surfacedPatterns: SurfacedPattern[] = [];
56
+ private changesProcessed = 0;
57
+ private cooldownMap = new Map<string, number>();
58
+ private debounceTimers = new Map<string, ReturnType<typeof setTimeout>>();
59
+
60
+ constructor(vault: Vault, config?: AgencyConfig) {
61
+ this.vault = vault;
62
+ this.config = {
63
+ enabled: config?.enabled ?? false,
64
+ watchPaths: config?.watchPaths ?? ['.'],
65
+ ignorePatterns: config?.ignorePatterns ?? DEFAULT_IGNORE,
66
+ extensions: config?.extensions ?? DEFAULT_EXTENSIONS,
67
+ debounceMs: config?.debounceMs ?? DEFAULT_DEBOUNCE_MS,
68
+ minPatternConfidence: config?.minPatternConfidence ?? DEFAULT_MIN_CONFIDENCE,
69
+ cooldownMs: config?.cooldownMs ?? DEFAULT_COOLDOWN_MS,
70
+ };
71
+ }
72
+
73
+ // ─── Lifecycle ──────────────────────────────────────────────────
74
+
75
+ enable(projectPath?: string): void {
76
+ if (this.config.enabled) return;
77
+ this.config.enabled = true;
78
+ if (projectPath) this.startWatching(projectPath);
79
+ }
80
+
81
+ disable(): void {
82
+ this.config.enabled = false;
83
+ this.stopWatching();
84
+ }
85
+
86
+ getStatus(): AgencyStatus {
87
+ return {
88
+ enabled: this.config.enabled,
89
+ watching: this.watchers.length > 0,
90
+ watchPaths: this.config.watchPaths,
91
+ detectorCount: this.detectors.length,
92
+ pendingWarnings: this.pendingWarnings.length,
93
+ surfacedPatterns: this.surfacedPatterns.length,
94
+ fileChangesProcessed: this.changesProcessed,
95
+ };
96
+ }
97
+
98
+ updateConfig(config: Partial<AgencyConfig>): void {
99
+ Object.assign(this.config, config);
100
+ }
101
+
102
+ // ─── File Watching ──────────────────────────────────────────────
103
+
104
+ startWatching(projectPath: string): void {
105
+ this.stopWatching();
106
+ for (const watchPath of this.config.watchPaths) {
107
+ const fullPath = join(projectPath, watchPath);
108
+ if (!existsSync(fullPath)) continue;
109
+
110
+ try {
111
+ const watcher = watch(fullPath, { recursive: true }, (_event, filename) => {
112
+ if (!filename) return;
113
+ const filePath = join(fullPath, filename);
114
+ if (this.shouldIgnore(filePath)) return;
115
+ if (!this.hasValidExtension(filePath)) return;
116
+ this.debounceChange(filePath);
117
+ });
118
+ this.watchers.push(watcher);
119
+ } catch {
120
+ // Directory may not support watching — skip
121
+ }
122
+ }
123
+ }
124
+
125
+ stopWatching(): void {
126
+ for (const w of this.watchers) w.close();
127
+ this.watchers = [];
128
+ for (const timer of this.debounceTimers.values()) clearTimeout(timer);
129
+ this.debounceTimers.clear();
130
+ }
131
+
132
+ onFileChange(listener: FileChangeListener): void {
133
+ this.changeListeners.push(listener);
134
+ }
135
+
136
+ // ─── Warning Detection ──────────────────────────────────────────
137
+
138
+ registerDetector(detector: WarningDetector): void {
139
+ this.detectors.push(detector);
140
+ }
141
+
142
+ scanFile(filePath: string): Warning[] {
143
+ if (!existsSync(filePath)) return [];
144
+
145
+ const ext = extname(filePath);
146
+ const applicableDetectors = this.detectors.filter((d) => d.extensions.includes(ext));
147
+ if (applicableDetectors.length === 0) return [];
148
+
149
+ let content: string;
150
+ try {
151
+ content = readFileSync(filePath, 'utf-8');
152
+ } catch {
153
+ return [];
154
+ }
155
+
156
+ const warnings: Warning[] = [];
157
+ for (const detector of applicableDetectors) {
158
+ try {
159
+ warnings.push(...detector.detect(filePath, content));
160
+ } catch {
161
+ // Detector failure is non-critical
162
+ }
163
+ }
164
+
165
+ this.pendingWarnings.push(...warnings);
166
+ return warnings;
167
+ }
168
+
169
+ getPendingWarnings(): Warning[] {
170
+ return [...this.pendingWarnings];
171
+ }
172
+
173
+ clearWarnings(): void {
174
+ this.pendingWarnings = [];
175
+ }
176
+
177
+ // ─── Pattern Surfacing ──────────────────────────────────────────
178
+
179
+ surfacePatterns(filePath: string): SurfacedPattern[] {
180
+ const now = Date.now();
181
+ const lastSurfaced = this.cooldownMap.get(filePath);
182
+ if (lastSurfaced && now - lastSurfaced < this.config.cooldownMs) return [];
183
+
184
+ const ext = extname(filePath);
185
+ const filename = filePath.split('/').pop() ?? '';
186
+
187
+ // Build search query from file context
188
+ const terms: string[] = [];
189
+ if (ext === '.ts' || ext === '.tsx') terms.push('typescript');
190
+ if (ext === '.css') terms.push('css', 'styling');
191
+ if (ext === '.json') terms.push('configuration');
192
+ if (filename.includes('test')) terms.push('testing');
193
+ if (filename.includes('component')) terms.push('component');
194
+
195
+ if (terms.length === 0) return [];
196
+
197
+ const query = terms.join(' ');
198
+ try {
199
+ const results = this.vault.search(query, { limit: 5 });
200
+ const patterns: SurfacedPattern[] = [];
201
+
202
+ for (const r of results) {
203
+ const relevance = r.score > 0 ? Math.min(1, r.score / (results[0]?.score || 1)) : 0;
204
+ if (relevance < this.config.minPatternConfidence) continue;
205
+
206
+ patterns.push({
207
+ entryId: r.entry.id,
208
+ title: r.entry.title,
209
+ domain: r.entry.domain,
210
+ relevance,
211
+ trigger: filePath,
212
+ });
213
+ }
214
+
215
+ if (patterns.length > 0) {
216
+ this.cooldownMap.set(filePath, now);
217
+ this.surfacedPatterns.push(...patterns);
218
+ }
219
+
220
+ return patterns;
221
+ } catch {
222
+ return [];
223
+ }
224
+ }
225
+
226
+ getSurfacedPatterns(): SurfacedPattern[] {
227
+ return [...this.surfacedPatterns];
228
+ }
229
+
230
+ clearSurfacedPatterns(): void {
231
+ this.surfacedPatterns = [];
232
+ }
233
+
234
+ // ─── Clarification ──────────────────────────────────────────────
235
+
236
+ generateClarification(prompt: string, confidence: number): ClarificationQuestion | null {
237
+ if (confidence >= 0.7) return null; // High confidence — no need to clarify
238
+
239
+ const words = prompt.toLowerCase().split(/\s+/);
240
+ const hasAction = words.some((w) =>
241
+ ['create', 'fix', 'build', 'add', 'remove', 'update', 'improve', 'deploy'].includes(w),
242
+ );
243
+ const hasTarget = words.length > 3;
244
+
245
+ if (!hasAction && !hasTarget) {
246
+ return {
247
+ question: 'Could you clarify what you would like me to do? I need an action and a target.',
248
+ reason: 'No clear action or target detected in the prompt.',
249
+ options: [
250
+ 'Create something new',
251
+ 'Fix an existing issue',
252
+ 'Review or validate code',
253
+ 'Explore the codebase',
254
+ ],
255
+ };
256
+ }
257
+
258
+ if (!hasAction) {
259
+ return {
260
+ question: 'What action would you like me to take?',
261
+ reason: 'The prompt describes a target but no clear action.',
262
+ options: ['Build', 'Fix', 'Review', 'Improve', 'Deploy'],
263
+ };
264
+ }
265
+
266
+ if (confidence < 0.3) {
267
+ return {
268
+ question: 'Could you provide more context about what you need?',
269
+ reason: 'The prompt is too brief to determine intent reliably.',
270
+ };
271
+ }
272
+
273
+ return null;
274
+ }
275
+
276
+ // ─── Private Helpers ────────────────────────────────────────────
277
+
278
+ private debounceChange(filePath: string): void {
279
+ const existing = this.debounceTimers.get(filePath);
280
+ if (existing) clearTimeout(existing);
281
+
282
+ this.debounceTimers.set(
283
+ filePath,
284
+ setTimeout(() => {
285
+ this.debounceTimers.delete(filePath);
286
+ this.processChange(filePath);
287
+ }, this.config.debounceMs),
288
+ );
289
+ }
290
+
291
+ private processChange(filePath: string): void {
292
+ this.changesProcessed++;
293
+
294
+ const change: FileChange = {
295
+ path: filePath,
296
+ type: existsSync(filePath) ? 'modify' : 'delete',
297
+ timestamp: Date.now(),
298
+ };
299
+
300
+ // Notify listeners
301
+ for (const listener of this.changeListeners) {
302
+ try {
303
+ listener(change);
304
+ } catch {
305
+ // Listener failure is non-critical
306
+ }
307
+ }
308
+
309
+ // Auto-scan for warnings if detectors are registered
310
+ if (this.detectors.length > 0 && change.type !== 'delete') {
311
+ this.scanFile(filePath);
312
+ }
313
+
314
+ // Auto-surface patterns
315
+ this.surfacePatterns(filePath);
316
+ }
317
+
318
+ private shouldIgnore(filePath: string): boolean {
319
+ return this.config.ignorePatterns.some((pattern) => filePath.includes(pattern));
320
+ }
321
+
322
+ private hasValidExtension(filePath: string): boolean {
323
+ const ext = extname(filePath);
324
+ return this.config.extensions.includes(ext);
325
+ }
326
+ }
@@ -0,0 +1,13 @@
1
+ export { AgencyManager } from './agency-manager.js';
2
+ export type {
3
+ ChangeType,
4
+ FileChange,
5
+ FileChangeListener,
6
+ WarningSeverity,
7
+ Warning,
8
+ WarningDetector,
9
+ SurfacedPattern,
10
+ ClarificationQuestion,
11
+ AgencyConfig,
12
+ AgencyStatus,
13
+ } from './types.js';
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Agency mode types — proactive file watching, pattern surfacing, warning detection.
3
+ */
4
+
5
+ // ─── File Watching ──────────────────────────────────────────────────
6
+
7
+ export type ChangeType = 'create' | 'modify' | 'delete';
8
+
9
+ export interface FileChange {
10
+ path: string;
11
+ type: ChangeType;
12
+ timestamp: number;
13
+ }
14
+
15
+ export type FileChangeListener = (change: FileChange) => void;
16
+
17
+ // ─── Warning Detection ──────────────────────────────────────────────
18
+
19
+ export type WarningSeverity = 'critical' | 'warning' | 'info';
20
+
21
+ export interface Warning {
22
+ id: string;
23
+ file: string;
24
+ line?: number;
25
+ severity: WarningSeverity;
26
+ category: string;
27
+ message: string;
28
+ suggestion?: string;
29
+ }
30
+
31
+ /**
32
+ * Pluggable warning detector. Agents define their own domain-specific detectors.
33
+ */
34
+ export interface WarningDetector {
35
+ /** Unique name for this detector. */
36
+ name: string;
37
+ /** File extensions this detector applies to (e.g., ['.ts', '.tsx']). */
38
+ extensions: string[];
39
+ /** Detect warnings in file content. */
40
+ detect(filePath: string, content: string): Warning[];
41
+ }
42
+
43
+ // ─── Pattern Surfacing ──────────────────────────────────────────────
44
+
45
+ export interface SurfacedPattern {
46
+ entryId: string;
47
+ title: string;
48
+ domain: string;
49
+ relevance: number;
50
+ trigger: string;
51
+ }
52
+
53
+ // ─── Clarification ──────────────────────────────────────────────────
54
+
55
+ export interface ClarificationQuestion {
56
+ question: string;
57
+ reason: string;
58
+ options?: string[];
59
+ }
60
+
61
+ // ─── Agency Config ──────────────────────────────────────────────────
62
+
63
+ export interface AgencyConfig {
64
+ /** Enable/disable agency mode. Default: false. */
65
+ enabled?: boolean;
66
+ /** Directories to watch (relative to project root). Default: ['.'] */
67
+ watchPaths?: string[];
68
+ /** Glob patterns to ignore. Default: common ignores. */
69
+ ignorePatterns?: string[];
70
+ /** File extensions to watch. Default: ['.ts', '.tsx', '.js', '.jsx', '.css', '.json'] */
71
+ extensions?: string[];
72
+ /** Debounce interval in ms for file change batching. Default: 300. */
73
+ debounceMs?: number;
74
+ /** Minimum confidence to surface a pattern. Default: 0.5. */
75
+ minPatternConfidence?: number;
76
+ /** Cooldown per file path (ms) before re-surfacing. Default: 300000 (5 min). */
77
+ cooldownMs?: number;
78
+ }
79
+
80
+ export interface AgencyStatus {
81
+ enabled: boolean;
82
+ watching: boolean;
83
+ watchPaths: string[];
84
+ detectorCount: number;
85
+ pendingWarnings: number;
86
+ surfacedPatterns: number;
87
+ fileChangesProcessed: number;
88
+ }
@@ -1,6 +1,7 @@
1
1
  import type { Vault } from '../vault/vault.js';
2
2
  import type { SearchResult } from '../vault/vault.js';
3
3
  import type { IntelligenceEntry } from '../intelligence/types.js';
4
+ import { computeContentHash } from '../vault/content-hash.js';
4
5
  import {
5
6
  tokenize,
6
7
  calculateTf,
@@ -22,17 +23,6 @@ import type {
22
23
  FeedbackStats,
23
24
  } from './types.js';
24
25
 
25
- // Re-export types for backward compatibility
26
- export type {
27
- ScoringWeights,
28
- ScoreBreakdown,
29
- RankedResult,
30
- SearchOptions,
31
- CaptureResult,
32
- BrainStats,
33
- QueryContext,
34
- } from './types.js';
35
-
36
26
  // ─── Severity scoring ──────────────────────────────────────────────
37
27
 
38
28
  const SEVERITY_SCORES: Record<string, number> = {
@@ -248,8 +238,22 @@ export class Brain {
248
238
  why: entry.why,
249
239
  tags: mergedTags,
250
240
  appliesTo: entry.appliesTo,
241
+ tier: entry.tier,
251
242
  };
252
243
 
244
+ // Content-hash dedup: check after enrichment so tags match the stored hash
245
+ const contentHash = computeContentHash(fullEntry);
246
+ const existingByHash = this.vault.findByContentHash(contentHash);
247
+ if (existingByHash && existingByHash !== entry.id) {
248
+ return {
249
+ captured: false,
250
+ id: entry.id,
251
+ autoTags,
252
+ duplicate: { id: existingByHash, similarity: 1.0 },
253
+ blocked: true,
254
+ };
255
+ }
256
+
253
257
  this.vault.add(fullEntry);
254
258
  this.updateVocabularyIncremental(fullEntry);
255
259
 
@@ -15,6 +15,9 @@ import type {
15
15
  StrengthsQuery,
16
16
  BrainSession,
17
17
  SessionLifecycleInput,
18
+ SessionListQuery,
19
+ SessionQuality,
20
+ SessionReplay,
18
21
  KnowledgeProposal,
19
22
  ExtractionResult,
20
23
  GlobalPattern,
@@ -240,6 +243,106 @@ export class BrainIntelligence {
240
243
  return { archived: result.changes };
241
244
  }
242
245
 
246
+ // ─── Session Query & Quality ─────────────────────────────────────
247
+
248
+ getSessionById(id: string): BrainSession | null {
249
+ return this.getSession(id);
250
+ }
251
+
252
+ listSessions(query?: SessionListQuery): BrainSession[] {
253
+ const conditions: string[] = [];
254
+ const values: unknown[] = [];
255
+
256
+ if (query?.domain) {
257
+ conditions.push('domain = ?');
258
+ values.push(query.domain);
259
+ }
260
+ if (query?.active === true) {
261
+ conditions.push('ended_at IS NULL');
262
+ } else if (query?.active === false) {
263
+ conditions.push('ended_at IS NOT NULL');
264
+ }
265
+ if (query?.extracted === true) {
266
+ conditions.push('extracted_at IS NOT NULL');
267
+ } else if (query?.extracted === false) {
268
+ conditions.push('extracted_at IS NULL');
269
+ }
270
+
271
+ const where = conditions.length > 0 ? 'WHERE ' + conditions.join(' AND ') : '';
272
+ const limit = query?.limit ?? 50;
273
+ const offset = query?.offset ?? 0;
274
+ values.push(limit, offset);
275
+
276
+ const rows = this.provider.all<{
277
+ id: string;
278
+ started_at: string;
279
+ ended_at: string | null;
280
+ domain: string | null;
281
+ context: string | null;
282
+ tools_used: string;
283
+ files_modified: string;
284
+ plan_id: string | null;
285
+ plan_outcome: string | null;
286
+ extracted_at: string | null;
287
+ }>(`SELECT * FROM brain_sessions ${where} ORDER BY started_at DESC LIMIT ? OFFSET ?`, values);
288
+
289
+ return rows.map((r) => this.rowToSession(r));
290
+ }
291
+
292
+ computeSessionQuality(sessionId: string): SessionQuality {
293
+ const session = this.getSession(sessionId);
294
+ if (!session) throw new Error('Session not found: ' + sessionId);
295
+
296
+ // Completeness (0-25): session ended + has context + has domain
297
+ let completeness = 0;
298
+ if (session.endedAt) completeness += 10;
299
+ if (session.context) completeness += 8;
300
+ if (session.domain) completeness += 7;
301
+
302
+ // Artifact density (0-25): files modified
303
+ const fileCount = session.filesModified.length;
304
+ const artifactDensity = Math.min(25, fileCount * 5);
305
+
306
+ // Tool engagement (0-25): unique tools used
307
+ const uniqueTools = new Set(session.toolsUsed).size;
308
+ const toolEngagement = Math.min(25, uniqueTools * 5);
309
+
310
+ // Outcome clarity (0-25): plan outcome + extraction status
311
+ let outcomeClarity = 0;
312
+ if (session.planId) outcomeClarity += 8;
313
+ if (session.planOutcome === 'completed') outcomeClarity += 10;
314
+ else if (session.planOutcome === 'abandoned') outcomeClarity += 5;
315
+ else if (session.planOutcome) outcomeClarity += 7;
316
+ if (session.extractedAt) outcomeClarity += 7;
317
+
318
+ const overall = completeness + artifactDensity + toolEngagement + outcomeClarity;
319
+
320
+ return {
321
+ sessionId,
322
+ overall,
323
+ completeness,
324
+ artifactDensity,
325
+ toolEngagement,
326
+ outcomeClarity,
327
+ };
328
+ }
329
+
330
+ replaySession(sessionId: string): SessionReplay {
331
+ const session = this.getSession(sessionId);
332
+ if (!session) throw new Error('Session not found: ' + sessionId);
333
+
334
+ const quality = this.computeSessionQuality(sessionId);
335
+ const proposals = this.getProposals({ sessionId });
336
+
337
+ let durationMinutes: number | null = null;
338
+ if (session.startedAt && session.endedAt) {
339
+ const ms = new Date(session.endedAt).getTime() - new Date(session.startedAt).getTime();
340
+ durationMinutes = Math.round(ms / 60000);
341
+ }
342
+
343
+ return { session, quality, proposals, durationMinutes };
344
+ }
345
+
243
346
  // ─── Strength Scoring ─────────────────────────────────────────────
244
347
 
245
348
  computeStrengths(): PatternStrength[] {
@@ -212,3 +212,29 @@ export interface BrainImportResult {
212
212
  domainProfiles: number;
213
213
  };
214
214
  }
215
+
216
+ // ─── Session Management Types ─────────────────────────────────────
217
+
218
+ export interface SessionListQuery {
219
+ domain?: string;
220
+ active?: boolean;
221
+ extracted?: boolean;
222
+ limit?: number;
223
+ offset?: number;
224
+ }
225
+
226
+ export interface SessionQuality {
227
+ sessionId: string;
228
+ overall: number;
229
+ completeness: number;
230
+ artifactDensity: number;
231
+ toolEngagement: number;
232
+ outcomeClarity: number;
233
+ }
234
+
235
+ export interface SessionReplay {
236
+ session: BrainSession;
237
+ quality: SessionQuality;
238
+ proposals: KnowledgeProposal[];
239
+ durationMinutes: number | null;
240
+ }