@nodetool-ai/websocket 0.7.0-rc.23 → 0.8.2

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 (1101) 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 +82 -14
  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/error-traces.d.ts +56 -0
  52. package/dist/error-traces.d.ts.map +1 -0
  53. package/dist/error-traces.js +179 -0
  54. package/dist/error-traces.js.map +1 -0
  55. package/dist/example-workflows.d.ts +20 -0
  56. package/dist/example-workflows.d.ts.map +1 -0
  57. package/dist/example-workflows.js +123 -0
  58. package/dist/example-workflows.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 +307 -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 +219 -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 +628 -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 +10 -3
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +10 -3
  94. package/dist/index.js.map +1 -1
  95. package/dist/interrupted-jobs.d.ts +14 -0
  96. package/dist/interrupted-jobs.d.ts.map +1 -0
  97. package/dist/interrupted-jobs.js +28 -0
  98. package/dist/interrupted-jobs.js.map +1 -0
  99. package/dist/job-control.d.ts +57 -0
  100. package/dist/job-control.d.ts.map +1 -0
  101. package/dist/job-control.js +134 -0
  102. package/dist/job-control.js.map +1 -0
  103. package/dist/job-queue.d.ts +47 -0
  104. package/dist/job-queue.d.ts.map +1 -0
  105. package/dist/job-queue.js +52 -0
  106. package/dist/job-queue.js.map +1 -0
  107. package/dist/job-run-registry.d.ts +176 -0
  108. package/dist/job-run-registry.d.ts.map +1 -0
  109. package/dist/job-run-registry.js +312 -0
  110. package/dist/job-run-registry.js.map +1 -0
  111. package/dist/lib/app-build-service.d.ts +16 -0
  112. package/dist/lib/app-build-service.d.ts.map +1 -0
  113. package/dist/lib/app-build-service.js +39 -0
  114. package/dist/lib/app-build-service.js.map +1 -0
  115. package/dist/lib/app-debug-service.d.ts +16 -0
  116. package/dist/lib/app-debug-service.d.ts.map +1 -0
  117. package/dist/lib/app-debug-service.js +48 -0
  118. package/dist/lib/app-debug-service.js.map +1 -0
  119. package/dist/lib/app-deployment-service.d.ts +82 -0
  120. package/dist/lib/app-deployment-service.d.ts.map +1 -0
  121. package/dist/lib/app-deployment-service.js +282 -0
  122. package/dist/lib/app-deployment-service.js.map +1 -0
  123. package/dist/lib/app-instances-service.d.ts +1284 -0
  124. package/dist/lib/app-instances-service.d.ts.map +1 -0
  125. package/dist/lib/app-instances-service.js +378 -0
  126. package/dist/lib/app-instances-service.js.map +1 -0
  127. package/dist/lib/app-run-cancellation.d.ts +4 -0
  128. package/dist/lib/app-run-cancellation.d.ts.map +1 -0
  129. package/dist/lib/app-run-cancellation.js +28 -0
  130. package/dist/lib/app-run-cancellation.js.map +1 -0
  131. package/dist/lib/app-run-server.d.ts +7 -0
  132. package/dist/lib/app-run-server.d.ts.map +1 -0
  133. package/dist/lib/app-run-server.js +6 -0
  134. package/dist/lib/app-run-server.js.map +1 -0
  135. package/dist/lib/app-session-scope.d.ts +91 -0
  136. package/dist/lib/app-session-scope.d.ts.map +1 -0
  137. package/dist/lib/app-session-scope.js +91 -0
  138. package/dist/lib/app-session-scope.js.map +1 -0
  139. package/dist/lib/applications-service.d.ts +354 -0
  140. package/dist/lib/applications-service.d.ts.map +1 -0
  141. package/dist/lib/applications-service.js +507 -0
  142. package/dist/lib/applications-service.js.map +1 -0
  143. package/dist/lib/asset-duration.d.ts +7 -0
  144. package/dist/lib/asset-duration.d.ts.map +1 -0
  145. package/dist/lib/asset-duration.js +24 -0
  146. package/dist/lib/asset-duration.js.map +1 -0
  147. package/dist/lib/asset-export.d.ts +34 -0
  148. package/dist/lib/asset-export.d.ts.map +1 -0
  149. package/dist/lib/asset-export.js +113 -0
  150. package/dist/lib/asset-export.js.map +1 -0
  151. package/dist/lib/asset-model-interface.d.ts +41 -0
  152. package/dist/lib/asset-model-interface.d.ts.map +1 -0
  153. package/dist/lib/asset-model-interface.js +74 -0
  154. package/dist/lib/asset-model-interface.js.map +1 -0
  155. package/dist/lib/asset-paths.d.ts +49 -1
  156. package/dist/lib/asset-paths.d.ts.map +1 -1
  157. package/dist/lib/asset-paths.js +127 -31
  158. package/dist/lib/asset-paths.js.map +1 -1
  159. package/dist/lib/asset-response.d.ts +12 -0
  160. package/dist/lib/asset-response.d.ts.map +1 -0
  161. package/dist/lib/asset-response.js +89 -0
  162. package/dist/lib/asset-response.js.map +1 -0
  163. package/dist/lib/audio-peaks.d.ts +23 -0
  164. package/dist/lib/audio-peaks.d.ts.map +1 -0
  165. package/dist/lib/audio-peaks.js +335 -0
  166. package/dist/lib/audio-peaks.js.map +1 -0
  167. package/dist/lib/bridge.d.ts +9 -1
  168. package/dist/lib/bridge.d.ts.map +1 -1
  169. package/dist/lib/bridge.js +27 -4
  170. package/dist/lib/bridge.js.map +1 -1
  171. package/dist/lib/compression.d.ts +3 -0
  172. package/dist/lib/compression.d.ts.map +1 -0
  173. package/dist/lib/compression.js +3 -0
  174. package/dist/lib/compression.js.map +1 -0
  175. package/dist/lib/document-model-interfaces.d.ts +30 -0
  176. package/dist/lib/document-model-interfaces.d.ts.map +1 -0
  177. package/dist/lib/document-model-interfaces.js +296 -0
  178. package/dist/lib/document-model-interfaces.js.map +1 -0
  179. package/dist/lib/env-config.d.ts +9 -0
  180. package/dist/lib/env-config.d.ts.map +1 -0
  181. package/dist/lib/env-config.js +18 -0
  182. package/dist/lib/env-config.js.map +1 -0
  183. package/dist/lib/example-apps.d.ts +52 -0
  184. package/dist/lib/example-apps.d.ts.map +1 -0
  185. package/dist/lib/example-apps.js +192 -0
  186. package/dist/lib/example-apps.js.map +1 -0
  187. package/dist/lib/example-games.d.ts +5 -0
  188. package/dist/lib/example-games.d.ts.map +1 -0
  189. package/dist/lib/example-games.js +13 -0
  190. package/dist/lib/example-games.js.map +1 -0
  191. package/dist/lib/example-recipes.d.ts +33 -0
  192. package/dist/lib/example-recipes.d.ts.map +1 -0
  193. package/dist/lib/example-recipes.js +213 -0
  194. package/dist/lib/example-recipes.js.map +1 -0
  195. package/dist/lib/example-storyboards.d.ts +40 -0
  196. package/dist/lib/example-storyboards.d.ts.map +1 -0
  197. package/dist/lib/example-storyboards.js +131 -0
  198. package/dist/lib/example-storyboards.js.map +1 -0
  199. package/dist/lib/example-thumbnail.d.ts +21 -0
  200. package/dist/lib/example-thumbnail.d.ts.map +1 -0
  201. package/dist/lib/example-thumbnail.js +50 -0
  202. package/dist/lib/example-thumbnail.js.map +1 -0
  203. package/dist/lib/example-timelines.d.ts +9 -0
  204. package/dist/lib/example-timelines.d.ts.map +1 -0
  205. package/dist/lib/example-timelines.js +25 -0
  206. package/dist/lib/example-timelines.js.map +1 -0
  207. package/dist/lib/extension-dist.d.ts +24 -0
  208. package/dist/lib/extension-dist.d.ts.map +1 -0
  209. package/dist/lib/extension-dist.js +67 -0
  210. package/dist/lib/extension-dist.js.map +1 -0
  211. package/dist/lib/external-asset-lookup.d.ts +30 -0
  212. package/dist/lib/external-asset-lookup.d.ts.map +1 -0
  213. package/dist/lib/external-asset-lookup.js +99 -0
  214. package/dist/lib/external-asset-lookup.js.map +1 -0
  215. package/dist/lib/external-assets.d.ts +13 -0
  216. package/dist/lib/external-assets.d.ts.map +1 -0
  217. package/dist/lib/external-assets.js +46 -0
  218. package/dist/lib/external-assets.js.map +1 -0
  219. package/dist/lib/fly-replay.d.ts +34 -0
  220. package/dist/lib/fly-replay.d.ts.map +1 -0
  221. package/dist/lib/fly-replay.js +111 -0
  222. package/dist/lib/fly-replay.js.map +1 -0
  223. package/dist/lib/http-rate-limit.d.ts +32 -0
  224. package/dist/lib/http-rate-limit.d.ts.map +1 -0
  225. package/dist/lib/http-rate-limit.js +47 -0
  226. package/dist/lib/http-rate-limit.js.map +1 -0
  227. package/dist/lib/http-tracing.d.ts +12 -0
  228. package/dist/lib/http-tracing.d.ts.map +1 -0
  229. package/dist/lib/http-tracing.js +81 -0
  230. package/dist/lib/http-tracing.js.map +1 -0
  231. package/dist/lib/instance-id.d.ts +25 -0
  232. package/dist/lib/instance-id.d.ts.map +1 -0
  233. package/dist/lib/instance-id.js +44 -0
  234. package/dist/lib/instance-id.js.map +1 -0
  235. package/dist/lib/link-codes.d.ts +82 -0
  236. package/dist/lib/link-codes.d.ts.map +1 -0
  237. package/dist/lib/link-codes.js +100 -0
  238. package/dist/lib/link-codes.js.map +1 -0
  239. package/dist/lib/local-asset-upload.d.ts +5 -0
  240. package/dist/lib/local-asset-upload.d.ts.map +1 -0
  241. package/dist/lib/local-asset-upload.js +69 -0
  242. package/dist/lib/local-asset-upload.js.map +1 -0
  243. package/dist/lib/local-file-access.d.ts +31 -0
  244. package/dist/lib/local-file-access.d.ts.map +1 -0
  245. package/dist/lib/local-file-access.js +169 -0
  246. package/dist/lib/local-file-access.js.map +1 -0
  247. package/dist/lib/localhost-trust.d.ts +59 -0
  248. package/dist/lib/localhost-trust.d.ts.map +1 -0
  249. package/dist/lib/localhost-trust.js +139 -0
  250. package/dist/lib/localhost-trust.js.map +1 -0
  251. package/dist/lib/mcp-mount.d.ts +25 -0
  252. package/dist/lib/mcp-mount.d.ts.map +1 -0
  253. package/dist/lib/mcp-mount.js +32 -0
  254. package/dist/lib/mcp-mount.js.map +1 -0
  255. package/dist/lib/media-size.d.ts +21 -0
  256. package/dist/lib/media-size.d.ts.map +1 -0
  257. package/dist/lib/media-size.js +48 -0
  258. package/dist/lib/media-size.js.map +1 -0
  259. package/dist/lib/media.d.ts +33 -0
  260. package/dist/lib/media.d.ts.map +1 -0
  261. package/dist/lib/media.js +110 -0
  262. package/dist/lib/media.js.map +1 -0
  263. package/dist/lib/package-asset-export.d.ts +83 -0
  264. package/dist/lib/package-asset-export.d.ts.map +1 -0
  265. package/dist/lib/package-asset-export.js +212 -0
  266. package/dist/lib/package-asset-export.js.map +1 -0
  267. package/dist/lib/package-assets.d.ts +41 -0
  268. package/dist/lib/package-assets.d.ts.map +1 -0
  269. package/dist/lib/package-assets.js +155 -0
  270. package/dist/lib/package-assets.js.map +1 -0
  271. package/dist/lib/project-delete.d.ts +11 -0
  272. package/dist/lib/project-delete.d.ts.map +1 -0
  273. package/dist/lib/project-delete.js +67 -0
  274. package/dist/lib/project-delete.js.map +1 -0
  275. package/dist/lib/project-document-copy.d.ts +31 -0
  276. package/dist/lib/project-document-copy.d.ts.map +1 -0
  277. package/dist/lib/project-document-copy.js +473 -0
  278. package/dist/lib/project-document-copy.js.map +1 -0
  279. package/dist/lib/public-app-assets.d.ts +8 -0
  280. package/dist/lib/public-app-assets.d.ts.map +1 -0
  281. package/dist/lib/public-app-assets.js +77 -0
  282. package/dist/lib/public-app-assets.js.map +1 -0
  283. package/dist/lib/public-routes.d.ts +102 -0
  284. package/dist/lib/public-routes.d.ts.map +1 -0
  285. package/dist/lib/public-routes.js +168 -0
  286. package/dist/lib/public-routes.js.map +1 -0
  287. package/dist/lib/public-workflow-share.d.ts +20 -0
  288. package/dist/lib/public-workflow-share.d.ts.map +1 -0
  289. package/dist/lib/public-workflow-share.js +45 -0
  290. package/dist/lib/public-workflow-share.js.map +1 -0
  291. package/dist/lib/run-trace-live-delivery.d.ts +25 -0
  292. package/dist/lib/run-trace-live-delivery.d.ts.map +1 -0
  293. package/dist/lib/run-trace-live-delivery.js +91 -0
  294. package/dist/lib/run-trace-live-delivery.js.map +1 -0
  295. package/dist/lib/runtime-detection.d.ts +17 -0
  296. package/dist/lib/runtime-detection.d.ts.map +1 -0
  297. package/dist/lib/runtime-detection.js +90 -0
  298. package/dist/lib/runtime-detection.js.map +1 -0
  299. package/dist/lib/storage-access.d.ts +21 -0
  300. package/dist/lib/storage-access.d.ts.map +1 -0
  301. package/dist/lib/storage-access.js +74 -0
  302. package/dist/lib/storage-access.js.map +1 -0
  303. package/dist/lib/storage.d.ts +9 -0
  304. package/dist/lib/storage.d.ts.map +1 -0
  305. package/dist/lib/storage.js +28 -0
  306. package/dist/lib/storage.js.map +1 -0
  307. package/dist/lib/storyboard-export.d.ts +64 -0
  308. package/dist/lib/storyboard-export.d.ts.map +1 -0
  309. package/dist/lib/storyboard-export.js +183 -0
  310. package/dist/lib/storyboard-export.js.map +1 -0
  311. package/dist/lib/style-presets.d.ts +34 -0
  312. package/dist/lib/style-presets.d.ts.map +1 -0
  313. package/dist/lib/style-presets.js +62 -0
  314. package/dist/lib/style-presets.js.map +1 -0
  315. package/dist/lib/temp-url-resolver.d.ts +35 -0
  316. package/dist/lib/temp-url-resolver.d.ts.map +1 -0
  317. package/dist/lib/temp-url-resolver.js +88 -0
  318. package/dist/lib/temp-url-resolver.js.map +1 -0
  319. package/dist/lib/test-ui-run-routes.d.ts +8 -0
  320. package/dist/lib/test-ui-run-routes.d.ts.map +1 -0
  321. package/dist/lib/test-ui-run-routes.js +42 -0
  322. package/dist/lib/test-ui-run-routes.js.map +1 -0
  323. package/dist/lib/thumbnail.d.ts +74 -0
  324. package/dist/lib/thumbnail.d.ts.map +1 -0
  325. package/dist/lib/thumbnail.js +305 -0
  326. package/dist/lib/thumbnail.js.map +1 -0
  327. package/dist/lib/timeline-bundle.d.ts +1821 -0
  328. package/dist/lib/timeline-bundle.d.ts.map +1 -0
  329. package/dist/lib/timeline-bundle.js +342 -0
  330. package/dist/lib/timeline-bundle.js.map +1 -0
  331. package/dist/lib/video-proxy.d.ts +114 -0
  332. package/dist/lib/video-proxy.d.ts.map +1 -0
  333. package/dist/lib/video-proxy.js +546 -0
  334. package/dist/lib/video-proxy.js.map +1 -0
  335. package/dist/lib/wire-values.d.ts +31 -0
  336. package/dist/lib/wire-values.d.ts.map +1 -0
  337. package/dist/lib/wire-values.js +49 -0
  338. package/dist/lib/wire-values.js.map +1 -0
  339. package/dist/lib/workflow-bundle.d.ts +102 -0
  340. package/dist/lib/workflow-bundle.d.ts.map +1 -0
  341. package/dist/lib/workflow-bundle.js +306 -0
  342. package/dist/lib/workflow-bundle.js.map +1 -0
  343. package/dist/lib/workflow-service.d.ts +82 -0
  344. package/dist/lib/workflow-service.d.ts.map +1 -0
  345. package/dist/lib/workflow-service.js +197 -0
  346. package/dist/lib/workflow-service.js.map +1 -0
  347. package/dist/lib/workflow-workspace.d.ts +20 -0
  348. package/dist/lib/workflow-workspace.d.ts.map +1 -0
  349. package/dist/lib/workflow-workspace.js +65 -0
  350. package/dist/lib/workflow-workspace.js.map +1 -0
  351. package/dist/lib/ws-connection-health.d.ts +10 -0
  352. package/dist/lib/ws-connection-health.d.ts.map +1 -0
  353. package/dist/lib/ws-connection-health.js +38 -0
  354. package/dist/lib/ws-connection-health.js.map +1 -0
  355. package/dist/lib/ws-rate-limit.d.ts +22 -0
  356. package/dist/lib/ws-rate-limit.d.ts.map +1 -0
  357. package/dist/lib/ws-rate-limit.js +45 -0
  358. package/dist/lib/ws-rate-limit.js.map +1 -0
  359. package/dist/lib/ws-upgrade.d.ts +40 -0
  360. package/dist/lib/ws-upgrade.d.ts.map +1 -0
  361. package/dist/lib/ws-upgrade.js +66 -0
  362. package/dist/lib/ws-upgrade.js.map +1 -0
  363. package/dist/lib/zip-stream.d.ts +46 -0
  364. package/dist/lib/zip-stream.d.ts.map +1 -0
  365. package/dist/lib/zip-stream.js +140 -0
  366. package/dist/lib/zip-stream.js.map +1 -0
  367. package/dist/mcp-agent-tools.d.ts +56 -0
  368. package/dist/mcp-agent-tools.d.ts.map +1 -0
  369. package/dist/mcp-agent-tools.js +1147 -0
  370. package/dist/mcp-agent-tools.js.map +1 -0
  371. package/dist/mcp-client-config.d.ts +64 -0
  372. package/dist/mcp-client-config.d.ts.map +1 -0
  373. package/dist/mcp-client-config.js +353 -0
  374. package/dist/mcp-client-config.js.map +1 -0
  375. package/dist/mcp-server.d.ts +56 -7
  376. package/dist/mcp-server.d.ts.map +1 -1
  377. package/dist/mcp-server.js +255 -762
  378. package/dist/mcp-server.js.map +1 -1
  379. package/dist/mcp-tool-deps.d.ts +20 -0
  380. package/dist/mcp-tool-deps.d.ts.map +1 -0
  381. package/dist/mcp-tool-deps.js +61 -0
  382. package/dist/mcp-tool-deps.js.map +1 -0
  383. package/dist/messagepack.d.ts +7 -0
  384. package/dist/messagepack.d.ts.map +1 -0
  385. package/dist/messagepack.js +19 -0
  386. package/dist/messagepack.js.map +1 -0
  387. package/dist/model-download-runtime.d.ts +9 -0
  388. package/dist/model-download-runtime.d.ts.map +1 -0
  389. package/dist/model-download-runtime.js +77 -0
  390. package/dist/model-download-runtime.js.map +1 -0
  391. package/dist/model-execution-availability.d.ts +14 -0
  392. package/dist/model-execution-availability.d.ts.map +1 -0
  393. package/dist/model-execution-availability.js +161 -0
  394. package/dist/model-execution-availability.js.map +1 -0
  395. package/dist/models-api.d.ts +61 -5
  396. package/dist/models-api.d.ts.map +1 -1
  397. package/dist/models-api.js +182 -689
  398. package/dist/models-api.js.map +1 -1
  399. package/dist/node-registry-setup.d.ts +84 -0
  400. package/dist/node-registry-setup.d.ts.map +1 -0
  401. package/dist/node-registry-setup.js +163 -0
  402. package/dist/node-registry-setup.js.map +1 -0
  403. package/dist/oauth/cimd.d.ts +28 -0
  404. package/dist/oauth/cimd.d.ts.map +1 -0
  405. package/dist/oauth/cimd.js +177 -0
  406. package/dist/oauth/cimd.js.map +1 -0
  407. package/dist/oauth/gate.d.ts +38 -0
  408. package/dist/oauth/gate.d.ts.map +1 -0
  409. package/dist/oauth/gate.js +77 -0
  410. package/dist/oauth/gate.js.map +1 -0
  411. package/dist/oauth/metadata.d.ts +35 -0
  412. package/dist/oauth/metadata.d.ts.map +1 -0
  413. package/dist/oauth/metadata.js +56 -0
  414. package/dist/oauth/metadata.js.map +1 -0
  415. package/dist/oauth/pending-store.d.ts +79 -0
  416. package/dist/oauth/pending-store.d.ts.map +1 -0
  417. package/dist/oauth/pending-store.js +133 -0
  418. package/dist/oauth/pending-store.js.map +1 -0
  419. package/dist/oauth/pkce.d.ts +16 -0
  420. package/dist/oauth/pkce.d.ts.map +1 -0
  421. package/dist/oauth/pkce.js +29 -0
  422. package/dist/oauth/pkce.js.map +1 -0
  423. package/dist/oauth/validate.d.ts +25 -0
  424. package/dist/oauth/validate.d.ts.map +1 -0
  425. package/dist/oauth/validate.js +62 -0
  426. package/dist/oauth/validate.js.map +1 -0
  427. package/dist/oauth/www-authenticate.d.ts +9 -0
  428. package/dist/oauth/www-authenticate.d.ts.map +1 -0
  429. package/dist/oauth/www-authenticate.js +33 -0
  430. package/dist/oauth/www-authenticate.js.map +1 -0
  431. package/dist/oauth-api.d.ts +19 -0
  432. package/dist/oauth-api.d.ts.map +1 -1
  433. package/dist/oauth-api.js +531 -12
  434. package/dist/oauth-api.js.map +1 -1
  435. package/dist/openai-api.d.ts.map +1 -1
  436. package/dist/openai-api.js +4 -9
  437. package/dist/openai-api.js.map +1 -1
  438. package/dist/pack-snapshot.d.ts +24 -0
  439. package/dist/pack-snapshot.d.ts.map +1 -0
  440. package/dist/pack-snapshot.js +35 -0
  441. package/dist/pack-snapshot.js.map +1 -0
  442. package/dist/plugins/websocket.d.ts +21 -4
  443. package/dist/plugins/websocket.d.ts.map +1 -1
  444. package/dist/plugins/websocket.js +106 -297
  445. package/dist/plugins/websocket.js.map +1 -1
  446. package/dist/python-bridge-gate.d.ts +28 -0
  447. package/dist/python-bridge-gate.d.ts.map +1 -0
  448. package/dist/python-bridge-gate.js +36 -0
  449. package/dist/python-bridge-gate.js.map +1 -0
  450. package/dist/resolve-media-urls.d.ts +17 -3
  451. package/dist/resolve-media-urls.d.ts.map +1 -1
  452. package/dist/resolve-media-urls.js +117 -31
  453. package/dist/resolve-media-urls.js.map +1 -1
  454. package/dist/resource-events.d.ts +28 -0
  455. package/dist/resource-events.d.ts.map +1 -0
  456. package/dist/resource-events.js +20 -0
  457. package/dist/resource-events.js.map +1 -0
  458. package/dist/routes/account.d.ts +100 -0
  459. package/dist/routes/account.d.ts.map +1 -0
  460. package/dist/routes/account.js +197 -0
  461. package/dist/routes/account.js.map +1 -0
  462. package/dist/routes/app-runs.d.ts +4 -0
  463. package/dist/routes/app-runs.d.ts.map +1 -0
  464. package/dist/routes/app-runs.js +173 -0
  465. package/dist/routes/app-runs.js.map +1 -0
  466. package/dist/routes/applications.d.ts +36 -0
  467. package/dist/routes/applications.d.ts.map +1 -0
  468. package/dist/routes/applications.js +183 -0
  469. package/dist/routes/applications.js.map +1 -0
  470. package/dist/routes/assets.d.ts +3 -3
  471. package/dist/routes/assets.d.ts.map +1 -1
  472. package/dist/routes/assets.js +78 -44
  473. package/dist/routes/assets.js.map +1 -1
  474. package/dist/routes/atlascloud-webhook.d.ts +93 -0
  475. package/dist/routes/atlascloud-webhook.d.ts.map +1 -0
  476. package/dist/routes/atlascloud-webhook.js +369 -0
  477. package/dist/routes/atlascloud-webhook.js.map +1 -0
  478. package/dist/routes/collections.d.ts.map +1 -1
  479. package/dist/routes/config.d.ts +26 -0
  480. package/dist/routes/config.d.ts.map +1 -0
  481. package/dist/routes/config.js +64 -0
  482. package/dist/routes/config.js.map +1 -0
  483. package/dist/routes/documents.d.ts +27 -0
  484. package/dist/routes/documents.d.ts.map +1 -0
  485. package/dist/routes/documents.js +155 -0
  486. package/dist/routes/documents.js.map +1 -0
  487. package/dist/routes/fal-credits.d.ts +4 -0
  488. package/dist/routes/fal-credits.d.ts.map +1 -0
  489. package/dist/routes/fal-credits.js +101 -0
  490. package/dist/routes/fal-credits.js.map +1 -0
  491. package/dist/routes/fal-pricing-estimate.d.ts +4 -0
  492. package/dist/routes/fal-pricing-estimate.d.ts.map +1 -0
  493. package/dist/routes/fal-pricing-estimate.js +114 -0
  494. package/dist/routes/fal-pricing-estimate.js.map +1 -0
  495. package/dist/routes/fal-pricing.d.ts +4 -0
  496. package/dist/routes/fal-pricing.d.ts.map +1 -0
  497. package/dist/routes/fal-pricing.js +93 -0
  498. package/dist/routes/fal-pricing.js.map +1 -0
  499. package/dist/routes/fal-webhook.d.ts +102 -0
  500. package/dist/routes/fal-webhook.d.ts.map +1 -0
  501. package/dist/routes/fal-webhook.js +379 -0
  502. package/dist/routes/fal-webhook.js.map +1 -0
  503. package/dist/routes/files.d.ts.map +1 -1
  504. package/dist/routes/files.js +4 -3
  505. package/dist/routes/files.js.map +1 -1
  506. package/dist/routes/health.d.ts +1 -0
  507. package/dist/routes/health.d.ts.map +1 -1
  508. package/dist/routes/health.js +41 -7
  509. package/dist/routes/health.js.map +1 -1
  510. package/dist/routes/integrations.d.ts +39 -0
  511. package/dist/routes/integrations.d.ts.map +1 -0
  512. package/dist/routes/integrations.js +211 -0
  513. package/dist/routes/integrations.js.map +1 -0
  514. package/dist/routes/js-scripts.d.ts +32 -0
  515. package/dist/routes/js-scripts.d.ts.map +1 -0
  516. package/dist/routes/js-scripts.js +498 -0
  517. package/dist/routes/js-scripts.js.map +1 -0
  518. package/dist/routes/kie-credits.d.ts +4 -0
  519. package/dist/routes/kie-credits.d.ts.map +1 -0
  520. package/dist/routes/kie-credits.js +93 -0
  521. package/dist/routes/kie-credits.js.map +1 -0
  522. package/dist/routes/kie-pricing.d.ts +4 -0
  523. package/dist/routes/kie-pricing.d.ts.map +1 -0
  524. package/dist/routes/kie-pricing.js +45 -0
  525. package/dist/routes/kie-pricing.js.map +1 -0
  526. package/dist/routes/kie-webhook.d.ts +4 -0
  527. package/dist/routes/kie-webhook.d.ts.map +1 -0
  528. package/dist/routes/kie-webhook.js +70 -0
  529. package/dist/routes/kie-webhook.js.map +1 -0
  530. package/dist/routes/nodes.d.ts.map +1 -1
  531. package/dist/routes/nodes.js +29 -51
  532. package/dist/routes/nodes.js.map +1 -1
  533. package/dist/routes/oauth-as.d.ts +30 -0
  534. package/dist/routes/oauth-as.d.ts.map +1 -0
  535. package/dist/routes/oauth-as.js +412 -0
  536. package/dist/routes/oauth-as.js.map +1 -0
  537. package/dist/routes/oauth.d.ts.map +1 -1
  538. package/dist/routes/openai.d.ts.map +1 -1
  539. package/dist/routes/public-apps.d.ts +27 -0
  540. package/dist/routes/public-apps.d.ts.map +1 -0
  541. package/dist/routes/public-apps.js +99 -0
  542. package/dist/routes/public-apps.js.map +1 -0
  543. package/dist/routes/public-shared-workflows.d.ts +16 -0
  544. package/dist/routes/public-shared-workflows.d.ts.map +1 -0
  545. package/dist/routes/public-shared-workflows.js +55 -0
  546. package/dist/routes/public-shared-workflows.js.map +1 -0
  547. package/dist/routes/run-spans.d.ts +4 -0
  548. package/dist/routes/run-spans.d.ts.map +1 -0
  549. package/dist/routes/run-spans.js +53 -0
  550. package/dist/routes/run-spans.js.map +1 -0
  551. package/dist/routes/sandbox-modules.d.ts +17 -0
  552. package/dist/routes/sandbox-modules.d.ts.map +1 -0
  553. package/dist/routes/sandbox-modules.js +85 -0
  554. package/dist/routes/sandbox-modules.js.map +1 -0
  555. package/dist/routes/sdk-v1.d.ts +24 -0
  556. package/dist/routes/sdk-v1.d.ts.map +1 -0
  557. package/dist/routes/sdk-v1.js +320 -0
  558. package/dist/routes/sdk-v1.js.map +1 -0
  559. package/dist/routes/storage.d.ts.map +1 -1
  560. package/dist/routes/storyboards.d.ts +16 -0
  561. package/dist/routes/storyboards.d.ts.map +1 -0
  562. package/dist/routes/storyboards.js +97 -0
  563. package/dist/routes/storyboards.js.map +1 -0
  564. package/dist/routes/timeline-animations.d.ts +23 -0
  565. package/dist/routes/timeline-animations.d.ts.map +1 -0
  566. package/dist/routes/timeline-animations.js +99 -0
  567. package/dist/routes/timeline-animations.js.map +1 -0
  568. package/dist/routes/timeline-audio-bake.d.ts +51 -0
  569. package/dist/routes/timeline-audio-bake.d.ts.map +1 -0
  570. package/dist/routes/timeline-audio-bake.js +110 -0
  571. package/dist/routes/timeline-audio-bake.js.map +1 -0
  572. package/dist/routes/timeline-fonts.d.ts +51 -0
  573. package/dist/routes/timeline-fonts.d.ts.map +1 -0
  574. package/dist/routes/timeline-fonts.js +195 -0
  575. package/dist/routes/timeline-fonts.js.map +1 -0
  576. package/dist/routes/timeline-isolate-subject.d.ts +55 -0
  577. package/dist/routes/timeline-isolate-subject.d.ts.map +1 -0
  578. package/dist/routes/timeline-isolate-subject.js +128 -0
  579. package/dist/routes/timeline-isolate-subject.js.map +1 -0
  580. package/dist/routes/timeline-track-object.d.ts +39 -0
  581. package/dist/routes/timeline-track-object.d.ts.map +1 -0
  582. package/dist/routes/timeline-track-object.js +97 -0
  583. package/dist/routes/timeline-track-object.js.map +1 -0
  584. package/dist/routes/timelines.d.ts +18 -0
  585. package/dist/routes/timelines.d.ts.map +1 -0
  586. package/dist/routes/timelines.js +191 -0
  587. package/dist/routes/timelines.js.map +1 -0
  588. package/dist/routes/workflows.d.ts +6 -9
  589. package/dist/routes/workflows.d.ts.map +1 -1
  590. package/dist/routes/workflows.js +100 -11
  591. package/dist/routes/workflows.js.map +1 -1
  592. package/dist/routes/workspace.d.ts.map +1 -1
  593. package/dist/run-supervisor.d.ts +30 -0
  594. package/dist/run-supervisor.d.ts.map +1 -0
  595. package/dist/run-supervisor.js +86 -0
  596. package/dist/run-supervisor.js.map +1 -0
  597. package/dist/sandbox-catalog.d.ts +28 -0
  598. package/dist/sandbox-catalog.d.ts.map +1 -0
  599. package/dist/sandbox-catalog.js +74 -0
  600. package/dist/sandbox-catalog.js.map +1 -0
  601. package/dist/screenshot-projects.d.ts +27 -0
  602. package/dist/screenshot-projects.d.ts.map +1 -0
  603. package/dist/screenshot-projects.js +880 -0
  604. package/dist/screenshot-projects.js.map +1 -0
  605. package/dist/screenshot-server.js +950 -47
  606. package/dist/screenshot-server.js.map +1 -1
  607. package/dist/sdk/sdk-cached-model-inventory.d.ts +21 -0
  608. package/dist/sdk/sdk-cached-model-inventory.d.ts.map +1 -0
  609. package/dist/sdk/sdk-cached-model-inventory.js +51 -0
  610. package/dist/sdk/sdk-cached-model-inventory.js.map +1 -0
  611. package/dist/sdk/sdk-capabilities-service.d.ts +32 -0
  612. package/dist/sdk/sdk-capabilities-service.d.ts.map +1 -0
  613. package/dist/sdk/sdk-capabilities-service.js +47 -0
  614. package/dist/sdk/sdk-capabilities-service.js.map +1 -0
  615. package/dist/sdk/sdk-execution-readiness-probe.d.ts +19 -0
  616. package/dist/sdk/sdk-execution-readiness-probe.d.ts.map +1 -0
  617. package/dist/sdk/sdk-execution-readiness-probe.js +90 -0
  618. package/dist/sdk/sdk-execution-readiness-probe.js.map +1 -0
  619. package/dist/sdk/sdk-execution-target-readiness.d.ts +15 -0
  620. package/dist/sdk/sdk-execution-target-readiness.d.ts.map +1 -0
  621. package/dist/sdk/sdk-execution-target-readiness.js +50 -0
  622. package/dist/sdk/sdk-execution-target-readiness.js.map +1 -0
  623. package/dist/sdk/sdk-feature-flags.d.ts +18 -0
  624. package/dist/sdk/sdk-feature-flags.d.ts.map +1 -0
  625. package/dist/sdk/sdk-feature-flags.js +30 -0
  626. package/dist/sdk/sdk-feature-flags.js.map +1 -0
  627. package/dist/sdk/sdk-huggingface-download-state.d.ts +15 -0
  628. package/dist/sdk/sdk-huggingface-download-state.d.ts.map +1 -0
  629. package/dist/sdk/sdk-huggingface-download-state.js +25 -0
  630. package/dist/sdk/sdk-huggingface-download-state.js.map +1 -0
  631. package/dist/sdk/sdk-live-runner-registry.d.ts +21 -0
  632. package/dist/sdk/sdk-live-runner-registry.d.ts.map +1 -0
  633. package/dist/sdk/sdk-live-runner-registry.js +26 -0
  634. package/dist/sdk/sdk-live-runner-registry.js.map +1 -0
  635. package/dist/sdk/sdk-model-catalog-service.d.ts +20 -0
  636. package/dist/sdk/sdk-model-catalog-service.d.ts.map +1 -0
  637. package/dist/sdk/sdk-model-catalog-service.js +219 -0
  638. package/dist/sdk/sdk-model-catalog-service.js.map +1 -0
  639. package/dist/sdk/sdk-model-download-service.d.ts +39 -0
  640. package/dist/sdk/sdk-model-download-service.d.ts.map +1 -0
  641. package/dist/sdk/sdk-model-download-service.js +277 -0
  642. package/dist/sdk/sdk-model-download-service.js.map +1 -0
  643. package/dist/sdk/sdk-model-requirement-probe.d.ts +30 -0
  644. package/dist/sdk/sdk-model-requirement-probe.d.ts.map +1 -0
  645. package/dist/sdk/sdk-model-requirement-probe.js +120 -0
  646. package/dist/sdk/sdk-model-requirement-probe.js.map +1 -0
  647. package/dist/sdk/sdk-node-package-requirement-probe.d.ts +20 -0
  648. package/dist/sdk/sdk-node-package-requirement-probe.d.ts.map +1 -0
  649. package/dist/sdk/sdk-node-package-requirement-probe.js +44 -0
  650. package/dist/sdk/sdk-node-package-requirement-probe.js.map +1 -0
  651. package/dist/sdk/sdk-node-type-inventory-service.d.ts +11 -0
  652. package/dist/sdk/sdk-node-type-inventory-service.d.ts.map +1 -0
  653. package/dist/sdk/sdk-node-type-inventory-service.js +36 -0
  654. package/dist/sdk/sdk-node-type-inventory-service.js.map +1 -0
  655. package/dist/sdk/sdk-preflight-orchestrator.d.ts +54 -0
  656. package/dist/sdk/sdk-preflight-orchestrator.d.ts.map +1 -0
  657. package/dist/sdk/sdk-preflight-orchestrator.js +63 -0
  658. package/dist/sdk/sdk-preflight-orchestrator.js.map +1 -0
  659. package/dist/sdk/sdk-preflight-requirement-resolver.d.ts +35 -0
  660. package/dist/sdk/sdk-preflight-requirement-resolver.d.ts.map +1 -0
  661. package/dist/sdk/sdk-preflight-requirement-resolver.js +67 -0
  662. package/dist/sdk/sdk-preflight-requirement-resolver.js.map +1 -0
  663. package/dist/sdk/sdk-preflight-service.d.ts +61 -0
  664. package/dist/sdk/sdk-preflight-service.d.ts.map +1 -0
  665. package/dist/sdk/sdk-preflight-service.js +104 -0
  666. package/dist/sdk/sdk-preflight-service.js.map +1 -0
  667. package/dist/sdk/sdk-preflight-workflow-source.d.ts +18 -0
  668. package/dist/sdk/sdk-preflight-workflow-source.d.ts.map +1 -0
  669. package/dist/sdk/sdk-preflight-workflow-source.js +42 -0
  670. package/dist/sdk/sdk-preflight-workflow-source.js.map +1 -0
  671. package/dist/sdk/sdk-route-policy.d.ts +3 -0
  672. package/dist/sdk/sdk-route-policy.d.ts.map +1 -0
  673. package/dist/sdk/sdk-route-policy.js +18 -0
  674. package/dist/sdk/sdk-route-policy.js.map +1 -0
  675. package/dist/sdk/sdk-runtime-capabilities-service.d.ts +60 -0
  676. package/dist/sdk/sdk-runtime-capabilities-service.d.ts.map +1 -0
  677. package/dist/sdk/sdk-runtime-capabilities-service.js +30 -0
  678. package/dist/sdk/sdk-runtime-capabilities-service.js.map +1 -0
  679. package/dist/sdk/sdk-runtime-requirement-probe.d.ts +13 -0
  680. package/dist/sdk/sdk-runtime-requirement-probe.d.ts.map +1 -0
  681. package/dist/sdk/sdk-runtime-requirement-probe.js +55 -0
  682. package/dist/sdk/sdk-runtime-requirement-probe.js.map +1 -0
  683. package/dist/sdk/sdk-static-preflight-service.d.ts +66 -0
  684. package/dist/sdk/sdk-static-preflight-service.d.ts.map +1 -0
  685. package/dist/sdk/sdk-static-preflight-service.js +492 -0
  686. package/dist/sdk/sdk-static-preflight-service.js.map +1 -0
  687. package/dist/sdk/sdk-temporary-asset-service.d.ts +18 -0
  688. package/dist/sdk/sdk-temporary-asset-service.d.ts.map +1 -0
  689. package/dist/sdk/sdk-temporary-asset-service.js +33 -0
  690. package/dist/sdk/sdk-temporary-asset-service.js.map +1 -0
  691. package/dist/sdk/sdk-temporary-asset-upload-http-handler.d.ts +9 -0
  692. package/dist/sdk/sdk-temporary-asset-upload-http-handler.d.ts.map +1 -0
  693. package/dist/sdk/sdk-temporary-asset-upload-http-handler.js +65 -0
  694. package/dist/sdk/sdk-temporary-asset-upload-http-handler.js.map +1 -0
  695. package/dist/sdk/sdk-v1-handler-map.d.ts +44 -0
  696. package/dist/sdk/sdk-v1-handler-map.d.ts.map +1 -0
  697. package/dist/sdk/sdk-v1-handler-map.js +37 -0
  698. package/dist/sdk/sdk-v1-handler-map.js.map +1 -0
  699. package/dist/sdk/sdk-v1-service-error.d.ts +21 -0
  700. package/dist/sdk/sdk-v1-service-error.d.ts.map +1 -0
  701. package/dist/sdk/sdk-v1-service-error.js +62 -0
  702. package/dist/sdk/sdk-v1-service-error.js.map +1 -0
  703. package/dist/sdk/sdk-v1-service.d.ts +74 -0
  704. package/dist/sdk/sdk-v1-service.d.ts.map +1 -0
  705. package/dist/sdk/sdk-v1-service.js +219 -0
  706. package/dist/sdk/sdk-v1-service.js.map +1 -0
  707. package/dist/sdk/sdk-worker-readiness-adapter.d.ts +22 -0
  708. package/dist/sdk/sdk-worker-readiness-adapter.d.ts.map +1 -0
  709. package/dist/sdk/sdk-worker-readiness-adapter.js +29 -0
  710. package/dist/sdk/sdk-worker-readiness-adapter.js.map +1 -0
  711. package/dist/server.js +1091 -206
  712. package/dist/server.js.map +1 -1
  713. package/dist/session/app-run-fold.d.ts +7 -0
  714. package/dist/session/app-run-fold.d.ts.map +1 -0
  715. package/dist/session/app-run-fold.js +45 -0
  716. package/dist/session/app-run-fold.js.map +1 -0
  717. package/dist/session/asset-autosave.d.ts +80 -0
  718. package/dist/session/asset-autosave.d.ts.map +1 -0
  719. package/dist/session/asset-autosave.js +456 -0
  720. package/dist/session/asset-autosave.js.map +1 -0
  721. package/dist/session/chat-compaction.d.ts +107 -0
  722. package/dist/session/chat-compaction.d.ts.map +1 -0
  723. package/dist/session/chat-compaction.js +191 -0
  724. package/dist/session/chat-compaction.js.map +1 -0
  725. package/dist/session/chat-history.d.ts +75 -0
  726. package/dist/session/chat-history.d.ts.map +1 -0
  727. package/dist/session/chat-history.js +194 -0
  728. package/dist/session/chat-history.js.map +1 -0
  729. package/dist/session/chat-prompt.d.ts +45 -0
  730. package/dist/session/chat-prompt.d.ts.map +1 -0
  731. package/dist/session/chat-prompt.js +502 -0
  732. package/dist/session/chat-prompt.js.map +1 -0
  733. package/dist/session/chat-turn.d.ts +337 -0
  734. package/dist/session/chat-turn.d.ts.map +1 -0
  735. package/dist/session/chat-turn.js +3612 -0
  736. package/dist/session/chat-turn.js.map +1 -0
  737. package/dist/session/client-session.d.ts +59 -0
  738. package/dist/session/client-session.d.ts.map +1 -0
  739. package/dist/session/client-session.js +2 -0
  740. package/dist/session/client-session.js.map +1 -0
  741. package/dist/session/commands.d.ts +133 -0
  742. package/dist/session/commands.d.ts.map +1 -0
  743. package/dist/session/commands.js +784 -0
  744. package/dist/session/commands.js.map +1 -0
  745. package/dist/session/inference.d.ts +218 -0
  746. package/dist/session/inference.d.ts.map +1 -0
  747. package/dist/session/inference.js +1143 -0
  748. package/dist/session/inference.js.map +1 -0
  749. package/dist/session/job-execution.d.ts +484 -0
  750. package/dist/session/job-execution.d.ts.map +1 -0
  751. package/dist/session/job-execution.js +2379 -0
  752. package/dist/session/job-execution.js.map +1 -0
  753. package/dist/session/media-generation.d.ts +94 -0
  754. package/dist/session/media-generation.d.ts.map +1 -0
  755. package/dist/session/media-generation.js +234 -0
  756. package/dist/session/media-generation.js.map +1 -0
  757. package/dist/session/model-interfaces.d.ts +28 -0
  758. package/dist/session/model-interfaces.d.ts.map +1 -0
  759. package/dist/session/model-interfaces.js +133 -0
  760. package/dist/session/model-interfaces.js.map +1 -0
  761. package/dist/session/sanitize.d.ts +7 -0
  762. package/dist/session/sanitize.d.ts.map +1 -0
  763. package/dist/session/sanitize.js +64 -0
  764. package/dist/session/sanitize.js.map +1 -0
  765. package/dist/settings-registry.d.ts +6 -15
  766. package/dist/settings-registry.d.ts.map +1 -1
  767. package/dist/settings-registry.js +6 -103
  768. package/dist/settings-registry.js.map +1 -1
  769. package/dist/storage-api.d.ts +20 -0
  770. package/dist/storage-api.d.ts.map +1 -1
  771. package/dist/storage-api.js +260 -77
  772. package/dist/storage-api.js.map +1 -1
  773. package/dist/storage-retention.d.ts +14 -0
  774. package/dist/storage-retention.d.ts.map +1 -0
  775. package/dist/storage-retention.js +95 -0
  776. package/dist/storage-retention.js.map +1 -0
  777. package/dist/system-stats.d.ts +52 -0
  778. package/dist/system-stats.d.ts.map +1 -0
  779. package/dist/system-stats.js +134 -0
  780. package/dist/system-stats.js.map +1 -0
  781. package/dist/test-ui-server.d.ts +46 -0
  782. package/dist/test-ui-server.d.ts.map +1 -1
  783. package/dist/test-ui-server.js +207 -42
  784. package/dist/test-ui-server.js.map +1 -1
  785. package/dist/timeline-generation-recovery.d.ts +4 -0
  786. package/dist/timeline-generation-recovery.d.ts.map +1 -0
  787. package/dist/timeline-generation-recovery.js +72 -0
  788. package/dist/timeline-generation-recovery.js.map +1 -0
  789. package/dist/triggers/boot.d.ts +73 -0
  790. package/dist/triggers/boot.d.ts.map +1 -0
  791. package/dist/triggers/boot.js +149 -0
  792. package/dist/triggers/boot.js.map +1 -0
  793. package/dist/triggers/dispatcher.d.ts +234 -0
  794. package/dist/triggers/dispatcher.d.ts.map +1 -0
  795. package/dist/triggers/dispatcher.js +525 -0
  796. package/dist/triggers/dispatcher.js.map +1 -0
  797. package/dist/triggers/file-watch.d.ts +90 -0
  798. package/dist/triggers/file-watch.d.ts.map +1 -0
  799. package/dist/triggers/file-watch.js +405 -0
  800. package/dist/triggers/file-watch.js.map +1 -0
  801. package/dist/triggers/registration-sync.d.ts +34 -0
  802. package/dist/triggers/registration-sync.d.ts.map +1 -0
  803. package/dist/triggers/registration-sync.js +162 -0
  804. package/dist/triggers/registration-sync.js.map +1 -0
  805. package/dist/triggers/schedule-timing.d.ts +52 -0
  806. package/dist/triggers/schedule-timing.d.ts.map +1 -0
  807. package/dist/triggers/schedule-timing.js +90 -0
  808. package/dist/triggers/schedule-timing.js.map +1 -0
  809. package/dist/triggers/scheduler.d.ts +55 -0
  810. package/dist/triggers/scheduler.d.ts.map +1 -0
  811. package/dist/triggers/scheduler.js +122 -0
  812. package/dist/triggers/scheduler.js.map +1 -0
  813. package/dist/triggers/settle.d.ts +66 -0
  814. package/dist/triggers/settle.d.ts.map +1 -0
  815. package/dist/triggers/settle.js +99 -0
  816. package/dist/triggers/settle.js.map +1 -0
  817. package/dist/triggers/stores.d.ts +38 -0
  818. package/dist/triggers/stores.d.ts.map +1 -0
  819. package/dist/triggers/stores.js +168 -0
  820. package/dist/triggers/stores.js.map +1 -0
  821. package/dist/triggers/webhook-route.d.ts +49 -0
  822. package/dist/triggers/webhook-route.d.ts.map +1 -0
  823. package/dist/triggers/webhook-route.js +148 -0
  824. package/dist/triggers/webhook-route.js.map +1 -0
  825. package/dist/trpc/context.d.ts +52 -5
  826. package/dist/trpc/context.d.ts.map +1 -1
  827. package/dist/trpc/context.js +4 -1
  828. package/dist/trpc/context.js.map +1 -1
  829. package/dist/trpc/error-formatter.d.ts.map +1 -1
  830. package/dist/trpc/error-formatter.js +23 -2
  831. package/dist/trpc/error-formatter.js.map +1 -1
  832. package/dist/trpc/error-logging.d.ts +24 -0
  833. package/dist/trpc/error-logging.d.ts.map +1 -0
  834. package/dist/trpc/error-logging.js +48 -0
  835. package/dist/trpc/error-logging.js.map +1 -0
  836. package/dist/trpc/index.d.ts +2 -2
  837. package/dist/trpc/index.d.ts.map +1 -1
  838. package/dist/trpc/index.js +0 -2
  839. package/dist/trpc/index.js.map +1 -1
  840. package/dist/trpc/middleware.d.ts +6 -3
  841. package/dist/trpc/middleware.d.ts.map +1 -1
  842. package/dist/trpc/router.d.ts +100 -2540
  843. package/dist/trpc/router.d.ts.map +1 -1
  844. package/dist/trpc/router.js +58 -6
  845. package/dist/trpc/router.js.map +1 -1
  846. package/dist/trpc/routers/agent-access.d.ts +149 -0
  847. package/dist/trpc/routers/agent-access.d.ts.map +1 -0
  848. package/dist/trpc/routers/agent-access.js +224 -0
  849. package/dist/trpc/routers/agent-access.js.map +1 -0
  850. package/dist/trpc/routers/app-instances.d.ts +2269 -0
  851. package/dist/trpc/routers/app-instances.d.ts.map +1 -0
  852. package/dist/trpc/routers/app-instances.js +52 -0
  853. package/dist/trpc/routers/app-instances.js.map +1 -0
  854. package/dist/trpc/routers/app-runs.d.ts +1092 -0
  855. package/dist/trpc/routers/app-runs.d.ts.map +1 -0
  856. package/dist/trpc/routers/app-runs.js +28 -0
  857. package/dist/trpc/routers/app-runs.js.map +1 -0
  858. package/dist/trpc/routers/applications.d.ts +2212 -0
  859. package/dist/trpc/routers/applications.d.ts.map +1 -0
  860. package/dist/trpc/routers/applications.js +221 -0
  861. package/dist/trpc/routers/applications.js.map +1 -0
  862. package/dist/trpc/routers/assets.d.ts +194 -42
  863. package/dist/trpc/routers/assets.d.ts.map +1 -1
  864. package/dist/trpc/routers/assets.js +503 -105
  865. package/dist/trpc/routers/assets.js.map +1 -1
  866. package/dist/trpc/routers/bug-reports.d.ts +33 -0
  867. package/dist/trpc/routers/bug-reports.d.ts.map +1 -0
  868. package/dist/trpc/routers/bug-reports.js +69 -0
  869. package/dist/trpc/routers/bug-reports.js.map +1 -0
  870. package/dist/trpc/routers/code-gen.d.ts +99 -0
  871. package/dist/trpc/routers/code-gen.d.ts.map +1 -0
  872. package/dist/trpc/routers/code-gen.js +164 -0
  873. package/dist/trpc/routers/code-gen.js.map +1 -0
  874. package/dist/trpc/routers/collections.d.ts +1 -26
  875. package/dist/trpc/routers/collections.d.ts.map +1 -1
  876. package/dist/trpc/routers/collections.js +145 -78
  877. package/dist/trpc/routers/collections.js.map +1 -1
  878. package/dist/trpc/routers/costs.d.ts +40 -96
  879. package/dist/trpc/routers/costs.d.ts.map +1 -1
  880. package/dist/trpc/routers/costs.js +14 -89
  881. package/dist/trpc/routers/costs.js.map +1 -1
  882. package/dist/trpc/routers/credits.d.ts +110 -0
  883. package/dist/trpc/routers/credits.d.ts.map +1 -0
  884. package/dist/trpc/routers/credits.js +69 -0
  885. package/dist/trpc/routers/credits.js.map +1 -0
  886. package/dist/trpc/routers/custom-providers.d.ts +88 -0
  887. package/dist/trpc/routers/custom-providers.d.ts.map +1 -0
  888. package/dist/trpc/routers/custom-providers.js +140 -0
  889. package/dist/trpc/routers/custom-providers.js.map +1 -0
  890. package/dist/trpc/routers/documents.d.ts +61 -0
  891. package/dist/trpc/routers/documents.d.ts.map +1 -0
  892. package/dist/trpc/routers/documents.js +29 -0
  893. package/dist/trpc/routers/documents.js.map +1 -0
  894. package/dist/trpc/routers/error-traces.d.ts +132 -0
  895. package/dist/trpc/routers/error-traces.d.ts.map +1 -0
  896. package/dist/trpc/routers/error-traces.js +118 -0
  897. package/dist/trpc/routers/error-traces.js.map +1 -0
  898. package/dist/trpc/routers/extension.d.ts +24 -0
  899. package/dist/trpc/routers/extension.d.ts.map +1 -0
  900. package/dist/trpc/routers/extension.js +28 -0
  901. package/dist/trpc/routers/extension.js.map +1 -0
  902. package/dist/trpc/routers/external-mcp.d.ts +108 -0
  903. package/dist/trpc/routers/external-mcp.d.ts.map +1 -0
  904. package/dist/trpc/routers/external-mcp.js +70 -0
  905. package/dist/trpc/routers/external-mcp.js.map +1 -0
  906. package/dist/trpc/routers/files.d.ts +9 -2
  907. package/dist/trpc/routers/files.d.ts.map +1 -1
  908. package/dist/trpc/routers/files.js +67 -37
  909. package/dist/trpc/routers/files.js.map +1 -1
  910. package/dist/trpc/routers/fonts.d.ts +30 -0
  911. package/dist/trpc/routers/fonts.d.ts.map +1 -0
  912. package/dist/trpc/routers/fonts.js +112 -0
  913. package/dist/trpc/routers/fonts.js.map +1 -0
  914. package/dist/trpc/routers/gameDraftHistory.d.ts +8 -0
  915. package/dist/trpc/routers/gameDraftHistory.d.ts.map +1 -0
  916. package/dist/trpc/routers/gameDraftHistory.js +40 -0
  917. package/dist/trpc/routers/gameDraftHistory.js.map +1 -0
  918. package/dist/trpc/routers/games.d.ts +26502 -0
  919. package/dist/trpc/routers/games.d.ts.map +1 -0
  920. package/dist/trpc/routers/games.js +674 -0
  921. package/dist/trpc/routers/games.js.map +1 -0
  922. package/dist/trpc/routers/integrations.d.ts +86 -0
  923. package/dist/trpc/routers/integrations.d.ts.map +1 -0
  924. package/dist/trpc/routers/integrations.js +129 -0
  925. package/dist/trpc/routers/integrations.js.map +1 -0
  926. package/dist/trpc/routers/jobs.d.ts +117 -21
  927. package/dist/trpc/routers/jobs.d.ts.map +1 -1
  928. package/dist/trpc/routers/jobs.js +191 -30
  929. package/dist/trpc/routers/jobs.js.map +1 -1
  930. package/dist/trpc/routers/js-scripts.d.ts +410 -0
  931. package/dist/trpc/routers/js-scripts.d.ts.map +1 -0
  932. package/dist/trpc/routers/js-scripts.js +303 -0
  933. package/dist/trpc/routers/js-scripts.js.map +1 -0
  934. package/dist/trpc/routers/mcp-config.d.ts +4 -2
  935. package/dist/trpc/routers/mcp-config.d.ts.map +1 -1
  936. package/dist/trpc/routers/mcp-config.js +46 -206
  937. package/dist/trpc/routers/mcp-config.js.map +1 -1
  938. package/dist/trpc/routers/memories.d.ts +79 -0
  939. package/dist/trpc/routers/memories.d.ts.map +1 -0
  940. package/dist/trpc/routers/memories.js +66 -0
  941. package/dist/trpc/routers/memories.js.map +1 -0
  942. package/dist/trpc/routers/messages.d.ts +4 -77
  943. package/dist/trpc/routers/messages.d.ts.map +1 -1
  944. package/dist/trpc/routers/messages.js +9 -58
  945. package/dist/trpc/routers/messages.js.map +1 -1
  946. package/dist/trpc/routers/models.d.ts +1544 -249
  947. package/dist/trpc/routers/models.d.ts.map +1 -1
  948. package/dist/trpc/routers/models.js +624 -318
  949. package/dist/trpc/routers/models.js.map +1 -1
  950. package/dist/trpc/routers/nodes.d.ts +32 -16
  951. package/dist/trpc/routers/nodes.d.ts.map +1 -1
  952. package/dist/trpc/routers/nodes.js +70 -31
  953. package/dist/trpc/routers/nodes.js.map +1 -1
  954. package/dist/trpc/routers/packs.d.ts +184 -0
  955. package/dist/trpc/routers/packs.d.ts.map +1 -0
  956. package/dist/trpc/routers/packs.js +259 -0
  957. package/dist/trpc/routers/packs.js.map +1 -0
  958. package/dist/trpc/routers/projects.d.ts +422 -0
  959. package/dist/trpc/routers/projects.d.ts.map +1 -0
  960. package/dist/trpc/routers/projects.js +373 -0
  961. package/dist/trpc/routers/projects.js.map +1 -0
  962. package/dist/trpc/routers/resources.d.ts +120 -0
  963. package/dist/trpc/routers/resources.d.ts.map +1 -0
  964. package/dist/trpc/routers/resources.js +212 -0
  965. package/dist/trpc/routers/resources.js.map +1 -0
  966. package/dist/trpc/routers/runs.d.ts +472 -0
  967. package/dist/trpc/routers/runs.d.ts.map +1 -0
  968. package/dist/trpc/routers/runs.js +40 -0
  969. package/dist/trpc/routers/runs.js.map +1 -0
  970. package/dist/trpc/routers/scripts.d.ts +1116 -0
  971. package/dist/trpc/routers/scripts.d.ts.map +1 -0
  972. package/dist/trpc/routers/scripts.js +131 -0
  973. package/dist/trpc/routers/scripts.js.map +1 -0
  974. package/dist/trpc/routers/segmentation.d.ts +62 -0
  975. package/dist/trpc/routers/segmentation.d.ts.map +1 -0
  976. package/dist/trpc/routers/segmentation.js +146 -0
  977. package/dist/trpc/routers/segmentation.js.map +1 -0
  978. package/dist/trpc/routers/settings.d.ts +180 -10
  979. package/dist/trpc/routers/settings.d.ts.map +1 -1
  980. package/dist/trpc/routers/settings.js +125 -33
  981. package/dist/trpc/routers/settings.js.map +1 -1
  982. package/dist/trpc/routers/sketch.d.ts +868 -0
  983. package/dist/trpc/routers/sketch.d.ts.map +1 -0
  984. package/dist/trpc/routers/sketch.js +617 -0
  985. package/dist/trpc/routers/sketch.js.map +1 -0
  986. package/dist/trpc/routers/skills.d.ts +76 -22
  987. package/dist/trpc/routers/skills.d.ts.map +1 -1
  988. package/dist/trpc/routers/skills.js +195 -170
  989. package/dist/trpc/routers/skills.js.map +1 -1
  990. package/dist/trpc/routers/storage.d.ts +3 -30
  991. package/dist/trpc/routers/storage.d.ts.map +1 -1
  992. package/dist/trpc/routers/storage.js +60 -117
  993. package/dist/trpc/routers/storage.js.map +1 -1
  994. package/dist/trpc/routers/storyboards.d.ts +6639 -0
  995. package/dist/trpc/routers/storyboards.d.ts.map +1 -0
  996. package/dist/trpc/routers/storyboards.js +156 -0
  997. package/dist/trpc/routers/storyboards.js.map +1 -0
  998. package/dist/trpc/routers/threads.d.ts +33 -21
  999. package/dist/trpc/routers/threads.d.ts.map +1 -1
  1000. package/dist/trpc/routers/threads.js +36 -30
  1001. package/dist/trpc/routers/threads.js.map +1 -1
  1002. package/dist/trpc/routers/timeline.d.ts +9085 -0
  1003. package/dist/trpc/routers/timeline.d.ts.map +1 -0
  1004. package/dist/trpc/routers/timeline.js +669 -0
  1005. package/dist/trpc/routers/timeline.js.map +1 -0
  1006. package/dist/trpc/routers/triggers.d.ts +46 -0
  1007. package/dist/trpc/routers/triggers.d.ts.map +1 -0
  1008. package/dist/trpc/routers/triggers.js +117 -0
  1009. package/dist/trpc/routers/triggers.js.map +1 -0
  1010. package/dist/trpc/routers/users.d.ts +1 -14
  1011. package/dist/trpc/routers/users.d.ts.map +1 -1
  1012. package/dist/trpc/routers/users.js +1 -12
  1013. package/dist/trpc/routers/users.js.map +1 -1
  1014. package/dist/trpc/routers/worker.d.ts +243 -0
  1015. package/dist/trpc/routers/worker.d.ts.map +1 -0
  1016. package/dist/trpc/routers/worker.js +221 -0
  1017. package/dist/trpc/routers/worker.js.map +1 -0
  1018. package/dist/trpc/routers/workflows.d.ts +428 -187
  1019. package/dist/trpc/routers/workflows.d.ts.map +1 -1
  1020. package/dist/trpc/routers/workflows.js +347 -345
  1021. package/dist/trpc/routers/workflows.js.map +1 -1
  1022. package/dist/trpc/routers/workspace.d.ts +59 -33
  1023. package/dist/trpc/routers/workspace.d.ts.map +1 -1
  1024. package/dist/trpc/routers/workspace.js +230 -93
  1025. package/dist/trpc/routers/workspace.js.map +1 -1
  1026. package/dist/trpc/sandbox-coverage.d.ts +64 -0
  1027. package/dist/trpc/sandbox-coverage.d.ts.map +1 -0
  1028. package/dist/trpc/sandbox-coverage.js +1139 -0
  1029. package/dist/trpc/sandbox-coverage.js.map +1 -0
  1030. package/dist/websocket-client-session.d.ts +322 -0
  1031. package/dist/websocket-client-session.d.ts.map +1 -0
  1032. package/dist/websocket-client-session.js +1267 -0
  1033. package/dist/websocket-client-session.js.map +1 -0
  1034. package/dist/workflow-interface-service.d.ts +87 -0
  1035. package/dist/workflow-interface-service.d.ts.map +1 -0
  1036. package/dist/workflow-interface-service.js +131 -0
  1037. package/dist/workflow-interface-service.js.map +1 -0
  1038. package/dist/workspace-api.d.ts.map +1 -1
  1039. package/dist/workspace-api.js +33 -23
  1040. package/dist/workspace-api.js.map +1 -1
  1041. package/dist/ws-adapter.d.ts +46 -3
  1042. package/dist/ws-adapter.d.ts.map +1 -1
  1043. package/dist/ws-adapter.js +164 -26
  1044. package/dist/ws-adapter.js.map +1 -1
  1045. package/package.json +97 -36
  1046. package/dist/agent/agent-runtime.d.ts +0 -47
  1047. package/dist/agent/agent-runtime.d.ts.map +0 -1
  1048. package/dist/agent/agent-runtime.js +0 -579
  1049. package/dist/agent/agent-runtime.js.map +0 -1
  1050. package/dist/agent/codex-agent.d.ts +0 -41
  1051. package/dist/agent/codex-agent.d.ts.map +0 -1
  1052. package/dist/agent/codex-agent.js +0 -334
  1053. package/dist/agent/codex-agent.js.map +0 -1
  1054. package/dist/agent/index.d.ts +0 -6
  1055. package/dist/agent/index.d.ts.map +0 -1
  1056. package/dist/agent/index.js +0 -4
  1057. package/dist/agent/index.js.map +0 -1
  1058. package/dist/agent/llm-agent.d.ts +0 -51
  1059. package/dist/agent/llm-agent.d.ts.map +0 -1
  1060. package/dist/agent/llm-agent.js +0 -526
  1061. package/dist/agent/llm-agent.js.map +0 -1
  1062. package/dist/agent/mcp-tool-server.d.ts +0 -33
  1063. package/dist/agent/mcp-tool-server.d.ts.map +0 -1
  1064. package/dist/agent/mcp-tool-server.js +0 -292
  1065. package/dist/agent/mcp-tool-server.js.map +0 -1
  1066. package/dist/agent/opencode-agent.d.ts +0 -32
  1067. package/dist/agent/opencode-agent.d.ts.map +0 -1
  1068. package/dist/agent/opencode-agent.js +0 -332
  1069. package/dist/agent/opencode-agent.js.map +0 -1
  1070. package/dist/agent/pi-agent.d.ts +0 -42
  1071. package/dist/agent/pi-agent.d.ts.map +0 -1
  1072. package/dist/agent/pi-agent.js +0 -429
  1073. package/dist/agent/pi-agent.js.map +0 -1
  1074. package/dist/agent/sdk-provider.d.ts +0 -46
  1075. package/dist/agent/sdk-provider.d.ts.map +0 -1
  1076. package/dist/agent/sdk-provider.js +0 -50
  1077. package/dist/agent/sdk-provider.js.map +0 -1
  1078. package/dist/agent/socket-route.d.ts +0 -11
  1079. package/dist/agent/socket-route.d.ts.map +0 -1
  1080. package/dist/agent/socket-route.js +0 -262
  1081. package/dist/agent/socket-route.js.map +0 -1
  1082. package/dist/agent/transport.d.ts +0 -39
  1083. package/dist/agent/transport.d.ts.map +0 -1
  1084. package/dist/agent/transport.js +0 -17
  1085. package/dist/agent/transport.js.map +0 -1
  1086. package/dist/agent/types.d.ts +0 -11
  1087. package/dist/agent/types.d.ts.map +0 -1
  1088. package/dist/agent/types.js +0 -10
  1089. package/dist/agent/types.js.map +0 -1
  1090. package/dist/routes/jobs.d.ts +0 -16
  1091. package/dist/routes/jobs.d.ts.map +0 -1
  1092. package/dist/routes/jobs.js +0 -25
  1093. package/dist/routes/jobs.js.map +0 -1
  1094. package/dist/trpc/routers/sandboxes.d.ts +0 -64
  1095. package/dist/trpc/routers/sandboxes.d.ts.map +0 -1
  1096. package/dist/trpc/routers/sandboxes.js +0 -327
  1097. package/dist/trpc/routers/sandboxes.js.map +0 -1
  1098. package/dist/unified-websocket-runner.d.ts +0 -280
  1099. package/dist/unified-websocket-runner.d.ts.map +0 -1
  1100. package/dist/unified-websocket-runner.js +0 -3840
  1101. package/dist/unified-websocket-runner.js.map +0 -1
@@ -0,0 +1,1267 @@
1
+ import { RunTraceLiveDelivery } from "./lib/run-trace-live-delivery.js";
2
+ import { subscribeRunTraceUpdates } from "@nodetool-ai/execution";
3
+ import { getSetting } from "./settings-registry.js";
4
+ import { ConfiguredProviderCache } from "./configured-providers.js";
5
+ import { packWebSocketMessage, unpackWebSocketMessage } from "./messagepack.js";
6
+ import { createLogger, getByteLimitEnv } from "@nodetool-ai/config";
7
+ import { getAssetAdapter } from "./lib/storage.js";
8
+ import { isNonEmptyString, isObjectLike, isString } from "./lib/wire-values.js";
9
+ import { onDrain } from "./drain.js";
10
+ import { resourceEvents } from "./resource-events.js";
11
+ import { createSystemStatsSampler, systemStatsBroadcastEnabled } from "./system-stats.js";
12
+ import { resolveContentUrls } from "./resolve-media-urls.js";
13
+ import { Asset, ModelObserver } from "@nodetool-ai/models";
14
+ import { fetchExternalMedia } from "@nodetool-ai/runtime";
15
+ import { webSocketCommandEnvelopeSchema, commandDataSchemas, controlMessageInSchemas, outboundControlMessageSchemas, processingMessageSchemas } from "@nodetool-ai/protocol";
16
+ import { retrieveAssetBytes } from "./lib/asset-paths.js";
17
+ import { encodeNativeAudioChunks, primaryTextOutputName } from "./session/asset-autosave.js";
18
+ import { buildChatAgentSystemPrompt, CHAT_AGENT_SYSTEM_PROMPT, focusedUiToolNames, normalizeToolCallName, RESIDENT_TOOL_NAMES, unroutableToolMessage } from "./session/chat-prompt.js";
19
+ import { serverModelInterfaces } from "./session/model-interfaces.js";
20
+ import { formatSanitizedError } from "./session/sanitize.js";
21
+ import { DirectInferenceHandler, entityRefResolver, estimateDirectTextSpend, resolveEntityReferenceImages } from "./session/inference.js";
22
+ // The pure helpers moved to ./session/*; re-exported here so every existing
23
+ // import path keeps working.
24
+ export { CHAT_AGENT_SYSTEM_PROMPT, RESIDENT_TOOL_NAMES, buildChatAgentSystemPrompt, estimateDirectTextSpend, focusedUiToolNames, normalizeToolCallName, primaryTextOutputName, serverModelInterfaces, unroutableToolMessage };
25
+ import { DEFAULT_RUN_JOB_EXECUTION_OPTIONS, JobExecutionManager, resolveRunJobExecutionOptions, resolveRunJobUserId } from "./session/job-execution.js";
26
+ // The job region moved to ./session/job-execution.ts; its wire types are
27
+ // re-exported here so every existing import path keeps working.
28
+ export { DEFAULT_RUN_JOB_EXECUTION_OPTIONS, resolveRunJobExecutionOptions, resolveRunJobUserId };
29
+ import { ChatTurnHandler } from "./session/chat-turn.js";
30
+ import { CommandRouter } from "./session/commands.js";
31
+ const log = createLogger("nodetool.websocket.runner");
32
+ /** RFC 6455 "service restart" — what a drained connection is closed with. */
33
+ const DRAIN_CLOSE_CODE = 1012;
34
+ /** How often a draining connection re-checks whether its work has settled. */
35
+ const DRAIN_POLL_MS = 250;
36
+ /**
37
+ * Largest binary (MsgPack) frame accepted from a client before deserialization.
38
+ * MsgPack can amplify a small payload into a huge in-memory structure, so the
39
+ * raw byte length is bounded up front. Override with the
40
+ * `NODETOOL_WS_MAX_MESSAGE_BYTES` environment variable (value in bytes);
41
+ * default 256 MiB.
42
+ */
43
+ const DEFAULT_MAX_WS_MESSAGE_BYTES = 256 * 1024 * 1024;
44
+ function getMaxWsMessageBytes() {
45
+ return getByteLimitEnv("NODETOOL_WS_MAX_MESSAGE_BYTES", DEFAULT_MAX_WS_MESSAGE_BYTES);
46
+ }
47
+ /**
48
+ * Outbound (server→client) frame validation gate. Every message `sendMessage`
49
+ * emits whose `type` matches a known `ProcessingMessage` variant or one of
50
+ * the small set of non-`ProcessingMessage` server frames (`pong`,
51
+ * `rpc_response`, `system_stats`, `resource_change`) is safe-parsed against
52
+ * its Zod schema before it goes on the wire; frames with an unrecognized (or
53
+ * absent) `type` — the ad hoc `{ error, details }` command replies — are left
54
+ * alone, as they always have been.
55
+ *
56
+ * Set `NODETOOL_VALIDATE_OUTBOUND_WS=1` to force validation on, `=0` to force
57
+ * it off. Unset, it defaults to on under `NODE_ENV=test` or Vitest (`VITEST`)
58
+ * and off everywhere else — a server bug that produces a malformed frame
59
+ * should fail the test that exercised it, not corrupt a production
60
+ * connection with a thrown error mid-stream. On failure it throws (the
61
+ * caller — `sendMessage` — is already inside the code path the bug is in, so
62
+ * failing loudly there is what surfaces it to the test).
63
+ */
64
+ function shouldValidateOutboundWs() {
65
+ const override = process.env["NODETOOL_VALIDATE_OUTBOUND_WS"]?.trim();
66
+ if (override === "1" || override === "true")
67
+ return true;
68
+ if (override === "0" || override === "false")
69
+ return false;
70
+ return process.env["NODE_ENV"] === "test" || Boolean(process.env["VITEST"]);
71
+ }
72
+ /**
73
+ * Throws when outbound validation is enabled and `message` carries a `type`
74
+ * this package can validate but fails to conform to its schema. No-op for
75
+ * unrecognized/absent `type` values — see {@link shouldValidateOutboundWs}.
76
+ */
77
+ function assertValidOutboundMessage(message) {
78
+ if (!shouldValidateOutboundWs())
79
+ return;
80
+ const type = isString(message["type"]) ? message["type"] : null;
81
+ if (!type)
82
+ return;
83
+ const schema = processingMessageSchemas[type] ??
84
+ outboundControlMessageSchemas[type];
85
+ if (!schema)
86
+ return;
87
+ const parsed = schema.safeParse(message);
88
+ if (!parsed.success) {
89
+ throw new Error(`Outbound WebSocket message failed protocol validation (type: "${type}"): ` +
90
+ parsed.error.issues
91
+ .map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`)
92
+ .join("; "));
93
+ }
94
+ }
95
+ export class ToolBridge {
96
+ waiters = new Map();
97
+ createWaiter(toolCallId, timeoutMs = 300_000, scope) {
98
+ return new Promise((resolve, reject) => {
99
+ let timer = null;
100
+ const cleanup = () => {
101
+ if (timer)
102
+ clearTimeout(timer);
103
+ this.waiters.delete(toolCallId);
104
+ };
105
+ const wrappedResolve = (value) => {
106
+ cleanup();
107
+ resolve(value);
108
+ };
109
+ const wrappedReject = (reason) => {
110
+ cleanup();
111
+ reject(reason);
112
+ };
113
+ this.waiters.set(toolCallId, {
114
+ resolve: wrappedResolve,
115
+ reject: wrappedReject,
116
+ scope
117
+ });
118
+ if (timeoutMs > 0) {
119
+ timer = setTimeout(() => {
120
+ if (this.waiters.has(toolCallId)) {
121
+ wrappedReject(new Error(`Tool call ${toolCallId} timed out after ${timeoutMs}ms`));
122
+ }
123
+ }, timeoutMs);
124
+ }
125
+ });
126
+ }
127
+ resolveResult(toolCallId, payload) {
128
+ const waiter = this.waiters.get(toolCallId);
129
+ if (!waiter)
130
+ return;
131
+ waiter.resolve(payload);
132
+ }
133
+ /** Resolve every waiter in `scope` with the same payload. */
134
+ resolveScope(scope, payload) {
135
+ for (const waiter of [...this.waiters.values()]) {
136
+ if (waiter.scope === scope) {
137
+ waiter.resolve(payload);
138
+ }
139
+ }
140
+ }
141
+ rejectResult(toolCallId, error) {
142
+ const waiter = this.waiters.get(toolCallId);
143
+ if (!waiter)
144
+ return;
145
+ waiter.reject(error);
146
+ }
147
+ cancelAll() {
148
+ const error = new Error("All pending tool calls cancelled");
149
+ for (const waiter of this.waiters.values()) {
150
+ waiter.reject(error);
151
+ }
152
+ this.waiters.clear();
153
+ }
154
+ cancelScope(scope) {
155
+ const error = new Error(`Pending tool calls cancelled for ${scope}`);
156
+ for (const [id, waiter] of this.waiters) {
157
+ if (waiter.scope === scope) {
158
+ waiter.reject(error);
159
+ this.waiters.delete(id);
160
+ }
161
+ }
162
+ }
163
+ /**
164
+ * Cancel every pending call except those scoped to `scope`. Used on
165
+ * disconnect when a detached chat turn stays alive: its client tool calls
166
+ * survive (the replay re-delivers the `tool_call` frames, so a reconnecting
167
+ * client can still answer them) while everything else is rejected.
168
+ */
169
+ cancelAllExcept(scope) {
170
+ const error = new Error("All pending tool calls cancelled");
171
+ for (const [id, waiter] of this.waiters) {
172
+ if (waiter.scope === scope)
173
+ continue;
174
+ waiter.reject(error);
175
+ this.waiters.delete(id);
176
+ }
177
+ }
178
+ }
179
+ export class WebSocketClientSession {
180
+ websocket = null;
181
+ mode = "binary";
182
+ userId;
183
+ authToken;
184
+ /**
185
+ * Set when this connection was opened by a visitor to a deployed app's
186
+ * hidden URL. `userId` is then the app's owner, so nothing downstream can
187
+ * tell the two apart on its own — this is what does.
188
+ */
189
+ appSession;
190
+ /**
191
+ * Assigned once, in the constructor. `readonly` because JobExecutionManager
192
+ * snapshots both by value into its `defaults`, and a later reassignment here
193
+ * would silently leave the manager on the old pair.
194
+ */
195
+ defaultModel;
196
+ defaultProvider;
197
+ resolveExecutor;
198
+ resolveNodeType;
199
+ resolveProvider;
200
+ getSystemStats;
201
+ systemStatsEnabled;
202
+ workspaceResolver;
203
+ getNodeMetadata;
204
+ validateNode;
205
+ nodeRegistry;
206
+ pythonBridge;
207
+ frontendRendererRegistry;
208
+ frontendRendererId = null;
209
+ configuredProvidersCache = new ConfiguredProviderCache({});
210
+ sendLock = Promise.resolve();
211
+ /**
212
+ * The job region — run_job through terminal status. It owns `activeJobs`,
213
+ * the concurrency queue and the slot counters; nothing outside it holds a
214
+ * reference to them.
215
+ */
216
+ jobs;
217
+ heartbeatTimer = null;
218
+ statsTimer = null;
219
+ statsPrimeTimer = null;
220
+ /**
221
+ * Abort controllers for RPC calls that are still waiting on a provider.
222
+ * An RPC has no chat turn to hang off, so a `stop` command and a dropped
223
+ * socket reach an in-flight model call through this set.
224
+ */
225
+ rpcAborts = new Set();
226
+ /** One-shot model calls: the `inference` stream and the direct-generation RPCs. */
227
+ inference;
228
+ clientToolsManifest = {};
229
+ clientToolsManifestReady = false;
230
+ toolBridge = new ToolBridge();
231
+ /** Separate bridge for connection-level renderer calls; never resolves chat tool_result waiters. */
232
+ rendererToolBridge = new ToolBridge();
233
+ /** Round-trips permission approvals for gated tool calls. */
234
+ approvalBridge = new ToolBridge();
235
+ /** This connection's chat turns: state, permissions, and the turn loop. */
236
+ chat;
237
+ /** The client's command surface: one dispatch table over the wire commands. */
238
+ commands;
239
+ observerRegistered = false;
240
+ unsubscribeRunTrace = null;
241
+ runTraceDelivery = null;
242
+ /** Unsubscribe from the process drain, held for the life of the socket. */
243
+ drainUnsubscribe = null;
244
+ /** Set while waiting for this connection's own work to settle mid-drain. */
245
+ drainTimer = null;
246
+ /**
247
+ * The detachable session for the chat turn THIS connection is executing.
248
+ * While set (and running), every outbound frame carrying its thread_id is
249
+ * routed through the session: stamped with `chat_seq`, buffered for replay,
250
+ * and delivered to whichever connection is currently attached — which stops
251
+ * being this one if the socket drops mid-turn.
252
+ */
253
+ chatTurnSession = null;
254
+ /**
255
+ * Turns still executing on a previous connection's runner that THIS
256
+ * connection reattached to via `resume_chat`, keyed by thread id. Client
257
+ * frames for them (`tool_result`, approvals, `stop`) are forwarded to the
258
+ * executing runner through the session's hooks.
259
+ */
260
+ adoptedSessions = new Map();
261
+ /**
262
+ * This connection's identity as a chat-turn delivery target. A stable
263
+ * object so `detach(target)` only clears the session's attachment when it
264
+ * still points at THIS connection — never a newer one that reattached.
265
+ */
266
+ chatDeliveryTarget = {
267
+ deliver: (message) => this.sendToSocket(message)
268
+ };
269
+ logError(context, error) {
270
+ log.error(context, formatSanitizedError(error));
271
+ }
272
+ /**
273
+ * Hooks a resilient chat-turn session carries so a LATER connection that
274
+ * reattaches can route the client's `tool_result` / approvals / `stop`
275
+ * back to this runner — the one whose bridges own the pending waiters.
276
+ */
277
+ buildChatTurnHooks() {
278
+ return {
279
+ resolveToolResult: (toolCallId, payload) => this.toolBridge.resolveResult(toolCallId, payload),
280
+ resolveApproval: (approvalId, payload) => this.approvalBridge.resolveResult(approvalId, payload),
281
+ cancelPendingCalls: (threadId) => {
282
+ this.toolBridge.cancelScope(threadId);
283
+ this.approvalBridge.cancelScope(threadId);
284
+ }
285
+ };
286
+ }
287
+ /** Abort every RPC still waiting on a provider. Idempotent. */
288
+ cancelRpcCalls() {
289
+ for (const abort of this.rpcAborts)
290
+ abort.abort();
291
+ this.rpcAborts.clear();
292
+ }
293
+ /**
294
+ * Put a controller in {@link rpcAborts} so {@link cancelRpcCalls} — a `stop`
295
+ * command or a dropped socket — reaches the call it belongs to, and hand
296
+ * back the deregistration the caller runs when the call settles.
297
+ */
298
+ registerAbort(controller) {
299
+ this.rpcAborts.add(controller);
300
+ return () => {
301
+ this.rpcAborts.delete(controller);
302
+ };
303
+ }
304
+ sendDetached(message) {
305
+ void this.sendMessage(message).catch((err) => {
306
+ this.logError("detached websocket send failed", err);
307
+ });
308
+ }
309
+ requireUserId() {
310
+ if (this.userId === null) {
311
+ throw new Error("WebSocketClientSession has no user id: connect() has not run");
312
+ }
313
+ return this.userId;
314
+ }
315
+ constructor(options) {
316
+ this.userId = options.userId ?? null;
317
+ this.authToken = options.authToken ?? null;
318
+ this.appSession = options.appSession ?? null;
319
+ this.defaultModel = options.defaultModel ?? "gpt-oss:20b";
320
+ this.defaultProvider = options.defaultProvider ?? "ollama";
321
+ this.resolveExecutor = options.resolveExecutor;
322
+ this.resolveNodeType = options.resolveNodeType;
323
+ this.resolveProvider = options.resolveProvider;
324
+ this.workspaceResolver = options.workspaceResolver;
325
+ this.getNodeMetadata = options.getNodeMetadata;
326
+ this.validateNode = options.validateNode;
327
+ this.nodeRegistry = options.nodeRegistry;
328
+ this.pythonBridge = options.pythonBridge;
329
+ this.frontendRendererRegistry = options.frontendRendererRegistry;
330
+ this.getSystemStats = options.getSystemStats ?? createSystemStatsSampler();
331
+ this.systemStatsEnabled =
332
+ options.systemStatsEnabled ?? systemStatsBroadcastEnabled();
333
+ this.inference = new DirectInferenceHandler(this, {
334
+ defaults: { provider: this.defaultProvider, model: this.defaultModel },
335
+ currentRequestSeq: () => this.chat.currentRequestSeq,
336
+ registerAbort: (controller) => this.registerAbort(controller)
337
+ });
338
+ this.jobs = new JobExecutionManager(this, {
339
+ beforeRunJob: options.beforeRunJob,
340
+ getMaxConcurrentJobs: () => this.getMaxConcurrentJobs(),
341
+ getMaxConcurrentRunsPerWorkflow: () => this.getMaxConcurrentRunsPerWorkflow(),
342
+ defaultMaxConcurrentJobs: WebSocketClientSession.DEFAULT_MAX_CONCURRENT_JOBS,
343
+ defaultMaxConcurrentRunsPerWorkflow: WebSocketClientSession.DEFAULT_MAX_CONCURRENT_RUNS_PER_WORKFLOW,
344
+ sendToSocket: (message) => this.sendToSocket(message),
345
+ isSocketConnected: () => this.isRendererConnected(),
346
+ defaults: {
347
+ provider: this.defaultProvider,
348
+ model: this.defaultModel
349
+ }
350
+ });
351
+ this.chat = new ChatTurnHandler(this, {
352
+ // A chat-driven workflow run shares the connection's concurrency
353
+ // accounting, so it is registered and released here rather than in a
354
+ // map of chat's own.
355
+ jobs: {
356
+ registerJob: (jobId, active) => this.jobs.registerJob(jobId, active),
357
+ dropJob: (jobId) => this.jobs.dropJob(jobId),
358
+ releaseJob: (jobId) => this.jobs.releaseJob(jobId),
359
+ handleNodeProviderCost: (active, outbound) => this.jobs._handleNodeProviderCost(active, outbound),
360
+ runMeasuredCost: (active) => this.jobs.runMeasuredCost(active)
361
+ },
362
+ toolBridge: this.toolBridge,
363
+ approvalBridge: this.approvalBridge,
364
+ clientTools: () => this.clientToolsManifest,
365
+ authToken: () => this.authToken,
366
+ beforeRunJob: options.beforeRunJob,
367
+ defaults: {
368
+ provider: this.defaultProvider,
369
+ model: this.defaultModel
370
+ },
371
+ hydrateGraph: (graph) => this.jobs.hydrateGraph(graph),
372
+ configuredProviders: (userId) => this.configuredProvidersCache.get(userId),
373
+ entityRefResolver,
374
+ resolveEntityReferenceImages,
375
+ resolveSourceImageBytes: (data, mediaGeneration, userId) => this.resolveSourceImageBytes(data, mediaGeneration, userId),
376
+ resolveReferenceMediaBytes: (data, mediaGeneration, userId) => this.resolveReferenceMediaBytes(data, mediaGeneration, userId)
377
+ });
378
+ this.commands = new CommandRouter({
379
+ session: this,
380
+ jobs: this.jobs,
381
+ chat: this.chat,
382
+ inference: this.inference,
383
+ // What a command does to the connection itself: the socket, the wire
384
+ // mode, the RPC abort set, the tool bridges, and the chat-turn session
385
+ // bookkeeping the frame router reads. All host state, reached through
386
+ // this adapter rather than owned by the router.
387
+ host: {
388
+ sendToSocket: (message) => this.sendToSocket(message),
389
+ setMode: (mode) => {
390
+ this.mode = mode;
391
+ },
392
+ clearModels: () => this.clearModels(),
393
+ cancelRpcCalls: () => this.cancelRpcCalls(),
394
+ cancelToolScope: (scope) => {
395
+ this.toolBridge.cancelScope(scope);
396
+ this.approvalBridge.cancelScope(scope);
397
+ },
398
+ chatTurnHooks: () => this.buildChatTurnHooks(),
399
+ chatDeliveryTarget: this.chatDeliveryTarget,
400
+ getChatTurnSession: () => this.chatTurnSession,
401
+ setChatTurnSession: (session) => {
402
+ this.chatTurnSession = session;
403
+ },
404
+ adoptSession: (threadId, session) => {
405
+ this.adoptedSessions.set(threadId, session);
406
+ },
407
+ forgetAdoptedSession: (threadId) => {
408
+ this.adoptedSessions.delete(threadId);
409
+ },
410
+ closeForDrain: () => this.onDraining()
411
+ },
412
+ defaults: {
413
+ provider: this.defaultProvider,
414
+ model: this.defaultModel
415
+ },
416
+ apiOptions: options.apiOptions,
417
+ getPythonBridgeReady: options.getPythonBridgeReady
418
+ });
419
+ }
420
+ isRendererConnected() {
421
+ return (this.websocket !== null &&
422
+ this.websocket.clientState !== "disconnected" &&
423
+ this.websocket.applicationState !== "disconnected");
424
+ }
425
+ isRendererReady() {
426
+ return this.clientToolsManifestReady;
427
+ }
428
+ getRendererToolManifest() {
429
+ return Object.fromEntries(Object.entries(this.clientToolsManifest).map(([name, manifest]) => [
430
+ name,
431
+ { ...manifest }
432
+ ]));
433
+ }
434
+ /** Send a connection-level frontend tool call and await its renderer result. */
435
+ async executeRendererTool(rendererId, call, timeoutMs = 300_000) {
436
+ if (this.frontendRendererId !== rendererId || !this.isRendererConnected()) {
437
+ throw new Error(`Renderer "${rendererId}" is not connected`);
438
+ }
439
+ if (!this.isRendererReady()) {
440
+ throw new Error(`Renderer "${rendererId}" is not ready`);
441
+ }
442
+ if (!this.clientToolsManifest[call.name]) {
443
+ throw new Error(`Tool "${call.name}" is not available in renderer`);
444
+ }
445
+ const resultPromise = this.rendererToolBridge.createWaiter(call.tool_call_id, timeoutMs);
446
+ try {
447
+ await this.sendToSocket({
448
+ type: "renderer_tool_call",
449
+ renderer_id: rendererId,
450
+ tool_call_id: call.tool_call_id,
451
+ name: call.name,
452
+ args: call.args
453
+ });
454
+ if (!this.isRendererConnected()) {
455
+ throw new Error(`Renderer "${rendererId}" disconnected during tool call`);
456
+ }
457
+ }
458
+ catch (error) {
459
+ this.rendererToolBridge.rejectResult(call.tool_call_id, error instanceof Error ? error : new Error(String(error)));
460
+ }
461
+ const result = await resultPromise;
462
+ if (result.ok !== true) {
463
+ throw new Error(isString(result.error) ? result.error : "Renderer tool failed");
464
+ }
465
+ return {
466
+ renderer_id: rendererId,
467
+ tool_call_id: call.tool_call_id,
468
+ ok: true,
469
+ result: result.result ?? result.content
470
+ };
471
+ }
472
+ async connect(websocket, userId, authToken) {
473
+ if (userId)
474
+ this.userId = userId;
475
+ if (authToken)
476
+ this.authToken = authToken;
477
+ this.userId = this.userId ?? "1";
478
+ await websocket.accept();
479
+ this.websocket = websocket;
480
+ if (this.frontendRendererRegistry) {
481
+ this.frontendRendererId = this.frontendRendererRegistry.register(this.userId, this);
482
+ await this.sendToSocket({
483
+ type: "renderer_registered",
484
+ renderer_id: this.frontendRendererId
485
+ });
486
+ }
487
+ log.info("Client connected", { userId: this.userId });
488
+ this.startHeartbeat();
489
+ this.startStatsBroadcast();
490
+ this.registerObserver();
491
+ // A connection accepted just before the drain took effect gets the
492
+ // callback immediately, so it closes like any older one.
493
+ this.drainUnsubscribe = onDrain(() => this.onDraining());
494
+ }
495
+ async disconnect() {
496
+ log.info("Client disconnected");
497
+ this.drainUnsubscribe?.();
498
+ this.drainUnsubscribe = null;
499
+ this.stopDrainTimer();
500
+ this.stopHeartbeat();
501
+ this.stopStatsBroadcast();
502
+ this.unregisterObserver();
503
+ if (this.frontendRendererId) {
504
+ this.frontendRendererRegistry?.unregister(this.frontendRendererId);
505
+ this.frontendRendererId = null;
506
+ }
507
+ this.rendererToolBridge.cancelAll();
508
+ // An RPC has no session to detach into and no client left to answer, so
509
+ // it is always cancelled — unlike a resilient chat turn below.
510
+ this.cancelRpcCalls();
511
+ // A resilient chat turn survives the socket: detach it (frames keep
512
+ // buffering in the session for replay) instead of aborting. The session's
513
+ // execution budget bounds its work while detached. Its pending
514
+ // client tool calls stay alive too — replay re-delivers the `tool_call`
515
+ // frames, so a reconnecting client can still answer them. Everything
516
+ // else (a sessionless `inference` turn, other pending calls) is cancelled
517
+ // as before: nobody is left to receive its output.
518
+ const detachedThreadId = this.chatTurnSession?.status === "running"
519
+ ? this.chatTurnSession.threadId
520
+ : null;
521
+ if (detachedThreadId) {
522
+ this.chatTurnSession?.detach(this.chatDeliveryTarget);
523
+ this.toolBridge.cancelAllExcept(detachedThreadId);
524
+ this.approvalBridge.cancelAllExcept(detachedThreadId);
525
+ }
526
+ else {
527
+ this.toolBridge.cancelAll();
528
+ this.approvalBridge.cancelAll();
529
+ this.chat.cancel();
530
+ }
531
+ for (const session of this.adoptedSessions.values()) {
532
+ session.detach(this.chatDeliveryTarget);
533
+ }
534
+ this.adoptedSessions.clear();
535
+ await this.jobs.cancelAll();
536
+ if (this.websocket) {
537
+ try {
538
+ await this.websocket.close();
539
+ }
540
+ catch (error) {
541
+ this.logError("disconnect websocket.close failed", error);
542
+ }
543
+ }
544
+ this.websocket = null;
545
+ }
546
+ /** A chat turn or a workflow run this connection is still driving. */
547
+ hasRunningWork() {
548
+ if (this.chatTurnSession?.status === "running")
549
+ return true;
550
+ for (const session of this.adoptedSessions.values()) {
551
+ if (session.status === "running")
552
+ return true;
553
+ }
554
+ return this.jobs.activeJobIds().length > 0;
555
+ }
556
+ /**
557
+ * The process is draining. A connection with nothing in flight is closed at
558
+ * once so the client's own reconnect lands on a machine that is staying; one
559
+ * driving a turn or a run keeps it and closes when that settles, because
560
+ * closing here would only move the work's output nowhere.
561
+ */
562
+ onDraining() {
563
+ if (!this.hasRunningWork()) {
564
+ void this.closeForDrain();
565
+ return;
566
+ }
567
+ if (this.drainTimer)
568
+ return;
569
+ this.drainTimer = setInterval(() => {
570
+ if (this.hasRunningWork())
571
+ return;
572
+ void this.closeForDrain();
573
+ }, DRAIN_POLL_MS);
574
+ this.drainTimer.unref?.();
575
+ }
576
+ /**
577
+ * Close this socket with 1012. The client reconnects on its own and the
578
+ * proxy sends it to a machine whose health check still passes.
579
+ */
580
+ async closeForDrain() {
581
+ this.stopDrainTimer();
582
+ const websocket = this.websocket;
583
+ if (!websocket)
584
+ return;
585
+ try {
586
+ await websocket.close(DRAIN_CLOSE_CODE, "Server draining");
587
+ }
588
+ catch (error) {
589
+ this.logError("drain close failed", error);
590
+ }
591
+ }
592
+ stopDrainTimer() {
593
+ if (this.drainTimer) {
594
+ clearInterval(this.drainTimer);
595
+ this.drainTimer = null;
596
+ }
597
+ }
598
+ serializeForJson(value) {
599
+ if (value instanceof Uint8Array)
600
+ return Array.from(value);
601
+ if (value instanceof Date)
602
+ return value.toISOString();
603
+ if (Array.isArray(value))
604
+ return value.map((v) => this.serializeForJson(v));
605
+ if (isObjectLike(value)) {
606
+ const out = {};
607
+ for (const [k, v] of Object.entries(value)) {
608
+ out[k] = this.serializeForJson(v);
609
+ }
610
+ return out;
611
+ }
612
+ // SAFETY: bytes, dates, arrays and objects are handled above; what is left
613
+ // is a JSON scalar.
614
+ return value;
615
+ }
616
+ send(message) {
617
+ return this.sendMessage(message);
618
+ }
619
+ async sendMessage(message) {
620
+ // Frames belonging to this connection's resilient chat turn go through the
621
+ // session: seq-stamped, buffered for replay, delivered to the attached
622
+ // connection (possibly a later one than this).
623
+ const session = this.chatTurnSession;
624
+ if (session &&
625
+ session.status === "running" &&
626
+ isString(message.thread_id) &&
627
+ message.thread_id === session.threadId) {
628
+ session.emit(message);
629
+ return;
630
+ }
631
+ // Same for a resilient run's frames — including its terminal job_update,
632
+ // which is the one frame a reconnecting client most needs replayed.
633
+ // Adopted sessions are checked too so a `cancel_job` this connection
634
+ // issued against a run owned by another connection still buffers its
635
+ // acknowledgement into that run's session rather than only this socket.
636
+ const jobSession = this.jobs.resolveJobSession(message.job_id);
637
+ if (jobSession && jobSession.status === "running") {
638
+ jobSession.emit(message);
639
+ return;
640
+ }
641
+ await this.sendToSocket(message);
642
+ }
643
+ async sendToSocket(message) {
644
+ if (!this.websocket)
645
+ return;
646
+ if (this.websocket.clientState === "disconnected" ||
647
+ this.websocket.applicationState === "disconnected") {
648
+ return;
649
+ }
650
+ assertValidOutboundMessage(message);
651
+ // Resolve storage keys in content to browser-accessible URLs before
652
+ // sending over the wire. This keeps DB storage URL-agnostic while
653
+ // delivering ready-to-use URLs to the client.
654
+ if (Array.isArray(message.content)) {
655
+ message = {
656
+ ...message,
657
+ content: await resolveContentUrls(message.content, message.user_id ?? this.userId ?? undefined)
658
+ };
659
+ }
660
+ // In-process audio/CV chunks carry samples as a native Float32Array,
661
+ // which neither msgpack nor JSON represents. Encode them to base64
662
+ // f32le here — the one and only conversion on the path to the client.
663
+ message = encodeNativeAudioChunks(message);
664
+ // Snapshot the mode ONCE for this frame. Reading this.mode again after the
665
+ // send-lock await would let a set_mode that lands mid-queue transmit a
666
+ // payload prepared for the other mode (e.g. a binary payload with raw
667
+ // Uint8Arrays JSON.stringify'd into index-keyed garbage).
668
+ const mode = this.mode;
669
+ const payload = mode === "text"
670
+ ? this.serializeForJson(message)
671
+ : message;
672
+ const prev = this.sendLock;
673
+ let release;
674
+ this.sendLock = new Promise((resolve) => {
675
+ release = resolve;
676
+ });
677
+ await prev;
678
+ try {
679
+ const websocket = this.websocket;
680
+ if (!websocket ||
681
+ websocket.clientState === "disconnected" ||
682
+ websocket.applicationState === "disconnected") {
683
+ return;
684
+ }
685
+ if (mode === "binary") {
686
+ await websocket.sendBytes(packWebSocketMessage(payload));
687
+ }
688
+ else {
689
+ await websocket.sendText(JSON.stringify(payload));
690
+ }
691
+ }
692
+ finally {
693
+ release();
694
+ }
695
+ }
696
+ async receiveMessage() {
697
+ if (!this.websocket) {
698
+ throw new Error("WebSocket is not connected");
699
+ }
700
+ const message = await this.websocket.receive();
701
+ if (message.type === "websocket.disconnect")
702
+ return null;
703
+ if (message.bytes) {
704
+ const maxBytes = getMaxWsMessageBytes();
705
+ if (message.bytes.length > maxBytes) {
706
+ throw new Error(`Incoming WebSocket message exceeds maximum size: ` +
707
+ `${message.bytes.length} > ${maxBytes} bytes ` +
708
+ `(set NODETOOL_WS_MAX_MESSAGE_BYTES to raise the limit)`);
709
+ }
710
+ return unpackWebSocketMessage(message.bytes);
711
+ }
712
+ if (message.text) {
713
+ const maxBytes = getMaxWsMessageBytes();
714
+ const textBytes = Buffer.byteLength(message.text, "utf8");
715
+ if (textBytes > maxBytes) {
716
+ throw new Error(`Incoming WebSocket message exceeds maximum size: ` +
717
+ `${textBytes} > ${maxBytes} bytes ` +
718
+ `(set NODETOOL_WS_MAX_MESSAGE_BYTES to raise the limit)`);
719
+ }
720
+ return JSON.parse(message.text);
721
+ }
722
+ return null;
723
+ }
724
+ /** Default cap when `MAX_CONCURRENT_JOBS` is unset/invalid. */
725
+ static DEFAULT_MAX_CONCURRENT_JOBS = 4;
726
+ /** Default per-workflow cap when `MAX_CONCURRENT_RUNS_PER_WORKFLOW` is unset/invalid. */
727
+ static DEFAULT_MAX_CONCURRENT_RUNS_PER_WORKFLOW = 4;
728
+ /** How long a resolved concurrency-setting value is reused before re-reading. */
729
+ static MAX_CONCURRENT_JOBS_TTL_MS = 5000;
730
+ maxConcurrentJobsCache = null;
731
+ maxRunsPerWorkflowCache = null;
732
+ /**
733
+ * Resolve the per-client concurrency cap from settings (>= 1), cached for a
734
+ * few seconds so back-to-back run_job/drainQueue calls don't hit the settings
735
+ * store every time. The setting changes rarely, so a short TTL is fine.
736
+ */
737
+ async getMaxConcurrentJobs() {
738
+ const cached = this.maxConcurrentJobsCache;
739
+ const value = await this.resolvePositiveIntSetting("MAX_CONCURRENT_JOBS", WebSocketClientSession.DEFAULT_MAX_CONCURRENT_JOBS, cached);
740
+ this.maxConcurrentJobsCache = value;
741
+ return value.value;
742
+ }
743
+ /**
744
+ * Resolve the per-workflow concurrency cap (>= 1) for runs that opt into
745
+ * concurrency. When this many runs of the same workflow are already in
746
+ * flight, further opted-in runs queue. Cached like {@link getMaxConcurrentJobs}.
747
+ */
748
+ async getMaxConcurrentRunsPerWorkflow() {
749
+ const cached = this.maxRunsPerWorkflowCache;
750
+ const value = await this.resolvePositiveIntSetting("MAX_CONCURRENT_RUNS_PER_WORKFLOW", WebSocketClientSession.DEFAULT_MAX_CONCURRENT_RUNS_PER_WORKFLOW, cached);
751
+ this.maxRunsPerWorkflowCache = value;
752
+ return value.value;
753
+ }
754
+ /**
755
+ * Read a positive-integer setting, reusing the cached value while it's still
756
+ * within the TTL. Falls back to `fallback` when the setting is unset/invalid
757
+ * or the settings store is unavailable (e.g. DB not initialized) rather than
758
+ * blocking the run, matching the runner's other best-effort DB access.
759
+ */
760
+ async resolvePositiveIntSetting(key, fallback, cached) {
761
+ const now = Date.now();
762
+ if (cached &&
763
+ now - cached.at < WebSocketClientSession.MAX_CONCURRENT_JOBS_TTL_MS) {
764
+ return cached;
765
+ }
766
+ let raw = null;
767
+ try {
768
+ raw = await getSetting(key);
769
+ }
770
+ catch {
771
+ // Settings store unavailable — fall back to the default.
772
+ }
773
+ const parsed = raw ? Number.parseInt(raw, 10) : NaN;
774
+ const value = Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
775
+ return { value, at: now };
776
+ }
777
+ async clearModels() {
778
+ return {
779
+ message: "Model clearing is managed by provider implementations in TS runtime"
780
+ };
781
+ }
782
+ /**
783
+ * Bytes behind one media content block, whatever form the client used to
784
+ * name them: a stored `asset_id`, an `asset://<id>.<ext>` uri written by the
785
+ * `@`-mention picker, an inline `data:` uri, an http(s) url, or a bare
786
+ * base64 `data` field. Returns null when none of them resolves.
787
+ */
788
+ async resolveMediaRefBytes(ref, userId) {
789
+ const assetId = isString(ref.asset_id) ? ref.asset_id : null;
790
+ if (assetId) {
791
+ const bytes = await this.loadAssetBytes(userId, assetId);
792
+ if (bytes && bytes.length > 0)
793
+ return bytes;
794
+ }
795
+ const uri = isString(ref.uri) ? ref.uri : null;
796
+ if (uri) {
797
+ if (uri.startsWith("asset://")) {
798
+ // `@`-mentioned or library-dragged asset: `asset://<id>.<ext>`.
799
+ const withoutScheme = uri.slice("asset://".length);
800
+ const dotIdx = withoutScheme.lastIndexOf(".");
801
+ const mentionedId = dotIdx > -1 ? withoutScheme.slice(0, dotIdx) : withoutScheme;
802
+ const bytes = await this.loadAssetBytes(userId, mentionedId);
803
+ if (bytes && bytes.length > 0)
804
+ return bytes;
805
+ }
806
+ else if (uri.startsWith("data:")) {
807
+ const commaIdx = uri.indexOf(",");
808
+ if (commaIdx > -1) {
809
+ const b64 = uri.slice(commaIdx + 1);
810
+ try {
811
+ return new Uint8Array(Buffer.from(b64, "base64"));
812
+ }
813
+ catch {
814
+ /* fall through to the `data` field below */
815
+ }
816
+ }
817
+ }
818
+ else if (uri.startsWith("http://") || uri.startsWith("https://")) {
819
+ // A chat client picked this uri, so the media-ref egress policy
820
+ // decides — including on every redirect hop, which the predicate
821
+ // this replaced never saw.
822
+ try {
823
+ const resp = await fetchExternalMedia(uri);
824
+ if (resp.ok) {
825
+ return new Uint8Array(await resp.arrayBuffer());
826
+ }
827
+ }
828
+ catch (err) {
829
+ log.warn("resolveMediaRefBytes: fetch failed", {
830
+ uri,
831
+ error: err instanceof Error ? err.message : String(err)
832
+ });
833
+ }
834
+ }
835
+ }
836
+ const data64 = isString(ref.data) ? ref.data : null;
837
+ if (data64) {
838
+ try {
839
+ return new Uint8Array(Buffer.from(data64, "base64"));
840
+ }
841
+ catch {
842
+ /* ignore */
843
+ }
844
+ }
845
+ return null;
846
+ }
847
+ /** One asset's bytes, or null when it is gone or unreadable. */
848
+ async loadAssetBytes(userId, assetId) {
849
+ if (!assetId)
850
+ return null;
851
+ try {
852
+ const asset = await Asset.find(userId, assetId);
853
+ if (!asset)
854
+ return null;
855
+ return await retrieveAssetBytes(getAssetAdapter(), userId, assetId, asset.content_type);
856
+ }
857
+ catch (err) {
858
+ log.warn("loadAssetBytes: asset load failed", {
859
+ assetId,
860
+ error: err instanceof Error ? err.message : String(err)
861
+ });
862
+ return null;
863
+ }
864
+ }
865
+ /** The inner ref record of every `image_url` / `video` block on a message. */
866
+ mediaRefsOnMessage(data, blockType) {
867
+ const content = data.content;
868
+ if (!Array.isArray(content))
869
+ return [];
870
+ const field = blockType === "image_url" ? "image" : "video";
871
+ const refs = [];
872
+ for (const c of content) {
873
+ if (!isObjectLike(c))
874
+ continue;
875
+ const block = c;
876
+ if (block.type !== blockType)
877
+ continue;
878
+ const ref = block[field];
879
+ refs.push(isObjectLike(ref) ? ref : {});
880
+ }
881
+ return refs;
882
+ }
883
+ /**
884
+ * Resolve the source image bytes for image-edit / image-to-video calls.
885
+ * Searches in priority order:
886
+ * 1. `media_generation.source_asset_id` → load from Asset storage
887
+ * 2. The first `image_url` content block on the user message
888
+ * (supports asset_id, http(s) uri, and inline data:base64 payloads)
889
+ * Returns `null` when no usable source image can be found.
890
+ */
891
+ async resolveSourceImageBytes(data, mediaGeneration, userId) {
892
+ const explicitId = isString(mediaGeneration.source_asset_id)
893
+ ? mediaGeneration.source_asset_id
894
+ : null;
895
+ if (explicitId) {
896
+ const fromAsset = await this.loadAssetBytes(userId, explicitId);
897
+ if (fromAsset && fromAsset.length > 0)
898
+ return fromAsset;
899
+ }
900
+ for (const ref of this.mediaRefsOnMessage(data, "image_url")) {
901
+ const bytes = await this.resolveMediaRefBytes(ref, userId);
902
+ if (bytes && bytes.length > 0)
903
+ return bytes;
904
+ }
905
+ return null;
906
+ }
907
+ /**
908
+ * Every reference the user attached, for reference-to-video: *all* the
909
+ * image and video blocks on the message rather than the first one, because
910
+ * the whole point of the mode is that several references describe one shot
911
+ * (a character, a garment, a location). `source_asset_id` joins the images
912
+ * so a surface that names one explicitly still reaches the model. A block
913
+ * whose bytes do not resolve drops rather than failing the turn — the
914
+ * caller refuses only when nothing at all resolved.
915
+ */
916
+ async resolveReferenceMediaBytes(data, mediaGeneration, userId) {
917
+ const collect = async (blockType) => {
918
+ const out = [];
919
+ for (const ref of this.mediaRefsOnMessage(data, blockType)) {
920
+ const bytes = await this.resolveMediaRefBytes(ref, userId);
921
+ if (bytes && bytes.length > 0)
922
+ out.push(bytes);
923
+ }
924
+ return out;
925
+ };
926
+ const images = await collect("image_url");
927
+ const videos = await collect("video");
928
+ const explicitId = isString(mediaGeneration.source_asset_id)
929
+ ? mediaGeneration.source_asset_id
930
+ : null;
931
+ if (explicitId) {
932
+ const bytes = await this.loadAssetBytes(userId, explicitId);
933
+ if (bytes && bytes.length > 0)
934
+ images.unshift(bytes);
935
+ }
936
+ return { images, videos };
937
+ }
938
+ async handleCommand(command) {
939
+ return this.commands.handle(command.command, command.data ?? {}, command.request_id);
940
+ }
941
+ startHeartbeat() {
942
+ this.stopHeartbeat();
943
+ this.heartbeatTimer = setInterval(() => {
944
+ this.sendMessage({ type: "ping", ts: Date.now() / 1000 }).catch((err) => {
945
+ log.warn("Failed to send heartbeat ping", { error: String(err) });
946
+ });
947
+ }, 25_000);
948
+ }
949
+ stopHeartbeat() {
950
+ if (this.heartbeatTimer) {
951
+ clearInterval(this.heartbeatTimer);
952
+ this.heartbeatTimer = null;
953
+ }
954
+ }
955
+ startStatsBroadcast() {
956
+ this.stopStatsBroadcast();
957
+ if (!this.systemStatsEnabled) {
958
+ return;
959
+ }
960
+ const send = () => {
961
+ this.sendMessage({
962
+ type: "system_stats",
963
+ stats: this.getSystemStats()
964
+ }).catch((err) => {
965
+ log.warn("Failed to send system stats", { error: String(err) });
966
+ });
967
+ };
968
+ // Fire an initial sample ~1s after connect so the sampler has a delta to
969
+ // report — then keep emitting on a regular cadence.
970
+ this.statsPrimeTimer = setTimeout(send, 1000);
971
+ this.statsTimer = setInterval(send, 5_000);
972
+ }
973
+ stopStatsBroadcast() {
974
+ if (this.statsPrimeTimer) {
975
+ clearTimeout(this.statsPrimeTimer);
976
+ this.statsPrimeTimer = null;
977
+ }
978
+ if (this.statsTimer) {
979
+ clearInterval(this.statsTimer);
980
+ this.statsTimer = null;
981
+ }
982
+ }
983
+ registerObserver() {
984
+ if (this.observerRegistered)
985
+ return;
986
+ // Both feeds are scoped by `this.userId`, which for a deployed app's
987
+ // visitor is the *owner* — so subscribing would stream them the ids,
988
+ // etags and timestamps of every row that user touches, from any tab or
989
+ // agent, for as long as the page is open. The public page has no cache to
990
+ // invalidate anyway: it renders one release and runs it.
991
+ if (this.appSession)
992
+ return;
993
+ this.runTraceDelivery = new RunTraceLiveDelivery((update) => this.sendMessage({ type: "run_trace", ...update }), (error) => this.logError("Run trace delivery failed", error));
994
+ this.unsubscribeRunTrace = subscribeRunTraceUpdates((userId, update) => {
995
+ if (!this.appSession && userId === this.userId) {
996
+ this.runTraceDelivery?.enqueue(update);
997
+ }
998
+ });
999
+ ModelObserver.subscribe(this.onModelChange);
1000
+ resourceEvents.on("change", this.onResourceEvent);
1001
+ this.observerRegistered = true;
1002
+ }
1003
+ unregisterObserver() {
1004
+ if (!this.observerRegistered)
1005
+ return;
1006
+ this.unsubscribeRunTrace?.();
1007
+ this.unsubscribeRunTrace = null;
1008
+ this.runTraceDelivery?.close();
1009
+ this.runTraceDelivery = null;
1010
+ ModelObserver.unsubscribe(this.onModelChange);
1011
+ resourceEvents.off("change", this.onResourceEvent);
1012
+ this.observerRegistered = false;
1013
+ }
1014
+ onModelChange = (instance, event, meta) => {
1015
+ if (!this.websocket)
1016
+ return;
1017
+ // Only forward changes for models the connected user owns. Models without
1018
+ // a `user_id` (runtime-internal types) are forwarded to every connection.
1019
+ const ownerId = instance.user_id;
1020
+ if (ownerId && this.userId && ownerId !== this.userId)
1021
+ return;
1022
+ const resource = {
1023
+ id: instance.partitionValue(),
1024
+ etag: instance.getEtag()
1025
+ };
1026
+ // Include scope fields for resource types whose cache is keyed on a
1027
+ // parent id (Message → thread_id, WorkflowVersion → workflow_id, etc.).
1028
+ // Frontend handlers use these to narrow invalidation. `updated_at` rides
1029
+ // along as the row's concurrency token: an open editor compares it against
1030
+ // the token it last saved with to tell its own write apart from one made
1031
+ // outside the browser (agent, CLI, another tab).
1032
+ const data = instance;
1033
+ for (const field of [
1034
+ "workflow_id",
1035
+ "thread_id",
1036
+ "parent_id",
1037
+ "updated_at"
1038
+ ]) {
1039
+ const value = data[field];
1040
+ if (isNonEmptyString(value)) {
1041
+ resource[field] = value;
1042
+ }
1043
+ }
1044
+ const message = {
1045
+ type: "resource_change",
1046
+ event,
1047
+ resource_type: instance.constructor.name.toLowerCase(),
1048
+ resource
1049
+ };
1050
+ if (meta?.ops && meta.ops.length > 0) {
1051
+ message.ops = meta.ops;
1052
+ }
1053
+ this.sendDetached(message);
1054
+ };
1055
+ onResourceEvent = (payload) => {
1056
+ if (!this.websocket)
1057
+ return;
1058
+ if (payload.userId && this.userId && payload.userId !== this.userId)
1059
+ return;
1060
+ this.sendDetached({
1061
+ type: "resource_change",
1062
+ event: payload.event,
1063
+ resource_type: payload.resource_type,
1064
+ resource: payload.resource
1065
+ });
1066
+ };
1067
+ async run(websocket) {
1068
+ try {
1069
+ await this.connect(websocket, this.userId ?? undefined, this.authToken ?? undefined);
1070
+ await this.receiveMessages();
1071
+ }
1072
+ finally {
1073
+ await this.disconnect();
1074
+ }
1075
+ }
1076
+ async receiveMessages() {
1077
+ while (true) {
1078
+ let data;
1079
+ try {
1080
+ data = await this.receiveMessage();
1081
+ }
1082
+ catch (err) {
1083
+ // A frame that fails to even decode (truncated msgpack, an
1084
+ // oversized payload past NODETOOL_WS_MAX_MESSAGE_BYTES, …) must not
1085
+ // kill the connection or this loop — it's just one bad frame from a
1086
+ // client that may otherwise be mid-job. Reject it and keep reading.
1087
+ this.logError("Failed to receive/decode WebSocket frame", err);
1088
+ if (this.websocket &&
1089
+ this.websocket.clientState !== "disconnected" &&
1090
+ this.websocket.applicationState !== "disconnected") {
1091
+ await this.sendMessage({
1092
+ error: "invalid_frame",
1093
+ message: err instanceof Error ? err.message : String(err)
1094
+ }).catch((sendErr) => {
1095
+ this.logError("Failed to notify client of invalid frame", sendErr);
1096
+ });
1097
+ continue;
1098
+ }
1099
+ break;
1100
+ }
1101
+ if (data === null)
1102
+ break;
1103
+ const msgType = isString(data.type) ? data.type : null;
1104
+ if (msgType !== null && msgType in controlMessageInSchemas) {
1105
+ const schema = controlMessageInSchemas[msgType];
1106
+ const parsed = schema.safeParse(data);
1107
+ if (!parsed.success) {
1108
+ await this.sendMessage({
1109
+ error: "invalid_message",
1110
+ message: `Malformed '${msgType}' frame: ` +
1111
+ parsed.error.issues
1112
+ .map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`)
1113
+ .join("; ")
1114
+ });
1115
+ continue;
1116
+ }
1117
+ }
1118
+ // Heartbeats show that the connection is alive, not that the user is
1119
+ // working in this editor.
1120
+ if (this.frontendRendererId && msgType !== "ping" && msgType !== "pong") {
1121
+ this.frontendRendererRegistry?.touch(this.frontendRendererId);
1122
+ }
1123
+ if (msgType === "client_tools_manifest") {
1124
+ const tools = Array.isArray(data.tools) ? data.tools : [];
1125
+ this.clientToolsManifest = {};
1126
+ for (const tool of tools) {
1127
+ if (isObjectLike(tool) &&
1128
+ isString(tool.name)) {
1129
+ const name = tool.name;
1130
+ this.clientToolsManifest[name] = tool;
1131
+ }
1132
+ }
1133
+ this.clientToolsManifestReady = true;
1134
+ if (this.frontendRendererId) {
1135
+ this.frontendRendererRegistry?.markReady(this.frontendRendererId);
1136
+ }
1137
+ continue;
1138
+ }
1139
+ if (msgType === "renderer_tool_result") {
1140
+ const rendererId = isString(data.renderer_id) ? data.renderer_id : null;
1141
+ const toolCallId = isString(data.tool_call_id)
1142
+ ? data.tool_call_id
1143
+ : null;
1144
+ if (rendererId &&
1145
+ toolCallId &&
1146
+ rendererId === this.frontendRendererId) {
1147
+ this.frontendRendererRegistry?.touch(rendererId);
1148
+ this.rendererToolBridge.resolveResult(toolCallId, data);
1149
+ }
1150
+ continue;
1151
+ }
1152
+ if (msgType === "tool_result") {
1153
+ const toolCallId = isString(data.tool_call_id)
1154
+ ? data.tool_call_id
1155
+ : null;
1156
+ if (toolCallId) {
1157
+ this.chat.resolveToolResult(toolCallId, data);
1158
+ // The waiter may live on the runner executing an adopted turn.
1159
+ // resolveResult no-ops on unknown ids, so forwarding is safe.
1160
+ for (const session of this.adoptedSessions.values()) {
1161
+ session.hooks.resolveToolResult(toolCallId, data);
1162
+ }
1163
+ }
1164
+ continue;
1165
+ }
1166
+ if (msgType === "tool_approval_response") {
1167
+ const approvalId = isString(data.approval_id) ? data.approval_id : null;
1168
+ if (approvalId) {
1169
+ this.approvalBridge.resolveResult(approvalId, data);
1170
+ for (const session of this.adoptedSessions.values()) {
1171
+ session.hooks.resolveApproval(approvalId, data);
1172
+ }
1173
+ }
1174
+ continue;
1175
+ }
1176
+ if (msgType === "plan_approval_response") {
1177
+ const approvalId = isString(data.approval_id) ? data.approval_id : null;
1178
+ if (approvalId) {
1179
+ this.approvalBridge.resolveResult(approvalId, data);
1180
+ for (const session of this.adoptedSessions.values()) {
1181
+ session.hooks.resolveApproval(approvalId, data);
1182
+ }
1183
+ }
1184
+ continue;
1185
+ }
1186
+ if (msgType === "secret_request_response") {
1187
+ const approvalId = isString(data.approval_id) ? data.approval_id : null;
1188
+ if (approvalId) {
1189
+ this.approvalBridge.resolveResult(approvalId, data);
1190
+ for (const session of this.adoptedSessions.values()) {
1191
+ session.hooks.resolveApproval(approvalId, data);
1192
+ }
1193
+ }
1194
+ continue;
1195
+ }
1196
+ if (msgType === "ping") {
1197
+ await this.sendMessage({ type: "pong", ts: Date.now() / 1000 });
1198
+ continue;
1199
+ }
1200
+ if (msgType === "pong") {
1201
+ continue;
1202
+ }
1203
+ if (isString(data.command)) {
1204
+ const envelopeParsed = webSocketCommandEnvelopeSchema.safeParse(data);
1205
+ if (!envelopeParsed.success) {
1206
+ await this.sendMessage({
1207
+ error: "invalid_command",
1208
+ details: "Malformed command envelope: " +
1209
+ envelopeParsed.error.issues
1210
+ .map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`)
1211
+ .join("; ")
1212
+ });
1213
+ continue;
1214
+ }
1215
+ // Commands this build doesn't recognize fall through to
1216
+ // handleCommand's own `{ error: "Unknown command" }` reply below —
1217
+ // only known commands get their `data` payload schema-checked here.
1218
+ const dataSchema = commandDataSchemas[envelopeParsed.data.command];
1219
+ if (dataSchema) {
1220
+ const dataParsed = dataSchema.safeParse(envelopeParsed.data.data ?? {});
1221
+ if (!dataParsed.success) {
1222
+ await this.sendMessage({
1223
+ error: "invalid_command",
1224
+ details: `Malformed '${envelopeParsed.data.command}' data: ` +
1225
+ dataParsed.error.issues
1226
+ .map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`)
1227
+ .join("; ")
1228
+ });
1229
+ continue;
1230
+ }
1231
+ }
1232
+ try {
1233
+ // The envelope Zod-parsed above is the same frame — its schema
1234
+ // passes every key through, so nothing was dropped.
1235
+ // SAFETY: the schema types `command` as a bare string on purpose;
1236
+ // `handleCommand`'s switch answers `{ error: "Unknown command" }`
1237
+ // for anything this build does not implement.
1238
+ const response = await this.handleCommand({
1239
+ ...envelopeParsed.data,
1240
+ command: envelopeParsed.data.command,
1241
+ data: envelopeParsed.data.data ?? {},
1242
+ // MessagePack clients encode an absent request_id as nil; the
1243
+ // envelope declares it optional, not nullable.
1244
+ request_id: envelopeParsed.data.request_id ?? undefined
1245
+ });
1246
+ // RPC commands send their `rpc_response` frame inline (in runRpc)
1247
+ // and return null so we don't send a stray legacy reply.
1248
+ if (response)
1249
+ await this.sendMessage(response);
1250
+ }
1251
+ catch (err) {
1252
+ this.logError("invalid_command handling failed", err);
1253
+ await this.sendMessage({
1254
+ error: "invalid_command",
1255
+ details: err instanceof Error ? err.message : String(err)
1256
+ });
1257
+ }
1258
+ continue;
1259
+ }
1260
+ await this.sendMessage({
1261
+ error: "invalid_message",
1262
+ message: "All messages must include a 'command' field. Use 'chat_message' command for chat."
1263
+ });
1264
+ }
1265
+ }
1266
+ }
1267
+ //# sourceMappingURL=websocket-client-session.js.map