@nodetool-ai/websocket 0.8.2 → 0.8.4-a24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (389) hide show
  1. package/README.md +5 -0
  2. package/dist/.nodetool-build-stamp +1 -1
  3. package/dist/agent/run-node-tool.d.ts.map +1 -1
  4. package/dist/agent/run-node-tool.js +11 -1
  5. package/dist/agent/run-node-tool.js.map +1 -1
  6. package/dist/chat-prediction-forwarder.d.ts +5 -3
  7. package/dist/chat-prediction-forwarder.d.ts.map +1 -1
  8. package/dist/chat-prediction-forwarder.js +6 -4
  9. package/dist/chat-prediction-forwarder.js.map +1 -1
  10. package/dist/chat-turn-registry.d.ts +2 -1
  11. package/dist/chat-turn-registry.d.ts.map +1 -1
  12. package/dist/chat-turn-registry.js +8 -1
  13. package/dist/chat-turn-registry.js.map +1 -1
  14. package/dist/collection-api.d.ts.map +1 -1
  15. package/dist/collection-api.js +3 -5
  16. package/dist/collection-api.js.map +1 -1
  17. package/dist/custom-providers.d.ts.map +1 -1
  18. package/dist/custom-providers.js +6 -1
  19. package/dist/custom-providers.js.map +1 -1
  20. package/dist/e2e-server.js +1 -1
  21. package/dist/e2e-server.js.map +1 -1
  22. package/dist/example-workflows.d.ts.map +1 -1
  23. package/dist/example-workflows.js +7 -1
  24. package/dist/example-workflows.js.map +1 -1
  25. package/dist/fake-runtime.d.ts +54 -8
  26. package/dist/fake-runtime.d.ts.map +1 -1
  27. package/dist/fake-runtime.js +228 -15
  28. package/dist/fake-runtime.js.map +1 -1
  29. package/dist/file-api.d.ts.map +1 -1
  30. package/dist/file-api.js +6 -8
  31. package/dist/file-api.js.map +1 -1
  32. package/dist/generation-recovery.d.ts.map +1 -1
  33. package/dist/generation-recovery.js +7 -4
  34. package/dist/generation-recovery.js.map +1 -1
  35. package/dist/headless-job-runner.d.ts.map +1 -1
  36. package/dist/headless-job-runner.js +8 -2
  37. package/dist/headless-job-runner.js.map +1 -1
  38. package/dist/http-api.d.ts +4 -2
  39. package/dist/http-api.d.ts.map +1 -1
  40. package/dist/http-api.js +67 -16
  41. package/dist/http-api.js.map +1 -1
  42. package/dist/http-body-schemas.d.ts +2 -0
  43. package/dist/http-body-schemas.d.ts.map +1 -1
  44. package/dist/http-body-schemas.js +8 -1
  45. package/dist/http-body-schemas.js.map +1 -1
  46. package/dist/index.d.ts +3 -0
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +3 -0
  49. package/dist/index.js.map +1 -1
  50. package/dist/job-control.d.ts +8 -0
  51. package/dist/job-control.d.ts.map +1 -1
  52. package/dist/job-control.js +12 -0
  53. package/dist/job-control.js.map +1 -1
  54. package/dist/lib/admin.d.ts +7 -0
  55. package/dist/lib/admin.d.ts.map +1 -0
  56. package/dist/lib/admin.js +19 -0
  57. package/dist/lib/admin.js.map +1 -0
  58. package/dist/lib/app-instances-service.d.ts +35 -0
  59. package/dist/lib/app-instances-service.d.ts.map +1 -1
  60. package/dist/lib/app-instances-service.js +3 -4
  61. package/dist/lib/app-instances-service.js.map +1 -1
  62. package/dist/lib/app-project-export.d.ts +12 -0
  63. package/dist/lib/app-project-export.d.ts.map +1 -0
  64. package/dist/lib/app-project-export.js +42 -0
  65. package/dist/lib/app-project-export.js.map +1 -0
  66. package/dist/lib/applications-service.d.ts.map +1 -1
  67. package/dist/lib/applications-service.js +7 -2
  68. package/dist/lib/applications-service.js.map +1 -1
  69. package/dist/lib/asset-export.d.ts +7 -3
  70. package/dist/lib/asset-export.d.ts.map +1 -1
  71. package/dist/lib/asset-export.js +16 -8
  72. package/dist/lib/asset-export.js.map +1 -1
  73. package/dist/lib/asset-paths.d.ts +1 -1
  74. package/dist/lib/asset-paths.js +1 -1
  75. package/dist/lib/asset-response.d.ts.map +1 -1
  76. package/dist/lib/asset-response.js +13 -6
  77. package/dist/lib/asset-response.js.map +1 -1
  78. package/dist/lib/cloud-profile.d.ts +10 -0
  79. package/dist/lib/cloud-profile.d.ts.map +1 -0
  80. package/dist/lib/cloud-profile.js +13 -0
  81. package/dist/lib/cloud-profile.js.map +1 -0
  82. package/dist/lib/example-apps.d.ts +3 -0
  83. package/dist/lib/example-apps.d.ts.map +1 -1
  84. package/dist/lib/example-apps.js +3 -2
  85. package/dist/lib/example-apps.js.map +1 -1
  86. package/dist/lib/http-user-id.d.ts +2 -0
  87. package/dist/lib/http-user-id.d.ts.map +1 -0
  88. package/dist/lib/http-user-id.js +4 -0
  89. package/dist/lib/http-user-id.js.map +1 -0
  90. package/dist/lib/json-body.d.ts +11 -0
  91. package/dist/lib/json-body.d.ts.map +1 -0
  92. package/dist/lib/json-body.js +13 -0
  93. package/dist/lib/json-body.js.map +1 -0
  94. package/dist/lib/project-archive-host.d.ts +14 -0
  95. package/dist/lib/project-archive-host.d.ts.map +1 -0
  96. package/dist/lib/project-archive-host.js +24 -0
  97. package/dist/lib/project-archive-host.js.map +1 -0
  98. package/dist/lib/project-archive.d.ts +103 -0
  99. package/dist/lib/project-archive.d.ts.map +1 -0
  100. package/dist/lib/project-archive.js +610 -0
  101. package/dist/lib/project-archive.js.map +1 -0
  102. package/dist/lib/public-routes.d.ts +15 -0
  103. package/dist/lib/public-routes.d.ts.map +1 -1
  104. package/dist/lib/public-routes.js +27 -0
  105. package/dist/lib/public-routes.js.map +1 -1
  106. package/dist/lib/public-workflow-share.d.ts +12 -1
  107. package/dist/lib/public-workflow-share.d.ts.map +1 -1
  108. package/dist/lib/public-workflow-share.js +45 -2
  109. package/dist/lib/public-workflow-share.js.map +1 -1
  110. package/dist/lib/python-metadata-roots.d.ts +27 -0
  111. package/dist/lib/python-metadata-roots.d.ts.map +1 -0
  112. package/dist/lib/python-metadata-roots.js +92 -0
  113. package/dist/lib/python-metadata-roots.js.map +1 -0
  114. package/dist/lib/runtime-detection.d.ts +1 -1
  115. package/dist/lib/runtime-detection.d.ts.map +1 -1
  116. package/dist/lib/runtime-detection.js +2 -1
  117. package/dist/lib/runtime-detection.js.map +1 -1
  118. package/dist/lib/server-auth-token.d.ts +18 -0
  119. package/dist/lib/server-auth-token.d.ts.map +1 -0
  120. package/dist/lib/server-auth-token.js +28 -0
  121. package/dist/lib/server-auth-token.js.map +1 -0
  122. package/dist/lib/thumbnail.d.ts.map +1 -1
  123. package/dist/lib/thumbnail.js +3 -1
  124. package/dist/lib/thumbnail.js.map +1 -1
  125. package/dist/lib/timeline-bundle.d.ts +70 -0
  126. package/dist/lib/timeline-bundle.d.ts.map +1 -1
  127. package/dist/lib/timeline-bundle.js +28 -10
  128. package/dist/lib/timeline-bundle.js.map +1 -1
  129. package/dist/lib/timeline-media-export.d.ts +18 -0
  130. package/dist/lib/timeline-media-export.d.ts.map +1 -0
  131. package/dist/lib/timeline-media-export.js +66 -0
  132. package/dist/lib/timeline-media-export.js.map +1 -0
  133. package/dist/lib/timeline-premiere-import.d.ts +24 -0
  134. package/dist/lib/timeline-premiere-import.d.ts.map +1 -0
  135. package/dist/lib/timeline-premiere-import.js +112 -0
  136. package/dist/lib/timeline-premiere-import.js.map +1 -0
  137. package/dist/lib/timeline-premiere.d.ts +38 -0
  138. package/dist/lib/timeline-premiere.d.ts.map +1 -0
  139. package/dist/lib/timeline-premiere.js +87 -0
  140. package/dist/lib/timeline-premiere.js.map +1 -0
  141. package/dist/lib/zip-stream.d.ts +3 -0
  142. package/dist/lib/zip-stream.d.ts.map +1 -1
  143. package/dist/lib/zip-stream.js +6 -0
  144. package/dist/lib/zip-stream.js.map +1 -1
  145. package/dist/mcp-agent-tools.d.ts +48 -0
  146. package/dist/mcp-agent-tools.d.ts.map +1 -1
  147. package/dist/mcp-agent-tools.js +15 -2
  148. package/dist/mcp-agent-tools.js.map +1 -1
  149. package/dist/mcp-server.d.ts +7 -0
  150. package/dist/mcp-server.d.ts.map +1 -1
  151. package/dist/mcp-server.js +163 -16
  152. package/dist/mcp-server.js.map +1 -1
  153. package/dist/mcp-skill-prompts.d.ts +23 -0
  154. package/dist/mcp-skill-prompts.d.ts.map +1 -0
  155. package/dist/mcp-skill-prompts.js +91 -0
  156. package/dist/mcp-skill-prompts.js.map +1 -0
  157. package/dist/mcp-tool-deps.d.ts.map +1 -1
  158. package/dist/mcp-tool-deps.js +8 -1
  159. package/dist/mcp-tool-deps.js.map +1 -1
  160. package/dist/model-download-runtime.d.ts.map +1 -1
  161. package/dist/model-download-runtime.js +2 -1
  162. package/dist/model-download-runtime.js.map +1 -1
  163. package/dist/models-api.d.ts.map +1 -1
  164. package/dist/models-api.js +6 -2
  165. package/dist/models-api.js.map +1 -1
  166. package/dist/node-registry-setup.d.ts +8 -5
  167. package/dist/node-registry-setup.d.ts.map +1 -1
  168. package/dist/node-registry-setup.js +22 -10
  169. package/dist/node-registry-setup.js.map +1 -1
  170. package/dist/oauth-api.d.ts.map +1 -1
  171. package/dist/oauth-api.js +45 -23
  172. package/dist/oauth-api.js.map +1 -1
  173. package/dist/openai-api.d.ts.map +1 -1
  174. package/dist/openai-api.js +10 -2
  175. package/dist/openai-api.js.map +1 -1
  176. package/dist/pack-source.d.ts +15 -0
  177. package/dist/pack-source.d.ts.map +1 -0
  178. package/dist/pack-source.js +85 -0
  179. package/dist/pack-source.js.map +1 -0
  180. package/dist/plugins/websocket.d.ts.map +1 -1
  181. package/dist/plugins/websocket.js +31 -5
  182. package/dist/plugins/websocket.js.map +1 -1
  183. package/dist/routes/applications.d.ts +1 -0
  184. package/dist/routes/applications.d.ts.map +1 -1
  185. package/dist/routes/applications.js +24 -0
  186. package/dist/routes/applications.js.map +1 -1
  187. package/dist/routes/assets.d.ts.map +1 -1
  188. package/dist/routes/assets.js +31 -41
  189. package/dist/routes/assets.js.map +1 -1
  190. package/dist/routes/config.d.ts.map +1 -1
  191. package/dist/routes/config.js +6 -0
  192. package/dist/routes/config.js.map +1 -1
  193. package/dist/routes/documents.d.ts.map +1 -1
  194. package/dist/routes/documents.js +32 -1
  195. package/dist/routes/documents.js.map +1 -1
  196. package/dist/routes/fal-pricing-estimate.d.ts.map +1 -1
  197. package/dist/routes/fal-pricing-estimate.js +2 -0
  198. package/dist/routes/fal-pricing-estimate.js.map +1 -1
  199. package/dist/routes/files.d.ts.map +1 -1
  200. package/dist/routes/files.js +2 -0
  201. package/dist/routes/files.js.map +1 -1
  202. package/dist/routes/games.d.ts +38 -0
  203. package/dist/routes/games.d.ts.map +1 -0
  204. package/dist/routes/games.js +159 -0
  205. package/dist/routes/games.js.map +1 -0
  206. package/dist/routes/integrations.d.ts.map +1 -1
  207. package/dist/routes/integrations.js +22 -26
  208. package/dist/routes/integrations.js.map +1 -1
  209. package/dist/routes/js-scripts.d.ts +1 -1
  210. package/dist/routes/js-scripts.d.ts.map +1 -1
  211. package/dist/routes/js-scripts.js +1 -1
  212. package/dist/routes/js-scripts.js.map +1 -1
  213. package/dist/routes/kie-pricing.js +1 -1
  214. package/dist/routes/kie-pricing.js.map +1 -1
  215. package/dist/routes/nodes.d.ts.map +1 -1
  216. package/dist/routes/nodes.js +13 -1
  217. package/dist/routes/nodes.js.map +1 -1
  218. package/dist/routes/project-archive.d.ts +18 -0
  219. package/dist/routes/project-archive.d.ts.map +1 -0
  220. package/dist/routes/project-archive.js +98 -0
  221. package/dist/routes/project-archive.js.map +1 -0
  222. package/dist/routes/storage.d.ts.map +1 -1
  223. package/dist/routes/storage.js +2 -0
  224. package/dist/routes/storage.js.map +1 -1
  225. package/dist/routes/storyboards.d.ts.map +1 -1
  226. package/dist/routes/storyboards.js +6 -3
  227. package/dist/routes/storyboards.js.map +1 -1
  228. package/dist/routes/timelines.d.ts +8 -4
  229. package/dist/routes/timelines.d.ts.map +1 -1
  230. package/dist/routes/timelines.js +209 -16
  231. package/dist/routes/timelines.js.map +1 -1
  232. package/dist/screenshot-docs-seed.d.ts +24 -0
  233. package/dist/screenshot-docs-seed.d.ts.map +1 -0
  234. package/dist/screenshot-docs-seed.js +421 -0
  235. package/dist/screenshot-docs-seed.js.map +1 -0
  236. package/dist/screenshot-projects.d.ts.map +1 -1
  237. package/dist/screenshot-projects.js +9 -9
  238. package/dist/screenshot-projects.js.map +1 -1
  239. package/dist/screenshot-server.js +274 -17
  240. package/dist/screenshot-server.js.map +1 -1
  241. package/dist/sdk/sdk-node-type-inventory-service.d.ts +1 -1
  242. package/dist/sdk/sdk-node-type-inventory-service.d.ts.map +1 -1
  243. package/dist/sdk/sdk-node-type-inventory-service.js +4 -4
  244. package/dist/sdk/sdk-node-type-inventory-service.js.map +1 -1
  245. package/dist/sdk/sdk-v1-service.js +1 -1
  246. package/dist/sdk/sdk-v1-service.js.map +1 -1
  247. package/dist/server.d.ts +7 -1
  248. package/dist/server.d.ts.map +1 -1
  249. package/dist/server.js +1482 -1487
  250. package/dist/server.js.map +1 -1
  251. package/dist/session/chat-prompt.d.ts.map +1 -1
  252. package/dist/session/chat-prompt.js +6 -0
  253. package/dist/session/chat-prompt.js.map +1 -1
  254. package/dist/session/chat-turn.d.ts +10 -0
  255. package/dist/session/chat-turn.d.ts.map +1 -1
  256. package/dist/session/chat-turn.js +103 -20
  257. package/dist/session/chat-turn.js.map +1 -1
  258. package/dist/session/client-tool-gate.d.ts +23 -0
  259. package/dist/session/client-tool-gate.d.ts.map +1 -0
  260. package/dist/session/client-tool-gate.js +59 -0
  261. package/dist/session/client-tool-gate.js.map +1 -0
  262. package/dist/session/commands.d.ts +14 -0
  263. package/dist/session/commands.d.ts.map +1 -1
  264. package/dist/session/commands.js +113 -14
  265. package/dist/session/commands.js.map +1 -1
  266. package/dist/session/inference.d.ts +25 -2
  267. package/dist/session/inference.d.ts.map +1 -1
  268. package/dist/session/inference.js +105 -21
  269. package/dist/session/inference.js.map +1 -1
  270. package/dist/session/job-execution.d.ts +0 -1
  271. package/dist/session/job-execution.d.ts.map +1 -1
  272. package/dist/session/job-execution.js +43 -39
  273. package/dist/session/job-execution.js.map +1 -1
  274. package/dist/storage-api.d.ts +0 -4
  275. package/dist/storage-api.d.ts.map +1 -1
  276. package/dist/storage-api.js +3 -26
  277. package/dist/storage-api.js.map +1 -1
  278. package/dist/test-ui-server.d.ts +15 -3
  279. package/dist/test-ui-server.d.ts.map +1 -1
  280. package/dist/test-ui-server.js +74 -12
  281. package/dist/test-ui-server.js.map +1 -1
  282. package/dist/triggers/dispatcher.d.ts.map +1 -1
  283. package/dist/triggers/dispatcher.js +24 -4
  284. package/dist/triggers/dispatcher.js.map +1 -1
  285. package/dist/triggers/file-watch.d.ts +2 -2
  286. package/dist/triggers/file-watch.d.ts.map +1 -1
  287. package/dist/triggers/file-watch.js +44 -21
  288. package/dist/triggers/file-watch.js.map +1 -1
  289. package/dist/triggers/scheduler.d.ts.map +1 -1
  290. package/dist/triggers/scheduler.js +7 -5
  291. package/dist/triggers/scheduler.js.map +1 -1
  292. package/dist/trpc/error-formatter.d.ts.map +1 -1
  293. package/dist/trpc/error-formatter.js +2 -1
  294. package/dist/trpc/error-formatter.js.map +1 -1
  295. package/dist/trpc/routers/app-instances.d.ts +63 -0
  296. package/dist/trpc/routers/app-instances.d.ts.map +1 -1
  297. package/dist/trpc/routers/app-runs.d.ts +28 -0
  298. package/dist/trpc/routers/app-runs.d.ts.map +1 -1
  299. package/dist/trpc/routers/applications.d.ts +7 -0
  300. package/dist/trpc/routers/applications.d.ts.map +1 -1
  301. package/dist/trpc/routers/assets.d.ts +8 -0
  302. package/dist/trpc/routers/assets.d.ts.map +1 -1
  303. package/dist/trpc/routers/assets.js +16 -5
  304. package/dist/trpc/routers/assets.js.map +1 -1
  305. package/dist/trpc/routers/collections.d.ts.map +1 -1
  306. package/dist/trpc/routers/collections.js +16 -10
  307. package/dist/trpc/routers/collections.js.map +1 -1
  308. package/dist/trpc/routers/credits.d.ts.map +1 -1
  309. package/dist/trpc/routers/credits.js +11 -1
  310. package/dist/trpc/routers/credits.js.map +1 -1
  311. package/dist/trpc/routers/extension.d.ts +17 -3
  312. package/dist/trpc/routers/extension.d.ts.map +1 -1
  313. package/dist/trpc/routers/extension.js +40 -7
  314. package/dist/trpc/routers/extension.js.map +1 -1
  315. package/dist/trpc/routers/gameDraftHistory.d.ts +1 -2
  316. package/dist/trpc/routers/gameDraftHistory.d.ts.map +1 -1
  317. package/dist/trpc/routers/gameDraftHistory.js +1 -1
  318. package/dist/trpc/routers/gameDraftHistory.js.map +1 -1
  319. package/dist/trpc/routers/games.d.ts +20478 -24667
  320. package/dist/trpc/routers/games.d.ts.map +1 -1
  321. package/dist/trpc/routers/games.js +325 -143
  322. package/dist/trpc/routers/games.js.map +1 -1
  323. package/dist/trpc/routers/jobs.d.ts +7 -0
  324. package/dist/trpc/routers/jobs.d.ts.map +1 -1
  325. package/dist/trpc/routers/jobs.js +10 -3
  326. package/dist/trpc/routers/jobs.js.map +1 -1
  327. package/dist/trpc/routers/js-scripts.d.ts.map +1 -1
  328. package/dist/trpc/routers/js-scripts.js +18 -2
  329. package/dist/trpc/routers/js-scripts.js.map +1 -1
  330. package/dist/trpc/routers/messages.d.ts +10 -0
  331. package/dist/trpc/routers/messages.d.ts.map +1 -1
  332. package/dist/trpc/routers/messages.js +16 -2
  333. package/dist/trpc/routers/messages.js.map +1 -1
  334. package/dist/trpc/routers/models.d.ts.map +1 -1
  335. package/dist/trpc/routers/models.js +58 -37
  336. package/dist/trpc/routers/models.js.map +1 -1
  337. package/dist/trpc/routers/packs.d.ts.map +1 -1
  338. package/dist/trpc/routers/packs.js +19 -5
  339. package/dist/trpc/routers/packs.js.map +1 -1
  340. package/dist/trpc/routers/projects.d.ts +66 -2
  341. package/dist/trpc/routers/projects.d.ts.map +1 -1
  342. package/dist/trpc/routers/projects.js +19 -2
  343. package/dist/trpc/routers/projects.js.map +1 -1
  344. package/dist/trpc/routers/settings.d.ts.map +1 -1
  345. package/dist/trpc/routers/settings.js +30 -5
  346. package/dist/trpc/routers/settings.js.map +1 -1
  347. package/dist/trpc/routers/sketch.d.ts +30 -0
  348. package/dist/trpc/routers/sketch.d.ts.map +1 -1
  349. package/dist/trpc/routers/sketch.js +2 -2
  350. package/dist/trpc/routers/sketch.js.map +1 -1
  351. package/dist/trpc/routers/storyboards.d.ts +171 -1
  352. package/dist/trpc/routers/storyboards.d.ts.map +1 -1
  353. package/dist/trpc/routers/storyboards.js +8 -5
  354. package/dist/trpc/routers/storyboards.js.map +1 -1
  355. package/dist/trpc/routers/threads.d.ts.map +1 -1
  356. package/dist/trpc/routers/threads.js +11 -2
  357. package/dist/trpc/routers/threads.js.map +1 -1
  358. package/dist/trpc/routers/timeline.d.ts +379 -0
  359. package/dist/trpc/routers/timeline.d.ts.map +1 -1
  360. package/dist/trpc/routers/timeline.js +15 -2
  361. package/dist/trpc/routers/timeline.js.map +1 -1
  362. package/dist/trpc/routers/triggers.d.ts.map +1 -1
  363. package/dist/trpc/routers/triggers.js +18 -3
  364. package/dist/trpc/routers/triggers.js.map +1 -1
  365. package/dist/trpc/routers/users.d.ts +3 -2
  366. package/dist/trpc/routers/users.d.ts.map +1 -1
  367. package/dist/trpc/routers/users.js +25 -27
  368. package/dist/trpc/routers/users.js.map +1 -1
  369. package/dist/trpc/routers/worker.d.ts.map +1 -1
  370. package/dist/trpc/routers/worker.js +37 -14
  371. package/dist/trpc/routers/worker.js.map +1 -1
  372. package/dist/trpc/routers/workflows.d.ts +190 -0
  373. package/dist/trpc/routers/workflows.d.ts.map +1 -1
  374. package/dist/trpc/routers/workflows.js +56 -15
  375. package/dist/trpc/routers/workflows.js.map +1 -1
  376. package/dist/trpc/sandbox-coverage.d.ts.map +1 -1
  377. package/dist/trpc/sandbox-coverage.js +34 -0
  378. package/dist/trpc/sandbox-coverage.js.map +1 -1
  379. package/dist/websocket-client-session.d.ts +2 -2
  380. package/dist/websocket-client-session.d.ts.map +1 -1
  381. package/dist/websocket-client-session.js +9 -3
  382. package/dist/websocket-client-session.js.map +1 -1
  383. package/dist/worker-settings-env.d.ts +23 -0
  384. package/dist/worker-settings-env.d.ts.map +1 -0
  385. package/dist/worker-settings-env.js +47 -0
  386. package/dist/worker-settings-env.js.map +1 -0
  387. package/dist/workflow-interface-service.d.ts +7 -0
  388. package/dist/workflow-interface-service.d.ts.map +1 -1
  389. package/package.json +51 -46
@@ -1,6 +1,6 @@
1
1
  import { registerChatRunTrace, registerWorkflowRunTrace, withRegisteredRunTrace, settleRegisteredRunTrace } from "@nodetool-ai/execution";
2
2
  import { getRunTraceScope, suppressRunTraceContent } from "@nodetool-ai/runtime";
3
- import { TRACE_RESTRICTED_CAPABILITY_MODULES } from "@nodetool-ai/protocol";
3
+ import { TRACE_RESTRICTED_CAPABILITY_MODULES, missingPackDetailsOf, isFullResourceId } from "@nodetool-ai/protocol";
4
4
  import { trace, SpanStatusCode } from "@opentelemetry/api";
5
5
  import { settleRunTrace, registerRunTraceParent, registerRunTraceParents, threadHasTraceContentTools } from "@nodetool-ai/models";
6
6
  import { capabilityModuleOf, listCapabilitySpecs } from "@nodetool-ai/agents";
@@ -8,6 +8,8 @@ import { createLogger } from "@nodetool-ai/config";
8
8
  import { randomUUID } from "node:crypto";
9
9
  import { SUPERSEDED_TOOL_RESULT, repairOrphanedToolCalls } from "../chat-tool-call-repair.js";
10
10
  import { attachChatPredictionForwarder } from "../chat-prediction-forwarder.js";
11
+ import { dispatchClientTool } from "./client-tool-gate.js";
12
+ import { admitSpend } from "../credit-gate.js";
11
13
  import { isGoogleWorkspaceEnabled } from "@nodetool-ai/config";
12
14
  import { isFunctionValue, isNonEmptyString, isNumber, isObjectLike, isRecord, isString } from "../lib/wire-values.js";
13
15
  import { storeAssetWithThumbnail } from "../lib/thumbnail.js";
@@ -16,7 +18,7 @@ import { attachRunCostLedger, linkGenerationAssets, ExecutionSession, isExecutio
16
18
  import { Asset, COMPACTION_EVENT_TYPE, compactionMessageContent, isCompactionMessage, Job, Message, Prediction, Project, Skill, Thread, Memory, Workflow } from "@nodetool-ai/models";
17
19
  import { WORKFLOW_DOCUMENT_TOOL_NAMES } from "@nodetool-ai/node-sdk";
18
20
  import { ACTIVE_MODEL_CONTEXT_KEY, DIRECT_TOOL_NAMES, RUN_BUDGET_CONTEXT_KEY, createRunBudget, detectImageMime, IMAGE_MIME_TO_EXT, expandEntitiesForGeneration, getProcessSandboxModuleCatalog, estimatePromptTokens, isToolCall, isProviderSessionUpdate, isProviderMessageEvent, isProviderStop, httpStatusFromError, groqRequestFailureMessage, mediaResolverFor, providerFailureDetail, resolveContextWindow } from "@nodetool-ai/runtime";
19
- import { isModelSelection, PROVIDER_IDS, NO_MODEL_SELECTED_MESSAGE, noMediaModelSelectedMessage } from "@nodetool-ai/protocol";
21
+ import { isModelSelection, isReasoningEffort, supportsReasoningEffort, PROVIDER_IDS, NO_MODEL_SELECTED_MESSAGE, noMediaModelSelectedMessage } from "@nodetool-ai/protocol";
20
22
  import { Tool, compactAssetUris, compactResourceIds } from "@nodetool-ai/agents";
21
23
  import { createChatCodeActSession, createSandboxClock, sandboxPackagesForChat, CODEACT_RESIDENT_TOOL_NAMES, EXECUTE_CODE_TOOL_NAME } from "@nodetool-ai/agents";
22
24
  import { availableBuiltinToolNames, GOOGLE_WORKSPACE_TOOL_NAMES, APIFY_TOOL_NAMES, SERPAPI_TOOL_NAMES, capabilityForName, capabilityProviderTool, getAllMcpCapabilitySpecs, toolFromCapability, capabilityFromTool, createCapabilityRun, contextSecretAvailability, BackgroundSubtaskRegistry, PERMISSION_GATE_CONTEXT_KEY, GAME_ASSET_NODE_RUNNER_CONTEXT_KEY, extractInjectableImages, registerTemporaryImageHandle } from "@nodetool-ai/agents";
@@ -248,6 +250,27 @@ const MEMORY_BLOCK_LIMIT = 100;
248
250
  * full thread load.
249
251
  */
250
252
  const SESSION_PROBE_WINDOW = 50;
253
+ /** The most rows of a thread a turn loads as its history. */
254
+ const THREAD_HISTORY_LIMIT = 1000;
255
+ /**
256
+ * The thread's newest rows, oldest first. An ascending page would return the
257
+ * oldest rows instead, and a thread past the limit would then lose its latest
258
+ * turns, the user message just sent among them.
259
+ *
260
+ * A window cut by the limit starts at its first user row, so it never opens on
261
+ * a tool result whose call fell outside it.
262
+ */
263
+ export async function loadRecentThreadRows(threadId, limit = THREAD_HISTORY_LIMIT) {
264
+ const [newestFirst] = await Message.paginate(threadId, {
265
+ reverse: true,
266
+ limit
267
+ });
268
+ const rows = newestFirst.reverse();
269
+ if (rows.length < limit)
270
+ return rows;
271
+ const firstUser = rows.findIndex((row) => row.role === "user");
272
+ return firstUser > 0 ? rows.slice(firstUser) : rows;
273
+ }
251
274
  /**
252
275
  * Output-token worst case assumed when reserving a chat turn. The chat loop
253
276
  * sends no `maxTokens`, so nothing bounds the answer from this side; the
@@ -505,6 +528,12 @@ export class ChatTurnHandler {
505
528
  const existing = await Thread.find(userId, threadId);
506
529
  if (existing)
507
530
  return existing.id;
531
+ // `create` upserts on the primary key, so creating under an id another
532
+ // user's thread already holds would reassign that thread (and its
533
+ // history) to this caller.
534
+ if (await Thread.get(threadId)) {
535
+ throw new Error("Thread not found");
536
+ }
508
537
  const thread = await Thread.create({
509
538
  id: threadId,
510
539
  user_id: userId,
@@ -518,14 +547,24 @@ export class ChatTurnHandler {
518
547
  * Save a message dict to the database.
519
548
  * Mirrors Python's _save_message_to_db_async: pops id, type, user_id before create.
520
549
  */
521
- async saveMessageToDb(messageData) {
550
+ async saveMessageToDb(messageData, options = {}) {
522
551
  const data = { ...messageData };
552
+ const clientId = data.id;
523
553
  delete data.id;
524
554
  delete data.type;
525
555
  const threadId = isString(data.thread_id) ? data.thread_id : "";
526
556
  delete data.thread_id;
527
557
  const userId = this.session.requireUserId();
528
558
  delete data.user_id;
559
+ // The user's own turn keeps the id the client minted for it, so the client
560
+ // can name that turn later (Regenerate, edit a sent message) without a
561
+ // round-trip. Anything that is not a fresh 32-hex id is replaced.
562
+ if (options.keepClientId &&
563
+ isString(clientId) &&
564
+ isFullResourceId(clientId) &&
565
+ !(await Message.find(clientId))) {
566
+ data.id = clientId;
567
+ }
529
568
  const message = await Message.create({ thread_id: threadId, user_id: userId, ...data });
530
569
  const scope = getRunTraceScope();
531
570
  if (scope) {
@@ -939,6 +978,10 @@ export class ChatTurnHandler {
939
978
  graph = await this.deps.hydrateGraph(rawGraph);
940
979
  }
941
980
  catch (err) {
981
+ const missing = missingPackDetailsOf(err);
982
+ if (missing) {
983
+ return missing;
984
+ }
942
985
  return {
943
986
  error: `Failed to prepare node '${nodeType}': ${err instanceof Error ? err.message : String(err)}`
944
987
  };
@@ -948,6 +991,10 @@ export class ChatTurnHandler {
948
991
  await this.deps.beforeRunJob(graph);
949
992
  }
950
993
  catch (err) {
994
+ const missing = missingPackDetailsOf(err);
995
+ if (missing) {
996
+ return missing;
997
+ }
951
998
  return {
952
999
  error: `Node prerequisites failed: ${err instanceof Error ? err.message : String(err)}`
953
1000
  };
@@ -997,6 +1044,10 @@ export class ChatTurnHandler {
997
1044
  });
998
1045
  }
999
1046
  catch (err) {
1047
+ const missing = missingPackDetailsOf(err);
1048
+ if (missing) {
1049
+ return missing;
1050
+ }
1000
1051
  if (!isExecutionPreflightError(err))
1001
1052
  throw err;
1002
1053
  return { error: err.message };
@@ -1015,6 +1066,9 @@ export class ChatTurnHandler {
1015
1066
  }
1016
1067
  }
1017
1068
  if (result.status === "failed") {
1069
+ if (result.missingPack) {
1070
+ return result.missingPack;
1071
+ }
1018
1072
  return { error: result.error ?? `Node '${nodeType}' failed` };
1019
1073
  }
1020
1074
  if (nodeResult === undefined) {
@@ -1083,7 +1137,7 @@ export class ChatTurnHandler {
1083
1137
  const userId = this.session.requireUserId();
1084
1138
  log.debug("Chat message", { threadId, model, provider: providerId });
1085
1139
  // Save user message to DB — matches Python's _save_message_to_db_async(data)
1086
- const turnMessage = await this.saveMessageToDb(data);
1140
+ const turnMessage = await this.saveMessageToDb(data, { keepClientId: true });
1087
1141
  const rootContext = createRuntimeContext({ jobId: turnMessage.id, threadId, workflowId, userId, workspace: null });
1088
1142
  await registerChatRunTrace(rootContext, { messageId: turnMessage.id, threadId });
1089
1143
  return withRegisteredRunTrace(rootContext, "chat.turn", async () => {
@@ -1117,6 +1171,21 @@ export class ChatTurnHandler {
1117
1171
  });
1118
1172
  return;
1119
1173
  }
1174
+ // The managed provider spends NodeTool's own keys against the user's
1175
+ // credits. Every other managed entry point admits against the balance and
1176
+ // the operator's model whitelist first, and so does a chat turn.
1177
+ if (providerId === "nodetool") {
1178
+ const decision = await admitSpend(userId, 0, [model]);
1179
+ if (!decision.allowed) {
1180
+ await settleRegisteredRunTrace(rootContext, "failed", decision.reason);
1181
+ await this.session.send({
1182
+ type: "error",
1183
+ message: decision.reason,
1184
+ thread_id: threadId
1185
+ });
1186
+ return;
1187
+ }
1188
+ }
1120
1189
  // Route to the workflow processor ONLY when the client explicitly opts in
1121
1190
  // via `workflow_target: "workflow"`. A bare `workflow_id` is context, not a
1122
1191
  // routing signal: the editor binds the open workflow so `ui_*` tools target
@@ -1127,7 +1196,7 @@ export class ChatTurnHandler {
1127
1196
  ? data.workflow_target
1128
1197
  : null;
1129
1198
  if (workflowTarget === "workflow") {
1130
- await this.handleWorkflowMessage(data, requestSeq, signal);
1199
+ await this.handleWorkflowMessage(data, turnMessage.id, requestSeq, signal);
1131
1200
  return;
1132
1201
  }
1133
1202
  // Route to media generation when the client requests a text-to-image or
@@ -1152,6 +1221,12 @@ export class ChatTurnHandler {
1152
1221
  data.permission_mode === "default"
1153
1222
  ? data.permission_mode
1154
1223
  : "default";
1224
+ // The composer's reasoning level. Only models that accept it receive it,
1225
+ // so a stale pick from another model is dropped rather than sent.
1226
+ const reasoningEffort = isReasoningEffort(data.reasoning_effort) &&
1227
+ supportsReasoningEffort(providerId, model)
1228
+ ? data.reasoning_effort
1229
+ : undefined;
1155
1230
  // A surface can send a context-specific system-prompt addendum (e.g. the
1156
1231
  // App Builder's build-an-app-UI guidance), layered after the base prompt.
1157
1232
  const extraSystemPrompt = isString(data.system_prompt)
@@ -1285,7 +1360,7 @@ export class ChatTurnHandler {
1285
1360
  sessionCheckpointOverride =
1286
1361
  probeSession.checkpoint + 1 + newTurns.length;
1287
1362
  loadFullHistory = async () => {
1288
- const [rows] = await Message.paginate(threadId, { limit: 1000 });
1363
+ const rows = await loadRecentThreadRows(threadId);
1289
1364
  const full = convertDbMessages(historySinceCompaction(rows));
1290
1365
  full.unshift(systemChatMessage());
1291
1366
  const scope = getRunTraceScope();
@@ -1306,7 +1381,7 @@ export class ChatTurnHandler {
1306
1381
  // all (a far-back session still resumes via the slice path). A session
1307
1382
  // older than the compaction cut is not one of them: searching only the
1308
1383
  // compacted slice is what keeps the newest marker winning here too.
1309
- const [rows] = await Message.paginate(threadId, { limit: 1000 });
1384
+ const rows = await loadRecentThreadRows(threadId);
1310
1385
  const kept = historySinceCompaction(rows);
1311
1386
  chatHistory = convertDbMessages(kept);
1312
1387
  priorSession = lastMatchingProviderSession(kept, providerId, model);
@@ -1820,16 +1895,18 @@ export class ChatTurnHandler {
1820
1895
  }
1821
1896
  else if (this.deps.clientTools()[toolCall.name]) {
1822
1897
  // Client-side tool — round-trip through the UI via the ToolBridge.
1823
- await this.session.send({
1824
- type: "tool_call",
1825
- thread_id: threadId,
1826
- tool_call_id: toolCall.id,
1827
- name: toolCall.name,
1828
- args: toolCall.args
1898
+ // A tool that spends money passes the turn's permission gate first.
1899
+ toolResult = await dispatchClientTool(this.chatCapabilityRun, toolCall.name, toolCall.args ?? {}, async () => {
1900
+ await this.session.send({
1901
+ type: "tool_call",
1902
+ thread_id: threadId,
1903
+ tool_call_id: toolCall.id,
1904
+ name: toolCall.name,
1905
+ args: toolCall.args
1906
+ });
1907
+ const clientResult = await this.deps.toolBridge.createWaiter(toolCall.id, 300_000, threadId);
1908
+ return clientResult.result ?? clientResult.content ?? clientResult;
1829
1909
  });
1830
- const clientResult = await this.deps.toolBridge.createWaiter(toolCall.id, 300_000, threadId);
1831
- toolResult =
1832
- clientResult.result ?? clientResult.content ?? clientResult;
1833
1910
  }
1834
1911
  else {
1835
1912
  toolResult = { error: `Tool "${toolCall.name}" not available` };
@@ -2063,7 +2140,7 @@ export class ChatTurnHandler {
2063
2140
  * turn that cannot run at all.
2064
2141
  */
2065
2142
  const compactThread = async (reason) => {
2066
- const [rows] = await Message.paginate(threadId, { limit: 1000 });
2143
+ const rows = await loadRecentThreadRows(threadId);
2067
2144
  const cut = chooseCompactionCut(historySinceCompaction(rows), compaction.keepUserTurns, {
2068
2145
  // Leave room for the summary, turn context and subsequent replies.
2069
2146
  maxTokens: compactionThresholdTokens * 0.75 -
@@ -2177,6 +2254,7 @@ export class ChatTurnHandler {
2177
2254
  executeTool: useTools ? effectiveExecuteTool : undefined,
2178
2255
  maxIterations: MAX_TOOL_ROUNDS,
2179
2256
  turnBudget,
2257
+ effort: reasoningEffort,
2180
2258
  sequentialTools: session ? true : undefined,
2181
2259
  workspaceDir: chatWorkspace?.localDir ?? undefined,
2182
2260
  skills: skillsForProvider,
@@ -3214,7 +3292,7 @@ export class ChatTurnHandler {
3214
3292
  * 6. Collect output_update results
3215
3293
  * 7. Send response message with typed content, then the terminal chunk
3216
3294
  */
3217
- async handleWorkflowMessage(data, requestSeq, signal) {
3295
+ async handleWorkflowMessage(data, turnMessageId, requestSeq, signal) {
3218
3296
  const threadId = isString(data.thread_id) ? data.thread_id : "";
3219
3297
  const workflowId = isString(data.workflow_id) ? data.workflow_id : null;
3220
3298
  const providerId = isString(data.provider)
@@ -3256,7 +3334,7 @@ export class ChatTurnHandler {
3256
3334
  messagesName ??
3257
3335
  "messages";
3258
3336
  // Build chat history for params — matches Python
3259
- const [dbMessages] = await Message.paginate(threadId, { limit: 1000 });
3337
+ const dbMessages = await loadRecentThreadRows(threadId);
3260
3338
  const inheritedTrace = getRunTraceScope();
3261
3339
  seedStoredToolProvenance(dbMessages);
3262
3340
  if (inheritedTrace) {
@@ -3280,7 +3358,12 @@ export class ChatTurnHandler {
3280
3358
  // Prepare params — matches Python's WorkflowMessageProcessor
3281
3359
  const params = {
3282
3360
  [messageInputName]: currentMessage,
3283
- [messagesInputName]: [...chatHistorySerialized, currentMessage]
3361
+ // The stored history already holds this turn's message; it is appended
3362
+ // once, as `currentMessage`.
3363
+ [messagesInputName]: [
3364
+ ...chatHistorySerialized.filter((_, i) => dbMessages[i].id !== turnMessageId),
3365
+ currentMessage
3366
+ ]
3284
3367
  };
3285
3368
  if (isObjectLike(data.params)) {
3286
3369
  Object.assign(params, data.params);