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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (713) 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 +982 -127
  24. package/dist/context.d.ts.map +1 -1
  25. package/dist/context.js +2649 -530
  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 +75 -0
  44. package/dist/generation-registry.d.ts.map +1 -0
  45. package/dist/generation-registry.js +144 -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 +352 -0
  62. package/dist/host-binaries.js.map +1 -0
  63. package/dist/image-codec.d.ts +76 -0
  64. package/dist/image-codec.d.ts.map +1 -0
  65. package/dist/image-codec.js +293 -0
  66. package/dist/image-codec.js.map +1 -0
  67. package/dist/image-model-tasks.d.ts +15 -0
  68. package/dist/image-model-tasks.d.ts.map +1 -0
  69. package/dist/image-model-tasks.js +24 -0
  70. package/dist/image-model-tasks.js.map +1 -0
  71. package/dist/index.d.ts +67 -6
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +51 -4
  74. package/dist/index.js.map +1 -1
  75. package/dist/invocation-account.d.ts +43 -0
  76. package/dist/invocation-account.d.ts.map +1 -0
  77. package/dist/invocation-account.js +60 -0
  78. package/dist/invocation-account.js.map +1 -0
  79. package/dist/media-ref-bytes.d.ts +35 -0
  80. package/dist/media-ref-bytes.d.ts.map +1 -0
  81. package/dist/media-ref-bytes.js +191 -0
  82. package/dist/media-ref-bytes.js.map +1 -0
  83. package/dist/node-executor.d.ts +119 -2
  84. package/dist/node-executor.d.ts.map +1 -1
  85. package/dist/permission-gate.d.ts +152 -0
  86. package/dist/permission-gate.d.ts.map +1 -0
  87. package/dist/permission-gate.js +87 -0
  88. package/dist/permission-gate.js.map +1 -0
  89. package/dist/prefixed-storage-adapter.d.ts +33 -0
  90. package/dist/prefixed-storage-adapter.d.ts.map +1 -0
  91. package/dist/prefixed-storage-adapter.js +70 -0
  92. package/dist/prefixed-storage-adapter.js.map +1 -0
  93. package/dist/prompt-asset-refs.d.ts +222 -0
  94. package/dist/prompt-asset-refs.d.ts.map +1 -0
  95. package/dist/prompt-asset-refs.js +751 -0
  96. package/dist/prompt-asset-refs.js.map +1 -0
  97. package/dist/provider-cache.d.ts +3 -0
  98. package/dist/provider-cache.d.ts.map +1 -0
  99. package/dist/provider-cache.js +8 -0
  100. package/dist/provider-cache.js.map +1 -0
  101. package/dist/providers/aki-provider.d.ts +35 -10
  102. package/dist/providers/aki-provider.d.ts.map +1 -1
  103. package/dist/providers/aki-provider.js +90 -77
  104. package/dist/providers/aki-provider.js.map +1 -1
  105. package/dist/providers/alibaba-provider.d.ts +39 -0
  106. package/dist/providers/alibaba-provider.d.ts.map +1 -0
  107. package/dist/providers/alibaba-provider.js +86 -0
  108. package/dist/providers/alibaba-provider.js.map +1 -0
  109. package/dist/providers/anthropic-provider.d.ts +52 -3
  110. package/dist/providers/anthropic-provider.d.ts.map +1 -1
  111. package/dist/providers/anthropic-provider.js +1020 -338
  112. package/dist/providers/anthropic-provider.js.map +1 -1
  113. package/dist/providers/atlascloud-provider.d.ts +103 -0
  114. package/dist/providers/atlascloud-provider.d.ts.map +1 -0
  115. package/dist/providers/atlascloud-provider.js +1031 -0
  116. package/dist/providers/atlascloud-provider.js.map +1 -0
  117. package/dist/providers/atlascloud-transport.d.ts +100 -0
  118. package/dist/providers/atlascloud-transport.d.ts.map +1 -0
  119. package/dist/providers/atlascloud-transport.js +364 -0
  120. package/dist/providers/atlascloud-transport.js.map +1 -0
  121. package/dist/providers/atlascloud-webhook-registry.d.ts +35 -0
  122. package/dist/providers/atlascloud-webhook-registry.d.ts.map +1 -0
  123. package/dist/providers/atlascloud-webhook-registry.js +104 -0
  124. package/dist/providers/atlascloud-webhook-registry.js.map +1 -0
  125. package/dist/providers/audio-mime.d.ts +11 -0
  126. package/dist/providers/audio-mime.d.ts.map +1 -0
  127. package/dist/providers/audio-mime.js +46 -0
  128. package/dist/providers/audio-mime.js.map +1 -0
  129. package/dist/providers/base-provider.d.ts +501 -32
  130. package/dist/providers/base-provider.d.ts.map +1 -1
  131. package/dist/providers/base-provider.js +1280 -87
  132. package/dist/providers/base-provider.js.map +1 -1
  133. package/dist/providers/cassette-provider.d.ts +217 -0
  134. package/dist/providers/cassette-provider.d.ts.map +1 -0
  135. package/dist/providers/cassette-provider.js +502 -0
  136. package/dist/providers/cassette-provider.js.map +1 -0
  137. package/dist/providers/cerebras-provider.d.ts +6 -12
  138. package/dist/providers/cerebras-provider.d.ts.map +1 -1
  139. package/dist/providers/cerebras-provider.js +8 -33
  140. package/dist/providers/cerebras-provider.js.map +1 -1
  141. package/dist/providers/claude-agent-provider.d.ts +107 -74
  142. package/dist/providers/claude-agent-provider.d.ts.map +1 -1
  143. package/dist/providers/claude-agent-provider.js +1279 -517
  144. package/dist/providers/claude-agent-provider.js.map +1 -1
  145. package/dist/providers/codex-provider.d.ts +84 -0
  146. package/dist/providers/codex-provider.d.ts.map +1 -0
  147. package/dist/providers/codex-provider.js +505 -0
  148. package/dist/providers/codex-provider.js.map +1 -0
  149. package/dist/providers/cohere-provider.d.ts +7 -3
  150. package/dist/providers/cohere-provider.d.ts.map +1 -1
  151. package/dist/providers/cohere-provider.js +14 -2
  152. package/dist/providers/cohere-provider.js.map +1 -1
  153. package/dist/providers/comfy-cloud-provider.d.ts +30 -0
  154. package/dist/providers/comfy-cloud-provider.d.ts.map +1 -0
  155. package/dist/providers/comfy-cloud-provider.js +42 -0
  156. package/dist/providers/comfy-cloud-provider.js.map +1 -0
  157. package/dist/providers/content-filter.d.ts +46 -0
  158. package/dist/providers/content-filter.d.ts.map +1 -0
  159. package/dist/providers/content-filter.js +92 -0
  160. package/dist/providers/content-filter.js.map +1 -0
  161. package/dist/providers/context-exceeded.d.ts +37 -0
  162. package/dist/providers/context-exceeded.d.ts.map +1 -0
  163. package/dist/providers/context-exceeded.js +114 -0
  164. package/dist/providers/context-exceeded.js.map +1 -0
  165. package/dist/providers/context-window.d.ts +44 -0
  166. package/dist/providers/context-window.d.ts.map +1 -0
  167. package/dist/providers/context-window.js +145 -0
  168. package/dist/providers/context-window.js.map +1 -0
  169. package/dist/providers/contract/index.d.ts +4 -0
  170. package/dist/providers/contract/index.d.ts.map +1 -0
  171. package/dist/providers/contract/index.js +4 -0
  172. package/dist/providers/contract/index.js.map +1 -0
  173. package/dist/providers/contract/probe-manifest.d.ts +75 -0
  174. package/dist/providers/contract/probe-manifest.d.ts.map +1 -0
  175. package/dist/providers/contract/probe-manifest.js +379 -0
  176. package/dist/providers/contract/probe-manifest.js.map +1 -0
  177. package/dist/providers/contract/probe-runner.d.ts +57 -0
  178. package/dist/providers/contract/probe-runner.d.ts.map +1 -0
  179. package/dist/providers/contract/probe-runner.js +180 -0
  180. package/dist/providers/contract/probe-runner.js.map +1 -0
  181. package/dist/providers/contract/redact.d.ts +29 -0
  182. package/dist/providers/contract/redact.d.ts.map +1 -0
  183. package/dist/providers/contract/redact.js +113 -0
  184. package/dist/providers/contract/redact.js.map +1 -0
  185. package/dist/providers/core-tools.d.ts +75 -0
  186. package/dist/providers/core-tools.d.ts.map +1 -0
  187. package/dist/providers/core-tools.js +128 -0
  188. package/dist/providers/core-tools.js.map +1 -0
  189. package/dist/providers/cost-calculator.d.ts +69 -50
  190. package/dist/providers/cost-calculator.d.ts.map +1 -1
  191. package/dist/providers/cost-calculator.js +207 -397
  192. package/dist/providers/cost-calculator.js.map +1 -1
  193. package/dist/providers/credential-check.d.ts +45 -0
  194. package/dist/providers/credential-check.d.ts.map +1 -0
  195. package/dist/providers/credential-check.js +164 -0
  196. package/dist/providers/credential-check.js.map +1 -0
  197. package/dist/providers/custom-model-kinds.d.ts +33 -0
  198. package/dist/providers/custom-model-kinds.d.ts.map +1 -0
  199. package/dist/providers/custom-model-kinds.js +96 -0
  200. package/dist/providers/custom-model-kinds.js.map +1 -0
  201. package/dist/providers/custom-openai-provider.d.ts +83 -0
  202. package/dist/providers/custom-openai-provider.d.ts.map +1 -0
  203. package/dist/providers/custom-openai-provider.js +190 -0
  204. package/dist/providers/custom-openai-provider.js.map +1 -0
  205. package/dist/providers/custom-provider-registry.d.ts +19 -0
  206. package/dist/providers/custom-provider-registry.d.ts.map +1 -0
  207. package/dist/providers/custom-provider-registry.js +52 -0
  208. package/dist/providers/custom-provider-registry.js.map +1 -0
  209. package/dist/providers/deepseek-provider.d.ts +8 -14
  210. package/dist/providers/deepseek-provider.d.ts.map +1 -1
  211. package/dist/providers/deepseek-provider.js +6 -35
  212. package/dist/providers/deepseek-provider.js.map +1 -1
  213. package/dist/providers/defaults.d.ts +12 -0
  214. package/dist/providers/defaults.d.ts.map +1 -0
  215. package/dist/providers/defaults.js +12 -0
  216. package/dist/providers/defaults.js.map +1 -0
  217. package/dist/providers/dreamina-models.d.ts +5 -0
  218. package/dist/providers/dreamina-models.d.ts.map +1 -0
  219. package/dist/providers/dreamina-models.js +57 -0
  220. package/dist/providers/dreamina-models.js.map +1 -0
  221. package/dist/providers/dreamina-music.d.ts +52 -0
  222. package/dist/providers/dreamina-music.d.ts.map +1 -0
  223. package/dist/providers/dreamina-music.js +115 -0
  224. package/dist/providers/dreamina-music.js.map +1 -0
  225. package/dist/providers/dreamina-provider.d.ts +62 -0
  226. package/dist/providers/dreamina-provider.d.ts.map +1 -0
  227. package/dist/providers/dreamina-provider.js +790 -0
  228. package/dist/providers/dreamina-provider.js.map +1 -0
  229. package/dist/providers/elevenlabs-provider.d.ts +50 -0
  230. package/dist/providers/elevenlabs-provider.d.ts.map +1 -0
  231. package/dist/providers/elevenlabs-provider.js +147 -0
  232. package/dist/providers/elevenlabs-provider.js.map +1 -0
  233. package/dist/providers/entity-references.d.ts +31 -0
  234. package/dist/providers/entity-references.d.ts.map +1 -0
  235. package/dist/providers/entity-references.js +113 -0
  236. package/dist/providers/entity-references.js.map +1 -0
  237. package/dist/providers/evolink-provider.d.ts +40 -0
  238. package/dist/providers/evolink-provider.d.ts.map +1 -0
  239. package/dist/providers/evolink-provider.js +312 -0
  240. package/dist/providers/evolink-provider.js.map +1 -0
  241. package/dist/providers/fake-provider.d.ts +74 -2
  242. package/dist/providers/fake-provider.d.ts.map +1 -1
  243. package/dist/providers/fake-provider.js +213 -1
  244. package/dist/providers/fake-provider.js.map +1 -1
  245. package/dist/providers/fal-generations.d.ts +106 -0
  246. package/dist/providers/fal-generations.d.ts.map +1 -0
  247. package/dist/providers/fal-generations.js +286 -0
  248. package/dist/providers/fal-generations.js.map +1 -0
  249. package/dist/providers/fal-provider.d.ts +173 -8
  250. package/dist/providers/fal-provider.d.ts.map +1 -1
  251. package/dist/providers/fal-provider.js +1396 -64
  252. package/dist/providers/fal-provider.js.map +1 -1
  253. package/dist/providers/fal-queue.d.ts +47 -0
  254. package/dist/providers/fal-queue.d.ts.map +1 -0
  255. package/dist/providers/fal-queue.js +231 -0
  256. package/dist/providers/fal-queue.js.map +1 -0
  257. package/dist/providers/gemini-provider.d.ts +150 -9
  258. package/dist/providers/gemini-provider.d.ts.map +1 -1
  259. package/dist/providers/gemini-provider.js +1515 -316
  260. package/dist/providers/gemini-provider.js.map +1 -1
  261. package/dist/providers/gmi-provider.d.ts +21 -0
  262. package/dist/providers/gmi-provider.d.ts.map +1 -0
  263. package/dist/providers/gmi-provider.js +34 -0
  264. package/dist/providers/gmi-provider.js.map +1 -0
  265. package/dist/providers/gpt-image-size.d.ts +3 -0
  266. package/dist/providers/gpt-image-size.d.ts.map +1 -0
  267. package/dist/providers/gpt-image-size.js +37 -0
  268. package/dist/providers/gpt-image-size.js.map +1 -0
  269. package/dist/providers/groq-provider.d.ts +9 -12
  270. package/dist/providers/groq-provider.d.ts.map +1 -1
  271. package/dist/providers/groq-provider.js +19 -33
  272. package/dist/providers/groq-provider.js.map +1 -1
  273. package/dist/providers/groq-request.d.ts +38 -0
  274. package/dist/providers/groq-request.d.ts.map +1 -0
  275. package/dist/providers/groq-request.js +138 -0
  276. package/dist/providers/groq-request.js.map +1 -0
  277. package/dist/providers/higgsfield-provider.d.ts +31 -0
  278. package/dist/providers/higgsfield-provider.d.ts.map +1 -0
  279. package/dist/providers/higgsfield-provider.js +143 -0
  280. package/dist/providers/higgsfield-provider.js.map +1 -0
  281. package/dist/providers/higgsfield-transport.d.ts +106 -0
  282. package/dist/providers/higgsfield-transport.d.ts.map +1 -0
  283. package/dist/providers/higgsfield-transport.js +182 -0
  284. package/dist/providers/higgsfield-transport.js.map +1 -0
  285. package/dist/providers/http-transport.d.ts +74 -0
  286. package/dist/providers/http-transport.d.ts.map +1 -0
  287. package/dist/providers/http-transport.js +152 -0
  288. package/dist/providers/http-transport.js.map +1 -0
  289. package/dist/providers/huggingface-provider.d.ts +73 -4
  290. package/dist/providers/huggingface-provider.d.ts.map +1 -1
  291. package/dist/providers/huggingface-provider.js +240 -34
  292. package/dist/providers/huggingface-provider.js.map +1 -1
  293. package/dist/providers/image-mime.d.ts +39 -0
  294. package/dist/providers/image-mime.d.ts.map +1 -0
  295. package/dist/providers/image-mime.js +111 -0
  296. package/dist/providers/image-mime.js.map +1 -0
  297. package/dist/providers/image-ref.d.ts +21 -0
  298. package/dist/providers/image-ref.d.ts.map +1 -0
  299. package/dist/providers/image-ref.js +44 -0
  300. package/dist/providers/image-ref.js.map +1 -0
  301. package/dist/providers/index.d.ts +87 -8
  302. package/dist/providers/index.d.ts.map +1 -1
  303. package/dist/providers/index.js +250 -56
  304. package/dist/providers/index.js.map +1 -1
  305. package/dist/providers/jina-provider.d.ts +12 -3
  306. package/dist/providers/jina-provider.d.ts.map +1 -1
  307. package/dist/providers/jina-provider.js +21 -7
  308. package/dist/providers/jina-provider.js.map +1 -1
  309. package/dist/providers/kie-provider.d.ts +172 -10
  310. package/dist/providers/kie-provider.d.ts.map +1 -1
  311. package/dist/providers/kie-provider.js +1190 -228
  312. package/dist/providers/kie-provider.js.map +1 -1
  313. package/dist/providers/kie-webhook-registry.d.ts +28 -0
  314. package/dist/providers/kie-webhook-registry.d.ts.map +1 -0
  315. package/dist/providers/kie-webhook-registry.js +91 -0
  316. package/dist/providers/kie-webhook-registry.js.map +1 -0
  317. package/dist/providers/llama-provider.d.ts +23 -36
  318. package/dist/providers/llama-provider.d.ts.map +1 -1
  319. package/dist/providers/llama-provider.js +50 -355
  320. package/dist/providers/llama-provider.js.map +1 -1
  321. package/dist/providers/lmstudio-provider.d.ts +4 -7
  322. package/dist/providers/lmstudio-provider.d.ts.map +1 -1
  323. package/dist/providers/lmstudio-provider.js +24 -15
  324. package/dist/providers/lmstudio-provider.js.map +1 -1
  325. package/dist/providers/loop-tracing.d.ts +17 -0
  326. package/dist/providers/loop-tracing.d.ts.map +1 -0
  327. package/dist/providers/loop-tracing.js +132 -0
  328. package/dist/providers/loop-tracing.js.map +1 -0
  329. package/dist/providers/manifest-models.d.ts +341 -1
  330. package/dist/providers/manifest-models.d.ts.map +1 -1
  331. package/dist/providers/manifest-models.js +1106 -22
  332. package/dist/providers/manifest-models.js.map +1 -1
  333. package/dist/providers/media-mime.d.ts +14 -0
  334. package/dist/providers/media-mime.d.ts.map +1 -0
  335. package/dist/providers/media-mime.js +35 -0
  336. package/dist/providers/media-mime.js.map +1 -0
  337. package/dist/providers/meshy-provider.d.ts +16 -2
  338. package/dist/providers/meshy-provider.d.ts.map +1 -1
  339. package/dist/providers/meshy-provider.js +82 -46
  340. package/dist/providers/meshy-provider.js.map +1 -1
  341. package/dist/providers/meta-provider.d.ts +22 -0
  342. package/dist/providers/meta-provider.d.ts.map +1 -0
  343. package/dist/providers/meta-provider.js +54 -0
  344. package/dist/providers/meta-provider.js.map +1 -0
  345. package/dist/providers/minimax-provider.d.ts +27 -18
  346. package/dist/providers/minimax-provider.d.ts.map +1 -1
  347. package/dist/providers/minimax-provider.js +222 -72
  348. package/dist/providers/minimax-provider.js.map +1 -1
  349. package/dist/providers/mistral-provider.d.ts +8 -12
  350. package/dist/providers/mistral-provider.d.ts.map +1 -1
  351. package/dist/providers/mistral-provider.js +15 -34
  352. package/dist/providers/mistral-provider.js.map +1 -1
  353. package/dist/providers/moonshot-provider.d.ts +11 -15
  354. package/dist/providers/moonshot-provider.d.ts.map +1 -1
  355. package/dist/providers/moonshot-provider.js +33 -23
  356. package/dist/providers/moonshot-provider.js.map +1 -1
  357. package/dist/providers/node-llama-cpp-provider.d.ts +99 -0
  358. package/dist/providers/node-llama-cpp-provider.d.ts.map +1 -0
  359. package/dist/providers/node-llama-cpp-provider.js +484 -0
  360. package/dist/providers/node-llama-cpp-provider.js.map +1 -0
  361. package/dist/providers/nodetool-provider.d.ts +49 -0
  362. package/dist/providers/nodetool-provider.d.ts.map +1 -0
  363. package/dist/providers/nodetool-provider.js +222 -0
  364. package/dist/providers/nodetool-provider.js.map +1 -0
  365. package/dist/providers/oauth/browser-launcher.d.ts +23 -0
  366. package/dist/providers/oauth/browser-launcher.d.ts.map +1 -0
  367. package/dist/providers/oauth/browser-launcher.js +45 -0
  368. package/dist/providers/oauth/browser-launcher.js.map +1 -0
  369. package/dist/providers/oauth/claude-code-credentials.d.ts +74 -0
  370. package/dist/providers/oauth/claude-code-credentials.d.ts.map +1 -0
  371. package/dist/providers/oauth/claude-code-credentials.js +133 -0
  372. package/dist/providers/oauth/claude-code-credentials.js.map +1 -0
  373. package/dist/providers/oauth/claude-code-login.d.ts +124 -0
  374. package/dist/providers/oauth/claude-code-login.d.ts.map +1 -0
  375. package/dist/providers/oauth/claude-code-login.js +230 -0
  376. package/dist/providers/oauth/claude-code-login.js.map +1 -0
  377. package/dist/providers/oauth/claude-code-oauth-client.d.ts +111 -0
  378. package/dist/providers/oauth/claude-code-oauth-client.d.ts.map +1 -0
  379. package/dist/providers/oauth/claude-code-oauth-client.js +207 -0
  380. package/dist/providers/oauth/claude-code-oauth-client.js.map +1 -0
  381. package/dist/providers/oauth/errors.d.ts +54 -0
  382. package/dist/providers/oauth/errors.d.ts.map +1 -0
  383. package/dist/providers/oauth/errors.js +79 -0
  384. package/dist/providers/oauth/errors.js.map +1 -0
  385. package/dist/providers/oauth/index.d.ts +105 -0
  386. package/dist/providers/oauth/index.d.ts.map +1 -0
  387. package/dist/providers/oauth/index.js +167 -0
  388. package/dist/providers/oauth/index.js.map +1 -0
  389. package/dist/providers/oauth/jwt-claims.d.ts +23 -0
  390. package/dist/providers/oauth/jwt-claims.d.ts.map +1 -0
  391. package/dist/providers/oauth/jwt-claims.js +67 -0
  392. package/dist/providers/oauth/jwt-claims.js.map +1 -0
  393. package/dist/providers/oauth/local-callback-server.d.ts +60 -0
  394. package/dist/providers/oauth/local-callback-server.d.ts.map +1 -0
  395. package/dist/providers/oauth/local-callback-server.js +148 -0
  396. package/dist/providers/oauth/local-callback-server.js.map +1 -0
  397. package/dist/providers/oauth/oauth-client.d.ts +55 -0
  398. package/dist/providers/oauth/oauth-client.d.ts.map +1 -0
  399. package/dist/providers/oauth/oauth-client.js +161 -0
  400. package/dist/providers/oauth/oauth-client.js.map +1 -0
  401. package/dist/providers/oauth/openai-oauth-provider.d.ts +129 -0
  402. package/dist/providers/oauth/openai-oauth-provider.d.ts.map +1 -0
  403. package/dist/providers/oauth/openai-oauth-provider.js +265 -0
  404. package/dist/providers/oauth/openai-oauth-provider.js.map +1 -0
  405. package/dist/providers/oauth/pkce-helper.d.ts +43 -0
  406. package/dist/providers/oauth/pkce-helper.d.ts.map +1 -0
  407. package/dist/providers/oauth/pkce-helper.js +57 -0
  408. package/dist/providers/oauth/pkce-helper.js.map +1 -0
  409. package/dist/providers/oauth/redaction.d.ts +22 -0
  410. package/dist/providers/oauth/redaction.d.ts.map +1 -0
  411. package/dist/providers/oauth/redaction.js +59 -0
  412. package/dist/providers/oauth/redaction.js.map +1 -0
  413. package/dist/providers/oauth/secure-credential-store.d.ts +67 -0
  414. package/dist/providers/oauth/secure-credential-store.d.ts.map +1 -0
  415. package/dist/providers/oauth/secure-credential-store.js +73 -0
  416. package/dist/providers/oauth/secure-credential-store.js.map +1 -0
  417. package/dist/providers/oauth/token-store.d.ts +53 -0
  418. package/dist/providers/oauth/token-store.d.ts.map +1 -0
  419. package/dist/providers/oauth/token-store.js +78 -0
  420. package/dist/providers/oauth/token-store.js.map +1 -0
  421. package/dist/providers/oauth/types.d.ts +64 -0
  422. package/dist/providers/oauth/types.d.ts.map +1 -0
  423. package/dist/providers/oauth/types.js +12 -0
  424. package/dist/providers/oauth/types.js.map +1 -0
  425. package/dist/providers/object-tracking.d.ts +47 -0
  426. package/dist/providers/object-tracking.d.ts.map +1 -0
  427. package/dist/providers/object-tracking.js +46 -0
  428. package/dist/providers/object-tracking.js.map +1 -0
  429. package/dist/providers/offline-model-index.d.ts +20 -0
  430. package/dist/providers/offline-model-index.d.ts.map +1 -0
  431. package/dist/providers/offline-model-index.js +112 -0
  432. package/dist/providers/offline-model-index.js.map +1 -0
  433. package/dist/providers/ollama-provider.d.ts +30 -2
  434. package/dist/providers/ollama-provider.d.ts.map +1 -1
  435. package/dist/providers/ollama-provider.js +198 -43
  436. package/dist/providers/ollama-provider.js.map +1 -1
  437. package/dist/providers/openai-compat/client.d.ts +57 -0
  438. package/dist/providers/openai-compat/client.d.ts.map +1 -0
  439. package/dist/providers/openai-compat/client.js +157 -0
  440. package/dist/providers/openai-compat/client.js.map +1 -0
  441. package/dist/providers/openai-compat/decode.d.ts +36 -0
  442. package/dist/providers/openai-compat/decode.d.ts.map +1 -0
  443. package/dist/providers/openai-compat/decode.js +55 -0
  444. package/dist/providers/openai-compat/decode.js.map +1 -0
  445. package/dist/providers/openai-compat/errors.d.ts +54 -0
  446. package/dist/providers/openai-compat/errors.d.ts.map +1 -0
  447. package/dist/providers/openai-compat/errors.js +144 -0
  448. package/dist/providers/openai-compat/errors.js.map +1 -0
  449. package/dist/providers/openai-compat/index.d.ts +8 -0
  450. package/dist/providers/openai-compat/index.d.ts.map +1 -0
  451. package/dist/providers/openai-compat/index.js +5 -0
  452. package/dist/providers/openai-compat/index.js.map +1 -0
  453. package/dist/providers/openai-compat/sse.d.ts +14 -0
  454. package/dist/providers/openai-compat/sse.d.ts.map +1 -0
  455. package/dist/providers/openai-compat/sse.js +69 -0
  456. package/dist/providers/openai-compat/sse.js.map +1 -0
  457. package/dist/providers/openai-compat/types.d.ts +75 -0
  458. package/dist/providers/openai-compat/types.d.ts.map +1 -0
  459. package/dist/providers/openai-compat/types.js +9 -0
  460. package/dist/providers/openai-compat/types.js.map +1 -0
  461. package/dist/providers/openai-compat-provider.d.ts +90 -0
  462. package/dist/providers/openai-compat-provider.d.ts.map +1 -0
  463. package/dist/providers/openai-compat-provider.js +282 -0
  464. package/dist/providers/openai-compat-provider.js.map +1 -0
  465. package/dist/providers/openai-provider.d.ts +98 -27
  466. package/dist/providers/openai-provider.d.ts.map +1 -1
  467. package/dist/providers/openai-provider.js +1037 -105
  468. package/dist/providers/openai-provider.js.map +1 -1
  469. package/dist/providers/openrouter-provider.d.ts +58 -13
  470. package/dist/providers/openrouter-provider.d.ts.map +1 -1
  471. package/dist/providers/openrouter-provider.js +383 -51
  472. package/dist/providers/openrouter-provider.js.map +1 -1
  473. package/dist/providers/provider-call-failure.d.ts +39 -0
  474. package/dist/providers/provider-call-failure.d.ts.map +1 -0
  475. package/dist/providers/provider-call-failure.js +132 -0
  476. package/dist/providers/provider-call-failure.js.map +1 -0
  477. package/dist/providers/provider-error.d.ts +59 -0
  478. package/dist/providers/provider-error.d.ts.map +1 -0
  479. package/dist/providers/provider-error.js +171 -0
  480. package/dist/providers/provider-error.js.map +1 -0
  481. package/dist/providers/provider-generations.d.ts +99 -0
  482. package/dist/providers/provider-generations.d.ts.map +1 -0
  483. package/dist/providers/provider-generations.js +71 -0
  484. package/dist/providers/provider-generations.js.map +1 -0
  485. package/dist/providers/provider-queue.d.ts +62 -0
  486. package/dist/providers/provider-queue.d.ts.map +1 -0
  487. package/dist/providers/provider-queue.js +28 -0
  488. package/dist/providers/provider-queue.js.map +1 -0
  489. package/dist/providers/provider-registry.d.ts +33 -14
  490. package/dist/providers/provider-registry.d.ts.map +1 -1
  491. package/dist/providers/provider-registry.js +85 -68
  492. package/dist/providers/provider-registry.js.map +1 -1
  493. package/dist/providers/provider-request-log.d.ts +53 -0
  494. package/dist/providers/provider-request-log.d.ts.map +1 -0
  495. package/dist/providers/provider-request-log.js +168 -0
  496. package/dist/providers/provider-request-log.js.map +1 -0
  497. package/dist/providers/provider-session.d.ts +3 -0
  498. package/dist/providers/provider-session.d.ts.map +1 -0
  499. package/dist/providers/provider-session.js +10 -0
  500. package/dist/providers/provider-session.js.map +1 -0
  501. package/dist/providers/provider-transport.d.ts +11 -0
  502. package/dist/providers/provider-transport.d.ts.map +1 -0
  503. package/dist/providers/provider-transport.js +11 -0
  504. package/dist/providers/provider-transport.js.map +1 -0
  505. package/dist/providers/python-provider.d.ts +26 -13
  506. package/dist/providers/python-provider.d.ts.map +1 -1
  507. package/dist/providers/python-provider.js +204 -25
  508. package/dist/providers/python-provider.js.map +1 -1
  509. package/dist/providers/replicate-provider.d.ts +91 -8
  510. package/dist/providers/replicate-provider.d.ts.map +1 -1
  511. package/dist/providers/replicate-provider.js +823 -65
  512. package/dist/providers/replicate-provider.js.map +1 -1
  513. package/dist/providers/replicate-retry.d.ts +30 -0
  514. package/dist/providers/replicate-retry.d.ts.map +1 -0
  515. package/dist/providers/replicate-retry.js +97 -0
  516. package/dist/providers/replicate-retry.js.map +1 -0
  517. package/dist/providers/requesty-provider.d.ts +30 -0
  518. package/dist/providers/requesty-provider.d.ts.map +1 -0
  519. package/dist/providers/requesty-provider.js +87 -0
  520. package/dist/providers/requesty-provider.js.map +1 -0
  521. package/dist/providers/responses-api.d.ts +27 -0
  522. package/dist/providers/responses-api.d.ts.map +1 -0
  523. package/dist/providers/responses-api.js +297 -0
  524. package/dist/providers/responses-api.js.map +1 -0
  525. package/dist/providers/reve-provider.d.ts +46 -0
  526. package/dist/providers/reve-provider.d.ts.map +1 -0
  527. package/dist/providers/reve-provider.js +165 -0
  528. package/dist/providers/reve-provider.js.map +1 -0
  529. package/dist/providers/rodin-provider.d.ts +25 -2
  530. package/dist/providers/rodin-provider.d.ts.map +1 -1
  531. package/dist/providers/rodin-provider.js +95 -51
  532. package/dist/providers/rodin-provider.js.map +1 -1
  533. package/dist/providers/safe-url.d.ts +70 -0
  534. package/dist/providers/safe-url.d.ts.map +1 -0
  535. package/dist/providers/safe-url.js +277 -0
  536. package/dist/providers/safe-url.js.map +1 -0
  537. package/dist/providers/scripted-provider.d.ts +9 -0
  538. package/dist/providers/scripted-provider.d.ts.map +1 -1
  539. package/dist/providers/scripted-provider.js +86 -10
  540. package/dist/providers/scripted-provider.js.map +1 -1
  541. package/dist/providers/structured-output.d.ts +42 -0
  542. package/dist/providers/structured-output.d.ts.map +1 -0
  543. package/dist/providers/structured-output.js +83 -0
  544. package/dist/providers/structured-output.js.map +1 -0
  545. package/dist/providers/together-operations.d.ts +27 -0
  546. package/dist/providers/together-operations.d.ts.map +1 -0
  547. package/dist/providers/together-operations.js +95 -0
  548. package/dist/providers/together-operations.js.map +1 -0
  549. package/dist/providers/together-provider.d.ts +18 -18
  550. package/dist/providers/together-provider.d.ts.map +1 -1
  551. package/dist/providers/together-provider.js +140 -367
  552. package/dist/providers/together-provider.js.map +1 -1
  553. package/dist/providers/topaz-provider.d.ts +45 -0
  554. package/dist/providers/topaz-provider.d.ts.map +1 -0
  555. package/dist/providers/topaz-provider.js +244 -0
  556. package/dist/providers/topaz-provider.js.map +1 -0
  557. package/dist/providers/types.d.ts +641 -4
  558. package/dist/providers/types.d.ts.map +1 -1
  559. package/dist/providers/types.js +81 -1
  560. package/dist/providers/types.js.map +1 -1
  561. package/dist/providers/useapi-provider.d.ts +28 -0
  562. package/dist/providers/useapi-provider.d.ts.map +1 -0
  563. package/dist/providers/useapi-provider.js +274 -0
  564. package/dist/providers/useapi-provider.js.map +1 -0
  565. package/dist/providers/video-duration.d.ts +6 -0
  566. package/dist/providers/video-duration.d.ts.map +1 -0
  567. package/dist/providers/video-duration.js +63 -0
  568. package/dist/providers/video-duration.js.map +1 -0
  569. package/dist/providers/video-frame-fallback.d.ts +39 -0
  570. package/dist/providers/video-frame-fallback.d.ts.map +1 -0
  571. package/dist/providers/video-frame-fallback.js +155 -0
  572. package/dist/providers/video-frame-fallback.js.map +1 -0
  573. package/dist/providers/video-frames.d.ts +61 -0
  574. package/dist/providers/video-frames.d.ts.map +1 -0
  575. package/dist/providers/video-frames.js +208 -0
  576. package/dist/providers/video-frames.js.map +1 -0
  577. package/dist/providers/video-mime.d.ts +14 -0
  578. package/dist/providers/video-mime.d.ts.map +1 -0
  579. package/dist/providers/video-mime.js +44 -0
  580. package/dist/providers/video-mime.js.map +1 -0
  581. package/dist/providers/video-to-audio.d.ts +34 -0
  582. package/dist/providers/video-to-audio.d.ts.map +1 -0
  583. package/dist/providers/video-to-audio.js +62 -0
  584. package/dist/providers/video-to-audio.js.map +1 -0
  585. package/dist/providers/vllm-provider.d.ts +20 -8
  586. package/dist/providers/vllm-provider.d.ts.map +1 -1
  587. package/dist/providers/vllm-provider.js +44 -23
  588. package/dist/providers/vllm-provider.js.map +1 -1
  589. package/dist/providers/voyage-provider.d.ts +12 -3
  590. package/dist/providers/voyage-provider.d.ts.map +1 -1
  591. package/dist/providers/voyage-provider.js +21 -7
  592. package/dist/providers/voyage-provider.js.map +1 -1
  593. package/dist/providers/xai-provider.d.ts +56 -13
  594. package/dist/providers/xai-provider.d.ts.map +1 -1
  595. package/dist/providers/xai-provider.js +307 -22
  596. package/dist/providers/xai-provider.js.map +1 -1
  597. package/dist/python-bridge-base.d.ts +358 -0
  598. package/dist/python-bridge-base.d.ts.map +1 -0
  599. package/dist/python-bridge-base.js +1557 -0
  600. package/dist/python-bridge-base.js.map +1 -0
  601. package/dist/python-bridge-codec.d.ts +28 -0
  602. package/dist/python-bridge-codec.d.ts.map +1 -0
  603. package/dist/python-bridge-codec.js +39 -0
  604. package/dist/python-bridge-codec.js.map +1 -0
  605. package/dist/python-bridge-factory.d.ts +52 -0
  606. package/dist/python-bridge-factory.d.ts.map +1 -0
  607. package/dist/python-bridge-factory.js +69 -0
  608. package/dist/python-bridge-factory.js.map +1 -0
  609. package/dist/python-bridge-framing.d.ts +68 -0
  610. package/dist/python-bridge-framing.d.ts.map +1 -0
  611. package/dist/python-bridge-framing.js +91 -0
  612. package/dist/python-bridge-framing.js.map +1 -0
  613. package/dist/python-bridge-types.d.ts +545 -2
  614. package/dist/python-bridge-types.d.ts.map +1 -1
  615. package/dist/python-bridge-types.js +49 -1
  616. package/dist/python-bridge-types.js.map +1 -1
  617. package/dist/python-graph-resolver.d.ts +57 -0
  618. package/dist/python-graph-resolver.d.ts.map +1 -0
  619. package/dist/python-graph-resolver.js +79 -0
  620. package/dist/python-graph-resolver.js.map +1 -0
  621. package/dist/python-node-executor.d.ts +36 -4
  622. package/dist/python-node-executor.d.ts.map +1 -1
  623. package/dist/python-node-executor.js +177 -86
  624. package/dist/python-node-executor.js.map +1 -1
  625. package/dist/python-stdio-bridge.d.ts +18 -37
  626. package/dist/python-stdio-bridge.d.ts.map +1 -1
  627. package/dist/python-stdio-bridge.js +148 -475
  628. package/dist/python-stdio-bridge.js.map +1 -1
  629. package/dist/python-websocket-bridge.d.ts +140 -0
  630. package/dist/python-websocket-bridge.d.ts.map +1 -0
  631. package/dist/python-websocket-bridge.js +561 -0
  632. package/dist/python-websocket-bridge.js.map +1 -0
  633. package/dist/python-worker-stderr.d.ts +4 -0
  634. package/dist/python-worker-stderr.d.ts.map +1 -0
  635. package/dist/python-worker-stderr.js +24 -0
  636. package/dist/python-worker-stderr.js.map +1 -0
  637. package/dist/recommended-models.d.ts +2 -2
  638. package/dist/recommended-models.d.ts.map +1 -1
  639. package/dist/recommended-models.js +44 -4
  640. package/dist/recommended-models.js.map +1 -1
  641. package/dist/recoverable-node-error.d.ts +31 -0
  642. package/dist/recoverable-node-error.d.ts.map +1 -0
  643. package/dist/recoverable-node-error.js +37 -0
  644. package/dist/recoverable-node-error.js.map +1 -0
  645. package/dist/redact-params.d.ts +13 -0
  646. package/dist/redact-params.d.ts.map +1 -0
  647. package/dist/redact-params.js +57 -0
  648. package/dist/redact-params.js.map +1 -0
  649. package/dist/run-context.d.ts +20 -0
  650. package/dist/run-context.d.ts.map +1 -0
  651. package/dist/run-context.js +18 -0
  652. package/dist/run-context.js.map +1 -0
  653. package/dist/run-trace-context.d.ts +30 -0
  654. package/dist/run-trace-context.d.ts.map +1 -0
  655. package/dist/run-trace-context.js +80 -0
  656. package/dist/run-trace-context.js.map +1 -0
  657. package/dist/run-trace-processor.d.ts +65 -0
  658. package/dist/run-trace-processor.d.ts.map +1 -0
  659. package/dist/run-trace-processor.js +417 -0
  660. package/dist/run-trace-processor.js.map +1 -0
  661. package/dist/run-trace-serialization.d.ts +5 -0
  662. package/dist/run-trace-serialization.d.ts.map +1 -0
  663. package/dist/run-trace-serialization.js +113 -0
  664. package/dist/run-trace-serialization.js.map +1 -0
  665. package/dist/sandbox-module-catalog.d.ts +43 -0
  666. package/dist/sandbox-module-catalog.d.ts.map +1 -0
  667. package/dist/sandbox-module-catalog.js +25 -0
  668. package/dist/sandbox-module-catalog.js.map +1 -0
  669. package/dist/storage-workspace.d.ts +62 -0
  670. package/dist/storage-workspace.d.ts.map +1 -0
  671. package/dist/storage-workspace.js +441 -0
  672. package/dist/storage-workspace.js.map +1 -0
  673. package/dist/swappable-python-bridge.d.ts +83 -0
  674. package/dist/swappable-python-bridge.d.ts.map +1 -0
  675. package/dist/swappable-python-bridge.js +246 -0
  676. package/dist/swappable-python-bridge.js.map +1 -0
  677. package/dist/telemetry.d.ts +16 -3
  678. package/dist/telemetry.d.ts.map +1 -1
  679. package/dist/telemetry.js +76 -20
  680. package/dist/telemetry.js.map +1 -1
  681. package/dist/testing.d.ts +81 -0
  682. package/dist/testing.d.ts.map +1 -0
  683. package/dist/testing.js +130 -0
  684. package/dist/testing.js.map +1 -0
  685. package/dist/token-counter.d.ts +30 -0
  686. package/dist/token-counter.d.ts.map +1 -0
  687. package/dist/token-counter.js +156 -0
  688. package/dist/token-counter.js.map +1 -0
  689. package/dist/trace-exporters.d.ts +11 -28
  690. package/dist/trace-exporters.d.ts.map +1 -1
  691. package/dist/trace-exporters.js +69 -22
  692. package/dist/trace-exporters.js.map +1 -1
  693. package/dist/tracing-helpers.d.ts +60 -26
  694. package/dist/tracing-helpers.d.ts.map +1 -1
  695. package/dist/tracing-helpers.js +100 -25
  696. package/dist/tracing-helpers.js.map +1 -1
  697. package/dist/trim-video-window.d.ts +8 -0
  698. package/dist/trim-video-window.d.ts.map +1 -0
  699. package/dist/trim-video-window.js +50 -0
  700. package/dist/trim-video-window.js.map +1 -0
  701. package/dist/turn-budget.d.ts +278 -0
  702. package/dist/turn-budget.d.ts.map +1 -0
  703. package/dist/turn-budget.js +365 -0
  704. package/dist/turn-budget.js.map +1 -0
  705. package/dist/variable-channel.d.ts +48 -0
  706. package/dist/variable-channel.d.ts.map +1 -0
  707. package/dist/variable-channel.js +110 -0
  708. package/dist/variable-channel.js.map +1 -0
  709. package/dist/workspace.d.ts +119 -0
  710. package/dist/workspace.d.ts.map +1 -0
  711. package/dist/workspace.js +112 -0
  712. package/dist/workspace.js.map +1 -0
  713. package/package.json +121 -19
@@ -0,0 +1,751 @@
1
+ /**
2
+ * Inline asset references in prompt text.
3
+ *
4
+ * Prompt-style surfaces (the Prompt composer, chat) let users mention an asset
5
+ * with `@`, which encodes as an `asset://<id>.<ext>` token inside the plain
6
+ * prompt string. Text-generation tasks expand these tokens into multimodal
7
+ * image / audio message blocks before the provider call. This module is the
8
+ * shared, provider-agnostic parser so other task types (e.g. image-to-image)
9
+ * can pull the same referenced media out of a prompt and route it to a typed
10
+ * input instead of leaving a dangling `asset://` URI in the text.
11
+ *
12
+ * The low-level parsing is resolution-free — callers hand the verbatim
13
+ * `asset://` URI to {@link loadMediaRefBytes} / `resolveMessageMediaUris`,
14
+ * which dereference it to bytes / a data URI just before it is consumed. The
15
+ * higher-level {@link mapPromptAssetsToInputs} does resolve, so provider nodes
16
+ * (FAL / KIE / Replicate / image-to-image) can route a mentioned image / audio
17
+ * / video into a typed asset input with bytes already in hand.
18
+ *
19
+ * A mentioned plain-text document (`.md`, `.txt`, `.csv`, `.json`, …) has no
20
+ * typed input to route to — {@link inlineTextAssetRefs} substitutes its decoded
21
+ * contents into the prompt text in place of the token.
22
+ */
23
+ import { encodeBase64, loadMediaRefBytes } from "./media-ref-bytes.js";
24
+ import { isCallable, isObjectLike, isString } from "@nodetool-ai/protocol";
25
+ /** Matches an inline `asset://<id>.<ext>` token (greedy over the URI charset). */
26
+ const ASSET_URI_RE = /asset:\/\/[A-Za-z0-9._~\-/]+/g;
27
+ const IMAGE_EXT_MIME = {
28
+ png: "image/png",
29
+ jpg: "image/jpeg",
30
+ jpeg: "image/jpeg",
31
+ gif: "image/gif",
32
+ webp: "image/webp",
33
+ bmp: "image/bmp",
34
+ svg: "image/svg+xml"
35
+ };
36
+ const AUDIO_EXT_MIME = {
37
+ mp3: "audio/mpeg",
38
+ mpeg: "audio/mpeg",
39
+ wav: "audio/wav",
40
+ ogg: "audio/ogg",
41
+ m4a: "audio/mp4",
42
+ aac: "audio/aac",
43
+ flac: "audio/flac",
44
+ opus: "audio/opus"
45
+ };
46
+ const VIDEO_EXT_MIME = {
47
+ mp4: "video/mp4",
48
+ webm: "video/webm",
49
+ mov: "video/quicktime",
50
+ mkv: "video/x-matroska",
51
+ avi: "video/x-msvideo"
52
+ };
53
+ /**
54
+ * Plain-text document extensions. Unlike media, a text mention has no typed
55
+ * input to route to — its decoded content is inlined into the prompt string in
56
+ * place of the token (see {@link inlineTextAssetRefs}).
57
+ */
58
+ const TEXT_EXT_MIME = {
59
+ txt: "text/plain",
60
+ text: "text/plain",
61
+ md: "text/markdown",
62
+ markdown: "text/markdown",
63
+ csv: "text/csv",
64
+ tsv: "text/tab-separated-values",
65
+ json: "application/json",
66
+ jsonl: "application/json",
67
+ ndjson: "application/json",
68
+ xml: "application/xml",
69
+ yaml: "application/yaml",
70
+ yml: "application/yaml",
71
+ html: "text/html",
72
+ htm: "text/html",
73
+ log: "text/plain",
74
+ rst: "text/x-rst",
75
+ ini: "text/plain",
76
+ toml: "text/plain",
77
+ srt: "text/plain",
78
+ vtt: "text/vtt"
79
+ };
80
+ /** Lowercased extension of an `asset://<id>.<ext>` token (without the dot). */
81
+ function tokenExt(token) {
82
+ const noScheme = token.slice("asset://".length);
83
+ const primary = noScheme.split(/[?#]/)[0];
84
+ return (primary.split(".").pop() ?? "").toLowerCase();
85
+ }
86
+ /**
87
+ * Classify an `asset://<id>.<ext>` token by its extension. Image, audio and
88
+ * video are provider-consumable media (reference-to-video / lipsync models take
89
+ * a video clip); everything else (text, unknown) returns null so the reference
90
+ * is left for the text-inlining pass or kept as literal text in the prompt.
91
+ */
92
+ export function classifyAssetToken(token) {
93
+ if (!token.startsWith("asset://"))
94
+ return null;
95
+ const ext = tokenExt(token);
96
+ // Object.hasOwn, not `in`: `in` walks the prototype chain, so an extension of
97
+ // "__proto__"/"toString"/"constructor" would match an inherited key and
98
+ // return a non-string (object/function) mime, fabricating a bogus media ref.
99
+ if (Object.hasOwn(IMAGE_EXT_MIME, ext))
100
+ return { kind: "image", mime: IMAGE_EXT_MIME[ext] };
101
+ if (Object.hasOwn(AUDIO_EXT_MIME, ext))
102
+ return { kind: "audio", mime: AUDIO_EXT_MIME[ext] };
103
+ if (Object.hasOwn(VIDEO_EXT_MIME, ext))
104
+ return { kind: "video", mime: VIDEO_EXT_MIME[ext] };
105
+ return null;
106
+ }
107
+ /**
108
+ * Classify an `asset://<id>.<ext>` token as a plain-text document. Returns null
109
+ * for non-text tokens (media, folders, unknown) so they are left untouched by
110
+ * the text-inlining pass.
111
+ */
112
+ export function classifyTextToken(token) {
113
+ if (!token.startsWith("asset://"))
114
+ return null;
115
+ const ext = tokenExt(token);
116
+ return Object.hasOwn(TEXT_EXT_MIME, ext)
117
+ ? { mime: TEXT_EXT_MIME[ext] }
118
+ : null;
119
+ }
120
+ /**
121
+ * Pick a media extension for a content type so a stored asset can be turned
122
+ * back into a classifiable `asset://<id>.<ext>` token. Returns null for content
123
+ * types that aren't a recognized image/audio/video kind (folders, documents).
124
+ */
125
+ function extForContentType(contentType) {
126
+ const ct = (contentType ?? "").toLowerCase().split(";")[0].trim();
127
+ const slash = ct.indexOf("/");
128
+ if (slash <= 0)
129
+ return null;
130
+ const top = ct.slice(0, slash);
131
+ let sub = ct.slice(slash + 1).split("+")[0];
132
+ if (ct === "audio/mpeg" || ct === "audio/mp3")
133
+ sub = "mp3";
134
+ else if (ct === "audio/mp4")
135
+ sub = "m4a";
136
+ else if (ct === "video/quicktime")
137
+ sub = "mov";
138
+ if (top === "image" && Object.hasOwn(IMAGE_EXT_MIME, sub))
139
+ return sub;
140
+ if (top === "audio" && Object.hasOwn(AUDIO_EXT_MIME, sub))
141
+ return sub;
142
+ if (top === "video" && Object.hasOwn(VIDEO_EXT_MIME, sub))
143
+ return sub;
144
+ return null;
145
+ }
146
+ /**
147
+ * Reverse of the ext→mime tables: the extension whose mime matches. Tries the
148
+ * media tables first (via {@link extForContentType}, which also normalizes
149
+ * `+suffix` and audio/video aliases), then falls back to a text-document match.
150
+ * Returns null for an unrecognized mime.
151
+ */
152
+ function extForMime(mime) {
153
+ const viaMedia = extForContentType(mime);
154
+ if (viaMedia)
155
+ return viaMedia;
156
+ const ct = (mime ?? "").toLowerCase().split(";")[0].trim();
157
+ for (const [ext, m] of Object.entries(TEXT_EXT_MIME)) {
158
+ if (m === ct)
159
+ return ext;
160
+ }
161
+ return null;
162
+ }
163
+ /** Fallback extension per ref `type` when the mime is missing/unrecognized. */
164
+ const DEFAULT_EXT_BY_KIND = {
165
+ image: "png",
166
+ audio: "mp3",
167
+ video: "mp4",
168
+ document: "txt",
169
+ text: "txt"
170
+ };
171
+ /** Pick an extension for a ref from its mime, else its declared `type`. */
172
+ function extForRef(ref) {
173
+ const mime = isString(ref.mimeType)
174
+ ? ref.mimeType
175
+ : isString(ref.content_type)
176
+ ? ref.content_type
177
+ : "";
178
+ const byMime = mime ? extForMime(mime) : null;
179
+ if (byMime)
180
+ return byMime;
181
+ const kind = isString(ref.type) ? ref.type.toLowerCase() : "";
182
+ return Object.hasOwn(DEFAULT_EXT_BY_KIND, kind)
183
+ ? DEFAULT_EXT_BY_KIND[kind]
184
+ : null;
185
+ }
186
+ /**
187
+ * Convert a media / document ref — the `{ type, uri, asset_id, mimeType }` shape
188
+ * image / audio / video / document outputs carry — into the inline
189
+ * `asset://<id>.<ext>` token the prompt-expansion machinery understands.
190
+ *
191
+ * This lets an asset wired into a Prompt node's `{{ variable }}` flow through
192
+ * the same path as an inline `@`-mention: once rendered, the token is picked up
193
+ * by {@link expandAssetReferences} (LLM message blocks), `mapPromptAssetsToInputs`
194
+ * (typed provider inputs), or {@link inlineTextAssetRefs} (text documents),
195
+ * instead of stringifying to `"[object Object]"`.
196
+ *
197
+ * Returns null for values that aren't asset refs (strings, numbers, plain
198
+ * objects with no `uri`/`asset_id`) so callers fall back to normal stringify.
199
+ * A ref pointing only at a non-asset uri (http / data / file) yields that uri
200
+ * verbatim — it won't route as media, but it still beats `"[object Object]"`.
201
+ */
202
+ export function assetRefToPromptToken(value) {
203
+ if (!isObjectLike(value))
204
+ return null;
205
+ const ref = value;
206
+ const uri = isString(ref.uri) ? ref.uri.trim() : "";
207
+ const assetId = isString(ref.asset_id) ? ref.asset_id.trim() : "";
208
+ if (uri.startsWith("asset://")) {
209
+ // Drop any query/hash; keep the id (and any existing extension) intact.
210
+ const id = uri.slice("asset://".length).split(/[?#]/)[0];
211
+ if (!id)
212
+ return null;
213
+ if (id.includes("."))
214
+ return `asset://${id}`;
215
+ const ext = extForRef(ref);
216
+ return ext ? `asset://${id}.${ext}` : `asset://${id}`;
217
+ }
218
+ if (assetId) {
219
+ const ext = extForRef(ref);
220
+ return ext ? `asset://${assetId}.${ext}` : `asset://${assetId}`;
221
+ }
222
+ // Asset-less ref that still points somewhere resolvable.
223
+ if (uri)
224
+ return uri;
225
+ return null;
226
+ }
227
+ /**
228
+ * Trim trailing dots (sentence punctuation) off a token. A character loop, not
229
+ * `/\.+$/` — that regex backtracks polynomially on long dot runs, which CodeQL
230
+ * flags as a ReDoS risk on prompt-derived input.
231
+ */
232
+ function trimTrailingDots(token) {
233
+ let end = token.length;
234
+ while (end > 0 && token[end - 1] === ".") {
235
+ end--;
236
+ }
237
+ return token.slice(0, end);
238
+ }
239
+ /**
240
+ * Collapse horizontal-whitespace gaps left behind by token substitution:
241
+ * runs of 2+ spaces/tabs become one space, horizontal whitespace before a
242
+ * newline is dropped, and the result is trimmed. A single pass instead of
243
+ * `/[ \t]{2,}/` + `/[ \t]+\n/` — those backtrack polynomially on long
244
+ * space/tab runs (a ReDoS risk on prompt-derived input).
245
+ */
246
+ function collapseGapWhitespace(text) {
247
+ let out = "";
248
+ let run = ""; // pending run of spaces/tabs
249
+ for (const ch of text) {
250
+ if (ch === " " || ch === "\t") {
251
+ run += ch;
252
+ continue;
253
+ }
254
+ if (ch === "\n") {
255
+ // Drop horizontal whitespace before a newline.
256
+ run = "";
257
+ out += "\n";
258
+ continue;
259
+ }
260
+ if (run) {
261
+ out += run.length > 1 ? " " : run;
262
+ run = "";
263
+ }
264
+ out += ch;
265
+ }
266
+ if (run) {
267
+ out += run.length > 1 ? " " : run;
268
+ }
269
+ return out.trim();
270
+ }
271
+ /**
272
+ * Scan a prompt for `asset://` tokens in source order, yielding each token with
273
+ * its source offset. Trailing dots are treated as sentence punctuation (not
274
+ * part of the extension), so `asset://a.png.` yields `asset://a.png` and leaves
275
+ * the period in the surrounding text. Classification is left to the caller.
276
+ */
277
+ function scanAssetTokens(prompt) {
278
+ const out = [];
279
+ ASSET_URI_RE.lastIndex = 0;
280
+ let match;
281
+ while ((match = ASSET_URI_RE.exec(prompt)) !== null) {
282
+ const token = trimTrailingDots(match[0]);
283
+ out.push({ token, index: match.index });
284
+ }
285
+ return out;
286
+ }
287
+ /**
288
+ * Find every classifiable media reference in a prompt, in source order.
289
+ *
290
+ * Unclassifiable tokens (no/unknown extension, e.g. `asset://doc.txt`) are
291
+ * skipped and remain literal text — text documents are handled separately by
292
+ * {@link findTextAssetRefs} / {@link inlineTextAssetRefs}.
293
+ */
294
+ export function findAssetRefs(prompt) {
295
+ const refs = [];
296
+ for (const { token, index } of scanAssetTokens(prompt)) {
297
+ const classification = classifyAssetToken(token);
298
+ if (!classification)
299
+ continue;
300
+ refs.push({
301
+ uri: token,
302
+ kind: classification.kind,
303
+ mime: classification.mime,
304
+ index,
305
+ length: token.length
306
+ });
307
+ }
308
+ return refs;
309
+ }
310
+ /** Find every plain-text document reference in a prompt, in source order. */
311
+ export function findTextAssetRefs(prompt) {
312
+ const refs = [];
313
+ for (const { token, index } of scanAssetTokens(prompt)) {
314
+ const classification = classifyTextToken(token);
315
+ if (!classification)
316
+ continue;
317
+ refs.push({ uri: token, mime: classification.mime, index, length: token.length });
318
+ }
319
+ return refs;
320
+ }
321
+ /**
322
+ * Replace each plain-text document mention in `prompt` with the asset's decoded
323
+ * UTF-8 contents, inline. A mention that can't be resolved to bytes is left as
324
+ * its literal token (never silently dropped). Media mentions are untouched.
325
+ */
326
+ export async function inlineTextAssetRefs(prompt, context) {
327
+ if (!context || !prompt.includes("asset://"))
328
+ return prompt;
329
+ const refs = findTextAssetRefs(prompt);
330
+ if (refs.length === 0)
331
+ return prompt;
332
+ const decoder = new TextDecoder();
333
+ const contents = await Promise.all(refs.map(async (ref) => {
334
+ const bytes = await loadMediaRefBytes({ type: "text", uri: ref.uri }, context);
335
+ // A resolved-but-empty asset must inline as "" (not fall back to the
336
+ // literal token); only a failed resolution (null bytes) keeps the token.
337
+ return bytes ? decoder.decode(bytes) : null;
338
+ }));
339
+ let result = "";
340
+ let cursor = 0;
341
+ refs.forEach((ref, i) => {
342
+ if (ref.index < cursor)
343
+ return;
344
+ result += prompt.slice(cursor, ref.index);
345
+ // Inline the decoded text, or keep the literal token when resolution failed.
346
+ result += contents[i] ?? prompt.slice(ref.index, ref.index + ref.length);
347
+ cursor = ref.index + ref.length;
348
+ });
349
+ result += prompt.slice(cursor);
350
+ return result;
351
+ }
352
+ /** Convenience: only the image references in a prompt. */
353
+ export function findImageAssetRefs(prompt) {
354
+ return findAssetRefs(prompt).filter((ref) => ref.kind === "image");
355
+ }
356
+ /**
357
+ * Split a prompt containing inline `asset://<id>.<ext>` references into a
358
+ * multimodal content array: text segments interleaved with image / audio
359
+ * blocks that carry the `asset://` URI verbatim. The blocks are NOT resolved
360
+ * here — {@link ProcessingContext.resolveMessageMediaUris} dereferences the
361
+ * URIs to data URIs just before the provider call. Tokens that aren't a
362
+ * supported chat media type (video, unknown) stay as literal text so the
363
+ * model still sees the mention.
364
+ */
365
+ export function expandAssetReferences(prompt) {
366
+ const refs = findAssetRefs(prompt);
367
+ if (refs.length === 0) {
368
+ return [{ type: "text", text: prompt }];
369
+ }
370
+ const parts = [];
371
+ const pushText = (text) => {
372
+ if (text)
373
+ parts.push({ type: "text", text });
374
+ };
375
+ let cursor = 0;
376
+ for (const ref of refs) {
377
+ pushText(prompt.slice(cursor, ref.index));
378
+ if (ref.kind === "image") {
379
+ parts.push({
380
+ type: "image_url",
381
+ image: { uri: ref.uri, mimeType: ref.mime }
382
+ });
383
+ // Keep the literal token next to the block, the way the video branch
384
+ // below does. The block itself resolves to a data URI before the
385
+ // provider call, so without the token the model sees pixels it has no
386
+ // handle for and cannot name the image in a later `edit_image` call.
387
+ pushText(ref.uri);
388
+ }
389
+ else if (ref.kind === "audio") {
390
+ parts.push({
391
+ type: "audio",
392
+ audio: { uri: ref.uri, mimeType: ref.mime }
393
+ });
394
+ pushText(ref.uri);
395
+ }
396
+ else {
397
+ // Video (and any other non-chat media): keep the mention as literal text
398
+ // so the model still sees the reference rather than a mislabeled block.
399
+ pushText(ref.uri);
400
+ }
401
+ cursor = ref.index + ref.length;
402
+ }
403
+ pushText(prompt.slice(cursor));
404
+ return parts.length > 0 ? parts : [{ type: "text", text: prompt }];
405
+ }
406
+ /**
407
+ * Rewrite the given references inside the prompt, substituting each with the
408
+ * string `replace(ref)` returns (return `""` to drop it). Refs must come from
409
+ * {@link findAssetRefs} on the same string (they carry the source offsets).
410
+ * Horizontal whitespace left behind is collapsed so the result reads cleanly;
411
+ * newlines are preserved.
412
+ */
413
+ function replaceAssetRefs(prompt, refs, replace) {
414
+ if (refs.length === 0)
415
+ return prompt;
416
+ let result = "";
417
+ let cursor = 0;
418
+ for (const ref of refs) {
419
+ if (ref.index < cursor)
420
+ continue;
421
+ result += prompt.slice(cursor, ref.index);
422
+ result += replace(ref);
423
+ cursor = ref.index + ref.length;
424
+ }
425
+ result += prompt.slice(cursor);
426
+ return collapseGapWhitespace(result);
427
+ }
428
+ /**
429
+ * Remove the given references from the prompt, collapsing the horizontal
430
+ * whitespace left behind so the remaining text reads as a clean instruction.
431
+ * Refs must come from {@link findAssetRefs} on the same string. Newlines are
432
+ * preserved.
433
+ */
434
+ export function stripAssetRefs(prompt, refs) {
435
+ return replaceAssetRefs(prompt, refs, () => "");
436
+ }
437
+ /**
438
+ * Expand any folder mention in `text` into the `asset://<id>.<ext>` tokens of
439
+ * its members of an accepted kind, recursively. A folder mention is a bare
440
+ * `asset://<id>` (no extension) that {@link ProcessingContext.listFolderAssets}
441
+ * resolves to a folder; non-folder bare tokens and ordinary media tokens are
442
+ * left untouched. The expanded tokens then flow through the normal matcher, so
443
+ * a referenced folder fills as many of the node's media inputs as it can.
444
+ */
445
+ async function expandFolderRefs(text, context, acceptedKinds) {
446
+ if (!context || !text.includes("asset://"))
447
+ return text;
448
+ // Bare `asset://<id>` tokens (no extension) are folder candidates.
449
+ const candidates = [];
450
+ ASSET_URI_RE.lastIndex = 0;
451
+ let match;
452
+ while ((match = ASSET_URI_RE.exec(text)) !== null) {
453
+ const token = match[0];
454
+ const id = token.slice("asset://".length);
455
+ if (id.includes("."))
456
+ continue; // has an extension → a media ref, not a folder
457
+ candidates.push({ index: match.index, length: token.length, id });
458
+ }
459
+ if (candidates.length === 0)
460
+ return text;
461
+ const replacements = new Map();
462
+ for (const candidate of candidates) {
463
+ const entries = await context.listFolderAssets(candidate.id);
464
+ if (!entries)
465
+ continue; // not a folder → leave the token alone
466
+ const uris = [];
467
+ for (const entry of entries) {
468
+ const ext = extForContentType(entry.content_type);
469
+ if (!ext)
470
+ continue;
471
+ const classification = classifyAssetToken(`asset://${entry.id}.${ext}`);
472
+ if (!classification || !acceptedKinds.has(classification.kind))
473
+ continue;
474
+ uris.push(`asset://${entry.id}.${ext}`);
475
+ }
476
+ replacements.set(candidate.index, uris.join(" "));
477
+ }
478
+ if (replacements.size === 0)
479
+ return text;
480
+ let result = "";
481
+ let cursor = 0;
482
+ for (const candidate of candidates) {
483
+ const replacement = replacements.get(candidate.index);
484
+ if (replacement === undefined)
485
+ continue;
486
+ result += text.slice(cursor, candidate.index);
487
+ result += replacement;
488
+ cursor = candidate.index + candidate.length;
489
+ }
490
+ result += text.slice(cursor);
491
+ return collapseGapWhitespace(result);
492
+ }
493
+ /** Matches an inline `entity://<id>` token (an entity mention from `@`). */
494
+ const ENTITY_URI_RE = /entity:\/\/[A-Za-z0-9._~-]+/g;
495
+ /** Read the entity marker off asset metadata, or null when absent/malformed. */
496
+ function readEntityMarker(metadata) {
497
+ const raw = metadata?.["nodetool_entity"];
498
+ if (!isObjectLike(raw))
499
+ return null;
500
+ const obj = raw;
501
+ const name = isString(obj.name) ? obj.name.trim() : "";
502
+ if (!name)
503
+ return null;
504
+ const descriptor = isString(obj.descriptor) ? obj.descriptor.trim() : "";
505
+ const referenceAssetId = isString(obj.reference_asset_id) ? obj.reference_asset_id.trim() : "";
506
+ return { name, descriptor, referenceAssetId };
507
+ }
508
+ /**
509
+ * Expand `entity://<id>` mentions (entities are library assets tagged with a
510
+ * `nodetool_entity` marker; the `@`-mention pickers encode them as this token).
511
+ *
512
+ * Each token is replaced inline with the entity's **name** so the sentence
513
+ * still reads naturally, and every mentioned entity contributes once to a
514
+ * trailing `Consistency references:` block carrying its canonical descriptor —
515
+ * the same shape the Apply Entities node produces. With `includeImageRefs`,
516
+ * each entity's reference image is appended as an `asset://<id>.<ext>` token so
517
+ * the normal media-mention machinery routes it into a typed image input.
518
+ *
519
+ * Resolution happens here, at generation time, so later edits to an entity's
520
+ * descriptor or image propagate to every prompt that mentions it. A token that
521
+ * cannot be resolved (unknown id, no marker, no context) is dropped.
522
+ */
523
+ export async function expandEntityRefs(text, context, includeImageRefs) {
524
+ if (!text.includes("entity://"))
525
+ return text;
526
+ const tokens = [];
527
+ ENTITY_URI_RE.lastIndex = 0;
528
+ let match;
529
+ while ((match = ENTITY_URI_RE.exec(text)) !== null) {
530
+ // Trailing dots are sentence punctuation, not part of the id.
531
+ const token = trimTrailingDots(match[0]);
532
+ tokens.push({
533
+ index: match.index,
534
+ length: token.length,
535
+ id: token.slice("entity://".length)
536
+ });
537
+ }
538
+ if (tokens.length === 0)
539
+ return text;
540
+ // Resolve each unique id once; a mention of the same entity twice reads as
541
+ // its name twice but contributes a single consistency line / image ref.
542
+ const resolved = new Map();
543
+ for (const token of tokens) {
544
+ if (resolved.has(token.id))
545
+ continue;
546
+ const info = isCallable(context?.getAssetInfo)
547
+ ? await context.getAssetInfo(token.id)
548
+ : null;
549
+ const marker = info ? readEntityMarker(info.metadata) : null;
550
+ if (!info || !marker) {
551
+ resolved.set(token.id, null);
552
+ continue;
553
+ }
554
+ const image = includeImageRefs && marker.referenceAssetId && marker.referenceAssetId !== info.id
555
+ ? await context?.getAssetInfo(marker.referenceAssetId)
556
+ : info;
557
+ const ext = image?.content_type.startsWith("image/")
558
+ ? extForContentType(image.content_type)
559
+ : null;
560
+ resolved.set(token.id, {
561
+ marker,
562
+ imageToken: image && ext ? `asset://${image.id}.${ext}` : null
563
+ });
564
+ }
565
+ let result = "";
566
+ let cursor = 0;
567
+ const consistencyLines = [];
568
+ const imageTokens = [];
569
+ const contributed = new Set();
570
+ for (const token of tokens) {
571
+ result += text.slice(cursor, token.index);
572
+ cursor = token.index + token.length;
573
+ const entity = resolved.get(token.id);
574
+ if (!entity)
575
+ continue; // unresolvable mention → dropped
576
+ result += entity.marker.name;
577
+ if (contributed.has(token.id))
578
+ continue;
579
+ contributed.add(token.id);
580
+ if (entity.marker.descriptor) {
581
+ consistencyLines.push(`- ${entity.marker.name}: ${entity.marker.descriptor}`);
582
+ }
583
+ if (includeImageRefs && entity.imageToken) {
584
+ imageTokens.push(entity.imageToken);
585
+ }
586
+ }
587
+ result += text.slice(cursor);
588
+ result = collapseGapWhitespace(result);
589
+ if (consistencyLines.length > 0) {
590
+ result += `\n\nConsistency references:\n${consistencyLines.join("\n")}`;
591
+ }
592
+ if (imageTokens.length > 0) {
593
+ result += `\n${imageTokens.join(" ")}`;
594
+ }
595
+ return result;
596
+ }
597
+ /**
598
+ * Expand the entity mentions in a generation prompt and separate what the
599
+ * provider call needs from it: the seasoned text (names inline + a
600
+ * Consistency references block) and the entities' reference images as typed
601
+ * refs — never left in the text as dangling tokens.
602
+ *
603
+ * This is the direct-generation counterpart of what node prompts get through
604
+ * {@link mapPromptAssetsToInputs}: same expansion rule, but returning the
605
+ * routed images instead of writing them onto node input fields. Image
606
+ * mentions that were already in the caller's text are left untouched — only
607
+ * tokens this expansion itself produced are extracted and stripped.
608
+ */
609
+ export async function expandEntitiesForGeneration(prompt, resolver) {
610
+ const preExisting = new Set(findImageAssetRefs(prompt).map((r) => r.uri));
611
+ const expanded = await expandEntityRefs(prompt, resolver, true);
612
+ if (expanded === prompt) {
613
+ return { prompt, referenceImages: [] };
614
+ }
615
+ const referenceImages = findImageAssetRefs(expanded).filter((ref) => !preExisting.has(ref.uri));
616
+ return {
617
+ prompt: referenceImages.length > 0
618
+ ? stripAssetRefs(expanded, referenceImages).trimEnd()
619
+ : expanded,
620
+ referenceImages
621
+ };
622
+ }
623
+ /**
624
+ * Map media mentioned inline in a node's text inputs onto its typed media
625
+ * inputs. This is the generalized form of what text-generation tasks do when
626
+ * they expand `asset://` references into image / audio message blocks.
627
+ *
628
+ * A mention may be a single asset or a folder: folder mentions are expanded
629
+ * recursively to their member assets first (see {@link expandFolderRefs}), so a
630
+ * referenced folder fills as many inputs as it can.
631
+ *
632
+ * For every media kind the node actually accepts (derived from `assetFields`):
633
+ * - mentions of that kind are pulled out of the text inputs, in order;
634
+ * - each still-empty input of that kind is filled with the next mention,
635
+ * resolved to bytes (`data`) so the provider's normal `data` path uploads
636
+ * it — no provider needs to learn the `asset://` scheme;
637
+ * - `list[...]` inputs absorb all remaining mentions of their kind;
638
+ * - each placed mention is rewritten in the text to the input label it now
639
+ * lives in (`image_url`, `reference_image_urls[0]`, …) so the model can
640
+ * tell which slot holds which image; mentions that could not be placed
641
+ * (an input was already wired, or capacity ran out) are dropped rather
642
+ * than left as a dangling URI.
643
+ *
644
+ * Plain-text document mentions are inlined into the prompt as their decoded
645
+ * contents (see {@link inlineTextAssetRefs}). This applies even when the node
646
+ * has no media inputs at all (e.g. a text-to-image prompt referencing a brief).
647
+ *
648
+ * Inputs that already carry a source are left untouched. Returns a flat map of
649
+ * field name → replacement value (cleaned string for text fields, an
650
+ * {@link InjectedAssetRef} or array for asset fields); fields that did not
651
+ * change are absent, so callers do `overrides[name] ?? instance[name]`.
652
+ */
653
+ export async function mapPromptAssetsToInputs(textFields, assetFields, context) {
654
+ const overrides = {};
655
+ const acceptedKinds = new Set(assetFields.map((f) => f.kind));
656
+ // Expand entity mentions first (they inject descriptor text and, when the
657
+ // node accepts images, an `asset://` reference-image token), then folder
658
+ // mentions (only meaningful when the node has media inputs to receive them),
659
+ // and work off the expanded text. The original value is kept to decide
660
+ // whether the field actually changed (a folder that expanded to nothing
661
+ // still rewrites text).
662
+ const expandedByField = new Map();
663
+ for (const tf of textFields) {
664
+ const withEntities = await expandEntityRefs(tf.value, context, acceptedKinds.has("image"));
665
+ expandedByField.set(tf.name, assetFields.length > 0
666
+ ? await expandFolderRefs(withEntities, context, acceptedKinds)
667
+ : withEntities);
668
+ }
669
+ // A node with no typed media inputs still inlines plain-text document
670
+ // mentions into its prompt — that's the only transformation that applies.
671
+ if (assetFields.length === 0) {
672
+ for (const tf of textFields) {
673
+ const inlined = await inlineTextAssetRefs(expandedByField.get(tf.name) ?? tf.value, context);
674
+ if (inlined !== tf.value)
675
+ overrides[tf.name] = inlined;
676
+ }
677
+ return overrides;
678
+ }
679
+ // Refs of accepted kinds, queued per kind in source order across all text
680
+ // fields, plus the per-field ref list used for relabeling.
681
+ const queues = {
682
+ image: [],
683
+ audio: [],
684
+ video: []
685
+ };
686
+ const refsByField = new Map();
687
+ for (const tf of textFields) {
688
+ const refs = findAssetRefs(expandedByField.get(tf.name) ?? tf.value).filter((r) => acceptedKinds.has(r.kind));
689
+ if (refs.length === 0)
690
+ continue;
691
+ refsByField.set(tf.name, refs);
692
+ for (const ref of refs)
693
+ queues[ref.kind].push(ref);
694
+ }
695
+ const resolveRef = async (ref) => {
696
+ const injected = {
697
+ type: ref.kind,
698
+ uri: ref.uri,
699
+ mimeType: ref.mime
700
+ };
701
+ const bytes = await loadMediaRefBytes({ type: ref.kind, uri: ref.uri }, context);
702
+ if (bytes && bytes.length > 0) {
703
+ injected.data = encodeBase64(bytes);
704
+ }
705
+ return injected;
706
+ };
707
+ // Fill empty inputs in declaration order from the matching kind's queue,
708
+ // recording which input label each placed mention was routed into.
709
+ const labelByRef = new Map();
710
+ const cursor = { image: 0, audio: 0, video: 0 };
711
+ for (const field of assetFields) {
712
+ if (field.hasSource)
713
+ continue;
714
+ const queue = queues[field.kind];
715
+ if (cursor[field.kind] >= queue.length)
716
+ continue;
717
+ const label = field.label ?? field.name;
718
+ if (field.list) {
719
+ const remaining = queue.slice(cursor[field.kind]);
720
+ cursor[field.kind] = queue.length;
721
+ const resolved = [];
722
+ for (let i = 0; i < remaining.length; i++) {
723
+ labelByRef.set(remaining[i], `${label}[${i}]`);
724
+ resolved.push(await resolveRef(remaining[i]));
725
+ }
726
+ if (resolved.length > 0)
727
+ overrides[field.name] = resolved;
728
+ }
729
+ else {
730
+ const ref = queue[cursor[field.kind]++];
731
+ labelByRef.set(ref, label);
732
+ overrides[field.name] = await resolveRef(ref);
733
+ }
734
+ }
735
+ // Rewrite each text input off its (folder-)expanded value: a placed media
736
+ // mention becomes a reference to the input label it now lives in; an unplaced
737
+ // one is dropped. Then inline any plain-text document mentions into the
738
+ // result — done after the media rewrite so the document's own whitespace
739
+ // isn't touched by the gap-collapsing in `replaceAssetRefs`. Compared against
740
+ // the original so a folder that expanded to nothing still rewrites the field.
741
+ for (const tf of textFields) {
742
+ const expanded = expandedByField.get(tf.name) ?? tf.value;
743
+ const refs = refsByField.get(tf.name) ?? [];
744
+ const relabeled = replaceAssetRefs(expanded, refs, (ref) => labelByRef.get(ref) ?? "");
745
+ const rewritten = await inlineTextAssetRefs(relabeled, context);
746
+ if (rewritten !== tf.value)
747
+ overrides[tf.name] = rewritten;
748
+ }
749
+ return overrides;
750
+ }
751
+ //# sourceMappingURL=prompt-asset-refs.js.map