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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1020) hide show
  1. package/README.md +50 -0
  2. package/dist/.nodetool-build-stamp +1 -0
  3. package/dist/agent/run-node-tool.d.ts +39 -0
  4. package/dist/agent/run-node-tool.d.ts.map +1 -0
  5. package/dist/agent/run-node-tool.js +55 -0
  6. package/dist/agent/run-node-tool.js.map +1 -0
  7. package/dist/chat-prediction-forwarder.d.ts +13 -0
  8. package/dist/chat-prediction-forwarder.d.ts.map +1 -0
  9. package/dist/chat-prediction-forwarder.js +22 -0
  10. package/dist/chat-prediction-forwarder.js.map +1 -0
  11. package/dist/chat-tool-call-repair.d.ts +45 -0
  12. package/dist/chat-tool-call-repair.d.ts.map +1 -0
  13. package/dist/chat-tool-call-repair.js +100 -0
  14. package/dist/chat-tool-call-repair.js.map +1 -0
  15. package/dist/chat-turn-registry.d.ts +169 -0
  16. package/dist/chat-turn-registry.d.ts.map +1 -0
  17. package/dist/chat-turn-registry.js +326 -0
  18. package/dist/chat-turn-registry.js.map +1 -0
  19. package/dist/collection-api.d.ts +2 -2
  20. package/dist/collection-api.d.ts.map +1 -1
  21. package/dist/collection-api.js +44 -13
  22. package/dist/collection-api.js.map +1 -1
  23. package/dist/configured-providers.d.ts +52 -0
  24. package/dist/configured-providers.d.ts.map +1 -0
  25. package/dist/configured-providers.js +85 -0
  26. package/dist/configured-providers.js.map +1 -0
  27. package/dist/cors.d.ts +22 -0
  28. package/dist/cors.d.ts.map +1 -0
  29. package/dist/cors.js +91 -0
  30. package/dist/cors.js.map +1 -0
  31. package/dist/credit-gate.d.ts +36 -0
  32. package/dist/credit-gate.d.ts.map +1 -0
  33. package/dist/credit-gate.js +76 -0
  34. package/dist/credit-gate.js.map +1 -0
  35. package/dist/custom-providers.d.ts +40 -0
  36. package/dist/custom-providers.d.ts.map +1 -0
  37. package/dist/custom-providers.js +134 -0
  38. package/dist/custom-providers.js.map +1 -0
  39. package/dist/debug-sessions.d.ts +10 -0
  40. package/dist/debug-sessions.d.ts.map +1 -0
  41. package/dist/debug-sessions.js +9 -0
  42. package/dist/debug-sessions.js.map +1 -0
  43. package/dist/drain.d.ts +34 -0
  44. package/dist/drain.d.ts.map +1 -0
  45. package/dist/drain.js +68 -0
  46. package/dist/drain.js.map +1 -0
  47. package/dist/e2e-server.d.ts +30 -0
  48. package/dist/e2e-server.d.ts.map +1 -0
  49. package/dist/e2e-server.js +111 -0
  50. package/dist/e2e-server.js.map +1 -0
  51. package/dist/example-workflows.d.ts +20 -0
  52. package/dist/example-workflows.d.ts.map +1 -0
  53. package/dist/example-workflows.js +123 -0
  54. package/dist/example-workflows.js.map +1 -0
  55. package/dist/extension-cdp-bridge.d.ts +85 -0
  56. package/dist/extension-cdp-bridge.d.ts.map +1 -0
  57. package/dist/extension-cdp-bridge.js +163 -0
  58. package/dist/extension-cdp-bridge.js.map +1 -0
  59. package/dist/external-mcp.d.ts +58 -0
  60. package/dist/external-mcp.d.ts.map +1 -0
  61. package/dist/external-mcp.js +288 -0
  62. package/dist/external-mcp.js.map +1 -0
  63. package/dist/fake-runtime.d.ts +114 -0
  64. package/dist/fake-runtime.d.ts.map +1 -0
  65. package/dist/fake-runtime.js +270 -0
  66. package/dist/fake-runtime.js.map +1 -0
  67. package/dist/file-api.d.ts +4 -7
  68. package/dist/file-api.d.ts.map +1 -1
  69. package/dist/file-api.js +122 -39
  70. package/dist/file-api.js.map +1 -1
  71. package/dist/frontend-renderer-registry.d.ts +75 -0
  72. package/dist/frontend-renderer-registry.d.ts.map +1 -0
  73. package/dist/frontend-renderer-registry.js +111 -0
  74. package/dist/frontend-renderer-registry.js.map +1 -0
  75. package/dist/generation-recovery.d.ts +13 -0
  76. package/dist/generation-recovery.d.ts.map +1 -0
  77. package/dist/generation-recovery.js +197 -0
  78. package/dist/generation-recovery.js.map +1 -0
  79. package/dist/headless-job-runner.d.ts +71 -0
  80. package/dist/headless-job-runner.d.ts.map +1 -0
  81. package/dist/headless-job-runner.js +198 -0
  82. package/dist/headless-job-runner.js.map +1 -0
  83. package/dist/http-api.d.ts +157 -24
  84. package/dist/http-api.d.ts.map +1 -1
  85. package/dist/http-api.js +613 -646
  86. package/dist/http-api.js.map +1 -1
  87. package/dist/http-body-schemas.d.ts +109 -0
  88. package/dist/http-body-schemas.d.ts.map +1 -0
  89. package/dist/http-body-schemas.js +146 -0
  90. package/dist/http-body-schemas.js.map +1 -0
  91. package/dist/index.d.ts +11 -3
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +11 -3
  94. package/dist/index.js.map +1 -1
  95. package/dist/job-control.d.ts +57 -0
  96. package/dist/job-control.d.ts.map +1 -0
  97. package/dist/job-control.js +134 -0
  98. package/dist/job-control.js.map +1 -0
  99. package/dist/job-queue.d.ts +47 -0
  100. package/dist/job-queue.d.ts.map +1 -0
  101. package/dist/job-queue.js +52 -0
  102. package/dist/job-queue.js.map +1 -0
  103. package/dist/job-run-registry.d.ts +176 -0
  104. package/dist/job-run-registry.d.ts.map +1 -0
  105. package/dist/job-run-registry.js +312 -0
  106. package/dist/job-run-registry.js.map +1 -0
  107. package/dist/lib/app-build-service.d.ts +16 -0
  108. package/dist/lib/app-build-service.d.ts.map +1 -0
  109. package/dist/lib/app-build-service.js +39 -0
  110. package/dist/lib/app-build-service.js.map +1 -0
  111. package/dist/lib/app-debug-service.d.ts +16 -0
  112. package/dist/lib/app-debug-service.d.ts.map +1 -0
  113. package/dist/lib/app-debug-service.js +48 -0
  114. package/dist/lib/app-debug-service.js.map +1 -0
  115. package/dist/lib/app-deployment-service.d.ts +82 -0
  116. package/dist/lib/app-deployment-service.d.ts.map +1 -0
  117. package/dist/lib/app-deployment-service.js +282 -0
  118. package/dist/lib/app-deployment-service.js.map +1 -0
  119. package/dist/lib/app-run-server.d.ts +7 -0
  120. package/dist/lib/app-run-server.d.ts.map +1 -0
  121. package/dist/lib/app-run-server.js +6 -0
  122. package/dist/lib/app-run-server.js.map +1 -0
  123. package/dist/lib/app-session-scope.d.ts +91 -0
  124. package/dist/lib/app-session-scope.d.ts.map +1 -0
  125. package/dist/lib/app-session-scope.js +91 -0
  126. package/dist/lib/app-session-scope.js.map +1 -0
  127. package/dist/lib/applications-service.d.ts +173 -0
  128. package/dist/lib/applications-service.d.ts.map +1 -0
  129. package/dist/lib/applications-service.js +491 -0
  130. package/dist/lib/applications-service.js.map +1 -0
  131. package/dist/lib/asset-duration.d.ts +7 -0
  132. package/dist/lib/asset-duration.d.ts.map +1 -0
  133. package/dist/lib/asset-duration.js +24 -0
  134. package/dist/lib/asset-duration.js.map +1 -0
  135. package/dist/lib/asset-export.d.ts +34 -0
  136. package/dist/lib/asset-export.d.ts.map +1 -0
  137. package/dist/lib/asset-export.js +113 -0
  138. package/dist/lib/asset-export.js.map +1 -0
  139. package/dist/lib/asset-model-interface.d.ts +41 -0
  140. package/dist/lib/asset-model-interface.d.ts.map +1 -0
  141. package/dist/lib/asset-model-interface.js +74 -0
  142. package/dist/lib/asset-model-interface.js.map +1 -0
  143. package/dist/lib/asset-paths.d.ts +52 -0
  144. package/dist/lib/asset-paths.d.ts.map +1 -1
  145. package/dist/lib/asset-paths.js +145 -1
  146. package/dist/lib/asset-paths.js.map +1 -1
  147. package/dist/lib/asset-response.d.ts +12 -0
  148. package/dist/lib/asset-response.d.ts.map +1 -0
  149. package/dist/lib/asset-response.js +88 -0
  150. package/dist/lib/asset-response.js.map +1 -0
  151. package/dist/lib/audio-peaks.d.ts +23 -0
  152. package/dist/lib/audio-peaks.d.ts.map +1 -0
  153. package/dist/lib/audio-peaks.js +331 -0
  154. package/dist/lib/audio-peaks.js.map +1 -0
  155. package/dist/lib/bridge.d.ts +9 -1
  156. package/dist/lib/bridge.d.ts.map +1 -1
  157. package/dist/lib/bridge.js +27 -4
  158. package/dist/lib/bridge.js.map +1 -1
  159. package/dist/lib/compression.d.ts +3 -0
  160. package/dist/lib/compression.d.ts.map +1 -0
  161. package/dist/lib/compression.js +3 -0
  162. package/dist/lib/compression.js.map +1 -0
  163. package/dist/lib/document-model-interfaces.d.ts +30 -0
  164. package/dist/lib/document-model-interfaces.d.ts.map +1 -0
  165. package/dist/lib/document-model-interfaces.js +295 -0
  166. package/dist/lib/document-model-interfaces.js.map +1 -0
  167. package/dist/lib/env-config.d.ts +9 -0
  168. package/dist/lib/env-config.d.ts.map +1 -0
  169. package/dist/lib/env-config.js +18 -0
  170. package/dist/lib/env-config.js.map +1 -0
  171. package/dist/lib/example-apps.d.ts +43 -0
  172. package/dist/lib/example-apps.d.ts.map +1 -0
  173. package/dist/lib/example-apps.js +145 -0
  174. package/dist/lib/example-apps.js.map +1 -0
  175. package/dist/lib/example-games.d.ts +5 -0
  176. package/dist/lib/example-games.d.ts.map +1 -0
  177. package/dist/lib/example-games.js +13 -0
  178. package/dist/lib/example-games.js.map +1 -0
  179. package/dist/lib/example-recipes.d.ts +33 -0
  180. package/dist/lib/example-recipes.d.ts.map +1 -0
  181. package/dist/lib/example-recipes.js +213 -0
  182. package/dist/lib/example-recipes.js.map +1 -0
  183. package/dist/lib/example-storyboards.d.ts +40 -0
  184. package/dist/lib/example-storyboards.d.ts.map +1 -0
  185. package/dist/lib/example-storyboards.js +131 -0
  186. package/dist/lib/example-storyboards.js.map +1 -0
  187. package/dist/lib/example-thumbnail.d.ts +21 -0
  188. package/dist/lib/example-thumbnail.d.ts.map +1 -0
  189. package/dist/lib/example-thumbnail.js +50 -0
  190. package/dist/lib/example-thumbnail.js.map +1 -0
  191. package/dist/lib/example-timelines.d.ts +9 -0
  192. package/dist/lib/example-timelines.d.ts.map +1 -0
  193. package/dist/lib/example-timelines.js +25 -0
  194. package/dist/lib/example-timelines.js.map +1 -0
  195. package/dist/lib/extension-dist.d.ts +24 -0
  196. package/dist/lib/extension-dist.d.ts.map +1 -0
  197. package/dist/lib/extension-dist.js +67 -0
  198. package/dist/lib/extension-dist.js.map +1 -0
  199. package/dist/lib/external-asset-lookup.d.ts +30 -0
  200. package/dist/lib/external-asset-lookup.d.ts.map +1 -0
  201. package/dist/lib/external-asset-lookup.js +99 -0
  202. package/dist/lib/external-asset-lookup.js.map +1 -0
  203. package/dist/lib/external-assets.d.ts +13 -0
  204. package/dist/lib/external-assets.d.ts.map +1 -0
  205. package/dist/lib/external-assets.js +46 -0
  206. package/dist/lib/external-assets.js.map +1 -0
  207. package/dist/lib/fly-replay.d.ts +34 -0
  208. package/dist/lib/fly-replay.d.ts.map +1 -0
  209. package/dist/lib/fly-replay.js +111 -0
  210. package/dist/lib/fly-replay.js.map +1 -0
  211. package/dist/lib/http-rate-limit.d.ts +32 -0
  212. package/dist/lib/http-rate-limit.d.ts.map +1 -0
  213. package/dist/lib/http-rate-limit.js +47 -0
  214. package/dist/lib/http-rate-limit.js.map +1 -0
  215. package/dist/lib/instance-id.d.ts +25 -0
  216. package/dist/lib/instance-id.d.ts.map +1 -0
  217. package/dist/lib/instance-id.js +44 -0
  218. package/dist/lib/instance-id.js.map +1 -0
  219. package/dist/lib/link-codes.d.ts +82 -0
  220. package/dist/lib/link-codes.d.ts.map +1 -0
  221. package/dist/lib/link-codes.js +100 -0
  222. package/dist/lib/link-codes.js.map +1 -0
  223. package/dist/lib/local-asset-upload.d.ts +5 -0
  224. package/dist/lib/local-asset-upload.d.ts.map +1 -0
  225. package/dist/lib/local-asset-upload.js +69 -0
  226. package/dist/lib/local-asset-upload.js.map +1 -0
  227. package/dist/lib/local-file-access.d.ts +31 -0
  228. package/dist/lib/local-file-access.d.ts.map +1 -0
  229. package/dist/lib/local-file-access.js +169 -0
  230. package/dist/lib/local-file-access.js.map +1 -0
  231. package/dist/lib/localhost-trust.d.ts +59 -0
  232. package/dist/lib/localhost-trust.d.ts.map +1 -0
  233. package/dist/lib/localhost-trust.js +139 -0
  234. package/dist/lib/localhost-trust.js.map +1 -0
  235. package/dist/lib/mcp-mount.d.ts +25 -0
  236. package/dist/lib/mcp-mount.d.ts.map +1 -0
  237. package/dist/lib/mcp-mount.js +32 -0
  238. package/dist/lib/mcp-mount.js.map +1 -0
  239. package/dist/lib/media-size.d.ts +21 -0
  240. package/dist/lib/media-size.d.ts.map +1 -0
  241. package/dist/lib/media-size.js +48 -0
  242. package/dist/lib/media-size.js.map +1 -0
  243. package/dist/lib/media.d.ts +38 -0
  244. package/dist/lib/media.d.ts.map +1 -0
  245. package/dist/lib/media.js +146 -0
  246. package/dist/lib/media.js.map +1 -0
  247. package/dist/lib/package-asset-export.d.ts +83 -0
  248. package/dist/lib/package-asset-export.d.ts.map +1 -0
  249. package/dist/lib/package-asset-export.js +212 -0
  250. package/dist/lib/package-asset-export.js.map +1 -0
  251. package/dist/lib/package-assets.d.ts +41 -0
  252. package/dist/lib/package-assets.d.ts.map +1 -0
  253. package/dist/lib/package-assets.js +155 -0
  254. package/dist/lib/package-assets.js.map +1 -0
  255. package/dist/lib/project-delete.d.ts +11 -0
  256. package/dist/lib/project-delete.d.ts.map +1 -0
  257. package/dist/lib/project-delete.js +67 -0
  258. package/dist/lib/project-delete.js.map +1 -0
  259. package/dist/lib/project-document-copy.d.ts +31 -0
  260. package/dist/lib/project-document-copy.d.ts.map +1 -0
  261. package/dist/lib/project-document-copy.js +473 -0
  262. package/dist/lib/project-document-copy.js.map +1 -0
  263. package/dist/lib/public-app-assets.d.ts +8 -0
  264. package/dist/lib/public-app-assets.d.ts.map +1 -0
  265. package/dist/lib/public-app-assets.js +77 -0
  266. package/dist/lib/public-app-assets.js.map +1 -0
  267. package/dist/lib/public-routes.d.ts +95 -0
  268. package/dist/lib/public-routes.d.ts.map +1 -0
  269. package/dist/lib/public-routes.js +154 -0
  270. package/dist/lib/public-routes.js.map +1 -0
  271. package/dist/lib/runtime-detection.d.ts +17 -0
  272. package/dist/lib/runtime-detection.d.ts.map +1 -0
  273. package/dist/lib/runtime-detection.js +90 -0
  274. package/dist/lib/runtime-detection.js.map +1 -0
  275. package/dist/lib/storage-access.d.ts +21 -0
  276. package/dist/lib/storage-access.d.ts.map +1 -0
  277. package/dist/lib/storage-access.js +74 -0
  278. package/dist/lib/storage-access.js.map +1 -0
  279. package/dist/lib/storage.d.ts +9 -0
  280. package/dist/lib/storage.d.ts.map +1 -0
  281. package/dist/lib/storage.js +28 -0
  282. package/dist/lib/storage.js.map +1 -0
  283. package/dist/lib/storyboard-export.d.ts +64 -0
  284. package/dist/lib/storyboard-export.d.ts.map +1 -0
  285. package/dist/lib/storyboard-export.js +183 -0
  286. package/dist/lib/storyboard-export.js.map +1 -0
  287. package/dist/lib/style-presets.d.ts +34 -0
  288. package/dist/lib/style-presets.d.ts.map +1 -0
  289. package/dist/lib/style-presets.js +62 -0
  290. package/dist/lib/style-presets.js.map +1 -0
  291. package/dist/lib/temp-url-resolver.d.ts +35 -0
  292. package/dist/lib/temp-url-resolver.d.ts.map +1 -0
  293. package/dist/lib/temp-url-resolver.js +88 -0
  294. package/dist/lib/temp-url-resolver.js.map +1 -0
  295. package/dist/lib/thumbnail.d.ts +74 -0
  296. package/dist/lib/thumbnail.d.ts.map +1 -0
  297. package/dist/lib/thumbnail.js +302 -0
  298. package/dist/lib/thumbnail.js.map +1 -0
  299. package/dist/lib/timeline-bundle.d.ts +1689 -0
  300. package/dist/lib/timeline-bundle.d.ts.map +1 -0
  301. package/dist/lib/timeline-bundle.js +330 -0
  302. package/dist/lib/timeline-bundle.js.map +1 -0
  303. package/dist/lib/video-proxy.d.ts +114 -0
  304. package/dist/lib/video-proxy.d.ts.map +1 -0
  305. package/dist/lib/video-proxy.js +545 -0
  306. package/dist/lib/video-proxy.js.map +1 -0
  307. package/dist/lib/wire-values.d.ts +31 -0
  308. package/dist/lib/wire-values.d.ts.map +1 -0
  309. package/dist/lib/wire-values.js +49 -0
  310. package/dist/lib/wire-values.js.map +1 -0
  311. package/dist/lib/workflow-bundle.d.ts +102 -0
  312. package/dist/lib/workflow-bundle.d.ts.map +1 -0
  313. package/dist/lib/workflow-bundle.js +306 -0
  314. package/dist/lib/workflow-bundle.js.map +1 -0
  315. package/dist/lib/workflow-service.d.ts +82 -0
  316. package/dist/lib/workflow-service.d.ts.map +1 -0
  317. package/dist/lib/workflow-service.js +194 -0
  318. package/dist/lib/workflow-service.js.map +1 -0
  319. package/dist/lib/workflow-workspace.d.ts +20 -0
  320. package/dist/lib/workflow-workspace.d.ts.map +1 -0
  321. package/dist/lib/workflow-workspace.js +65 -0
  322. package/dist/lib/workflow-workspace.js.map +1 -0
  323. package/dist/lib/ws-connection-health.d.ts +10 -0
  324. package/dist/lib/ws-connection-health.d.ts.map +1 -0
  325. package/dist/lib/ws-connection-health.js +38 -0
  326. package/dist/lib/ws-connection-health.js.map +1 -0
  327. package/dist/lib/ws-rate-limit.d.ts +22 -0
  328. package/dist/lib/ws-rate-limit.d.ts.map +1 -0
  329. package/dist/lib/ws-rate-limit.js +45 -0
  330. package/dist/lib/ws-rate-limit.js.map +1 -0
  331. package/dist/lib/ws-upgrade.d.ts +40 -0
  332. package/dist/lib/ws-upgrade.d.ts.map +1 -0
  333. package/dist/lib/ws-upgrade.js +66 -0
  334. package/dist/lib/ws-upgrade.js.map +1 -0
  335. package/dist/lib/zip-stream.d.ts +46 -0
  336. package/dist/lib/zip-stream.d.ts.map +1 -0
  337. package/dist/lib/zip-stream.js +140 -0
  338. package/dist/lib/zip-stream.js.map +1 -0
  339. package/dist/mcp-agent-tools.d.ts +56 -0
  340. package/dist/mcp-agent-tools.d.ts.map +1 -0
  341. package/dist/mcp-agent-tools.js +1216 -0
  342. package/dist/mcp-agent-tools.js.map +1 -0
  343. package/dist/mcp-server.d.ts +56 -7
  344. package/dist/mcp-server.d.ts.map +1 -1
  345. package/dist/mcp-server.js +255 -762
  346. package/dist/mcp-server.js.map +1 -1
  347. package/dist/mcp-tool-deps.d.ts +20 -0
  348. package/dist/mcp-tool-deps.d.ts.map +1 -0
  349. package/dist/mcp-tool-deps.js +61 -0
  350. package/dist/mcp-tool-deps.js.map +1 -0
  351. package/dist/messagepack.d.ts +7 -0
  352. package/dist/messagepack.d.ts.map +1 -0
  353. package/dist/messagepack.js +19 -0
  354. package/dist/messagepack.js.map +1 -0
  355. package/dist/model-download-runtime.d.ts +9 -0
  356. package/dist/model-download-runtime.d.ts.map +1 -0
  357. package/dist/model-download-runtime.js +77 -0
  358. package/dist/model-download-runtime.js.map +1 -0
  359. package/dist/model-execution-availability.d.ts +14 -0
  360. package/dist/model-execution-availability.d.ts.map +1 -0
  361. package/dist/model-execution-availability.js +161 -0
  362. package/dist/model-execution-availability.js.map +1 -0
  363. package/dist/models-api.d.ts +51 -5
  364. package/dist/models-api.d.ts.map +1 -1
  365. package/dist/models-api.js +160 -690
  366. package/dist/models-api.js.map +1 -1
  367. package/dist/node-registry-setup.d.ts +84 -0
  368. package/dist/node-registry-setup.d.ts.map +1 -0
  369. package/dist/node-registry-setup.js +256 -0
  370. package/dist/node-registry-setup.js.map +1 -0
  371. package/dist/oauth/cimd.d.ts +28 -0
  372. package/dist/oauth/cimd.d.ts.map +1 -0
  373. package/dist/oauth/cimd.js +177 -0
  374. package/dist/oauth/cimd.js.map +1 -0
  375. package/dist/oauth/gate.d.ts +38 -0
  376. package/dist/oauth/gate.d.ts.map +1 -0
  377. package/dist/oauth/gate.js +77 -0
  378. package/dist/oauth/gate.js.map +1 -0
  379. package/dist/oauth/metadata.d.ts +35 -0
  380. package/dist/oauth/metadata.d.ts.map +1 -0
  381. package/dist/oauth/metadata.js +56 -0
  382. package/dist/oauth/metadata.js.map +1 -0
  383. package/dist/oauth/pending-store.d.ts +79 -0
  384. package/dist/oauth/pending-store.d.ts.map +1 -0
  385. package/dist/oauth/pending-store.js +133 -0
  386. package/dist/oauth/pending-store.js.map +1 -0
  387. package/dist/oauth/pkce.d.ts +16 -0
  388. package/dist/oauth/pkce.d.ts.map +1 -0
  389. package/dist/oauth/pkce.js +29 -0
  390. package/dist/oauth/pkce.js.map +1 -0
  391. package/dist/oauth/validate.d.ts +25 -0
  392. package/dist/oauth/validate.d.ts.map +1 -0
  393. package/dist/oauth/validate.js +62 -0
  394. package/dist/oauth/validate.js.map +1 -0
  395. package/dist/oauth/www-authenticate.d.ts +9 -0
  396. package/dist/oauth/www-authenticate.d.ts.map +1 -0
  397. package/dist/oauth/www-authenticate.js +33 -0
  398. package/dist/oauth/www-authenticate.js.map +1 -0
  399. package/dist/oauth-api.d.ts +19 -0
  400. package/dist/oauth-api.d.ts.map +1 -1
  401. package/dist/oauth-api.js +531 -12
  402. package/dist/oauth-api.js.map +1 -1
  403. package/dist/openai-api.d.ts.map +1 -1
  404. package/dist/openai-api.js +4 -9
  405. package/dist/openai-api.js.map +1 -1
  406. package/dist/pack-snapshot.d.ts +24 -0
  407. package/dist/pack-snapshot.d.ts.map +1 -0
  408. package/dist/pack-snapshot.js +35 -0
  409. package/dist/pack-snapshot.js.map +1 -0
  410. package/dist/plugins/websocket.d.ts +21 -4
  411. package/dist/plugins/websocket.d.ts.map +1 -1
  412. package/dist/plugins/websocket.js +136 -290
  413. package/dist/plugins/websocket.js.map +1 -1
  414. package/dist/resolve-media-urls.d.ts +17 -3
  415. package/dist/resolve-media-urls.d.ts.map +1 -1
  416. package/dist/resolve-media-urls.js +117 -31
  417. package/dist/resolve-media-urls.js.map +1 -1
  418. package/dist/resource-events.d.ts +28 -0
  419. package/dist/resource-events.d.ts.map +1 -0
  420. package/dist/resource-events.js +20 -0
  421. package/dist/resource-events.js.map +1 -0
  422. package/dist/routes/account.d.ts +100 -0
  423. package/dist/routes/account.d.ts.map +1 -0
  424. package/dist/routes/account.js +197 -0
  425. package/dist/routes/account.js.map +1 -0
  426. package/dist/routes/applications.d.ts +36 -0
  427. package/dist/routes/applications.d.ts.map +1 -0
  428. package/dist/routes/applications.js +183 -0
  429. package/dist/routes/applications.js.map +1 -0
  430. package/dist/routes/assets.d.ts +3 -3
  431. package/dist/routes/assets.d.ts.map +1 -1
  432. package/dist/routes/assets.js +78 -44
  433. package/dist/routes/assets.js.map +1 -1
  434. package/dist/routes/atlascloud-webhook.d.ts +93 -0
  435. package/dist/routes/atlascloud-webhook.d.ts.map +1 -0
  436. package/dist/routes/atlascloud-webhook.js +369 -0
  437. package/dist/routes/atlascloud-webhook.js.map +1 -0
  438. package/dist/routes/collections.d.ts.map +1 -1
  439. package/dist/routes/config.d.ts +26 -0
  440. package/dist/routes/config.d.ts.map +1 -0
  441. package/dist/routes/config.js +64 -0
  442. package/dist/routes/config.js.map +1 -0
  443. package/dist/routes/documents.d.ts +27 -0
  444. package/dist/routes/documents.d.ts.map +1 -0
  445. package/dist/routes/documents.js +155 -0
  446. package/dist/routes/documents.js.map +1 -0
  447. package/dist/routes/fal-credits.d.ts +4 -0
  448. package/dist/routes/fal-credits.d.ts.map +1 -0
  449. package/dist/routes/fal-credits.js +101 -0
  450. package/dist/routes/fal-credits.js.map +1 -0
  451. package/dist/routes/fal-pricing-estimate.d.ts +4 -0
  452. package/dist/routes/fal-pricing-estimate.d.ts.map +1 -0
  453. package/dist/routes/fal-pricing-estimate.js +114 -0
  454. package/dist/routes/fal-pricing-estimate.js.map +1 -0
  455. package/dist/routes/fal-pricing.d.ts +4 -0
  456. package/dist/routes/fal-pricing.d.ts.map +1 -0
  457. package/dist/routes/fal-pricing.js +93 -0
  458. package/dist/routes/fal-pricing.js.map +1 -0
  459. package/dist/routes/fal-webhook.d.ts +102 -0
  460. package/dist/routes/fal-webhook.d.ts.map +1 -0
  461. package/dist/routes/fal-webhook.js +379 -0
  462. package/dist/routes/fal-webhook.js.map +1 -0
  463. package/dist/routes/files.d.ts.map +1 -1
  464. package/dist/routes/files.js +4 -3
  465. package/dist/routes/files.js.map +1 -1
  466. package/dist/routes/health.d.ts +1 -0
  467. package/dist/routes/health.d.ts.map +1 -1
  468. package/dist/routes/health.js +41 -7
  469. package/dist/routes/health.js.map +1 -1
  470. package/dist/routes/integrations.d.ts +39 -0
  471. package/dist/routes/integrations.d.ts.map +1 -0
  472. package/dist/routes/integrations.js +211 -0
  473. package/dist/routes/integrations.js.map +1 -0
  474. package/dist/routes/js-scripts.d.ts +26 -0
  475. package/dist/routes/js-scripts.d.ts.map +1 -0
  476. package/dist/routes/js-scripts.js +116 -0
  477. package/dist/routes/js-scripts.js.map +1 -0
  478. package/dist/routes/kie-credits.d.ts +4 -0
  479. package/dist/routes/kie-credits.d.ts.map +1 -0
  480. package/dist/routes/kie-credits.js +93 -0
  481. package/dist/routes/kie-credits.js.map +1 -0
  482. package/dist/routes/kie-pricing.d.ts +4 -0
  483. package/dist/routes/kie-pricing.d.ts.map +1 -0
  484. package/dist/routes/kie-pricing.js +45 -0
  485. package/dist/routes/kie-pricing.js.map +1 -0
  486. package/dist/routes/kie-webhook.d.ts +4 -0
  487. package/dist/routes/kie-webhook.d.ts.map +1 -0
  488. package/dist/routes/kie-webhook.js +70 -0
  489. package/dist/routes/kie-webhook.js.map +1 -0
  490. package/dist/routes/nodes.d.ts.map +1 -1
  491. package/dist/routes/nodes.js +6 -59
  492. package/dist/routes/nodes.js.map +1 -1
  493. package/dist/routes/oauth-as.d.ts +30 -0
  494. package/dist/routes/oauth-as.d.ts.map +1 -0
  495. package/dist/routes/oauth-as.js +412 -0
  496. package/dist/routes/oauth-as.js.map +1 -0
  497. package/dist/routes/oauth.d.ts.map +1 -1
  498. package/dist/routes/openai.d.ts.map +1 -1
  499. package/dist/routes/public-apps.d.ts +27 -0
  500. package/dist/routes/public-apps.d.ts.map +1 -0
  501. package/dist/routes/public-apps.js +99 -0
  502. package/dist/routes/public-apps.js.map +1 -0
  503. package/dist/routes/sandbox-modules.d.ts +17 -0
  504. package/dist/routes/sandbox-modules.d.ts.map +1 -0
  505. package/dist/routes/sandbox-modules.js +85 -0
  506. package/dist/routes/sandbox-modules.js.map +1 -0
  507. package/dist/routes/sdk-v1.d.ts +24 -0
  508. package/dist/routes/sdk-v1.d.ts.map +1 -0
  509. package/dist/routes/sdk-v1.js +320 -0
  510. package/dist/routes/sdk-v1.js.map +1 -0
  511. package/dist/routes/storage.d.ts.map +1 -1
  512. package/dist/routes/storyboards.d.ts +16 -0
  513. package/dist/routes/storyboards.d.ts.map +1 -0
  514. package/dist/routes/storyboards.js +97 -0
  515. package/dist/routes/storyboards.js.map +1 -0
  516. package/dist/routes/timeline-animations.d.ts +23 -0
  517. package/dist/routes/timeline-animations.d.ts.map +1 -0
  518. package/dist/routes/timeline-animations.js +99 -0
  519. package/dist/routes/timeline-animations.js.map +1 -0
  520. package/dist/routes/timeline-audio-bake.d.ts +51 -0
  521. package/dist/routes/timeline-audio-bake.d.ts.map +1 -0
  522. package/dist/routes/timeline-audio-bake.js +110 -0
  523. package/dist/routes/timeline-audio-bake.js.map +1 -0
  524. package/dist/routes/timeline-fonts.d.ts +29 -0
  525. package/dist/routes/timeline-fonts.d.ts.map +1 -0
  526. package/dist/routes/timeline-fonts.js +64 -0
  527. package/dist/routes/timeline-fonts.js.map +1 -0
  528. package/dist/routes/timeline-isolate-subject.d.ts +55 -0
  529. package/dist/routes/timeline-isolate-subject.d.ts.map +1 -0
  530. package/dist/routes/timeline-isolate-subject.js +128 -0
  531. package/dist/routes/timeline-isolate-subject.js.map +1 -0
  532. package/dist/routes/timeline-track-object.d.ts +39 -0
  533. package/dist/routes/timeline-track-object.d.ts.map +1 -0
  534. package/dist/routes/timeline-track-object.js +97 -0
  535. package/dist/routes/timeline-track-object.js.map +1 -0
  536. package/dist/routes/timelines.d.ts +18 -0
  537. package/dist/routes/timelines.d.ts.map +1 -0
  538. package/dist/routes/timelines.js +191 -0
  539. package/dist/routes/timelines.js.map +1 -0
  540. package/dist/routes/workflows.d.ts +6 -9
  541. package/dist/routes/workflows.d.ts.map +1 -1
  542. package/dist/routes/workflows.js +100 -11
  543. package/dist/routes/workflows.js.map +1 -1
  544. package/dist/routes/workspace.d.ts.map +1 -1
  545. package/dist/run-supervisor.d.ts +30 -0
  546. package/dist/run-supervisor.d.ts.map +1 -0
  547. package/dist/run-supervisor.js +86 -0
  548. package/dist/run-supervisor.js.map +1 -0
  549. package/dist/sandbox-catalog.d.ts +28 -0
  550. package/dist/sandbox-catalog.d.ts.map +1 -0
  551. package/dist/sandbox-catalog.js +74 -0
  552. package/dist/sandbox-catalog.js.map +1 -0
  553. package/dist/screenshot-projects.d.ts +27 -0
  554. package/dist/screenshot-projects.d.ts.map +1 -0
  555. package/dist/screenshot-projects.js +880 -0
  556. package/dist/screenshot-projects.js.map +1 -0
  557. package/dist/screenshot-server.js +947 -43
  558. package/dist/screenshot-server.js.map +1 -1
  559. package/dist/sdk/sdk-cached-model-inventory.d.ts +21 -0
  560. package/dist/sdk/sdk-cached-model-inventory.d.ts.map +1 -0
  561. package/dist/sdk/sdk-cached-model-inventory.js +51 -0
  562. package/dist/sdk/sdk-cached-model-inventory.js.map +1 -0
  563. package/dist/sdk/sdk-capabilities-service.d.ts +32 -0
  564. package/dist/sdk/sdk-capabilities-service.d.ts.map +1 -0
  565. package/dist/sdk/sdk-capabilities-service.js +47 -0
  566. package/dist/sdk/sdk-capabilities-service.js.map +1 -0
  567. package/dist/sdk/sdk-execution-readiness-probe.d.ts +19 -0
  568. package/dist/sdk/sdk-execution-readiness-probe.d.ts.map +1 -0
  569. package/dist/sdk/sdk-execution-readiness-probe.js +90 -0
  570. package/dist/sdk/sdk-execution-readiness-probe.js.map +1 -0
  571. package/dist/sdk/sdk-execution-target-readiness.d.ts +15 -0
  572. package/dist/sdk/sdk-execution-target-readiness.d.ts.map +1 -0
  573. package/dist/sdk/sdk-execution-target-readiness.js +50 -0
  574. package/dist/sdk/sdk-execution-target-readiness.js.map +1 -0
  575. package/dist/sdk/sdk-feature-flags.d.ts +18 -0
  576. package/dist/sdk/sdk-feature-flags.d.ts.map +1 -0
  577. package/dist/sdk/sdk-feature-flags.js +30 -0
  578. package/dist/sdk/sdk-feature-flags.js.map +1 -0
  579. package/dist/sdk/sdk-huggingface-download-state.d.ts +15 -0
  580. package/dist/sdk/sdk-huggingface-download-state.d.ts.map +1 -0
  581. package/dist/sdk/sdk-huggingface-download-state.js +25 -0
  582. package/dist/sdk/sdk-huggingface-download-state.js.map +1 -0
  583. package/dist/sdk/sdk-live-runner-registry.d.ts +21 -0
  584. package/dist/sdk/sdk-live-runner-registry.d.ts.map +1 -0
  585. package/dist/sdk/sdk-live-runner-registry.js +26 -0
  586. package/dist/sdk/sdk-live-runner-registry.js.map +1 -0
  587. package/dist/sdk/sdk-model-catalog-service.d.ts +20 -0
  588. package/dist/sdk/sdk-model-catalog-service.d.ts.map +1 -0
  589. package/dist/sdk/sdk-model-catalog-service.js +219 -0
  590. package/dist/sdk/sdk-model-catalog-service.js.map +1 -0
  591. package/dist/sdk/sdk-model-download-service.d.ts +39 -0
  592. package/dist/sdk/sdk-model-download-service.d.ts.map +1 -0
  593. package/dist/sdk/sdk-model-download-service.js +274 -0
  594. package/dist/sdk/sdk-model-download-service.js.map +1 -0
  595. package/dist/sdk/sdk-model-requirement-probe.d.ts +30 -0
  596. package/dist/sdk/sdk-model-requirement-probe.d.ts.map +1 -0
  597. package/dist/sdk/sdk-model-requirement-probe.js +120 -0
  598. package/dist/sdk/sdk-model-requirement-probe.js.map +1 -0
  599. package/dist/sdk/sdk-node-package-requirement-probe.d.ts +20 -0
  600. package/dist/sdk/sdk-node-package-requirement-probe.d.ts.map +1 -0
  601. package/dist/sdk/sdk-node-package-requirement-probe.js +44 -0
  602. package/dist/sdk/sdk-node-package-requirement-probe.js.map +1 -0
  603. package/dist/sdk/sdk-node-type-inventory-service.d.ts +11 -0
  604. package/dist/sdk/sdk-node-type-inventory-service.d.ts.map +1 -0
  605. package/dist/sdk/sdk-node-type-inventory-service.js +36 -0
  606. package/dist/sdk/sdk-node-type-inventory-service.js.map +1 -0
  607. package/dist/sdk/sdk-preflight-orchestrator.d.ts +54 -0
  608. package/dist/sdk/sdk-preflight-orchestrator.d.ts.map +1 -0
  609. package/dist/sdk/sdk-preflight-orchestrator.js +63 -0
  610. package/dist/sdk/sdk-preflight-orchestrator.js.map +1 -0
  611. package/dist/sdk/sdk-preflight-requirement-resolver.d.ts +35 -0
  612. package/dist/sdk/sdk-preflight-requirement-resolver.d.ts.map +1 -0
  613. package/dist/sdk/sdk-preflight-requirement-resolver.js +67 -0
  614. package/dist/sdk/sdk-preflight-requirement-resolver.js.map +1 -0
  615. package/dist/sdk/sdk-preflight-service.d.ts +61 -0
  616. package/dist/sdk/sdk-preflight-service.d.ts.map +1 -0
  617. package/dist/sdk/sdk-preflight-service.js +104 -0
  618. package/dist/sdk/sdk-preflight-service.js.map +1 -0
  619. package/dist/sdk/sdk-preflight-workflow-source.d.ts +18 -0
  620. package/dist/sdk/sdk-preflight-workflow-source.d.ts.map +1 -0
  621. package/dist/sdk/sdk-preflight-workflow-source.js +42 -0
  622. package/dist/sdk/sdk-preflight-workflow-source.js.map +1 -0
  623. package/dist/sdk/sdk-route-policy.d.ts +3 -0
  624. package/dist/sdk/sdk-route-policy.d.ts.map +1 -0
  625. package/dist/sdk/sdk-route-policy.js +18 -0
  626. package/dist/sdk/sdk-route-policy.js.map +1 -0
  627. package/dist/sdk/sdk-runtime-capabilities-service.d.ts +60 -0
  628. package/dist/sdk/sdk-runtime-capabilities-service.d.ts.map +1 -0
  629. package/dist/sdk/sdk-runtime-capabilities-service.js +30 -0
  630. package/dist/sdk/sdk-runtime-capabilities-service.js.map +1 -0
  631. package/dist/sdk/sdk-runtime-requirement-probe.d.ts +13 -0
  632. package/dist/sdk/sdk-runtime-requirement-probe.d.ts.map +1 -0
  633. package/dist/sdk/sdk-runtime-requirement-probe.js +55 -0
  634. package/dist/sdk/sdk-runtime-requirement-probe.js.map +1 -0
  635. package/dist/sdk/sdk-static-preflight-service.d.ts +66 -0
  636. package/dist/sdk/sdk-static-preflight-service.d.ts.map +1 -0
  637. package/dist/sdk/sdk-static-preflight-service.js +492 -0
  638. package/dist/sdk/sdk-static-preflight-service.js.map +1 -0
  639. package/dist/sdk/sdk-temporary-asset-service.d.ts +18 -0
  640. package/dist/sdk/sdk-temporary-asset-service.d.ts.map +1 -0
  641. package/dist/sdk/sdk-temporary-asset-service.js +33 -0
  642. package/dist/sdk/sdk-temporary-asset-service.js.map +1 -0
  643. package/dist/sdk/sdk-temporary-asset-upload-http-handler.d.ts +9 -0
  644. package/dist/sdk/sdk-temporary-asset-upload-http-handler.d.ts.map +1 -0
  645. package/dist/sdk/sdk-temporary-asset-upload-http-handler.js +65 -0
  646. package/dist/sdk/sdk-temporary-asset-upload-http-handler.js.map +1 -0
  647. package/dist/sdk/sdk-v1-handler-map.d.ts +44 -0
  648. package/dist/sdk/sdk-v1-handler-map.d.ts.map +1 -0
  649. package/dist/sdk/sdk-v1-handler-map.js +37 -0
  650. package/dist/sdk/sdk-v1-handler-map.js.map +1 -0
  651. package/dist/sdk/sdk-v1-service-error.d.ts +21 -0
  652. package/dist/sdk/sdk-v1-service-error.d.ts.map +1 -0
  653. package/dist/sdk/sdk-v1-service-error.js +62 -0
  654. package/dist/sdk/sdk-v1-service-error.js.map +1 -0
  655. package/dist/sdk/sdk-v1-service.d.ts +74 -0
  656. package/dist/sdk/sdk-v1-service.d.ts.map +1 -0
  657. package/dist/sdk/sdk-v1-service.js +219 -0
  658. package/dist/sdk/sdk-v1-service.js.map +1 -0
  659. package/dist/sdk/sdk-worker-readiness-adapter.d.ts +22 -0
  660. package/dist/sdk/sdk-worker-readiness-adapter.d.ts.map +1 -0
  661. package/dist/sdk/sdk-worker-readiness-adapter.js +29 -0
  662. package/dist/sdk/sdk-worker-readiness-adapter.js.map +1 -0
  663. package/dist/server.js +1019 -201
  664. package/dist/server.js.map +1 -1
  665. package/dist/session/asset-autosave.d.ts +80 -0
  666. package/dist/session/asset-autosave.d.ts.map +1 -0
  667. package/dist/session/asset-autosave.js +456 -0
  668. package/dist/session/asset-autosave.js.map +1 -0
  669. package/dist/session/chat-compaction.d.ts +107 -0
  670. package/dist/session/chat-compaction.d.ts.map +1 -0
  671. package/dist/session/chat-compaction.js +191 -0
  672. package/dist/session/chat-compaction.js.map +1 -0
  673. package/dist/session/chat-history.d.ts +75 -0
  674. package/dist/session/chat-history.d.ts.map +1 -0
  675. package/dist/session/chat-history.js +194 -0
  676. package/dist/session/chat-history.js.map +1 -0
  677. package/dist/session/chat-prompt.d.ts +45 -0
  678. package/dist/session/chat-prompt.d.ts.map +1 -0
  679. package/dist/session/chat-prompt.js +480 -0
  680. package/dist/session/chat-prompt.js.map +1 -0
  681. package/dist/session/chat-turn.d.ts +336 -0
  682. package/dist/session/chat-turn.d.ts.map +1 -0
  683. package/dist/session/chat-turn.js +3516 -0
  684. package/dist/session/chat-turn.js.map +1 -0
  685. package/dist/session/client-session.d.ts +59 -0
  686. package/dist/session/client-session.d.ts.map +1 -0
  687. package/dist/session/client-session.js +2 -0
  688. package/dist/session/client-session.js.map +1 -0
  689. package/dist/session/commands.d.ts +133 -0
  690. package/dist/session/commands.d.ts.map +1 -0
  691. package/dist/session/commands.js +778 -0
  692. package/dist/session/commands.js.map +1 -0
  693. package/dist/session/inference.d.ts +213 -0
  694. package/dist/session/inference.d.ts.map +1 -0
  695. package/dist/session/inference.js +1072 -0
  696. package/dist/session/inference.js.map +1 -0
  697. package/dist/session/job-execution.d.ts +477 -0
  698. package/dist/session/job-execution.d.ts.map +1 -0
  699. package/dist/session/job-execution.js +2089 -0
  700. package/dist/session/job-execution.js.map +1 -0
  701. package/dist/session/media-generation.d.ts +94 -0
  702. package/dist/session/media-generation.d.ts.map +1 -0
  703. package/dist/session/media-generation.js +234 -0
  704. package/dist/session/media-generation.js.map +1 -0
  705. package/dist/session/model-interfaces.d.ts +27 -0
  706. package/dist/session/model-interfaces.d.ts.map +1 -0
  707. package/dist/session/model-interfaces.js +132 -0
  708. package/dist/session/model-interfaces.js.map +1 -0
  709. package/dist/session/sanitize.d.ts +7 -0
  710. package/dist/session/sanitize.d.ts.map +1 -0
  711. package/dist/session/sanitize.js +64 -0
  712. package/dist/session/sanitize.js.map +1 -0
  713. package/dist/settings-registry.d.ts +6 -15
  714. package/dist/settings-registry.d.ts.map +1 -1
  715. package/dist/settings-registry.js +6 -103
  716. package/dist/settings-registry.js.map +1 -1
  717. package/dist/storage-api.d.ts +20 -0
  718. package/dist/storage-api.d.ts.map +1 -1
  719. package/dist/storage-api.js +260 -77
  720. package/dist/storage-api.js.map +1 -1
  721. package/dist/storage-retention.d.ts +9 -0
  722. package/dist/storage-retention.d.ts.map +1 -0
  723. package/dist/storage-retention.js +74 -0
  724. package/dist/storage-retention.js.map +1 -0
  725. package/dist/system-stats.d.ts +52 -0
  726. package/dist/system-stats.d.ts.map +1 -0
  727. package/dist/system-stats.js +134 -0
  728. package/dist/system-stats.js.map +1 -0
  729. package/dist/test-ui-server.d.ts +46 -0
  730. package/dist/test-ui-server.d.ts.map +1 -1
  731. package/dist/test-ui-server.js +188 -41
  732. package/dist/test-ui-server.js.map +1 -1
  733. package/dist/triggers/boot.d.ts +73 -0
  734. package/dist/triggers/boot.d.ts.map +1 -0
  735. package/dist/triggers/boot.js +149 -0
  736. package/dist/triggers/boot.js.map +1 -0
  737. package/dist/triggers/dispatcher.d.ts +234 -0
  738. package/dist/triggers/dispatcher.d.ts.map +1 -0
  739. package/dist/triggers/dispatcher.js +525 -0
  740. package/dist/triggers/dispatcher.js.map +1 -0
  741. package/dist/triggers/file-watch.d.ts +90 -0
  742. package/dist/triggers/file-watch.d.ts.map +1 -0
  743. package/dist/triggers/file-watch.js +405 -0
  744. package/dist/triggers/file-watch.js.map +1 -0
  745. package/dist/triggers/registration-sync.d.ts +34 -0
  746. package/dist/triggers/registration-sync.d.ts.map +1 -0
  747. package/dist/triggers/registration-sync.js +162 -0
  748. package/dist/triggers/registration-sync.js.map +1 -0
  749. package/dist/triggers/schedule-timing.d.ts +52 -0
  750. package/dist/triggers/schedule-timing.d.ts.map +1 -0
  751. package/dist/triggers/schedule-timing.js +90 -0
  752. package/dist/triggers/schedule-timing.js.map +1 -0
  753. package/dist/triggers/scheduler.d.ts +55 -0
  754. package/dist/triggers/scheduler.d.ts.map +1 -0
  755. package/dist/triggers/scheduler.js +122 -0
  756. package/dist/triggers/scheduler.js.map +1 -0
  757. package/dist/triggers/settle.d.ts +66 -0
  758. package/dist/triggers/settle.d.ts.map +1 -0
  759. package/dist/triggers/settle.js +99 -0
  760. package/dist/triggers/settle.js.map +1 -0
  761. package/dist/triggers/stores.d.ts +38 -0
  762. package/dist/triggers/stores.d.ts.map +1 -0
  763. package/dist/triggers/stores.js +168 -0
  764. package/dist/triggers/stores.js.map +1 -0
  765. package/dist/triggers/webhook-route.d.ts +49 -0
  766. package/dist/triggers/webhook-route.d.ts.map +1 -0
  767. package/dist/triggers/webhook-route.js +148 -0
  768. package/dist/triggers/webhook-route.js.map +1 -0
  769. package/dist/trpc/context.d.ts +52 -5
  770. package/dist/trpc/context.d.ts.map +1 -1
  771. package/dist/trpc/context.js +4 -1
  772. package/dist/trpc/context.js.map +1 -1
  773. package/dist/trpc/error-formatter.d.ts.map +1 -1
  774. package/dist/trpc/error-formatter.js +23 -2
  775. package/dist/trpc/error-formatter.js.map +1 -1
  776. package/dist/trpc/error-logging.d.ts +14 -0
  777. package/dist/trpc/error-logging.d.ts.map +1 -0
  778. package/dist/trpc/error-logging.js +27 -0
  779. package/dist/trpc/error-logging.js.map +1 -0
  780. package/dist/trpc/index.d.ts +2 -2
  781. package/dist/trpc/index.d.ts.map +1 -1
  782. package/dist/trpc/index.js +0 -2
  783. package/dist/trpc/index.js.map +1 -1
  784. package/dist/trpc/middleware.d.ts +6 -3
  785. package/dist/trpc/middleware.d.ts.map +1 -1
  786. package/dist/trpc/router.d.ts +29791 -1303
  787. package/dist/trpc/router.d.ts.map +1 -1
  788. package/dist/trpc/router.js +46 -3
  789. package/dist/trpc/router.js.map +1 -1
  790. package/dist/trpc/routers/agent-access.d.ts +149 -0
  791. package/dist/trpc/routers/agent-access.d.ts.map +1 -0
  792. package/dist/trpc/routers/agent-access.js +224 -0
  793. package/dist/trpc/routers/agent-access.js.map +1 -0
  794. package/dist/trpc/routers/applications.d.ts +1117 -0
  795. package/dist/trpc/routers/applications.d.ts.map +1 -0
  796. package/dist/trpc/routers/applications.js +218 -0
  797. package/dist/trpc/routers/applications.js.map +1 -0
  798. package/dist/trpc/routers/assets.d.ts +184 -42
  799. package/dist/trpc/routers/assets.d.ts.map +1 -1
  800. package/dist/trpc/routers/assets.js +499 -105
  801. package/dist/trpc/routers/assets.js.map +1 -1
  802. package/dist/trpc/routers/code-gen.d.ts +99 -0
  803. package/dist/trpc/routers/code-gen.d.ts.map +1 -0
  804. package/dist/trpc/routers/code-gen.js +164 -0
  805. package/dist/trpc/routers/code-gen.js.map +1 -0
  806. package/dist/trpc/routers/collections.d.ts +1 -26
  807. package/dist/trpc/routers/collections.d.ts.map +1 -1
  808. package/dist/trpc/routers/collections.js +145 -78
  809. package/dist/trpc/routers/collections.js.map +1 -1
  810. package/dist/trpc/routers/costs.d.ts +40 -96
  811. package/dist/trpc/routers/costs.d.ts.map +1 -1
  812. package/dist/trpc/routers/costs.js +14 -89
  813. package/dist/trpc/routers/costs.js.map +1 -1
  814. package/dist/trpc/routers/credits.d.ts +110 -0
  815. package/dist/trpc/routers/credits.d.ts.map +1 -0
  816. package/dist/trpc/routers/credits.js +69 -0
  817. package/dist/trpc/routers/credits.js.map +1 -0
  818. package/dist/trpc/routers/custom-providers.d.ts +88 -0
  819. package/dist/trpc/routers/custom-providers.d.ts.map +1 -0
  820. package/dist/trpc/routers/custom-providers.js +140 -0
  821. package/dist/trpc/routers/custom-providers.js.map +1 -0
  822. package/dist/trpc/routers/documents.d.ts +61 -0
  823. package/dist/trpc/routers/documents.d.ts.map +1 -0
  824. package/dist/trpc/routers/documents.js +23 -0
  825. package/dist/trpc/routers/documents.js.map +1 -0
  826. package/dist/trpc/routers/extension.d.ts +24 -0
  827. package/dist/trpc/routers/extension.d.ts.map +1 -0
  828. package/dist/trpc/routers/extension.js +28 -0
  829. package/dist/trpc/routers/extension.js.map +1 -0
  830. package/dist/trpc/routers/external-mcp.d.ts +108 -0
  831. package/dist/trpc/routers/external-mcp.d.ts.map +1 -0
  832. package/dist/trpc/routers/external-mcp.js +70 -0
  833. package/dist/trpc/routers/external-mcp.js.map +1 -0
  834. package/dist/trpc/routers/files.d.ts +9 -2
  835. package/dist/trpc/routers/files.d.ts.map +1 -1
  836. package/dist/trpc/routers/files.js +67 -37
  837. package/dist/trpc/routers/files.js.map +1 -1
  838. package/dist/trpc/routers/fonts.d.ts +30 -0
  839. package/dist/trpc/routers/fonts.d.ts.map +1 -0
  840. package/dist/trpc/routers/fonts.js +112 -0
  841. package/dist/trpc/routers/fonts.js.map +1 -0
  842. package/dist/trpc/routers/games.d.ts +7610 -0
  843. package/dist/trpc/routers/games.d.ts.map +1 -0
  844. package/dist/trpc/routers/games.js +456 -0
  845. package/dist/trpc/routers/games.js.map +1 -0
  846. package/dist/trpc/routers/integrations.d.ts +86 -0
  847. package/dist/trpc/routers/integrations.d.ts.map +1 -0
  848. package/dist/trpc/routers/integrations.js +129 -0
  849. package/dist/trpc/routers/integrations.js.map +1 -0
  850. package/dist/trpc/routers/jobs.d.ts +88 -27
  851. package/dist/trpc/routers/jobs.d.ts.map +1 -1
  852. package/dist/trpc/routers/jobs.js +113 -35
  853. package/dist/trpc/routers/jobs.js.map +1 -1
  854. package/dist/trpc/routers/js-scripts.d.ts +410 -0
  855. package/dist/trpc/routers/js-scripts.d.ts.map +1 -0
  856. package/dist/trpc/routers/js-scripts.js +303 -0
  857. package/dist/trpc/routers/js-scripts.js.map +1 -0
  858. package/dist/trpc/routers/mcp-config.d.ts +1 -1
  859. package/dist/trpc/routers/mcp-config.js +5 -3
  860. package/dist/trpc/routers/mcp-config.js.map +1 -1
  861. package/dist/trpc/routers/memories.d.ts +79 -0
  862. package/dist/trpc/routers/memories.d.ts.map +1 -0
  863. package/dist/trpc/routers/memories.js +66 -0
  864. package/dist/trpc/routers/memories.js.map +1 -0
  865. package/dist/trpc/routers/messages.d.ts +4 -77
  866. package/dist/trpc/routers/messages.d.ts.map +1 -1
  867. package/dist/trpc/routers/messages.js +9 -58
  868. package/dist/trpc/routers/messages.js.map +1 -1
  869. package/dist/trpc/routers/models.d.ts +1403 -238
  870. package/dist/trpc/routers/models.d.ts.map +1 -1
  871. package/dist/trpc/routers/models.js +532 -294
  872. package/dist/trpc/routers/models.js.map +1 -1
  873. package/dist/trpc/routers/nodes.d.ts +32 -16
  874. package/dist/trpc/routers/nodes.d.ts.map +1 -1
  875. package/dist/trpc/routers/nodes.js +70 -31
  876. package/dist/trpc/routers/nodes.js.map +1 -1
  877. package/dist/trpc/routers/packs.d.ts +184 -0
  878. package/dist/trpc/routers/packs.d.ts.map +1 -0
  879. package/dist/trpc/routers/packs.js +259 -0
  880. package/dist/trpc/routers/packs.js.map +1 -0
  881. package/dist/trpc/routers/projects.d.ts +422 -0
  882. package/dist/trpc/routers/projects.d.ts.map +1 -0
  883. package/dist/trpc/routers/projects.js +373 -0
  884. package/dist/trpc/routers/projects.js.map +1 -0
  885. package/dist/trpc/routers/resources.d.ts +120 -0
  886. package/dist/trpc/routers/resources.d.ts.map +1 -0
  887. package/dist/trpc/routers/resources.js +212 -0
  888. package/dist/trpc/routers/resources.js.map +1 -0
  889. package/dist/trpc/routers/scripts.d.ts +1116 -0
  890. package/dist/trpc/routers/scripts.d.ts.map +1 -0
  891. package/dist/trpc/routers/scripts.js +131 -0
  892. package/dist/trpc/routers/scripts.js.map +1 -0
  893. package/dist/trpc/routers/segmentation.d.ts +62 -0
  894. package/dist/trpc/routers/segmentation.d.ts.map +1 -0
  895. package/dist/trpc/routers/segmentation.js +146 -0
  896. package/dist/trpc/routers/segmentation.js.map +1 -0
  897. package/dist/trpc/routers/settings.d.ts +177 -10
  898. package/dist/trpc/routers/settings.d.ts.map +1 -1
  899. package/dist/trpc/routers/settings.js +123 -33
  900. package/dist/trpc/routers/settings.js.map +1 -1
  901. package/dist/trpc/routers/sketch.d.ts +854 -0
  902. package/dist/trpc/routers/sketch.d.ts.map +1 -0
  903. package/dist/trpc/routers/sketch.js +617 -0
  904. package/dist/trpc/routers/sketch.js.map +1 -0
  905. package/dist/trpc/routers/skills.d.ts +76 -22
  906. package/dist/trpc/routers/skills.d.ts.map +1 -1
  907. package/dist/trpc/routers/skills.js +195 -170
  908. package/dist/trpc/routers/skills.js.map +1 -1
  909. package/dist/trpc/routers/storage.d.ts +3 -30
  910. package/dist/trpc/routers/storage.d.ts.map +1 -1
  911. package/dist/trpc/routers/storage.js +60 -117
  912. package/dist/trpc/routers/storage.js.map +1 -1
  913. package/dist/trpc/routers/storyboards.d.ts +5907 -0
  914. package/dist/trpc/routers/storyboards.d.ts.map +1 -0
  915. package/dist/trpc/routers/storyboards.js +156 -0
  916. package/dist/trpc/routers/storyboards.js.map +1 -0
  917. package/dist/trpc/routers/threads.d.ts +33 -21
  918. package/dist/trpc/routers/threads.d.ts.map +1 -1
  919. package/dist/trpc/routers/threads.js +36 -30
  920. package/dist/trpc/routers/threads.js.map +1 -1
  921. package/dist/trpc/routers/timeline.d.ts +8516 -0
  922. package/dist/trpc/routers/timeline.d.ts.map +1 -0
  923. package/dist/trpc/routers/timeline.js +493 -0
  924. package/dist/trpc/routers/timeline.js.map +1 -0
  925. package/dist/trpc/routers/triggers.d.ts +46 -0
  926. package/dist/trpc/routers/triggers.d.ts.map +1 -0
  927. package/dist/trpc/routers/triggers.js +117 -0
  928. package/dist/trpc/routers/triggers.js.map +1 -0
  929. package/dist/trpc/routers/users.d.ts +1 -14
  930. package/dist/trpc/routers/users.d.ts.map +1 -1
  931. package/dist/trpc/routers/users.js +1 -12
  932. package/dist/trpc/routers/users.js.map +1 -1
  933. package/dist/trpc/routers/worker.d.ts +242 -0
  934. package/dist/trpc/routers/worker.d.ts.map +1 -0
  935. package/dist/trpc/routers/worker.js +220 -0
  936. package/dist/trpc/routers/worker.js.map +1 -0
  937. package/dist/trpc/routers/workflows.d.ts +385 -197
  938. package/dist/trpc/routers/workflows.d.ts.map +1 -1
  939. package/dist/trpc/routers/workflows.js +326 -345
  940. package/dist/trpc/routers/workflows.js.map +1 -1
  941. package/dist/trpc/routers/workspace.d.ts +59 -33
  942. package/dist/trpc/routers/workspace.d.ts.map +1 -1
  943. package/dist/trpc/routers/workspace.js +230 -93
  944. package/dist/trpc/routers/workspace.js.map +1 -1
  945. package/dist/trpc/sandbox-coverage.d.ts +64 -0
  946. package/dist/trpc/sandbox-coverage.d.ts.map +1 -0
  947. package/dist/trpc/sandbox-coverage.js +1049 -0
  948. package/dist/trpc/sandbox-coverage.js.map +1 -0
  949. package/dist/websocket-client-session.d.ts +320 -0
  950. package/dist/websocket-client-session.d.ts.map +1 -0
  951. package/dist/websocket-client-session.js +1253 -0
  952. package/dist/websocket-client-session.js.map +1 -0
  953. package/dist/workflow-interface-service.d.ts +87 -0
  954. package/dist/workflow-interface-service.d.ts.map +1 -0
  955. package/dist/workflow-interface-service.js +131 -0
  956. package/dist/workflow-interface-service.js.map +1 -0
  957. package/dist/workspace-api.d.ts.map +1 -1
  958. package/dist/workspace-api.js +33 -23
  959. package/dist/workspace-api.js.map +1 -1
  960. package/dist/ws-adapter.d.ts +46 -3
  961. package/dist/ws-adapter.d.ts.map +1 -1
  962. package/dist/ws-adapter.js +164 -26
  963. package/dist/ws-adapter.js.map +1 -1
  964. package/package.json +81 -35
  965. package/dist/agent/agent-runtime.d.ts +0 -47
  966. package/dist/agent/agent-runtime.d.ts.map +0 -1
  967. package/dist/agent/agent-runtime.js +0 -579
  968. package/dist/agent/agent-runtime.js.map +0 -1
  969. package/dist/agent/codex-agent.d.ts +0 -41
  970. package/dist/agent/codex-agent.d.ts.map +0 -1
  971. package/dist/agent/codex-agent.js +0 -334
  972. package/dist/agent/codex-agent.js.map +0 -1
  973. package/dist/agent/index.d.ts +0 -6
  974. package/dist/agent/index.d.ts.map +0 -1
  975. package/dist/agent/index.js +0 -4
  976. package/dist/agent/index.js.map +0 -1
  977. package/dist/agent/llm-agent.d.ts +0 -51
  978. package/dist/agent/llm-agent.d.ts.map +0 -1
  979. package/dist/agent/llm-agent.js +0 -526
  980. package/dist/agent/llm-agent.js.map +0 -1
  981. package/dist/agent/mcp-tool-server.d.ts +0 -33
  982. package/dist/agent/mcp-tool-server.d.ts.map +0 -1
  983. package/dist/agent/mcp-tool-server.js +0 -292
  984. package/dist/agent/mcp-tool-server.js.map +0 -1
  985. package/dist/agent/opencode-agent.d.ts +0 -32
  986. package/dist/agent/opencode-agent.d.ts.map +0 -1
  987. package/dist/agent/opencode-agent.js +0 -332
  988. package/dist/agent/opencode-agent.js.map +0 -1
  989. package/dist/agent/pi-agent.d.ts +0 -42
  990. package/dist/agent/pi-agent.d.ts.map +0 -1
  991. package/dist/agent/pi-agent.js +0 -429
  992. package/dist/agent/pi-agent.js.map +0 -1
  993. package/dist/agent/sdk-provider.d.ts +0 -46
  994. package/dist/agent/sdk-provider.d.ts.map +0 -1
  995. package/dist/agent/sdk-provider.js +0 -50
  996. package/dist/agent/sdk-provider.js.map +0 -1
  997. package/dist/agent/socket-route.d.ts +0 -11
  998. package/dist/agent/socket-route.d.ts.map +0 -1
  999. package/dist/agent/socket-route.js +0 -262
  1000. package/dist/agent/socket-route.js.map +0 -1
  1001. package/dist/agent/transport.d.ts +0 -39
  1002. package/dist/agent/transport.d.ts.map +0 -1
  1003. package/dist/agent/transport.js +0 -17
  1004. package/dist/agent/transport.js.map +0 -1
  1005. package/dist/agent/types.d.ts +0 -11
  1006. package/dist/agent/types.d.ts.map +0 -1
  1007. package/dist/agent/types.js +0 -10
  1008. package/dist/agent/types.js.map +0 -1
  1009. package/dist/routes/jobs.d.ts +0 -16
  1010. package/dist/routes/jobs.d.ts.map +0 -1
  1011. package/dist/routes/jobs.js +0 -25
  1012. package/dist/routes/jobs.js.map +0 -1
  1013. package/dist/trpc/routers/sandboxes.d.ts +0 -64
  1014. package/dist/trpc/routers/sandboxes.d.ts.map +0 -1
  1015. package/dist/trpc/routers/sandboxes.js +0 -327
  1016. package/dist/trpc/routers/sandboxes.js.map +0 -1
  1017. package/dist/unified-websocket-runner.d.ts +0 -280
  1018. package/dist/unified-websocket-runner.d.ts.map +0 -1
  1019. package/dist/unified-websocket-runner.js +0 -3840
  1020. package/dist/unified-websocket-runner.js.map +0 -1
@@ -3,16 +3,14 @@
3
3
  *
4
4
  * Retained on REST (file downloads):
5
5
  * - GET /api/workflows/:id/dsl-export (text/plain file download)
6
- * - POST /api/workflows/:id/gradio-export (501 stub, kept for API compat)
7
6
  *
8
7
  * Everything else is served via tRPC:
9
- * - list, names, get, create, update, delete
10
- * - run, autosave
11
- * - tools, examples (list + search)
8
+ * - list, get, create, update, delete
9
+ * - autosave
10
+ * - examples (list + search)
11
+ * - recipes (shipped chains of examples)
12
12
  * - public (list + get) — publicProcedure (no auth required)
13
- * - app (metadata for workflow app page)
14
- * - generateName
15
- * - versions (list, create, get, restore, delete)
13
+ * - versions (list, create, restore, delete)
16
14
  *
17
15
  * Auth note:
18
16
  * - `public.*` endpoints use publicProcedure — no auth required, matches
@@ -21,17 +19,58 @@
21
19
  */
22
20
  import { existsSync, readFileSync, readdirSync } from "node:fs";
23
21
  import nodePath from "node:path";
24
- import { Workflow, WorkflowVersion, Job } from "@nodetool-ai/models";
25
- import { PythonNodeExecutor } from "@nodetool-ai/runtime";
26
- import { WorkflowRunner } from "@nodetool-ai/kernel";
22
+ import { z } from "zod";
23
+ import { withCacheBuster } from "../../lib/example-thumbnail.js";
24
+ import { Workflow, WorkflowVersion, WorkflowCollaborator, WorkflowShare } from "@nodetool-ai/models";
27
25
  import { loadPythonPackageMetadata } from "@nodetool-ai/node-sdk";
28
26
  import { createLogger } from "@nodetool-ai/config";
27
+ import { deriveExampleAssetsDir } from "../../example-workflows.js";
28
+ import { exampleRecipeSummary } from "@nodetool-ai/protocol/api-schemas/recipes.js";
29
+ import { listExampleRecipes } from "../../lib/example-recipes.js";
29
30
  import { ApiErrorCode } from "../../error-codes.js";
30
31
  import { router, publicProcedure } from "../index.js";
31
32
  import { protectedProcedure } from "../middleware.js";
32
33
  import { throwApiError } from "../error-formatter.js";
33
- import { listInput, listOutput, namesOutput, getInput, createInput, updateInput, deleteInput, deleteOutput, runInput, runOutput, autosaveInput, autosaveOutput, toolsInput, toolsOutput, examplesInput, examplesOutput, publicListInput, publicListOutput, publicGetInput, appInput, appOutput, generateNameInput, generateNameOutput, versionsListInput, versionsListOutput, versionCreateInput, versionGetInput, versionResponse, versionRestoreInput, versionDeleteInput, versionDeleteOutput, workflowResponse, graph as graphSchema } from "@nodetool-ai/protocol/api-schemas/workflows.js";
34
+ import { createWorkflow, deleteWorkflow, syncTriggerRegistrations, updateWorkflow, WorkflowServiceError } from "../../lib/workflow-service.js";
35
+ import { listInput, listOutput, getInput, createInput, updateInput, deleteInput, deleteOutput, autosaveInput, autosaveOutput, examplesInput, examplesOutput, publicListInput, publicListOutput, publicGetInput, versionsListInput, versionsListOutput, versionCreateInput, versionResponse, versionRestoreInput, versionDeleteInput, versionDeleteOutput, terminalOutputsInput, terminalOutputsOutput, workflowResponse, graph as graphSchema, sharingGetInput, sharingGetOutput, sharingCreateLinkInput, sharingRevokeLinkInput, sharingSetRoleInput, sharingRemoveCollaboratorInput, sharingOkOutput, sharingAcceptInput, sharingAcceptOutput, shareItem, collaboratorItem, sharedWithMeInput, sharedWithMeOutput } from "@nodetool-ai/protocol/api-schemas/workflows.js";
36
+ import { isString } from "../../lib/wire-values.js";
37
+ import { getStorageRetentionSettings } from "../../storage-retention.js";
34
38
  const log = createLogger("nodetool.websocket.trpc.workflows");
39
+ /** Map a `workflow-service` failure onto this router's tRPC error shape. */
40
+ async function runWorkflowService(run) {
41
+ try {
42
+ return await run();
43
+ }
44
+ catch (error) {
45
+ if (error instanceof WorkflowServiceError) {
46
+ throwApiError(error.code, error.message);
47
+ }
48
+ throw error;
49
+ }
50
+ }
51
+ async function resolveWorkflowRole(workflow, userId) {
52
+ if (workflow.user_id === userId)
53
+ return "owner";
54
+ const grant = await WorkflowCollaborator.findFor(workflow.id, userId);
55
+ if (grant)
56
+ return grant.role;
57
+ if (workflow.access === "public")
58
+ return "viewer";
59
+ return null;
60
+ }
61
+ /** Load a workflow and require at least `minimum` access, else 404. */
62
+ async function requireWorkflowRole(workflowId, userId, minimum) {
63
+ const workflow = (await Workflow.get(workflowId));
64
+ if (!workflow) {
65
+ throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
66
+ }
67
+ const role = await resolveWorkflowRole(workflow, userId);
68
+ const rank = { viewer: 1, editor: 2, owner: 3 };
69
+ if (!role || rank[role] < rank[minimum]) {
70
+ throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
71
+ }
72
+ return { workflow, role };
73
+ }
35
74
  /**
36
75
  * Validate a workflow graph against the wire schema. Returns the graph if it
37
76
  * passes, or null if invalid — so list endpoints can still return the rest of
@@ -57,9 +96,43 @@ function safeGraph(workflowId, raw) {
57
96
  log.warn(`Workflow ${workflowId} has an invalid graph; returning null: ${summarizeGraphIssues(parsed.error.issues)}`);
58
97
  return null;
59
98
  }
99
+ const OUTPUT_NODE_MEDIA_TYPES = {
100
+ "nodetool.output.ImageOutput": "image",
101
+ "nodetool.output.VideoOutput": "video",
102
+ "nodetool.output.AudioOutput": "audio"
103
+ };
104
+ function findTerminalMediaOutputNodes(workflow) {
105
+ const graph = safeGraph(workflow.id, workflow.graph);
106
+ const nodes = (graph?.nodes ?? []);
107
+ const edges = (graph?.edges ?? []);
108
+ const terminalOutputNodeIds = new Set(nodes
109
+ .filter((n) => Object.hasOwn(OUTPUT_NODE_MEDIA_TYPES, n.type))
110
+ .map((n) => n.id));
111
+ for (const edge of edges) {
112
+ const sourceId = edge.source;
113
+ if (sourceId && terminalOutputNodeIds.has(sourceId)) {
114
+ terminalOutputNodeIds.delete(sourceId);
115
+ }
116
+ }
117
+ return nodes.filter((n) => terminalOutputNodeIds.has(n.id));
118
+ }
119
+ function hasTerminalMediaOutput(workflow) {
120
+ return findTerminalMediaOutputNodes(workflow).length > 0;
121
+ }
60
122
  // ── Rate-limit tracking for autosave ───────────────────────────────────────
61
123
  const lastAutosaveTime = new Map();
62
124
  const AUTOSAVE_RATE_LIMIT_MS = 30_000;
125
+ // Entries older than the rate-limit window can never rate-limit again, so drop
126
+ // them. Without this the map grows one permanent entry per workflow ever
127
+ // autosaved (including deleted ones) for the lifetime of the process.
128
+ function recordAutosave(workflowId, now) {
129
+ for (const [id, ts] of lastAutosaveTime) {
130
+ if (now - ts >= AUTOSAVE_RATE_LIMIT_MS) {
131
+ lastAutosaveTime.delete(id);
132
+ }
133
+ }
134
+ lastAutosaveTime.set(workflowId, now);
135
+ }
63
136
  // ── toWorkflowResponse ─────────────────────────────────────────────────────
64
137
  function toWorkflowResponse(workflow) {
65
138
  return {
@@ -81,9 +154,11 @@ function toWorkflowResponse(workflow) {
81
154
  path: workflow.path ?? null,
82
155
  run_mode: workflow.run_mode ?? null,
83
156
  workspace_id: workflow.workspace_id ?? null,
157
+ project_id: workflow.project_id,
84
158
  required_providers: null,
85
159
  required_models: null,
86
160
  html_app: workflow.html_app ?? null,
161
+ app_doc: workflow.app_doc ?? null,
87
162
  etag: workflow.getEtag() ?? null
88
163
  };
89
164
  }
@@ -102,15 +177,31 @@ function toVersionResponse(v) {
102
177
  created_at: v.created_at ?? null
103
178
  };
104
179
  }
180
+ function toCollaboratorItem(grant) {
181
+ return {
182
+ workflow_id: grant.workflow_id,
183
+ user_id: grant.user_id,
184
+ role: grant.role,
185
+ invited_by: grant.invited_by,
186
+ created_at: grant.created_at ?? null
187
+ };
188
+ }
189
+ function toShareItem(share) {
190
+ return {
191
+ id: share.id,
192
+ workflow_id: share.workflow_id,
193
+ token: share.token,
194
+ role: share.role,
195
+ created_at: share.created_at ?? null,
196
+ revoked_at: share.revoked_at ?? null
197
+ };
198
+ }
105
199
  // ── Example workflow helpers ────────────────────────────────────────────────
106
200
  const EXAMPLES_THUMBNAILS_PREFIX = "/api/workflows/examples/thumbnails/";
107
- function deriveAssetsDir(examplesDir) {
108
- return nodePath.join(nodePath.dirname(nodePath.dirname(examplesDir)), "assets", nodePath.basename(examplesDir));
109
- }
110
- function buildExamplesFromDir(examplesDir) {
201
+ function buildExamplesFromDir(examplesDir, examplesAssetsFallbackDir) {
111
202
  if (!existsSync(examplesDir))
112
203
  return [];
113
- const assetsDir = deriveAssetsDir(examplesDir);
204
+ const assetsDir = deriveExampleAssetsDir(examplesDir, examplesAssetsFallbackDir);
114
205
  const now = new Date().toISOString();
115
206
  const workflows = [];
116
207
  let files;
@@ -126,12 +217,15 @@ function buildExamplesFromDir(examplesDir) {
126
217
  try {
127
218
  const raw = readFileSync(nodePath.join(examplesDir, file), "utf8");
128
219
  const parsed = JSON.parse(raw);
129
- const name = typeof parsed.name === "string"
220
+ const name = isString(parsed.name)
130
221
  ? parsed.name
131
222
  : file.replace(/\.json$/i, "");
223
+ // Append ?v=<md5-8> via withCacheBuster so the browser invalidates
224
+ // its cached thumbnail whenever the JPG is regenerated on disk.
132
225
  const jpgFile = `${name}.jpg`;
133
- const thumbnailUrl = existsSync(nodePath.join(assetsDir, jpgFile))
134
- ? `${EXAMPLES_THUMBNAILS_PREFIX}${encodeURIComponent(jpgFile)}`
226
+ const jpgPath = nodePath.join(assetsDir, jpgFile);
227
+ const thumbnailUrl = existsSync(jpgPath)
228
+ ? withCacheBuster(`${EXAMPLES_THUMBNAILS_PREFIX}${encodeURIComponent(jpgFile)}`, jpgPath)
135
229
  : null;
136
230
  workflows.push({
137
231
  id: file,
@@ -140,9 +234,9 @@ function buildExamplesFromDir(examplesDir) {
140
234
  updated_at: now,
141
235
  name,
142
236
  tool_name: null,
143
- description: typeof parsed.description === "string" ? parsed.description : "",
237
+ description: isString(parsed.description) ? parsed.description : "",
144
238
  tags: Array.isArray(parsed.tags)
145
- ? parsed.tags.filter((t) => typeof t === "string")
239
+ ? parsed.tags.filter((t) => isString(t))
146
240
  : [],
147
241
  thumbnail: thumbnailUrl ? jpgFile : null,
148
242
  thumbnail_url: thumbnailUrl,
@@ -150,13 +244,16 @@ function buildExamplesFromDir(examplesDir) {
150
244
  input_schema: null,
151
245
  output_schema: null,
152
246
  settings: null,
153
- package_name: typeof parsed.package_name === "string" ? parsed.package_name : null,
247
+ package_name: isString(parsed.package_name)
248
+ ? parsed.package_name
249
+ : null,
154
250
  path: null,
155
251
  run_mode: null,
156
252
  workspace_id: null,
157
253
  required_providers: null,
158
254
  required_models: null,
159
255
  html_app: null,
256
+ app_doc: null,
160
257
  etag: null
161
258
  });
162
259
  }
@@ -168,7 +265,7 @@ function buildExamplesFromDir(examplesDir) {
168
265
  }
169
266
  function buildExampleWorkflows(apiOptions) {
170
267
  if (apiOptions.examplesDir) {
171
- return buildExamplesFromDir(apiOptions.examplesDir);
268
+ return buildExamplesFromDir(apiOptions.examplesDir, apiOptions.examplesAssetsFallbackDir);
172
269
  }
173
270
  const loaded = loadPythonPackageMetadata({
174
271
  roots: apiOptions.metadataRoots,
@@ -203,54 +300,13 @@ function buildExampleWorkflows(apiOptions) {
203
300
  required_providers: null,
204
301
  required_models: null,
205
302
  html_app: null,
303
+ app_doc: null,
206
304
  etag: null
207
305
  });
208
306
  }
209
307
  }
210
308
  return workflows;
211
309
  }
212
- function loadExampleGraph(packageName, exampleName, apiOptions) {
213
- const loaded = loadPythonPackageMetadata({
214
- roots: apiOptions.metadataRoots,
215
- maxDepth: apiOptions.metadataMaxDepth
216
- });
217
- const pkg = loaded.packages.find((p) => p.name === packageName);
218
- if (!pkg?.sourceFolder)
219
- return null;
220
- const examplePath = nodePath.join(pkg.sourceFolder, "nodetool", "examples", packageName, `${exampleName}.json`);
221
- try {
222
- const raw = readFileSync(examplePath, "utf8");
223
- return JSON.parse(raw);
224
- }
225
- catch {
226
- return null;
227
- }
228
- }
229
- // ── deriveWorkflowName ─────────────────────────────────────────────────────
230
- function deriveWorkflowName(workflow) {
231
- const graph = workflow.graph;
232
- const nodes = graph?.nodes ?? [];
233
- if (nodes.length === 0) {
234
- return workflow.name || "Untitled Workflow";
235
- }
236
- const categories = new Set();
237
- for (const n of nodes) {
238
- if (typeof n.type === "string") {
239
- const parts = n.type.split(".");
240
- if (parts.length >= 2 && parts[1]) {
241
- categories.add(parts[1]);
242
- }
243
- }
244
- }
245
- const segments = Array.from(categories).slice(0, 3);
246
- if (segments.length === 0) {
247
- return workflow.name || "Untitled Workflow";
248
- }
249
- const label = segments
250
- .map((s) => s.charAt(0).toUpperCase() + s.slice(1))
251
- .join(" + ");
252
- return `${label} Workflow`;
253
- }
254
310
  // ── Router ─────────────────────────────────────────────────────────────────
255
311
  export const workflowsRouter = router({
256
312
  // ── list (GET /api/workflows) ─────────────────────────────────────────────
@@ -260,34 +316,28 @@ export const workflowsRouter = router({
260
316
  .query(async ({ ctx, input }) => {
261
317
  const [workflows, cursor] = await Workflow.paginate(ctx.userId, {
262
318
  limit: input.limit,
263
- runMode: input.run_mode
319
+ runMode: input.run_mode,
320
+ tag: input.tag,
321
+ projectId: input.project_id,
322
+ startKey: input.cursor
264
323
  });
324
+ let filtered = workflows;
325
+ if (input.mediaOutput) {
326
+ filtered = filtered.filter((w) => hasTerminalMediaOutput(w));
327
+ }
265
328
  return {
266
- workflows: workflows.map((w) => toWorkflowResponse(w)),
267
- next: cursor || null
329
+ workflows: filtered.map((w) => toWorkflowResponse(w)),
330
+ // mediaOutput filtering happens in memory after DB pagination, so cursor
331
+ // pagination is intentionally disabled for this mode.
332
+ next: input.mediaOutput ? null : cursor || null
268
333
  };
269
334
  }),
270
- // ── names (GET /api/workflows/names) ─────────────────────────────────────
271
- names: protectedProcedure
272
- .output(namesOutput)
273
- .query(async ({ ctx }) => {
274
- const [workflows] = await Workflow.paginate(ctx.userId, { limit: 1000 });
275
- const names = {};
276
- for (const wf of workflows)
277
- names[wf.id] = wf.name;
278
- return names;
279
- }),
280
335
  // ── get (GET /api/workflows/:id) ─────────────────────────────────────────
281
336
  get: protectedProcedure
282
337
  .input(getInput)
283
338
  .output(workflowResponse)
284
339
  .query(async ({ ctx, input }) => {
285
- const workflow = (await Workflow.get(input.id));
286
- if (!workflow)
287
- throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
288
- if (workflow.access !== "public" && workflow.user_id !== ctx.userId) {
289
- throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
290
- }
340
+ const { workflow } = await requireWorkflowRole(input.id, ctx.userId, "viewer");
291
341
  return toWorkflowResponse(workflow);
292
342
  }),
293
343
  // ── create (POST /api/workflows) ─────────────────────────────────────────
@@ -295,36 +345,13 @@ export const workflowsRouter = router({
295
345
  .input(createInput)
296
346
  .output(workflowResponse)
297
347
  .mutation(async ({ ctx, input }) => {
298
- if (!input.graph || !Array.isArray(input.graph.nodes) || !Array.isArray(input.graph.edges)) {
299
- throwApiError(ApiErrorCode.INVALID_INPUT, "graph is required and must have nodes and edges arrays");
300
- }
301
- let graph = input.graph;
302
- // Optionally seed from example
303
- if (input.from_example_package &&
304
- input.from_example_name &&
305
- (!graph || graph.nodes?.length === 0)) {
306
- const example = loadExampleGraph(input.from_example_package, input.from_example_name, ctx.apiOptions);
307
- if (example?.graph) {
308
- graph = example.graph;
348
+ const workflow = await runWorkflowService(() => createWorkflow(ctx.userId, input, input.from_example_name
349
+ ? {
350
+ packageName: input.from_example_package ?? undefined,
351
+ exampleName: input.from_example_name,
352
+ apiOptions: ctx.apiOptions
309
353
  }
310
- }
311
- const workflow = (await Workflow.create({
312
- user_id: ctx.userId,
313
- name: input.name,
314
- tool_name: input.tool_name ?? null,
315
- package_name: input.package_name ?? null,
316
- path: input.path ?? null,
317
- tags: input.tags ?? [],
318
- description: input.description ?? "",
319
- thumbnail: input.thumbnail ?? null,
320
- thumbnail_url: input.thumbnail_url ?? null,
321
- access: input.access === "public" ? "public" : "private",
322
- graph,
323
- settings: input.settings ?? null,
324
- run_mode: input.run_mode ?? "workflow",
325
- workspace_id: input.workspace_id ?? null,
326
- html_app: input.html_app ?? null
327
- }));
354
+ : undefined));
328
355
  return toWorkflowResponse(workflow);
329
356
  }),
330
357
  // ── update (PUT /api/workflows/:id) ──────────────────────────────────────
@@ -332,51 +359,7 @@ export const workflowsRouter = router({
332
359
  .input(updateInput)
333
360
  .output(workflowResponse)
334
361
  .mutation(async ({ ctx, input }) => {
335
- if (!input.graph || !Array.isArray(input.graph.nodes) || !Array.isArray(input.graph.edges)) {
336
- throwApiError(ApiErrorCode.INVALID_INPUT, "graph is required and must have nodes and edges arrays");
337
- }
338
- const graph = input.graph;
339
- const existing = (await Workflow.get(input.id));
340
- if (existing && existing.user_id !== ctx.userId) {
341
- throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
342
- }
343
- if (existing) {
344
- existing.name = input.name;
345
- existing.tool_name = input.tool_name ?? null;
346
- existing.description = input.description ?? "";
347
- existing.tags = input.tags ?? [];
348
- existing.package_name = input.package_name ?? null;
349
- if (input.thumbnail !== undefined)
350
- existing.thumbnail = input.thumbnail;
351
- existing.access = input.access === "public" ? "public" : "private";
352
- existing.graph = graph;
353
- existing.settings = input.settings ?? null;
354
- if (input.run_mode !== undefined && input.run_mode !== null)
355
- existing.run_mode = input.run_mode;
356
- existing.workspace_id = input.workspace_id ?? null;
357
- existing.html_app = input.html_app ?? null;
358
- await existing.save();
359
- return toWorkflowResponse(existing);
360
- }
361
- // Upsert: create if doesn't exist
362
- const workflow = (await Workflow.create({
363
- id: input.id,
364
- user_id: ctx.userId,
365
- name: input.name,
366
- tool_name: input.tool_name ?? null,
367
- package_name: input.package_name ?? null,
368
- path: input.path ?? null,
369
- tags: input.tags ?? [],
370
- description: input.description ?? "",
371
- thumbnail: input.thumbnail ?? null,
372
- thumbnail_url: input.thumbnail_url ?? null,
373
- access: input.access === "public" ? "public" : "private",
374
- graph,
375
- settings: input.settings ?? null,
376
- run_mode: input.run_mode ?? "workflow",
377
- workspace_id: input.workspace_id ?? null,
378
- html_app: input.html_app ?? null
379
- }));
362
+ const workflow = await runWorkflowService(() => updateWorkflow(ctx.userId, input.id, input));
380
363
  return toWorkflowResponse(workflow);
381
364
  }),
382
365
  // ── delete (DELETE /api/workflows/:id) ───────────────────────────────────
@@ -384,123 +367,19 @@ export const workflowsRouter = router({
384
367
  .input(deleteInput)
385
368
  .output(deleteOutput)
386
369
  .mutation(async ({ ctx, input }) => {
387
- const workflow = (await Workflow.get(input.id));
388
- if (!workflow)
389
- throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
390
- if (workflow.user_id !== ctx.userId) {
391
- throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
392
- }
393
- await workflow.delete();
370
+ await runWorkflowService(() => deleteWorkflow(ctx.userId, input.id));
371
+ lastAutosaveTime.delete(input.id);
394
372
  return { ok: true };
395
373
  }),
396
- // ── run (POST /api/workflows/:id/run) ────────────────────────────────────
397
- run: protectedProcedure
398
- .input(runInput)
399
- .output(runOutput)
400
- .mutation(async ({ ctx, input }) => {
401
- const workflow = await Workflow.find(ctx.userId, input.id);
402
- if (!workflow)
403
- throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
404
- const runMode = workflow.run_mode ?? "workflow";
405
- if (runMode !== "workflow") {
406
- throwApiError(ApiErrorCode.INVALID_INPUT, `Workflow run mode "${runMode}" is not supported by the standalone backend`);
407
- }
408
- const params = input.params ?? {};
409
- const graph = workflow.getGraph();
410
- const runnableGraph = {
411
- nodes: graph.nodes.map((node) => {
412
- const record = node;
413
- return {
414
- ...record,
415
- id: String(record.id ?? ""),
416
- type: String(record.type ?? ""),
417
- properties: (record.properties ?? record.data ?? {})
418
- };
419
- }),
420
- edges: graph.edges.map((edge) => {
421
- const record = edge;
422
- return {
423
- ...record,
424
- id: typeof record.id === "string" || record.id == null
425
- ? record.id
426
- : String(record.id),
427
- source: String(record.source ?? ""),
428
- target: String(record.target ?? ""),
429
- sourceHandle: String(record.sourceHandle ?? ""),
430
- targetHandle: String(record.targetHandle ?? ""),
431
- edge_type: record.edge_type === "control" ? "control" : "data"
432
- };
433
- })
434
- };
435
- const registry = ctx.registry;
436
- const pythonBridge = ctx.pythonBridge;
437
- const getPythonBridgeReady = ctx.getPythonBridgeReady;
438
- const hasPythonNode = runnableGraph.nodes.some((node) => {
439
- const nodeType = typeof node.type === "string" ? node.type : "";
440
- return (nodeType !== "" &&
441
- Boolean(registry.getMetadata(nodeType)) &&
442
- !registry.has(nodeType));
443
- });
444
- if (hasPythonNode) {
445
- if (!getPythonBridgeReady()) {
446
- await pythonBridge.ensureConnected();
447
- }
448
- }
449
- const resolveExecutor = (node) => {
450
- if (registry.has(node.type)) {
451
- return registry.resolve(node);
452
- }
453
- if (getPythonBridgeReady() && pythonBridge.hasNodeType(node.type)) {
454
- const meta = pythonBridge
455
- .getNodeMetadata()
456
- .find((n) => n.node_type === node.type);
457
- const props = (node.properties ?? {});
458
- return new PythonNodeExecutor(pythonBridge, node.type, props, Object.fromEntries((meta?.outputs ?? []).map((o) => [o.name, o.type.type])), meta?.required_settings ?? []);
459
- }
460
- return registry.resolve(node);
461
- };
462
- const job = await Job.create({
463
- workflow_id: input.id,
464
- user_id: ctx.userId,
465
- status: "running",
466
- params,
467
- graph: runnableGraph
468
- });
469
- const runner = new WorkflowRunner(job.id, { resolveExecutor });
470
- const result = await runner.run({ job_id: job.id, workflow_id: input.id, params }, runnableGraph);
471
- if (result.status === "completed") {
472
- job.markCompleted();
473
- }
474
- else if (result.status === "cancelled") {
475
- job.markCancelled();
476
- }
477
- else {
478
- job.markFailed(result.error ?? "Workflow run failed");
479
- }
480
- await job.save();
481
- return {
482
- job_id: job.id,
483
- workflow_id: input.id,
484
- status: result.status,
485
- outputs: result.outputs ?? null,
486
- error: result.error ?? null,
487
- message_count: result.messages.length,
488
- background: input.background ?? false
489
- };
490
- }),
491
374
  // ── autosave (POST/PUT /api/workflows/:id/autosave) ───────────────────────
492
375
  autosave: protectedProcedure
493
376
  .input(autosaveInput)
494
377
  .output(autosaveOutput)
495
378
  .mutation(async ({ ctx, input }) => {
496
- const workflow = (await Workflow.get(input.id));
497
- if (!workflow)
498
- throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
499
- if (workflow.user_id !== ctx.userId) {
500
- throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
501
- }
379
+ const { workflow, role } = await requireWorkflowRole(input.id, ctx.userId, "editor");
502
380
  const force = input.force === true;
503
- const maxVersions = typeof input.max_versions === "number" ? input.max_versions : 10;
381
+ const { policy: retentionPolicy } = await getStorageRetentionSettings(ctx.userId);
382
+ const maxVersions = retentionPolicy.maxAutosavesPerWorkflow;
504
383
  // Rate-limit
505
384
  if (!force) {
506
385
  const last = lastAutosaveTime.get(input.id);
@@ -508,19 +387,28 @@ export const workflowsRouter = router({
508
387
  return {
509
388
  version: null,
510
389
  message: "Autosave skipped (rate limited)",
511
- skipped: true
390
+ skipped: true,
391
+ updated_at: workflow.updated_at ?? null
512
392
  };
513
393
  }
514
394
  }
515
- workflow.graph = input.graph;
395
+ const fields = {
396
+ graph: input.graph
397
+ };
516
398
  if (input.name !== undefined)
517
- workflow.name = input.name;
399
+ fields.name = input.name;
518
400
  if (input.description !== undefined)
519
- workflow.description = input.description;
520
- if (input.access === "public" || input.access === "private")
521
- workflow.access = input.access;
522
- await workflow.save();
523
- lastAutosaveTime.set(input.id, Date.now());
401
+ fields.description = input.description;
402
+ // Only the owner can change visibility; editors keep it as-is.
403
+ if (role === "owner" &&
404
+ (input.access === "public" || input.access === "private"))
405
+ fields.access = input.access;
406
+ const savedWorkflow = await Workflow.updateFieldsIfUnchanged(input.id, input.expected_updated_at ?? workflow.updated_at, fields);
407
+ if (!savedWorkflow) {
408
+ throwApiError(ApiErrorCode.ALREADY_EXISTS, "Workflow was modified since last read (optimistic concurrency conflict)");
409
+ }
410
+ await syncTriggerRegistrations(savedWorkflow);
411
+ recordAutosave(input.id, Date.now());
524
412
  let version = null;
525
413
  try {
526
414
  const nextVer = await WorkflowVersion.nextVersion(input.id);
@@ -530,8 +418,8 @@ export const workflowsRouter = router({
530
418
  graph: input.graph,
531
419
  version: nextVer,
532
420
  save_type: "autosave",
533
- name: workflow.name,
534
- description: workflow.description
421
+ name: savedWorkflow.name,
422
+ description: savedWorkflow.description
535
423
  });
536
424
  await wv.save();
537
425
  version = {
@@ -541,7 +429,7 @@ export const workflowsRouter = router({
541
429
  save_type: wv.save_type ?? "autosave",
542
430
  created_at: wv.created_at ?? null
543
431
  };
544
- await WorkflowVersion.pruneOldVersions(input.id, maxVersions);
432
+ await WorkflowVersion.pruneOldAutosaves(input.id, maxVersions);
545
433
  }
546
434
  catch {
547
435
  // non-fatal — version table may not exist
@@ -549,24 +437,8 @@ export const workflowsRouter = router({
549
437
  return {
550
438
  version,
551
439
  message: "Autosaved successfully",
552
- skipped: false
553
- };
554
- }),
555
- // ── tools (GET /api/workflows/tools) ─────────────────────────────────────
556
- tools: protectedProcedure
557
- .input(toolsInput)
558
- .output(toolsOutput)
559
- .query(async ({ ctx, input }) => {
560
- const [workflows] = await Workflow.paginateTools(ctx.userId, {
561
- limit: input.limit
562
- });
563
- return {
564
- workflows: workflows.map((w) => ({
565
- name: w.name,
566
- tool_name: w.tool_name ?? null,
567
- description: w.description ?? null
568
- })),
569
- next: null
440
+ skipped: false,
441
+ updated_at: savedWorkflow.updated_at ?? null
570
442
  };
571
443
  }),
572
444
  // ── examples (GET /api/workflows/examples) ────────────────────────────────
@@ -589,13 +461,21 @@ export const workflowsRouter = router({
589
461
  : workflows;
590
462
  return { workflows: filtered, next: null };
591
463
  }),
464
+ // ── recipes (shipped chains of example workflows) ─────────────────────────
465
+ // Manifest files on disk, like the examples they order: no user, no database,
466
+ // and each step resolved against the examples this install actually ships.
467
+ recipes: protectedProcedure
468
+ .output(z.array(exampleRecipeSummary))
469
+ .query(({ ctx }) => listExampleRecipes(ctx.apiOptions)),
592
470
  // ── public workflows ──────────────────────────────────────────────────────
593
471
  public: router({
594
472
  list: publicProcedure
595
473
  .input(publicListInput)
596
474
  .output(publicListOutput)
597
475
  .query(async ({ input }) => {
598
- const [workflows] = await Workflow.paginatePublic({ limit: input.limit });
476
+ const [workflows] = await Workflow.paginatePublic({
477
+ limit: input.limit
478
+ });
599
479
  return {
600
480
  workflows: workflows.map((w) => toWorkflowResponse(w)),
601
481
  next: null
@@ -612,30 +492,26 @@ export const workflowsRouter = router({
612
492
  return toWorkflowResponse(workflow);
613
493
  })
614
494
  }),
615
- // ── app (GET /api/workflows/:id/app) ─────────────────────────────────────
616
- app: protectedProcedure
617
- .input(appInput)
618
- .output(appOutput)
495
+ // ── terminalOutputs (GET /api/workflows/:id/terminal-outputs) ─────────────
496
+ // Returns the terminal media-output nodes of a workflow for the multi-output
497
+ // selection prompt in AddClipMenu.
498
+ terminalOutputs: protectedProcedure
499
+ .input(terminalOutputsInput)
500
+ .output(terminalOutputsOutput)
619
501
  .query(async ({ ctx, input }) => {
620
- const baseUrl = input.baseUrl ?? ctx.apiOptions.baseUrl ?? "http://127.0.0.1:7777";
621
- return {
622
- workflow_id: input.id,
623
- api_url: baseUrl
624
- };
625
- }),
626
- // ── generateName (POST /api/workflows/:id/generate-name) ─────────────────
627
- generateName: protectedProcedure
628
- .input(generateNameInput)
629
- .output(generateNameOutput)
630
- .mutation(async ({ ctx, input }) => {
631
502
  const workflow = (await Workflow.get(input.id));
632
503
  if (!workflow)
633
504
  throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
634
- if (workflow.user_id !== ctx.userId) {
505
+ if (workflow.access !== "public" && workflow.user_id !== ctx.userId) {
635
506
  throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
636
507
  }
637
- const name = deriveWorkflowName(workflow);
638
- return { name };
508
+ const outputs = findTerminalMediaOutputNodes(workflow).map((n) => ({
509
+ id: n.id,
510
+ type: n.type,
511
+ mediaType: OUTPUT_NODE_MEDIA_TYPES[n.type],
512
+ name: n.data?.name ?? ""
513
+ }));
514
+ return { outputs };
639
515
  }),
640
516
  // ── versions ──────────────────────────────────────────────────────────────
641
517
  versions: router({
@@ -644,11 +520,8 @@ export const workflowsRouter = router({
644
520
  .input(versionsListInput)
645
521
  .output(versionsListOutput)
646
522
  .query(async ({ ctx, input }) => {
647
- // Check ownership via the parent workflow
648
- const workflow = (await Workflow.get(input.id));
649
- if (!workflow || workflow.user_id !== ctx.userId) {
650
- throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
651
- }
523
+ // Owners and editors see version history
524
+ await requireWorkflowRole(input.id, ctx.userId, "editor");
652
525
  const versions = await WorkflowVersion.listForWorkflow(input.id, {
653
526
  limit: input.limit
654
527
  });
@@ -659,12 +532,7 @@ export const workflowsRouter = router({
659
532
  .input(versionCreateInput)
660
533
  .output(versionResponse)
661
534
  .mutation(async ({ ctx, input }) => {
662
- const workflow = (await Workflow.get(input.id));
663
- if (!workflow)
664
- throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
665
- if (workflow.user_id !== ctx.userId) {
666
- throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
667
- }
535
+ const { workflow } = await requireWorkflowRole(input.id, ctx.userId, "editor");
668
536
  const nextVer = await WorkflowVersion.nextVersion(input.id);
669
537
  const version = (await WorkflowVersion.create({
670
538
  workflow_id: input.id,
@@ -676,29 +544,12 @@ export const workflowsRouter = router({
676
544
  }));
677
545
  return toVersionResponse(version);
678
546
  }),
679
- // GET /api/workflows/:id/versions/:version
680
- get: protectedProcedure
681
- .input(versionGetInput)
682
- .output(versionResponse)
683
- .query(async ({ ctx, input }) => {
684
- const workflow = (await Workflow.get(input.id));
685
- if (!workflow || workflow.user_id !== ctx.userId) {
686
- throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
687
- }
688
- const version = await WorkflowVersion.findByVersion(input.id, input.version);
689
- if (!version)
690
- throwApiError(ApiErrorCode.NOT_FOUND, "Version not found");
691
- return toVersionResponse(version);
692
- }),
693
547
  // POST /api/workflows/:id/versions/:version/restore
694
548
  restore: protectedProcedure
695
549
  .input(versionRestoreInput)
696
550
  .output(workflowResponse)
697
551
  .mutation(async ({ ctx, input }) => {
698
- const workflow = (await Workflow.get(input.id));
699
- if (!workflow || workflow.user_id !== ctx.userId) {
700
- throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
701
- }
552
+ const { workflow } = await requireWorkflowRole(input.id, ctx.userId, "editor");
702
553
  const version = await WorkflowVersion.findByVersion(input.id, input.version);
703
554
  if (!version)
704
555
  throwApiError(ApiErrorCode.NOT_FOUND, "Version not found");
@@ -715,11 +566,141 @@ export const workflowsRouter = router({
715
566
  if (!version)
716
567
  throwApiError(ApiErrorCode.NOT_FOUND, "Version not found");
717
568
  if (version.user_id !== ctx.userId) {
718
- throwApiError(ApiErrorCode.NOT_FOUND, "Version not found");
569
+ // The workflow owner may prune versions saved by collaborators.
570
+ const parent = (await Workflow.get(version.workflow_id));
571
+ if (!parent || parent.user_id !== ctx.userId) {
572
+ throwApiError(ApiErrorCode.NOT_FOUND, "Version not found");
573
+ }
719
574
  }
720
575
  await version.delete();
721
576
  return { ok: true };
722
577
  })
578
+ }),
579
+ // ── sharing ────────────────────────────────────────────────────────────────
580
+ // Private sharing via role-scoped links: the owner mints a link, any
581
+ // authenticated user who redeems it becomes a collaborator (viewer/editor).
582
+ sharing: router({
583
+ // Collaborators + share links for the dialog. Owner only.
584
+ get: protectedProcedure
585
+ .input(sharingGetInput)
586
+ .output(sharingGetOutput)
587
+ .query(async ({ ctx, input }) => {
588
+ await requireWorkflowRole(input.id, ctx.userId, "owner");
589
+ const [collaborators, shares] = await Promise.all([
590
+ WorkflowCollaborator.listForWorkflow(input.id),
591
+ WorkflowShare.listForWorkflow(input.id)
592
+ ]);
593
+ return {
594
+ collaborators: collaborators.map(toCollaboratorItem),
595
+ shares: shares.map(toShareItem)
596
+ };
597
+ }),
598
+ // Mint (or return the existing active) share link for a role.
599
+ createLink: protectedProcedure
600
+ .input(sharingCreateLinkInput)
601
+ .output(shareItem)
602
+ .mutation(async ({ ctx, input }) => {
603
+ await requireWorkflowRole(input.id, ctx.userId, "owner");
604
+ const share = await WorkflowShare.ensure({
605
+ workflowId: input.id,
606
+ role: input.role,
607
+ createdBy: ctx.userId
608
+ });
609
+ return toShareItem(share);
610
+ }),
611
+ // Stop new redemptions of a link. Existing collaborators keep access.
612
+ revokeLink: protectedProcedure
613
+ .input(sharingRevokeLinkInput)
614
+ .output(sharingOkOutput)
615
+ .mutation(async ({ ctx, input }) => {
616
+ await requireWorkflowRole(input.id, ctx.userId, "owner");
617
+ const share = (await WorkflowShare.get(input.share_id));
618
+ if (!share || share.workflow_id !== input.id) {
619
+ throwApiError(ApiErrorCode.NOT_FOUND, "Share not found");
620
+ }
621
+ if (!share.isRevoked)
622
+ await share.revoke();
623
+ return { ok: true };
624
+ }),
625
+ // Change a collaborator's role. Owner only.
626
+ setRole: protectedProcedure
627
+ .input(sharingSetRoleInput)
628
+ .output(collaboratorItem)
629
+ .mutation(async ({ ctx, input }) => {
630
+ await requireWorkflowRole(input.id, ctx.userId, "owner");
631
+ const grant = await WorkflowCollaborator.findFor(input.id, input.user_id);
632
+ if (!grant) {
633
+ throwApiError(ApiErrorCode.NOT_FOUND, "Collaborator not found");
634
+ }
635
+ if (grant.role !== input.role) {
636
+ grant.role = input.role;
637
+ await grant.save();
638
+ }
639
+ return toCollaboratorItem(grant);
640
+ }),
641
+ // Remove a collaborator. Owner removes anyone; a collaborator may
642
+ // remove themself ("leave").
643
+ removeCollaborator: protectedProcedure
644
+ .input(sharingRemoveCollaboratorInput)
645
+ .output(sharingOkOutput)
646
+ .mutation(async ({ ctx, input }) => {
647
+ if (input.user_id !== ctx.userId) {
648
+ await requireWorkflowRole(input.id, ctx.userId, "owner");
649
+ }
650
+ const removed = await WorkflowCollaborator.remove(input.id, input.user_id);
651
+ if (!removed) {
652
+ throwApiError(ApiErrorCode.NOT_FOUND, "Collaborator not found");
653
+ }
654
+ return { ok: true };
655
+ }),
656
+ // Redeem a share link: the caller becomes a collaborator with the
657
+ // link's role and gets the workflow back for navigation.
658
+ accept: protectedProcedure
659
+ .input(sharingAcceptInput)
660
+ .output(sharingAcceptOutput)
661
+ .mutation(async ({ ctx, input }) => {
662
+ const share = await WorkflowShare.findByToken(input.token);
663
+ if (!share || share.isRevoked) {
664
+ throwApiError(ApiErrorCode.NOT_FOUND, "Share link is invalid or revoked");
665
+ }
666
+ const workflow = (await Workflow.get(share.workflow_id));
667
+ if (!workflow) {
668
+ throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
669
+ }
670
+ // The owner opening their own link is a no-op, not a grant.
671
+ if (workflow.user_id !== ctx.userId) {
672
+ await WorkflowCollaborator.upsert({
673
+ workflowId: workflow.id,
674
+ userId: ctx.userId,
675
+ role: share.role,
676
+ invitedBy: share.created_by
677
+ });
678
+ }
679
+ return { workflow: toWorkflowResponse(workflow), role: share.role };
680
+ }),
681
+ // Workflows shared with the caller, with their role on each.
682
+ sharedWithMe: protectedProcedure
683
+ .input(sharedWithMeInput)
684
+ .output(sharedWithMeOutput)
685
+ .query(async ({ ctx, input }) => {
686
+ const grants = await WorkflowCollaborator.listForUser(ctx.userId);
687
+ const limited = grants.slice(0, input.limit);
688
+ const loaded = await Promise.all(limited.map(async (grant) => ({
689
+ grant,
690
+ workflow: (await Workflow.get(grant.workflow_id))
691
+ })));
692
+ const workflows = [];
693
+ for (const { grant, workflow } of loaded) {
694
+ // Skip grants pointing at deleted workflows.
695
+ if (!workflow)
696
+ continue;
697
+ workflows.push({
698
+ ...toWorkflowResponse(workflow),
699
+ shared_role: grant.role
700
+ });
701
+ }
702
+ return { workflows };
703
+ })
723
704
  })
724
705
  });
725
706
  //# sourceMappingURL=workflows.js.map