@nodetool-ai/websocket 0.7.0-rc.22 → 0.8.1

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 (1020) hide show
  1. package/README.md +50 -0
  2. package/dist/.nodetool-build-stamp +1 -0
  3. package/dist/agent/run-node-tool.d.ts +39 -0
  4. package/dist/agent/run-node-tool.d.ts.map +1 -0
  5. package/dist/agent/run-node-tool.js +55 -0
  6. package/dist/agent/run-node-tool.js.map +1 -0
  7. package/dist/chat-prediction-forwarder.d.ts +13 -0
  8. package/dist/chat-prediction-forwarder.d.ts.map +1 -0
  9. package/dist/chat-prediction-forwarder.js +22 -0
  10. package/dist/chat-prediction-forwarder.js.map +1 -0
  11. package/dist/chat-tool-call-repair.d.ts +45 -0
  12. package/dist/chat-tool-call-repair.d.ts.map +1 -0
  13. package/dist/chat-tool-call-repair.js +100 -0
  14. package/dist/chat-tool-call-repair.js.map +1 -0
  15. package/dist/chat-turn-registry.d.ts +169 -0
  16. package/dist/chat-turn-registry.d.ts.map +1 -0
  17. package/dist/chat-turn-registry.js +326 -0
  18. package/dist/chat-turn-registry.js.map +1 -0
  19. package/dist/collection-api.d.ts +2 -2
  20. package/dist/collection-api.d.ts.map +1 -1
  21. package/dist/collection-api.js +44 -13
  22. package/dist/collection-api.js.map +1 -1
  23. package/dist/configured-providers.d.ts +52 -0
  24. package/dist/configured-providers.d.ts.map +1 -0
  25. package/dist/configured-providers.js +85 -0
  26. package/dist/configured-providers.js.map +1 -0
  27. package/dist/cors.d.ts +22 -0
  28. package/dist/cors.d.ts.map +1 -0
  29. package/dist/cors.js +91 -0
  30. package/dist/cors.js.map +1 -0
  31. package/dist/credit-gate.d.ts +36 -0
  32. package/dist/credit-gate.d.ts.map +1 -0
  33. package/dist/credit-gate.js +76 -0
  34. package/dist/credit-gate.js.map +1 -0
  35. package/dist/custom-providers.d.ts +40 -0
  36. package/dist/custom-providers.d.ts.map +1 -0
  37. package/dist/custom-providers.js +134 -0
  38. package/dist/custom-providers.js.map +1 -0
  39. package/dist/debug-sessions.d.ts +10 -0
  40. package/dist/debug-sessions.d.ts.map +1 -0
  41. package/dist/debug-sessions.js +9 -0
  42. package/dist/debug-sessions.js.map +1 -0
  43. package/dist/drain.d.ts +34 -0
  44. package/dist/drain.d.ts.map +1 -0
  45. package/dist/drain.js +68 -0
  46. package/dist/drain.js.map +1 -0
  47. package/dist/e2e-server.d.ts +30 -0
  48. package/dist/e2e-server.d.ts.map +1 -0
  49. package/dist/e2e-server.js +111 -0
  50. package/dist/e2e-server.js.map +1 -0
  51. package/dist/example-workflows.d.ts +20 -0
  52. package/dist/example-workflows.d.ts.map +1 -0
  53. package/dist/example-workflows.js +123 -0
  54. package/dist/example-workflows.js.map +1 -0
  55. package/dist/extension-cdp-bridge.d.ts +85 -0
  56. package/dist/extension-cdp-bridge.d.ts.map +1 -0
  57. package/dist/extension-cdp-bridge.js +163 -0
  58. package/dist/extension-cdp-bridge.js.map +1 -0
  59. package/dist/external-mcp.d.ts +58 -0
  60. package/dist/external-mcp.d.ts.map +1 -0
  61. package/dist/external-mcp.js +288 -0
  62. package/dist/external-mcp.js.map +1 -0
  63. package/dist/fake-runtime.d.ts +114 -0
  64. package/dist/fake-runtime.d.ts.map +1 -0
  65. package/dist/fake-runtime.js +270 -0
  66. package/dist/fake-runtime.js.map +1 -0
  67. package/dist/file-api.d.ts +4 -7
  68. package/dist/file-api.d.ts.map +1 -1
  69. package/dist/file-api.js +122 -39
  70. package/dist/file-api.js.map +1 -1
  71. package/dist/frontend-renderer-registry.d.ts +75 -0
  72. package/dist/frontend-renderer-registry.d.ts.map +1 -0
  73. package/dist/frontend-renderer-registry.js +111 -0
  74. package/dist/frontend-renderer-registry.js.map +1 -0
  75. package/dist/generation-recovery.d.ts +13 -0
  76. package/dist/generation-recovery.d.ts.map +1 -0
  77. package/dist/generation-recovery.js +197 -0
  78. package/dist/generation-recovery.js.map +1 -0
  79. package/dist/headless-job-runner.d.ts +71 -0
  80. package/dist/headless-job-runner.d.ts.map +1 -0
  81. package/dist/headless-job-runner.js +198 -0
  82. package/dist/headless-job-runner.js.map +1 -0
  83. package/dist/http-api.d.ts +157 -24
  84. package/dist/http-api.d.ts.map +1 -1
  85. package/dist/http-api.js +613 -646
  86. package/dist/http-api.js.map +1 -1
  87. package/dist/http-body-schemas.d.ts +109 -0
  88. package/dist/http-body-schemas.d.ts.map +1 -0
  89. package/dist/http-body-schemas.js +146 -0
  90. package/dist/http-body-schemas.js.map +1 -0
  91. package/dist/index.d.ts +11 -3
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +11 -3
  94. package/dist/index.js.map +1 -1
  95. package/dist/job-control.d.ts +57 -0
  96. package/dist/job-control.d.ts.map +1 -0
  97. package/dist/job-control.js +134 -0
  98. package/dist/job-control.js.map +1 -0
  99. package/dist/job-queue.d.ts +47 -0
  100. package/dist/job-queue.d.ts.map +1 -0
  101. package/dist/job-queue.js +52 -0
  102. package/dist/job-queue.js.map +1 -0
  103. package/dist/job-run-registry.d.ts +176 -0
  104. package/dist/job-run-registry.d.ts.map +1 -0
  105. package/dist/job-run-registry.js +312 -0
  106. package/dist/job-run-registry.js.map +1 -0
  107. package/dist/lib/app-build-service.d.ts +16 -0
  108. package/dist/lib/app-build-service.d.ts.map +1 -0
  109. package/dist/lib/app-build-service.js +39 -0
  110. package/dist/lib/app-build-service.js.map +1 -0
  111. package/dist/lib/app-debug-service.d.ts +16 -0
  112. package/dist/lib/app-debug-service.d.ts.map +1 -0
  113. package/dist/lib/app-debug-service.js +48 -0
  114. package/dist/lib/app-debug-service.js.map +1 -0
  115. package/dist/lib/app-deployment-service.d.ts +82 -0
  116. package/dist/lib/app-deployment-service.d.ts.map +1 -0
  117. package/dist/lib/app-deployment-service.js +282 -0
  118. package/dist/lib/app-deployment-service.js.map +1 -0
  119. package/dist/lib/app-run-server.d.ts +7 -0
  120. package/dist/lib/app-run-server.d.ts.map +1 -0
  121. package/dist/lib/app-run-server.js +6 -0
  122. package/dist/lib/app-run-server.js.map +1 -0
  123. package/dist/lib/app-session-scope.d.ts +91 -0
  124. package/dist/lib/app-session-scope.d.ts.map +1 -0
  125. package/dist/lib/app-session-scope.js +91 -0
  126. package/dist/lib/app-session-scope.js.map +1 -0
  127. package/dist/lib/applications-service.d.ts +173 -0
  128. package/dist/lib/applications-service.d.ts.map +1 -0
  129. package/dist/lib/applications-service.js +491 -0
  130. package/dist/lib/applications-service.js.map +1 -0
  131. package/dist/lib/asset-duration.d.ts +7 -0
  132. package/dist/lib/asset-duration.d.ts.map +1 -0
  133. package/dist/lib/asset-duration.js +24 -0
  134. package/dist/lib/asset-duration.js.map +1 -0
  135. package/dist/lib/asset-export.d.ts +34 -0
  136. package/dist/lib/asset-export.d.ts.map +1 -0
  137. package/dist/lib/asset-export.js +113 -0
  138. package/dist/lib/asset-export.js.map +1 -0
  139. package/dist/lib/asset-model-interface.d.ts +41 -0
  140. package/dist/lib/asset-model-interface.d.ts.map +1 -0
  141. package/dist/lib/asset-model-interface.js +74 -0
  142. package/dist/lib/asset-model-interface.js.map +1 -0
  143. package/dist/lib/asset-paths.d.ts +52 -0
  144. package/dist/lib/asset-paths.d.ts.map +1 -1
  145. package/dist/lib/asset-paths.js +145 -1
  146. package/dist/lib/asset-paths.js.map +1 -1
  147. package/dist/lib/asset-response.d.ts +12 -0
  148. package/dist/lib/asset-response.d.ts.map +1 -0
  149. package/dist/lib/asset-response.js +88 -0
  150. package/dist/lib/asset-response.js.map +1 -0
  151. package/dist/lib/audio-peaks.d.ts +23 -0
  152. package/dist/lib/audio-peaks.d.ts.map +1 -0
  153. package/dist/lib/audio-peaks.js +331 -0
  154. package/dist/lib/audio-peaks.js.map +1 -0
  155. package/dist/lib/bridge.d.ts +9 -1
  156. package/dist/lib/bridge.d.ts.map +1 -1
  157. package/dist/lib/bridge.js +27 -4
  158. package/dist/lib/bridge.js.map +1 -1
  159. package/dist/lib/compression.d.ts +3 -0
  160. package/dist/lib/compression.d.ts.map +1 -0
  161. package/dist/lib/compression.js +3 -0
  162. package/dist/lib/compression.js.map +1 -0
  163. package/dist/lib/document-model-interfaces.d.ts +30 -0
  164. package/dist/lib/document-model-interfaces.d.ts.map +1 -0
  165. package/dist/lib/document-model-interfaces.js +295 -0
  166. package/dist/lib/document-model-interfaces.js.map +1 -0
  167. package/dist/lib/env-config.d.ts +9 -0
  168. package/dist/lib/env-config.d.ts.map +1 -0
  169. package/dist/lib/env-config.js +18 -0
  170. package/dist/lib/env-config.js.map +1 -0
  171. package/dist/lib/example-apps.d.ts +43 -0
  172. package/dist/lib/example-apps.d.ts.map +1 -0
  173. package/dist/lib/example-apps.js +145 -0
  174. package/dist/lib/example-apps.js.map +1 -0
  175. package/dist/lib/example-games.d.ts +5 -0
  176. package/dist/lib/example-games.d.ts.map +1 -0
  177. package/dist/lib/example-games.js +13 -0
  178. package/dist/lib/example-games.js.map +1 -0
  179. package/dist/lib/example-recipes.d.ts +33 -0
  180. package/dist/lib/example-recipes.d.ts.map +1 -0
  181. package/dist/lib/example-recipes.js +213 -0
  182. package/dist/lib/example-recipes.js.map +1 -0
  183. package/dist/lib/example-storyboards.d.ts +40 -0
  184. package/dist/lib/example-storyboards.d.ts.map +1 -0
  185. package/dist/lib/example-storyboards.js +131 -0
  186. package/dist/lib/example-storyboards.js.map +1 -0
  187. package/dist/lib/example-thumbnail.d.ts +21 -0
  188. package/dist/lib/example-thumbnail.d.ts.map +1 -0
  189. package/dist/lib/example-thumbnail.js +50 -0
  190. package/dist/lib/example-thumbnail.js.map +1 -0
  191. package/dist/lib/example-timelines.d.ts +9 -0
  192. package/dist/lib/example-timelines.d.ts.map +1 -0
  193. package/dist/lib/example-timelines.js +25 -0
  194. package/dist/lib/example-timelines.js.map +1 -0
  195. package/dist/lib/extension-dist.d.ts +24 -0
  196. package/dist/lib/extension-dist.d.ts.map +1 -0
  197. package/dist/lib/extension-dist.js +67 -0
  198. package/dist/lib/extension-dist.js.map +1 -0
  199. package/dist/lib/external-asset-lookup.d.ts +30 -0
  200. package/dist/lib/external-asset-lookup.d.ts.map +1 -0
  201. package/dist/lib/external-asset-lookup.js +99 -0
  202. package/dist/lib/external-asset-lookup.js.map +1 -0
  203. package/dist/lib/external-assets.d.ts +13 -0
  204. package/dist/lib/external-assets.d.ts.map +1 -0
  205. package/dist/lib/external-assets.js +46 -0
  206. package/dist/lib/external-assets.js.map +1 -0
  207. package/dist/lib/fly-replay.d.ts +34 -0
  208. package/dist/lib/fly-replay.d.ts.map +1 -0
  209. package/dist/lib/fly-replay.js +111 -0
  210. package/dist/lib/fly-replay.js.map +1 -0
  211. package/dist/lib/http-rate-limit.d.ts +32 -0
  212. package/dist/lib/http-rate-limit.d.ts.map +1 -0
  213. package/dist/lib/http-rate-limit.js +47 -0
  214. package/dist/lib/http-rate-limit.js.map +1 -0
  215. package/dist/lib/instance-id.d.ts +25 -0
  216. package/dist/lib/instance-id.d.ts.map +1 -0
  217. package/dist/lib/instance-id.js +44 -0
  218. package/dist/lib/instance-id.js.map +1 -0
  219. package/dist/lib/link-codes.d.ts +82 -0
  220. package/dist/lib/link-codes.d.ts.map +1 -0
  221. package/dist/lib/link-codes.js +100 -0
  222. package/dist/lib/link-codes.js.map +1 -0
  223. package/dist/lib/local-asset-upload.d.ts +5 -0
  224. package/dist/lib/local-asset-upload.d.ts.map +1 -0
  225. package/dist/lib/local-asset-upload.js +69 -0
  226. package/dist/lib/local-asset-upload.js.map +1 -0
  227. package/dist/lib/local-file-access.d.ts +31 -0
  228. package/dist/lib/local-file-access.d.ts.map +1 -0
  229. package/dist/lib/local-file-access.js +169 -0
  230. package/dist/lib/local-file-access.js.map +1 -0
  231. package/dist/lib/localhost-trust.d.ts +59 -0
  232. package/dist/lib/localhost-trust.d.ts.map +1 -0
  233. package/dist/lib/localhost-trust.js +139 -0
  234. package/dist/lib/localhost-trust.js.map +1 -0
  235. package/dist/lib/mcp-mount.d.ts +25 -0
  236. package/dist/lib/mcp-mount.d.ts.map +1 -0
  237. package/dist/lib/mcp-mount.js +32 -0
  238. package/dist/lib/mcp-mount.js.map +1 -0
  239. package/dist/lib/media-size.d.ts +21 -0
  240. package/dist/lib/media-size.d.ts.map +1 -0
  241. package/dist/lib/media-size.js +48 -0
  242. package/dist/lib/media-size.js.map +1 -0
  243. package/dist/lib/media.d.ts +38 -0
  244. package/dist/lib/media.d.ts.map +1 -0
  245. package/dist/lib/media.js +146 -0
  246. package/dist/lib/media.js.map +1 -0
  247. package/dist/lib/package-asset-export.d.ts +83 -0
  248. package/dist/lib/package-asset-export.d.ts.map +1 -0
  249. package/dist/lib/package-asset-export.js +212 -0
  250. package/dist/lib/package-asset-export.js.map +1 -0
  251. package/dist/lib/package-assets.d.ts +41 -0
  252. package/dist/lib/package-assets.d.ts.map +1 -0
  253. package/dist/lib/package-assets.js +155 -0
  254. package/dist/lib/package-assets.js.map +1 -0
  255. package/dist/lib/project-delete.d.ts +11 -0
  256. package/dist/lib/project-delete.d.ts.map +1 -0
  257. package/dist/lib/project-delete.js +67 -0
  258. package/dist/lib/project-delete.js.map +1 -0
  259. package/dist/lib/project-document-copy.d.ts +31 -0
  260. package/dist/lib/project-document-copy.d.ts.map +1 -0
  261. package/dist/lib/project-document-copy.js +473 -0
  262. package/dist/lib/project-document-copy.js.map +1 -0
  263. package/dist/lib/public-app-assets.d.ts +8 -0
  264. package/dist/lib/public-app-assets.d.ts.map +1 -0
  265. package/dist/lib/public-app-assets.js +77 -0
  266. package/dist/lib/public-app-assets.js.map +1 -0
  267. package/dist/lib/public-routes.d.ts +95 -0
  268. package/dist/lib/public-routes.d.ts.map +1 -0
  269. package/dist/lib/public-routes.js +154 -0
  270. package/dist/lib/public-routes.js.map +1 -0
  271. package/dist/lib/runtime-detection.d.ts +17 -0
  272. package/dist/lib/runtime-detection.d.ts.map +1 -0
  273. package/dist/lib/runtime-detection.js +90 -0
  274. package/dist/lib/runtime-detection.js.map +1 -0
  275. package/dist/lib/storage-access.d.ts +21 -0
  276. package/dist/lib/storage-access.d.ts.map +1 -0
  277. package/dist/lib/storage-access.js +74 -0
  278. package/dist/lib/storage-access.js.map +1 -0
  279. package/dist/lib/storage.d.ts +9 -0
  280. package/dist/lib/storage.d.ts.map +1 -0
  281. package/dist/lib/storage.js +28 -0
  282. package/dist/lib/storage.js.map +1 -0
  283. package/dist/lib/storyboard-export.d.ts +64 -0
  284. package/dist/lib/storyboard-export.d.ts.map +1 -0
  285. package/dist/lib/storyboard-export.js +183 -0
  286. package/dist/lib/storyboard-export.js.map +1 -0
  287. package/dist/lib/style-presets.d.ts +34 -0
  288. package/dist/lib/style-presets.d.ts.map +1 -0
  289. package/dist/lib/style-presets.js +62 -0
  290. package/dist/lib/style-presets.js.map +1 -0
  291. package/dist/lib/temp-url-resolver.d.ts +35 -0
  292. package/dist/lib/temp-url-resolver.d.ts.map +1 -0
  293. package/dist/lib/temp-url-resolver.js +88 -0
  294. package/dist/lib/temp-url-resolver.js.map +1 -0
  295. package/dist/lib/thumbnail.d.ts +74 -0
  296. package/dist/lib/thumbnail.d.ts.map +1 -0
  297. package/dist/lib/thumbnail.js +302 -0
  298. package/dist/lib/thumbnail.js.map +1 -0
  299. package/dist/lib/timeline-bundle.d.ts +1689 -0
  300. package/dist/lib/timeline-bundle.d.ts.map +1 -0
  301. package/dist/lib/timeline-bundle.js +330 -0
  302. package/dist/lib/timeline-bundle.js.map +1 -0
  303. package/dist/lib/video-proxy.d.ts +114 -0
  304. package/dist/lib/video-proxy.d.ts.map +1 -0
  305. package/dist/lib/video-proxy.js +545 -0
  306. package/dist/lib/video-proxy.js.map +1 -0
  307. package/dist/lib/wire-values.d.ts +31 -0
  308. package/dist/lib/wire-values.d.ts.map +1 -0
  309. package/dist/lib/wire-values.js +49 -0
  310. package/dist/lib/wire-values.js.map +1 -0
  311. package/dist/lib/workflow-bundle.d.ts +102 -0
  312. package/dist/lib/workflow-bundle.d.ts.map +1 -0
  313. package/dist/lib/workflow-bundle.js +306 -0
  314. package/dist/lib/workflow-bundle.js.map +1 -0
  315. package/dist/lib/workflow-service.d.ts +82 -0
  316. package/dist/lib/workflow-service.d.ts.map +1 -0
  317. package/dist/lib/workflow-service.js +194 -0
  318. package/dist/lib/workflow-service.js.map +1 -0
  319. package/dist/lib/workflow-workspace.d.ts +20 -0
  320. package/dist/lib/workflow-workspace.d.ts.map +1 -0
  321. package/dist/lib/workflow-workspace.js +65 -0
  322. package/dist/lib/workflow-workspace.js.map +1 -0
  323. package/dist/lib/ws-connection-health.d.ts +10 -0
  324. package/dist/lib/ws-connection-health.d.ts.map +1 -0
  325. package/dist/lib/ws-connection-health.js +38 -0
  326. package/dist/lib/ws-connection-health.js.map +1 -0
  327. package/dist/lib/ws-rate-limit.d.ts +22 -0
  328. package/dist/lib/ws-rate-limit.d.ts.map +1 -0
  329. package/dist/lib/ws-rate-limit.js +45 -0
  330. package/dist/lib/ws-rate-limit.js.map +1 -0
  331. package/dist/lib/ws-upgrade.d.ts +40 -0
  332. package/dist/lib/ws-upgrade.d.ts.map +1 -0
  333. package/dist/lib/ws-upgrade.js +66 -0
  334. package/dist/lib/ws-upgrade.js.map +1 -0
  335. package/dist/lib/zip-stream.d.ts +46 -0
  336. package/dist/lib/zip-stream.d.ts.map +1 -0
  337. package/dist/lib/zip-stream.js +140 -0
  338. package/dist/lib/zip-stream.js.map +1 -0
  339. package/dist/mcp-agent-tools.d.ts +56 -0
  340. package/dist/mcp-agent-tools.d.ts.map +1 -0
  341. package/dist/mcp-agent-tools.js +1216 -0
  342. package/dist/mcp-agent-tools.js.map +1 -0
  343. package/dist/mcp-server.d.ts +56 -7
  344. package/dist/mcp-server.d.ts.map +1 -1
  345. package/dist/mcp-server.js +255 -762
  346. package/dist/mcp-server.js.map +1 -1
  347. package/dist/mcp-tool-deps.d.ts +20 -0
  348. package/dist/mcp-tool-deps.d.ts.map +1 -0
  349. package/dist/mcp-tool-deps.js +61 -0
  350. package/dist/mcp-tool-deps.js.map +1 -0
  351. package/dist/messagepack.d.ts +7 -0
  352. package/dist/messagepack.d.ts.map +1 -0
  353. package/dist/messagepack.js +19 -0
  354. package/dist/messagepack.js.map +1 -0
  355. package/dist/model-download-runtime.d.ts +9 -0
  356. package/dist/model-download-runtime.d.ts.map +1 -0
  357. package/dist/model-download-runtime.js +77 -0
  358. package/dist/model-download-runtime.js.map +1 -0
  359. package/dist/model-execution-availability.d.ts +14 -0
  360. package/dist/model-execution-availability.d.ts.map +1 -0
  361. package/dist/model-execution-availability.js +161 -0
  362. package/dist/model-execution-availability.js.map +1 -0
  363. package/dist/models-api.d.ts +51 -5
  364. package/dist/models-api.d.ts.map +1 -1
  365. package/dist/models-api.js +160 -690
  366. package/dist/models-api.js.map +1 -1
  367. package/dist/node-registry-setup.d.ts +84 -0
  368. package/dist/node-registry-setup.d.ts.map +1 -0
  369. package/dist/node-registry-setup.js +256 -0
  370. package/dist/node-registry-setup.js.map +1 -0
  371. package/dist/oauth/cimd.d.ts +28 -0
  372. package/dist/oauth/cimd.d.ts.map +1 -0
  373. package/dist/oauth/cimd.js +177 -0
  374. package/dist/oauth/cimd.js.map +1 -0
  375. package/dist/oauth/gate.d.ts +38 -0
  376. package/dist/oauth/gate.d.ts.map +1 -0
  377. package/dist/oauth/gate.js +77 -0
  378. package/dist/oauth/gate.js.map +1 -0
  379. package/dist/oauth/metadata.d.ts +35 -0
  380. package/dist/oauth/metadata.d.ts.map +1 -0
  381. package/dist/oauth/metadata.js +56 -0
  382. package/dist/oauth/metadata.js.map +1 -0
  383. package/dist/oauth/pending-store.d.ts +79 -0
  384. package/dist/oauth/pending-store.d.ts.map +1 -0
  385. package/dist/oauth/pending-store.js +133 -0
  386. package/dist/oauth/pending-store.js.map +1 -0
  387. package/dist/oauth/pkce.d.ts +16 -0
  388. package/dist/oauth/pkce.d.ts.map +1 -0
  389. package/dist/oauth/pkce.js +29 -0
  390. package/dist/oauth/pkce.js.map +1 -0
  391. package/dist/oauth/validate.d.ts +25 -0
  392. package/dist/oauth/validate.d.ts.map +1 -0
  393. package/dist/oauth/validate.js +62 -0
  394. package/dist/oauth/validate.js.map +1 -0
  395. package/dist/oauth/www-authenticate.d.ts +9 -0
  396. package/dist/oauth/www-authenticate.d.ts.map +1 -0
  397. package/dist/oauth/www-authenticate.js +33 -0
  398. package/dist/oauth/www-authenticate.js.map +1 -0
  399. package/dist/oauth-api.d.ts +19 -0
  400. package/dist/oauth-api.d.ts.map +1 -1
  401. package/dist/oauth-api.js +531 -12
  402. package/dist/oauth-api.js.map +1 -1
  403. package/dist/openai-api.d.ts.map +1 -1
  404. package/dist/openai-api.js +4 -9
  405. package/dist/openai-api.js.map +1 -1
  406. package/dist/pack-snapshot.d.ts +24 -0
  407. package/dist/pack-snapshot.d.ts.map +1 -0
  408. package/dist/pack-snapshot.js +35 -0
  409. package/dist/pack-snapshot.js.map +1 -0
  410. package/dist/plugins/websocket.d.ts +21 -4
  411. package/dist/plugins/websocket.d.ts.map +1 -1
  412. package/dist/plugins/websocket.js +136 -290
  413. package/dist/plugins/websocket.js.map +1 -1
  414. package/dist/resolve-media-urls.d.ts +17 -3
  415. package/dist/resolve-media-urls.d.ts.map +1 -1
  416. package/dist/resolve-media-urls.js +117 -31
  417. package/dist/resolve-media-urls.js.map +1 -1
  418. package/dist/resource-events.d.ts +28 -0
  419. package/dist/resource-events.d.ts.map +1 -0
  420. package/dist/resource-events.js +20 -0
  421. package/dist/resource-events.js.map +1 -0
  422. package/dist/routes/account.d.ts +100 -0
  423. package/dist/routes/account.d.ts.map +1 -0
  424. package/dist/routes/account.js +197 -0
  425. package/dist/routes/account.js.map +1 -0
  426. package/dist/routes/applications.d.ts +36 -0
  427. package/dist/routes/applications.d.ts.map +1 -0
  428. package/dist/routes/applications.js +183 -0
  429. package/dist/routes/applications.js.map +1 -0
  430. package/dist/routes/assets.d.ts +3 -3
  431. package/dist/routes/assets.d.ts.map +1 -1
  432. package/dist/routes/assets.js +78 -44
  433. package/dist/routes/assets.js.map +1 -1
  434. package/dist/routes/atlascloud-webhook.d.ts +93 -0
  435. package/dist/routes/atlascloud-webhook.d.ts.map +1 -0
  436. package/dist/routes/atlascloud-webhook.js +369 -0
  437. package/dist/routes/atlascloud-webhook.js.map +1 -0
  438. package/dist/routes/collections.d.ts.map +1 -1
  439. package/dist/routes/config.d.ts +26 -0
  440. package/dist/routes/config.d.ts.map +1 -0
  441. package/dist/routes/config.js +64 -0
  442. package/dist/routes/config.js.map +1 -0
  443. package/dist/routes/documents.d.ts +27 -0
  444. package/dist/routes/documents.d.ts.map +1 -0
  445. package/dist/routes/documents.js +155 -0
  446. package/dist/routes/documents.js.map +1 -0
  447. package/dist/routes/fal-credits.d.ts +4 -0
  448. package/dist/routes/fal-credits.d.ts.map +1 -0
  449. package/dist/routes/fal-credits.js +101 -0
  450. package/dist/routes/fal-credits.js.map +1 -0
  451. package/dist/routes/fal-pricing-estimate.d.ts +4 -0
  452. package/dist/routes/fal-pricing-estimate.d.ts.map +1 -0
  453. package/dist/routes/fal-pricing-estimate.js +114 -0
  454. package/dist/routes/fal-pricing-estimate.js.map +1 -0
  455. package/dist/routes/fal-pricing.d.ts +4 -0
  456. package/dist/routes/fal-pricing.d.ts.map +1 -0
  457. package/dist/routes/fal-pricing.js +93 -0
  458. package/dist/routes/fal-pricing.js.map +1 -0
  459. package/dist/routes/fal-webhook.d.ts +102 -0
  460. package/dist/routes/fal-webhook.d.ts.map +1 -0
  461. package/dist/routes/fal-webhook.js +379 -0
  462. package/dist/routes/fal-webhook.js.map +1 -0
  463. package/dist/routes/files.d.ts.map +1 -1
  464. package/dist/routes/files.js +4 -3
  465. package/dist/routes/files.js.map +1 -1
  466. package/dist/routes/health.d.ts +1 -0
  467. package/dist/routes/health.d.ts.map +1 -1
  468. package/dist/routes/health.js +41 -7
  469. package/dist/routes/health.js.map +1 -1
  470. package/dist/routes/integrations.d.ts +39 -0
  471. package/dist/routes/integrations.d.ts.map +1 -0
  472. package/dist/routes/integrations.js +211 -0
  473. package/dist/routes/integrations.js.map +1 -0
  474. package/dist/routes/js-scripts.d.ts +26 -0
  475. package/dist/routes/js-scripts.d.ts.map +1 -0
  476. package/dist/routes/js-scripts.js +116 -0
  477. package/dist/routes/js-scripts.js.map +1 -0
  478. package/dist/routes/kie-credits.d.ts +4 -0
  479. package/dist/routes/kie-credits.d.ts.map +1 -0
  480. package/dist/routes/kie-credits.js +93 -0
  481. package/dist/routes/kie-credits.js.map +1 -0
  482. package/dist/routes/kie-pricing.d.ts +4 -0
  483. package/dist/routes/kie-pricing.d.ts.map +1 -0
  484. package/dist/routes/kie-pricing.js +45 -0
  485. package/dist/routes/kie-pricing.js.map +1 -0
  486. package/dist/routes/kie-webhook.d.ts +4 -0
  487. package/dist/routes/kie-webhook.d.ts.map +1 -0
  488. package/dist/routes/kie-webhook.js +70 -0
  489. package/dist/routes/kie-webhook.js.map +1 -0
  490. package/dist/routes/nodes.d.ts.map +1 -1
  491. package/dist/routes/nodes.js +6 -59
  492. package/dist/routes/nodes.js.map +1 -1
  493. package/dist/routes/oauth-as.d.ts +30 -0
  494. package/dist/routes/oauth-as.d.ts.map +1 -0
  495. package/dist/routes/oauth-as.js +412 -0
  496. package/dist/routes/oauth-as.js.map +1 -0
  497. package/dist/routes/oauth.d.ts.map +1 -1
  498. package/dist/routes/openai.d.ts.map +1 -1
  499. package/dist/routes/public-apps.d.ts +27 -0
  500. package/dist/routes/public-apps.d.ts.map +1 -0
  501. package/dist/routes/public-apps.js +99 -0
  502. package/dist/routes/public-apps.js.map +1 -0
  503. package/dist/routes/sandbox-modules.d.ts +17 -0
  504. package/dist/routes/sandbox-modules.d.ts.map +1 -0
  505. package/dist/routes/sandbox-modules.js +85 -0
  506. package/dist/routes/sandbox-modules.js.map +1 -0
  507. package/dist/routes/sdk-v1.d.ts +24 -0
  508. package/dist/routes/sdk-v1.d.ts.map +1 -0
  509. package/dist/routes/sdk-v1.js +320 -0
  510. package/dist/routes/sdk-v1.js.map +1 -0
  511. package/dist/routes/storage.d.ts.map +1 -1
  512. package/dist/routes/storyboards.d.ts +16 -0
  513. package/dist/routes/storyboards.d.ts.map +1 -0
  514. package/dist/routes/storyboards.js +97 -0
  515. package/dist/routes/storyboards.js.map +1 -0
  516. package/dist/routes/timeline-animations.d.ts +23 -0
  517. package/dist/routes/timeline-animations.d.ts.map +1 -0
  518. package/dist/routes/timeline-animations.js +99 -0
  519. package/dist/routes/timeline-animations.js.map +1 -0
  520. package/dist/routes/timeline-audio-bake.d.ts +51 -0
  521. package/dist/routes/timeline-audio-bake.d.ts.map +1 -0
  522. package/dist/routes/timeline-audio-bake.js +110 -0
  523. package/dist/routes/timeline-audio-bake.js.map +1 -0
  524. package/dist/routes/timeline-fonts.d.ts +29 -0
  525. package/dist/routes/timeline-fonts.d.ts.map +1 -0
  526. package/dist/routes/timeline-fonts.js +64 -0
  527. package/dist/routes/timeline-fonts.js.map +1 -0
  528. package/dist/routes/timeline-isolate-subject.d.ts +55 -0
  529. package/dist/routes/timeline-isolate-subject.d.ts.map +1 -0
  530. package/dist/routes/timeline-isolate-subject.js +128 -0
  531. package/dist/routes/timeline-isolate-subject.js.map +1 -0
  532. package/dist/routes/timeline-track-object.d.ts +39 -0
  533. package/dist/routes/timeline-track-object.d.ts.map +1 -0
  534. package/dist/routes/timeline-track-object.js +97 -0
  535. package/dist/routes/timeline-track-object.js.map +1 -0
  536. package/dist/routes/timelines.d.ts +18 -0
  537. package/dist/routes/timelines.d.ts.map +1 -0
  538. package/dist/routes/timelines.js +191 -0
  539. package/dist/routes/timelines.js.map +1 -0
  540. package/dist/routes/workflows.d.ts +6 -9
  541. package/dist/routes/workflows.d.ts.map +1 -1
  542. package/dist/routes/workflows.js +100 -11
  543. package/dist/routes/workflows.js.map +1 -1
  544. package/dist/routes/workspace.d.ts.map +1 -1
  545. package/dist/run-supervisor.d.ts +30 -0
  546. package/dist/run-supervisor.d.ts.map +1 -0
  547. package/dist/run-supervisor.js +86 -0
  548. package/dist/run-supervisor.js.map +1 -0
  549. package/dist/sandbox-catalog.d.ts +28 -0
  550. package/dist/sandbox-catalog.d.ts.map +1 -0
  551. package/dist/sandbox-catalog.js +74 -0
  552. package/dist/sandbox-catalog.js.map +1 -0
  553. package/dist/screenshot-projects.d.ts +27 -0
  554. package/dist/screenshot-projects.d.ts.map +1 -0
  555. package/dist/screenshot-projects.js +880 -0
  556. package/dist/screenshot-projects.js.map +1 -0
  557. package/dist/screenshot-server.js +947 -43
  558. package/dist/screenshot-server.js.map +1 -1
  559. package/dist/sdk/sdk-cached-model-inventory.d.ts +21 -0
  560. package/dist/sdk/sdk-cached-model-inventory.d.ts.map +1 -0
  561. package/dist/sdk/sdk-cached-model-inventory.js +51 -0
  562. package/dist/sdk/sdk-cached-model-inventory.js.map +1 -0
  563. package/dist/sdk/sdk-capabilities-service.d.ts +32 -0
  564. package/dist/sdk/sdk-capabilities-service.d.ts.map +1 -0
  565. package/dist/sdk/sdk-capabilities-service.js +47 -0
  566. package/dist/sdk/sdk-capabilities-service.js.map +1 -0
  567. package/dist/sdk/sdk-execution-readiness-probe.d.ts +19 -0
  568. package/dist/sdk/sdk-execution-readiness-probe.d.ts.map +1 -0
  569. package/dist/sdk/sdk-execution-readiness-probe.js +90 -0
  570. package/dist/sdk/sdk-execution-readiness-probe.js.map +1 -0
  571. package/dist/sdk/sdk-execution-target-readiness.d.ts +15 -0
  572. package/dist/sdk/sdk-execution-target-readiness.d.ts.map +1 -0
  573. package/dist/sdk/sdk-execution-target-readiness.js +50 -0
  574. package/dist/sdk/sdk-execution-target-readiness.js.map +1 -0
  575. package/dist/sdk/sdk-feature-flags.d.ts +18 -0
  576. package/dist/sdk/sdk-feature-flags.d.ts.map +1 -0
  577. package/dist/sdk/sdk-feature-flags.js +30 -0
  578. package/dist/sdk/sdk-feature-flags.js.map +1 -0
  579. package/dist/sdk/sdk-huggingface-download-state.d.ts +15 -0
  580. package/dist/sdk/sdk-huggingface-download-state.d.ts.map +1 -0
  581. package/dist/sdk/sdk-huggingface-download-state.js +25 -0
  582. package/dist/sdk/sdk-huggingface-download-state.js.map +1 -0
  583. package/dist/sdk/sdk-live-runner-registry.d.ts +21 -0
  584. package/dist/sdk/sdk-live-runner-registry.d.ts.map +1 -0
  585. package/dist/sdk/sdk-live-runner-registry.js +26 -0
  586. package/dist/sdk/sdk-live-runner-registry.js.map +1 -0
  587. package/dist/sdk/sdk-model-catalog-service.d.ts +20 -0
  588. package/dist/sdk/sdk-model-catalog-service.d.ts.map +1 -0
  589. package/dist/sdk/sdk-model-catalog-service.js +219 -0
  590. package/dist/sdk/sdk-model-catalog-service.js.map +1 -0
  591. package/dist/sdk/sdk-model-download-service.d.ts +39 -0
  592. package/dist/sdk/sdk-model-download-service.d.ts.map +1 -0
  593. package/dist/sdk/sdk-model-download-service.js +274 -0
  594. package/dist/sdk/sdk-model-download-service.js.map +1 -0
  595. package/dist/sdk/sdk-model-requirement-probe.d.ts +30 -0
  596. package/dist/sdk/sdk-model-requirement-probe.d.ts.map +1 -0
  597. package/dist/sdk/sdk-model-requirement-probe.js +120 -0
  598. package/dist/sdk/sdk-model-requirement-probe.js.map +1 -0
  599. package/dist/sdk/sdk-node-package-requirement-probe.d.ts +20 -0
  600. package/dist/sdk/sdk-node-package-requirement-probe.d.ts.map +1 -0
  601. package/dist/sdk/sdk-node-package-requirement-probe.js +44 -0
  602. package/dist/sdk/sdk-node-package-requirement-probe.js.map +1 -0
  603. package/dist/sdk/sdk-node-type-inventory-service.d.ts +11 -0
  604. package/dist/sdk/sdk-node-type-inventory-service.d.ts.map +1 -0
  605. package/dist/sdk/sdk-node-type-inventory-service.js +36 -0
  606. package/dist/sdk/sdk-node-type-inventory-service.js.map +1 -0
  607. package/dist/sdk/sdk-preflight-orchestrator.d.ts +54 -0
  608. package/dist/sdk/sdk-preflight-orchestrator.d.ts.map +1 -0
  609. package/dist/sdk/sdk-preflight-orchestrator.js +63 -0
  610. package/dist/sdk/sdk-preflight-orchestrator.js.map +1 -0
  611. package/dist/sdk/sdk-preflight-requirement-resolver.d.ts +35 -0
  612. package/dist/sdk/sdk-preflight-requirement-resolver.d.ts.map +1 -0
  613. package/dist/sdk/sdk-preflight-requirement-resolver.js +67 -0
  614. package/dist/sdk/sdk-preflight-requirement-resolver.js.map +1 -0
  615. package/dist/sdk/sdk-preflight-service.d.ts +61 -0
  616. package/dist/sdk/sdk-preflight-service.d.ts.map +1 -0
  617. package/dist/sdk/sdk-preflight-service.js +104 -0
  618. package/dist/sdk/sdk-preflight-service.js.map +1 -0
  619. package/dist/sdk/sdk-preflight-workflow-source.d.ts +18 -0
  620. package/dist/sdk/sdk-preflight-workflow-source.d.ts.map +1 -0
  621. package/dist/sdk/sdk-preflight-workflow-source.js +42 -0
  622. package/dist/sdk/sdk-preflight-workflow-source.js.map +1 -0
  623. package/dist/sdk/sdk-route-policy.d.ts +3 -0
  624. package/dist/sdk/sdk-route-policy.d.ts.map +1 -0
  625. package/dist/sdk/sdk-route-policy.js +18 -0
  626. package/dist/sdk/sdk-route-policy.js.map +1 -0
  627. package/dist/sdk/sdk-runtime-capabilities-service.d.ts +60 -0
  628. package/dist/sdk/sdk-runtime-capabilities-service.d.ts.map +1 -0
  629. package/dist/sdk/sdk-runtime-capabilities-service.js +30 -0
  630. package/dist/sdk/sdk-runtime-capabilities-service.js.map +1 -0
  631. package/dist/sdk/sdk-runtime-requirement-probe.d.ts +13 -0
  632. package/dist/sdk/sdk-runtime-requirement-probe.d.ts.map +1 -0
  633. package/dist/sdk/sdk-runtime-requirement-probe.js +55 -0
  634. package/dist/sdk/sdk-runtime-requirement-probe.js.map +1 -0
  635. package/dist/sdk/sdk-static-preflight-service.d.ts +66 -0
  636. package/dist/sdk/sdk-static-preflight-service.d.ts.map +1 -0
  637. package/dist/sdk/sdk-static-preflight-service.js +492 -0
  638. package/dist/sdk/sdk-static-preflight-service.js.map +1 -0
  639. package/dist/sdk/sdk-temporary-asset-service.d.ts +18 -0
  640. package/dist/sdk/sdk-temporary-asset-service.d.ts.map +1 -0
  641. package/dist/sdk/sdk-temporary-asset-service.js +33 -0
  642. package/dist/sdk/sdk-temporary-asset-service.js.map +1 -0
  643. package/dist/sdk/sdk-temporary-asset-upload-http-handler.d.ts +9 -0
  644. package/dist/sdk/sdk-temporary-asset-upload-http-handler.d.ts.map +1 -0
  645. package/dist/sdk/sdk-temporary-asset-upload-http-handler.js +65 -0
  646. package/dist/sdk/sdk-temporary-asset-upload-http-handler.js.map +1 -0
  647. package/dist/sdk/sdk-v1-handler-map.d.ts +44 -0
  648. package/dist/sdk/sdk-v1-handler-map.d.ts.map +1 -0
  649. package/dist/sdk/sdk-v1-handler-map.js +37 -0
  650. package/dist/sdk/sdk-v1-handler-map.js.map +1 -0
  651. package/dist/sdk/sdk-v1-service-error.d.ts +21 -0
  652. package/dist/sdk/sdk-v1-service-error.d.ts.map +1 -0
  653. package/dist/sdk/sdk-v1-service-error.js +62 -0
  654. package/dist/sdk/sdk-v1-service-error.js.map +1 -0
  655. package/dist/sdk/sdk-v1-service.d.ts +74 -0
  656. package/dist/sdk/sdk-v1-service.d.ts.map +1 -0
  657. package/dist/sdk/sdk-v1-service.js +219 -0
  658. package/dist/sdk/sdk-v1-service.js.map +1 -0
  659. package/dist/sdk/sdk-worker-readiness-adapter.d.ts +22 -0
  660. package/dist/sdk/sdk-worker-readiness-adapter.d.ts.map +1 -0
  661. package/dist/sdk/sdk-worker-readiness-adapter.js +29 -0
  662. package/dist/sdk/sdk-worker-readiness-adapter.js.map +1 -0
  663. package/dist/server.js +1019 -201
  664. package/dist/server.js.map +1 -1
  665. package/dist/session/asset-autosave.d.ts +80 -0
  666. package/dist/session/asset-autosave.d.ts.map +1 -0
  667. package/dist/session/asset-autosave.js +456 -0
  668. package/dist/session/asset-autosave.js.map +1 -0
  669. package/dist/session/chat-compaction.d.ts +107 -0
  670. package/dist/session/chat-compaction.d.ts.map +1 -0
  671. package/dist/session/chat-compaction.js +191 -0
  672. package/dist/session/chat-compaction.js.map +1 -0
  673. package/dist/session/chat-history.d.ts +75 -0
  674. package/dist/session/chat-history.d.ts.map +1 -0
  675. package/dist/session/chat-history.js +194 -0
  676. package/dist/session/chat-history.js.map +1 -0
  677. package/dist/session/chat-prompt.d.ts +45 -0
  678. package/dist/session/chat-prompt.d.ts.map +1 -0
  679. package/dist/session/chat-prompt.js +480 -0
  680. package/dist/session/chat-prompt.js.map +1 -0
  681. package/dist/session/chat-turn.d.ts +336 -0
  682. package/dist/session/chat-turn.d.ts.map +1 -0
  683. package/dist/session/chat-turn.js +3516 -0
  684. package/dist/session/chat-turn.js.map +1 -0
  685. package/dist/session/client-session.d.ts +59 -0
  686. package/dist/session/client-session.d.ts.map +1 -0
  687. package/dist/session/client-session.js +2 -0
  688. package/dist/session/client-session.js.map +1 -0
  689. package/dist/session/commands.d.ts +133 -0
  690. package/dist/session/commands.d.ts.map +1 -0
  691. package/dist/session/commands.js +778 -0
  692. package/dist/session/commands.js.map +1 -0
  693. package/dist/session/inference.d.ts +213 -0
  694. package/dist/session/inference.d.ts.map +1 -0
  695. package/dist/session/inference.js +1072 -0
  696. package/dist/session/inference.js.map +1 -0
  697. package/dist/session/job-execution.d.ts +477 -0
  698. package/dist/session/job-execution.d.ts.map +1 -0
  699. package/dist/session/job-execution.js +2089 -0
  700. package/dist/session/job-execution.js.map +1 -0
  701. package/dist/session/media-generation.d.ts +94 -0
  702. package/dist/session/media-generation.d.ts.map +1 -0
  703. package/dist/session/media-generation.js +234 -0
  704. package/dist/session/media-generation.js.map +1 -0
  705. package/dist/session/model-interfaces.d.ts +27 -0
  706. package/dist/session/model-interfaces.d.ts.map +1 -0
  707. package/dist/session/model-interfaces.js +132 -0
  708. package/dist/session/model-interfaces.js.map +1 -0
  709. package/dist/session/sanitize.d.ts +7 -0
  710. package/dist/session/sanitize.d.ts.map +1 -0
  711. package/dist/session/sanitize.js +64 -0
  712. package/dist/session/sanitize.js.map +1 -0
  713. package/dist/settings-registry.d.ts +6 -15
  714. package/dist/settings-registry.d.ts.map +1 -1
  715. package/dist/settings-registry.js +6 -103
  716. package/dist/settings-registry.js.map +1 -1
  717. package/dist/storage-api.d.ts +20 -0
  718. package/dist/storage-api.d.ts.map +1 -1
  719. package/dist/storage-api.js +260 -77
  720. package/dist/storage-api.js.map +1 -1
  721. package/dist/storage-retention.d.ts +9 -0
  722. package/dist/storage-retention.d.ts.map +1 -0
  723. package/dist/storage-retention.js +74 -0
  724. package/dist/storage-retention.js.map +1 -0
  725. package/dist/system-stats.d.ts +52 -0
  726. package/dist/system-stats.d.ts.map +1 -0
  727. package/dist/system-stats.js +134 -0
  728. package/dist/system-stats.js.map +1 -0
  729. package/dist/test-ui-server.d.ts +46 -0
  730. package/dist/test-ui-server.d.ts.map +1 -1
  731. package/dist/test-ui-server.js +188 -41
  732. package/dist/test-ui-server.js.map +1 -1
  733. package/dist/triggers/boot.d.ts +73 -0
  734. package/dist/triggers/boot.d.ts.map +1 -0
  735. package/dist/triggers/boot.js +149 -0
  736. package/dist/triggers/boot.js.map +1 -0
  737. package/dist/triggers/dispatcher.d.ts +234 -0
  738. package/dist/triggers/dispatcher.d.ts.map +1 -0
  739. package/dist/triggers/dispatcher.js +525 -0
  740. package/dist/triggers/dispatcher.js.map +1 -0
  741. package/dist/triggers/file-watch.d.ts +90 -0
  742. package/dist/triggers/file-watch.d.ts.map +1 -0
  743. package/dist/triggers/file-watch.js +405 -0
  744. package/dist/triggers/file-watch.js.map +1 -0
  745. package/dist/triggers/registration-sync.d.ts +34 -0
  746. package/dist/triggers/registration-sync.d.ts.map +1 -0
  747. package/dist/triggers/registration-sync.js +162 -0
  748. package/dist/triggers/registration-sync.js.map +1 -0
  749. package/dist/triggers/schedule-timing.d.ts +52 -0
  750. package/dist/triggers/schedule-timing.d.ts.map +1 -0
  751. package/dist/triggers/schedule-timing.js +90 -0
  752. package/dist/triggers/schedule-timing.js.map +1 -0
  753. package/dist/triggers/scheduler.d.ts +55 -0
  754. package/dist/triggers/scheduler.d.ts.map +1 -0
  755. package/dist/triggers/scheduler.js +122 -0
  756. package/dist/triggers/scheduler.js.map +1 -0
  757. package/dist/triggers/settle.d.ts +66 -0
  758. package/dist/triggers/settle.d.ts.map +1 -0
  759. package/dist/triggers/settle.js +99 -0
  760. package/dist/triggers/settle.js.map +1 -0
  761. package/dist/triggers/stores.d.ts +38 -0
  762. package/dist/triggers/stores.d.ts.map +1 -0
  763. package/dist/triggers/stores.js +168 -0
  764. package/dist/triggers/stores.js.map +1 -0
  765. package/dist/triggers/webhook-route.d.ts +49 -0
  766. package/dist/triggers/webhook-route.d.ts.map +1 -0
  767. package/dist/triggers/webhook-route.js +148 -0
  768. package/dist/triggers/webhook-route.js.map +1 -0
  769. package/dist/trpc/context.d.ts +52 -5
  770. package/dist/trpc/context.d.ts.map +1 -1
  771. package/dist/trpc/context.js +4 -1
  772. package/dist/trpc/context.js.map +1 -1
  773. package/dist/trpc/error-formatter.d.ts.map +1 -1
  774. package/dist/trpc/error-formatter.js +23 -2
  775. package/dist/trpc/error-formatter.js.map +1 -1
  776. package/dist/trpc/error-logging.d.ts +14 -0
  777. package/dist/trpc/error-logging.d.ts.map +1 -0
  778. package/dist/trpc/error-logging.js +27 -0
  779. package/dist/trpc/error-logging.js.map +1 -0
  780. package/dist/trpc/index.d.ts +2 -2
  781. package/dist/trpc/index.d.ts.map +1 -1
  782. package/dist/trpc/index.js +0 -2
  783. package/dist/trpc/index.js.map +1 -1
  784. package/dist/trpc/middleware.d.ts +6 -3
  785. package/dist/trpc/middleware.d.ts.map +1 -1
  786. package/dist/trpc/router.d.ts +29791 -1303
  787. package/dist/trpc/router.d.ts.map +1 -1
  788. package/dist/trpc/router.js +46 -3
  789. package/dist/trpc/router.js.map +1 -1
  790. package/dist/trpc/routers/agent-access.d.ts +149 -0
  791. package/dist/trpc/routers/agent-access.d.ts.map +1 -0
  792. package/dist/trpc/routers/agent-access.js +224 -0
  793. package/dist/trpc/routers/agent-access.js.map +1 -0
  794. package/dist/trpc/routers/applications.d.ts +1117 -0
  795. package/dist/trpc/routers/applications.d.ts.map +1 -0
  796. package/dist/trpc/routers/applications.js +218 -0
  797. package/dist/trpc/routers/applications.js.map +1 -0
  798. package/dist/trpc/routers/assets.d.ts +184 -42
  799. package/dist/trpc/routers/assets.d.ts.map +1 -1
  800. package/dist/trpc/routers/assets.js +499 -105
  801. package/dist/trpc/routers/assets.js.map +1 -1
  802. package/dist/trpc/routers/code-gen.d.ts +99 -0
  803. package/dist/trpc/routers/code-gen.d.ts.map +1 -0
  804. package/dist/trpc/routers/code-gen.js +164 -0
  805. package/dist/trpc/routers/code-gen.js.map +1 -0
  806. package/dist/trpc/routers/collections.d.ts +1 -26
  807. package/dist/trpc/routers/collections.d.ts.map +1 -1
  808. package/dist/trpc/routers/collections.js +145 -78
  809. package/dist/trpc/routers/collections.js.map +1 -1
  810. package/dist/trpc/routers/costs.d.ts +40 -96
  811. package/dist/trpc/routers/costs.d.ts.map +1 -1
  812. package/dist/trpc/routers/costs.js +14 -89
  813. package/dist/trpc/routers/costs.js.map +1 -1
  814. package/dist/trpc/routers/credits.d.ts +110 -0
  815. package/dist/trpc/routers/credits.d.ts.map +1 -0
  816. package/dist/trpc/routers/credits.js +69 -0
  817. package/dist/trpc/routers/credits.js.map +1 -0
  818. package/dist/trpc/routers/custom-providers.d.ts +88 -0
  819. package/dist/trpc/routers/custom-providers.d.ts.map +1 -0
  820. package/dist/trpc/routers/custom-providers.js +140 -0
  821. package/dist/trpc/routers/custom-providers.js.map +1 -0
  822. package/dist/trpc/routers/documents.d.ts +61 -0
  823. package/dist/trpc/routers/documents.d.ts.map +1 -0
  824. package/dist/trpc/routers/documents.js +23 -0
  825. package/dist/trpc/routers/documents.js.map +1 -0
  826. package/dist/trpc/routers/extension.d.ts +24 -0
  827. package/dist/trpc/routers/extension.d.ts.map +1 -0
  828. package/dist/trpc/routers/extension.js +28 -0
  829. package/dist/trpc/routers/extension.js.map +1 -0
  830. package/dist/trpc/routers/external-mcp.d.ts +108 -0
  831. package/dist/trpc/routers/external-mcp.d.ts.map +1 -0
  832. package/dist/trpc/routers/external-mcp.js +70 -0
  833. package/dist/trpc/routers/external-mcp.js.map +1 -0
  834. package/dist/trpc/routers/files.d.ts +9 -2
  835. package/dist/trpc/routers/files.d.ts.map +1 -1
  836. package/dist/trpc/routers/files.js +67 -37
  837. package/dist/trpc/routers/files.js.map +1 -1
  838. package/dist/trpc/routers/fonts.d.ts +30 -0
  839. package/dist/trpc/routers/fonts.d.ts.map +1 -0
  840. package/dist/trpc/routers/fonts.js +112 -0
  841. package/dist/trpc/routers/fonts.js.map +1 -0
  842. package/dist/trpc/routers/games.d.ts +7610 -0
  843. package/dist/trpc/routers/games.d.ts.map +1 -0
  844. package/dist/trpc/routers/games.js +456 -0
  845. package/dist/trpc/routers/games.js.map +1 -0
  846. package/dist/trpc/routers/integrations.d.ts +86 -0
  847. package/dist/trpc/routers/integrations.d.ts.map +1 -0
  848. package/dist/trpc/routers/integrations.js +129 -0
  849. package/dist/trpc/routers/integrations.js.map +1 -0
  850. package/dist/trpc/routers/jobs.d.ts +88 -27
  851. package/dist/trpc/routers/jobs.d.ts.map +1 -1
  852. package/dist/trpc/routers/jobs.js +113 -35
  853. package/dist/trpc/routers/jobs.js.map +1 -1
  854. package/dist/trpc/routers/js-scripts.d.ts +410 -0
  855. package/dist/trpc/routers/js-scripts.d.ts.map +1 -0
  856. package/dist/trpc/routers/js-scripts.js +303 -0
  857. package/dist/trpc/routers/js-scripts.js.map +1 -0
  858. package/dist/trpc/routers/mcp-config.d.ts +1 -1
  859. package/dist/trpc/routers/mcp-config.js +5 -3
  860. package/dist/trpc/routers/mcp-config.js.map +1 -1
  861. package/dist/trpc/routers/memories.d.ts +79 -0
  862. package/dist/trpc/routers/memories.d.ts.map +1 -0
  863. package/dist/trpc/routers/memories.js +66 -0
  864. package/dist/trpc/routers/memories.js.map +1 -0
  865. package/dist/trpc/routers/messages.d.ts +4 -77
  866. package/dist/trpc/routers/messages.d.ts.map +1 -1
  867. package/dist/trpc/routers/messages.js +9 -58
  868. package/dist/trpc/routers/messages.js.map +1 -1
  869. package/dist/trpc/routers/models.d.ts +1403 -238
  870. package/dist/trpc/routers/models.d.ts.map +1 -1
  871. package/dist/trpc/routers/models.js +532 -294
  872. package/dist/trpc/routers/models.js.map +1 -1
  873. package/dist/trpc/routers/nodes.d.ts +32 -16
  874. package/dist/trpc/routers/nodes.d.ts.map +1 -1
  875. package/dist/trpc/routers/nodes.js +70 -31
  876. package/dist/trpc/routers/nodes.js.map +1 -1
  877. package/dist/trpc/routers/packs.d.ts +184 -0
  878. package/dist/trpc/routers/packs.d.ts.map +1 -0
  879. package/dist/trpc/routers/packs.js +259 -0
  880. package/dist/trpc/routers/packs.js.map +1 -0
  881. package/dist/trpc/routers/projects.d.ts +422 -0
  882. package/dist/trpc/routers/projects.d.ts.map +1 -0
  883. package/dist/trpc/routers/projects.js +373 -0
  884. package/dist/trpc/routers/projects.js.map +1 -0
  885. package/dist/trpc/routers/resources.d.ts +120 -0
  886. package/dist/trpc/routers/resources.d.ts.map +1 -0
  887. package/dist/trpc/routers/resources.js +212 -0
  888. package/dist/trpc/routers/resources.js.map +1 -0
  889. package/dist/trpc/routers/scripts.d.ts +1116 -0
  890. package/dist/trpc/routers/scripts.d.ts.map +1 -0
  891. package/dist/trpc/routers/scripts.js +131 -0
  892. package/dist/trpc/routers/scripts.js.map +1 -0
  893. package/dist/trpc/routers/segmentation.d.ts +62 -0
  894. package/dist/trpc/routers/segmentation.d.ts.map +1 -0
  895. package/dist/trpc/routers/segmentation.js +146 -0
  896. package/dist/trpc/routers/segmentation.js.map +1 -0
  897. package/dist/trpc/routers/settings.d.ts +177 -10
  898. package/dist/trpc/routers/settings.d.ts.map +1 -1
  899. package/dist/trpc/routers/settings.js +123 -33
  900. package/dist/trpc/routers/settings.js.map +1 -1
  901. package/dist/trpc/routers/sketch.d.ts +854 -0
  902. package/dist/trpc/routers/sketch.d.ts.map +1 -0
  903. package/dist/trpc/routers/sketch.js +617 -0
  904. package/dist/trpc/routers/sketch.js.map +1 -0
  905. package/dist/trpc/routers/skills.d.ts +76 -22
  906. package/dist/trpc/routers/skills.d.ts.map +1 -1
  907. package/dist/trpc/routers/skills.js +195 -170
  908. package/dist/trpc/routers/skills.js.map +1 -1
  909. package/dist/trpc/routers/storage.d.ts +3 -30
  910. package/dist/trpc/routers/storage.d.ts.map +1 -1
  911. package/dist/trpc/routers/storage.js +60 -117
  912. package/dist/trpc/routers/storage.js.map +1 -1
  913. package/dist/trpc/routers/storyboards.d.ts +5907 -0
  914. package/dist/trpc/routers/storyboards.d.ts.map +1 -0
  915. package/dist/trpc/routers/storyboards.js +156 -0
  916. package/dist/trpc/routers/storyboards.js.map +1 -0
  917. package/dist/trpc/routers/threads.d.ts +33 -21
  918. package/dist/trpc/routers/threads.d.ts.map +1 -1
  919. package/dist/trpc/routers/threads.js +36 -30
  920. package/dist/trpc/routers/threads.js.map +1 -1
  921. package/dist/trpc/routers/timeline.d.ts +8516 -0
  922. package/dist/trpc/routers/timeline.d.ts.map +1 -0
  923. package/dist/trpc/routers/timeline.js +493 -0
  924. package/dist/trpc/routers/timeline.js.map +1 -0
  925. package/dist/trpc/routers/triggers.d.ts +46 -0
  926. package/dist/trpc/routers/triggers.d.ts.map +1 -0
  927. package/dist/trpc/routers/triggers.js +117 -0
  928. package/dist/trpc/routers/triggers.js.map +1 -0
  929. package/dist/trpc/routers/users.d.ts +1 -14
  930. package/dist/trpc/routers/users.d.ts.map +1 -1
  931. package/dist/trpc/routers/users.js +1 -12
  932. package/dist/trpc/routers/users.js.map +1 -1
  933. package/dist/trpc/routers/worker.d.ts +242 -0
  934. package/dist/trpc/routers/worker.d.ts.map +1 -0
  935. package/dist/trpc/routers/worker.js +220 -0
  936. package/dist/trpc/routers/worker.js.map +1 -0
  937. package/dist/trpc/routers/workflows.d.ts +385 -197
  938. package/dist/trpc/routers/workflows.d.ts.map +1 -1
  939. package/dist/trpc/routers/workflows.js +326 -345
  940. package/dist/trpc/routers/workflows.js.map +1 -1
  941. package/dist/trpc/routers/workspace.d.ts +59 -33
  942. package/dist/trpc/routers/workspace.d.ts.map +1 -1
  943. package/dist/trpc/routers/workspace.js +230 -93
  944. package/dist/trpc/routers/workspace.js.map +1 -1
  945. package/dist/trpc/sandbox-coverage.d.ts +64 -0
  946. package/dist/trpc/sandbox-coverage.d.ts.map +1 -0
  947. package/dist/trpc/sandbox-coverage.js +1049 -0
  948. package/dist/trpc/sandbox-coverage.js.map +1 -0
  949. package/dist/websocket-client-session.d.ts +320 -0
  950. package/dist/websocket-client-session.d.ts.map +1 -0
  951. package/dist/websocket-client-session.js +1253 -0
  952. package/dist/websocket-client-session.js.map +1 -0
  953. package/dist/workflow-interface-service.d.ts +87 -0
  954. package/dist/workflow-interface-service.d.ts.map +1 -0
  955. package/dist/workflow-interface-service.js +131 -0
  956. package/dist/workflow-interface-service.js.map +1 -0
  957. package/dist/workspace-api.d.ts.map +1 -1
  958. package/dist/workspace-api.js +33 -23
  959. package/dist/workspace-api.js.map +1 -1
  960. package/dist/ws-adapter.d.ts +46 -3
  961. package/dist/ws-adapter.d.ts.map +1 -1
  962. package/dist/ws-adapter.js +164 -26
  963. package/dist/ws-adapter.js.map +1 -1
  964. package/package.json +81 -35
  965. package/dist/agent/agent-runtime.d.ts +0 -47
  966. package/dist/agent/agent-runtime.d.ts.map +0 -1
  967. package/dist/agent/agent-runtime.js +0 -579
  968. package/dist/agent/agent-runtime.js.map +0 -1
  969. package/dist/agent/codex-agent.d.ts +0 -41
  970. package/dist/agent/codex-agent.d.ts.map +0 -1
  971. package/dist/agent/codex-agent.js +0 -334
  972. package/dist/agent/codex-agent.js.map +0 -1
  973. package/dist/agent/index.d.ts +0 -6
  974. package/dist/agent/index.d.ts.map +0 -1
  975. package/dist/agent/index.js +0 -4
  976. package/dist/agent/index.js.map +0 -1
  977. package/dist/agent/llm-agent.d.ts +0 -51
  978. package/dist/agent/llm-agent.d.ts.map +0 -1
  979. package/dist/agent/llm-agent.js +0 -526
  980. package/dist/agent/llm-agent.js.map +0 -1
  981. package/dist/agent/mcp-tool-server.d.ts +0 -33
  982. package/dist/agent/mcp-tool-server.d.ts.map +0 -1
  983. package/dist/agent/mcp-tool-server.js +0 -292
  984. package/dist/agent/mcp-tool-server.js.map +0 -1
  985. package/dist/agent/opencode-agent.d.ts +0 -32
  986. package/dist/agent/opencode-agent.d.ts.map +0 -1
  987. package/dist/agent/opencode-agent.js +0 -332
  988. package/dist/agent/opencode-agent.js.map +0 -1
  989. package/dist/agent/pi-agent.d.ts +0 -42
  990. package/dist/agent/pi-agent.d.ts.map +0 -1
  991. package/dist/agent/pi-agent.js +0 -429
  992. package/dist/agent/pi-agent.js.map +0 -1
  993. package/dist/agent/sdk-provider.d.ts +0 -46
  994. package/dist/agent/sdk-provider.d.ts.map +0 -1
  995. package/dist/agent/sdk-provider.js +0 -50
  996. package/dist/agent/sdk-provider.js.map +0 -1
  997. package/dist/agent/socket-route.d.ts +0 -11
  998. package/dist/agent/socket-route.d.ts.map +0 -1
  999. package/dist/agent/socket-route.js +0 -262
  1000. package/dist/agent/socket-route.js.map +0 -1
  1001. package/dist/agent/transport.d.ts +0 -39
  1002. package/dist/agent/transport.d.ts.map +0 -1
  1003. package/dist/agent/transport.js +0 -17
  1004. package/dist/agent/transport.js.map +0 -1
  1005. package/dist/agent/types.d.ts +0 -11
  1006. package/dist/agent/types.d.ts.map +0 -1
  1007. package/dist/agent/types.js +0 -10
  1008. package/dist/agent/types.js.map +0 -1
  1009. package/dist/routes/jobs.d.ts +0 -16
  1010. package/dist/routes/jobs.d.ts.map +0 -1
  1011. package/dist/routes/jobs.js +0 -25
  1012. package/dist/routes/jobs.js.map +0 -1
  1013. package/dist/trpc/routers/sandboxes.d.ts +0 -64
  1014. package/dist/trpc/routers/sandboxes.d.ts.map +0 -1
  1015. package/dist/trpc/routers/sandboxes.js +0 -327
  1016. package/dist/trpc/routers/sandboxes.js.map +0 -1
  1017. package/dist/unified-websocket-runner.d.ts +0 -280
  1018. package/dist/unified-websocket-runner.d.ts.map +0 -1
  1019. package/dist/unified-websocket-runner.js +0 -3840
  1020. package/dist/unified-websocket-runner.js.map +0 -1
@@ -1,796 +1,246 @@
1
1
  /**
2
2
  * MCP (Model Context Protocol) server for NodeTool.
3
3
  *
4
- * Exposes NodeTool workflows, assets, nodes, jobs, and collections
5
- * as MCP tools using the official TypeScript MCP SDK.
4
+ * The mount exposes the CodeAct action, direct image/discovery tools, and
5
+ * renderer steering tools on the CodeAct belt. A connected editor is reached
6
+ * through the shared `/ws` renderer registry.
6
7
  */
7
8
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
10
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
8
11
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
9
12
  import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
10
- import { z } from "zod";
13
+ import { MCP_GUEST_CONTRACT } from "@nodetool-ai/agents";
11
14
  import { createLogger } from "@nodetool-ai/config";
12
- import { Workflow, Job, Asset } from "@nodetool-ai/models";
13
- import { toAssetResponse, toJobResponse, toWorkflowResponse } from "./http-api.js";
14
- import { uiToolSchemas } from "@nodetool-ai/protocol";
15
- import { NodeRegistry, rankNodeMetadata } from "@nodetool-ai/node-sdk";
16
- import { registerBaseNodes } from "@nodetool-ai/base-nodes";
17
- import { registerElevenLabsNodes } from "@nodetool-ai/elevenlabs-nodes";
18
- import { registerTransformersJsNodes } from "@nodetool-ai/transformers-js-nodes";
19
- import { registerFalNodes } from "@nodetool-ai/fal-nodes";
20
- import { registerKieNodes } from "@nodetool-ai/kie-nodes";
21
- import { registerReplicateNodes } from "@nodetool-ai/replicate-nodes";
22
- import { PythonNodeExecutor, PythonStdioBridge } from "@nodetool-ai/runtime";
23
- import { WorkflowRunner } from "@nodetool-ai/kernel";
15
+ import { registerAgentMcpTools } from "./mcp-agent-tools.js";
16
+ /**
17
+ * Refusal message for a session that cannot be bound to a user. Names the fix,
18
+ * because the caller cannot see which mount answered them.
19
+ */
20
+ export const MCP_SCOPE_REQUIRED_MESSAGE = "NodeTool MCP sessions must be bound to a user. This mount could not " +
21
+ "authenticate one. Fix: sign in so the mount can bind the session's user id, " +
22
+ "or run `nodetool mcp serve` for a single-user stdio mount.";
24
23
  const log = createLogger("nodetool.websocket.mcp-server");
25
- const GLOBAL_FRONTEND_SESSION_ID = "global-mcp";
26
- let activeFrontendTransport = null;
27
- let runtimeEnvironmentPromise = null;
28
- async function getUnifiedNodeMetadata(options) {
29
- if (options?.registry) {
30
- return options.registry
31
- .listMetadata()
32
- .sort((a, b) => a.node_type.localeCompare(b.node_type));
33
- }
34
- const runtime = await getRuntimeEnvironment(options);
35
- return runtime.registry
36
- .listMetadata()
37
- .sort((a, b) => a.node_type.localeCompare(b.node_type));
38
- }
39
- function getRuntimeEnvironment(options) {
40
- if (!runtimeEnvironmentPromise) {
41
- runtimeEnvironmentPromise = (async () => {
42
- const registry = new NodeRegistry();
43
- registry.loadPythonMetadata({
44
- roots: options?.metadataRoots,
45
- maxDepth: options?.metadataMaxDepth ?? 8
46
- });
47
- registerBaseNodes(registry);
48
- registerElevenLabsNodes(registry);
49
- registerTransformersJsNodes(registry);
50
- registerFalNodes(registry);
51
- registerKieNodes(registry);
52
- registerReplicateNodes(registry);
53
- const pythonBridge = new PythonStdioBridge({
54
- workerArgs: process.env["NODETOOL_WORKER_NAMESPACES"]
55
- ? ["--namespaces", process.env["NODETOOL_WORKER_NAMESPACES"]]
56
- : []
57
- });
58
- const logPythonBridgeDiagnostics = (context) => {
59
- const loadErrors = pythonBridge.getLoadErrors?.() ?? [];
60
- if (loadErrors.length === 0)
61
- return;
62
- log.warn(`MCP Python bridge ${context} with ${loadErrors.length} load error(s)`);
63
- for (const entry of loadErrors.slice(0, 10)) {
64
- log.warn(`[python-worker][load-error] ${entry.module} (${entry.phase}): ${entry.error}`);
65
- }
66
- };
67
- let pythonBridgeReady = false;
68
- pythonBridge.on("stderr", (msg) => {
69
- for (const line of msg.split("\n")) {
70
- if (line.trim())
71
- log.debug(`[python-worker] ${line}`);
72
- }
73
- });
74
- pythonBridge.on("exit", (code) => {
75
- log.warn(`MCP Python worker exited with code ${code}`);
76
- pythonBridgeReady = false;
77
- });
78
- const ensurePythonBridge = async () => {
79
- log.info("MCP lazily starting Python bridge");
80
- try {
81
- await pythonBridge.ensureConnected();
82
- }
83
- catch (err) {
84
- log.warn("MCP Python bridge lazy start failed", err instanceof Error ? err : new Error(String(err)));
85
- throw err;
86
- }
87
- pythonBridgeReady = true;
88
- log.info("MCP Python bridge lazy start completed");
89
- const meta = pythonBridge.getNodeMetadata();
90
- log.info(`MCP Python bridge connected — ${meta.length} Python nodes`);
91
- pythonBridge
92
- .getWorkerStatus?.()
93
- ?.then((status) => {
94
- log.info("MCP Python bridge status", {
95
- protocol_version: status.protocol_version,
96
- node_count: status.node_count,
97
- provider_count: status.provider_count,
98
- namespaces: status.namespaces,
99
- transport: status.transport,
100
- max_frame_size: status.max_frame_size,
101
- load_error_count: status.load_errors.length
102
- });
103
- })
104
- .catch((err) => {
105
- log.warn("MCP failed to fetch Python bridge status", err instanceof Error ? err : new Error(String(err)));
106
- });
107
- logPythonBridgeDiagnostics("connected");
108
- };
109
- const resolveExecutor = (node) => {
110
- if (registry.has(node.type)) {
111
- return registry.resolve(node);
112
- }
113
- if (pythonBridgeReady && pythonBridge.hasNodeType(node.type)) {
114
- const meta = pythonBridge
115
- .getNodeMetadata()
116
- .find((n) => n.node_type === node.type);
117
- const nodeRec = node;
118
- const props = (nodeRec.properties ?? nodeRec.data ?? {});
119
- return new PythonNodeExecutor(pythonBridge, node.type, props, Object.fromEntries((meta?.outputs ?? []).map((o) => [o.name, o.type.type])), meta?.required_settings ?? []);
120
- }
121
- if (registry.getMetadata(node.type) && !registry.has(node.type)) {
122
- const stderrSummary = pythonBridge.getRecentStderrSummary?.() ?? null;
123
- const loadErrors = pythonBridge.getLoadErrors?.() ?? [];
124
- const matchingLoadError = loadErrors.find((entry) => entry.module.includes(node.type) ||
125
- node.type.startsWith(entry.module.split(".").slice(2).join(".")));
126
- throw new Error(pythonBridgeReady
127
- ? `Python node "${node.type}" cannot execute: it is declared in metadata but was not loaded by the Python worker.${matchingLoadError ? ` Load error: ${matchingLoadError.module}: ${matchingLoadError.error}.` : stderrSummary ? ` Recent Python worker stderr: ${stderrSummary}` : " Check Python worker status/load errors for import failures."}`
128
- : `Python node "${node.type}" cannot execute: Python worker is not connected.${stderrSummary ? ` Recent Python worker stderr: ${stderrSummary}` : ""}`);
129
- }
130
- return registry.resolve(node);
131
- };
132
- return {
133
- registry,
134
- pythonBridge,
135
- ensurePythonBridge,
136
- resolveExecutor
137
- };
138
- })();
139
- }
140
- return runtimeEnvironmentPromise;
141
- }
142
24
  /**
143
- * Create a configured MCP server with all NodeTool tools registered.
25
+ * Create a configured MCP server: `execute_code`, `view_image`, the
26
+ * capabilities and sandbox resources, and the guest-contract instructions.
27
+ *
28
+ * Throws when `agentToolsScope` is missing — a session with no user binding
29
+ * would hold zero tools, which is a server that answers and cannot act.
144
30
  */
145
31
  export function createMcpServer(options) {
32
+ if (!options?.agentToolsScope) {
33
+ throw new Error(MCP_SCOPE_REQUIRED_MESSAGE);
34
+ }
146
35
  const server = new McpServer({
147
36
  name: "NodeTool API Server",
148
37
  version: "1.0.0"
149
- });
150
- for (const [toolName, schema] of Object.entries(uiToolSchemas)) {
151
- server.tool(toolName, schema.description, schema.parameters, async (args) => {
152
- const transport = activeFrontendTransport;
153
- if (!transport || !transport.isAlive) {
154
- return {
155
- content: [
156
- {
157
- type: "text",
158
- text: JSON.stringify({
159
- error: "No active NodeTool renderer is connected for frontend UI tools."
160
- })
161
- }
162
- ],
163
- isError: true
164
- };
165
- }
166
- try {
167
- const result = await transport.executeTool(GLOBAL_FRONTEND_SESSION_ID, `mcp-ui-${toolName}-${crypto.randomUUID()}`, toolName, args);
168
- return {
169
- content: [
170
- {
171
- type: "text",
172
- text: typeof result === "string"
173
- ? result
174
- : JSON.stringify(result ?? null)
175
- }
176
- ]
177
- };
178
- }
179
- catch (err) {
180
- return {
181
- content: [
182
- {
183
- type: "text",
184
- text: JSON.stringify({ error: String(err) })
185
- }
186
- ],
187
- isError: true
188
- };
189
- }
190
- });
38
+ }, { instructions: MCP_GUEST_CONTRACT });
39
+ registerAgentMcpTools(server, options);
40
+ return server;
41
+ }
42
+ /**
43
+ * Create a stdio transport for CLI mode.
44
+ */
45
+ export function createMcpStdioTransport() {
46
+ return new StdioServerTransport();
47
+ }
48
+ /** Connect stdio to the local API process when its MCP mount is available. */
49
+ export async function forwardMcpStdioToLocalServer(url = getLocalMcpServerUrl(), stdio = createMcpStdioTransport()) {
50
+ const endpoint = new URL(url);
51
+ if (endpoint.hostname !== "127.0.0.1" && endpoint.hostname !== "localhost") {
52
+ throw new Error("The stdio MCP forwarder only connects to loopback");
191
53
  }
192
- // ── Workflow tools ──────────────────────────────────────────────
193
- server.tool("list_workflows", "List workflows with flexible filtering.", {
194
- limit: z
195
- .number()
196
- .optional()
197
- .default(100)
198
- .describe("Maximum number of workflows to return"),
199
- user_id: z.string().optional().default("1").describe("User ID")
200
- }, async ({ limit, user_id }) => {
201
- try {
202
- const [workflows, next] = await Workflow.paginate(user_id, { limit });
203
- return {
204
- content: [
205
- {
206
- type: "text",
207
- text: JSON.stringify({
208
- workflows: workflows.map((workflow) => toWorkflowResponse(workflow)),
209
- next: next || null
210
- })
211
- }
212
- ]
213
- };
54
+ // An MCP handshake proves that the port belongs to a reachable NodeTool MCP
55
+ // mount. A health check alone could select an unrelated process on this port.
56
+ const probe = new Client({ name: "nodetool-mcp-probe", version: "1.0.0" });
57
+ const probeTransport = new StreamableHTTPClientTransport(endpoint);
58
+ try {
59
+ await probe.connect(probeTransport, { timeout: 5000 });
60
+ if (probe.getServerVersion()?.name !== "NodeTool API Server") {
61
+ return false;
214
62
  }
215
- catch (err) {
216
- return {
217
- content: [
218
- {
219
- type: "text",
220
- text: JSON.stringify({ error: String(err) })
221
- }
222
- ],
223
- isError: true
224
- };
225
- }
226
- });
227
- server.tool("get_workflow", "Get detailed information about a specific workflow.", {
228
- workflow_id: z.string().describe("The workflow ID"),
229
- user_id: z.string().optional().default("1").describe("User ID")
230
- }, async ({ workflow_id, user_id }) => {
231
- try {
232
- const workflow = await Workflow.find(user_id, workflow_id);
233
- if (!workflow) {
234
- return {
235
- content: [
236
- {
237
- type: "text",
238
- text: JSON.stringify({ error: "Workflow not found" })
239
- }
240
- ],
241
- isError: true
242
- };
243
- }
244
- return {
245
- content: [
246
- {
247
- type: "text",
248
- text: JSON.stringify(toWorkflowResponse(workflow))
249
- }
250
- ]
251
- };
252
- }
253
- catch (err) {
254
- return {
255
- content: [
256
- {
257
- type: "text",
258
- text: JSON.stringify({ error: String(err) })
259
- }
260
- ],
261
- isError: true
262
- };
263
- }
264
- });
265
- server.tool("run_workflow", "Run a workflow on the backend, optionally passing parameters.", {
266
- workflow_id: z.string().describe("Workflow id to target."),
267
- params: z
268
- .record(z.string(), z.unknown())
269
- .optional()
270
- .default({})
271
- .describe("Optional workflow run parameters."),
272
- user_id: z.string().optional().default("1").describe("User ID")
273
- }, async ({ workflow_id, params, user_id }) => {
274
- try {
275
- const workflow = await Workflow.find(user_id, workflow_id);
276
- if (!workflow) {
277
- return {
278
- content: [
279
- {
280
- type: "text",
281
- text: JSON.stringify({ error: "Workflow not found" })
282
- }
283
- ],
284
- isError: true
285
- };
286
- }
287
- const runMode = workflow.run_mode ?? "workflow";
288
- if (runMode !== "workflow") {
289
- return {
290
- content: [
291
- {
292
- type: "text",
293
- text: JSON.stringify({
294
- error: `Workflow run mode "${runMode}" is not supported by the backend MCP runner.`
295
- })
296
- }
297
- ],
298
- isError: true
299
- };
300
- }
301
- const graph = workflow.getGraph();
302
- const runnableGraph = {
303
- nodes: graph.nodes.map((node) => {
304
- const record = node;
305
- return {
306
- ...record,
307
- id: String(record.id ?? ""),
308
- type: String(record.type ?? ""),
309
- properties: (record.properties ?? record.data ?? {})
310
- };
311
- }),
312
- edges: graph.edges.map((edge) => {
313
- const record = edge;
314
- return {
315
- ...record,
316
- id: typeof record.id === "string" || record.id == null
317
- ? record.id
318
- : String(record.id),
319
- source: String(record.source ?? ""),
320
- target: String(record.target ?? ""),
321
- sourceHandle: String(record.sourceHandle ?? ""),
322
- targetHandle: String(record.targetHandle ?? ""),
323
- edge_type: record.edge_type === "control" ? "control" : "data"
324
- };
325
- })
326
- };
327
- const runtime = await getRuntimeEnvironment(options);
328
- const hasPythonNode = runnableGraph.nodes.some((node) => {
329
- const nodeType = typeof node.type === "string" ? node.type : "";
330
- return (nodeType !== "" &&
331
- Boolean(runtime.registry.getMetadata(nodeType)) &&
332
- !runtime.registry.has(nodeType));
333
- });
334
- if (hasPythonNode) {
335
- await runtime.ensurePythonBridge();
336
- }
337
- const job = await Job.create({
338
- workflow_id,
339
- user_id,
340
- status: "running",
341
- params,
342
- graph: runnableGraph
343
- });
344
- const runner = new WorkflowRunner(job.id, {
345
- resolveExecutor: (node) => runtime.resolveExecutor(node)
346
- });
347
- const result = await runner.run({ job_id: job.id, workflow_id, params }, runnableGraph);
348
- if (result.status === "completed") {
349
- job.markCompleted();
350
- }
351
- else if (result.status === "cancelled") {
352
- job.markCancelled();
353
- }
354
- else {
355
- job.markFailed(result.error ?? "Workflow run failed");
356
- }
357
- await job.save();
358
- return {
359
- content: [
360
- {
361
- type: "text",
362
- text: JSON.stringify({
363
- job_id: job.id,
364
- workflow_id,
365
- status: result.status,
366
- outputs: result.outputs,
367
- error: result.error ?? null,
368
- message_count: result.messages.length,
369
- background: false
370
- })
371
- }
372
- ]
373
- };
374
- }
375
- catch (err) {
376
- return {
377
- content: [
378
- {
379
- type: "text",
380
- text: JSON.stringify({ error: String(err) })
381
- }
382
- ],
383
- isError: true
384
- };
385
- }
386
- });
387
- // ── Asset tools ─────────────────────────────────────────────────
388
- server.tool("list_assets", "List or search assets with flexible filtering options.", {
389
- parent_id: z.string().optional().describe("Filter by parent asset ID"),
390
- content_type: z.string().optional().describe("Filter by content type"),
391
- limit: z
392
- .number()
393
- .optional()
394
- .default(100)
395
- .describe("Maximum number of assets to return"),
396
- user_id: z.string().optional().default("1").describe("User ID")
397
- }, async ({ parent_id, content_type, limit, user_id }) => {
398
- try {
399
- const opts = { limit };
400
- if (parent_id)
401
- opts.parentId = parent_id;
402
- if (content_type)
403
- opts.contentType = content_type;
404
- const [assets, next] = await Asset.paginate(user_id, opts);
405
- return {
406
- content: [
407
- {
408
- type: "text",
409
- text: JSON.stringify({
410
- assets: assets.map((asset) => toAssetResponse(asset)),
411
- next: next || null
412
- })
413
- }
414
- ]
415
- };
416
- }
417
- catch (err) {
418
- return {
419
- content: [
420
- {
421
- type: "text",
422
- text: JSON.stringify({ error: String(err) })
423
- }
424
- ],
425
- isError: true
426
- };
427
- }
428
- });
429
- server.tool("get_asset", "Get detailed information about a specific asset.", {
430
- asset_id: z.string().describe("The asset ID"),
431
- user_id: z.string().optional().default("1").describe("User ID")
432
- }, async ({ asset_id, user_id }) => {
433
- try {
434
- const asset = await Asset.find(user_id, asset_id);
435
- if (!asset) {
436
- return {
437
- content: [
438
- {
439
- type: "text",
440
- text: JSON.stringify({ error: "Asset not found" })
441
- }
442
- ],
443
- isError: true
444
- };
445
- }
446
- return {
447
- content: [
448
- {
449
- type: "text",
450
- text: JSON.stringify(toAssetResponse(asset))
451
- }
452
- ]
453
- };
454
- }
455
- catch (err) {
456
- return {
457
- content: [
458
- {
459
- type: "text",
460
- text: JSON.stringify({ error: String(err) })
461
- }
462
- ],
463
- isError: true
464
- };
63
+ }
64
+ catch {
65
+ return false;
66
+ }
67
+ finally {
68
+ if (probeTransport.sessionId) {
69
+ await probeTransport.terminateSession().catch(() => undefined);
465
70
  }
466
- });
467
- // ── Node tools ──────────────────────────────────────────────────
468
- server.tool("list_nodes", "List available nodes from installed packages.", {
469
- namespace: z.string().optional().describe("Filter by namespace prefix"),
470
- limit: z
471
- .number()
472
- .optional()
473
- .default(200)
474
- .describe("Maximum number of nodes to return")
475
- }, async ({ namespace, limit }) => {
476
- try {
477
- let nodes = await getUnifiedNodeMetadata(options);
478
- if (namespace) {
479
- nodes = nodes.filter((n) => n.namespace.startsWith(namespace));
480
- }
481
- nodes.sort((a, b) => a.node_type.localeCompare(b.node_type));
482
- const result = nodes.slice(0, limit).map((n) => ({
483
- node_type: n.node_type,
484
- title: n.title,
485
- description: n.description,
486
- namespace: n.namespace
487
- }));
488
- return {
489
- content: [{ type: "text", text: JSON.stringify(result) }]
490
- };
71
+ await probe.close();
72
+ }
73
+ const http = new StreamableHTTPClientTransport(endpoint);
74
+ http.onmessage = (message) => {
75
+ if ("result" in message && "protocolVersion" in message.result) {
76
+ const version = message.result.protocolVersion;
77
+ if (typeof version === "string")
78
+ http.setProtocolVersion(version);
491
79
  }
492
- catch (err) {
493
- return {
494
- content: [
495
- {
496
- type: "text",
497
- text: JSON.stringify({ error: String(err) })
498
- }
499
- ],
500
- isError: true
501
- };
80
+ void stdio.send(message);
81
+ };
82
+ http.onerror = (error) => {
83
+ log.warn("Local MCP HTTP transport failed", { error: error.message });
84
+ };
85
+ let initialization = Promise.resolve();
86
+ stdio.onmessage = (message) => {
87
+ const send = initialization.then(() => http.send(message));
88
+ if ("method" in message && message.method === "initialize") {
89
+ initialization = send;
502
90
  }
503
- });
504
- server.tool("search_nodes", "Search for nodes by name, description, or tags. Provider-specific nodes (openai.*, anthropic.*, etc.) are hidden by default; set include_provider_nodes:true to include them.", {
505
- query: z.array(z.string()).describe("Search keywords"),
506
- n_results: z.number().optional().default(10).describe("Maximum results"),
507
- namespace: z
508
- .string()
509
- .optional()
510
- .describe("Optional namespace prefix to scope the search (e.g. 'nodetool.control')."),
511
- include_provider_nodes: z
512
- .boolean()
513
- .optional()
514
- .default(false)
515
- .describe("Include provider-specific nodes. Default false — set true only when the user named a provider.")
516
- }, async ({ query, n_results, namespace, include_provider_nodes }) => {
517
- try {
518
- const nodes = await getUnifiedNodeMetadata(options);
519
- const ranked = rankNodeMetadata(nodes, query, {
520
- includeProviderNodes: include_provider_nodes,
521
- namespacePrefix: namespace
91
+ void send.catch((error) => {
92
+ log.warn("Forwarding MCP request failed", {
93
+ error: error instanceof Error ? error.message : String(error)
522
94
  });
523
- const matches = ranked.slice(0, n_results).map(({ meta, score }) => ({
524
- node_type: meta.node_type,
525
- title: meta.title,
526
- description: meta.description,
527
- namespace: meta.namespace,
528
- score
529
- }));
530
- return {
531
- content: [{ type: "text", text: JSON.stringify(matches) }]
532
- };
533
- }
534
- catch (err) {
535
- return {
536
- content: [
537
- {
538
- type: "text",
539
- text: JSON.stringify({ error: String(err) })
540
- }
541
- ],
542
- isError: true
543
- };
544
- }
545
- });
546
- server.tool("get_node_info", "Get detailed metadata for a node type.", {
547
- node_type: z.string().describe("The fully-qualified node type")
548
- }, async ({ node_type }) => {
549
- try {
550
- const nodes = await getUnifiedNodeMetadata(options);
551
- const node = nodes.find((candidate) => candidate.node_type === node_type);
552
- if (!node) {
553
- return {
554
- content: [
555
- {
556
- type: "text",
557
- text: JSON.stringify({ error: "Node type not found" })
558
- }
559
- ],
560
- isError: true
561
- };
562
- }
563
- return {
564
- content: [{ type: "text", text: JSON.stringify(node) }]
565
- };
566
- }
567
- catch (err) {
568
- return {
569
- content: [
570
- {
571
- type: "text",
572
- text: JSON.stringify({ error: String(err) })
573
- }
574
- ],
575
- isError: true
576
- };
577
- }
578
- });
579
- // ── Job tools ───────────────────────────────────────────────────
580
- server.tool("list_jobs", "List jobs for user, optionally filtered by workflow.", {
581
- workflow_id: z.string().optional().describe("Filter by workflow ID"),
582
- limit: z
583
- .number()
584
- .optional()
585
- .default(100)
586
- .describe("Maximum number of jobs to return"),
587
- user_id: z.string().optional().default("1").describe("User ID")
588
- }, async ({ workflow_id, limit, user_id }) => {
589
- try {
590
- const opts = { limit };
591
- if (workflow_id)
592
- opts.workflowId = workflow_id;
593
- const [jobs, nextStartKey] = await Job.paginate(user_id, opts);
594
- return {
595
- content: [
596
- {
597
- type: "text",
598
- text: JSON.stringify({
599
- jobs: jobs.map((job) => toJobResponse(job)),
600
- next_start_key: nextStartKey || null
601
- })
602
- }
603
- ]
604
- };
605
- }
606
- catch (err) {
607
- return {
608
- content: [
609
- {
610
- type: "text",
611
- text: JSON.stringify({ error: String(err) })
612
- }
613
- ],
614
- isError: true
615
- };
616
- }
617
- });
618
- server.tool("get_job", "Get a job by ID for user.", {
619
- job_id: z.string().describe("The job ID"),
620
- user_id: z.string().optional().default("1").describe("User ID")
621
- }, async ({ job_id, user_id }) => {
622
- try {
623
- const job = await Job.find(user_id, job_id);
624
- if (!job) {
625
- return {
626
- content: [
627
- {
628
- type: "text",
629
- text: JSON.stringify({ error: "Job not found" })
630
- }
631
- ],
632
- isError: true
633
- };
95
+ void stdio.close();
96
+ });
97
+ };
98
+ stdio.onclose = () => {
99
+ void (async () => {
100
+ if (http.sessionId) {
101
+ await http.terminateSession().catch(() => undefined);
634
102
  }
635
- return {
636
- content: [
637
- {
638
- type: "text",
639
- text: JSON.stringify(toJobResponse(job))
640
- }
641
- ]
642
- };
643
- }
644
- catch (err) {
645
- return {
646
- content: [
647
- {
648
- type: "text",
649
- text: JSON.stringify({ error: String(err) })
650
- }
651
- ],
652
- isError: true
653
- };
654
- }
655
- });
656
- // ── Collection tools (sqlite-vec) ───────────────────────────────
657
- server.tool("list_collections", "List all vector database collections.", {
658
- limit: z
659
- .number()
660
- .optional()
661
- .default(50)
662
- .describe("Maximum collections to return")
663
- }, async ({ limit }) => {
664
- try {
665
- const { getVecStore } = await import("@nodetool-ai/vectorstore");
666
- const store = await getVecStore();
667
- const collections = await store.listCollections();
668
- const result = await Promise.all(collections.slice(0, limit).map(async (c) => {
669
- const count = await c.count();
670
- const metadata = c.metadata ?? {};
671
- let workflowName = null;
672
- const workflowId = metadata.workflow;
673
- if (workflowId) {
674
- const workflow = (await Workflow.get(workflowId));
675
- if (workflow)
676
- workflowName = workflow.name;
677
- }
678
- return {
679
- name: c.name,
680
- count,
681
- metadata,
682
- workflow_name: workflowName
683
- };
684
- }));
685
- return {
686
- content: [
687
- {
688
- type: "text",
689
- text: JSON.stringify({ collections: result, count: result.length })
690
- }
691
- ]
692
- };
693
- }
694
- catch {
695
- return {
696
- content: [
697
- {
698
- type: "text",
699
- text: JSON.stringify({ error: "Vector store not available" })
700
- }
701
- ],
702
- isError: true
703
- };
704
- }
705
- });
706
- server.tool("get_collection", "Get details about a specific collection.", {
707
- name: z.string().describe("Collection name")
708
- }, async ({ name }) => {
709
- try {
710
- const { getVecStore } = await import("@nodetool-ai/vectorstore");
711
- const store = await getVecStore();
712
- const collection = await store.getCollection({ name });
713
- const count = await collection.count();
714
- return {
715
- content: [
716
- {
717
- type: "text",
718
- text: JSON.stringify({
719
- name: collection.name,
720
- metadata: collection.metadata,
721
- count
722
- })
723
- }
724
- ]
725
- };
726
- }
727
- catch {
728
- return {
729
- content: [
730
- {
731
- type: "text",
732
- text: JSON.stringify({ error: "Vector store not available" })
733
- }
734
- ],
735
- isError: true
736
- };
737
- }
738
- });
739
- server.tool("query_collection", "Query a collection for similar documents using semantic search.", {
740
- name: z.string().describe("Collection name"),
741
- query_texts: z
742
- .array(z.string())
743
- .describe("Query texts for semantic search"),
744
- n_results: z.number().optional().default(10).describe("Number of results")
745
- }, async ({ name, query_texts, n_results }) => {
746
- try {
747
- const { getVecStore } = await import("@nodetool-ai/vectorstore");
748
- const store = await getVecStore();
749
- const collection = await store.getCollection({ name });
750
- const results = await collection.query({
751
- queryTexts: query_texts,
752
- nResults: n_results
753
- });
754
- return {
755
- content: [{ type: "text", text: JSON.stringify(results) }]
756
- };
757
- }
758
- catch {
759
- return {
760
- content: [
761
- {
762
- type: "text",
763
- text: JSON.stringify({ error: "Vector store not available" })
764
- }
765
- ],
766
- isError: true
767
- };
768
- }
769
- });
770
- return server;
103
+ await http.close();
104
+ })();
105
+ };
106
+ await http.start();
107
+ await stdio.start();
108
+ return true;
771
109
  }
772
110
  /**
773
- * Create a stdio transport for CLI mode.
111
+ * How long an HTTP session may sit idle before it is closed. Every session
112
+ * holds a transport, an `McpServer`, and that session's whole tool registry,
113
+ * and `onclose` only fires when the transport is explicitly closed — normally
114
+ * a DELETE. A client that simply goes away never sends one, so without this
115
+ * sweep the maps grow for the life of the process.
774
116
  */
775
- export function createMcpStdioTransport() {
776
- return new StdioServerTransport();
777
- }
117
+ export const MCP_SESSION_IDLE_TTL_MS = 30 * 60 * 1000;
118
+ /** Concurrent sessions one user may hold; opening another closes their oldest. */
119
+ export const MCP_MAX_SESSIONS_PER_USER = 8;
120
+ /** Concurrent sessions across every user. A new one past this is refused. */
121
+ export const MCP_MAX_SESSIONS = 256;
778
122
  // Per-session transport map for stateful HTTP MCP
779
123
  const sessionTransports = new Map();
780
- export function setMcpFrontendTransport(transport) {
781
- activeFrontendTransport = transport;
124
+ // The user each HTTP session was initialized for. A multi-user mount hands out
125
+ // session ids over an authenticated channel, but the id alone must not be a
126
+ // bearer credential: every later request is checked against the owner recorded
127
+ // here.
128
+ const sessionOwners = new Map();
129
+ // When each session was last used, for idle eviction and for picking a user's
130
+ // oldest session when they are over their cap.
131
+ const sessionLastSeen = new Map();
132
+ function forgetSession(sessionId) {
133
+ sessionTransports.delete(sessionId);
134
+ sessionOwners.delete(sessionId);
135
+ sessionLastSeen.delete(sessionId);
136
+ }
137
+ function touchSession(sessionId, now = Date.now()) {
138
+ if (sessionTransports.has(sessionId))
139
+ sessionLastSeen.set(sessionId, now);
782
140
  }
783
- export function clearMcpFrontendTransport(transport) {
784
- if (activeFrontendTransport === transport) {
785
- activeFrontendTransport = null;
141
+ /**
142
+ * Drop a session and close its transport, which releases the `McpServer`
143
+ * behind it. `forgetSession` runs first so the transport's own `onclose`
144
+ * finds nothing left to do.
145
+ */
146
+ function closeSession(sessionId) {
147
+ const transport = sessionTransports.get(sessionId);
148
+ forgetSession(sessionId);
149
+ void transport?.close().catch((err) => {
150
+ log.warn("Closing MCP session transport failed", {
151
+ sessionId,
152
+ error: err instanceof Error ? err.message : String(err)
153
+ });
154
+ });
155
+ }
156
+ /** Close every session idle for longer than the TTL. Lazy — runs per request,
157
+ * so an idle process holds no timer. */
158
+ function sweepIdleSessions(now) {
159
+ for (const [sessionId, lastSeen] of sessionLastSeen) {
160
+ if (now - lastSeen > MCP_SESSION_IDLE_TTL_MS) {
161
+ log.debug("Evicting idle MCP session", { sessionId });
162
+ closeSession(sessionId);
163
+ }
164
+ }
165
+ }
166
+ /** Close a user's oldest sessions until opening one more keeps them at the cap. */
167
+ function evictOverflowForUser(userId) {
168
+ const owned = [...sessionOwners]
169
+ .filter(([, owner]) => owner === userId)
170
+ .map(([sessionId]) => sessionId);
171
+ const overflow = owned.length - (MCP_MAX_SESSIONS_PER_USER - 1);
172
+ if (overflow <= 0)
173
+ return;
174
+ const oldestFirst = owned.sort((a, b) => (sessionLastSeen.get(a) ?? 0) - (sessionLastSeen.get(b) ?? 0));
175
+ for (const sessionId of oldestFirst.slice(0, overflow)) {
176
+ log.debug("Evicting oldest MCP session for user over cap", {
177
+ userId,
178
+ sessionId
179
+ });
180
+ closeSession(sessionId);
181
+ }
182
+ }
183
+ /** Close every open HTTP session. For shutdown, and for tests that need a
184
+ * clean process-wide session table. */
185
+ export function closeAllMcpHttpSessions() {
186
+ for (const sessionId of [...sessionTransports.keys()]) {
187
+ closeSession(sessionId);
786
188
  }
787
189
  }
190
+ /**
191
+ * True when the session exists and belongs to somebody other than the caller.
192
+ * A session with no recorded owner (stdio, or a mount that predates the
193
+ * binding) is left alone — the transport map is the authority there.
194
+ */
195
+ function isForeignSession(sessionId, options) {
196
+ const owner = sessionOwners.get(sessionId);
197
+ if (owner === undefined)
198
+ return false;
199
+ return owner !== options?.agentToolsScope?.userId;
200
+ }
201
+ /**
202
+ * Answer as if the session did not exist. A 403 would confirm the id is real to
203
+ * a caller who guessed it; a 404 tells them nothing.
204
+ */
205
+ function sessionNotFound() {
206
+ return new Response("Session not found", { status: 404 });
207
+ }
208
+ /** Refusal for an initialize the mount has no room for. Retryable: an idle
209
+ * session frees a slot on the next sweep. */
210
+ function sessionsExhausted() {
211
+ return new Response(JSON.stringify({
212
+ jsonrpc: "2.0",
213
+ id: null,
214
+ error: {
215
+ code: -32002,
216
+ message: "This server is holding its maximum number of MCP sessions. " +
217
+ "Close an existing session with DELETE /mcp, or retry later."
218
+ }
219
+ }), {
220
+ status: 503,
221
+ headers: {
222
+ "content-type": "application/json",
223
+ "retry-after": "60"
224
+ }
225
+ });
226
+ }
788
227
  export function getLocalMcpServerUrl() {
789
228
  const port = Number(process.env["PORT"] ?? 7777);
790
229
  const tlsEnabled = Boolean(process.env["TLS_CERT"] && process.env["TLS_KEY"]);
791
230
  const protocol = tlsEnabled ? "https" : "http";
792
231
  return `${protocol}://127.0.0.1:${port}/mcp`;
793
232
  }
233
+ /** JSON-RPC refusal for an initialize the mount cannot scope to a user. */
234
+ function scopeRefusal(challenge) {
235
+ const headers = new Headers({ "content-type": "application/json" });
236
+ if (challenge)
237
+ headers.set("WWW-Authenticate", challenge);
238
+ return new Response(JSON.stringify({
239
+ jsonrpc: "2.0",
240
+ id: null,
241
+ error: { code: -32001, message: MCP_SCOPE_REQUIRED_MESSAGE }
242
+ }), { status: 401, headers });
243
+ }
794
244
  /**
795
245
  * Handle an MCP HTTP request at the /mcp path.
796
246
  * Uses WebStandardStreamableHTTPServerTransport for stateful sessions.
@@ -800,42 +250,85 @@ export async function handleMcpHttpRequest(request, options) {
800
250
  if (!url.pathname.startsWith("/mcp"))
801
251
  return null;
802
252
  const method = request.method;
253
+ const now = Date.now();
254
+ sweepIdleSessions(now);
803
255
  if (method === "POST") {
804
256
  // Check for existing session
805
257
  const sessionId = request.headers.get("mcp-session-id");
806
258
  if (sessionId && sessionTransports.has(sessionId)) {
259
+ if (isForeignSession(sessionId, options))
260
+ return sessionNotFound();
807
261
  const transport = sessionTransports.get(sessionId);
262
+ touchSession(sessionId, now);
808
263
  return transport.handleRequest(request);
809
264
  }
265
+ // A session id that is present but unknown must NOT fall through to the
266
+ // new-session path: that constructed a fresh transport + server per stale
267
+ // request (leaking both). Reject it — only an initialize request without a
268
+ // session id creates a new session.
269
+ if (sessionId) {
270
+ return sessionNotFound();
271
+ }
272
+ // A session this mount cannot bind to a user is refused here, at
273
+ // initialize, rather than answering with an empty surface.
274
+ if (!options?.agentToolsScope) {
275
+ log.warn("Refusing MCP session: no authenticated user to bind");
276
+ return scopeRefusal(options?.unauthorizedChallenge);
277
+ }
810
278
  // New session — create transport and server
279
+ const ownerUserId = options.agentToolsScope.userId;
280
+ // One user's clients cannot crowd out everyone else's: their oldest
281
+ // session goes first. The global cap is what is left after that, and it
282
+ // refuses rather than evicting a stranger's live session.
283
+ evictOverflowForUser(ownerUserId);
284
+ if (sessionTransports.size >= MCP_MAX_SESSIONS) {
285
+ log.warn("Refusing MCP session: server session cap reached", {
286
+ cap: MCP_MAX_SESSIONS
287
+ });
288
+ return sessionsExhausted();
289
+ }
811
290
  const transport = new WebStandardStreamableHTTPServerTransport({
812
291
  enableJsonResponse: true,
813
292
  sessionIdGenerator: () => crypto.randomUUID(),
814
293
  onsessioninitialized: (id) => {
815
294
  sessionTransports.set(id, transport);
295
+ sessionOwners.set(id, ownerUserId);
296
+ sessionLastSeen.set(id, Date.now());
816
297
  }
817
298
  });
299
+ // Evict the session when the transport closes (client disconnect without an
300
+ // explicit DELETE) so sessionTransports — and the McpServer each entry keeps
301
+ // alive — does not grow unbounded over the process lifetime.
302
+ transport.onclose = () => {
303
+ if (transport.sessionId)
304
+ forgetSession(transport.sessionId);
305
+ };
818
306
  const server = createMcpServer(options);
819
307
  await server.connect(transport);
820
308
  return transport.handleRequest(request);
821
309
  }
822
310
  if (method === "GET") {
823
311
  const sessionId = request.headers.get("mcp-session-id");
824
- if (sessionId && sessionTransports.has(sessionId)) {
312
+ if (sessionId &&
313
+ sessionTransports.has(sessionId) &&
314
+ !isForeignSession(sessionId, options)) {
825
315
  const transport = sessionTransports.get(sessionId);
316
+ touchSession(sessionId, now);
826
317
  return transport.handleRequest(request);
827
318
  }
828
- return new Response("Session not found", { status: 404 });
319
+ return sessionNotFound();
829
320
  }
830
321
  if (method === "DELETE") {
831
322
  const sessionId = request.headers.get("mcp-session-id");
832
- if (sessionId && sessionTransports.has(sessionId)) {
323
+ if (sessionId &&
324
+ sessionTransports.has(sessionId) &&
325
+ !isForeignSession(sessionId, options)) {
833
326
  const transport = sessionTransports.get(sessionId);
834
327
  const response = await transport.handleRequest(request);
835
- sessionTransports.delete(sessionId);
328
+ forgetSession(sessionId);
836
329
  return response;
837
330
  }
838
- return new Response("Session not found", { status: 404 });
331
+ return sessionNotFound();
839
332
  }
840
333
  return new Response("Method not allowed", { status: 405 });
841
334
  }