@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
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Per-turn spend admission for agent loops.
3
+ *
4
+ * A dollar ceiling cannot be enforced by checking spent cost before a call: the
5
+ * next call's cost is only known afterwards, so $0.49 spent under a $0.50 cap
6
+ * still admits a $0.30 call and lands at $0.79. The ceiling holds only if the
7
+ * worst case is *reserved* before the turn and reconciled to actuals after it.
8
+ *
9
+ * The interception point has to sit inside the provider layer. A wrapper around
10
+ * `generateLoop()` sees one call while the base loop makes its turns
11
+ * internally, and providers that own their loop (the Claude Agent SDK) never
12
+ * return between turns at all. So the budget is an object threaded through
13
+ * `generateLoop` options and honored before every model turn — by the base loop
14
+ * and, as a contract obligation, by any provider overriding it.
15
+ *
16
+ * See docs/workflow-supervisor-design.md §6.
17
+ */
18
+ import type { ProviderId } from "@nodetool-ai/protocol";
19
+ /** What a provider knows about the turn it is about to make. */
20
+ export interface TurnReservation {
21
+ model: string;
22
+ provider: ProviderId;
23
+ /** Prompt tokens the turn will send, as well as the provider can tell. */
24
+ inputTokens: number;
25
+ }
26
+ /**
27
+ * One admitted turn's reservation. `reserve` hands it back and `commit` takes
28
+ * it, so a budget shared by several loops settles the turn that finished
29
+ * rather than whichever one reserved last.
30
+ *
31
+ * It carries its own worst case and its own pricing, because both are
32
+ * per-turn: two loops can hold reservations of different sizes at the same
33
+ * time, and one of them can be on a model the catalog does not price.
34
+ */
35
+ export interface TurnReservationHandle {
36
+ /** USD this reservation holds against the cap. Zero for an unpriced turn. */
37
+ readonly worstCaseUsd: number;
38
+ /** True when the turn's model has no catalog price. */
39
+ readonly unpriced: boolean;
40
+ }
41
+ export interface TurnBudget {
42
+ /**
43
+ * Admit or refuse the turn. A refusal — `null` — is final for this loop: the
44
+ * provider stops rather than making the call. An admission is the handle to
45
+ * hand back to {@link TurnBudget.commit}.
46
+ */
47
+ reserve(turn: TurnReservation): TurnReservationHandle | null;
48
+ /**
49
+ * Reconcile one reservation against what its turn actually cost, in USD.
50
+ * Only the named handle is settled; every other loop's reservation stays
51
+ * outstanding. Committing a handle twice is a no-op.
52
+ *
53
+ * Pass `null` when turns provably ran but their cost was never reported —
54
+ * the Claude Agent SDK only reports usage on a terminal `result` message,
55
+ * which an aborted session never emits. That is not the same as free, and
56
+ * booking it as zero would hand the reserved headroom back for spend that
57
+ * really happened. The reserved worst case is charged instead.
58
+ */
59
+ commit(handle: TurnReservationHandle, actualUsd: number | null): void;
60
+ /** Committed spend so far, in USD. */
61
+ readonly spentUsd: number;
62
+ }
63
+ export interface CostCappedTurnBudgetOptions {
64
+ /** Ceiling on total spend, in USD. */
65
+ capUsd: number;
66
+ /**
67
+ * Output-token bound assumed for every turn. Reservation needs a *known*
68
+ * worst case, so this is required — an optional `maxTokens` that providers
69
+ * may ignore cannot bound anything.
70
+ */
71
+ maxOutputTokens: number;
72
+ }
73
+ /**
74
+ * The reserving budget. Refuses a turn whose worst case would cross the cap,
75
+ * and refuses any turn on a model with no price in the catalog — an unpriced
76
+ * model has no worst case, and admitting it would make the cap advisory.
77
+ */
78
+ export declare class CostCappedTurnBudget implements TurnBudget {
79
+ private readonly _capUsd;
80
+ private readonly _maxOutputTokens;
81
+ private _spentUsd;
82
+ /** Reservations of the turns in flight, released one at a time by `commit`. */
83
+ private readonly _outstanding;
84
+ /** Sum over {@link _outstanding}, kept incrementally. */
85
+ private _reservedUsd;
86
+ constructor(opts: CostCappedTurnBudgetOptions);
87
+ get spentUsd(): number;
88
+ reserve(turn: TurnReservation): TurnReservationHandle | null;
89
+ commit(handle: TurnReservationHandle, actualUsd: number | null): void;
90
+ private _hold;
91
+ }
92
+ /** Wall-clock ceiling for a run. */
93
+ export interface Deadline {
94
+ /** Epoch milliseconds after which the run must stop. */
95
+ readonly at: number;
96
+ remainingMs(): number;
97
+ expired(): boolean;
98
+ }
99
+ /**
100
+ * A deadline `ms` from now. `Infinity` means no deadline — `at` is `Infinity`,
101
+ * so `expired()` is false forever without a second "unbounded" code path.
102
+ */
103
+ export declare function createDeadline(ms: number): Deadline;
104
+ /**
105
+ * Hand back one permit. Idempotent: a caller that releases twice (a `finally`
106
+ * plus an explicit release, say) must not inflate the semaphore.
107
+ *
108
+ * Not a `Symbol.dispose` object — this package compiles against `lib: ES2022`,
109
+ * which has no disposable typings. A plain callable works in every consumer.
110
+ */
111
+ export type Release = () => void;
112
+ /** FIFO permit pool bounding concurrent provider conversations for a run. */
113
+ export interface Semaphore {
114
+ /** Permits the pool was created with. */
115
+ readonly permits: number;
116
+ /** Permits not currently held. */
117
+ readonly available: number;
118
+ /** Callers waiting for a permit. */
119
+ readonly waiting: number;
120
+ acquire(): Promise<Release>;
121
+ }
122
+ export declare function createSemaphore(permits: number): Semaphore;
123
+ /** Bounded counter. `increment` answers false once `max` has been reached. */
124
+ export interface Counter {
125
+ readonly max: number;
126
+ readonly current: number;
127
+ increment(): boolean;
128
+ }
129
+ export declare function createCounter(max: number): Counter;
130
+ /** Why a run stopped. An `as const` union, not an enum (AGENTS.md § TypeScript). */
131
+ export declare const BUDGET_EXHAUSTION_KINDS: readonly ["cost", "deadline", "turns"];
132
+ export type BudgetExhaustionKind = (typeof BUDGET_EXHAUSTION_KINDS)[number];
133
+ export interface BudgetExhaustion {
134
+ kind: BudgetExhaustionKind;
135
+ detail: string;
136
+ }
137
+ /** Which ceiling a {@link CompositeTurnBudget} refusal hit. */
138
+ export declare const TURN_REFUSALS: readonly ["cost-cap", "unpriced-token-ceiling"];
139
+ export type TurnRefusal = (typeof TURN_REFUSALS)[number];
140
+ export interface CompositeTurnBudgetOptions {
141
+ /**
142
+ * Ceiling on total spend, in USD, or `null` for no USD cap (a local-only
143
+ * install).
144
+ */
145
+ capUsd: number | null;
146
+ /** Output-token bound assumed for every turn. See {@link CostCappedTurnBudgetOptions}. */
147
+ maxOutputTokens: number;
148
+ /**
149
+ * Prompt-token ceiling applied to a turn on a model with no catalog price.
150
+ * Only consulted when a USD cap exists — see {@link CompositeTurnBudget}.
151
+ */
152
+ unpricedTokenCeiling: number;
153
+ }
154
+ /**
155
+ * The budget every run gets. Priced models behave exactly like
156
+ * {@link CostCappedTurnBudget}; a model with no catalog price is admitted
157
+ * against a prompt-token ceiling instead and its turns are counted apart from
158
+ * `spentUsd`.
159
+ *
160
+ * Why not just refuse an unpriced model the way `CostCappedTurnBudget` does:
161
+ * that budget is the supervisor's, where refusing is right — a supervisor that
162
+ * cannot be priced should not run. A user's chat turn on a model the catalog
163
+ * has not caught up with is a different case; refusing it would make the
164
+ * product unusable on any new model. So the run is bounded by the one thing
165
+ * that is known (prompt size) and the unknown is *reported* rather than
166
+ * booked: `spentUsd` is a lower bound whenever `unpricedTurns > 0`, never a
167
+ * claim that those turns were free (assumption A-5, invariant I-4).
168
+ *
169
+ * With `capUsd: null` there is no USD cap, and admission is therefore
170
+ * unbounded by cost — including for unpriced models. The token ceiling exists
171
+ * to keep a *cap* meaningful when a turn cannot be priced; with no cap there
172
+ * is nothing to keep meaningful, and enforcing it anyway would impose a prompt
173
+ * limit nobody configured. Deadline and turn count still bound such a run.
174
+ */
175
+ export declare class CompositeTurnBudget implements TurnBudget {
176
+ private readonly _capUsd;
177
+ private readonly _maxOutputTokens;
178
+ private readonly _unpricedTokenCeiling;
179
+ private _spentUsd;
180
+ /** Reservations of the turns in flight, released one at a time by `commit`. */
181
+ private readonly _outstanding;
182
+ /** Sum over {@link _outstanding}, kept incrementally. */
183
+ private _reservedUsd;
184
+ private _unpricedTurns;
185
+ private _lastRefusal;
186
+ constructor(opts: CompositeTurnBudgetOptions);
187
+ get spentUsd(): number;
188
+ /**
189
+ * Why the most recent `reserve` refused, so a caller can name the ceiling in
190
+ * the message the user sees rather than guessing which one it was.
191
+ */
192
+ get lastRefusal(): TurnRefusal | null;
193
+ /** Turns admitted on a model the price catalog does not cover. */
194
+ get unpricedTurns(): number;
195
+ /** True when `spentUsd` under-reports the run because some turns had no price. */
196
+ get hasUnpricedTurns(): boolean;
197
+ reserve(turn: TurnReservation): TurnReservationHandle | null;
198
+ commit(handle: TurnReservationHandle, actualUsd: number | null): void;
199
+ private _reserveUnpriced;
200
+ private _hold;
201
+ }
202
+ /**
203
+ * The run's spend admission, plus what `spentUsd` leaves out: turns admitted
204
+ * on a model the price catalog does not cover, so a reported total reads as
205
+ * the lower bound it is (invariant I-4).
206
+ */
207
+ export interface RunTurnBudget extends TurnBudget {
208
+ readonly unpricedTurns: number;
209
+ }
210
+ /** The four bounds one run shares, plus the reason it stopped. */
211
+ export interface RunBudget {
212
+ /** USD admission; reserve before a turn, commit after. */
213
+ turns: RunTurnBudget;
214
+ /** Absolute deadline; every loop checks it before a turn and before a tool call. */
215
+ deadline: Deadline;
216
+ /** Process-wide bound on concurrent provider conversations for this run. */
217
+ concurrency: Semaphore;
218
+ /** Cumulative model turns across every loop in the run. */
219
+ turnCount: Counter;
220
+ /** Why a stop happened, set once — the first reason wins. */
221
+ readonly exhausted: BudgetExhaustion | null;
222
+ }
223
+ export interface CreateRunBudgetOptions {
224
+ /** `null` = no USD cap (local-only install). */
225
+ capUsd: number | null;
226
+ maxOutputTokens: number;
227
+ /** Per-turn prompt-token ceiling when the model has no price. */
228
+ unpricedTokenCeiling: number;
229
+ deadlineMs: number;
230
+ maxConcurrency: number;
231
+ maxTurns: number;
232
+ }
233
+ /** Runtime narrower: a {@link RunBudget} carries the other three bounds. */
234
+ export declare function isRunBudget(value: TurnBudget | RunBudget | undefined | null): value is RunBudget;
235
+ /**
236
+ * Build the one budget a run shares downward (invariant I-2).
237
+ *
238
+ * `turns.reserve` is the single admission point: it checks the deadline, then
239
+ * the cumulative turn count, then the USD cap, and records the first reason it
240
+ * refuses for. A provider loop therefore only has to call `reserve` to honor
241
+ * all three, and reads `exhausted` to say which one stopped it.
242
+ */
243
+ export declare function createRunBudget(opts: CreateRunBudgetOptions): RunBudget;
244
+ /**
245
+ * Context variable holding the run's {@link RunBudget}.
246
+ *
247
+ * A budget has to reach loops the host never sees: an `AgentNode` a chat turn
248
+ * started through `run_node`, a JS script, a sub-agent three levels down. The
249
+ * context bag is the one channel every one of them already carries, and
250
+ * `ProcessingContext.copy()` shallow-copies it, so a child context shares the
251
+ * same object rather than a clone of it — which is what makes the cap a run
252
+ * total instead of a per-loop allowance (invariant I-2).
253
+ *
254
+ * It lives here, beside the type it names, so that hosts, `agents`, and
255
+ * `llm-nodes` agree on the key without any of them importing each other.
256
+ */
257
+ export declare const RUN_BUDGET_CONTEXT_KEY = "nodetool_run_budget";
258
+ /**
259
+ * Minimal reader for the context bag, so this stays free of a context import.
260
+ *
261
+ * `get` is optional because the callers are hosts and nodes that accept a
262
+ * partial context — a test double, or a node invoked with none at all. A
263
+ * context that cannot answer has no budget on it, which is the same answer as
264
+ * a context that answers with nothing; throwing instead would make reading the
265
+ * budget riskier than not having one.
266
+ */
267
+ interface RunBudgetContext {
268
+ get?<T = unknown>(key: string, defaultValue?: T): T;
269
+ }
270
+ /**
271
+ * The run budget a host put on the context, or `undefined` when none did.
272
+ *
273
+ * Absent means unbudgeted, not exhausted: a workflow run started from the
274
+ * kernel with no host budget must keep working exactly as it does today.
275
+ */
276
+ export declare function budgetFromContext(context: RunBudgetContext | undefined | null): RunBudget | undefined;
277
+ export {};
278
+ //# sourceMappingURL=turn-budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-budget.d.ts","sourceRoot":"","sources":["../src/turn-budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,365 @@
1
+ /**
2
+ * Per-turn spend admission for agent loops.
3
+ *
4
+ * A dollar ceiling cannot be enforced by checking spent cost before a call: the
5
+ * next call's cost is only known afterwards, so $0.49 spent under a $0.50 cap
6
+ * still admits a $0.30 call and lands at $0.79. The ceiling holds only if the
7
+ * worst case is *reserved* before the turn and reconciled to actuals after it.
8
+ *
9
+ * The interception point has to sit inside the provider layer. A wrapper around
10
+ * `generateLoop()` sees one call while the base loop makes its turns
11
+ * internally, and providers that own their loop (the Claude Agent SDK) never
12
+ * return between turns at all. So the budget is an object threaded through
13
+ * `generateLoop` options and honored before every model turn — by the base loop
14
+ * and, as a contract obligation, by any provider overriding it.
15
+ *
16
+ * See docs/workflow-supervisor-design.md §6.
17
+ */
18
+ import { createLogger } from "@nodetool-ai/config";
19
+ import { CostCalculator } from "./providers/cost-calculator.js";
20
+ const log = createLogger("nodetool.runtime.turn-budget");
21
+ /**
22
+ * The reserving budget. Refuses a turn whose worst case would cross the cap,
23
+ * and refuses any turn on a model with no price in the catalog — an unpriced
24
+ * model has no worst case, and admitting it would make the cap advisory.
25
+ */
26
+ export class CostCappedTurnBudget {
27
+ _capUsd;
28
+ _maxOutputTokens;
29
+ _spentUsd = 0;
30
+ /** Reservations of the turns in flight, released one at a time by `commit`. */
31
+ _outstanding = new Set();
32
+ /** Sum over {@link _outstanding}, kept incrementally. */
33
+ _reservedUsd = 0;
34
+ constructor(opts) {
35
+ this._capUsd = opts.capUsd;
36
+ this._maxOutputTokens = opts.maxOutputTokens;
37
+ }
38
+ get spentUsd() {
39
+ return this._spentUsd;
40
+ }
41
+ reserve(turn) {
42
+ const worstCase = CostCalculator.estimateTokenCostUsd(turn.model, { inputTokens: turn.inputTokens, outputTokens: this._maxOutputTokens }, turn.provider);
43
+ if (worstCase === null)
44
+ return null;
45
+ if (this._spentUsd + this._reservedUsd + worstCase > this._capUsd) {
46
+ return null;
47
+ }
48
+ return this._hold({ worstCaseUsd: worstCase, unpriced: false });
49
+ }
50
+ commit(handle, actualUsd) {
51
+ if (!this._outstanding.delete(handle))
52
+ return;
53
+ this._reservedUsd -= handle.worstCaseUsd;
54
+ // Unknown must not read as free — the same rule invocation-cost accounting
55
+ // follows. With no number to book, this turn's reservation is the charge.
56
+ this._spentUsd +=
57
+ actualUsd === null || !Number.isFinite(actualUsd)
58
+ ? handle.worstCaseUsd
59
+ : Math.max(actualUsd, 0);
60
+ }
61
+ _hold(handle) {
62
+ this._outstanding.add(handle);
63
+ this._reservedUsd += handle.worstCaseUsd;
64
+ return handle;
65
+ }
66
+ }
67
+ /**
68
+ * A deadline `ms` from now. `Infinity` means no deadline — `at` is `Infinity`,
69
+ * so `expired()` is false forever without a second "unbounded" code path.
70
+ */
71
+ export function createDeadline(ms) {
72
+ const at = Number.isFinite(ms) ? Date.now() + ms : Infinity;
73
+ return {
74
+ at,
75
+ remainingMs: () => (at === Infinity ? Infinity : at - Date.now()),
76
+ expired: () => Date.now() >= at
77
+ };
78
+ }
79
+ export function createSemaphore(permits) {
80
+ // A non-positive bound would deadlock every acquirer; treat it as "one at a
81
+ // time", which is the strictest bound that still makes progress.
82
+ const max = Number.isFinite(permits) && permits > 0 ? Math.floor(permits) : 1;
83
+ let held = 0;
84
+ const queue = [];
85
+ const makeRelease = () => {
86
+ let released = false;
87
+ return () => {
88
+ if (released)
89
+ return;
90
+ released = true;
91
+ const next = queue.shift();
92
+ if (next) {
93
+ // Hand the permit straight to the head of the queue: `held` stays put,
94
+ // so a waiter cannot be overtaken by a caller that acquires between
95
+ // this release and the waiter's continuation.
96
+ next(makeRelease());
97
+ return;
98
+ }
99
+ held--;
100
+ };
101
+ };
102
+ return {
103
+ permits: max,
104
+ get available() {
105
+ return max - held;
106
+ },
107
+ get waiting() {
108
+ return queue.length;
109
+ },
110
+ acquire() {
111
+ if (held < max) {
112
+ held++;
113
+ return Promise.resolve(makeRelease());
114
+ }
115
+ return new Promise((resolve) => queue.push(resolve));
116
+ }
117
+ };
118
+ }
119
+ export function createCounter(max) {
120
+ let current = 0;
121
+ return {
122
+ max,
123
+ get current() {
124
+ return current;
125
+ },
126
+ increment() {
127
+ if (current >= max)
128
+ return false;
129
+ current++;
130
+ return true;
131
+ }
132
+ };
133
+ }
134
+ /** Why a run stopped. An `as const` union, not an enum (AGENTS.md § TypeScript). */
135
+ export const BUDGET_EXHAUSTION_KINDS = ["cost", "deadline", "turns"];
136
+ /** Which ceiling a {@link CompositeTurnBudget} refusal hit. */
137
+ export const TURN_REFUSALS = ["cost-cap", "unpriced-token-ceiling"];
138
+ /** Models already logged as unpriced, so the notice fires once per model. */
139
+ const loggedUnpricedModels = new Set();
140
+ /**
141
+ * The budget every run gets. Priced models behave exactly like
142
+ * {@link CostCappedTurnBudget}; a model with no catalog price is admitted
143
+ * against a prompt-token ceiling instead and its turns are counted apart from
144
+ * `spentUsd`.
145
+ *
146
+ * Why not just refuse an unpriced model the way `CostCappedTurnBudget` does:
147
+ * that budget is the supervisor's, where refusing is right — a supervisor that
148
+ * cannot be priced should not run. A user's chat turn on a model the catalog
149
+ * has not caught up with is a different case; refusing it would make the
150
+ * product unusable on any new model. So the run is bounded by the one thing
151
+ * that is known (prompt size) and the unknown is *reported* rather than
152
+ * booked: `spentUsd` is a lower bound whenever `unpricedTurns > 0`, never a
153
+ * claim that those turns were free (assumption A-5, invariant I-4).
154
+ *
155
+ * With `capUsd: null` there is no USD cap, and admission is therefore
156
+ * unbounded by cost — including for unpriced models. The token ceiling exists
157
+ * to keep a *cap* meaningful when a turn cannot be priced; with no cap there
158
+ * is nothing to keep meaningful, and enforcing it anyway would impose a prompt
159
+ * limit nobody configured. Deadline and turn count still bound such a run.
160
+ */
161
+ export class CompositeTurnBudget {
162
+ _capUsd;
163
+ _maxOutputTokens;
164
+ _unpricedTokenCeiling;
165
+ _spentUsd = 0;
166
+ /** Reservations of the turns in flight, released one at a time by `commit`. */
167
+ _outstanding = new Set();
168
+ /** Sum over {@link _outstanding}, kept incrementally. */
169
+ _reservedUsd = 0;
170
+ _unpricedTurns = 0;
171
+ _lastRefusal = null;
172
+ constructor(opts) {
173
+ this._capUsd = opts.capUsd;
174
+ this._maxOutputTokens = opts.maxOutputTokens;
175
+ this._unpricedTokenCeiling = opts.unpricedTokenCeiling;
176
+ }
177
+ get spentUsd() {
178
+ return this._spentUsd;
179
+ }
180
+ /**
181
+ * Why the most recent `reserve` refused, so a caller can name the ceiling in
182
+ * the message the user sees rather than guessing which one it was.
183
+ */
184
+ get lastRefusal() {
185
+ return this._lastRefusal;
186
+ }
187
+ /** Turns admitted on a model the price catalog does not cover. */
188
+ get unpricedTurns() {
189
+ return this._unpricedTurns;
190
+ }
191
+ /** True when `spentUsd` under-reports the run because some turns had no price. */
192
+ get hasUnpricedTurns() {
193
+ return this._unpricedTurns > 0;
194
+ }
195
+ reserve(turn) {
196
+ const worstCase = CostCalculator.estimateTokenCostUsd(turn.model, { inputTokens: turn.inputTokens, outputTokens: this._maxOutputTokens }, turn.provider);
197
+ if (worstCase === null) {
198
+ return this._reserveUnpriced(turn);
199
+ }
200
+ if (this._capUsd !== null &&
201
+ this._spentUsd + this._reservedUsd + worstCase > this._capUsd) {
202
+ this._lastRefusal = "cost-cap";
203
+ return null;
204
+ }
205
+ this._lastRefusal = null;
206
+ return this._hold({ worstCaseUsd: worstCase, unpriced: false });
207
+ }
208
+ commit(handle, actualUsd) {
209
+ if (!this._outstanding.delete(handle))
210
+ return;
211
+ this._reservedUsd -= handle.worstCaseUsd;
212
+ const reported = actualUsd !== null && Number.isFinite(actualUsd)
213
+ ? Math.max(actualUsd, 0)
214
+ : null;
215
+ if (handle.unpriced) {
216
+ this._unpricedTurns++;
217
+ // No worst case to fall back on: an unpriced model has none. A number
218
+ // the provider reported anyway is real money and is booked; an unknown
219
+ // adds nothing to `spentUsd` and is visible as an unpriced turn.
220
+ if (reported !== null)
221
+ this._spentUsd += reported;
222
+ return;
223
+ }
224
+ this._spentUsd += reported ?? handle.worstCaseUsd;
225
+ }
226
+ _reserveUnpriced(turn) {
227
+ if (this._capUsd === null) {
228
+ this._lastRefusal = null;
229
+ return this._hold({ worstCaseUsd: 0, unpriced: true });
230
+ }
231
+ const key = `${turn.provider}/${turn.model}`;
232
+ if (!loggedUnpricedModels.has(key)) {
233
+ loggedUnpricedModels.add(key);
234
+ log.warn("Model has no catalog price; admitting against a token ceiling", {
235
+ provider: turn.provider,
236
+ model: turn.model,
237
+ unpricedTokenCeiling: this._unpricedTokenCeiling
238
+ });
239
+ }
240
+ if (turn.inputTokens > this._unpricedTokenCeiling) {
241
+ this._lastRefusal = "unpriced-token-ceiling";
242
+ return null;
243
+ }
244
+ this._lastRefusal = null;
245
+ return this._hold({ worstCaseUsd: 0, unpriced: true });
246
+ }
247
+ _hold(handle) {
248
+ this._outstanding.add(handle);
249
+ this._reservedUsd += handle.worstCaseUsd;
250
+ return handle;
251
+ }
252
+ }
253
+ /** Runtime narrower: a {@link RunBudget} carries the other three bounds. */
254
+ export function isRunBudget(value) {
255
+ return (typeof value === "object" &&
256
+ value !== null &&
257
+ "turns" in value &&
258
+ "deadline" in value &&
259
+ "concurrency" in value &&
260
+ "turnCount" in value);
261
+ }
262
+ /**
263
+ * Build the one budget a run shares downward (invariant I-2).
264
+ *
265
+ * `turns.reserve` is the single admission point: it checks the deadline, then
266
+ * the cumulative turn count, then the USD cap, and records the first reason it
267
+ * refuses for. A provider loop therefore only has to call `reserve` to honor
268
+ * all three, and reads `exhausted` to say which one stopped it.
269
+ */
270
+ export function createRunBudget(opts) {
271
+ const cost = new CompositeTurnBudget({
272
+ capUsd: opts.capUsd,
273
+ maxOutputTokens: opts.maxOutputTokens,
274
+ unpricedTokenCeiling: opts.unpricedTokenCeiling
275
+ });
276
+ const rawDeadline = createDeadline(opts.deadlineMs);
277
+ const turnCount = createCounter(opts.maxTurns);
278
+ let exhausted = null;
279
+ // Set once: a run that ran out of money and then ran out of time stopped for
280
+ // the money. Overwriting would report the symptom of the first stop.
281
+ const markExhausted = (kind, detail) => {
282
+ if (exhausted === null)
283
+ exhausted = { kind, detail };
284
+ };
285
+ // Any loop that checks the deadline records the reason by doing so, so a
286
+ // pre-turn deadline check needs no separate setter on the interface.
287
+ const deadline = {
288
+ at: rawDeadline.at,
289
+ remainingMs: () => rawDeadline.remainingMs(),
290
+ expired: () => {
291
+ if (!rawDeadline.expired())
292
+ return false;
293
+ markExhausted("deadline", `run deadline of ${Math.round(opts.deadlineMs)}ms reached`);
294
+ return true;
295
+ }
296
+ };
297
+ const turns = {
298
+ reserve(turn) {
299
+ if (deadline.expired())
300
+ return null;
301
+ // Read the count before spending it: a turn refused on cost must not
302
+ // also consume a turn slot, and a reservation cannot be handed back.
303
+ if (turnCount.current >= turnCount.max) {
304
+ markExhausted("turns", `turn limit of ${opts.maxTurns} reached`);
305
+ return null;
306
+ }
307
+ const handle = cost.reserve(turn);
308
+ if (handle === null) {
309
+ markExhausted("cost", cost.lastRefusal === "unpriced-token-ceiling"
310
+ ? `${turn.model} has no catalog price and the turn's ${turn.inputTokens} prompt tokens exceed the unpriced ceiling of ${opts.unpricedTokenCeiling}`
311
+ : `turn budget of $${opts.capUsd} reached`);
312
+ return null;
313
+ }
314
+ turnCount.increment();
315
+ return handle;
316
+ },
317
+ commit(handle, actualUsd) {
318
+ cost.commit(handle, actualUsd);
319
+ },
320
+ get spentUsd() {
321
+ return cost.spentUsd;
322
+ },
323
+ get unpricedTurns() {
324
+ return cost.unpricedTurns;
325
+ }
326
+ };
327
+ return {
328
+ turns,
329
+ deadline,
330
+ concurrency: createSemaphore(opts.maxConcurrency),
331
+ turnCount,
332
+ get exhausted() {
333
+ return exhausted;
334
+ }
335
+ };
336
+ }
337
+ /**
338
+ * Context variable holding the run's {@link RunBudget}.
339
+ *
340
+ * A budget has to reach loops the host never sees: an `AgentNode` a chat turn
341
+ * started through `run_node`, a JS script, a sub-agent three levels down. The
342
+ * context bag is the one channel every one of them already carries, and
343
+ * `ProcessingContext.copy()` shallow-copies it, so a child context shares the
344
+ * same object rather than a clone of it — which is what makes the cap a run
345
+ * total instead of a per-loop allowance (invariant I-2).
346
+ *
347
+ * It lives here, beside the type it names, so that hosts, `agents`, and
348
+ * `llm-nodes` agree on the key without any of them importing each other.
349
+ */
350
+ export const RUN_BUDGET_CONTEXT_KEY = "nodetool_run_budget";
351
+ /**
352
+ * The run budget a host put on the context, or `undefined` when none did.
353
+ *
354
+ * Absent means unbudgeted, not exhausted: a workflow run started from the
355
+ * kernel with no host budget must keep working exactly as it does today.
356
+ */
357
+ export function budgetFromContext(context) {
358
+ if (typeof context?.get !== "function")
359
+ return undefined;
360
+ const value = context.get(RUN_BUDGET_CONTEXT_KEY);
361
+ return isRunBudget(value)
362
+ ? value
363
+ : undefined;
364
+ }
365
+ //# sourceMappingURL=turn-budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-budget.js","sourceRoot":"","sources":["../src/turn-budget.ts"],"names":[],"mappings":"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"}