@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,130 @@
1
+ /**
2
+ * Fragment Buffer — merges split messages from chat platforms.
3
+ *
4
+ * Telegram, Discord, and other platforms split long pastes into multiple
5
+ * messages (e.g. Telegram's 4096 char limit). This buffer detects near-limit
6
+ * messages and waits briefly for follow-up parts before flushing as one unit.
7
+ *
8
+ * Ported from Salvador's handler-messages.ts with improvements:
9
+ * - Transport-agnostic (works for any chat platform)
10
+ * - Callback-based flush (no transport dependency)
11
+ * - Configurable thresholds
12
+ */
13
+ const DEFAULT_START_THRESHOLD = 4000;
14
+ const DEFAULT_MAX_GAP_MS = 1500;
15
+ const DEFAULT_MAX_PARTS = 12;
16
+ const DEFAULT_MAX_TOTAL_BYTES = 50_000;
17
+ export class FragmentBuffer {
18
+ buffers = new Map();
19
+ config;
20
+ onFlush;
21
+ constructor(config, onFlush) {
22
+ this.config = {
23
+ startThreshold: config?.startThreshold ?? DEFAULT_START_THRESHOLD,
24
+ maxGapMs: config?.maxGapMs ?? DEFAULT_MAX_GAP_MS,
25
+ maxParts: config?.maxParts ?? DEFAULT_MAX_PARTS,
26
+ maxTotalBytes: config?.maxTotalBytes ?? DEFAULT_MAX_TOTAL_BYTES,
27
+ };
28
+ this.onFlush = onFlush;
29
+ }
30
+ /**
31
+ * Receive a message. Returns true if the message was buffered (caller should wait),
32
+ * false if the message should be processed immediately.
33
+ */
34
+ receive(key, fragment) {
35
+ const existing = this.buffers.get(key);
36
+ if (existing) {
37
+ // Append to existing buffer
38
+ return this.appendToBuffer(existing, fragment);
39
+ }
40
+ // Check if this message is long enough to start buffering
41
+ if (fragment.text.length >= this.config.startThreshold) {
42
+ this.startBuffer(key, fragment);
43
+ return true;
44
+ }
45
+ // Short message — process immediately
46
+ return false;
47
+ }
48
+ /**
49
+ * Force-flush a specific buffer. Returns the merged text or null if no buffer.
50
+ */
51
+ flush(key) {
52
+ const buffer = this.buffers.get(key);
53
+ if (!buffer)
54
+ return null;
55
+ clearTimeout(buffer.timer);
56
+ const merged = this.mergeFragments(buffer.fragments);
57
+ this.buffers.delete(key);
58
+ return merged;
59
+ }
60
+ /**
61
+ * Force-flush all pending buffers.
62
+ */
63
+ flushAll() {
64
+ for (const [key, buffer] of this.buffers) {
65
+ clearTimeout(buffer.timer);
66
+ const merged = this.mergeFragments(buffer.fragments);
67
+ this.buffers.delete(key);
68
+ this.onFlush(key, merged);
69
+ }
70
+ }
71
+ /**
72
+ * Number of keys with pending fragments.
73
+ */
74
+ get pendingCount() {
75
+ return this.buffers.size;
76
+ }
77
+ /**
78
+ * Check if a key has pending fragments.
79
+ */
80
+ hasPending(key) {
81
+ return this.buffers.has(key);
82
+ }
83
+ /**
84
+ * Close the buffer — flush all and clean up timers.
85
+ */
86
+ close() {
87
+ for (const buffer of this.buffers.values()) {
88
+ clearTimeout(buffer.timer);
89
+ }
90
+ this.buffers.clear();
91
+ }
92
+ // ─── Private ───────────────────────────────────────────────────
93
+ startBuffer(key, fragment) {
94
+ const timer = setTimeout(() => this.autoFlush(key), this.config.maxGapMs);
95
+ this.buffers.set(key, {
96
+ key,
97
+ fragments: [fragment],
98
+ totalBytes: fragment.text.length,
99
+ timer,
100
+ });
101
+ }
102
+ appendToBuffer(buffer, fragment) {
103
+ const newTotal = buffer.totalBytes + fragment.text.length;
104
+ // Force-flush if limits exceeded
105
+ if (buffer.fragments.length >= this.config.maxParts || newTotal > this.config.maxTotalBytes) {
106
+ this.autoFlush(buffer.key);
107
+ // The new fragment starts fresh — don't buffer it
108
+ return false;
109
+ }
110
+ // Append and reset timer
111
+ clearTimeout(buffer.timer);
112
+ buffer.fragments.push(fragment);
113
+ buffer.totalBytes = newTotal;
114
+ buffer.timer = setTimeout(() => this.autoFlush(buffer.key), this.config.maxGapMs);
115
+ return true;
116
+ }
117
+ autoFlush(key) {
118
+ const buffer = this.buffers.get(key);
119
+ if (!buffer)
120
+ return;
121
+ clearTimeout(buffer.timer);
122
+ const merged = this.mergeFragments(buffer.fragments);
123
+ this.buffers.delete(key);
124
+ this.onFlush(key, merged);
125
+ }
126
+ mergeFragments(fragments) {
127
+ return fragments.map((f) => f.text).join('\n');
128
+ }
129
+ }
130
+ //# sourceMappingURL=fragment-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fragment-buffer.js","sourceRoot":"","sources":["../../src/chat/fragment-buffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export { ChatSessionManager } from './chat-session.js';
2
+ export { FragmentBuffer } from './fragment-buffer.js';
3
+ export { ChatAuthManager } from './auth-manager.js';
4
+ export { TaskCancellationManager } from './cancellation.js';
5
+ export { SelfUpdateManager, RESTART_EXIT_CODE } from './self-update.js';
6
+ export { NotificationEngine } from './notifications.js';
7
+ export { detectFileIntent, buildMultimodalContent, saveTempFile, cleanupTempFiles, sanitizeForPersistence, MAX_FILE_SIZE, TEXT_EXTENSIONS, IMAGE_MIME_TYPES, INTAKE_KEYWORDS, } from './file-handler.js';
8
+ export { transcribeAudio, synthesizeSpeech } from './voice.js';
9
+ export { MessageQueue } from './queue.js';
10
+ export { BrowserSessionManager } from './browser-session.js';
11
+ export { chunkResponse, convertMarkup, markdownToHtml } from './response-chunker.js';
12
+ export { runAgentLoop } from './agent-loop.js';
13
+ export { McpToolBridge } from './mcp-bridge.js';
14
+ export { createOutputCompressor, registerCompressor, clearCompressors, } from './output-compressor.js';
15
+ export type { ChatRole, ChatMessage, ChatSession, ChatSessionConfig, Fragment, FragmentBufferConfig, MarkupFormat, ChunkConfig, ChatAuthConfig, AuthRecord, AuthState, ChatManagerConfig, ChatManagerStatus, } from './types.js';
16
+ export type { AgentTool, ToolResult, ToolExecutor, AgentLoopConfig, AgentCallbacks, AgentLoopResult, McpToolRegistration, OutputCompressor, } from './agent-loop-types.js';
17
+ export type { CancellationInfo } from './cancellation.js';
18
+ export type { RestartContext, RestartResult } from './self-update.js';
19
+ export type { NotificationCheck, NotificationEngineConfig, NotificationStats, } from './notifications.js';
20
+ export type { FileIntent, FileInfo, MultimodalContent } from './file-handler.js';
21
+ export type { VoiceConfig, TranscriptionResult, SpeechResult } from './voice.js';
22
+ export type { QueuedMessage, QueuedResponse, QueueConfig } from './queue.js';
23
+ export type { BrowserSessionConfig, BrowserSession, BrowserTool, BrowserToolResult, } from './browser-session.js';
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chat/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EACV,QAAQ,EACR,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,QAAQ,EACR,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,SAAS,EACT,UAAU,EACV,YAAY,EACZ,eAAe,EACf,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtE,YAAY,EACV,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACjF,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACjF,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC7E,YAAY,EACV,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,iBAAiB,GAClB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,15 @@
1
+ export { ChatSessionManager } from './chat-session.js';
2
+ export { FragmentBuffer } from './fragment-buffer.js';
3
+ export { ChatAuthManager } from './auth-manager.js';
4
+ export { TaskCancellationManager } from './cancellation.js';
5
+ export { SelfUpdateManager, RESTART_EXIT_CODE } from './self-update.js';
6
+ export { NotificationEngine } from './notifications.js';
7
+ export { detectFileIntent, buildMultimodalContent, saveTempFile, cleanupTempFiles, sanitizeForPersistence, MAX_FILE_SIZE, TEXT_EXTENSIONS, IMAGE_MIME_TYPES, INTAKE_KEYWORDS, } from './file-handler.js';
8
+ export { transcribeAudio, synthesizeSpeech } from './voice.js';
9
+ export { MessageQueue } from './queue.js';
10
+ export { BrowserSessionManager } from './browser-session.js';
11
+ export { chunkResponse, convertMarkup, markdownToHtml } from './response-chunker.js';
12
+ export { runAgentLoop } from './agent-loop.js';
13
+ export { McpToolBridge } from './mcp-bridge.js';
14
+ export { createOutputCompressor, registerCompressor, clearCompressors, } from './output-compressor.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chat/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * MCP Tool Bridge — intercepts MCP tool registrations and executes locally.
3
+ *
4
+ * Ported from Salvador's mcp-bridge.ts with improvements:
5
+ * - Simpler API (no Zod dependency — accepts JSON Schema directly)
6
+ * - Optional allowlist for tool filtering
7
+ * - Generic output compression hook
8
+ *
9
+ * Used by Telegram (and other chat transports) to bridge the agent's MCP tools
10
+ * into the agent loop without network round-trips.
11
+ */
12
+ import type { AgentTool, ToolResult, McpToolRegistration, OutputCompressor } from './agent-loop-types.js';
13
+ export declare class McpToolBridge {
14
+ private tools;
15
+ private allowlist;
16
+ private compressor;
17
+ private maxOutput;
18
+ constructor(options?: {
19
+ allowlist?: string[];
20
+ compressor?: OutputCompressor;
21
+ maxOutput?: number;
22
+ });
23
+ /**
24
+ * Register a tool. If an allowlist is set, only allowed tools are registered.
25
+ */
26
+ register(tool: McpToolRegistration): void;
27
+ /**
28
+ * Register multiple tools at once.
29
+ */
30
+ registerAll(tools: McpToolRegistration[]): void;
31
+ /**
32
+ * Check if a tool is registered.
33
+ */
34
+ has(name: string): boolean;
35
+ /**
36
+ * Get registered tools as AgentTool array (for the agent loop).
37
+ */
38
+ getTools(): AgentTool[];
39
+ /**
40
+ * Execute a tool by name.
41
+ */
42
+ execute(name: string, input: Record<string, unknown>): Promise<ToolResult>;
43
+ /**
44
+ * Create a ToolExecutor function for use with the agent loop.
45
+ */
46
+ createExecutor(): (name: string, input: Record<string, unknown>) => Promise<ToolResult>;
47
+ /**
48
+ * Number of registered tools.
49
+ */
50
+ get size(): number;
51
+ /**
52
+ * List registered tool names.
53
+ */
54
+ listTools(): string[];
55
+ /**
56
+ * Clear all registered tools.
57
+ */
58
+ clear(): void;
59
+ }
60
+ //# sourceMappingURL=mcp-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-bridge.d.ts","sourceRoot":"","sources":["../../src/chat/mcp-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAI/B,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,CAAC,EAAE;QACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,UAAU,CAAC,EAAE,gBAAgB,CAAC;QAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;IAMD;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI;IAKzC;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,IAAI;IAM/C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACH,QAAQ,IAAI,SAAS,EAAE;IAQvB;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAgChF;;OAEG;IACH,cAAc,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC;IAIvF;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,SAAS,IAAI,MAAM,EAAE;IAIrB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * MCP Tool Bridge — intercepts MCP tool registrations and executes locally.
3
+ *
4
+ * Ported from Salvador's mcp-bridge.ts with improvements:
5
+ * - Simpler API (no Zod dependency — accepts JSON Schema directly)
6
+ * - Optional allowlist for tool filtering
7
+ * - Generic output compression hook
8
+ *
9
+ * Used by Telegram (and other chat transports) to bridge the agent's MCP tools
10
+ * into the agent loop without network round-trips.
11
+ */
12
+ const DEFAULT_MAX_OUTPUT = 10_000; // 10KB
13
+ export class McpToolBridge {
14
+ tools = new Map();
15
+ allowlist;
16
+ compressor;
17
+ maxOutput;
18
+ constructor(options) {
19
+ this.allowlist = options?.allowlist ? new Set(options.allowlist) : null;
20
+ this.compressor = options?.compressor ?? null;
21
+ this.maxOutput = options?.maxOutput ?? DEFAULT_MAX_OUTPUT;
22
+ }
23
+ /**
24
+ * Register a tool. If an allowlist is set, only allowed tools are registered.
25
+ */
26
+ register(tool) {
27
+ if (this.allowlist && !this.allowlist.has(tool.name))
28
+ return;
29
+ this.tools.set(tool.name, tool);
30
+ }
31
+ /**
32
+ * Register multiple tools at once.
33
+ */
34
+ registerAll(tools) {
35
+ for (const tool of tools) {
36
+ this.register(tool);
37
+ }
38
+ }
39
+ /**
40
+ * Check if a tool is registered.
41
+ */
42
+ has(name) {
43
+ return this.tools.has(name);
44
+ }
45
+ /**
46
+ * Get registered tools as AgentTool array (for the agent loop).
47
+ */
48
+ getTools() {
49
+ return [...this.tools.values()].map((t) => ({
50
+ name: t.name,
51
+ description: t.description,
52
+ inputSchema: t.inputSchema,
53
+ }));
54
+ }
55
+ /**
56
+ * Execute a tool by name.
57
+ */
58
+ async execute(name, input) {
59
+ const tool = this.tools.get(name);
60
+ if (!tool) {
61
+ return {
62
+ output: `Unknown tool: ${name}`,
63
+ isError: true,
64
+ };
65
+ }
66
+ try {
67
+ const rawResult = await tool.handler(input);
68
+ let output = typeof rawResult === 'string' ? rawResult : JSON.stringify(rawResult);
69
+ // Apply compression if available
70
+ if (this.compressor) {
71
+ output = this.compressor(name, output, this.maxOutput);
72
+ }
73
+ // Truncate if still too long
74
+ if (output.length > this.maxOutput) {
75
+ output = output.slice(0, this.maxOutput) + `\n... (truncated at ${this.maxOutput} chars)`;
76
+ }
77
+ return { output, isError: false };
78
+ }
79
+ catch (error) {
80
+ return {
81
+ output: `Tool error: ${error instanceof Error ? error.message : String(error)}`,
82
+ isError: true,
83
+ };
84
+ }
85
+ }
86
+ /**
87
+ * Create a ToolExecutor function for use with the agent loop.
88
+ */
89
+ createExecutor() {
90
+ return (name, input) => this.execute(name, input);
91
+ }
92
+ /**
93
+ * Number of registered tools.
94
+ */
95
+ get size() {
96
+ return this.tools.size;
97
+ }
98
+ /**
99
+ * List registered tool names.
100
+ */
101
+ listTools() {
102
+ return [...this.tools.keys()];
103
+ }
104
+ /**
105
+ * Clear all registered tools.
106
+ */
107
+ clear() {
108
+ this.tools.clear();
109
+ }
110
+ }
111
+ //# sourceMappingURL=mcp-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-bridge.js","sourceRoot":"","sources":["../../src/chat/mcp-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Notification Engine — pluggable background polling with debounce.
3
+ *
4
+ * Generic notification system for chat transports. Register check functions
5
+ * that run at configurable intervals. Built-in debounce prevents spam.
6
+ *
7
+ * Transport-specific delivery (Telegram, Discord, etc.) is handled via
8
+ * the onNotify callback.
9
+ */
10
+ export interface NotificationCheck {
11
+ /** Unique check ID. */
12
+ id: string;
13
+ /** Human-readable label. */
14
+ label: string;
15
+ /** The check function. Returns null if nothing to notify, or a message string. */
16
+ check: () => Promise<string | null>;
17
+ /** Cooldown between notifications for this check (ms). Default: 4 hours. */
18
+ cooldownMs?: number;
19
+ /** Optional time window — only run during these hours (0-23). */
20
+ activeHours?: {
21
+ start: number;
22
+ end: number;
23
+ };
24
+ }
25
+ export interface NotificationEngineConfig {
26
+ /** Polling interval in ms. Default: 30 minutes. */
27
+ intervalMs?: number;
28
+ /** Callback to deliver a notification. */
29
+ onNotify: (checkId: string, message: string) => Promise<void>;
30
+ /** Default cooldown for checks that don't specify one. Default: 4 hours. */
31
+ defaultCooldownMs?: number;
32
+ }
33
+ export interface NotificationStats {
34
+ /** Number of registered checks. */
35
+ checks: number;
36
+ /** Whether the engine is running. */
37
+ running: boolean;
38
+ /** Total notifications sent. */
39
+ sent: number;
40
+ /** Last poll timestamp. */
41
+ lastPollAt: number | null;
42
+ }
43
+ export declare class NotificationEngine {
44
+ private checks;
45
+ private lastNotified;
46
+ private timer;
47
+ private sent;
48
+ private lastPollAt;
49
+ private readonly intervalMs;
50
+ private readonly defaultCooldownMs;
51
+ private readonly onNotify;
52
+ constructor(config: NotificationEngineConfig);
53
+ /**
54
+ * Register a notification check.
55
+ */
56
+ register(check: NotificationCheck): void;
57
+ /**
58
+ * Unregister a check.
59
+ */
60
+ unregister(id: string): boolean;
61
+ /**
62
+ * Start the polling loop. Runs an initial check after a short delay.
63
+ */
64
+ start(): void;
65
+ /**
66
+ * Stop the polling loop.
67
+ */
68
+ stop(): void;
69
+ /**
70
+ * Run all checks once (called automatically by the polling loop).
71
+ */
72
+ poll(): Promise<number>;
73
+ /**
74
+ * Get engine stats.
75
+ */
76
+ stats(): NotificationStats;
77
+ /**
78
+ * Check if enough time has passed since last notification for this check.
79
+ */
80
+ private shouldNotify;
81
+ }
82
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/chat/notifications.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,iBAAiB;IAChC,uBAAuB;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,KAAK,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpC,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,WAAW,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED,MAAM,WAAW,wBAAwB;IACvC,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAOD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsD;gBAEnE,MAAM,EAAE,wBAAwB;IAM5C;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAIxC;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI/B;;OAEG;IACH,KAAK,IAAI,IAAI;IASb;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAsC7B;;OAEG;IACH,KAAK,IAAI,iBAAiB;IAS1B;;OAEG;IACH,OAAO,CAAC,YAAY;CAKrB"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Notification Engine — pluggable background polling with debounce.
3
+ *
4
+ * Generic notification system for chat transports. Register check functions
5
+ * that run at configurable intervals. Built-in debounce prevents spam.
6
+ *
7
+ * Transport-specific delivery (Telegram, Discord, etc.) is handled via
8
+ * the onNotify callback.
9
+ */
10
+ // ─── Engine ───────────────────────────────────────────────────────────
11
+ const DEFAULT_INTERVAL_MS = 30 * 60 * 1000; // 30 minutes
12
+ const DEFAULT_COOLDOWN_MS = 4 * 60 * 60 * 1000; // 4 hours
13
+ export class NotificationEngine {
14
+ checks = new Map();
15
+ lastNotified = new Map();
16
+ timer = null;
17
+ sent = 0;
18
+ lastPollAt = null;
19
+ intervalMs;
20
+ defaultCooldownMs;
21
+ onNotify;
22
+ constructor(config) {
23
+ this.intervalMs = config.intervalMs ?? DEFAULT_INTERVAL_MS;
24
+ this.defaultCooldownMs = config.defaultCooldownMs ?? DEFAULT_COOLDOWN_MS;
25
+ this.onNotify = config.onNotify;
26
+ }
27
+ /**
28
+ * Register a notification check.
29
+ */
30
+ register(check) {
31
+ this.checks.set(check.id, check);
32
+ }
33
+ /**
34
+ * Unregister a check.
35
+ */
36
+ unregister(id) {
37
+ return this.checks.delete(id);
38
+ }
39
+ /**
40
+ * Start the polling loop. Runs an initial check after a short delay.
41
+ */
42
+ start() {
43
+ if (this.timer)
44
+ return; // Already running
45
+ // Initial check after 10 seconds
46
+ setTimeout(() => this.poll(), 10_000);
47
+ this.timer = setInterval(() => this.poll(), this.intervalMs);
48
+ }
49
+ /**
50
+ * Stop the polling loop.
51
+ */
52
+ stop() {
53
+ if (this.timer) {
54
+ clearInterval(this.timer);
55
+ this.timer = null;
56
+ }
57
+ }
58
+ /**
59
+ * Run all checks once (called automatically by the polling loop).
60
+ */
61
+ async poll() {
62
+ this.lastPollAt = Date.now();
63
+ let notified = 0;
64
+ for (const [id, check] of this.checks) {
65
+ try {
66
+ // Time window check
67
+ if (check.activeHours) {
68
+ const hour = new Date().getHours();
69
+ const { start, end } = check.activeHours;
70
+ if (start <= end) {
71
+ if (hour < start || hour >= end)
72
+ continue;
73
+ }
74
+ else {
75
+ // Wraps midnight (e.g., 22-6)
76
+ if (hour < start && hour >= end)
77
+ continue;
78
+ }
79
+ }
80
+ // Cooldown check
81
+ if (!this.shouldNotify(id, check.cooldownMs ?? this.defaultCooldownMs)) {
82
+ continue;
83
+ }
84
+ const message = await check.check();
85
+ if (message) {
86
+ await this.onNotify(id, message);
87
+ this.lastNotified.set(id, Date.now());
88
+ this.sent++;
89
+ notified++;
90
+ }
91
+ }
92
+ catch {
93
+ // Individual check failure is non-critical
94
+ }
95
+ }
96
+ return notified;
97
+ }
98
+ /**
99
+ * Get engine stats.
100
+ */
101
+ stats() {
102
+ return {
103
+ checks: this.checks.size,
104
+ running: this.timer !== null,
105
+ sent: this.sent,
106
+ lastPollAt: this.lastPollAt,
107
+ };
108
+ }
109
+ /**
110
+ * Check if enough time has passed since last notification for this check.
111
+ */
112
+ shouldNotify(checkId, cooldownMs) {
113
+ const last = this.lastNotified.get(checkId);
114
+ if (!last)
115
+ return true;
116
+ return Date.now() - last >= cooldownMs;
117
+ }
118
+ }
119
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/chat/notifications.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAqCH,yEAAyE;AAEzE,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AACzD,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,UAAU;AAE1D,MAAM,OAAO,kBAAkB;IACrB,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC9C,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,GAA0C,IAAI,CAAC;IACpD,IAAI,GAAG,CAAC,CAAC;IACT,UAAU,GAAkB,IAAI,CAAC;IACxB,UAAU,CAAS;IACnB,iBAAiB,CAAS;IAC1B,QAAQ,CAAsD;IAE/E,YAAY,MAAgC;QAC1C,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,mBAAmB,CAAC;QAC3D,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,mBAAmB,CAAC;QACzE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAwB;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,EAAU;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,kBAAkB;QAE1C,iCAAiC;QACjC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;QAEtC,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,oBAAoB;gBACpB,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;oBACtB,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;oBACnC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC;oBACzC,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;wBACjB,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,GAAG;4BAAE,SAAS;oBAC5C,CAAC;yBAAM,CAAC;wBACN,8BAA8B;wBAC9B,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,GAAG;4BAAE,SAAS;oBAC5C,CAAC;gBACH,CAAC;gBAED,iBAAiB;gBACjB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBACvE,SAAS;gBACX,CAAC;gBAED,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;gBACpC,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;oBACjC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;oBACtC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACZ,QAAQ,EAAE,CAAC;gBACb,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,2CAA2C;YAC7C,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACxB,OAAO,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI;YAC5B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,OAAe,EAAE,UAAkB;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,UAAU,CAAC;IACzC,CAAC;CACF"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Output Compressor — compress verbose tool outputs for chat contexts.
3
+ *
4
+ * Unlike Salvador's 30+ domain-specific compressors, this provides:
5
+ * 1. A generic JSON compressor (extracts key fields, truncates arrays)
6
+ * 2. A registry for domain-specific compressors (pluggable)
7
+ *
8
+ * Domain packs can register their own compressors for their tools.
9
+ */
10
+ import type { OutputCompressor } from './agent-loop-types.js';
11
+ type ToolCompressor = (output: string, maxLength: number) => string;
12
+ /**
13
+ * Register a compressor for a specific tool name (or prefix).
14
+ */
15
+ export declare function registerCompressor(toolNameOrPrefix: string, compressor: ToolCompressor): void;
16
+ /**
17
+ * Clear all registered compressors.
18
+ */
19
+ export declare function clearCompressors(): void;
20
+ /**
21
+ * Create a generic output compressor. Uses registered compressors for known tools,
22
+ * falls back to JSON-aware truncation.
23
+ */
24
+ export declare function createOutputCompressor(options?: {
25
+ maxLength?: number;
26
+ maxArrayItems?: number;
27
+ maxStringLength?: number;
28
+ }): OutputCompressor;
29
+ export {};
30
+ //# sourceMappingURL=output-compressor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-compressor.d.ts","sourceRoot":"","sources":["../../src/chat/output-compressor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQ9D,KAAK,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;AAIpE;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,GAAG,IAAI,CAE7F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAID;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,gBAAgB,CAiCnB"}