@alneas/eaos-server 0.0.0-stage → 0.2.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 (360) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +21 -0
  3. package/README.ja.md +49 -0
  4. package/README.md +46 -2
  5. package/dist/agentic/agent-jobs.d.ts +333 -0
  6. package/dist/agentic/agent-jobs.js +15 -0
  7. package/dist/agentic/agent-jobs.js.map +1 -0
  8. package/dist/agentic/agent-node.d.ts +40 -0
  9. package/dist/agentic/agent-node.js +7 -0
  10. package/dist/agentic/agent-node.js.map +1 -0
  11. package/dist/agentic/agent-runner.d.ts +33 -0
  12. package/dist/agentic/agent-runner.js +7 -0
  13. package/dist/agentic/agent-runner.js.map +1 -0
  14. package/dist/agentic/ai-broker.d.ts +169 -0
  15. package/dist/agentic/ai-broker.js +8 -0
  16. package/dist/agentic/ai-broker.js.map +1 -0
  17. package/dist/agentic/atomic-checkpointer.d.ts +137 -0
  18. package/dist/agentic/atomic-checkpointer.js +9 -0
  19. package/dist/agentic/atomic-checkpointer.js.map +1 -0
  20. package/dist/agentic/autonomous-worker.d.ts +122 -0
  21. package/dist/agentic/autonomous-worker.js +10 -0
  22. package/dist/agentic/autonomous-worker.js.map +1 -0
  23. package/dist/agentic/event-bridge.d.ts +350 -0
  24. package/dist/agentic/event-bridge.js +9 -0
  25. package/dist/agentic/event-bridge.js.map +1 -0
  26. package/dist/agentic/executor.d.ts +91 -0
  27. package/dist/agentic/executor.js +12 -0
  28. package/dist/agentic/executor.js.map +1 -0
  29. package/dist/agentic/graph-projection.d.ts +119 -0
  30. package/dist/agentic/graph-projection.js +7 -0
  31. package/dist/agentic/graph-projection.js.map +1 -0
  32. package/dist/agentic/graph.d.ts +524 -0
  33. package/dist/agentic/graph.js +7 -0
  34. package/dist/agentic/graph.js.map +1 -0
  35. package/dist/agentic/index.d.ts +28 -0
  36. package/dist/agentic/index.js +87 -0
  37. package/dist/agentic/index.js.map +1 -0
  38. package/dist/agentic/local-runner.d.ts +106 -0
  39. package/dist/agentic/local-runner.js +7 -0
  40. package/dist/agentic/local-runner.js.map +1 -0
  41. package/dist/agentic/remote-executor.d.ts +67 -0
  42. package/dist/agentic/remote-executor.js +8 -0
  43. package/dist/agentic/remote-executor.js.map +1 -0
  44. package/dist/agentic/types.d.ts +157 -0
  45. package/dist/agentic/types.js +7 -0
  46. package/dist/agentic/types.js.map +1 -0
  47. package/dist/agentic/workflow-catalog.d.ts +152 -0
  48. package/dist/agentic/workflow-catalog.js +7 -0
  49. package/dist/agentic/workflow-catalog.js.map +1 -0
  50. package/dist/agentic/workflow-compiler.d.ts +44 -0
  51. package/dist/agentic/workflow-compiler.js +8 -0
  52. package/dist/agentic/workflow-compiler.js.map +1 -0
  53. package/dist/agentic/workflow-coordinator.d.ts +170 -0
  54. package/dist/agentic/workflow-coordinator.js +8 -0
  55. package/dist/agentic/workflow-coordinator.js.map +1 -0
  56. package/dist/agentic/workflow-manager.d.ts +91 -0
  57. package/dist/agentic/workflow-manager.js +7 -0
  58. package/dist/agentic/workflow-manager.js.map +1 -0
  59. package/dist/agentic/workflow-registry.d.ts +334 -0
  60. package/dist/agentic/workflow-registry.js +7 -0
  61. package/dist/agentic/workflow-registry.js.map +1 -0
  62. package/dist/artifacts-CteHmCMI.d.ts +614 -0
  63. package/dist/auth-hooks/api-key.d.ts +75 -0
  64. package/dist/auth-hooks/api-key.js +7 -0
  65. package/dist/auth-hooks/api-key.js.map +1 -0
  66. package/dist/auth-hooks/index.d.ts +80 -0
  67. package/dist/auth-hooks/index.js +28 -0
  68. package/dist/auth-hooks/index.js.map +1 -0
  69. package/dist/browser-auth/account-memberships.d.ts +213 -0
  70. package/dist/browser-auth/account-memberships.js +13 -0
  71. package/dist/browser-auth/account-memberships.js.map +1 -0
  72. package/dist/browser-auth/index.d.ts +8 -0
  73. package/dist/browser-auth/index.js +59 -0
  74. package/dist/browser-auth/index.js.map +1 -0
  75. package/dist/browser-auth/kratos-session.d.ts +37 -0
  76. package/dist/browser-auth/kratos-session.js +7 -0
  77. package/dist/browser-auth/kratos-session.js.map +1 -0
  78. package/dist/browser-auth/platform-session.d.ts +120 -0
  79. package/dist/browser-auth/platform-session.js +7 -0
  80. package/dist/browser-auth/platform-session.js.map +1 -0
  81. package/dist/browser-auth/public-memberships.d.ts +22 -0
  82. package/dist/browser-auth/public-memberships.js +7 -0
  83. package/dist/browser-auth/public-memberships.js.map +1 -0
  84. package/dist/cache/index.d.ts +181 -0
  85. package/dist/cache/index.js +197 -0
  86. package/dist/cache/index.js.map +1 -0
  87. package/dist/chunk-32746UQZ.js +131 -0
  88. package/dist/chunk-32746UQZ.js.map +1 -0
  89. package/dist/chunk-3NLSWP2Y.js +223 -0
  90. package/dist/chunk-3NLSWP2Y.js.map +1 -0
  91. package/dist/chunk-3P4XTTQH.js +346 -0
  92. package/dist/chunk-3P4XTTQH.js.map +1 -0
  93. package/dist/chunk-3VITSHN3.js +15 -0
  94. package/dist/chunk-3VITSHN3.js.map +1 -0
  95. package/dist/chunk-46UWPEW2.js +226 -0
  96. package/dist/chunk-46UWPEW2.js.map +1 -0
  97. package/dist/chunk-4BARRLJR.js +180 -0
  98. package/dist/chunk-4BARRLJR.js.map +1 -0
  99. package/dist/chunk-4VORUFKR.js +45 -0
  100. package/dist/chunk-4VORUFKR.js.map +1 -0
  101. package/dist/chunk-55D4ERWO.js +1 -0
  102. package/dist/chunk-55D4ERWO.js.map +1 -0
  103. package/dist/chunk-5TBBZIND.js +18 -0
  104. package/dist/chunk-5TBBZIND.js.map +1 -0
  105. package/dist/chunk-5WOZWPZA.js +211 -0
  106. package/dist/chunk-5WOZWPZA.js.map +1 -0
  107. package/dist/chunk-6CBVZ6CT.js +168 -0
  108. package/dist/chunk-6CBVZ6CT.js.map +1 -0
  109. package/dist/chunk-6XZXYNJR.js +74 -0
  110. package/dist/chunk-6XZXYNJR.js.map +1 -0
  111. package/dist/chunk-753HWDSC.js +222 -0
  112. package/dist/chunk-753HWDSC.js.map +1 -0
  113. package/dist/chunk-7AHSS7SO.js +81 -0
  114. package/dist/chunk-7AHSS7SO.js.map +1 -0
  115. package/dist/chunk-7FTJN4SA.js +1 -0
  116. package/dist/chunk-7FTJN4SA.js.map +1 -0
  117. package/dist/chunk-AVDMLTPF.js +24 -0
  118. package/dist/chunk-AVDMLTPF.js.map +1 -0
  119. package/dist/chunk-BKAHUEIT.js +95 -0
  120. package/dist/chunk-BKAHUEIT.js.map +1 -0
  121. package/dist/chunk-CJ7OFEF7.js +134 -0
  122. package/dist/chunk-CJ7OFEF7.js.map +1 -0
  123. package/dist/chunk-EJKWDZIU.js +111 -0
  124. package/dist/chunk-EJKWDZIU.js.map +1 -0
  125. package/dist/chunk-F2J6IQ6I.js +247 -0
  126. package/dist/chunk-F2J6IQ6I.js.map +1 -0
  127. package/dist/chunk-F3O7CELI.js +23 -0
  128. package/dist/chunk-F3O7CELI.js.map +1 -0
  129. package/dist/chunk-F4IITPGX.js +221 -0
  130. package/dist/chunk-F4IITPGX.js.map +1 -0
  131. package/dist/chunk-FD6VC2NA.js +66 -0
  132. package/dist/chunk-FD6VC2NA.js.map +1 -0
  133. package/dist/chunk-FRRRWAHO.js +14 -0
  134. package/dist/chunk-FRRRWAHO.js.map +1 -0
  135. package/dist/chunk-HCKAGLLB.js +17 -0
  136. package/dist/chunk-HCKAGLLB.js.map +1 -0
  137. package/dist/chunk-HVC7FG6B.js +191 -0
  138. package/dist/chunk-HVC7FG6B.js.map +1 -0
  139. package/dist/chunk-HXFVOR7Z.js +496 -0
  140. package/dist/chunk-HXFVOR7Z.js.map +1 -0
  141. package/dist/chunk-IJWYS2PF.js +122 -0
  142. package/dist/chunk-IJWYS2PF.js.map +1 -0
  143. package/dist/chunk-INCHXAFK.js +1395 -0
  144. package/dist/chunk-INCHXAFK.js.map +1 -0
  145. package/dist/chunk-JT6BRGQM.js +1 -0
  146. package/dist/chunk-JT6BRGQM.js.map +1 -0
  147. package/dist/chunk-L6PMAEMB.js +115 -0
  148. package/dist/chunk-L6PMAEMB.js.map +1 -0
  149. package/dist/chunk-LOUGW6MU.js +126 -0
  150. package/dist/chunk-LOUGW6MU.js.map +1 -0
  151. package/dist/chunk-LYPZPE53.js +129 -0
  152. package/dist/chunk-LYPZPE53.js.map +1 -0
  153. package/dist/chunk-NNCCN7JP.js +186 -0
  154. package/dist/chunk-NNCCN7JP.js.map +1 -0
  155. package/dist/chunk-PBC3MZUL.js +212 -0
  156. package/dist/chunk-PBC3MZUL.js.map +1 -0
  157. package/dist/chunk-R4ADP2DC.js +20 -0
  158. package/dist/chunk-R4ADP2DC.js.map +1 -0
  159. package/dist/chunk-RHN4Y6VS.js +44 -0
  160. package/dist/chunk-RHN4Y6VS.js.map +1 -0
  161. package/dist/chunk-SDJNYPYK.js +770 -0
  162. package/dist/chunk-SDJNYPYK.js.map +1 -0
  163. package/dist/chunk-UGNTCOVR.js +28 -0
  164. package/dist/chunk-UGNTCOVR.js.map +1 -0
  165. package/dist/chunk-VC2PCK2S.js +31 -0
  166. package/dist/chunk-VC2PCK2S.js.map +1 -0
  167. package/dist/chunk-VF5YDZJC.js +305 -0
  168. package/dist/chunk-VF5YDZJC.js.map +1 -0
  169. package/dist/chunk-VISRDVTK.js +675 -0
  170. package/dist/chunk-VISRDVTK.js.map +1 -0
  171. package/dist/chunk-W6O3LVBY.js +102 -0
  172. package/dist/chunk-W6O3LVBY.js.map +1 -0
  173. package/dist/chunk-WFEAKJLR.js +47 -0
  174. package/dist/chunk-WFEAKJLR.js.map +1 -0
  175. package/dist/chunk-XIEY2OF4.js +67 -0
  176. package/dist/chunk-XIEY2OF4.js.map +1 -0
  177. package/dist/chunk-XITLHDG3.js +37 -0
  178. package/dist/chunk-XITLHDG3.js.map +1 -0
  179. package/dist/chunk-XMWPYZWZ.js +61 -0
  180. package/dist/chunk-XMWPYZWZ.js.map +1 -0
  181. package/dist/chunk-XUP6CNOM.js +34 -0
  182. package/dist/chunk-XUP6CNOM.js.map +1 -0
  183. package/dist/chunk-YABTQZDJ.js +25 -0
  184. package/dist/chunk-YABTQZDJ.js.map +1 -0
  185. package/dist/chunk-YMHVRBUU.js +199 -0
  186. package/dist/chunk-YMHVRBUU.js.map +1 -0
  187. package/dist/chunk-YMJ7BRKU.js +510 -0
  188. package/dist/chunk-YMJ7BRKU.js.map +1 -0
  189. package/dist/chunk-ZC3XWU7B.js +28 -0
  190. package/dist/chunk-ZC3XWU7B.js.map +1 -0
  191. package/dist/chunk-ZHMTD5KV.js +90 -0
  192. package/dist/chunk-ZHMTD5KV.js.map +1 -0
  193. package/dist/chunk-ZWZDLOE7.js +160 -0
  194. package/dist/chunk-ZWZDLOE7.js.map +1 -0
  195. package/dist/db-package/db/local-first-sqlite-adapter.d.ts +432 -0
  196. package/dist/db-package/db/local-first-sqlite-adapter.js +7 -0
  197. package/dist/db-package/db/local-first-sqlite-adapter.js.map +1 -0
  198. package/dist/db-package/index.d.ts +7 -0
  199. package/dist/db-package/index.js +16 -0
  200. package/dist/db-package/index.js.map +1 -0
  201. package/dist/db-package/migration/aggregator.d.ts +86 -0
  202. package/dist/db-package/migration/aggregator.js +7 -0
  203. package/dist/db-package/migration/aggregator.js.map +1 -0
  204. package/dist/db-package/migration/index.d.ts +3 -0
  205. package/dist/db-package/migration/index.js +8 -0
  206. package/dist/db-package/migration/index.js.map +1 -0
  207. package/dist/engine.d.ts +205 -0
  208. package/dist/engine.js +20 -0
  209. package/dist/engine.js.map +1 -0
  210. package/dist/entitlements/index.d.ts +313 -0
  211. package/dist/entitlements/index.js +23 -0
  212. package/dist/entitlements/index.js.map +1 -0
  213. package/dist/execution/chat.d.ts +7 -0
  214. package/dist/execution/chat.js +7 -0
  215. package/dist/execution/chat.js.map +1 -0
  216. package/dist/execution/index.d.ts +342 -0
  217. package/dist/execution/index.js +66 -0
  218. package/dist/execution/index.js.map +1 -0
  219. package/dist/execution/tool-agent.d.ts +7 -0
  220. package/dist/execution/tool-agent.js +8 -0
  221. package/dist/execution/tool-agent.js.map +1 -0
  222. package/dist/extensions/index.d.ts +172 -0
  223. package/dist/extensions/index.js +95 -0
  224. package/dist/extensions/index.js.map +1 -0
  225. package/dist/health/index.d.ts +35 -0
  226. package/dist/health/index.js +7 -0
  227. package/dist/health/index.js.map +1 -0
  228. package/dist/index.d.ts +43 -0
  229. package/dist/index.js +161 -0
  230. package/dist/index.js.map +1 -0
  231. package/dist/lifecycle/index.d.ts +133 -0
  232. package/dist/lifecycle/index.js +13 -0
  233. package/dist/lifecycle/index.js.map +1 -0
  234. package/dist/lifecycle-engine/backend-migration.d.ts +2 -0
  235. package/dist/lifecycle-engine/backend-migration.js +11 -0
  236. package/dist/lifecycle-engine/backend-migration.js.map +1 -0
  237. package/dist/lifecycle-engine/baseline.d.ts +2 -0
  238. package/dist/lifecycle-engine/baseline.js +9 -0
  239. package/dist/lifecycle-engine/baseline.js.map +1 -0
  240. package/dist/lifecycle-engine/index.d.ts +1497 -0
  241. package/dist/lifecycle-engine/index.js +41 -0
  242. package/dist/lifecycle-engine/index.js.map +1 -0
  243. package/dist/lifecycle-engine/platform/artifacts.d.ts +4 -0
  244. package/dist/lifecycle-engine/platform/artifacts.js +7 -0
  245. package/dist/lifecycle-engine/platform/artifacts.js.map +1 -0
  246. package/dist/lifecycle-engine/platform/control-plane.d.ts +12 -0
  247. package/dist/lifecycle-engine/platform/control-plane.js +2 -0
  248. package/dist/lifecycle-engine/platform/control-plane.js.map +1 -0
  249. package/dist/lifecycle-engine/platform/database-router.d.ts +118 -0
  250. package/dist/lifecycle-engine/platform/database-router.js +7 -0
  251. package/dist/lifecycle-engine/platform/database-router.js.map +1 -0
  252. package/dist/lifecycle-engine/platform/deployment-placements.d.ts +464 -0
  253. package/dist/lifecycle-engine/platform/deployment-placements.js +16 -0
  254. package/dist/lifecycle-engine/platform/deployment-placements.js.map +1 -0
  255. package/dist/lifecycle-engine/platform/deployment.d.ts +4 -0
  256. package/dist/lifecycle-engine/platform/deployment.js +17 -0
  257. package/dist/lifecycle-engine/platform/deployment.js.map +1 -0
  258. package/dist/lifecycle-engine/platform/index.d.ts +737 -0
  259. package/dist/lifecycle-engine/platform/index.js +60 -0
  260. package/dist/lifecycle-engine/platform/index.js.map +1 -0
  261. package/dist/lifecycle-engine/platform/runtime.d.ts +80 -0
  262. package/dist/lifecycle-engine/platform/runtime.js +11 -0
  263. package/dist/lifecycle-engine/platform/runtime.js.map +1 -0
  264. package/dist/lifecycle-engine/platform/site-publication.d.ts +102 -0
  265. package/dist/lifecycle-engine/platform/site-publication.js +7 -0
  266. package/dist/lifecycle-engine/platform/site-publication.js.map +1 -0
  267. package/dist/lifecycle-engine/platform/user-directory.d.ts +139 -0
  268. package/dist/lifecycle-engine/platform/user-directory.js +13 -0
  269. package/dist/lifecycle-engine/platform/user-directory.js.map +1 -0
  270. package/dist/mcp.d.ts +92 -0
  271. package/dist/mcp.js +10 -0
  272. package/dist/mcp.js.map +1 -0
  273. package/dist/middleware/auth.d.ts +118 -0
  274. package/dist/middleware/auth.js +7 -0
  275. package/dist/middleware/auth.js.map +1 -0
  276. package/dist/middleware/error-handler.d.ts +35 -0
  277. package/dist/middleware/error-handler.js +7 -0
  278. package/dist/middleware/error-handler.js.map +1 -0
  279. package/dist/middleware/module-guard.d.ts +33 -0
  280. package/dist/middleware/module-guard.js +7 -0
  281. package/dist/middleware/module-guard.js.map +1 -0
  282. package/dist/platform-admin/index.d.ts +37 -0
  283. package/dist/platform-admin/index.js +11 -0
  284. package/dist/platform-admin/index.js.map +1 -0
  285. package/dist/platform-admin/store.d.ts +346 -0
  286. package/dist/platform-admin/store.js +7 -0
  287. package/dist/platform-admin/store.js.map +1 -0
  288. package/dist/plugin-data/annotations.d.ts +6 -0
  289. package/dist/plugin-data/annotations.js +12 -0
  290. package/dist/plugin-data/annotations.js.map +1 -0
  291. package/dist/plugin-data/atomic-context.d.ts +41 -0
  292. package/dist/plugin-data/atomic-context.js +9 -0
  293. package/dist/plugin-data/atomic-context.js.map +1 -0
  294. package/dist/plugin-data/atomic.d.ts +6 -0
  295. package/dist/plugin-data/atomic.js +26 -0
  296. package/dist/plugin-data/atomic.js.map +1 -0
  297. package/dist/plugin-data/audit.d.ts +6 -0
  298. package/dist/plugin-data/audit.js +12 -0
  299. package/dist/plugin-data/audit.js.map +1 -0
  300. package/dist/plugin-data/commands.d.ts +6 -0
  301. package/dist/plugin-data/commands.js +8 -0
  302. package/dist/plugin-data/commands.js.map +1 -0
  303. package/dist/plugin-data/composite.d.ts +6 -0
  304. package/dist/plugin-data/composite.js +8 -0
  305. package/dist/plugin-data/composite.js.map +1 -0
  306. package/dist/plugin-data/delivery.d.ts +6 -0
  307. package/dist/plugin-data/delivery.js +16 -0
  308. package/dist/plugin-data/delivery.js.map +1 -0
  309. package/dist/plugin-data/index.d.ts +2798 -0
  310. package/dist/plugin-data/index.js +102 -0
  311. package/dist/plugin-data/index.js.map +1 -0
  312. package/dist/plugin-data/json-documents.d.ts +6 -0
  313. package/dist/plugin-data/json-documents.js +16 -0
  314. package/dist/plugin-data/json-documents.js.map +1 -0
  315. package/dist/plugin-data/outbox.d.ts +6 -0
  316. package/dist/plugin-data/outbox.js +16 -0
  317. package/dist/plugin-data/outbox.js.map +1 -0
  318. package/dist/plugin-data/scoped-records.d.ts +6 -0
  319. package/dist/plugin-data/scoped-records.js +10 -0
  320. package/dist/plugin-data/scoped-records.js.map +1 -0
  321. package/dist/plugin-sdk.d.ts +41 -0
  322. package/dist/plugin-sdk.js +10 -0
  323. package/dist/plugin-sdk.js.map +1 -0
  324. package/dist/sql-lifecycle/index.d.ts +138 -0
  325. package/dist/sql-lifecycle/index.js +167 -0
  326. package/dist/sql-lifecycle/index.js.map +1 -0
  327. package/dist/storage/index.d.ts +2 -0
  328. package/dist/storage/index.js +13 -0
  329. package/dist/storage/index.js.map +1 -0
  330. package/dist/storage/s3-compatible.d.ts +139 -0
  331. package/dist/storage/s3-compatible.js +11 -0
  332. package/dist/storage/s3-compatible.js.map +1 -0
  333. package/dist/tenant.d.ts +108 -0
  334. package/dist/tenant.js +9 -0
  335. package/dist/tenant.js.map +1 -0
  336. package/dist/workspace-context.d.ts +119 -0
  337. package/dist/workspace-context.js +9 -0
  338. package/dist/workspace-context.js.map +1 -0
  339. package/docs/api.md +30560 -0
  340. package/docs/db/README.md +49 -0
  341. package/docs/db/docs/api.md +1613 -0
  342. package/docs/db/docs/guide.md +47 -0
  343. package/docs/entitlements.md +60 -0
  344. package/docs/guide.md +92 -0
  345. package/docs/index.md +57 -0
  346. package/docs/ja/db/README.md +46 -0
  347. package/docs/ja/db/docs/guide.md +53 -0
  348. package/docs/ja/guide.md +46 -0
  349. package/docs/ja/lifecycle/README.md +46 -0
  350. package/docs/ja/lifecycle/docs/guide.md +45 -0
  351. package/docs/ja/storage/README.md +46 -0
  352. package/docs/ja/storage/docs/guide.md +43 -0
  353. package/docs/lifecycle/README.md +49 -0
  354. package/docs/lifecycle/docs/api.md +3770 -0
  355. package/docs/lifecycle/docs/baseline.md +50 -0
  356. package/docs/lifecycle/docs/guide.md +47 -0
  357. package/docs/storage/README.md +49 -0
  358. package/docs/storage/docs/api.md +470 -0
  359. package/docs/storage/docs/guide.md +47 -0
  360. package/package.json +354 -4
@@ -0,0 +1,305 @@
1
+ import {
2
+ EntitlementError,
3
+ requiresEntitlementRuntime
4
+ } from "./chunk-46UWPEW2.js";
5
+
6
+ // src/mcp.ts
7
+ import { Hono } from "hono";
8
+ import { bodyLimit } from "hono/body-limit";
9
+ import Ajv from "ajv";
10
+ import Ajv2020 from "ajv/dist/2020.js";
11
+ import addFormats from "ajv-formats";
12
+ function createMcpRouter(runtime, options) {
13
+ const router = new Hono();
14
+ const ajv = new Ajv({ strict: false, allErrors: true });
15
+ const ajv2020 = new Ajv2020({ strict: false, allErrors: true });
16
+ addFormats(ajv);
17
+ addFormats(ajv2020);
18
+ const entitled = async (p, id) => {
19
+ const rule = runtime.registry.get(id)?.entitlement;
20
+ return !rule || !requiresEntitlementRuntime(rule) || !!options.entitlements && (await options.entitlements.check(p, id, rule)).allowed;
21
+ };
22
+ const admit = async (p, plugin, operation) => {
23
+ if (!plugin.entitlement || !requiresEntitlementRuntime(plugin.entitlement)) return;
24
+ if (!options.entitlements) throw Error("Entitlement service unavailable");
25
+ await options.entitlements.admit(p, plugin.id, plugin.entitlement, operation);
26
+ };
27
+ const preview = async (p, plugin) => {
28
+ if (!plugin.entitlement || !requiresEntitlementRuntime(plugin.entitlement)) return null;
29
+ if (!options.entitlements) return { status: 503, error: "Entitlement service unavailable" };
30
+ const decision = await options.entitlements.check(p, plugin.id, plugin.entitlement);
31
+ return decision.allowed ? null : { status: decision.status, error: decision.reason };
32
+ };
33
+ router.use("*", bodyLimit({ maxSize: 1024 * 1024 }));
34
+ router.onError((error, c) => {
35
+ options.onError?.(error);
36
+ return c.json({ error: "MCP request failed" }, 500);
37
+ });
38
+ function tools() {
39
+ const names = /* @__PURE__ */ new Set();
40
+ return runtime.registry.getAll().flatMap((plugin) => (plugin.mcp?.tools ?? []).map((tool) => {
41
+ if (names.has(tool.name)) throw new Error(`Duplicate MCP tool name: ${tool.name}`);
42
+ names.add(tool.name);
43
+ return { plugin, tool };
44
+ }));
45
+ }
46
+ async function resolveAIAdapters(principal2, pluginId, toolName, traceId) {
47
+ if (!options.resolveAIHostAdapters) return void 0;
48
+ return options.resolveAIHostAdapters({
49
+ principal: principal2,
50
+ pluginId,
51
+ toolName,
52
+ context: { tenantId: principal2.tenantId, userId: principal2.userId, operation: `mcp:${toolName}`, traceId }
53
+ });
54
+ }
55
+ async function principal(c) {
56
+ const p = await options.resolvePrincipal(c);
57
+ if (!p || typeof p.userId !== "string" || !p.userId.trim() || typeof p.tenantId !== "string" || !p.tenantId.trim() || !Array.isArray(p.roles) || !p.roles.every((v) => typeof v === "string") || !Array.isArray(p.enabledPluginIds) || !p.enabledPluginIds.every((v) => typeof v === "string")) return null;
58
+ if (options.tenantId && p.tenantId !== options.tenantId) return null;
59
+ return { userId: p.userId, tenantId: p.tenantId, roles: [...p.roles], enabledPluginIds: [...p.enabledPluginIds] };
60
+ }
61
+ router.get("/tools", async (c) => {
62
+ const p = await principal(c);
63
+ if (!p) return c.json({ error: "Unauthorized" }, 401);
64
+ const active = /* @__PURE__ */ new Set();
65
+ for (const id of p.enabledPluginIds) if ((!options.isPluginEnabled || await options.isPluginEnabled(p, id)) && await entitled(p, id)) active.add(id);
66
+ return c.json({ tools: tools().filter(
67
+ ({ plugin, tool }) => active.has(plugin.id) && runtime.gatekeeper.validateCall({ toolName: tool.name, userRoles: p.roles, tenantId: p.tenantId }).allowed
68
+ ).map(({ plugin, tool }) => ({ name: tool.name, description: tool.description, inputSchema: tool.parameters, pluginId: plugin.id })) });
69
+ });
70
+ router.post("/execute", async (c) => {
71
+ const p = await principal(c);
72
+ if (!p) return c.json({ error: "Unauthorized" }, 401);
73
+ if (!/^application\/json(?:;|$)/i.test(c.req.header("Content-Type") ?? "")) return c.json({ error: "JSON content type required" }, 415);
74
+ const body = await c.req.json().catch(() => null);
75
+ if (!body || typeof body !== "object" || Array.isArray(body) || typeof body.name !== "string" || !body.args || typeof body.args !== "object" || Array.isArray(body.args) || Object.keys(body).some((k) => k !== "name" && k !== "args")) return c.json({ error: "Expected { name, args }" }, 400);
76
+ const entry = tools().find(({ tool }) => tool.name === body.name);
77
+ if (!entry || !p.enabledPluginIds.includes(entry.plugin.id) || options.isPluginEnabled && !await options.isPluginEnabled(p, entry.plugin.id)) return c.json({ error: "Tool unavailable" }, 404);
78
+ const admission = await preview(p, entry.plugin);
79
+ if (admission) return c.json({ error: admission.error }, admission.status);
80
+ const traceId = crypto.randomUUID();
81
+ const verdict = runtime.gatekeeper.validateCall({ toolName: entry.tool.name, userRoles: p.roles, tenantId: p.tenantId, traceId });
82
+ const audit = {
83
+ toolName: entry.tool.name,
84
+ userId: p.userId,
85
+ tenantId: p.tenantId,
86
+ traceId,
87
+ riskLevel: verdict.riskLevel,
88
+ approvalLevel: verdict.approvalLevel
89
+ };
90
+ if (!verdict.allowed) {
91
+ runtime.gatekeeper.logCall({ ...audit, status: "BLOCKED", reason: verdict.reason });
92
+ return c.json({ error: "Forbidden", traceId }, 403);
93
+ }
94
+ const schema = entry.tool.parameters;
95
+ const validator = (String(schema.$schema ?? "").includes("2020-12") ? ajv2020 : ajv).compile(schema);
96
+ if (!validator(body.args)) return c.json({ error: "Invalid tool arguments", traceId }, 400);
97
+ if (verdict.requireHumanApproval) {
98
+ runtime.gatekeeper.logCall({ ...audit, status: "PENDING_APPROVAL" });
99
+ return c.json({ requireHumanApproval: true, approvalLevel: verdict.approvalLevel, traceId }, 202);
100
+ }
101
+ if (options.isPluginEnabled && !await options.isPluginEnabled(p, entry.plugin.id)) return c.json({ error: "Tool unavailable" }, 404);
102
+ const dependencies = await options.createToolContext?.(p, entry.plugin.id) ?? {};
103
+ const aiHostAdapters = await resolveAIAdapters(p, entry.plugin.id, entry.tool.name, traceId);
104
+ if (options.isPluginEnabled && !await options.isPluginEnabled(p, entry.plugin.id)) return c.json({ error: "Tool unavailable" }, 404);
105
+ const context = Object.freeze({
106
+ ...dependencies,
107
+ ...aiHostAdapters ? { aiHostAdapters: Object.freeze(aiHostAdapters) } : {},
108
+ tenantId: p.tenantId,
109
+ userId: p.userId,
110
+ roles: Object.freeze([...p.roles]),
111
+ pluginId: entry.plugin.id,
112
+ traceId
113
+ });
114
+ try {
115
+ await admit(p, entry.plugin, `mcp:${entry.tool.name}`);
116
+ } catch (error) {
117
+ if (error instanceof EntitlementError) {
118
+ runtime.gatekeeper.logCall({ ...audit, status: "BLOCKED", reason: error.message });
119
+ return c.json({ error: error.message }, error.decision.status);
120
+ }
121
+ throw error;
122
+ }
123
+ runtime.gatekeeper.logCall({ ...audit, status: "ALLOWED" });
124
+ const result = await entry.tool.handler(body.args, context);
125
+ return c.json({ result, traceId });
126
+ });
127
+ const sseSessions = /* @__PURE__ */ new Map();
128
+ const boundedNumber = (value, fallback, minimum) => typeof value === "number" && Number.isFinite(value) ? Math.max(minimum, Math.floor(value)) : fallback;
129
+ const sseSessionTtlMs = boundedNumber(options.sseSessionTtlMs, 30 * 60 * 1e3, 1e3);
130
+ const maxSseSessions = boundedNumber(options.maxSseSessions, 1e3, 1);
131
+ function purgeExpiredSseSessions(now = Date.now()) {
132
+ for (const [id, session] of sseSessions) {
133
+ if (now - session.createdAt >= sseSessionTtlMs || now - session.lastActivityAt >= sseSessionTtlMs) sseSessions.delete(id);
134
+ }
135
+ }
136
+ router.get("/sse", async (c) => {
137
+ const p = await principal(c);
138
+ if (!p) return c.json({ error: "Unauthorized" }, 401);
139
+ const now = Date.now();
140
+ purgeExpiredSseSessions(now);
141
+ if (sseSessions.size >= maxSseSessions) return c.json({ error: "MCP SSE capacity exhausted" }, 503);
142
+ const sessionId = crypto.randomUUID();
143
+ const endpointUrl = `${new URL(c.req.url).pathname.replace(/\/sse$/, "")}/message?sessionId=${sessionId}`;
144
+ let cleanup;
145
+ const stream = new ReadableStream({
146
+ start(controller) {
147
+ const encoder = new TextEncoder();
148
+ const send = (data) => {
149
+ try {
150
+ const session = sseSessions.get(sessionId);
151
+ if (session) session.lastActivityAt = Date.now();
152
+ controller.enqueue(encoder.encode(data));
153
+ } catch {
154
+ cleanup?.();
155
+ }
156
+ };
157
+ sseSessions.set(sessionId, { userId: p.userId, tenantId: p.tenantId, createdAt: now, lastActivityAt: now, send });
158
+ cleanup = () => sseSessions.delete(sessionId);
159
+ send(`event: endpoint
160
+ data: ${endpointUrl}
161
+
162
+ `);
163
+ },
164
+ cancel() {
165
+ cleanup?.();
166
+ }
167
+ });
168
+ return new Response(stream, {
169
+ headers: {
170
+ "Content-Type": "text/event-stream",
171
+ "Cache-Control": "no-cache",
172
+ Connection: "keep-alive"
173
+ }
174
+ });
175
+ });
176
+ router.post("/message", async (c) => {
177
+ const p = await principal(c);
178
+ if (!p) return c.json({ jsonrpc: "2.0", error: { code: -32e3, message: "Unauthorized" }, id: null }, 401);
179
+ const body = await c.req.json().catch(() => null);
180
+ if (!body || typeof body !== "object" || body.jsonrpc !== "2.0" || typeof body.method !== "string") {
181
+ return c.json({ jsonrpc: "2.0", error: { code: -32600, message: "Invalid Request" }, id: body?.id ?? null }, 400);
182
+ }
183
+ const id = body.id ?? null;
184
+ const sessionId = c.req.query("sessionId");
185
+ purgeExpiredSseSessions();
186
+ const session = sessionId ? sseSessions.get(sessionId) : void 0;
187
+ if (sessionId && !session) return c.json({ jsonrpc: "2.0", error: { code: -32e3, message: "MCP session unavailable" }, id }, 404);
188
+ if (session && (session.userId !== p.userId || session.tenantId !== p.tenantId)) {
189
+ return c.json({ jsonrpc: "2.0", error: { code: -32003, message: "MCP session owner mismatch" }, id }, 403);
190
+ }
191
+ if (session) session.lastActivityAt = Date.now();
192
+ const sendRpcResponse = (payload) => {
193
+ const serialized = JSON.stringify(payload);
194
+ if (session) {
195
+ session.send(`event: message
196
+ data: ${serialized}
197
+
198
+ `);
199
+ }
200
+ return c.json(payload);
201
+ };
202
+ if (body.method === "tools/list") {
203
+ const active = /* @__PURE__ */ new Set();
204
+ for (const pid of p.enabledPluginIds) if ((!options.isPluginEnabled || await options.isPluginEnabled(p, pid)) && await entitled(p, pid)) active.add(pid);
205
+ const available = tools().filter(
206
+ ({ plugin, tool }) => active.has(plugin.id) && runtime.gatekeeper.validateCall({ toolName: tool.name, userRoles: p.roles, tenantId: p.tenantId }).allowed
207
+ ).map(({ plugin, tool }) => ({
208
+ name: tool.name,
209
+ description: tool.description,
210
+ inputSchema: tool.parameters,
211
+ pluginId: plugin.id
212
+ }));
213
+ return sendRpcResponse({ jsonrpc: "2.0", result: { tools: available }, id });
214
+ }
215
+ if (body.method === "tools/call") {
216
+ const toolName = body.params?.name;
217
+ const toolArgs = body.params?.arguments ?? {};
218
+ if (typeof toolName !== "string" || typeof toolArgs !== "object" || Array.isArray(toolArgs)) {
219
+ return sendRpcResponse({ jsonrpc: "2.0", error: { code: -32602, message: "Invalid params" }, id });
220
+ }
221
+ const entry = tools().find(({ tool }) => tool.name === toolName);
222
+ if (!entry || !p.enabledPluginIds.includes(entry.plugin.id) || options.isPluginEnabled && !await options.isPluginEnabled(p, entry.plugin.id)) {
223
+ return sendRpcResponse({ jsonrpc: "2.0", error: { code: -32601, message: "Tool not found" }, id });
224
+ }
225
+ const admission = await preview(p, entry.plugin);
226
+ if (admission) return sendRpcResponse({ jsonrpc: "2.0", error: { code: -32003, message: admission.error, data: { status: admission.status } }, id });
227
+ const traceId = crypto.randomUUID();
228
+ const verdict = runtime.gatekeeper.validateCall({ toolName: entry.tool.name, userRoles: p.roles, tenantId: p.tenantId, traceId });
229
+ const audit = {
230
+ toolName: entry.tool.name,
231
+ userId: p.userId,
232
+ tenantId: p.tenantId,
233
+ traceId,
234
+ riskLevel: verdict.riskLevel,
235
+ approvalLevel: verdict.approvalLevel
236
+ };
237
+ if (!verdict.allowed) {
238
+ runtime.gatekeeper.logCall({ ...audit, status: "BLOCKED", reason: verdict.reason });
239
+ return sendRpcResponse({ jsonrpc: "2.0", error: { code: -32003, message: "Forbidden: tool execution denied" }, id });
240
+ }
241
+ const schema = entry.tool.parameters;
242
+ const validator = (String(schema.$schema ?? "").includes("2020-12") ? ajv2020 : ajv).compile(schema);
243
+ if (!validator(toolArgs)) {
244
+ return sendRpcResponse({ jsonrpc: "2.0", error: { code: -32602, message: "Invalid tool arguments" }, id });
245
+ }
246
+ if (verdict.requireHumanApproval) {
247
+ runtime.gatekeeper.logCall({ ...audit, status: "PENDING_APPROVAL" });
248
+ return sendRpcResponse({
249
+ jsonrpc: "2.0",
250
+ result: {
251
+ content: [{ type: "text", text: `Human approval required (${verdict.approvalLevel})` }],
252
+ isError: true,
253
+ requireHumanApproval: true,
254
+ approvalLevel: verdict.approvalLevel,
255
+ traceId
256
+ },
257
+ id
258
+ });
259
+ }
260
+ if (options.isPluginEnabled && !await options.isPluginEnabled(p, entry.plugin.id)) {
261
+ return sendRpcResponse({ jsonrpc: "2.0", error: { code: -32601, message: "Tool not found" }, id });
262
+ }
263
+ const dependencies = await options.createToolContext?.(p, entry.plugin.id) ?? {};
264
+ const aiHostAdapters = await resolveAIAdapters(p, entry.plugin.id, entry.tool.name, traceId);
265
+ if (options.isPluginEnabled && !await options.isPluginEnabled(p, entry.plugin.id)) {
266
+ return sendRpcResponse({ jsonrpc: "2.0", error: { code: -32601, message: "Tool not found" }, id });
267
+ }
268
+ const context = Object.freeze({
269
+ ...dependencies,
270
+ ...aiHostAdapters ? { aiHostAdapters: Object.freeze(aiHostAdapters) } : {},
271
+ tenantId: p.tenantId,
272
+ userId: p.userId,
273
+ roles: Object.freeze([...p.roles]),
274
+ pluginId: entry.plugin.id,
275
+ traceId
276
+ });
277
+ try {
278
+ await admit(p, entry.plugin, `mcp:${entry.tool.name}`);
279
+ } catch (error) {
280
+ if (error instanceof EntitlementError) {
281
+ runtime.gatekeeper.logCall({ ...audit, status: "BLOCKED", reason: error.message });
282
+ return sendRpcResponse({ jsonrpc: "2.0", error: { code: -32003, message: error.message, data: { status: error.decision.status } }, id });
283
+ }
284
+ throw error;
285
+ }
286
+ runtime.gatekeeper.logCall({ ...audit, status: "ALLOWED" });
287
+ const handlerResult = await entry.tool.handler(toolArgs, context);
288
+ return sendRpcResponse({
289
+ jsonrpc: "2.0",
290
+ result: {
291
+ content: [{ type: "text", text: JSON.stringify(handlerResult) }],
292
+ traceId
293
+ },
294
+ id
295
+ });
296
+ }
297
+ return sendRpcResponse({ jsonrpc: "2.0", error: { code: -32601, message: "Method not found" }, id });
298
+ });
299
+ return router;
300
+ }
301
+
302
+ export {
303
+ createMcpRouter
304
+ };
305
+ //# sourceMappingURL=chunk-VF5YDZJC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mcp.ts"],"sourcesContent":["import { Hono, type Context } from 'hono'\nimport { bodyLimit } from 'hono/body-limit'\nimport Ajv from 'ajv'\nimport Ajv2020 from 'ajv/dist/2020.js'\nimport addFormats from 'ajv-formats'\nimport { EntitlementError, requiresEntitlementRuntime, type PluginEntitlementRuntime } from './entitlements/index'\nimport type { AIExecutionContext, AIHostAdapters, McpGatekeeper, PluginRegistry, McpToolDefinition, PluginManifest } from '@alneas/eaos-core'\n\n/**\n * Host-verified identity, roles, and enabled plugins used for MCP discovery and execution.\n * @see createMcpRouter.\n */\nexport interface McpPrincipal {\n /** Nonblank authenticated user identifier. */\n userId: string\n /** Nonblank authorized tenant identifier. */\n tenantId: string\n /** Verified role strings passed to the gatekeeper; an empty array is permitted. */\n roles: string[]\n /** Exact installed plugin IDs, resolved from the server's current tenant configuration. */\n enabledPluginIds: string[]\n}\n/**\n * Shared registry and policy/audit service used by {@link createMcpRouter}.\n */\nexport interface McpRuntime {\n /** Registry supplying trusted manifests and executable tool handlers. Duplicate tool names fail discovery/execution. */\n registry: PluginRegistry\n /** Current permission/approval policy and audit sink consulted for tool discovery and calls. */\n gatekeeper: McpGatekeeper\n}\n/**\n * Live host authorization, resource injection, and bounded SSE-session settings for {@link createMcpRouter}.\n */\nexport interface McpRouterOptions {\n /** Runtime for declared commercial/usage entitlements; required by plugins whose rules need external entitlement checks. */\n entitlements?: PluginEntitlementRuntime\n /** Additional current lifecycle gate; called on discovery and immediately before execution. */\n isPluginEnabled?: (principal: McpPrincipal, pluginId: string) => Promise<boolean>\n /** Must verify authentication, tenant membership and enabled plugins on every request. */\n resolvePrincipal: (context: Context) => Promise<McpPrincipal | null>\n /** Optional binding for a tenant-dedicated backend. */\n tenantId?: string\n /** Inject already tenant-scoped resources; never pass an unrestricted administrative DB. */\n createToolContext?: (principal: McpPrincipal, pluginId: string) => Promise<Record<string, unknown>>\n /** Resolve provider-neutral AI adapters after live authorization; the result is injected into the verified tool context. */\n resolveAIHostAdapters?: (input: {\n /**\n * Verified current request principal after membership and enabled-plugin resolution.\n */\n principal: McpPrincipal;\n /**\n * Owning plugin whose admitted tool needs host AI adapters.\n */\n pluginId: string;\n /**\n * Exact registered MCP tool name being executed.\n */\n toolName: string;\n /**\n * Verified AI execution identity, operation mcp:toolName, and generated trace ID; no client scope overrides are accepted here.\n */\n context: AIExecutionContext }) => Promise<AIHostAdapters | undefined>\n /** Operational errors only; request bodies/credentials are not passed. */\n onError?: (error: unknown) => void\n /** Maximum SSE session age and inactivity in milliseconds; finite values are floored and clamped to at least 1000. Defaults to 1800000 for absent/nonfinite input. */\n sseSessionTtlMs?: number\n /** Per-router SSE session capacity; finite values are floored and clamped to at least 1. Defaults to 1000 for absent/nonfinite input. */\n maxSseSessions?: number\n}\n\n/**\n * Creates authenticated MCP tool discovery/execution routes and an SSE JSON-RPC transport.\n * @param runtime - Trusted plugin/tool registry and gatekeeper with audit behavior.\n * @param options - Host principal verification, current lifecycle/entitlement checks, scoped dependencies, AI adapters, and SSE limits.\n * @returns A Hono router exposing GET /tools, POST /execute, GET /sse, and POST /message; no network listener is started.\n * @throws Router construction can propagate validator setup errors. Request-time callback, schema compilation, tool, or audit errors are passed to onError and normally rendered as a generic 500; a throwing onError can itself fail error handling.\n * @remarks Every request resolves current identity and enabled plugins. Tool discovery hides unavailable tools; calls validate arguments, recheck lifecycle before execution, and perform entitlement admission. Human-approval requirements return pending data without executing the handler; no client approval flag bypasses this. Request bodies are limited to 1 MiB. Host callbacks must supply tenant-scoped resources and enforce real membership and lifecycle checks; the router does not open databases or persist results. SSE session state is process-local, owner-bound, capacity-limited, and removed on stream cancellation or lazy expiry checks. Expiry removes the mapping without explicitly closing the existing stream; no heartbeat or cross-process session sharing is provided. Tool failures may occur after side effects, so retry/idempotency remains host-owned.\n * @example\n * ```typescript\n * import { createMcpRouter, type McpRuntime, type McpRouterOptions } from \"@alneas/eaos-server/mcp\";\n * export function mcpRoutes(runtime: McpRuntime, options: McpRouterOptions) {\n * // options.resolvePrincipal must verify live identity, membership, and enabled plugins.\n * // Supply only tenant-scoped resources through createToolContext.\n * return createMcpRouter(runtime, options);\n * }\n * ```\n */\nexport function createMcpRouter(runtime: McpRuntime, options: McpRouterOptions): Hono {\n const router = new Hono()\n const ajv = new Ajv({ strict: false, allErrors: true })\n const ajv2020 = new Ajv2020({ strict: false, allErrors: true })\n addFormats(ajv); addFormats(ajv2020)\n const entitled = async (p: McpPrincipal, id: string) => {\n const rule = runtime.registry.get(id)?.entitlement\n return !rule || !requiresEntitlementRuntime(rule) || !!options.entitlements && (await options.entitlements.check(p, id, rule)).allowed\n }\n const admit = async (p: McpPrincipal, plugin: PluginManifest, operation: string) => {\n if (!plugin.entitlement || !requiresEntitlementRuntime(plugin.entitlement)) return\n if (!options.entitlements) throw Error('Entitlement service unavailable')\n await options.entitlements.admit(p, plugin.id, plugin.entitlement, operation)\n }\n const preview = async (p: McpPrincipal, plugin: PluginManifest) => {\n if (!plugin.entitlement || !requiresEntitlementRuntime(plugin.entitlement)) return null\n if (!options.entitlements) return { status: 503 as const, error: 'Entitlement service unavailable' }\n const decision = await options.entitlements.check(p, plugin.id, plugin.entitlement)\n return decision.allowed ? null : { status: decision.status, error: decision.reason }\n }\n router.use('*', bodyLimit({ maxSize: 1024 * 1024 }))\n router.onError((error, c) => {\n options.onError?.(error)\n return c.json({ error: 'MCP request failed' }, 500)\n })\n\n function tools(): Array<{ plugin: PluginManifest; tool: McpToolDefinition }> {\n const names = new Set<string>()\n return runtime.registry.getAll().flatMap(plugin => (plugin.mcp?.tools ?? []).map(tool => {\n if (names.has(tool.name)) throw new Error(`Duplicate MCP tool name: ${tool.name}`)\n names.add(tool.name)\n return { plugin, tool }\n }))\n }\n\n async function resolveAIAdapters(principal: McpPrincipal, pluginId: string, toolName: string, traceId: string): Promise<AIHostAdapters | undefined> {\n if (!options.resolveAIHostAdapters) return undefined\n return options.resolveAIHostAdapters({\n principal,\n pluginId,\n toolName,\n context: { tenantId: principal.tenantId, userId: principal.userId, operation: `mcp:${toolName}`, traceId },\n })\n }\n\n async function principal(c: Context): Promise<McpPrincipal | null> {\n const p = await options.resolvePrincipal(c)\n if (!p || typeof p.userId !== 'string' || !p.userId.trim() || typeof p.tenantId !== 'string' || !p.tenantId.trim()\n || !Array.isArray(p.roles) || !p.roles.every(v => typeof v === 'string')\n || !Array.isArray(p.enabledPluginIds) || !p.enabledPluginIds.every(v => typeof v === 'string')) return null\n if (options.tenantId && p.tenantId !== options.tenantId) return null\n return { userId: p.userId, tenantId: p.tenantId, roles: [...p.roles], enabledPluginIds: [...p.enabledPluginIds] }\n }\n\n router.get('/tools', async c => {\n const p = await principal(c)\n if (!p) return c.json({ error: 'Unauthorized' }, 401)\n const active = new Set<string>()\n for (const id of p.enabledPluginIds) if ((!options.isPluginEnabled || await options.isPluginEnabled(p, id)) && await entitled(p, id)) active.add(id)\n return c.json({ tools: tools().filter(({ plugin, tool }) =>\n active.has(plugin.id) && runtime.gatekeeper.validateCall({ toolName: tool.name, userRoles: p.roles, tenantId: p.tenantId }).allowed\n ).map(({ plugin, tool }) => ({ name: tool.name, description: tool.description, inputSchema: tool.parameters, pluginId: plugin.id })) })\n })\n\n router.post('/execute', async c => {\n const p = await principal(c)\n if (!p) return c.json({ error: 'Unauthorized' }, 401)\n if (!/^application\\/json(?:;|$)/i.test(c.req.header('Content-Type') ?? '')) return c.json({ error: 'JSON content type required' }, 415)\n const body = await c.req.json().catch(() => null)\n if (!body || typeof body !== 'object' || Array.isArray(body) || typeof body.name !== 'string'\n || !body.args || typeof body.args !== 'object' || Array.isArray(body.args)\n || Object.keys(body).some(k => k !== 'name' && k !== 'args')) return c.json({ error: 'Expected { name, args }' }, 400)\n const entry = tools().find(({ tool }) => tool.name === body.name)\n // Do not reveal disabled plugin tools through discovery or execution.\n if (!entry || !p.enabledPluginIds.includes(entry.plugin.id) || (options.isPluginEnabled && !await options.isPluginEnabled(p, entry.plugin.id))) return c.json({ error: 'Tool unavailable' }, 404)\n const admission = await preview(p, entry.plugin)\n if (admission) return c.json({ error: admission.error }, admission.status)\n const traceId = crypto.randomUUID()\n const verdict = runtime.gatekeeper.validateCall({ toolName: entry.tool.name, userRoles: p.roles, tenantId: p.tenantId, traceId })\n const audit = { toolName: entry.tool.name, userId: p.userId, tenantId: p.tenantId, traceId,\n riskLevel: verdict.riskLevel, approvalLevel: verdict.approvalLevel }\n if (!verdict.allowed) {\n runtime.gatekeeper.logCall({ ...audit, status: 'BLOCKED', reason: verdict.reason })\n return c.json({ error: 'Forbidden', traceId }, 403)\n }\n const schema = entry.tool.parameters\n const validator = (String(schema.$schema ?? '').includes('2020-12') ? ajv2020 : ajv).compile(schema)\n if (!validator(body.args)) return c.json({ error: 'Invalid tool arguments', traceId }, 400)\n if (verdict.requireHumanApproval) {\n runtime.gatekeeper.logCall({ ...audit, status: 'PENDING_APPROVAL' })\n // No client-supplied approval flag or token can bypass this branch.\n return c.json({ requireHumanApproval: true, approvalLevel: verdict.approvalLevel, traceId }, 202)\n }\n if (options.isPluginEnabled && !await options.isPluginEnabled(p, entry.plugin.id)) return c.json({ error: 'Tool unavailable' }, 404)\n const dependencies = await options.createToolContext?.(p, entry.plugin.id) ?? {}\n const aiHostAdapters = await resolveAIAdapters(p, entry.plugin.id, entry.tool.name, traceId)\n if (options.isPluginEnabled && !await options.isPluginEnabled(p, entry.plugin.id)) return c.json({ error: 'Tool unavailable' }, 404)\n const context = Object.freeze({ ...dependencies, ...(aiHostAdapters ? { aiHostAdapters: Object.freeze(aiHostAdapters) } : {}), tenantId: p.tenantId, userId: p.userId,\n roles: Object.freeze([...p.roles]), pluginId: entry.plugin.id, traceId })\n try { await admit(p, entry.plugin, `mcp:${entry.tool.name}`) }\n catch (error) { if (error instanceof EntitlementError) { runtime.gatekeeper.logCall({ ...audit, status: 'BLOCKED', reason: error.message }); return c.json({ error: error.message }, error.decision.status) } throw error }\n runtime.gatekeeper.logCall({ ...audit, status: 'ALLOWED' })\n const result = await entry.tool.handler(body.args, context)\n return c.json({ result, traceId })\n })\n\n // ---------- MCP SSE (Server-Sent Events) & JSON-RPC 2.0 Transport ----------\n interface SseSession {\n userId: string\n tenantId: string\n createdAt: number\n lastActivityAt: number\n send: (chunk: string) => void\n }\n const sseSessions = new Map<string, SseSession>()\n const boundedNumber = (value: number | undefined, fallback: number, minimum: number): number =>\n typeof value === 'number' && Number.isFinite(value) ? Math.max(minimum, Math.floor(value)) : fallback\n const sseSessionTtlMs = boundedNumber(options.sseSessionTtlMs, 30 * 60 * 1_000, 1_000)\n const maxSseSessions = boundedNumber(options.maxSseSessions, 1_000, 1)\n\n function purgeExpiredSseSessions(now = Date.now()): void {\n for (const [id, session] of sseSessions) {\n if (now - session.createdAt >= sseSessionTtlMs || now - session.lastActivityAt >= sseSessionTtlMs) sseSessions.delete(id)\n }\n }\n\n router.get('/sse', async c => {\n const p = await principal(c)\n if (!p) return c.json({ error: 'Unauthorized' }, 401)\n\n const now = Date.now()\n purgeExpiredSseSessions(now)\n if (sseSessions.size >= maxSseSessions) return c.json({ error: 'MCP SSE capacity exhausted' }, 503)\n\n const sessionId = crypto.randomUUID()\n const endpointUrl = `${new URL(c.req.url).pathname.replace(/\\/sse$/, '')}/message?sessionId=${sessionId}`\n\n let cleanup: (() => void) | undefined\n const stream = new ReadableStream({\n start(controller) {\n const encoder = new TextEncoder()\n const send = (data: string) => {\n try {\n const session = sseSessions.get(sessionId)\n if (session) session.lastActivityAt = Date.now()\n controller.enqueue(encoder.encode(data))\n } catch {\n cleanup?.()\n }\n }\n sseSessions.set(sessionId, { userId: p.userId, tenantId: p.tenantId, createdAt: now, lastActivityAt: now, send })\n cleanup = () => sseSessions.delete(sessionId)\n\n // MCP SSE Initial Handshake: emit endpoint URL\n send(`event: endpoint\\ndata: ${endpointUrl}\\n\\n`)\n },\n cancel() {\n cleanup?.()\n },\n })\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n },\n })\n })\n\n router.post('/message', async c => {\n const p = await principal(c)\n if (!p) return c.json({ jsonrpc: '2.0', error: { code: -32000, message: 'Unauthorized' }, id: null }, 401)\n\n const body = await c.req.json().catch(() => null)\n if (!body || typeof body !== 'object' || body.jsonrpc !== '2.0' || typeof body.method !== 'string') {\n return c.json({ jsonrpc: '2.0', error: { code: -32600, message: 'Invalid Request' }, id: body?.id ?? null }, 400)\n }\n\n const id = body.id ?? null\n const sessionId = c.req.query('sessionId')\n purgeExpiredSseSessions()\n const session = sessionId ? sseSessions.get(sessionId) : undefined\n if (sessionId && !session) return c.json({ jsonrpc: '2.0', error: { code: -32000, message: 'MCP session unavailable' }, id }, 404)\n if (session && (session.userId !== p.userId || session.tenantId !== p.tenantId)) {\n return c.json({ jsonrpc: '2.0', error: { code: -32003, message: 'MCP session owner mismatch' }, id }, 403)\n }\n if (session) session.lastActivityAt = Date.now()\n\n const sendRpcResponse = (payload: object) => {\n const serialized = JSON.stringify(payload)\n if (session) {\n session.send(`event: message\\ndata: ${serialized}\\n\\n`)\n }\n return c.json(payload)\n }\n\n // 1. tools/list\n if (body.method === 'tools/list') {\n const active = new Set<string>()\n for (const pid of p.enabledPluginIds) if ((!options.isPluginEnabled || await options.isPluginEnabled(p, pid)) && await entitled(p, pid)) active.add(pid)\n\n const available = tools()\n .filter(({ plugin, tool }) =>\n active.has(plugin.id) &&\n runtime.gatekeeper.validateCall({ toolName: tool.name, userRoles: p.roles, tenantId: p.tenantId }).allowed\n )\n .map(({ plugin, tool }) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.parameters,\n pluginId: plugin.id,\n }))\n\n return sendRpcResponse({ jsonrpc: '2.0', result: { tools: available }, id })\n }\n\n // 2. tools/call\n if (body.method === 'tools/call') {\n const toolName = body.params?.name\n const toolArgs = body.params?.arguments ?? {}\n\n if (typeof toolName !== 'string' || typeof toolArgs !== 'object' || Array.isArray(toolArgs)) {\n return sendRpcResponse({ jsonrpc: '2.0', error: { code: -32602, message: 'Invalid params' }, id })\n }\n\n const entry = tools().find(({ tool }) => tool.name === toolName)\n if (!entry || !p.enabledPluginIds.includes(entry.plugin.id) || (options.isPluginEnabled && !await options.isPluginEnabled(p, entry.plugin.id))) {\n return sendRpcResponse({ jsonrpc: '2.0', error: { code: -32601, message: 'Tool not found' }, id })\n }\n const admission = await preview(p, entry.plugin)\n if (admission) return sendRpcResponse({ jsonrpc: '2.0', error: { code: -32003, message: admission.error, data: { status: admission.status } }, id })\n\n const traceId = crypto.randomUUID()\n const verdict = runtime.gatekeeper.validateCall({ toolName: entry.tool.name, userRoles: p.roles, tenantId: p.tenantId, traceId })\n const audit = { toolName: entry.tool.name, userId: p.userId, tenantId: p.tenantId, traceId,\n riskLevel: verdict.riskLevel, approvalLevel: verdict.approvalLevel }\n\n if (!verdict.allowed) {\n runtime.gatekeeper.logCall({ ...audit, status: 'BLOCKED', reason: verdict.reason })\n return sendRpcResponse({ jsonrpc: '2.0', error: { code: -32003, message: 'Forbidden: tool execution denied' }, id })\n }\n\n const schema = entry.tool.parameters\n const validator = (String(schema.$schema ?? '').includes('2020-12') ? ajv2020 : ajv).compile(schema)\n if (!validator(toolArgs)) {\n return sendRpcResponse({ jsonrpc: '2.0', error: { code: -32602, message: 'Invalid tool arguments' }, id })\n }\n\n if (verdict.requireHumanApproval) {\n runtime.gatekeeper.logCall({ ...audit, status: 'PENDING_APPROVAL' })\n return sendRpcResponse({\n jsonrpc: '2.0',\n result: {\n content: [{ type: 'text', text: `Human approval required (${verdict.approvalLevel})` }],\n isError: true,\n requireHumanApproval: true,\n approvalLevel: verdict.approvalLevel,\n traceId,\n },\n id,\n })\n }\n\n if (options.isPluginEnabled && !await options.isPluginEnabled(p, entry.plugin.id)) {\n return sendRpcResponse({ jsonrpc: '2.0', error: { code: -32601, message: 'Tool not found' }, id })\n }\n const dependencies = await options.createToolContext?.(p, entry.plugin.id) ?? {}\n const aiHostAdapters = await resolveAIAdapters(p, entry.plugin.id, entry.tool.name, traceId)\n if (options.isPluginEnabled && !await options.isPluginEnabled(p, entry.plugin.id)) {\n return sendRpcResponse({ jsonrpc: '2.0', error: { code: -32601, message: 'Tool not found' }, id })\n }\n const context = Object.freeze({ ...dependencies, ...(aiHostAdapters ? { aiHostAdapters: Object.freeze(aiHostAdapters) } : {}), tenantId: p.tenantId, userId: p.userId,\n roles: Object.freeze([...p.roles]), pluginId: entry.plugin.id, traceId })\n\n try { await admit(p, entry.plugin, `mcp:${entry.tool.name}`) }\n catch (error) {\n if (error instanceof EntitlementError) { runtime.gatekeeper.logCall({ ...audit, status: 'BLOCKED', reason: error.message }); return sendRpcResponse({ jsonrpc: '2.0', error: { code: -32003, message: error.message, data: { status: error.decision.status } }, id }) }\n throw error\n }\n runtime.gatekeeper.logCall({ ...audit, status: 'ALLOWED' })\n const handlerResult = await entry.tool.handler(toolArgs, context)\n\n return sendRpcResponse({\n jsonrpc: '2.0',\n result: {\n content: [{ type: 'text', text: JSON.stringify(handlerResult) }],\n traceId,\n },\n id,\n })\n }\n\n return sendRpcResponse({ jsonrpc: '2.0', error: { code: -32601, message: 'Method not found' }, id })\n })\n return router\n}\n"],"mappings":"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","names":["principal"]}