@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,119 @@
1
+ /**
2
+ * Plugin System — Types & Manifest Schema
3
+ *
4
+ * A plugin is a directory containing a `soleri-plugin.json` manifest
5
+ * and optionally additional intelligence data. Plugins register
6
+ * OpDefinition[] (facades) dynamically without re-scaffolding.
7
+ */
8
+
9
+ import { z } from 'zod';
10
+ import type { FacadeConfig } from '../facades/types.js';
11
+
12
+ // =============================================================================
13
+ // MANIFEST SCHEMA (validated at load time)
14
+ // =============================================================================
15
+
16
+ export const pluginManifestSchema = z.object({
17
+ id: z.string().regex(/^[a-z0-9-]+$/, 'Plugin ID must be lowercase alphanumeric with hyphens'),
18
+ name: z.string().min(1),
19
+ version: z.string().regex(/^\d+\.\d+\.\d+$/, 'Version must be semver (x.y.z)'),
20
+ description: z.string().optional().default(''),
21
+ /** Domain this plugin provides knowledge/ops for */
22
+ domain: z.string().optional(),
23
+ /** Plugin IDs this plugin depends on (must be loaded first) */
24
+ dependencies: z.array(z.string()).optional().default([]),
25
+ /** Facade definitions — each becomes an MCP tool */
26
+ facades: z
27
+ .array(
28
+ z.object({
29
+ name: z.string(),
30
+ description: z.string().optional().default(''),
31
+ ops: z.array(
32
+ z.object({
33
+ name: z.string(),
34
+ description: z.string().optional().default(''),
35
+ auth: z.enum(['read', 'write', 'admin']).optional().default('read'),
36
+ }),
37
+ ),
38
+ }),
39
+ )
40
+ .optional()
41
+ .default([]),
42
+ /** Intelligence entries to seed into the vault */
43
+ intelligence: z
44
+ .array(
45
+ z.object({
46
+ id: z.string(),
47
+ type: z.string(),
48
+ domain: z.string().optional(),
49
+ title: z.string(),
50
+ severity: z.enum(['critical', 'warning', 'suggestion']).optional(),
51
+ description: z.string(),
52
+ tags: z.array(z.string()).optional().default([]),
53
+ }),
54
+ )
55
+ .optional()
56
+ .default([]),
57
+ });
58
+
59
+ export type PluginManifest = z.infer<typeof pluginManifestSchema>;
60
+
61
+ // =============================================================================
62
+ // PLUGIN TYPES
63
+ // =============================================================================
64
+
65
+ export type PluginStatus = 'registered' | 'active' | 'error' | 'deactivated';
66
+ export type PluginProvenance = 'global' | 'project' | 'custom';
67
+
68
+ /**
69
+ * A loaded plugin — manifest validated, ready for activation.
70
+ */
71
+ export interface LoadedPlugin {
72
+ manifest: PluginManifest;
73
+ directory: string;
74
+ provenance: PluginProvenance;
75
+ }
76
+
77
+ /**
78
+ * A registered plugin in the runtime — tracks lifecycle state.
79
+ */
80
+ export interface RegisteredPlugin {
81
+ id: string;
82
+ manifest: PluginManifest;
83
+ directory: string;
84
+ provenance: PluginProvenance;
85
+ status: PluginStatus;
86
+ error?: string;
87
+ facades: FacadeConfig[];
88
+ activatedAt?: number;
89
+ registeredAt: number;
90
+ }
91
+
92
+ /**
93
+ * Plugin facade builder — plugins provide this function to create ops
94
+ * that have access to the agent runtime.
95
+ *
96
+ * Plugin JS modules export: `export function createFacades(ctx): FacadeConfig[]`
97
+ */
98
+ export type PluginFacadeBuilder = (ctx: PluginContext) => FacadeConfig[];
99
+
100
+ /**
101
+ * Context passed to plugin facade builders during activation.
102
+ */
103
+ export interface PluginContext {
104
+ /** The agent runtime — full access to vault, brain, planner, etc. */
105
+ runtime: unknown; // AgentRuntime — kept as unknown to avoid circular deps
106
+ /** The plugin's own manifest */
107
+ manifest: PluginManifest;
108
+ /** The plugin's directory on disk */
109
+ directory: string;
110
+ }
111
+
112
+ // =============================================================================
113
+ // LOAD RESULT
114
+ // =============================================================================
115
+
116
+ export interface LoadResult {
117
+ loaded: LoadedPlugin[];
118
+ errors: Array<{ directory: string; error: string }>;
119
+ }
@@ -76,21 +76,32 @@ export function createAdminExtraOps(runtime: AgentRuntime): OpDefinition[] {
76
76
  // ─── Permissions ────────────────────────────────────────────────
77
77
  {
78
78
  name: 'admin_permissions',
79
- description: 'Get or set auth enforcement policy (strict, moderate, permissive).',
80
- auth: 'write',
79
+ description:
80
+ 'Get or set auth enforcement policy. Modes: permissive (no checks), warn (log violations), enforce (block violations).',
81
+ auth: 'admin',
81
82
  schema: z.object({
82
83
  action: z.enum(['get', 'set']),
83
- level: z.enum(['strict', 'moderate', 'permissive']).optional(),
84
+ mode: z.enum(['permissive', 'warn', 'enforce']).optional(),
85
+ callerLevel: z.enum(['read', 'write', 'admin']).optional(),
84
86
  }),
85
87
  handler: async (params) => {
86
88
  const action = params.action as string;
87
89
  if (action === 'set') {
88
- const level = params.level as PermissionLevel | undefined;
89
- if (level) {
90
- permissionLevel = level;
91
- }
90
+ const mode = params.mode as 'permissive' | 'warn' | 'enforce' | undefined;
91
+ const callerLevel = params.callerLevel as 'read' | 'write' | 'admin' | undefined;
92
+ if (mode) runtime.authPolicy.mode = mode;
93
+ if (callerLevel) runtime.authPolicy.callerLevel = callerLevel;
94
+ // Keep legacy field in sync
95
+ permissionLevel =
96
+ mode === 'enforce' ? 'strict' : mode === 'warn' ? 'moderate' : 'permissive';
92
97
  }
93
- return { level: permissionLevel };
98
+ return {
99
+ level: permissionLevel,
100
+ authPolicy: {
101
+ mode: runtime.authPolicy.mode,
102
+ callerLevel: runtime.authPolicy.callerLevel,
103
+ },
104
+ };
94
105
  },
95
106
  },
96
107
 
@@ -649,6 +660,79 @@ export function createAdminExtraOps(runtime: AgentRuntime): OpDefinition[] {
649
660
  },
650
661
  },
651
662
 
663
+ // ─── Health Registry (#176) ─────────────────────────────────────
664
+ {
665
+ name: 'admin_health_snapshot',
666
+ description:
667
+ 'Full health snapshot — overall status plus per-subsystem health (status, failure count, last error).',
668
+ auth: 'read',
669
+ handler: async () => {
670
+ return runtime.health.snapshot();
671
+ },
672
+ },
673
+ {
674
+ name: 'admin_subsystem_health',
675
+ description: 'Get health status of a specific subsystem.',
676
+ auth: 'read',
677
+ schema: z.object({
678
+ subsystem: z.string().describe('Subsystem name (e.g. "vault", "cognee", "llm")'),
679
+ }),
680
+ handler: async (params) => {
681
+ const sub = runtime.health.get(params.subsystem as string);
682
+ if (!sub) {
683
+ const snapshot = runtime.health.snapshot();
684
+ return {
685
+ error: `Unknown subsystem: ${params.subsystem}`,
686
+ available: Object.keys(snapshot.subsystems),
687
+ };
688
+ }
689
+ return sub;
690
+ },
691
+ },
692
+
693
+ // ─── Feature Flags (#173) ───────────────────────────────────────
694
+ {
695
+ name: 'admin_list_flags',
696
+ description:
697
+ 'List all feature flags with current state, description, and source (default/env/runtime).',
698
+ auth: 'read',
699
+ handler: async () => {
700
+ return runtime.flags.getAll();
701
+ },
702
+ },
703
+ {
704
+ name: 'admin_get_flag',
705
+ description: 'Get the current value of a specific feature flag.',
706
+ auth: 'read',
707
+ schema: z.object({
708
+ flag: z.string().describe('Flag name (e.g. "auth-enforcement", "cognee-sync")'),
709
+ }),
710
+ handler: async (params) => {
711
+ const flag = params.flag as string;
712
+ const all = runtime.flags.getAll();
713
+ const info = all[flag];
714
+ if (!info) {
715
+ return { error: `Unknown flag: ${flag}`, availableFlags: Object.keys(all) };
716
+ }
717
+ return { flag, ...info };
718
+ },
719
+ },
720
+ {
721
+ name: 'admin_set_flag',
722
+ description: 'Set a feature flag at runtime. Persists to flags.json.',
723
+ auth: 'admin',
724
+ schema: z.object({
725
+ flag: z.string().describe('Flag name'),
726
+ enabled: z.boolean().describe('Enable (true) or disable (false)'),
727
+ }),
728
+ handler: async (params) => {
729
+ const flag = params.flag as string;
730
+ const enabled = params.enabled as boolean;
731
+ runtime.flags.set(flag, enabled);
732
+ return { flag, enabled, persisted: true };
733
+ },
734
+ },
735
+
652
736
  // ─── Persistence ────────────────────────────────────────────────
653
737
  {
654
738
  name: 'admin_persistence_info',
@@ -681,5 +765,106 @@ export function createAdminExtraOps(runtime: AgentRuntime): OpDefinition[] {
681
765
  return { backend, tables };
682
766
  },
683
767
  },
768
+
769
+ // ─── Setup Wizard (#182) ─────────────────────────────────────────
770
+ {
771
+ name: 'admin_setup_check',
772
+ description:
773
+ 'Check agent setup status — vault health, brain vocabulary, cognee connection, LLM keys, templates.',
774
+ auth: 'read',
775
+ handler: async () => {
776
+ const checks: Record<string, { ok: boolean; detail: string }> = {};
777
+
778
+ // Vault
779
+ try {
780
+ const stats = vault.stats();
781
+ checks.vault = {
782
+ ok: true,
783
+ detail: `${stats.totalEntries} entries, ${Object.keys(stats.byDomain).length} domains`,
784
+ };
785
+ } catch (err) {
786
+ checks.vault = { ok: false, detail: err instanceof Error ? err.message : 'Failed' };
787
+ }
788
+
789
+ // Brain vocabulary
790
+ try {
791
+ const brainStats = brain.getStats();
792
+ checks.brain = {
793
+ ok: brainStats.vocabularySize > 0,
794
+ detail: `${brainStats.vocabularySize} terms`,
795
+ };
796
+ } catch {
797
+ checks.brain = { ok: false, detail: 'Brain not initialized' };
798
+ }
799
+
800
+ // Cognee
801
+ const cogneeStatus = cognee.getStatus();
802
+ checks.cognee = {
803
+ ok: cogneeStatus?.available ?? false,
804
+ detail: cogneeStatus?.available ? 'Connected' : 'Not available (optional)',
805
+ };
806
+
807
+ // LLM keys
808
+ const llmAvail = runtime.llmClient.isAvailable();
809
+ checks.llm = {
810
+ ok: llmAvail.openai || llmAvail.anthropic,
811
+ detail: `OpenAI: ${llmAvail.openai ? 'yes' : 'no'}, Anthropic: ${llmAvail.anthropic ? 'yes' : 'no'}`,
812
+ };
813
+
814
+ // Health registry
815
+ const healthSnap = runtime.health.snapshot();
816
+ checks.health = {
817
+ ok: healthSnap.overall !== 'down',
818
+ detail: `Overall: ${healthSnap.overall}`,
819
+ };
820
+
821
+ const allOk = Object.values(checks).every((c) => c.ok);
822
+
823
+ return {
824
+ ready: allOk,
825
+ checks,
826
+ agentId: runtime.config.agentId,
827
+ };
828
+ },
829
+ },
830
+ {
831
+ name: 'admin_setup_run',
832
+ description:
833
+ 'Run first-time agent setup — rebuild brain vocabulary, validate vault schema, seed defaults if empty.',
834
+ auth: 'admin',
835
+ handler: async () => {
836
+ const actions: string[] = [];
837
+
838
+ // Rebuild brain vocabulary
839
+ try {
840
+ brain.rebuildVocabulary();
841
+ actions.push('brain_vocabulary_rebuilt');
842
+ } catch {
843
+ // Non-fatal
844
+ }
845
+
846
+ // Rebuild FTS index
847
+ try {
848
+ vault.rebuildFtsIndex();
849
+ actions.push('fts_index_rebuilt');
850
+ } catch {
851
+ // Non-fatal
852
+ }
853
+
854
+ // Reload templates
855
+ try {
856
+ runtime.templateManager.load();
857
+ actions.push('templates_reloaded');
858
+ } catch {
859
+ // Non-fatal
860
+ }
861
+
862
+ return {
863
+ setup: true,
864
+ actions,
865
+ agentId: runtime.config.agentId,
866
+ };
867
+ },
868
+ },
684
869
  ];
685
870
  }
@@ -8,6 +8,8 @@
8
8
  import { z } from 'zod';
9
9
  import type { OpDefinition } from '../facades/types.js';
10
10
  import type { AgentRuntime } from './types.js';
11
+ import { detectScope } from '../vault/scope-detector.js';
12
+ import type { ScopeTier, ScopeDetectionResult } from '../vault/scope-detector.js';
11
13
 
12
14
  /**
13
15
  * Create the 4 intelligent capture operations for an agent runtime.
@@ -26,6 +28,10 @@ export function createCaptureOps(runtime: AgentRuntime): OpDefinition[] {
26
28
  auth: 'write',
27
29
  schema: z.object({
28
30
  projectPath: z.string().optional().default('.'),
31
+ tier: z
32
+ .enum(['agent', 'project', 'team'])
33
+ .optional()
34
+ .describe('Manual tier override. If omitted, tier is auto-detected from content.'),
29
35
  entries: z.array(
30
36
  z.object({
31
37
  id: z.string().optional(),
@@ -49,11 +55,16 @@ export function createCaptureOps(runtime: AgentRuntime): OpDefinition[] {
49
55
  example: z.string().optional(),
50
56
  counterExample: z.string().optional(),
51
57
  why: z.string().optional(),
58
+ tier: z
59
+ .enum(['agent', 'project', 'team'])
60
+ .optional()
61
+ .describe('Per-entry tier override. Falls back to top-level tier, then auto-detect.'),
52
62
  }),
53
63
  ),
54
64
  }),
55
65
  handler: async (params) => {
56
66
  const projectPath = (params.projectPath as string | undefined) ?? '.';
67
+ const topTier = params.tier as ScopeTier | undefined;
57
68
  const entries = params.entries as Array<{
58
69
  id?: string;
59
70
  type: string;
@@ -66,12 +77,19 @@ export function createCaptureOps(runtime: AgentRuntime): OpDefinition[] {
66
77
  example?: string;
67
78
  counterExample?: string;
68
79
  why?: string;
80
+ tier?: ScopeTier;
69
81
  }>;
70
82
 
71
83
  let captured = 0;
72
84
  let proposed = 0;
73
85
  let rejected = 0;
74
- const results: Array<{ id: string; action: string; reason?: string }> = [];
86
+ let duplicated = 0;
87
+ const results: Array<{
88
+ id: string;
89
+ action: string;
90
+ reason?: string;
91
+ scope?: { tier: ScopeTier; confidence: string; reason: string };
92
+ }> = [];
75
93
 
76
94
  for (const entry of entries) {
77
95
  const entryId =
@@ -79,6 +97,22 @@ export function createCaptureOps(runtime: AgentRuntime): OpDefinition[] {
79
97
  const mappedSeverity = mapSeverity(entry.severity);
80
98
  const mappedType = mapType(entry.type);
81
99
 
100
+ // Scope detection: per-entry tier > top-level tier > auto-detect
101
+ const resolvedTier = entry.tier ?? topTier;
102
+ let scopeResult: ScopeDetectionResult | undefined;
103
+ let finalTier: ScopeTier;
104
+ if (resolvedTier) {
105
+ finalTier = resolvedTier;
106
+ } else {
107
+ scopeResult = detectScope({
108
+ title: entry.title,
109
+ description: entry.description,
110
+ category: entry.domain,
111
+ tags: entry.tags,
112
+ });
113
+ finalTier = scopeResult.tier;
114
+ }
115
+
82
116
  try {
83
117
  const decision = governance.evaluateCapture(projectPath, {
84
118
  type: mappedType,
@@ -89,7 +123,7 @@ export function createCaptureOps(runtime: AgentRuntime): OpDefinition[] {
89
123
  switch (decision.action) {
90
124
  case 'capture': {
91
125
  try {
92
- brain.enrichAndCapture({
126
+ const captureResult = brain.enrichAndCapture({
93
127
  id: entryId,
94
128
  type: mappedType as 'pattern' | 'anti-pattern' | 'rule' | 'playbook',
95
129
  domain: entry.domain,
@@ -101,9 +135,39 @@ export function createCaptureOps(runtime: AgentRuntime): OpDefinition[] {
101
135
  example: entry.example,
102
136
  counterExample: entry.counterExample,
103
137
  why: entry.why,
138
+ tier: finalTier,
104
139
  });
105
- captured++;
106
- results.push({ id: entryId, action: 'capture' });
140
+ const scopeMeta = scopeResult
141
+ ? {
142
+ tier: scopeResult.tier,
143
+ confidence: scopeResult.confidence,
144
+ reason: scopeResult.reason,
145
+ }
146
+ : {
147
+ tier: finalTier,
148
+ confidence: 'MANUAL' as const,
149
+ reason: 'explicit override',
150
+ };
151
+ if (captureResult.blocked) {
152
+ duplicated++;
153
+ results.push({
154
+ id: captureResult.duplicate?.id ?? entryId,
155
+ action: 'duplicate',
156
+ scope: scopeMeta,
157
+ });
158
+ } else {
159
+ captured++;
160
+ const result: (typeof results)[number] = {
161
+ id: entryId,
162
+ action: 'capture',
163
+ scope: scopeMeta,
164
+ };
165
+ if (scopeResult?.confidence === 'LOW') {
166
+ result.reason =
167
+ 'Low confidence scope detection — consider reviewing tier assignment';
168
+ }
169
+ results.push(result);
170
+ }
107
171
  } catch (err) {
108
172
  rejected++;
109
173
  results.push({
@@ -163,7 +227,7 @@ export function createCaptureOps(runtime: AgentRuntime): OpDefinition[] {
163
227
  }
164
228
  }
165
229
 
166
- return { captured, proposed, rejected, results };
230
+ return { captured, proposed, rejected, duplicated, results };
167
231
  },
168
232
  },
169
233
 
@@ -189,6 +253,10 @@ export function createCaptureOps(runtime: AgentRuntime): OpDefinition[] {
189
253
  title: z.string(),
190
254
  description: z.string(),
191
255
  tags: z.array(z.string()).optional().default([]),
256
+ tier: z
257
+ .enum(['agent', 'project', 'team'])
258
+ .optional()
259
+ .describe('Manual tier override. If omitted, tier is auto-detected from content.'),
192
260
  }),
193
261
  handler: async (params) => {
194
262
  const projectPath = (params.projectPath as string | undefined) ?? '.';
@@ -197,11 +265,29 @@ export function createCaptureOps(runtime: AgentRuntime): OpDefinition[] {
197
265
  const title = params.title as string;
198
266
  const description = params.description as string;
199
267
  const tags = (params.tags as string[] | undefined) ?? [];
268
+ const manualTier = params.tier as ScopeTier | undefined;
200
269
 
201
- const id = `${domain}-${Date.now()}`;
270
+ const id = `${domain}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
202
271
  const mappedSeverity = 'info' as const;
203
272
  const mappedType = mapType(entryType);
204
273
 
274
+ // Scope detection
275
+ let scopeResult: ScopeDetectionResult | undefined;
276
+ let finalTier: ScopeTier;
277
+ if (manualTier) {
278
+ finalTier = manualTier;
279
+ } else {
280
+ scopeResult = detectScope({ title, description, category: domain, tags });
281
+ finalTier = scopeResult.tier;
282
+ }
283
+ const scopeMeta = scopeResult
284
+ ? {
285
+ tier: scopeResult.tier,
286
+ confidence: scopeResult.confidence,
287
+ reason: scopeResult.reason,
288
+ }
289
+ : { tier: finalTier, confidence: 'MANUAL' as const, reason: 'explicit override' };
290
+
205
291
  try {
206
292
  const decision = governance.evaluateCapture(projectPath, {
207
293
  type: mappedType,
@@ -212,7 +298,7 @@ export function createCaptureOps(runtime: AgentRuntime): OpDefinition[] {
212
298
  switch (decision.action) {
213
299
  case 'capture': {
214
300
  try {
215
- brain.enrichAndCapture({
301
+ const captureResult = brain.enrichAndCapture({
216
302
  id,
217
303
  type: mappedType as 'pattern' | 'anti-pattern' | 'rule' | 'playbook',
218
304
  domain,
@@ -220,8 +306,27 @@ export function createCaptureOps(runtime: AgentRuntime): OpDefinition[] {
220
306
  severity: mapSeverity(mappedSeverity),
221
307
  description,
222
308
  tags,
309
+ tier: finalTier,
223
310
  });
224
- return { captured: true, id, governance: { action: 'capture' as const } };
311
+ if (captureResult.blocked) {
312
+ return {
313
+ captured: false,
314
+ id: captureResult.duplicate?.id ?? id,
315
+ governance: { action: 'duplicate' as const },
316
+ scope: scopeMeta,
317
+ };
318
+ }
319
+ const result: Record<string, unknown> = {
320
+ captured: true,
321
+ id,
322
+ governance: { action: 'capture' as const },
323
+ scope: scopeMeta,
324
+ };
325
+ if (scopeResult?.confidence === 'LOW') {
326
+ result.reviewNote =
327
+ 'Low confidence scope detection — consider reviewing tier assignment';
328
+ }
329
+ return result;
225
330
  } catch (err) {
226
331
  return {
227
332
  captured: false,
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Deprecation utilities — log warnings for deprecated ops with migration paths.
3
+ *
4
+ * Follows Soleri's semver policy:
5
+ * 1. Op marked deprecated → logs warning (minor version)
6
+ * 2. Warning persists for 2+ minor versions
7
+ * 3. Op removed (next major version)
8
+ */
9
+
10
+ const warned = new Set<string>();
11
+
12
+ export interface DeprecationInfo {
13
+ /** The deprecated op/function name */
14
+ name: string;
15
+ /** Version when it was deprecated */
16
+ since: string;
17
+ /** Version when it will be removed */
18
+ removeIn?: string;
19
+ /** What to use instead */
20
+ replacement?: string;
21
+ /** Additional migration guidance */
22
+ message?: string;
23
+ }
24
+
25
+ /**
26
+ * Log a deprecation warning (once per op per process lifetime).
27
+ */
28
+ export function deprecationWarning(info: DeprecationInfo): void {
29
+ if (warned.has(info.name)) return;
30
+ warned.add(info.name);
31
+
32
+ const parts = [`[DEPRECATED] "${info.name}" is deprecated since v${info.since}.`];
33
+ if (info.replacement) parts.push(`Use "${info.replacement}" instead.`);
34
+ if (info.removeIn) parts.push(`Will be removed in v${info.removeIn}.`);
35
+ if (info.message) parts.push(info.message);
36
+
37
+ console.warn(parts.join(' '));
38
+ }
39
+
40
+ /**
41
+ * Create a deprecated op handler that wraps the real handler with a warning.
42
+ */
43
+ export function wrapDeprecated<T extends (...args: unknown[]) => unknown>(
44
+ fn: T,
45
+ info: DeprecationInfo,
46
+ ): T {
47
+ return ((...args: unknown[]) => {
48
+ deprecationWarning(info);
49
+ return fn(...args);
50
+ }) as T;
51
+ }
52
+
53
+ /**
54
+ * Clear warned set (for testing).
55
+ */
56
+ export function resetDeprecationWarnings(): void {
57
+ warned.clear();
58
+ }
@@ -8,11 +8,14 @@ import type { OpDefinition } from '../../facades/types.js';
8
8
  import type { AgentRuntime } from '../types.js';
9
9
  import { createAdminOps } from '../admin-ops.js';
10
10
  import { createAdminExtraOps } from '../admin-extra-ops.js';
11
+ import { createPluginOps } from '../plugin-ops.js';
12
+ import { createPackOps } from '../pack-ops.js';
13
+ import { createTelemetryOps } from '../telemetry-ops.js';
11
14
 
12
15
  export function createAdminFacadeOps(runtime: AgentRuntime): OpDefinition[] {
13
16
  const { llmClient, keyPool } = runtime;
14
17
 
15
- return [
18
+ const ops: OpDefinition[] = [
16
19
  // ─── LLM (inline from core-ops.ts) ──────────────────────────
17
20
  {
18
21
  name: 'llm_rotate',
@@ -98,4 +101,16 @@ export function createAdminFacadeOps(runtime: AgentRuntime): OpDefinition[] {
98
101
  ...createAdminOps(runtime),
99
102
  ...createAdminExtraOps(runtime),
100
103
  ];
104
+
105
+ // Plugin ops must mutate the same live op array that MCP dispatch reads.
106
+ const pluginOps = createPluginOps(runtime, ops);
107
+ ops.push(...pluginOps);
108
+
109
+ // Pack ops
110
+ ops.push(...createPackOps(runtime));
111
+
112
+ // Telemetry ops
113
+ ops.push(...createTelemetryOps(runtime));
114
+
115
+ return ops;
101
116
  }