@nodetool-ai/runtime 0.7.0-rc.23 → 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 (665) hide show
  1. package/README.md +29 -0
  2. package/dist/.nodetool-build-stamp +1 -0
  3. package/dist/agent-memory.d.ts +118 -0
  4. package/dist/agent-memory.d.ts.map +1 -0
  5. package/dist/agent-memory.js +186 -0
  6. package/dist/agent-memory.js.map +1 -0
  7. package/dist/async-local-storage.d.ts +20 -0
  8. package/dist/async-local-storage.d.ts.map +1 -0
  9. package/dist/async-local-storage.js +28 -0
  10. package/dist/async-local-storage.js.map +1 -0
  11. package/dist/blender-executor.d.ts +93 -0
  12. package/dist/blender-executor.d.ts.map +1 -0
  13. package/dist/blender-executor.js +294 -0
  14. package/dist/blender-executor.js.map +1 -0
  15. package/dist/comfy-executor.d.ts +23 -1
  16. package/dist/comfy-executor.d.ts.map +1 -1
  17. package/dist/comfy-executor.js +234 -55
  18. package/dist/comfy-executor.js.map +1 -1
  19. package/dist/context-packer.d.ts +1 -1
  20. package/dist/context-packer.d.ts.map +1 -1
  21. package/dist/context-packer.js +23 -25
  22. package/dist/context-packer.js.map +1 -1
  23. package/dist/context.d.ts +954 -127
  24. package/dist/context.d.ts.map +1 -1
  25. package/dist/context.js +2424 -513
  26. package/dist/context.js.map +1 -1
  27. package/dist/cost-reconciler.d.ts +32 -0
  28. package/dist/cost-reconciler.d.ts.map +1 -0
  29. package/dist/cost-reconciler.js +21 -0
  30. package/dist/cost-reconciler.js.map +1 -0
  31. package/dist/entities.d.ts +33 -0
  32. package/dist/entities.d.ts.map +1 -0
  33. package/dist/entities.js +43 -0
  34. package/dist/entities.js.map +1 -0
  35. package/dist/external-media-fetch.d.ts +29 -0
  36. package/dist/external-media-fetch.d.ts.map +1 -0
  37. package/dist/external-media-fetch.js +38 -0
  38. package/dist/external-media-fetch.js.map +1 -0
  39. package/dist/generation-receipt.d.ts +86 -0
  40. package/dist/generation-receipt.d.ts.map +1 -0
  41. package/dist/generation-receipt.js +137 -0
  42. package/dist/generation-receipt.js.map +1 -0
  43. package/dist/generation-registry.d.ts +67 -0
  44. package/dist/generation-registry.d.ts.map +1 -0
  45. package/dist/generation-registry.js +126 -0
  46. package/dist/generation-registry.js.map +1 -0
  47. package/dist/google/client.d.ts +196 -0
  48. package/dist/google/client.d.ts.map +1 -0
  49. package/dist/google/client.js +396 -0
  50. package/dist/google/client.js.map +1 -0
  51. package/dist/google/index.d.ts +3 -0
  52. package/dist/google/index.d.ts.map +1 -0
  53. package/dist/google/index.js +3 -0
  54. package/dist/google/index.js.map +1 -0
  55. package/dist/google/token.d.ts +15 -0
  56. package/dist/google/token.d.ts.map +1 -0
  57. package/dist/google/token.js +24 -0
  58. package/dist/google/token.js.map +1 -0
  59. package/dist/host-binaries.d.ts +106 -0
  60. package/dist/host-binaries.d.ts.map +1 -0
  61. package/dist/host-binaries.js +344 -0
  62. package/dist/host-binaries.js.map +1 -0
  63. package/dist/image-codec.d.ts +74 -0
  64. package/dist/image-codec.d.ts.map +1 -0
  65. package/dist/image-codec.js +273 -0
  66. package/dist/image-codec.js.map +1 -0
  67. package/dist/index.d.ts +56 -6
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +43 -4
  70. package/dist/index.js.map +1 -1
  71. package/dist/invocation-account.d.ts +43 -0
  72. package/dist/invocation-account.d.ts.map +1 -0
  73. package/dist/invocation-account.js +60 -0
  74. package/dist/invocation-account.js.map +1 -0
  75. package/dist/media-ref-bytes.d.ts +19 -0
  76. package/dist/media-ref-bytes.d.ts.map +1 -0
  77. package/dist/media-ref-bytes.js +181 -0
  78. package/dist/media-ref-bytes.js.map +1 -0
  79. package/dist/node-executor.d.ts +113 -2
  80. package/dist/node-executor.d.ts.map +1 -1
  81. package/dist/permission-gate.d.ts +152 -0
  82. package/dist/permission-gate.d.ts.map +1 -0
  83. package/dist/permission-gate.js +87 -0
  84. package/dist/permission-gate.js.map +1 -0
  85. package/dist/prefixed-storage-adapter.d.ts +33 -0
  86. package/dist/prefixed-storage-adapter.d.ts.map +1 -0
  87. package/dist/prefixed-storage-adapter.js +70 -0
  88. package/dist/prefixed-storage-adapter.js.map +1 -0
  89. package/dist/prompt-asset-refs.d.ts +222 -0
  90. package/dist/prompt-asset-refs.d.ts.map +1 -0
  91. package/dist/prompt-asset-refs.js +751 -0
  92. package/dist/prompt-asset-refs.js.map +1 -0
  93. package/dist/provider-cache.d.ts +3 -0
  94. package/dist/provider-cache.d.ts.map +1 -0
  95. package/dist/provider-cache.js +8 -0
  96. package/dist/provider-cache.js.map +1 -0
  97. package/dist/providers/aki-provider.d.ts +33 -10
  98. package/dist/providers/aki-provider.d.ts.map +1 -1
  99. package/dist/providers/aki-provider.js +84 -77
  100. package/dist/providers/aki-provider.js.map +1 -1
  101. package/dist/providers/alibaba-provider.d.ts +39 -0
  102. package/dist/providers/alibaba-provider.d.ts.map +1 -0
  103. package/dist/providers/alibaba-provider.js +86 -0
  104. package/dist/providers/alibaba-provider.js.map +1 -0
  105. package/dist/providers/anthropic-provider.d.ts +52 -3
  106. package/dist/providers/anthropic-provider.d.ts.map +1 -1
  107. package/dist/providers/anthropic-provider.js +1020 -338
  108. package/dist/providers/anthropic-provider.js.map +1 -1
  109. package/dist/providers/atlascloud-provider.d.ts +101 -0
  110. package/dist/providers/atlascloud-provider.d.ts.map +1 -0
  111. package/dist/providers/atlascloud-provider.js +1009 -0
  112. package/dist/providers/atlascloud-provider.js.map +1 -0
  113. package/dist/providers/atlascloud-transport.d.ts +100 -0
  114. package/dist/providers/atlascloud-transport.d.ts.map +1 -0
  115. package/dist/providers/atlascloud-transport.js +364 -0
  116. package/dist/providers/atlascloud-transport.js.map +1 -0
  117. package/dist/providers/atlascloud-webhook-registry.d.ts +35 -0
  118. package/dist/providers/atlascloud-webhook-registry.d.ts.map +1 -0
  119. package/dist/providers/atlascloud-webhook-registry.js +104 -0
  120. package/dist/providers/atlascloud-webhook-registry.js.map +1 -0
  121. package/dist/providers/audio-mime.d.ts +11 -0
  122. package/dist/providers/audio-mime.d.ts.map +1 -0
  123. package/dist/providers/audio-mime.js +46 -0
  124. package/dist/providers/audio-mime.js.map +1 -0
  125. package/dist/providers/base-provider.d.ts +481 -24
  126. package/dist/providers/base-provider.d.ts.map +1 -1
  127. package/dist/providers/base-provider.js +1259 -42
  128. package/dist/providers/base-provider.js.map +1 -1
  129. package/dist/providers/cassette-provider.d.ts +217 -0
  130. package/dist/providers/cassette-provider.d.ts.map +1 -0
  131. package/dist/providers/cassette-provider.js +502 -0
  132. package/dist/providers/cassette-provider.js.map +1 -0
  133. package/dist/providers/cerebras-provider.d.ts +6 -12
  134. package/dist/providers/cerebras-provider.d.ts.map +1 -1
  135. package/dist/providers/cerebras-provider.js +8 -33
  136. package/dist/providers/cerebras-provider.js.map +1 -1
  137. package/dist/providers/claude-agent-provider.d.ts +131 -68
  138. package/dist/providers/claude-agent-provider.d.ts.map +1 -1
  139. package/dist/providers/claude-agent-provider.js +1095 -515
  140. package/dist/providers/claude-agent-provider.js.map +1 -1
  141. package/dist/providers/codex-provider.d.ts +82 -0
  142. package/dist/providers/codex-provider.d.ts.map +1 -0
  143. package/dist/providers/codex-provider.js +492 -0
  144. package/dist/providers/codex-provider.js.map +1 -0
  145. package/dist/providers/cohere-provider.d.ts +5 -2
  146. package/dist/providers/cohere-provider.d.ts.map +1 -1
  147. package/dist/providers/cohere-provider.js +9 -2
  148. package/dist/providers/cohere-provider.js.map +1 -1
  149. package/dist/providers/comfy-cloud-provider.d.ts +30 -0
  150. package/dist/providers/comfy-cloud-provider.d.ts.map +1 -0
  151. package/dist/providers/comfy-cloud-provider.js +42 -0
  152. package/dist/providers/comfy-cloud-provider.js.map +1 -0
  153. package/dist/providers/content-filter.d.ts +46 -0
  154. package/dist/providers/content-filter.d.ts.map +1 -0
  155. package/dist/providers/content-filter.js +92 -0
  156. package/dist/providers/content-filter.js.map +1 -0
  157. package/dist/providers/context-exceeded.d.ts +37 -0
  158. package/dist/providers/context-exceeded.d.ts.map +1 -0
  159. package/dist/providers/context-exceeded.js +114 -0
  160. package/dist/providers/context-exceeded.js.map +1 -0
  161. package/dist/providers/context-window.d.ts +44 -0
  162. package/dist/providers/context-window.d.ts.map +1 -0
  163. package/dist/providers/context-window.js +145 -0
  164. package/dist/providers/context-window.js.map +1 -0
  165. package/dist/providers/contract/index.d.ts +4 -0
  166. package/dist/providers/contract/index.d.ts.map +1 -0
  167. package/dist/providers/contract/index.js +4 -0
  168. package/dist/providers/contract/index.js.map +1 -0
  169. package/dist/providers/contract/probe-manifest.d.ts +75 -0
  170. package/dist/providers/contract/probe-manifest.d.ts.map +1 -0
  171. package/dist/providers/contract/probe-manifest.js +379 -0
  172. package/dist/providers/contract/probe-manifest.js.map +1 -0
  173. package/dist/providers/contract/probe-runner.d.ts +57 -0
  174. package/dist/providers/contract/probe-runner.d.ts.map +1 -0
  175. package/dist/providers/contract/probe-runner.js +180 -0
  176. package/dist/providers/contract/probe-runner.js.map +1 -0
  177. package/dist/providers/contract/redact.d.ts +29 -0
  178. package/dist/providers/contract/redact.d.ts.map +1 -0
  179. package/dist/providers/contract/redact.js +113 -0
  180. package/dist/providers/contract/redact.js.map +1 -0
  181. package/dist/providers/core-tools.d.ts +74 -0
  182. package/dist/providers/core-tools.d.ts.map +1 -0
  183. package/dist/providers/core-tools.js +127 -0
  184. package/dist/providers/core-tools.js.map +1 -0
  185. package/dist/providers/cost-calculator.d.ts +69 -50
  186. package/dist/providers/cost-calculator.d.ts.map +1 -1
  187. package/dist/providers/cost-calculator.js +207 -397
  188. package/dist/providers/cost-calculator.js.map +1 -1
  189. package/dist/providers/credential-check.d.ts +45 -0
  190. package/dist/providers/credential-check.d.ts.map +1 -0
  191. package/dist/providers/credential-check.js +159 -0
  192. package/dist/providers/credential-check.js.map +1 -0
  193. package/dist/providers/custom-model-kinds.d.ts +33 -0
  194. package/dist/providers/custom-model-kinds.d.ts.map +1 -0
  195. package/dist/providers/custom-model-kinds.js +96 -0
  196. package/dist/providers/custom-model-kinds.js.map +1 -0
  197. package/dist/providers/custom-openai-provider.d.ts +81 -0
  198. package/dist/providers/custom-openai-provider.d.ts.map +1 -0
  199. package/dist/providers/custom-openai-provider.js +182 -0
  200. package/dist/providers/custom-openai-provider.js.map +1 -0
  201. package/dist/providers/custom-provider-registry.d.ts +19 -0
  202. package/dist/providers/custom-provider-registry.d.ts.map +1 -0
  203. package/dist/providers/custom-provider-registry.js +52 -0
  204. package/dist/providers/custom-provider-registry.js.map +1 -0
  205. package/dist/providers/deepseek-provider.d.ts +8 -14
  206. package/dist/providers/deepseek-provider.d.ts.map +1 -1
  207. package/dist/providers/deepseek-provider.js +6 -35
  208. package/dist/providers/deepseek-provider.js.map +1 -1
  209. package/dist/providers/defaults.d.ts +12 -0
  210. package/dist/providers/defaults.d.ts.map +1 -0
  211. package/dist/providers/defaults.js +12 -0
  212. package/dist/providers/defaults.js.map +1 -0
  213. package/dist/providers/elevenlabs-provider.d.ts +49 -0
  214. package/dist/providers/elevenlabs-provider.d.ts.map +1 -0
  215. package/dist/providers/elevenlabs-provider.js +142 -0
  216. package/dist/providers/elevenlabs-provider.js.map +1 -0
  217. package/dist/providers/entity-references.d.ts +31 -0
  218. package/dist/providers/entity-references.d.ts.map +1 -0
  219. package/dist/providers/entity-references.js +113 -0
  220. package/dist/providers/entity-references.js.map +1 -0
  221. package/dist/providers/evolink-provider.d.ts +38 -0
  222. package/dist/providers/evolink-provider.d.ts.map +1 -0
  223. package/dist/providers/evolink-provider.js +304 -0
  224. package/dist/providers/evolink-provider.js.map +1 -0
  225. package/dist/providers/fake-provider.d.ts +72 -1
  226. package/dist/providers/fake-provider.d.ts.map +1 -1
  227. package/dist/providers/fake-provider.js +203 -1
  228. package/dist/providers/fake-provider.js.map +1 -1
  229. package/dist/providers/fal-generations.d.ts +106 -0
  230. package/dist/providers/fal-generations.d.ts.map +1 -0
  231. package/dist/providers/fal-generations.js +286 -0
  232. package/dist/providers/fal-generations.js.map +1 -0
  233. package/dist/providers/fal-provider.d.ts +171 -7
  234. package/dist/providers/fal-provider.d.ts.map +1 -1
  235. package/dist/providers/fal-provider.js +1369 -64
  236. package/dist/providers/fal-provider.js.map +1 -1
  237. package/dist/providers/fal-queue.d.ts +47 -0
  238. package/dist/providers/fal-queue.d.ts.map +1 -0
  239. package/dist/providers/fal-queue.js +231 -0
  240. package/dist/providers/fal-queue.js.map +1 -0
  241. package/dist/providers/gemini-provider.d.ts +148 -8
  242. package/dist/providers/gemini-provider.d.ts.map +1 -1
  243. package/dist/providers/gemini-provider.js +1500 -316
  244. package/dist/providers/gemini-provider.js.map +1 -1
  245. package/dist/providers/gmi-provider.d.ts +21 -0
  246. package/dist/providers/gmi-provider.d.ts.map +1 -0
  247. package/dist/providers/gmi-provider.js +34 -0
  248. package/dist/providers/gmi-provider.js.map +1 -0
  249. package/dist/providers/gpt-image-size.d.ts +3 -0
  250. package/dist/providers/gpt-image-size.d.ts.map +1 -0
  251. package/dist/providers/gpt-image-size.js +37 -0
  252. package/dist/providers/gpt-image-size.js.map +1 -0
  253. package/dist/providers/groq-provider.d.ts +9 -12
  254. package/dist/providers/groq-provider.d.ts.map +1 -1
  255. package/dist/providers/groq-provider.js +19 -33
  256. package/dist/providers/groq-provider.js.map +1 -1
  257. package/dist/providers/groq-request.d.ts +38 -0
  258. package/dist/providers/groq-request.d.ts.map +1 -0
  259. package/dist/providers/groq-request.js +138 -0
  260. package/dist/providers/groq-request.js.map +1 -0
  261. package/dist/providers/higgsfield-provider.d.ts +30 -0
  262. package/dist/providers/higgsfield-provider.d.ts.map +1 -0
  263. package/dist/providers/higgsfield-provider.js +131 -0
  264. package/dist/providers/higgsfield-provider.js.map +1 -0
  265. package/dist/providers/higgsfield-transport.d.ts +106 -0
  266. package/dist/providers/higgsfield-transport.d.ts.map +1 -0
  267. package/dist/providers/higgsfield-transport.js +182 -0
  268. package/dist/providers/higgsfield-transport.js.map +1 -0
  269. package/dist/providers/http-transport.d.ts +74 -0
  270. package/dist/providers/http-transport.d.ts.map +1 -0
  271. package/dist/providers/http-transport.js +152 -0
  272. package/dist/providers/http-transport.js.map +1 -0
  273. package/dist/providers/huggingface-provider.d.ts +71 -3
  274. package/dist/providers/huggingface-provider.d.ts.map +1 -1
  275. package/dist/providers/huggingface-provider.js +230 -34
  276. package/dist/providers/huggingface-provider.js.map +1 -1
  277. package/dist/providers/image-mime.d.ts +39 -0
  278. package/dist/providers/image-mime.d.ts.map +1 -0
  279. package/dist/providers/image-mime.js +111 -0
  280. package/dist/providers/image-mime.js.map +1 -0
  281. package/dist/providers/image-ref.d.ts +21 -0
  282. package/dist/providers/image-ref.d.ts.map +1 -0
  283. package/dist/providers/image-ref.js +44 -0
  284. package/dist/providers/image-ref.js.map +1 -0
  285. package/dist/providers/index.d.ts +84 -8
  286. package/dist/providers/index.d.ts.map +1 -1
  287. package/dist/providers/index.js +239 -56
  288. package/dist/providers/index.js.map +1 -1
  289. package/dist/providers/jina-provider.d.ts +10 -2
  290. package/dist/providers/jina-provider.d.ts.map +1 -1
  291. package/dist/providers/jina-provider.js +16 -7
  292. package/dist/providers/jina-provider.js.map +1 -1
  293. package/dist/providers/kie-provider.d.ts +170 -9
  294. package/dist/providers/kie-provider.d.ts.map +1 -1
  295. package/dist/providers/kie-provider.js +1176 -228
  296. package/dist/providers/kie-provider.js.map +1 -1
  297. package/dist/providers/kie-webhook-registry.d.ts +28 -0
  298. package/dist/providers/kie-webhook-registry.d.ts.map +1 -0
  299. package/dist/providers/kie-webhook-registry.js +91 -0
  300. package/dist/providers/kie-webhook-registry.js.map +1 -0
  301. package/dist/providers/llama-provider.d.ts +21 -37
  302. package/dist/providers/llama-provider.d.ts.map +1 -1
  303. package/dist/providers/llama-provider.js +43 -354
  304. package/dist/providers/llama-provider.js.map +1 -1
  305. package/dist/providers/lmstudio-provider.d.ts +4 -7
  306. package/dist/providers/lmstudio-provider.d.ts.map +1 -1
  307. package/dist/providers/lmstudio-provider.js +24 -15
  308. package/dist/providers/lmstudio-provider.js.map +1 -1
  309. package/dist/providers/manifest-models.d.ts +341 -1
  310. package/dist/providers/manifest-models.d.ts.map +1 -1
  311. package/dist/providers/manifest-models.js +1106 -22
  312. package/dist/providers/manifest-models.js.map +1 -1
  313. package/dist/providers/media-mime.d.ts +14 -0
  314. package/dist/providers/media-mime.d.ts.map +1 -0
  315. package/dist/providers/media-mime.js +35 -0
  316. package/dist/providers/media-mime.js.map +1 -0
  317. package/dist/providers/meshy-provider.d.ts +14 -1
  318. package/dist/providers/meshy-provider.d.ts.map +1 -1
  319. package/dist/providers/meshy-provider.js +76 -46
  320. package/dist/providers/meshy-provider.js.map +1 -1
  321. package/dist/providers/meta-provider.d.ts +22 -0
  322. package/dist/providers/meta-provider.d.ts.map +1 -0
  323. package/dist/providers/meta-provider.js +54 -0
  324. package/dist/providers/meta-provider.js.map +1 -0
  325. package/dist/providers/minimax-provider.d.ts +25 -18
  326. package/dist/providers/minimax-provider.d.ts.map +1 -1
  327. package/dist/providers/minimax-provider.js +211 -72
  328. package/dist/providers/minimax-provider.js.map +1 -1
  329. package/dist/providers/mistral-provider.d.ts +6 -12
  330. package/dist/providers/mistral-provider.d.ts.map +1 -1
  331. package/dist/providers/mistral-provider.js +10 -34
  332. package/dist/providers/mistral-provider.js.map +1 -1
  333. package/dist/providers/moonshot-provider.d.ts +11 -15
  334. package/dist/providers/moonshot-provider.d.ts.map +1 -1
  335. package/dist/providers/moonshot-provider.js +33 -23
  336. package/dist/providers/moonshot-provider.js.map +1 -1
  337. package/dist/providers/node-llama-cpp-provider.d.ts +98 -0
  338. package/dist/providers/node-llama-cpp-provider.d.ts.map +1 -0
  339. package/dist/providers/node-llama-cpp-provider.js +479 -0
  340. package/dist/providers/node-llama-cpp-provider.js.map +1 -0
  341. package/dist/providers/nodetool-provider.d.ts +49 -0
  342. package/dist/providers/nodetool-provider.d.ts.map +1 -0
  343. package/dist/providers/nodetool-provider.js +224 -0
  344. package/dist/providers/nodetool-provider.js.map +1 -0
  345. package/dist/providers/oauth/browser-launcher.d.ts +23 -0
  346. package/dist/providers/oauth/browser-launcher.d.ts.map +1 -0
  347. package/dist/providers/oauth/browser-launcher.js +45 -0
  348. package/dist/providers/oauth/browser-launcher.js.map +1 -0
  349. package/dist/providers/oauth/claude-code-credentials.d.ts +74 -0
  350. package/dist/providers/oauth/claude-code-credentials.d.ts.map +1 -0
  351. package/dist/providers/oauth/claude-code-credentials.js +133 -0
  352. package/dist/providers/oauth/claude-code-credentials.js.map +1 -0
  353. package/dist/providers/oauth/claude-code-login.d.ts +124 -0
  354. package/dist/providers/oauth/claude-code-login.d.ts.map +1 -0
  355. package/dist/providers/oauth/claude-code-login.js +230 -0
  356. package/dist/providers/oauth/claude-code-login.js.map +1 -0
  357. package/dist/providers/oauth/claude-code-oauth-client.d.ts +111 -0
  358. package/dist/providers/oauth/claude-code-oauth-client.d.ts.map +1 -0
  359. package/dist/providers/oauth/claude-code-oauth-client.js +207 -0
  360. package/dist/providers/oauth/claude-code-oauth-client.js.map +1 -0
  361. package/dist/providers/oauth/errors.d.ts +54 -0
  362. package/dist/providers/oauth/errors.d.ts.map +1 -0
  363. package/dist/providers/oauth/errors.js +79 -0
  364. package/dist/providers/oauth/errors.js.map +1 -0
  365. package/dist/providers/oauth/index.d.ts +105 -0
  366. package/dist/providers/oauth/index.d.ts.map +1 -0
  367. package/dist/providers/oauth/index.js +167 -0
  368. package/dist/providers/oauth/index.js.map +1 -0
  369. package/dist/providers/oauth/jwt-claims.d.ts +23 -0
  370. package/dist/providers/oauth/jwt-claims.d.ts.map +1 -0
  371. package/dist/providers/oauth/jwt-claims.js +67 -0
  372. package/dist/providers/oauth/jwt-claims.js.map +1 -0
  373. package/dist/providers/oauth/local-callback-server.d.ts +60 -0
  374. package/dist/providers/oauth/local-callback-server.d.ts.map +1 -0
  375. package/dist/providers/oauth/local-callback-server.js +148 -0
  376. package/dist/providers/oauth/local-callback-server.js.map +1 -0
  377. package/dist/providers/oauth/oauth-client.d.ts +55 -0
  378. package/dist/providers/oauth/oauth-client.d.ts.map +1 -0
  379. package/dist/providers/oauth/oauth-client.js +161 -0
  380. package/dist/providers/oauth/oauth-client.js.map +1 -0
  381. package/dist/providers/oauth/openai-oauth-provider.d.ts +129 -0
  382. package/dist/providers/oauth/openai-oauth-provider.d.ts.map +1 -0
  383. package/dist/providers/oauth/openai-oauth-provider.js +265 -0
  384. package/dist/providers/oauth/openai-oauth-provider.js.map +1 -0
  385. package/dist/providers/oauth/pkce-helper.d.ts +43 -0
  386. package/dist/providers/oauth/pkce-helper.d.ts.map +1 -0
  387. package/dist/providers/oauth/pkce-helper.js +57 -0
  388. package/dist/providers/oauth/pkce-helper.js.map +1 -0
  389. package/dist/providers/oauth/redaction.d.ts +22 -0
  390. package/dist/providers/oauth/redaction.d.ts.map +1 -0
  391. package/dist/providers/oauth/redaction.js +59 -0
  392. package/dist/providers/oauth/redaction.js.map +1 -0
  393. package/dist/providers/oauth/secure-credential-store.d.ts +67 -0
  394. package/dist/providers/oauth/secure-credential-store.d.ts.map +1 -0
  395. package/dist/providers/oauth/secure-credential-store.js +73 -0
  396. package/dist/providers/oauth/secure-credential-store.js.map +1 -0
  397. package/dist/providers/oauth/token-store.d.ts +53 -0
  398. package/dist/providers/oauth/token-store.d.ts.map +1 -0
  399. package/dist/providers/oauth/token-store.js +78 -0
  400. package/dist/providers/oauth/token-store.js.map +1 -0
  401. package/dist/providers/oauth/types.d.ts +64 -0
  402. package/dist/providers/oauth/types.d.ts.map +1 -0
  403. package/dist/providers/oauth/types.js +12 -0
  404. package/dist/providers/oauth/types.js.map +1 -0
  405. package/dist/providers/object-tracking.d.ts +47 -0
  406. package/dist/providers/object-tracking.d.ts.map +1 -0
  407. package/dist/providers/object-tracking.js +46 -0
  408. package/dist/providers/object-tracking.js.map +1 -0
  409. package/dist/providers/offline-model-index.d.ts +20 -0
  410. package/dist/providers/offline-model-index.d.ts.map +1 -0
  411. package/dist/providers/offline-model-index.js +112 -0
  412. package/dist/providers/offline-model-index.js.map +1 -0
  413. package/dist/providers/ollama-provider.d.ts +28 -1
  414. package/dist/providers/ollama-provider.d.ts.map +1 -1
  415. package/dist/providers/ollama-provider.js +193 -43
  416. package/dist/providers/ollama-provider.js.map +1 -1
  417. package/dist/providers/openai-compat/client.d.ts +57 -0
  418. package/dist/providers/openai-compat/client.d.ts.map +1 -0
  419. package/dist/providers/openai-compat/client.js +157 -0
  420. package/dist/providers/openai-compat/client.js.map +1 -0
  421. package/dist/providers/openai-compat/decode.d.ts +36 -0
  422. package/dist/providers/openai-compat/decode.d.ts.map +1 -0
  423. package/dist/providers/openai-compat/decode.js +55 -0
  424. package/dist/providers/openai-compat/decode.js.map +1 -0
  425. package/dist/providers/openai-compat/errors.d.ts +54 -0
  426. package/dist/providers/openai-compat/errors.d.ts.map +1 -0
  427. package/dist/providers/openai-compat/errors.js +144 -0
  428. package/dist/providers/openai-compat/errors.js.map +1 -0
  429. package/dist/providers/openai-compat/index.d.ts +8 -0
  430. package/dist/providers/openai-compat/index.d.ts.map +1 -0
  431. package/dist/providers/openai-compat/index.js +5 -0
  432. package/dist/providers/openai-compat/index.js.map +1 -0
  433. package/dist/providers/openai-compat/sse.d.ts +14 -0
  434. package/dist/providers/openai-compat/sse.d.ts.map +1 -0
  435. package/dist/providers/openai-compat/sse.js +69 -0
  436. package/dist/providers/openai-compat/sse.js.map +1 -0
  437. package/dist/providers/openai-compat/types.d.ts +75 -0
  438. package/dist/providers/openai-compat/types.d.ts.map +1 -0
  439. package/dist/providers/openai-compat/types.js +9 -0
  440. package/dist/providers/openai-compat/types.js.map +1 -0
  441. package/dist/providers/openai-compat-provider.d.ts +90 -0
  442. package/dist/providers/openai-compat-provider.d.ts.map +1 -0
  443. package/dist/providers/openai-compat-provider.js +282 -0
  444. package/dist/providers/openai-compat-provider.js.map +1 -0
  445. package/dist/providers/openai-provider.d.ts +89 -26
  446. package/dist/providers/openai-provider.d.ts.map +1 -1
  447. package/dist/providers/openai-provider.js +990 -105
  448. package/dist/providers/openai-provider.js.map +1 -1
  449. package/dist/providers/openrouter-provider.d.ts +6 -12
  450. package/dist/providers/openrouter-provider.d.ts.map +1 -1
  451. package/dist/providers/openrouter-provider.js +24 -53
  452. package/dist/providers/openrouter-provider.js.map +1 -1
  453. package/dist/providers/provider-call-failure.d.ts +39 -0
  454. package/dist/providers/provider-call-failure.d.ts.map +1 -0
  455. package/dist/providers/provider-call-failure.js +132 -0
  456. package/dist/providers/provider-call-failure.js.map +1 -0
  457. package/dist/providers/provider-error.d.ts +59 -0
  458. package/dist/providers/provider-error.d.ts.map +1 -0
  459. package/dist/providers/provider-error.js +165 -0
  460. package/dist/providers/provider-error.js.map +1 -0
  461. package/dist/providers/provider-generations.d.ts +99 -0
  462. package/dist/providers/provider-generations.d.ts.map +1 -0
  463. package/dist/providers/provider-generations.js +71 -0
  464. package/dist/providers/provider-generations.js.map +1 -0
  465. package/dist/providers/provider-queue.d.ts +62 -0
  466. package/dist/providers/provider-queue.d.ts.map +1 -0
  467. package/dist/providers/provider-queue.js +28 -0
  468. package/dist/providers/provider-queue.js.map +1 -0
  469. package/dist/providers/provider-registry.d.ts +33 -14
  470. package/dist/providers/provider-registry.d.ts.map +1 -1
  471. package/dist/providers/provider-registry.js +85 -68
  472. package/dist/providers/provider-registry.js.map +1 -1
  473. package/dist/providers/provider-request-log.d.ts +53 -0
  474. package/dist/providers/provider-request-log.d.ts.map +1 -0
  475. package/dist/providers/provider-request-log.js +157 -0
  476. package/dist/providers/provider-request-log.js.map +1 -0
  477. package/dist/providers/provider-session.d.ts +3 -0
  478. package/dist/providers/provider-session.d.ts.map +1 -0
  479. package/dist/providers/provider-session.js +10 -0
  480. package/dist/providers/provider-session.js.map +1 -0
  481. package/dist/providers/provider-transport.d.ts +11 -0
  482. package/dist/providers/provider-transport.d.ts.map +1 -0
  483. package/dist/providers/provider-transport.js +11 -0
  484. package/dist/providers/provider-transport.js.map +1 -0
  485. package/dist/providers/python-provider.d.ts +20 -12
  486. package/dist/providers/python-provider.d.ts.map +1 -1
  487. package/dist/providers/python-provider.js +185 -25
  488. package/dist/providers/python-provider.js.map +1 -1
  489. package/dist/providers/replicate-provider.d.ts +89 -7
  490. package/dist/providers/replicate-provider.d.ts.map +1 -1
  491. package/dist/providers/replicate-provider.js +801 -65
  492. package/dist/providers/replicate-provider.js.map +1 -1
  493. package/dist/providers/replicate-retry.d.ts +30 -0
  494. package/dist/providers/replicate-retry.d.ts.map +1 -0
  495. package/dist/providers/replicate-retry.js +97 -0
  496. package/dist/providers/replicate-retry.js.map +1 -0
  497. package/dist/providers/responses-api.d.ts +27 -0
  498. package/dist/providers/responses-api.d.ts.map +1 -0
  499. package/dist/providers/responses-api.js +297 -0
  500. package/dist/providers/responses-api.js.map +1 -0
  501. package/dist/providers/reve-provider.d.ts +45 -0
  502. package/dist/providers/reve-provider.d.ts.map +1 -0
  503. package/dist/providers/reve-provider.js +159 -0
  504. package/dist/providers/reve-provider.js.map +1 -0
  505. package/dist/providers/rodin-provider.d.ts +23 -1
  506. package/dist/providers/rodin-provider.d.ts.map +1 -1
  507. package/dist/providers/rodin-provider.js +89 -51
  508. package/dist/providers/rodin-provider.js.map +1 -1
  509. package/dist/providers/safe-url.d.ts +70 -0
  510. package/dist/providers/safe-url.d.ts.map +1 -0
  511. package/dist/providers/safe-url.js +277 -0
  512. package/dist/providers/safe-url.js.map +1 -0
  513. package/dist/providers/scripted-provider.d.ts +9 -0
  514. package/dist/providers/scripted-provider.d.ts.map +1 -1
  515. package/dist/providers/scripted-provider.js +86 -10
  516. package/dist/providers/scripted-provider.js.map +1 -1
  517. package/dist/providers/structured-output.d.ts +42 -0
  518. package/dist/providers/structured-output.d.ts.map +1 -0
  519. package/dist/providers/structured-output.js +83 -0
  520. package/dist/providers/structured-output.js.map +1 -0
  521. package/dist/providers/together-provider.d.ts +19 -16
  522. package/dist/providers/together-provider.d.ts.map +1 -1
  523. package/dist/providers/together-provider.js +103 -225
  524. package/dist/providers/together-provider.js.map +1 -1
  525. package/dist/providers/topaz-provider.d.ts +44 -0
  526. package/dist/providers/topaz-provider.d.ts.map +1 -0
  527. package/dist/providers/topaz-provider.js +239 -0
  528. package/dist/providers/topaz-provider.js.map +1 -0
  529. package/dist/providers/types.d.ts +603 -4
  530. package/dist/providers/types.d.ts.map +1 -1
  531. package/dist/providers/types.js +81 -1
  532. package/dist/providers/types.js.map +1 -1
  533. package/dist/providers/useapi-provider.d.ts +27 -0
  534. package/dist/providers/useapi-provider.d.ts.map +1 -0
  535. package/dist/providers/useapi-provider.js +266 -0
  536. package/dist/providers/useapi-provider.js.map +1 -0
  537. package/dist/providers/video-duration.d.ts +6 -0
  538. package/dist/providers/video-duration.d.ts.map +1 -0
  539. package/dist/providers/video-duration.js +63 -0
  540. package/dist/providers/video-duration.js.map +1 -0
  541. package/dist/providers/video-frame-fallback.d.ts +39 -0
  542. package/dist/providers/video-frame-fallback.d.ts.map +1 -0
  543. package/dist/providers/video-frame-fallback.js +155 -0
  544. package/dist/providers/video-frame-fallback.js.map +1 -0
  545. package/dist/providers/video-frames.d.ts +61 -0
  546. package/dist/providers/video-frames.d.ts.map +1 -0
  547. package/dist/providers/video-frames.js +208 -0
  548. package/dist/providers/video-frames.js.map +1 -0
  549. package/dist/providers/video-mime.d.ts +14 -0
  550. package/dist/providers/video-mime.d.ts.map +1 -0
  551. package/dist/providers/video-mime.js +44 -0
  552. package/dist/providers/video-mime.js.map +1 -0
  553. package/dist/providers/video-to-audio.d.ts +34 -0
  554. package/dist/providers/video-to-audio.d.ts.map +1 -0
  555. package/dist/providers/video-to-audio.js +62 -0
  556. package/dist/providers/video-to-audio.js.map +1 -0
  557. package/dist/providers/vllm-provider.d.ts +22 -8
  558. package/dist/providers/vllm-provider.d.ts.map +1 -1
  559. package/dist/providers/vllm-provider.js +48 -23
  560. package/dist/providers/vllm-provider.js.map +1 -1
  561. package/dist/providers/voyage-provider.d.ts +10 -2
  562. package/dist/providers/voyage-provider.d.ts.map +1 -1
  563. package/dist/providers/voyage-provider.js +16 -7
  564. package/dist/providers/voyage-provider.js.map +1 -1
  565. package/dist/providers/xai-provider.d.ts +54 -13
  566. package/dist/providers/xai-provider.d.ts.map +1 -1
  567. package/dist/providers/xai-provider.js +299 -22
  568. package/dist/providers/xai-provider.js.map +1 -1
  569. package/dist/python-bridge-base.d.ts +358 -0
  570. package/dist/python-bridge-base.d.ts.map +1 -0
  571. package/dist/python-bridge-base.js +1557 -0
  572. package/dist/python-bridge-base.js.map +1 -0
  573. package/dist/python-bridge-codec.d.ts +28 -0
  574. package/dist/python-bridge-codec.d.ts.map +1 -0
  575. package/dist/python-bridge-codec.js +39 -0
  576. package/dist/python-bridge-codec.js.map +1 -0
  577. package/dist/python-bridge-factory.d.ts +52 -0
  578. package/dist/python-bridge-factory.d.ts.map +1 -0
  579. package/dist/python-bridge-factory.js +69 -0
  580. package/dist/python-bridge-factory.js.map +1 -0
  581. package/dist/python-bridge-framing.d.ts +68 -0
  582. package/dist/python-bridge-framing.d.ts.map +1 -0
  583. package/dist/python-bridge-framing.js +91 -0
  584. package/dist/python-bridge-framing.js.map +1 -0
  585. package/dist/python-bridge-types.d.ts +545 -2
  586. package/dist/python-bridge-types.d.ts.map +1 -1
  587. package/dist/python-bridge-types.js +49 -1
  588. package/dist/python-bridge-types.js.map +1 -1
  589. package/dist/python-graph-resolver.d.ts +57 -0
  590. package/dist/python-graph-resolver.d.ts.map +1 -0
  591. package/dist/python-graph-resolver.js +79 -0
  592. package/dist/python-graph-resolver.js.map +1 -0
  593. package/dist/python-node-executor.d.ts +36 -4
  594. package/dist/python-node-executor.d.ts.map +1 -1
  595. package/dist/python-node-executor.js +177 -86
  596. package/dist/python-node-executor.js.map +1 -1
  597. package/dist/python-stdio-bridge.d.ts +18 -37
  598. package/dist/python-stdio-bridge.d.ts.map +1 -1
  599. package/dist/python-stdio-bridge.js +148 -475
  600. package/dist/python-stdio-bridge.js.map +1 -1
  601. package/dist/python-websocket-bridge.d.ts +140 -0
  602. package/dist/python-websocket-bridge.d.ts.map +1 -0
  603. package/dist/python-websocket-bridge.js +561 -0
  604. package/dist/python-websocket-bridge.js.map +1 -0
  605. package/dist/python-worker-stderr.d.ts +4 -0
  606. package/dist/python-worker-stderr.d.ts.map +1 -0
  607. package/dist/python-worker-stderr.js +24 -0
  608. package/dist/python-worker-stderr.js.map +1 -0
  609. package/dist/recommended-models.d.ts +2 -2
  610. package/dist/recommended-models.d.ts.map +1 -1
  611. package/dist/recommended-models.js +24 -4
  612. package/dist/recommended-models.js.map +1 -1
  613. package/dist/recoverable-node-error.d.ts +31 -0
  614. package/dist/recoverable-node-error.d.ts.map +1 -0
  615. package/dist/recoverable-node-error.js +37 -0
  616. package/dist/recoverable-node-error.js.map +1 -0
  617. package/dist/redact-params.d.ts +13 -0
  618. package/dist/redact-params.d.ts.map +1 -0
  619. package/dist/redact-params.js +57 -0
  620. package/dist/redact-params.js.map +1 -0
  621. package/dist/sandbox-module-catalog.d.ts +43 -0
  622. package/dist/sandbox-module-catalog.d.ts.map +1 -0
  623. package/dist/sandbox-module-catalog.js +25 -0
  624. package/dist/sandbox-module-catalog.js.map +1 -0
  625. package/dist/storage-workspace.d.ts +59 -0
  626. package/dist/storage-workspace.d.ts.map +1 -0
  627. package/dist/storage-workspace.js +426 -0
  628. package/dist/storage-workspace.js.map +1 -0
  629. package/dist/swappable-python-bridge.d.ts +83 -0
  630. package/dist/swappable-python-bridge.d.ts.map +1 -0
  631. package/dist/swappable-python-bridge.js +246 -0
  632. package/dist/swappable-python-bridge.js.map +1 -0
  633. package/dist/telemetry.d.ts +7 -0
  634. package/dist/telemetry.d.ts.map +1 -1
  635. package/dist/telemetry.js +23 -0
  636. package/dist/telemetry.js.map +1 -1
  637. package/dist/testing.d.ts +81 -0
  638. package/dist/testing.d.ts.map +1 -0
  639. package/dist/testing.js +130 -0
  640. package/dist/testing.js.map +1 -0
  641. package/dist/token-counter.d.ts +30 -0
  642. package/dist/token-counter.d.ts.map +1 -0
  643. package/dist/token-counter.js +156 -0
  644. package/dist/token-counter.js.map +1 -0
  645. package/dist/trace-exporters.d.ts +10 -0
  646. package/dist/trace-exporters.d.ts.map +1 -1
  647. package/dist/trace-exporters.js +59 -20
  648. package/dist/trace-exporters.js.map +1 -1
  649. package/dist/tracing-helpers.d.ts +45 -4
  650. package/dist/tracing-helpers.d.ts.map +1 -1
  651. package/dist/tracing-helpers.js +62 -19
  652. package/dist/tracing-helpers.js.map +1 -1
  653. package/dist/turn-budget.d.ts +278 -0
  654. package/dist/turn-budget.d.ts.map +1 -0
  655. package/dist/turn-budget.js +365 -0
  656. package/dist/turn-budget.js.map +1 -0
  657. package/dist/variable-channel.d.ts +48 -0
  658. package/dist/variable-channel.d.ts.map +1 -0
  659. package/dist/variable-channel.js +110 -0
  660. package/dist/variable-channel.js.map +1 -0
  661. package/dist/workspace.d.ts +119 -0
  662. package/dist/workspace.d.ts.map +1 -0
  663. package/dist/workspace.js +112 -0
  664. package/dist/workspace.js.map +1 -0
  665. package/package.json +107 -19
@@ -1,2 +1,50 @@
1
- export {};
1
+ import { z } from "zod";
2
+ // ---------------------------------------------------------------------------
3
+ // Wire readers
4
+ // ---------------------------------------------------------------------------
5
+ //
6
+ // The bridge decodes msgpack, so a worker reply arrives as an untyped record.
7
+ // These readers turn one into the declared shape. Every field carries its own
8
+ // `.catch`, so a reply is never rejected: a field the worker omits or sends in
9
+ // the wrong type falls back to the value below instead of riding on mistyped.
10
+ // That is the one behavior change from the assertions these replaced — before,
11
+ // a malformed field reached callers as if it were valid.
12
+ export const comfyStatusInfoSchema = z
13
+ .object({
14
+ enabled: z.boolean().catch(false),
15
+ url: z.string().optional().catch(undefined),
16
+ reachable: z.boolean().optional().catch(undefined),
17
+ system_stats: z.record(z.string(), z.unknown()).optional().catch(undefined),
18
+ queue_remaining: z.number().optional().catch(undefined),
19
+ error: z.string().optional().catch(undefined),
20
+ api_v2: z.boolean().optional().catch(undefined)
21
+ })
22
+ .loose();
23
+ export const blenderStatusInfoSchema = z
24
+ .object({
25
+ enabled: z.boolean().catch(false),
26
+ version: z.string().optional().catch(undefined),
27
+ error: z.string().optional().catch(undefined)
28
+ })
29
+ .loose();
30
+ /**
31
+ * Load errors are forwarded verbatim: the entry shape varies by worker version
32
+ * (older workers key them by `node_type`), and every consumer only displays
33
+ * them, so narrowing here would drop fields rather than protect anyone.
34
+ */
35
+ const workerLoadErrorSchema = z.custom();
36
+ export const workerStatusSchema = z
37
+ .object({
38
+ protocol_version: z.number().catch(0),
39
+ node_count: z.number().catch(0),
40
+ provider_count: z.number().catch(0),
41
+ namespaces: z.array(z.string()).catch([]),
42
+ load_errors: z.array(workerLoadErrorSchema).catch([]),
43
+ transport: z.string().catch(""),
44
+ max_frame_size: z.number().catch(0),
45
+ model_prepare_backends: z.array(z.string()).catch([]),
46
+ comfy: comfyStatusInfoSchema.optional().catch(undefined),
47
+ blender: blenderStatusInfoSchema.optional().catch(undefined)
48
+ })
49
+ .loose();
2
50
  //# sourceMappingURL=python-bridge-types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"python-bridge-types.js","sourceRoot":"","sources":["../src/python-bridge-types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"python-bridge-types.js","sourceRoot":"","sources":["../src/python-bridge-types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmuBxB,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAC9E,EAAE;AACF,8EAA8E;AAC9E,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,yDAAyD;AAEzD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC;KACnC,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;IACjC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IAC3C,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IAClD,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IAC3E,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IACvD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IAC7C,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;CAChD,CAAC;KACD,KAAK,EAAE,CAAC;AAEX,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC;KACrC,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;IACjC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IAC/C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;CAC9C,CAAC;KACD,KAAK,EAAE,CAAC;AAEX;;;;GAIG;AACH,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,EAAyB,CAAC;AAEhE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC;KAChC,MAAM,CAAC;IACN,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IACzC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IACrD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,sBAAsB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IACrD,KAAK,EAAE,qBAAqB,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IACxD,OAAO,EAAE,uBAAuB,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;CAC7D,CAAC;KACD,KAAK,EAAE,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Python-worker support for graphs executed OUTSIDE the websocket server.
3
+ *
4
+ * The websocket server wires the Python bridge into its own `resolveExecutor`
5
+ * (see packages/websocket/src/plugins/websocket.ts). In-process runners — the
6
+ * `nodetool run` / `nodetool workflows run` CLI commands and the DSL `run()` —
7
+ * had no such wiring, so any Python worker node failed with "Unknown node
8
+ * type". These helpers give those runners the same capability.
9
+ *
10
+ * Transport is chosen by {@link createPythonBridge}: when `NODETOOL_WORKER_URL`
11
+ * (optionally with `NODETOOL_WORKER_TOKEN`) is set, a remote WebSocket worker is
12
+ * used; otherwise a local stdio worker is spawned.
13
+ */
14
+ import { PythonNodeExecutor } from "./python-node-executor.js";
15
+ import type { PythonBridgeBase } from "./python-bridge-base.js";
16
+ import type { PythonBridgeOptions } from "./python-bridge-types.js";
17
+ /** Minimal graph-node shape the resolver needs. */
18
+ interface GraphNodeLike {
19
+ id: string;
20
+ type: string;
21
+ properties?: Record<string, unknown>;
22
+ data?: Record<string, unknown>;
23
+ }
24
+ /**
25
+ * Connect a Python worker bridge for a graph, but ONLY when the graph contains a
26
+ * node type the TS registry cannot resolve (a candidate Python node). Pure-TS
27
+ * graphs get no bridge — no worker spawned, no remote connection — preserving
28
+ * the prior behavior and cost for workflows that don't need Python.
29
+ *
30
+ * Failure handling depends on whether a remote worker was explicitly requested:
31
+ * - `NODETOOL_WORKER_URL` set → a connect failure is surfaced (the caller asked
32
+ * for a specific remote worker, so a silent fallthrough would hide a real
33
+ * misconfiguration).
34
+ * - unset (local stdio attempt) → a connect failure returns `null` and is
35
+ * logged, so an unresolved node still reports the normal "Unknown node type"
36
+ * error rather than a confusing worker-spawn error.
37
+ *
38
+ * The caller owns the returned bridge and MUST `close()` it after the run.
39
+ *
40
+ * @param nodes The graph nodes (only `.type` is read).
41
+ * @param hasTsExecutor Predicate: can the in-process TS registry resolve a type?
42
+ * @param options Bridge options forwarded to {@link createPythonBridge}.
43
+ * @returns The connected bridge, or `null` when no Python node is present (or a
44
+ * local worker was unavailable).
45
+ */
46
+ export declare function connectPythonBridgeForGraph(nodes: ReadonlyArray<{
47
+ type?: unknown;
48
+ }>, hasTsExecutor: (nodeType: string) => boolean, options?: PythonBridgeOptions): Promise<PythonBridgeBase | null>;
49
+ /**
50
+ * Build a {@link PythonNodeExecutor} for a node when the bridge advertises its
51
+ * type, mirroring the websocket server's `resolveExecutor`. Returns `null` when
52
+ * there is no bridge or the bridge does not know the node type, so the caller
53
+ * can fall through to its own "unknown node type" error.
54
+ */
55
+ export declare function resolvePythonNodeExecutor(bridge: PythonBridgeBase | null, node: GraphNodeLike): PythonNodeExecutor | null;
56
+ export {};
57
+ //# sourceMappingURL=python-graph-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-graph-resolver.d.ts","sourceRoot":"","sources":["../src/python-graph-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAKpE,mDAAmD;AACnD,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,aAAa,CAAC;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EACxC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,EAC5C,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA2BlC;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,gBAAgB,GAAG,IAAI,EAC/B,IAAI,EAAE,aAAa,GAClB,kBAAkB,GAAG,IAAI,CAoB3B"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Python-worker support for graphs executed OUTSIDE the websocket server.
3
+ *
4
+ * The websocket server wires the Python bridge into its own `resolveExecutor`
5
+ * (see packages/websocket/src/plugins/websocket.ts). In-process runners — the
6
+ * `nodetool run` / `nodetool workflows run` CLI commands and the DSL `run()` —
7
+ * had no such wiring, so any Python worker node failed with "Unknown node
8
+ * type". These helpers give those runners the same capability.
9
+ *
10
+ * Transport is chosen by {@link createPythonBridge}: when `NODETOOL_WORKER_URL`
11
+ * (optionally with `NODETOOL_WORKER_TOKEN`) is set, a remote WebSocket worker is
12
+ * used; otherwise a local stdio worker is spawned.
13
+ */
14
+ import { createLogger } from "@nodetool-ai/config";
15
+ import { createPythonBridge } from "./python-bridge-factory.js";
16
+ import { PythonNodeExecutor } from "./python-node-executor.js";
17
+ import { isNonEmptyString } from "@nodetool-ai/protocol";
18
+ const log = createLogger("nodetool.runtime.python-graph-resolver");
19
+ /**
20
+ * Connect a Python worker bridge for a graph, but ONLY when the graph contains a
21
+ * node type the TS registry cannot resolve (a candidate Python node). Pure-TS
22
+ * graphs get no bridge — no worker spawned, no remote connection — preserving
23
+ * the prior behavior and cost for workflows that don't need Python.
24
+ *
25
+ * Failure handling depends on whether a remote worker was explicitly requested:
26
+ * - `NODETOOL_WORKER_URL` set → a connect failure is surfaced (the caller asked
27
+ * for a specific remote worker, so a silent fallthrough would hide a real
28
+ * misconfiguration).
29
+ * - unset (local stdio attempt) → a connect failure returns `null` and is
30
+ * logged, so an unresolved node still reports the normal "Unknown node type"
31
+ * error rather than a confusing worker-spawn error.
32
+ *
33
+ * The caller owns the returned bridge and MUST `close()` it after the run.
34
+ *
35
+ * @param nodes The graph nodes (only `.type` is read).
36
+ * @param hasTsExecutor Predicate: can the in-process TS registry resolve a type?
37
+ * @param options Bridge options forwarded to {@link createPythonBridge}.
38
+ * @returns The connected bridge, or `null` when no Python node is present (or a
39
+ * local worker was unavailable).
40
+ */
41
+ export async function connectPythonBridgeForGraph(nodes, hasTsExecutor, options) {
42
+ const needsPython = nodes.some((n) => isNonEmptyString(n.type) && !hasTsExecutor(n.type));
43
+ if (!needsPython)
44
+ return null;
45
+ const wsUrl = options?.wsUrl ?? process.env["NODETOOL_WORKER_URL"];
46
+ const bridge = createPythonBridge(options);
47
+ try {
48
+ await bridge.connect();
49
+ return bridge;
50
+ }
51
+ catch (err) {
52
+ bridge.close();
53
+ if (wsUrl && wsUrl.trim()) {
54
+ // Remote worker explicitly requested — surface the failure.
55
+ throw err;
56
+ }
57
+ // No remote configured and a local worker isn't available here; fall
58
+ // through so unresolved node types report the normal error.
59
+ log.warn(`Python worker bridge unavailable; Python nodes will be unresolved: ${String(err)}`);
60
+ return null;
61
+ }
62
+ }
63
+ /**
64
+ * Build a {@link PythonNodeExecutor} for a node when the bridge advertises its
65
+ * type, mirroring the websocket server's `resolveExecutor`. Returns `null` when
66
+ * there is no bridge or the bridge does not know the node type, so the caller
67
+ * can fall through to its own "unknown node type" error.
68
+ */
69
+ export function resolvePythonNodeExecutor(bridge, node) {
70
+ if (!bridge || !bridge.hasNodeType(node.type))
71
+ return null;
72
+ const meta = bridge
73
+ .getNodeMetadata()
74
+ .find((m) => m.node_type === node.type);
75
+ const props = node.properties ?? node.data ?? {};
76
+ const outputTypes = Object.fromEntries((meta?.outputs ?? []).map((o) => [o.name, o.type.type]));
77
+ return new PythonNodeExecutor(bridge, node.type, props, outputTypes, meta?.required_settings ?? [], node.id, meta?.requires_vram_gb);
78
+ }
79
+ //# sourceMappingURL=python-graph-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-graph-resolver.js","sourceRoot":"","sources":["../src/python-graph-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,GAAG,GAAG,YAAY,CAAC,wCAAwC,CAAC,CAAC;AAUnE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,KAAwC,EACxC,aAA4C,EAC5C,OAA6B;IAE7B,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,EAAE,CACJ,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CACrD,CAAC;IACF,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAE9B,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1B,4DAA4D;YAC5D,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,qEAAqE;QACrE,4DAA4D;QAC5D,GAAG,CAAC,IAAI,CACN,sEAAsE,MAAM,CAC1E,GAAG,CACJ,EAAE,CACJ,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAA+B,EAC/B,IAAmB;IAEnB,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3D,MAAM,IAAI,GAAG,MAAM;SAChB,eAAe,EAAE;SACjB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IACjD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CACpC,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACxD,CAAC;IAEF,OAAO,IAAI,kBAAkB,CAC3B,MAAM,EACN,IAAI,CAAC,IAAI,EACT,KAAK,EACL,WAAW,EACX,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAC7B,IAAI,CAAC,EAAE,EACP,IAAI,EAAE,gBAAgB,CACvB,CAAC;AACJ,CAAC"}
@@ -1,16 +1,48 @@
1
1
  import type { ProcessingContext } from "./context.js";
2
- import type { ExecuteInputBlobs, ExecuteResult, ProgressEvent } from "./python-bridge-types.js";
2
+ import type { ExecuteIdentity, ExecuteInputBlobs, ExecuteResult, ProgressEvent } from "./python-bridge-types.js";
3
3
  /** Minimal interface for the local Python stdio bridge. */
4
4
  interface PythonBridgeLike {
5
- execute(nodeType: string, fields: Record<string, unknown>, secrets: Record<string, string>, blobs: ExecuteInputBlobs, onProgress?: (event: ProgressEvent) => void): Promise<ExecuteResult>;
6
- executeStream?(nodeType: string, fields: Record<string, unknown>, secrets: Record<string, string>, blobs: ExecuteInputBlobs, onProgress?: (event: ProgressEvent) => void): AsyncGenerator<ExecuteResult>;
5
+ execute(nodeType: string, fields: Record<string, unknown>, secrets: Record<string, string>, blobs: ExecuteInputBlobs, onProgress?: (event: ProgressEvent) => void, identity?: ExecuteIdentity): Promise<ExecuteResult>;
6
+ executeStream?(nodeType: string, fields: Record<string, unknown>, secrets: Record<string, string>, blobs: ExecuteInputBlobs, onProgress?: (event: ProgressEvent) => void, identity?: ExecuteIdentity): AsyncGenerator<ExecuteResult>;
7
7
  }
8
8
  export declare class PythonNodeExecutor {
9
9
  private bridge;
10
10
  private nodeType;
11
11
  private outputTypes;
12
12
  private requiredSettings;
13
- constructor(bridge: PythonBridgeLike, nodeType: string, _properties: Record<string, unknown>, outputTypes: Record<string, string>, requiredSettings: string[]);
13
+ /** Graph node id, used to surface Python worker progress as node_progress. */
14
+ private nodeId?;
15
+ /**
16
+ * VRAM hint from this node type's `discover` metadata, forwarded on every
17
+ * execute so the worker can size its reclaim pass. Absent for a worker
18
+ * that does not report one.
19
+ */
20
+ private requiresVramGb?;
21
+ constructor(bridge: PythonBridgeLike, nodeType: string, _properties: Record<string, unknown>, outputTypes: Record<string, string>, requiredSettings: string[],
22
+ /** Graph node id, used to surface Python worker progress as node_progress. */
23
+ nodeId?: string | undefined,
24
+ /**
25
+ * VRAM hint from this node type's `discover` metadata, forwarded on every
26
+ * execute so the worker can size its reclaim pass. Absent for a worker
27
+ * that does not report one.
28
+ */
29
+ requiresVramGb?: number | undefined);
30
+ /**
31
+ * Run identity for the `execute` payload (bridge protocol v4).
32
+ *
33
+ * Before v4 the worker saw an unlabeled stream of single-node executions: it
34
+ * constructed every node with no id, so `self._id` was `""` for all of them
35
+ * and its node → model map collapsed into one bucket. `node_id` is what makes
36
+ * that map real; `job_id` is what pairs the execution with the `job.end`
37
+ * boundary that releases it.
38
+ */
39
+ private identity;
40
+ /**
41
+ * Build an onProgress sink that forwards the Python worker's progress events
42
+ * to the context message stream as `node_progress`. Returns undefined when we
43
+ * lack the context or node id needed to address the message.
44
+ */
45
+ private progressHandler;
14
46
  private prepareExecution;
15
47
  private materializeOutputs;
16
48
  process(inputs: Record<string, unknown>, context?: ProcessingContext): Promise<Record<string, unknown>>;
@@ -1 +1 @@
1
- {"version":3,"file":"python-node-executor.d.ts","sourceRoot":"","sources":["../src/python-node-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EACV,iBAAiB,EACjB,aAAa,EACb,aAAa,EACd,MAAM,0BAA0B,CAAC;AAKlC,2DAA2D;AAC3D,UAAU,gBAAgB;IACxB,OAAO,CACL,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,KAAK,EAAE,iBAAiB,EACxB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GAC1C,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,aAAa,CAAC,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,KAAK,EAAE,iBAAiB,EACxB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GAC1C,cAAc,CAAC,aAAa,CAAC,CAAC;CAClC;AAgJD,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IAEhB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,gBAAgB;gBAJhB,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,gBAAgB,EAAE,MAAM,EAAE;YAGtB,gBAAgB;YAyEhB,kBAAkB;IAwB1B,OAAO,CACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAY5B,UAAU,CACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAiB3C"}
1
+ {"version":3,"file":"python-node-executor.d.ts","sourceRoot":"","sources":["../src/python-node-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,aAAa,EACd,MAAM,0BAA0B,CAAC;AAOlC,2DAA2D;AAC3D,UAAU,gBAAgB;IACxB,OAAO,CACL,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,KAAK,EAAE,iBAAiB,EACxB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,EAC3C,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,aAAa,CAAC,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,KAAK,EAAE,iBAAiB,EACxB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,EAC3C,QAAQ,CAAC,EAAE,eAAe,GACzB,cAAc,CAAC,aAAa,CAAC,CAAC;CAClC;AAgID,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IAEhB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,gBAAgB;IACxB,8EAA8E;IAC9E,OAAO,CAAC,MAAM,CAAC;IACf;;;;OAIG;IACH,OAAO,CAAC,cAAc,CAAC;IAbzB,YACU,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,gBAAgB,EAAE,MAAM,EAAE;IAClC,8EAA8E;IACtE,MAAM,CAAC,EAAE,MAAM,YAAA;IACvB;;;;OAIG;IACK,cAAc,CAAC,EAAE,MAAM,YAAA,EAC7B;IAEJ;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ;IAoBhB;;;;OAIG;IACH,OAAO,CAAC,eAAe;YAgBT,gBAAgB;YAyEhB,kBAAkB;IA6D1B,OAAO,CACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAYlC;IAEM,UAAU,CACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiBzC;CACF"}
@@ -1,8 +1,15 @@
1
- import { createLogger } from "@nodetool-ai/config";
1
+ import { loadMediaRefBytes } from "./media-ref-bytes.js";
2
+ import { isString } from "@nodetool-ai/protocol";
3
+ import { createLogger, getNodeBuiltinSync } from "@nodetool-ai/config";
2
4
  const log = createLogger("nodetool.runtime.python-node-executor");
3
- import { readFile } from "node:fs/promises";
4
- import { randomUUID } from "node:crypto";
5
- import { fileURLToPath } from "node:url";
5
+ const _nodeCrypto = getNodeBuiltinSync("node:crypto");
6
+ const randomUUID = () => _nodeCrypto?.randomUUID
7
+ ? _nodeCrypto.randomUUID()
8
+ : globalThis.crypto?.randomUUID
9
+ ? globalThis.crypto.randomUUID()
10
+ : (() => {
11
+ throw new Error("node:crypto.randomUUID requires Node");
12
+ })();
6
13
  /** Media ref types that need blob conversion. */
7
14
  const MEDIA_TYPE_ALIASES = {
8
15
  ImageRef: "image",
@@ -14,20 +21,81 @@ const MEDIA_TYPE_ALIASES = {
14
21
  video: "video",
15
22
  model_3d: "model_3d"
16
23
  };
17
- /** File extensions by ref type. */
24
+ /** Fallback extension when the ref names no format. */
18
25
  const EXTENSION_MAP = {
19
26
  image: ".png",
20
27
  audio: ".wav",
21
28
  video: ".mp4",
22
29
  model_3d: ".glb"
23
30
  };
24
- /** MIME types by ref type. */
31
+ /** Fallback MIME type when the ref names no format. */
25
32
  const MIME_MAP = {
26
33
  image: "image/png",
27
34
  audio: "audio/wav",
28
35
  video: "video/mp4",
29
36
  model_3d: "model/gltf-binary"
30
37
  };
38
+ /**
39
+ * MIME type per declared ref format. A ref that says `format: "jpeg"` must not
40
+ * be stored as `.png` with `image/png`: the extension decides how a browser
41
+ * and every downstream reader treat the bytes.
42
+ *
43
+ * A format absent from this table still shapes the extension — the entry only
44
+ * decides the content type, which falls back to the media kind's default.
45
+ */
46
+ const FORMAT_MIME_MAP = {
47
+ png: "image/png",
48
+ jpg: "image/jpeg",
49
+ jpeg: "image/jpeg",
50
+ webp: "image/webp",
51
+ gif: "image/gif",
52
+ bmp: "image/bmp",
53
+ tiff: "image/tiff",
54
+ wav: "audio/wav",
55
+ mp3: "audio/mpeg",
56
+ flac: "audio/flac",
57
+ ogg: "audio/ogg",
58
+ opus: "audio/opus",
59
+ m4a: "audio/mp4",
60
+ mp4: "video/mp4",
61
+ webm: "video/webm",
62
+ mov: "video/quicktime",
63
+ mkv: "video/x-matroska",
64
+ avi: "video/x-msvideo",
65
+ glb: "model/gltf-binary",
66
+ gltf: "model/gltf+json",
67
+ obj: "model/obj",
68
+ stl: "model/stl",
69
+ ply: "model/mesh",
70
+ fbx: "application/octet-stream"
71
+ };
72
+ /**
73
+ * The format a ref declares, as a storage-key-safe token, or null.
74
+ *
75
+ * The value is node-controlled and lands in a storage key, so anything but a
76
+ * short alphanumeric token is refused rather than sanitized — a format of
77
+ * `../../etc` has no legitimate reading.
78
+ */
79
+ function refFormat(ref) {
80
+ const raw = ref?.["format"];
81
+ if (!isString(raw))
82
+ return null;
83
+ const format = raw.trim().toLowerCase();
84
+ return /^[a-z0-9]{1,8}$/.test(format) ? format : null;
85
+ }
86
+ /** True when a ref's `data` holds raw bytes rather than an inline payload. */
87
+ function isBinaryPayload(value) {
88
+ if (value instanceof Uint8Array || value instanceof ArrayBuffer)
89
+ return true;
90
+ return (Array.isArray(value) &&
91
+ value.some((item) => item instanceof Uint8Array || item instanceof ArrayBuffer));
92
+ }
93
+ /** The ref the worker sent for this output slot, if it sent one. */
94
+ function carriedRef(value) {
95
+ return typeof value === "object" && value !== null && !Array.isArray(value)
96
+ ? value
97
+ : null;
98
+ }
31
99
  function normalizeMediaOutputType(outputType) {
32
100
  if (!outputType) {
33
101
  return null;
@@ -43,86 +111,75 @@ function isMediaRef(value) {
43
111
  function isMediaRefList(value) {
44
112
  return Array.isArray(value) && value.every(isMediaRef);
45
113
  }
46
- const ASSET_ID_EXTENSION_CANDIDATES = {
47
- image: ["png", "jpg", "jpeg", "webp", "gif", "bmp", "svg"],
48
- audio: ["wav", "mp3", "ogg", "m4a", "aac", "flac"],
49
- video: ["mp4", "webm", "mov", "avi", "mpeg", "mkv"],
50
- model3d: ["glb", "gltf", "obj", "fbx"]
51
- };
52
- function isAbsoluteFilePath(uri) {
53
- return (/^[A-Za-z]:[\\/]/.test(uri) || uri.startsWith("\\\\") || uri.startsWith("/"));
54
- }
55
- async function readUriBytes(uri) {
56
- if (uri.startsWith("data:")) {
57
- const parts = uri.split(",", 2);
58
- if (parts.length !== 2) {
59
- return null;
60
- }
61
- const [header, data] = parts;
62
- const bytes = header.includes(";base64")
63
- ? Buffer.from(data, "base64")
64
- : Buffer.from(decodeURIComponent(data), "utf-8");
65
- return new Uint8Array(bytes);
66
- }
67
- if (uri.startsWith("file://")) {
68
- try {
69
- return await readFile(fileURLToPath(uri));
70
- }
71
- catch {
72
- return null;
73
- }
74
- }
75
- if (isAbsoluteFilePath(uri)) {
76
- try {
77
- return await readFile(uri);
78
- }
79
- catch {
80
- return null;
81
- }
82
- }
83
- return null;
84
- }
85
- async function loadMediaRefBytes(value, context) {
86
- // Inline base64 data takes priority over uri
87
- const data = value.data;
88
- if (typeof data === "string" && data.length > 0) {
89
- return new Uint8Array(Buffer.from(data, "base64"));
90
- }
91
- if (data instanceof Uint8Array) {
92
- return data;
93
- }
94
- if (!value.uri) {
95
- return null;
96
- }
97
- if (context?.storage) {
98
- const candidates = new Set();
99
- candidates.add(value.uri);
100
- if (value.asset_id) {
101
- const refType = (value.type ?? "").toLowerCase();
102
- const extensions = ASSET_ID_EXTENSION_CANDIDATES[refType] ?? ["bin"];
103
- for (const extension of extensions) {
104
- candidates.add(`/api/storage/${value.asset_id}.${extension}`);
105
- }
106
- }
107
- for (const candidate of candidates) {
108
- const stored = await context.storage.retrieve(candidate);
109
- if (stored !== null) {
110
- return stored;
111
- }
112
- }
113
- }
114
- return readUriBytes(value.uri);
115
- }
116
114
  export class PythonNodeExecutor {
117
115
  bridge;
118
116
  nodeType;
119
117
  outputTypes;
120
118
  requiredSettings;
121
- constructor(bridge, nodeType, _properties, outputTypes, requiredSettings) {
119
+ nodeId;
120
+ requiresVramGb;
121
+ constructor(bridge, nodeType, _properties, outputTypes, requiredSettings,
122
+ /** Graph node id, used to surface Python worker progress as node_progress. */
123
+ nodeId,
124
+ /**
125
+ * VRAM hint from this node type's `discover` metadata, forwarded on every
126
+ * execute so the worker can size its reclaim pass. Absent for a worker
127
+ * that does not report one.
128
+ */
129
+ requiresVramGb) {
122
130
  this.bridge = bridge;
123
131
  this.nodeType = nodeType;
124
132
  this.outputTypes = outputTypes;
125
133
  this.requiredSettings = requiredSettings;
134
+ this.nodeId = nodeId;
135
+ this.requiresVramGb = requiresVramGb;
136
+ }
137
+ /**
138
+ * Run identity for the `execute` payload (bridge protocol v4).
139
+ *
140
+ * Before v4 the worker saw an unlabeled stream of single-node executions: it
141
+ * constructed every node with no id, so `self._id` was `""` for all of them
142
+ * and its node → model map collapsed into one bucket. `node_id` is what makes
143
+ * that map real; `job_id` is what pairs the execution with the `job.end`
144
+ * boundary that releases it.
145
+ */
146
+ identity(context) {
147
+ const identity = {};
148
+ if (this.nodeId) {
149
+ identity.nodeId = this.nodeId;
150
+ }
151
+ if (context?.jobId) {
152
+ identity.jobId = context.jobId;
153
+ }
154
+ if (context?.workflowId) {
155
+ identity.workflowId = context.workflowId;
156
+ }
157
+ if (context?.userId) {
158
+ identity.userId = context.userId;
159
+ }
160
+ if (this.requiresVramGb != null) {
161
+ identity.requiresVramGb = this.requiresVramGb;
162
+ }
163
+ return identity;
164
+ }
165
+ /**
166
+ * Build an onProgress sink that forwards the Python worker's progress events
167
+ * to the context message stream as `node_progress`. Returns undefined when we
168
+ * lack the context or node id needed to address the message.
169
+ */
170
+ progressHandler(context) {
171
+ const nodeId = this.nodeId;
172
+ if (!context || !nodeId)
173
+ return undefined;
174
+ return (event) => {
175
+ context.postMessage({
176
+ type: "node_progress",
177
+ node_id: nodeId,
178
+ progress: event.progress,
179
+ total: event.total,
180
+ workflow_id: context.workflowId
181
+ });
182
+ };
126
183
  }
127
184
  async prepareExecution(inputs, context) {
128
185
  // NodeActor merges node.properties + edge inputs before calling process(),
@@ -142,10 +199,10 @@ export class PythonNodeExecutor {
142
199
  key,
143
200
  type: ref.type,
144
201
  hasUri: Boolean(ref.uri),
145
- uriLength: typeof ref.uri === "string" ? ref.uri.length : 0,
202
+ uriLength: isString(ref.uri) ? ref.uri.length : 0,
146
203
  hasData: ref.data !== null && ref.data !== undefined,
147
204
  dataType: typeof ref.data,
148
- dataLength: typeof ref.data === "string"
205
+ dataLength: isString(ref.data)
149
206
  ? ref.data.length
150
207
  : ref.data instanceof Uint8Array
151
208
  ? ref.data.length
@@ -184,15 +241,48 @@ export class PythonNodeExecutor {
184
241
  return { fields, blobs, secrets };
185
242
  }
186
243
  async materializeOutputs(result, context) {
187
- const outputs = { ...result.outputs };
244
+ // Output names come across the Python bridge (node-controlled), so build a
245
+ // null-prototype object: a blob/output named "__proto__" or "constructor"
246
+ // then lands as a plain own key and can't reach the prototype setter.
247
+ // Downstream only does own-key ops (Object.keys, spread, msgpack/JSON), so a
248
+ // null-prototype object behaves identically for legitimate names.
249
+ const outputs = Object.assign(Object.create(null), result.outputs);
188
250
  for (const [name, blobData] of Object.entries(result.blobs)) {
189
- const mediaType = normalizeMediaOutputType(this.outputTypes[name]);
251
+ // Guard the outputTypes lookup with Object.hasOwn so an external name like
252
+ // "constructor" can't resolve to an inherited Object.prototype member.
253
+ const mediaType = Object.hasOwn(this.outputTypes, name)
254
+ ? normalizeMediaOutputType(this.outputTypes[name])
255
+ : null;
256
+ // The ref the worker sent for this slot, when it sent one. Rebuilding a
257
+ // bare {uri, type} from the media kind drops everything else it carried —
258
+ // a VideoRef's duration and format, a Model3DRef's material_file and
259
+ // texture_files, which are what make the asset renderable.
260
+ // Guarded with Object.hasOwn for the same reason the outputTypes lookup
261
+ // is: a blob named "__proto__" would otherwise read Object.prototype and
262
+ // spread its members into the output.
263
+ const ref = Object.hasOwn(result.outputs, name)
264
+ ? carriedRef(result.outputs[name])
265
+ : null;
190
266
  if (mediaType && context?.storage) {
191
- const ext = EXTENSION_MAP[mediaType] ?? "";
192
- const contentType = MIME_MAP[mediaType];
267
+ const format = refFormat(ref);
268
+ const ext = format ? `.${format}` : (EXTENSION_MAP[mediaType] ?? "");
269
+ const contentType = (format ? FORMAT_MIME_MAP[format] : undefined) ?? MIME_MAP[mediaType];
193
270
  const storageKey = `python-bridge/${randomUUID()}${ext}`;
194
271
  const uri = await context.storage.store(storageKey, blobData, contentType);
195
- outputs[name] = { uri, type: mediaType };
272
+ outputs[name] = { ...ref, uri, type: mediaType };
273
+ // The payload is the blob, now at `uri`. A ref that also carries bytes
274
+ // would duplicate a megabyte-scale payload downstream, so drop them —
275
+ // tested by value, since an inline non-binary payload (a dataframe's
276
+ // rows) is content and must survive.
277
+ if (ref && isBinaryPayload(ref["data"])) {
278
+ delete outputs[name]["data"];
279
+ }
280
+ }
281
+ else if (mediaType) {
282
+ // No storage adapter available: keep the bytes inline but preserve the
283
+ // media kind so downstream nodes receive a typed ref (e.g. ImageRef),
284
+ // not a bare Uint8Array.
285
+ outputs[name] = { ...ref, type: mediaType, data: blobData };
196
286
  }
197
287
  else {
198
288
  outputs[name] = blobData;
@@ -202,7 +292,8 @@ export class PythonNodeExecutor {
202
292
  }
203
293
  async process(inputs, context) {
204
294
  const { fields, blobs, secrets } = await this.prepareExecution(inputs, context);
205
- const result = await this.bridge.execute(this.nodeType, fields, secrets, blobs, undefined);
295
+ log.info("Python node executor calling bridge", { nodeType: this.nodeType });
296
+ const result = await this.bridge.execute(this.nodeType, fields, secrets, blobs, this.progressHandler(context), this.identity(context));
206
297
  return this.materializeOutputs(result, context);
207
298
  }
208
299
  async *genProcess(inputs, context) {
@@ -211,7 +302,7 @@ export class PythonNodeExecutor {
211
302
  return;
212
303
  }
213
304
  const { fields, blobs, secrets } = await this.prepareExecution(inputs, context);
214
- for await (const partial of this.bridge.executeStream(this.nodeType, fields, secrets, blobs, undefined)) {
305
+ for await (const partial of this.bridge.executeStream(this.nodeType, fields, secrets, blobs, this.progressHandler(context), this.identity(context))) {
215
306
  yield await this.materializeOutputs(partial, context);
216
307
  }
217
308
  }