@soleri/core 2.10.0 → 2.12.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 (511) 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 +24 -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/loader.d.ts.map +1 -1
  168. package/dist/intelligence/loader.js +51 -5
  169. package/dist/intelligence/loader.js.map +1 -1
  170. package/dist/intelligence/types.d.ts +1 -0
  171. package/dist/intelligence/types.d.ts.map +1 -1
  172. package/dist/migrations/index.d.ts +6 -0
  173. package/dist/migrations/index.d.ts.map +1 -0
  174. package/dist/migrations/index.js +5 -0
  175. package/dist/migrations/index.js.map +1 -0
  176. package/dist/migrations/migration-runner.d.ts +51 -0
  177. package/dist/migrations/migration-runner.d.ts.map +1 -0
  178. package/dist/migrations/migration-runner.js +141 -0
  179. package/dist/migrations/migration-runner.js.map +1 -0
  180. package/dist/packs/index.d.ts +10 -0
  181. package/dist/packs/index.d.ts.map +1 -0
  182. package/dist/packs/index.js +8 -0
  183. package/dist/packs/index.js.map +1 -0
  184. package/dist/packs/lockfile.d.ts +97 -0
  185. package/dist/packs/lockfile.d.ts.map +1 -0
  186. package/dist/packs/lockfile.js +129 -0
  187. package/dist/packs/lockfile.js.map +1 -0
  188. package/dist/packs/pack-installer.d.ts +41 -0
  189. package/dist/packs/pack-installer.d.ts.map +1 -0
  190. package/dist/packs/pack-installer.js +253 -0
  191. package/dist/packs/pack-installer.js.map +1 -0
  192. package/dist/packs/resolver.d.ts +51 -0
  193. package/dist/packs/resolver.d.ts.map +1 -0
  194. package/dist/packs/resolver.js +195 -0
  195. package/dist/packs/resolver.js.map +1 -0
  196. package/dist/packs/types.d.ts +186 -0
  197. package/dist/packs/types.d.ts.map +1 -0
  198. package/dist/packs/types.js +69 -0
  199. package/dist/packs/types.js.map +1 -0
  200. package/dist/persistence/postgres-provider.d.ts +42 -7
  201. package/dist/persistence/postgres-provider.d.ts.map +1 -1
  202. package/dist/persistence/postgres-provider.js +187 -46
  203. package/dist/persistence/postgres-provider.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/domain-ops.d.ts.map +1 -1
  239. package/dist/runtime/domain-ops.js +21 -2
  240. package/dist/runtime/domain-ops.js.map +1 -1
  241. package/dist/runtime/facades/admin-facade.d.ts.map +1 -1
  242. package/dist/runtime/facades/admin-facade.js +12 -1
  243. package/dist/runtime/facades/admin-facade.js.map +1 -1
  244. package/dist/runtime/facades/agency-facade.d.ts +7 -0
  245. package/dist/runtime/facades/agency-facade.d.ts.map +1 -0
  246. package/dist/runtime/facades/agency-facade.js +103 -0
  247. package/dist/runtime/facades/agency-facade.js.map +1 -0
  248. package/dist/runtime/facades/brain-facade.d.ts.map +1 -1
  249. package/dist/runtime/facades/brain-facade.js +58 -0
  250. package/dist/runtime/facades/brain-facade.js.map +1 -1
  251. package/dist/runtime/facades/chat-facade.d.ts +7 -0
  252. package/dist/runtime/facades/chat-facade.d.ts.map +1 -0
  253. package/dist/runtime/facades/chat-facade.js +808 -0
  254. package/dist/runtime/facades/chat-facade.js.map +1 -0
  255. package/dist/runtime/facades/context-facade.d.ts +7 -0
  256. package/dist/runtime/facades/context-facade.d.ts.map +1 -0
  257. package/dist/runtime/facades/context-facade.js +45 -0
  258. package/dist/runtime/facades/context-facade.js.map +1 -0
  259. package/dist/runtime/facades/index.d.ts.map +1 -1
  260. package/dist/runtime/facades/index.js +18 -0
  261. package/dist/runtime/facades/index.js.map +1 -1
  262. package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
  263. package/dist/runtime/facades/vault-facade.js +247 -1
  264. package/dist/runtime/facades/vault-facade.js.map +1 -1
  265. package/dist/runtime/feature-flags.d.ts +18 -0
  266. package/dist/runtime/feature-flags.d.ts.map +1 -0
  267. package/dist/runtime/feature-flags.js +90 -0
  268. package/dist/runtime/feature-flags.js.map +1 -0
  269. package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
  270. package/dist/runtime/orchestrate-ops.js +13 -0
  271. package/dist/runtime/orchestrate-ops.js.map +1 -1
  272. package/dist/runtime/pack-ops.d.ts +9 -0
  273. package/dist/runtime/pack-ops.d.ts.map +1 -0
  274. package/dist/runtime/pack-ops.js +76 -0
  275. package/dist/runtime/pack-ops.js.map +1 -0
  276. package/dist/runtime/playbook-ops.d.ts +3 -7
  277. package/dist/runtime/playbook-ops.d.ts.map +1 -1
  278. package/dist/runtime/playbook-ops.js +101 -10
  279. package/dist/runtime/playbook-ops.js.map +1 -1
  280. package/dist/runtime/plugin-ops.d.ts +9 -0
  281. package/dist/runtime/plugin-ops.d.ts.map +1 -0
  282. package/dist/runtime/plugin-ops.js +235 -0
  283. package/dist/runtime/plugin-ops.js.map +1 -0
  284. package/dist/runtime/runtime.d.ts.map +1 -1
  285. package/dist/runtime/runtime.js +72 -5
  286. package/dist/runtime/runtime.js.map +1 -1
  287. package/dist/runtime/telemetry-ops.d.ts +10 -0
  288. package/dist/runtime/telemetry-ops.d.ts.map +1 -0
  289. package/dist/runtime/telemetry-ops.js +53 -0
  290. package/dist/runtime/telemetry-ops.js.map +1 -0
  291. package/dist/runtime/types.d.ts +35 -0
  292. package/dist/runtime/types.d.ts.map +1 -1
  293. package/dist/runtime/vault-sharing-ops.d.ts +13 -0
  294. package/dist/runtime/vault-sharing-ops.d.ts.map +1 -0
  295. package/dist/runtime/vault-sharing-ops.js +345 -0
  296. package/dist/runtime/vault-sharing-ops.js.map +1 -0
  297. package/dist/streams/index.d.ts +1 -1
  298. package/dist/streams/index.d.ts.map +1 -1
  299. package/dist/streams/index.js +1 -1
  300. package/dist/streams/index.js.map +1 -1
  301. package/dist/streams/replayable-stream.d.ts +13 -1
  302. package/dist/streams/replayable-stream.d.ts.map +1 -1
  303. package/dist/streams/replayable-stream.js +27 -3
  304. package/dist/streams/replayable-stream.js.map +1 -1
  305. package/dist/text/similarity.d.ts +0 -1
  306. package/dist/text/similarity.d.ts.map +1 -1
  307. package/dist/text/similarity.js +1 -1
  308. package/dist/text/similarity.js.map +1 -1
  309. package/dist/transport/http-server.d.ts +56 -0
  310. package/dist/transport/http-server.d.ts.map +1 -0
  311. package/dist/transport/http-server.js +210 -0
  312. package/dist/transport/http-server.js.map +1 -0
  313. package/dist/transport/index.d.ts +11 -0
  314. package/dist/transport/index.d.ts.map +1 -0
  315. package/dist/transport/index.js +10 -0
  316. package/dist/transport/index.js.map +1 -0
  317. package/dist/transport/lsp-server.d.ts +140 -0
  318. package/dist/transport/lsp-server.d.ts.map +1 -0
  319. package/dist/transport/lsp-server.js +239 -0
  320. package/dist/transport/lsp-server.js.map +1 -0
  321. package/dist/transport/rate-limiter.d.ts +35 -0
  322. package/dist/transport/rate-limiter.d.ts.map +1 -0
  323. package/dist/transport/rate-limiter.js +72 -0
  324. package/dist/transport/rate-limiter.js.map +1 -0
  325. package/dist/transport/session-manager.d.ts +49 -0
  326. package/dist/transport/session-manager.d.ts.map +1 -0
  327. package/dist/transport/session-manager.js +83 -0
  328. package/dist/transport/session-manager.js.map +1 -0
  329. package/dist/transport/token-auth.d.ts +29 -0
  330. package/dist/transport/token-auth.d.ts.map +1 -0
  331. package/dist/transport/token-auth.js +84 -0
  332. package/dist/transport/token-auth.js.map +1 -0
  333. package/dist/transport/types.d.ts +61 -0
  334. package/dist/transport/types.d.ts.map +1 -0
  335. package/dist/transport/types.js +5 -0
  336. package/dist/transport/types.js.map +1 -0
  337. package/dist/transport/ws-server.d.ts +78 -0
  338. package/dist/transport/ws-server.d.ts.map +1 -0
  339. package/dist/transport/ws-server.js +342 -0
  340. package/dist/transport/ws-server.js.map +1 -0
  341. package/dist/vault/git-vault-sync.d.ts +107 -0
  342. package/dist/vault/git-vault-sync.d.ts.map +1 -0
  343. package/dist/vault/git-vault-sync.js +251 -0
  344. package/dist/vault/git-vault-sync.js.map +1 -0
  345. package/dist/vault/knowledge-review.d.ts +67 -0
  346. package/dist/vault/knowledge-review.d.ts.map +1 -0
  347. package/dist/vault/knowledge-review.js +133 -0
  348. package/dist/vault/knowledge-review.js.map +1 -0
  349. package/dist/vault/obsidian-sync.d.ts +94 -0
  350. package/dist/vault/obsidian-sync.d.ts.map +1 -0
  351. package/dist/vault/obsidian-sync.js +247 -0
  352. package/dist/vault/obsidian-sync.js.map +1 -0
  353. package/dist/vault/scope-detector.d.ts +31 -0
  354. package/dist/vault/scope-detector.d.ts.map +1 -0
  355. package/dist/vault/scope-detector.js +182 -0
  356. package/dist/vault/scope-detector.js.map +1 -0
  357. package/dist/vault/vault-branching.d.ts +71 -0
  358. package/dist/vault/vault-branching.d.ts.map +1 -0
  359. package/dist/vault/vault-branching.js +180 -0
  360. package/dist/vault/vault-branching.js.map +1 -0
  361. package/dist/vault/vault-manager.d.ts +89 -0
  362. package/dist/vault/vault-manager.d.ts.map +1 -0
  363. package/dist/vault/vault-manager.js +199 -0
  364. package/dist/vault/vault-manager.js.map +1 -0
  365. package/dist/vault/vault-types.d.ts +30 -0
  366. package/dist/vault/vault-types.d.ts.map +1 -0
  367. package/dist/vault/vault-types.js +10 -0
  368. package/dist/vault/vault-types.js.map +1 -0
  369. package/dist/vault/vault.d.ts +10 -0
  370. package/dist/vault/vault.d.ts.map +1 -1
  371. package/dist/vault/vault.js +36 -3
  372. package/dist/vault/vault.js.map +1 -1
  373. package/package.json +1 -1
  374. package/src/__tests__/admin-extra-ops.test.ts +31 -11
  375. package/src/__tests__/agency-manager.test.ts +374 -0
  376. package/src/__tests__/agent-loop.test.ts +256 -0
  377. package/src/__tests__/capture-ops.test.ts +275 -0
  378. package/src/__tests__/chat-differentiators.test.ts +251 -0
  379. package/src/__tests__/chat-enhanced.test.ts +390 -0
  380. package/src/__tests__/chat-transport.test.ts +665 -0
  381. package/src/__tests__/claudemd.test.ts +282 -0
  382. package/src/__tests__/context-engine.test.ts +256 -0
  383. package/src/__tests__/core-ops.test.ts +97 -5
  384. package/src/__tests__/deprecation.test.ts +78 -0
  385. package/src/__tests__/enforcement.test.ts +153 -0
  386. package/src/__tests__/facade-factory.test.ts +271 -0
  387. package/src/__tests__/feature-flags.test.ts +138 -0
  388. package/src/__tests__/git-vault-sync.test.ts +230 -0
  389. package/src/__tests__/health-registry.test.ts +173 -0
  390. package/src/__tests__/knowledge-review.test.ts +104 -0
  391. package/src/__tests__/lsp-transport.test.ts +442 -0
  392. package/src/__tests__/migration-runner.test.ts +170 -0
  393. package/src/__tests__/normalize.test.ts +10 -0
  394. package/src/__tests__/obsidian-sync.test.ts +354 -0
  395. package/src/__tests__/pack-lockfile.test.ts +261 -0
  396. package/src/__tests__/pack-ops.test.ts +146 -0
  397. package/src/__tests__/pack-system.test.ts +423 -0
  398. package/src/__tests__/playbook-executor.test.ts +249 -0
  399. package/src/__tests__/playbook-ops-execution.test.ts +189 -0
  400. package/src/__tests__/plugin-ops.test.ts +411 -0
  401. package/src/__tests__/plugin-system.test.ts +509 -0
  402. package/src/__tests__/postgres-provider.test.ts +64 -6
  403. package/src/__tests__/replayable-stream.test.ts +112 -1
  404. package/src/__tests__/scope-detector.test.ts +121 -0
  405. package/src/__tests__/session-lifecycle.test.ts +259 -0
  406. package/src/__tests__/transport.test.ts +758 -0
  407. package/src/__tests__/vault-branching.test.ts +274 -0
  408. package/src/__tests__/vault-connect.test.ts +179 -0
  409. package/src/__tests__/vault-integrity.test.ts +71 -0
  410. package/src/__tests__/vault-manager.test.ts +238 -0
  411. package/src/__tests__/vault-scaling.test.ts +281 -0
  412. package/src/__tests__/vault-sharing.test.ts +270 -0
  413. package/src/__tests__/ws-transport.test.ts +479 -0
  414. package/src/agency/agency-manager.ts +326 -0
  415. package/src/agency/index.ts +13 -0
  416. package/src/agency/types.ts +88 -0
  417. package/src/brain/brain.ts +27 -11
  418. package/src/brain/intelligence.ts +103 -0
  419. package/src/brain/types.ts +26 -0
  420. package/src/chat/agent-loop-types.ts +99 -0
  421. package/src/chat/agent-loop.ts +357 -0
  422. package/src/chat/auth-manager.ts +171 -0
  423. package/src/chat/browser-session.ts +188 -0
  424. package/src/chat/cancellation.ts +99 -0
  425. package/src/chat/chat-session.ts +283 -0
  426. package/src/chat/file-handler.ts +230 -0
  427. package/src/chat/fragment-buffer.ts +160 -0
  428. package/src/chat/index.ts +72 -0
  429. package/src/chat/mcp-bridge.ts +135 -0
  430. package/src/chat/notifications.ts +164 -0
  431. package/src/chat/output-compressor.ts +116 -0
  432. package/src/chat/queue.ts +208 -0
  433. package/src/chat/response-chunker.ts +200 -0
  434. package/src/chat/self-update.ts +117 -0
  435. package/src/chat/types.ts +126 -0
  436. package/src/chat/voice.ts +134 -0
  437. package/src/claudemd/compose.ts +142 -0
  438. package/src/claudemd/index.ts +17 -0
  439. package/src/claudemd/inject.ts +170 -0
  440. package/src/claudemd/types.ts +45 -0
  441. package/src/context/context-engine.ts +302 -0
  442. package/src/context/index.ts +11 -0
  443. package/src/context/types.ts +69 -0
  444. package/src/enforcement/adapters/claude-code.ts +135 -0
  445. package/src/enforcement/adapters/index.ts +1 -0
  446. package/src/enforcement/index.ts +10 -0
  447. package/src/enforcement/registry.ts +82 -0
  448. package/src/enforcement/types.ts +56 -0
  449. package/src/facades/facade-factory.ts +138 -5
  450. package/src/facades/types.ts +21 -0
  451. package/src/health/health-registry.ts +165 -0
  452. package/src/health/index.ts +11 -0
  453. package/src/health/vault-integrity.ts +66 -0
  454. package/src/index.ts +294 -2
  455. package/src/intake/intake-pipeline.ts +1 -1
  456. package/src/intelligence/loader.ts +58 -5
  457. package/src/intelligence/types.ts +1 -0
  458. package/src/migrations/index.ts +6 -0
  459. package/src/migrations/migration-runner.ts +185 -0
  460. package/src/packs/index.ts +20 -0
  461. package/src/packs/lockfile.ts +180 -0
  462. package/src/packs/pack-installer.ts +289 -0
  463. package/src/packs/resolver.ts +237 -0
  464. package/src/packs/types.ts +125 -0
  465. package/src/persistence/postgres-provider.ts +211 -58
  466. package/src/playbooks/index.ts +11 -0
  467. package/src/playbooks/playbook-executor.ts +301 -0
  468. package/src/plugins/index.ts +19 -0
  469. package/src/plugins/plugin-loader.ts +183 -0
  470. package/src/plugins/plugin-registry.ts +187 -0
  471. package/src/plugins/types.ts +119 -0
  472. package/src/runtime/admin-extra-ops.ts +193 -8
  473. package/src/runtime/capture-ops.ts +113 -8
  474. package/src/runtime/deprecation.ts +58 -0
  475. package/src/runtime/domain-ops.ts +21 -2
  476. package/src/runtime/facades/admin-facade.ts +16 -1
  477. package/src/runtime/facades/agency-facade.ts +111 -0
  478. package/src/runtime/facades/brain-facade.ts +60 -0
  479. package/src/runtime/facades/chat-facade.ts +918 -0
  480. package/src/runtime/facades/context-facade.ts +55 -0
  481. package/src/runtime/facades/index.ts +22 -1
  482. package/src/runtime/facades/vault-facade.ts +261 -1
  483. package/src/runtime/feature-flags.ts +101 -0
  484. package/src/runtime/orchestrate-ops.ts +13 -0
  485. package/src/runtime/pack-ops.ts +85 -0
  486. package/src/runtime/playbook-ops.ts +113 -9
  487. package/src/runtime/plugin-ops.ts +258 -0
  488. package/src/runtime/runtime.ts +84 -5
  489. package/src/runtime/telemetry-ops.ts +57 -0
  490. package/src/runtime/types.ts +35 -0
  491. package/src/runtime/vault-sharing-ops.ts +372 -0
  492. package/src/streams/index.ts +1 -1
  493. package/src/streams/replayable-stream.ts +34 -3
  494. package/src/text/similarity.ts +1 -1
  495. package/src/transport/http-server.ts +269 -0
  496. package/src/transport/index.ts +48 -0
  497. package/src/transport/lsp-server.ts +401 -0
  498. package/src/transport/rate-limiter.ts +97 -0
  499. package/src/transport/session-manager.ts +120 -0
  500. package/src/transport/token-auth.ts +96 -0
  501. package/src/transport/types.ts +66 -0
  502. package/src/transport/ws-server.ts +415 -0
  503. package/src/vault/git-vault-sync.ts +318 -0
  504. package/src/vault/knowledge-review.ts +221 -0
  505. package/src/vault/obsidian-sync.ts +346 -0
  506. package/src/vault/scope-detector.ts +219 -0
  507. package/src/vault/vault-branching.ts +264 -0
  508. package/src/vault/vault-manager.ts +237 -0
  509. package/src/vault/vault-types.ts +50 -0
  510. package/src/vault/vault.ts +41 -3
  511. package/src/governance/index.ts +0 -18
@@ -0,0 +1,140 @@
1
+ /**
2
+ * LSP Server — Language Server Protocol transport for editor-native agent integration.
3
+ *
4
+ * Speaks JSON-RPC 2.0 over stdio using the LSP wire format:
5
+ * Content-Length: <N>\r\n\r\n<JSON payload>
6
+ *
7
+ * Maps agent capabilities to LSP features:
8
+ * - Completions → vault search suggestions
9
+ * - Diagnostics → quality gate violations
10
+ * - Hover → pattern documentation
11
+ * - Code actions → agent ops
12
+ *
13
+ * Uses only node:readline + node:process (zero deps).
14
+ */
15
+ import type { LspTransportConfig } from './types.js';
16
+ /** JSON-RPC 2.0 request */
17
+ export interface LspRequest {
18
+ jsonrpc: '2.0';
19
+ id: number | string;
20
+ method: string;
21
+ params?: unknown;
22
+ }
23
+ /** JSON-RPC 2.0 notification (no id) */
24
+ export interface LspNotification {
25
+ jsonrpc: '2.0';
26
+ method: string;
27
+ params?: unknown;
28
+ }
29
+ /** JSON-RPC 2.0 response */
30
+ export interface LspResponse {
31
+ jsonrpc: '2.0';
32
+ id: number | string | null;
33
+ result?: unknown;
34
+ error?: {
35
+ code: number;
36
+ message: string;
37
+ data?: unknown;
38
+ };
39
+ }
40
+ /** LSP Position */
41
+ export interface LspPosition {
42
+ line: number;
43
+ character: number;
44
+ }
45
+ /** LSP Range */
46
+ export interface LspRange {
47
+ start: LspPosition;
48
+ end: LspPosition;
49
+ }
50
+ /** LSP Diagnostic */
51
+ export interface LspDiagnostic {
52
+ range: LspRange;
53
+ severity?: number;
54
+ source?: string;
55
+ message: string;
56
+ code?: string | number;
57
+ }
58
+ /** LSP Completion Item */
59
+ export interface LspCompletionItem {
60
+ label: string;
61
+ kind?: number;
62
+ detail?: string;
63
+ documentation?: string | {
64
+ kind: 'markdown' | 'plaintext';
65
+ value: string;
66
+ };
67
+ insertText?: string;
68
+ }
69
+ /** LSP Hover */
70
+ export interface LspHover {
71
+ contents: string | {
72
+ kind: 'markdown' | 'plaintext';
73
+ value: string;
74
+ };
75
+ range?: LspRange;
76
+ }
77
+ /** LSP Code Action */
78
+ export interface LspCodeAction {
79
+ title: string;
80
+ kind?: string;
81
+ diagnostics?: LspDiagnostic[];
82
+ command?: {
83
+ title: string;
84
+ command: string;
85
+ arguments?: unknown[];
86
+ };
87
+ }
88
+ export interface LspServerCallbacks {
89
+ /** Return completions for the given document URI and position. */
90
+ onCompletion?: (uri: string, position: LspPosition) => Promise<LspCompletionItem[]>;
91
+ /** Return hover info for the given document URI and position. */
92
+ onHover?: (uri: string, position: LspPosition) => Promise<LspHover | null>;
93
+ /** Return diagnostics for the given document URI and content. */
94
+ onDiagnostics?: (uri: string, content: string) => Promise<LspDiagnostic[]>;
95
+ /** Return code actions for the given document URI, range, and current diagnostics. */
96
+ onCodeAction?: (uri: string, range: LspRange, diagnostics: LspDiagnostic[]) => Promise<LspCodeAction[]>;
97
+ /** Called when the server is initialized. Return additional server info if desired. */
98
+ onInitialize?: () => Promise<{
99
+ name?: string;
100
+ version?: string;
101
+ }>;
102
+ /** Called when a document is opened or changed. */
103
+ onDocumentChange?: (uri: string, content: string) => Promise<void>;
104
+ /** Called on shutdown. */
105
+ onShutdown?: () => Promise<void>;
106
+ }
107
+ export declare class LspServer {
108
+ private config;
109
+ private callbacks;
110
+ private capabilities;
111
+ private input;
112
+ private output;
113
+ private running;
114
+ private buffer;
115
+ private contentLength;
116
+ private initialized;
117
+ constructor(config: LspTransportConfig, callbacks: LspServerCallbacks, input?: NodeJS.ReadableStream, output?: NodeJS.WritableStream);
118
+ /** Start listening for LSP messages on stdio. */
119
+ start(): void;
120
+ /** Stop the server. */
121
+ stop(): Promise<void>;
122
+ /** Whether the server is currently running. */
123
+ get isRunning(): boolean;
124
+ /** Send a notification to the client (e.g., diagnostics). */
125
+ notify(method: string, params?: unknown): void;
126
+ /** Push diagnostics for a document. */
127
+ publishDiagnostics(uri: string, diagnostics: LspDiagnostic[]): void;
128
+ private onData;
129
+ private processBuffer;
130
+ private handleMessage;
131
+ private handleInitialize;
132
+ private handleCompletion;
133
+ private handleHover;
134
+ private handleCodeAction;
135
+ private handleDocumentChange;
136
+ private respond;
137
+ private respondError;
138
+ private writeMessage;
139
+ }
140
+ //# sourceMappingURL=lsp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp-server.d.ts","sourceRoot":"","sources":["../../src/transport/lsp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,239 @@
1
+ /**
2
+ * LSP Server — Language Server Protocol transport for editor-native agent integration.
3
+ *
4
+ * Speaks JSON-RPC 2.0 over stdio using the LSP wire format:
5
+ * Content-Length: <N>\r\n\r\n<JSON payload>
6
+ *
7
+ * Maps agent capabilities to LSP features:
8
+ * - Completions → vault search suggestions
9
+ * - Diagnostics → quality gate violations
10
+ * - Hover → pattern documentation
11
+ * - Code actions → agent ops
12
+ *
13
+ * Uses only node:readline + node:process (zero deps).
14
+ */
15
+ // =============================================================================
16
+ // LSP SERVER
17
+ // =============================================================================
18
+ export class LspServer {
19
+ config;
20
+ callbacks;
21
+ capabilities;
22
+ input;
23
+ output;
24
+ running = false;
25
+ buffer = '';
26
+ contentLength = -1;
27
+ initialized = false;
28
+ constructor(config, callbacks, input, output) {
29
+ this.config = config;
30
+ this.callbacks = callbacks;
31
+ this.capabilities = {
32
+ completions: config.capabilities?.completions ?? true,
33
+ diagnostics: config.capabilities?.diagnostics ?? true,
34
+ hover: config.capabilities?.hover ?? true,
35
+ codeActions: config.capabilities?.codeActions ?? false,
36
+ };
37
+ this.input = input ?? process.stdin;
38
+ this.output = output ?? process.stdout;
39
+ }
40
+ /** Start listening for LSP messages on stdio. */
41
+ start() {
42
+ if (this.running)
43
+ return;
44
+ this.running = true;
45
+ this.input.setEncoding('utf-8');
46
+ this.input.on('data', (chunk) => this.onData(chunk));
47
+ this.input.on('end', () => {
48
+ this.running = false;
49
+ });
50
+ }
51
+ /** Stop the server. */
52
+ async stop() {
53
+ this.running = false;
54
+ this.input.removeAllListeners('data');
55
+ this.input.removeAllListeners('end');
56
+ }
57
+ /** Whether the server is currently running. */
58
+ get isRunning() {
59
+ return this.running;
60
+ }
61
+ /** Send a notification to the client (e.g., diagnostics). */
62
+ notify(method, params) {
63
+ this.writeMessage({ jsonrpc: '2.0', method, params });
64
+ }
65
+ /** Push diagnostics for a document. */
66
+ publishDiagnostics(uri, diagnostics) {
67
+ this.notify('textDocument/publishDiagnostics', { uri, diagnostics });
68
+ }
69
+ // ─── Message Parsing (LSP wire format) ─────────────────────────────
70
+ onData(chunk) {
71
+ this.buffer += chunk;
72
+ this.processBuffer();
73
+ }
74
+ processBuffer() {
75
+ while (true) {
76
+ if (this.contentLength < 0) {
77
+ // Looking for headers
78
+ const headerEnd = this.buffer.indexOf('\r\n\r\n');
79
+ if (headerEnd < 0)
80
+ return; // incomplete headers
81
+ const headers = this.buffer.substring(0, headerEnd);
82
+ const match = headers.match(/Content-Length:\s*(\d+)/i);
83
+ if (!match) {
84
+ // Skip malformed header
85
+ this.buffer = this.buffer.substring(headerEnd + 4);
86
+ continue;
87
+ }
88
+ this.contentLength = parseInt(match[1], 10);
89
+ this.buffer = this.buffer.substring(headerEnd + 4);
90
+ }
91
+ // Check if we have the full body
92
+ if (Buffer.byteLength(this.buffer, 'utf-8') < this.contentLength)
93
+ return;
94
+ // Extract exactly contentLength bytes
95
+ const bodyBytes = Buffer.from(this.buffer, 'utf-8');
96
+ const body = bodyBytes.subarray(0, this.contentLength).toString('utf-8');
97
+ this.buffer = bodyBytes.subarray(this.contentLength).toString('utf-8');
98
+ this.contentLength = -1;
99
+ try {
100
+ const message = JSON.parse(body);
101
+ this.handleMessage(message).catch(() => {
102
+ // Silently handle errors in message processing
103
+ });
104
+ }
105
+ catch {
106
+ // Invalid JSON — skip
107
+ }
108
+ }
109
+ }
110
+ // ─── Message Handling ──────────────────────────────────────────────
111
+ async handleMessage(message) {
112
+ const method = message.method;
113
+ const id = 'id' in message ? message.id : undefined;
114
+ switch (method) {
115
+ case 'initialize':
116
+ await this.handleInitialize(id);
117
+ break;
118
+ case 'initialized':
119
+ // Client acknowledgement — no response needed
120
+ break;
121
+ case 'shutdown':
122
+ await this.callbacks.onShutdown?.();
123
+ if (id !== undefined) {
124
+ this.respond(id, null);
125
+ }
126
+ break;
127
+ case 'exit':
128
+ this.running = false;
129
+ break;
130
+ case 'textDocument/completion':
131
+ await this.handleCompletion(id, message.params);
132
+ break;
133
+ case 'textDocument/hover':
134
+ await this.handleHover(id, message.params);
135
+ break;
136
+ case 'textDocument/codeAction':
137
+ await this.handleCodeAction(id, message.params);
138
+ break;
139
+ case 'textDocument/didOpen':
140
+ case 'textDocument/didChange':
141
+ await this.handleDocumentChange(message.params);
142
+ break;
143
+ case 'textDocument/didClose':
144
+ // No-op
145
+ break;
146
+ default:
147
+ // Unknown method — respond with MethodNotFound if it has an id
148
+ if (id !== undefined) {
149
+ this.respondError(id, -32601, `Method not found: ${method}`);
150
+ }
151
+ break;
152
+ }
153
+ }
154
+ async handleInitialize(id) {
155
+ const info = await this.callbacks.onInitialize?.();
156
+ const serverCapabilities = {};
157
+ if (this.capabilities.completions) {
158
+ serverCapabilities.completionProvider = {
159
+ triggerCharacters: ['@', '/'],
160
+ resolveProvider: false,
161
+ };
162
+ }
163
+ if (this.capabilities.hover) {
164
+ serverCapabilities.hoverProvider = true;
165
+ }
166
+ if (this.capabilities.diagnostics) {
167
+ // Diagnostics are push-based via textDocument/publishDiagnostics
168
+ // We signal support via textDocumentSync
169
+ }
170
+ if (this.capabilities.codeActions) {
171
+ serverCapabilities.codeActionProvider = true;
172
+ }
173
+ // Always support text document sync (needed for diagnostics + change tracking)
174
+ serverCapabilities.textDocumentSync = {
175
+ openClose: true,
176
+ change: 1, // Full content on change
177
+ };
178
+ this.respond(id, {
179
+ capabilities: serverCapabilities,
180
+ serverInfo: {
181
+ name: info?.name ?? 'soleri-lsp',
182
+ version: info?.version ?? '0.1.0',
183
+ },
184
+ });
185
+ this.initialized = true;
186
+ }
187
+ async handleCompletion(id, params) {
188
+ if (!this.capabilities.completions || !this.callbacks.onCompletion) {
189
+ this.respond(id, []);
190
+ return;
191
+ }
192
+ const p = params;
193
+ const items = await this.callbacks.onCompletion(p.textDocument.uri, p.position);
194
+ this.respond(id, items);
195
+ }
196
+ async handleHover(id, params) {
197
+ if (!this.capabilities.hover || !this.callbacks.onHover) {
198
+ this.respond(id, null);
199
+ return;
200
+ }
201
+ const p = params;
202
+ const hover = await this.callbacks.onHover(p.textDocument.uri, p.position);
203
+ this.respond(id, hover);
204
+ }
205
+ async handleCodeAction(id, params) {
206
+ if (!this.capabilities.codeActions || !this.callbacks.onCodeAction) {
207
+ this.respond(id, []);
208
+ return;
209
+ }
210
+ const p = params;
211
+ const actions = await this.callbacks.onCodeAction(p.textDocument.uri, p.range, p.context.diagnostics);
212
+ this.respond(id, actions);
213
+ }
214
+ async handleDocumentChange(params) {
215
+ const p = params;
216
+ const uri = p.textDocument.uri;
217
+ const content = p.contentChanges?.[0]?.text ?? p.textDocument.text ?? '';
218
+ await this.callbacks.onDocumentChange?.(uri, content);
219
+ // If diagnostics are enabled, compute and push them
220
+ if (this.capabilities.diagnostics && this.callbacks.onDiagnostics && content) {
221
+ const diagnostics = await this.callbacks.onDiagnostics(uri, content);
222
+ this.publishDiagnostics(uri, diagnostics);
223
+ }
224
+ }
225
+ // ─── Response Helpers ──────────────────────────────────────────────
226
+ respond(id, result) {
227
+ this.writeMessage({ jsonrpc: '2.0', id, result });
228
+ }
229
+ respondError(id, code, message) {
230
+ this.writeMessage({ jsonrpc: '2.0', id, error: { code, message } });
231
+ }
232
+ writeMessage(message) {
233
+ const json = JSON.stringify(message);
234
+ const contentLength = Buffer.byteLength(json, 'utf-8');
235
+ const header = `Content-Length: ${contentLength}\r\n\r\n`;
236
+ this.output.write(header + json);
237
+ }
238
+ }
239
+ //# sourceMappingURL=lsp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp-server.js","sourceRoot":"","sources":["../../src/transport/lsp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Sliding Window Rate Limiter
3
+ *
4
+ * Per-key tracking (session ID or IP) with periodic self-cleanup.
5
+ * Returns Retry-After hint for 429 responses.
6
+ */
7
+ export interface RateLimitResult {
8
+ /** Whether the request is allowed */
9
+ allowed: boolean;
10
+ /** Remaining requests in current window */
11
+ remaining: number;
12
+ /** Milliseconds until the client can retry (0 if allowed) */
13
+ retryAfterMs: number;
14
+ }
15
+ export declare class RateLimiter {
16
+ private windows;
17
+ private maxRequests;
18
+ private windowMs;
19
+ private cleanupCounter;
20
+ private static readonly CLEANUP_INTERVAL;
21
+ constructor(maxRequests?: number, windowMs?: number);
22
+ /** Check if a request from the given key is allowed. Records timestamp if allowed. */
23
+ check(key: string): RateLimitResult;
24
+ /** Reset rate limit state for a key. */
25
+ reset(key: string): void;
26
+ /** Clear all rate limit state. */
27
+ clear(): void;
28
+ /** Get current state for a key. */
29
+ getKeyState(key: string): {
30
+ requestCount: number;
31
+ remaining: number;
32
+ };
33
+ private cleanup;
34
+ }
35
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/transport/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAO;gBAEnC,WAAW,SAAM,EAAE,QAAQ,SAAS;IAKhD,sFAAsF;IACtF,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe;IA4BnC,wCAAwC;IACxC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIxB,kCAAkC;IAClC,KAAK,IAAI,IAAI;IAIb,mCAAmC;IACnC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAUrE,OAAO,CAAC,OAAO;CAUhB"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Sliding Window Rate Limiter
3
+ *
4
+ * Per-key tracking (session ID or IP) with periodic self-cleanup.
5
+ * Returns Retry-After hint for 429 responses.
6
+ */
7
+ // =============================================================================
8
+ // RATE LIMITER
9
+ // =============================================================================
10
+ export class RateLimiter {
11
+ windows = new Map();
12
+ maxRequests;
13
+ windowMs;
14
+ cleanupCounter = 0;
15
+ static CLEANUP_INTERVAL = 100;
16
+ constructor(maxRequests = 100, windowMs = 60_000) {
17
+ this.maxRequests = maxRequests;
18
+ this.windowMs = windowMs;
19
+ }
20
+ /** Check if a request from the given key is allowed. Records timestamp if allowed. */
21
+ check(key) {
22
+ const now = Date.now();
23
+ const windowStart = now - this.windowMs;
24
+ if (++this.cleanupCounter >= RateLimiter.CLEANUP_INTERVAL) {
25
+ this.cleanupCounter = 0;
26
+ this.cleanup(windowStart);
27
+ }
28
+ let timestamps = this.windows.get(key);
29
+ if (!timestamps) {
30
+ timestamps = [];
31
+ this.windows.set(key, timestamps);
32
+ }
33
+ // Remove expired timestamps
34
+ const filtered = timestamps.filter((t) => t > windowStart);
35
+ this.windows.set(key, filtered);
36
+ if (filtered.length >= this.maxRequests) {
37
+ const retryAfterMs = filtered[0] + this.windowMs - now;
38
+ return { allowed: false, remaining: 0, retryAfterMs: Math.max(retryAfterMs, 1) };
39
+ }
40
+ filtered.push(now);
41
+ return { allowed: true, remaining: this.maxRequests - filtered.length, retryAfterMs: 0 };
42
+ }
43
+ /** Reset rate limit state for a key. */
44
+ reset(key) {
45
+ this.windows.delete(key);
46
+ }
47
+ /** Clear all rate limit state. */
48
+ clear() {
49
+ this.windows.clear();
50
+ }
51
+ /** Get current state for a key. */
52
+ getKeyState(key) {
53
+ const timestamps = this.windows.get(key);
54
+ const windowStart = Date.now() - this.windowMs;
55
+ if (!timestamps)
56
+ return { requestCount: 0, remaining: this.maxRequests };
57
+ const active = timestamps.filter((t) => t > windowStart).length;
58
+ return { requestCount: active, remaining: Math.max(0, this.maxRequests - active) };
59
+ }
60
+ cleanup(windowStart) {
61
+ for (const [key, timestamps] of this.windows) {
62
+ const filtered = timestamps.filter((t) => t > windowStart);
63
+ if (filtered.length === 0) {
64
+ this.windows.delete(key);
65
+ }
66
+ else {
67
+ this.windows.set(key, filtered);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/transport/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF,MAAM,OAAO,WAAW;IACd,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IACtC,WAAW,CAAS;IACpB,QAAQ,CAAS;IACjB,cAAc,GAAG,CAAC,CAAC;IACnB,MAAM,CAAU,gBAAgB,GAAG,GAAG,CAAC;IAE/C,YAAY,WAAW,GAAG,GAAG,EAAE,QAAQ,GAAG,MAAM;QAC9C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,sFAAsF;IACtF,KAAK,CAAC,GAAW;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QAExC,IAAI,EAAE,IAAI,CAAC,cAAc,IAAI,WAAW,CAAC,gBAAgB,EAAE,CAAC;YAC1D,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,UAAU,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACpC,CAAC;QAED,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAEhC,IAAI,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC;QACnF,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IAC3F,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,GAAW;QACf,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,kCAAkC;IAClC,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,mCAAmC;IACnC,WAAW,CAAC,GAAW;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/C,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;QAEzE,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,MAAM,CAAC;QAChE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC;IACrF,CAAC;IAEO,OAAO,CAAC,WAAmB;QACjC,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC;YAC3D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Session Manager — tracks HTTP transport sessions with TTL-based reaping.
3
+ *
4
+ * Each connected client gets a session entry. Sessions are reaped
5
+ * automatically after their TTL expires.
6
+ */
7
+ export interface Session {
8
+ id: string;
9
+ /** Opaque transport reference — the MCP SDK's StreamableHTTPServerTransport */
10
+ transport: unknown;
11
+ /** Opaque server reference — the MCP SDK's McpServer */
12
+ server: unknown;
13
+ createdAt: number;
14
+ }
15
+ export interface SessionManagerConfig {
16
+ /** Session TTL in ms. 0 to disable reaping. Default: 3600000 (1 hour). */
17
+ ttl?: number;
18
+ /** Reaper check interval in ms. Default: 60000 (1 minute). */
19
+ reaperInterval?: number;
20
+ /** Callback when a session is reaped. */
21
+ onReap?: (session: Session) => void;
22
+ }
23
+ export declare class SessionManager {
24
+ private sessions;
25
+ private reaperTimer;
26
+ private config;
27
+ constructor(config?: SessionManagerConfig);
28
+ /** Generate a new session ID. */
29
+ generateId(): string;
30
+ /** Register a new session. */
31
+ add(id: string, transport: unknown, server: unknown): Session;
32
+ /** Get a session by ID. */
33
+ get(id: string): Session | undefined;
34
+ /** Remove a session. */
35
+ remove(id: string): boolean;
36
+ /** Number of active sessions. */
37
+ get size(): number;
38
+ /** List all session IDs. */
39
+ listIds(): string[];
40
+ /** Start the periodic session reaper. */
41
+ startReaper(): void;
42
+ /** Stop the reaper. */
43
+ stopReaper(): void;
44
+ /** Close all sessions and stop reaper. */
45
+ close(): void;
46
+ /** Evict sessions older than TTL. */
47
+ private reap;
48
+ }
49
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/transport/session-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,+EAA+E;IAC/E,SAAS,EAAE,OAAO,CAAC;IACnB,wDAAwD;IACxD,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,0EAA0E;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC;AASD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,WAAW,CAA6C;IAChE,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,GAAE,oBAAyB;IAI7C,iCAAiC;IACjC,UAAU,IAAI,MAAM;IAIpB,8BAA8B;IAC9B,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO;IAM7D,2BAA2B;IAC3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIpC,wBAAwB;IACxB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI3B,iCAAiC;IACjC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,4BAA4B;IAC5B,OAAO,IAAI,MAAM,EAAE;IAInB,yCAAyC;IACzC,WAAW,IAAI,IAAI;IAenB,uBAAuB;IACvB,UAAU,IAAI,IAAI;IAOlB,0CAA0C;IAC1C,KAAK,IAAI,IAAI;IAKb,qCAAqC;IACrC,OAAO,CAAC,IAAI;CASb"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Session Manager — tracks HTTP transport sessions with TTL-based reaping.
3
+ *
4
+ * Each connected client gets a session entry. Sessions are reaped
5
+ * automatically after their TTL expires.
6
+ */
7
+ import { randomUUID } from 'node:crypto';
8
+ // =============================================================================
9
+ // SESSION MANAGER
10
+ // =============================================================================
11
+ const DEFAULT_TTL = 60 * 60 * 1000; // 1 hour
12
+ const DEFAULT_REAPER_INTERVAL = 60 * 1000; // 1 minute
13
+ export class SessionManager {
14
+ sessions = new Map();
15
+ reaperTimer;
16
+ config;
17
+ constructor(config = {}) {
18
+ this.config = config;
19
+ }
20
+ /** Generate a new session ID. */
21
+ generateId() {
22
+ return randomUUID();
23
+ }
24
+ /** Register a new session. */
25
+ add(id, transport, server) {
26
+ const session = { id, transport, server, createdAt: Date.now() };
27
+ this.sessions.set(id, session);
28
+ return session;
29
+ }
30
+ /** Get a session by ID. */
31
+ get(id) {
32
+ return this.sessions.get(id);
33
+ }
34
+ /** Remove a session. */
35
+ remove(id) {
36
+ return this.sessions.delete(id);
37
+ }
38
+ /** Number of active sessions. */
39
+ get size() {
40
+ return this.sessions.size;
41
+ }
42
+ /** List all session IDs. */
43
+ listIds() {
44
+ return Array.from(this.sessions.keys());
45
+ }
46
+ /** Start the periodic session reaper. */
47
+ startReaper() {
48
+ const ttl = this.config.ttl ?? DEFAULT_TTL;
49
+ if (ttl <= 0)
50
+ return;
51
+ const interval = this.config.reaperInterval ?? DEFAULT_REAPER_INTERVAL;
52
+ this.reaperTimer = setInterval(() => {
53
+ this.reap(ttl);
54
+ }, interval);
55
+ // Don't prevent process exit
56
+ if (this.reaperTimer && typeof this.reaperTimer === 'object' && 'unref' in this.reaperTimer) {
57
+ this.reaperTimer.unref();
58
+ }
59
+ }
60
+ /** Stop the reaper. */
61
+ stopReaper() {
62
+ if (this.reaperTimer) {
63
+ clearInterval(this.reaperTimer);
64
+ this.reaperTimer = undefined;
65
+ }
66
+ }
67
+ /** Close all sessions and stop reaper. */
68
+ close() {
69
+ this.stopReaper();
70
+ this.sessions.clear();
71
+ }
72
+ /** Evict sessions older than TTL. */
73
+ reap(ttlMs) {
74
+ const now = Date.now();
75
+ for (const [id, session] of this.sessions) {
76
+ if (now - session.createdAt > ttlMs) {
77
+ this.sessions.delete(id);
78
+ this.config.onReap?.(session);
79
+ }
80
+ }
81
+ }
82
+ }
83
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/transport/session-manager.ts"],"names":[],"mappings":"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"}