@pipedog/core 0.0.0 → 0.1.0

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 (698) hide show
  1. package/LICENSE +25 -0
  2. package/NOTICE +9 -0
  3. package/dist/adapters/base_llm_adapter.d.ts +266 -0
  4. package/dist/adapters/base_llm_adapter.js +489 -0
  5. package/dist/adapters/index.d.ts +2 -0
  6. package/dist/adapters/index.js +8 -0
  7. package/dist/adapters/schemas/direct_function.d.ts +202 -0
  8. package/dist/adapters/schemas/direct_function.js +302 -0
  9. package/dist/adapters/schemas/function_schema.d.ts +67 -0
  10. package/dist/adapters/schemas/function_schema.js +72 -0
  11. package/dist/adapters/schemas/index.d.ts +2 -0
  12. package/dist/adapters/schemas/index.js +8 -0
  13. package/dist/adapters/schemas/tools_schema.d.ts +57 -0
  14. package/dist/adapters/schemas/tools_schema.js +79 -0
  15. package/dist/adapters/services/index.d.ts +2 -0
  16. package/dist/adapters/services/index.js +8 -0
  17. package/dist/adapters/services/open_ai_adapter.d.ts +147 -0
  18. package/dist/adapters/services/open_ai_adapter.js +250 -0
  19. package/dist/audio/dtmf/dtmf_data.d.ts +3 -0
  20. package/dist/audio/dtmf/dtmf_data.js +22 -0
  21. package/dist/audio/dtmf/index.d.ts +2 -0
  22. package/dist/audio/dtmf/index.js +8 -0
  23. package/dist/audio/dtmf/types.d.ts +31 -0
  24. package/dist/audio/dtmf/types.js +35 -0
  25. package/dist/audio/dtmf/utils.d.ts +13 -0
  26. package/dist/audio/dtmf/utils.js +62 -0
  27. package/dist/audio/filters/base_audio_filter.d.ts +51 -0
  28. package/dist/audio/filters/base_audio_filter.js +17 -0
  29. package/dist/audio/filters/index.d.ts +2 -0
  30. package/dist/audio/filters/index.js +8 -0
  31. package/dist/audio/index.d.ts +2 -0
  32. package/dist/audio/index.js +8 -0
  33. package/dist/audio/krisp_instance.d.ts +95 -0
  34. package/dist/audio/krisp_instance.js +229 -0
  35. package/dist/audio/mixers/base_audio_mixer.d.ts +56 -0
  36. package/dist/audio/mixers/base_audio_mixer.js +16 -0
  37. package/dist/audio/mixers/index.d.ts +2 -0
  38. package/dist/audio/mixers/index.js +8 -0
  39. package/dist/audio/resamplers/base_audio_resampler.d.ts +46 -0
  40. package/dist/audio/resamplers/base_audio_resampler.js +35 -0
  41. package/dist/audio/resamplers/index.d.ts +2 -0
  42. package/dist/audio/resamplers/index.js +8 -0
  43. package/dist/audio/resamplers/resampy_resampler.d.ts +10 -0
  44. package/dist/audio/resamplers/resampy_resampler.js +15 -0
  45. package/dist/audio/resamplers/soxr_resampler.d.ts +54 -0
  46. package/dist/audio/resamplers/soxr_resampler.js +69 -0
  47. package/dist/audio/resamplers/soxr_stream_resampler.d.ts +75 -0
  48. package/dist/audio/resamplers/soxr_stream_resampler.js +146 -0
  49. package/dist/audio/turn/base_turn_analyzer.d.ts +84 -0
  50. package/dist/audio/turn/base_turn_analyzer.js +61 -0
  51. package/dist/audio/turn/index.d.ts +2 -0
  52. package/dist/audio/turn/index.js +8 -0
  53. package/dist/audio/turn/smart_turn/_whisper_features.d.ts +30 -0
  54. package/dist/audio/turn/smart_turn/_whisper_features.js +225 -0
  55. package/dist/audio/turn/smart_turn/base_smart_turn.d.ts +94 -0
  56. package/dist/audio/turn/smart_turn/base_smart_turn.js +239 -0
  57. package/dist/audio/turn/smart_turn/local_smart_turn_v3.d.ts +76 -0
  58. package/dist/audio/turn/smart_turn/local_smart_turn_v3.js +143 -0
  59. package/dist/audio/utils.d.ts +224 -0
  60. package/dist/audio/utils.js +634 -0
  61. package/dist/audio/vad/data/index.d.ts +2 -0
  62. package/dist/audio/vad/data/index.js +8 -0
  63. package/dist/audio/vad/index.d.ts +2 -0
  64. package/dist/audio/vad/index.js +8 -0
  65. package/dist/audio/vad/vad_analyzer.d.ts +126 -0
  66. package/dist/audio/vad/vad_analyzer.js +211 -0
  67. package/dist/audio/vad/vad_controller.d.ts +143 -0
  68. package/dist/audio/vad/vad_controller.js +228 -0
  69. package/dist/audio/volume.d.ts +38 -0
  70. package/dist/audio/volume.js +75 -0
  71. package/dist/bus/adapters/base.d.ts +35 -0
  72. package/dist/bus/adapters/base.js +19 -0
  73. package/dist/bus/adapters/index.d.ts +10 -0
  74. package/dist/bus/adapters/index.js +15 -0
  75. package/dist/bus/adapters/llm_context_adapter.d.ts +36 -0
  76. package/dist/bus/adapters/llm_context_adapter.js +82 -0
  77. package/dist/bus/adapters/tools_schema_adapter.d.ts +25 -0
  78. package/dist/bus/adapters/tools_schema_adapter.js +70 -0
  79. package/dist/bus/bridge_processor.d.ts +111 -0
  80. package/dist/bus/bridge_processor.js +166 -0
  81. package/dist/bus/bus.d.ts +110 -0
  82. package/dist/bus/bus.js +200 -0
  83. package/dist/bus/index.d.ts +22 -0
  84. package/dist/bus/index.js +27 -0
  85. package/dist/bus/local/async_queue.d.ts +12 -0
  86. package/dist/bus/local/async_queue.js +21 -0
  87. package/dist/bus/local/index.d.ts +3 -0
  88. package/dist/bus/local/index.js +8 -0
  89. package/dist/bus/messages.d.ts +378 -0
  90. package/dist/bus/messages.js +357 -0
  91. package/dist/bus/network/index.d.ts +16 -0
  92. package/dist/bus/network/index.js +21 -0
  93. package/dist/bus/queue.d.ts +27 -0
  94. package/dist/bus/queue.js +51 -0
  95. package/dist/bus/serializers/base.d.ts +25 -0
  96. package/dist/bus/serializers/base.js +14 -0
  97. package/dist/bus/serializers/index.d.ts +9 -0
  98. package/dist/bus/serializers/index.js +14 -0
  99. package/dist/bus/serializers/json.d.ts +77 -0
  100. package/dist/bus/serializers/json.js +367 -0
  101. package/dist/bus/subscriber.d.ts +46 -0
  102. package/dist/bus/subscriber.js +27 -0
  103. package/dist/bus/ui/index.d.ts +3 -0
  104. package/dist/bus/ui/index.js +8 -0
  105. package/dist/bus/ui/messages.d.ts +186 -0
  106. package/dist/bus/ui/messages.js +171 -0
  107. package/dist/classifiers/base_classifier.d.ts +263 -0
  108. package/dist/classifiers/base_classifier.js +346 -0
  109. package/dist/classifiers/cloudflare/clef/classifier.d.ts +70 -0
  110. package/dist/classifiers/cloudflare/clef/classifier.js +204 -0
  111. package/dist/classifiers/cloudflare/clef/client.d.ts +104 -0
  112. package/dist/classifiers/cloudflare/clef/client.js +234 -0
  113. package/dist/classifiers/cloudflare/clef/index.d.ts +2 -0
  114. package/dist/classifiers/cloudflare/clef/index.js +8 -0
  115. package/dist/classifiers/cloudflare/index.d.ts +2 -0
  116. package/dist/classifiers/cloudflare/index.js +8 -0
  117. package/dist/classifiers/http_client.d.ts +70 -0
  118. package/dist/classifiers/http_client.js +161 -0
  119. package/dist/classifiers/index.d.ts +2 -0
  120. package/dist/classifiers/index.js +8 -0
  121. package/dist/classifiers/jev/classifier.d.ts +8 -0
  122. package/dist/classifiers/jev/classifier.js +13 -0
  123. package/dist/classifiers/jev/client.d.ts +8 -0
  124. package/dist/classifiers/jev/client.js +13 -0
  125. package/dist/classifiers/jev/index.d.ts +2 -0
  126. package/dist/classifiers/jev/index.js +8 -0
  127. package/dist/classifiers/llm/classifier.d.ts +72 -0
  128. package/dist/classifiers/llm/classifier.js +304 -0
  129. package/dist/classifiers/llm/index.d.ts +2 -0
  130. package/dist/classifiers/llm/index.js +8 -0
  131. package/dist/classifiers/openai/decisions/classifier.d.ts +77 -0
  132. package/dist/classifiers/openai/decisions/classifier.js +241 -0
  133. package/dist/classifiers/openai/decisions/client.d.ts +108 -0
  134. package/dist/classifiers/openai/decisions/client.js +234 -0
  135. package/dist/classifiers/openai/decisions/index.d.ts +2 -0
  136. package/dist/classifiers/openai/decisions/index.js +8 -0
  137. package/dist/classifiers/openai/index.d.ts +2 -0
  138. package/dist/classifiers/openai/index.js +8 -0
  139. package/dist/classifiers/typesafe/index.d.ts +2 -0
  140. package/dist/classifiers/typesafe/index.js +8 -0
  141. package/dist/classifiers/typesafe/jev/classifier.d.ts +70 -0
  142. package/dist/classifiers/typesafe/jev/classifier.js +220 -0
  143. package/dist/classifiers/typesafe/jev/client.d.ts +105 -0
  144. package/dist/classifiers/typesafe/jev/client.js +233 -0
  145. package/dist/classifiers/typesafe/jev/index.d.ts +2 -0
  146. package/dist/classifiers/typesafe/jev/index.js +8 -0
  147. package/dist/clocks/base_clock.d.ts +13 -0
  148. package/dist/clocks/base_clock.js +14 -0
  149. package/dist/clocks/index.d.ts +2 -0
  150. package/dist/clocks/index.js +8 -0
  151. package/dist/clocks/system_clock.d.ts +15 -0
  152. package/dist/clocks/system_clock.js +25 -0
  153. package/dist/frames/frames.d.ts +2533 -0
  154. package/dist/frames/frames.js +2485 -0
  155. package/dist/frames/index.d.ts +2 -0
  156. package/dist/frames/index.js +8 -0
  157. package/dist/frames/protobufs/frames_pb2.d.ts +229 -0
  158. package/dist/frames/protobufs/frames_pb2.js +466 -0
  159. package/dist/index.d.ts +11 -0
  160. package/dist/index.js +56 -0
  161. package/dist/metrics/index.d.ts +2 -0
  162. package/dist/metrics/index.js +8 -0
  163. package/dist/metrics/metrics.d.ts +276 -0
  164. package/dist/metrics/metrics.js +254 -0
  165. package/dist/observers/base_observer.d.ts +173 -0
  166. package/dist/observers/base_observer.js +151 -0
  167. package/dist/observers/error_observer.d.ts +75 -0
  168. package/dist/observers/error_observer.js +87 -0
  169. package/dist/observers/function_call_observer.d.ts +157 -0
  170. package/dist/observers/function_call_observer.js +222 -0
  171. package/dist/observers/index.d.ts +2 -0
  172. package/dist/observers/index.js +8 -0
  173. package/dist/observers/loggers/debug_log_observer.d.ts +91 -0
  174. package/dist/observers/loggers/debug_log_observer.js +228 -0
  175. package/dist/observers/loggers/index.d.ts +2 -0
  176. package/dist/observers/loggers/index.js +8 -0
  177. package/dist/observers/loggers/llm_log_observer.d.ts +24 -0
  178. package/dist/observers/loggers/llm_log_observer.js +110 -0
  179. package/dist/observers/loggers/metrics_log_observer.d.ts +85 -0
  180. package/dist/observers/loggers/metrics_log_observer.js +186 -0
  181. package/dist/observers/loggers/transcription_log_observer.d.ts +23 -0
  182. package/dist/observers/loggers/transcription_log_observer.js +74 -0
  183. package/dist/observers/service_metrics_observer.d.ts +168 -0
  184. package/dist/observers/service_metrics_observer.js +236 -0
  185. package/dist/observers/speaking_observer.d.ts +104 -0
  186. package/dist/observers/speaking_observer.js +150 -0
  187. package/dist/observers/startup_timing_observer.d.ts +221 -0
  188. package/dist/observers/startup_timing_observer.js +365 -0
  189. package/dist/observers/turn_tracking_observer.d.ts +78 -0
  190. package/dist/observers/turn_tracking_observer.js +189 -0
  191. package/dist/observers/user_bot_latency_observer.d.ts +411 -0
  192. package/dist/observers/user_bot_latency_observer.js +974 -0
  193. package/dist/pipeline/base_pipeline.d.ts +49 -0
  194. package/dist/pipeline/base_pipeline.js +101 -0
  195. package/dist/pipeline/capabilities.d.ts +76 -0
  196. package/dist/pipeline/capabilities.js +97 -0
  197. package/dist/pipeline/index.d.ts +2 -0
  198. package/dist/pipeline/index.js +8 -0
  199. package/dist/pipeline/job_context.d.ts +317 -0
  200. package/dist/pipeline/job_context.js +450 -0
  201. package/dist/pipeline/job_decorator.d.ts +54 -0
  202. package/dist/pipeline/job_decorator.js +92 -0
  203. package/dist/pipeline/llm_switcher.d.ts +84 -0
  204. package/dist/pipeline/llm_switcher.js +107 -0
  205. package/dist/pipeline/llm_with_backend.d.ts +435 -0
  206. package/dist/pipeline/llm_with_backend.js +806 -0
  207. package/dist/pipeline/parallel_pipeline.d.ts +83 -0
  208. package/dist/pipeline/parallel_pipeline.js +200 -0
  209. package/dist/pipeline/pipeline.d.ts +126 -0
  210. package/dist/pipeline/pipeline.js +196 -0
  211. package/dist/pipeline/service_switcher.d.ts +287 -0
  212. package/dist/pipeline/service_switcher.js +509 -0
  213. package/dist/pipeline/sync_parallel_pipeline.d.ts +192 -0
  214. package/dist/pipeline/sync_parallel_pipeline.js +387 -0
  215. package/dist/pipeline/worker.d.ts +814 -0
  216. package/dist/pipeline/worker.js +1639 -0
  217. package/dist/pipeline/worker_observer.d.ts +131 -0
  218. package/dist/pipeline/worker_observer.js +274 -0
  219. package/dist/pipeline/worker_ready_decorator.d.ts +45 -0
  220. package/dist/pipeline/worker_ready_decorator.js +76 -0
  221. package/dist/processors/aggregators/async_tool_messages.d.ts +146 -0
  222. package/dist/processors/aggregators/async_tool_messages.js +291 -0
  223. package/dist/processors/aggregators/dtmf_aggregator.d.ts +61 -0
  224. package/dist/processors/aggregators/dtmf_aggregator.js +144 -0
  225. package/dist/processors/aggregators/gated.d.ts +43 -0
  226. package/dist/processors/aggregators/gated.js +86 -0
  227. package/dist/processors/aggregators/gated_llm_context.d.ts +42 -0
  228. package/dist/processors/aggregators/gated_llm_context.js +86 -0
  229. package/dist/processors/aggregators/index.d.ts +2 -0
  230. package/dist/processors/aggregators/index.js +8 -0
  231. package/dist/processors/aggregators/llm_context.d.ts +370 -0
  232. package/dist/processors/aggregators/llm_context.js +580 -0
  233. package/dist/processors/aggregators/llm_context_summarizer.d.ts +219 -0
  234. package/dist/processors/aggregators/llm_context_summarizer.js +447 -0
  235. package/dist/processors/aggregators/llm_response.d.ts +37 -0
  236. package/dist/processors/aggregators/llm_response.js +71 -0
  237. package/dist/processors/aggregators/llm_response_universal.d.ts +966 -0
  238. package/dist/processors/aggregators/llm_response_universal.js +2394 -0
  239. package/dist/processors/aggregators/llm_text_processor.d.ts +53 -0
  240. package/dist/processors/aggregators/llm_text_processor.js +102 -0
  241. package/dist/processors/aggregators/sentence.d.ts +39 -0
  242. package/dist/processors/aggregators/sentence.js +69 -0
  243. package/dist/processors/async_generator.d.ts +42 -0
  244. package/dist/processors/async_generator.js +76 -0
  245. package/dist/processors/audio/audio_buffer_processor.d.ts +241 -0
  246. package/dist/processors/audio/audio_buffer_processor.js +565 -0
  247. package/dist/processors/audio/index.d.ts +2 -0
  248. package/dist/processors/audio/index.js +8 -0
  249. package/dist/processors/audio/vad_processor.d.ts +67 -0
  250. package/dist/processors/audio/vad_processor.js +103 -0
  251. package/dist/processors/consumer_processor.d.ts +49 -0
  252. package/dist/processors/consumer_processor.js +85 -0
  253. package/dist/processors/filters/frame_filter.d.ts +39 -0
  254. package/dist/processors/filters/frame_filter.js +52 -0
  255. package/dist/processors/filters/function_filter.d.ts +59 -0
  256. package/dist/processors/filters/function_filter.js +78 -0
  257. package/dist/processors/filters/identity_filter.d.ts +33 -0
  258. package/dist/processors/filters/identity_filter.js +37 -0
  259. package/dist/processors/filters/index.d.ts +2 -0
  260. package/dist/processors/filters/index.js +8 -0
  261. package/dist/processors/filters/null_filter.d.ts +34 -0
  262. package/dist/processors/filters/null_filter.js +47 -0
  263. package/dist/processors/filters/wake_notifier_filter.d.ts +48 -0
  264. package/dist/processors/filters/wake_notifier_filter.js +49 -0
  265. package/dist/processors/frame_processor.d.ts +360 -0
  266. package/dist/processors/frame_processor.js +932 -0
  267. package/dist/processors/frameworks/index.d.ts +2 -0
  268. package/dist/processors/frameworks/index.js +8 -0
  269. package/dist/processors/frameworks/rtvi/frames.d.ts +241 -0
  270. package/dist/processors/frameworks/rtvi/frames.js +259 -0
  271. package/dist/processors/frameworks/rtvi/index.d.ts +6 -0
  272. package/dist/processors/frameworks/rtvi/index.js +11 -0
  273. package/dist/processors/frameworks/rtvi/models.d.ts +1741 -0
  274. package/dist/processors/frameworks/rtvi/models.js +1807 -0
  275. package/dist/processors/frameworks/rtvi/observer.d.ts +340 -0
  276. package/dist/processors/frameworks/rtvi/observer.js +1113 -0
  277. package/dist/processors/frameworks/rtvi/processor.d.ts +182 -0
  278. package/dist/processors/frameworks/rtvi/processor.js +676 -0
  279. package/dist/processors/idle_frame_processor.d.ts +44 -0
  280. package/dist/processors/idle_frame_processor.js +86 -0
  281. package/dist/processors/index.d.ts +2 -0
  282. package/dist/processors/index.js +8 -0
  283. package/dist/processors/logger.d.ts +42 -0
  284. package/dist/processors/logger.js +87 -0
  285. package/dist/processors/metrics/frame_processor_metrics.d.ts +172 -0
  286. package/dist/processors/metrics/frame_processor_metrics.js +372 -0
  287. package/dist/processors/metrics/index.d.ts +2 -0
  288. package/dist/processors/metrics/index.js +8 -0
  289. package/dist/processors/producer_processor.d.ts +68 -0
  290. package/dist/processors/producer_processor.js +78 -0
  291. package/dist/processors/text_transformer.d.ts +30 -0
  292. package/dist/processors/text_transformer.js +48 -0
  293. package/dist/registry/index.d.ts +3 -0
  294. package/dist/registry/index.js +8 -0
  295. package/dist/registry/registry.d.ts +69 -0
  296. package/dist/registry/registry.js +149 -0
  297. package/dist/registry/types.d.ts +47 -0
  298. package/dist/registry/types.js +39 -0
  299. package/dist/serializers/base_serializer.d.ts +94 -0
  300. package/dist/serializers/base_serializer.js +82 -0
  301. package/dist/serializers/index.d.ts +2 -0
  302. package/dist/serializers/index.js +8 -0
  303. package/dist/services/ai_service.d.ts +145 -0
  304. package/dist/services/ai_service.js +262 -0
  305. package/dist/services/anthropic/index.d.ts +2 -0
  306. package/dist/services/anthropic/index.js +7 -0
  307. package/dist/services/assemblyai/index.d.ts +2 -0
  308. package/dist/services/assemblyai/index.js +7 -0
  309. package/dist/services/asyncai/index.d.ts +2 -0
  310. package/dist/services/asyncai/index.js +7 -0
  311. package/dist/services/aws/index.d.ts +2 -0
  312. package/dist/services/aws/index.js +7 -0
  313. package/dist/services/azure/index.d.ts +2 -0
  314. package/dist/services/azure/index.js +7 -0
  315. package/dist/services/baseten/index.d.ts +2 -0
  316. package/dist/services/baseten/index.js +7 -0
  317. package/dist/services/bland/index.d.ts +2 -0
  318. package/dist/services/bland/index.js +7 -0
  319. package/dist/services/camb/index.d.ts +2 -0
  320. package/dist/services/camb/index.js +7 -0
  321. package/dist/services/cartesia/index.d.ts +2 -0
  322. package/dist/services/cartesia/index.js +7 -0
  323. package/dist/services/cerebras/index.d.ts +2 -0
  324. package/dist/services/cerebras/index.js +7 -0
  325. package/dist/services/crusoe/index.d.ts +2 -0
  326. package/dist/services/crusoe/index.js +7 -0
  327. package/dist/services/deepgram/index.d.ts +2 -0
  328. package/dist/services/deepgram/index.js +7 -0
  329. package/dist/services/deepseek/index.d.ts +2 -0
  330. package/dist/services/deepseek/index.js +7 -0
  331. package/dist/services/elevenlabs/index.d.ts +2 -0
  332. package/dist/services/elevenlabs/index.js +7 -0
  333. package/dist/services/fal/index.d.ts +2 -0
  334. package/dist/services/fal/index.js +7 -0
  335. package/dist/services/fireworks/index.d.ts +2 -0
  336. package/dist/services/fireworks/index.js +7 -0
  337. package/dist/services/fish/index.d.ts +2 -0
  338. package/dist/services/fish/index.js +7 -0
  339. package/dist/services/funasr/index.d.ts +3 -0
  340. package/dist/services/funasr/index.js +8 -0
  341. package/dist/services/gladia/index.d.ts +2 -0
  342. package/dist/services/gladia/index.js +7 -0
  343. package/dist/services/google/index.d.ts +2 -0
  344. package/dist/services/google/index.js +7 -0
  345. package/dist/services/gradium/index.d.ts +2 -0
  346. package/dist/services/gradium/index.js +7 -0
  347. package/dist/services/grok/index.d.ts +2 -0
  348. package/dist/services/grok/index.js +7 -0
  349. package/dist/services/groq/index.d.ts +2 -0
  350. package/dist/services/groq/index.js +7 -0
  351. package/dist/services/heygen/index.d.ts +2 -0
  352. package/dist/services/heygen/index.js +7 -0
  353. package/dist/services/hume/index.d.ts +2 -0
  354. package/dist/services/hume/index.js +7 -0
  355. package/dist/services/image_service.d.ts +52 -0
  356. package/dist/services/image_service.js +60 -0
  357. package/dist/services/inception/index.d.ts +2 -0
  358. package/dist/services/inception/index.js +7 -0
  359. package/dist/services/index.d.ts +2 -0
  360. package/dist/services/index.js +8 -0
  361. package/dist/services/inworld/index.d.ts +2 -0
  362. package/dist/services/inworld/index.js +7 -0
  363. package/dist/services/keenable/index.d.ts +2 -0
  364. package/dist/services/keenable/index.js +7 -0
  365. package/dist/services/kokoro/index.d.ts +2 -0
  366. package/dist/services/kokoro/index.js +7 -0
  367. package/dist/services/llm_service.d.ts +1106 -0
  368. package/dist/services/llm_service.js +2231 -0
  369. package/dist/services/mem0/index.d.ts +2 -0
  370. package/dist/services/mem0/index.js +7 -0
  371. package/dist/services/meta/index.d.ts +2 -0
  372. package/dist/services/meta/index.js +7 -0
  373. package/dist/services/minimax/index.d.ts +2 -0
  374. package/dist/services/minimax/index.js +7 -0
  375. package/dist/services/mistral/index.d.ts +2 -0
  376. package/dist/services/mistral/index.js +7 -0
  377. package/dist/services/moondream/index.d.ts +2 -0
  378. package/dist/services/moondream/index.js +7 -0
  379. package/dist/services/moonshine/index.d.ts +2 -0
  380. package/dist/services/moonshine/index.js +7 -0
  381. package/dist/services/nebius/index.d.ts +2 -0
  382. package/dist/services/nebius/index.js +7 -0
  383. package/dist/services/neuphonic/index.d.ts +2 -0
  384. package/dist/services/neuphonic/index.js +7 -0
  385. package/dist/services/novita/index.d.ts +2 -0
  386. package/dist/services/novita/index.js +7 -0
  387. package/dist/services/nvidia/index.d.ts +2 -0
  388. package/dist/services/nvidia/index.js +11 -0
  389. package/dist/services/ollama/index.d.ts +2 -0
  390. package/dist/services/ollama/index.js +7 -0
  391. package/dist/services/openai/index.d.ts +2 -0
  392. package/dist/services/openai/index.js +7 -0
  393. package/dist/services/openclaw/index.d.ts +14 -0
  394. package/dist/services/openclaw/index.js +19 -0
  395. package/dist/services/openrouter/index.d.ts +2 -0
  396. package/dist/services/openrouter/index.js +7 -0
  397. package/dist/services/perplexity/index.d.ts +2 -0
  398. package/dist/services/perplexity/index.js +7 -0
  399. package/dist/services/piper/index.d.ts +2 -0
  400. package/dist/services/piper/index.js +7 -0
  401. package/dist/services/pocket_tts/index.d.ts +2 -0
  402. package/dist/services/pocket_tts/index.js +7 -0
  403. package/dist/services/qwen/index.d.ts +2 -0
  404. package/dist/services/qwen/index.js +7 -0
  405. package/dist/services/resembleai/index.d.ts +2 -0
  406. package/dist/services/resembleai/index.js +7 -0
  407. package/dist/services/rime/index.d.ts +2 -0
  408. package/dist/services/rime/index.js +7 -0
  409. package/dist/services/sambanova/index.d.ts +2 -0
  410. package/dist/services/sambanova/index.js +7 -0
  411. package/dist/services/sarvam/index.d.ts +2 -0
  412. package/dist/services/sarvam/index.js +7 -0
  413. package/dist/services/settings.d.ts +356 -0
  414. package/dist/services/settings.js +437 -0
  415. package/dist/services/simli/index.d.ts +2 -0
  416. package/dist/services/simli/index.js +7 -0
  417. package/dist/services/smallest/index.d.ts +2 -0
  418. package/dist/services/smallest/index.js +7 -0
  419. package/dist/services/soniox/index.d.ts +2 -0
  420. package/dist/services/soniox/index.js +7 -0
  421. package/dist/services/speechify/index.d.ts +2 -0
  422. package/dist/services/speechify/index.js +7 -0
  423. package/dist/services/speechmatics/index.d.ts +2 -0
  424. package/dist/services/speechmatics/index.js +7 -0
  425. package/dist/services/stt_latency.d.ts +62 -0
  426. package/dist/services/stt_latency.js +71 -0
  427. package/dist/services/stt_service.d.ts +601 -0
  428. package/dist/services/stt_service.js +1044 -0
  429. package/dist/services/tavus/index.d.ts +2 -0
  430. package/dist/services/tavus/index.js +7 -0
  431. package/dist/services/together/index.d.ts +2 -0
  432. package/dist/services/together/index.js +7 -0
  433. package/dist/services/tts_service.d.ts +909 -0
  434. package/dist/services/tts_service.js +2018 -0
  435. package/dist/services/ultravox/index.d.ts +2 -0
  436. package/dist/services/ultravox/index.js +9 -0
  437. package/dist/services/vision_service.d.ts +56 -0
  438. package/dist/services/vision_service.js +62 -0
  439. package/dist/services/websocket_service.d.ts +213 -0
  440. package/dist/services/websocket_service.js +654 -0
  441. package/dist/services/whisper/index.d.ts +2 -0
  442. package/dist/services/whisper/index.js +9 -0
  443. package/dist/services/xai/index.d.ts +2 -0
  444. package/dist/services/xai/index.js +9 -0
  445. package/dist/services/xtts/index.d.ts +2 -0
  446. package/dist/services/xtts/index.js +9 -0
  447. package/dist/tests/index.d.ts +2 -0
  448. package/dist/tests/index.js +8 -0
  449. package/dist/tests/utils.d.ts +123 -0
  450. package/dist/tests/utils.js +212 -0
  451. package/dist/transcriptions/index.d.ts +2 -0
  452. package/dist/transcriptions/index.js +8 -0
  453. package/dist/transcriptions/language.d.ts +376 -0
  454. package/dist/transcriptions/language.js +543 -0
  455. package/dist/transports/base_input.d.ts +149 -0
  456. package/dist/transports/base_input.js +338 -0
  457. package/dist/transports/base_output.d.ts +432 -0
  458. package/dist/transports/base_output.js +1231 -0
  459. package/dist/transports/base_transport.d.ts +223 -0
  460. package/dist/transports/base_transport.js +167 -0
  461. package/dist/transports/daily/index.d.ts +2 -0
  462. package/dist/transports/daily/index.js +9 -0
  463. package/dist/transports/heygen/index.d.ts +2 -0
  464. package/dist/transports/heygen/index.js +9 -0
  465. package/dist/transports/index.d.ts +2 -0
  466. package/dist/transports/index.js +8 -0
  467. package/dist/transports/lemonslice/index.d.ts +2 -0
  468. package/dist/transports/lemonslice/index.js +9 -0
  469. package/dist/transports/livekit/index.d.ts +2 -0
  470. package/dist/transports/livekit/index.js +9 -0
  471. package/dist/transports/local/index.d.ts +2 -0
  472. package/dist/transports/local/index.js +9 -0
  473. package/dist/transports/moq/index.d.ts +2 -0
  474. package/dist/transports/moq/index.js +9 -0
  475. package/dist/transports/smallwebrtc/index.d.ts +2 -0
  476. package/dist/transports/smallwebrtc/index.js +9 -0
  477. package/dist/transports/tavus/index.d.ts +2 -0
  478. package/dist/transports/tavus/index.js +9 -0
  479. package/dist/transports/video_in_sampler.d.ts +157 -0
  480. package/dist/transports/video_in_sampler.js +258 -0
  481. package/dist/transports/vonage/index.d.ts +2 -0
  482. package/dist/transports/vonage/index.js +9 -0
  483. package/dist/transports/websocket/index.d.ts +2 -0
  484. package/dist/transports/websocket/index.js +9 -0
  485. package/dist/transports/whatsapp/index.d.ts +2 -0
  486. package/dist/transports/whatsapp/index.js +9 -0
  487. package/dist/turns/eager_end_of_turn_mixin.d.ts +70 -0
  488. package/dist/turns/eager_end_of_turn_mixin.js +122 -0
  489. package/dist/turns/empty_user_turn.d.ts +55 -0
  490. package/dist/turns/empty_user_turn.js +53 -0
  491. package/dist/turns/index.d.ts +2 -0
  492. package/dist/turns/index.js +8 -0
  493. package/dist/turns/speculation_gate.d.ts +169 -0
  494. package/dist/turns/speculation_gate.js +294 -0
  495. package/dist/turns/types.d.ts +33 -0
  496. package/dist/turns/types.js +35 -0
  497. package/dist/turns/user_idle_controller.d.ts +94 -0
  498. package/dist/turns/user_idle_controller.js +187 -0
  499. package/dist/turns/user_mute/always_user_mute_strategy.d.ts +15 -0
  500. package/dist/turns/user_mute/always_user_mute_strategy.js +29 -0
  501. package/dist/turns/user_mute/base_user_mute_strategy.d.ts +39 -0
  502. package/dist/turns/user_mute/base_user_mute_strategy.js +45 -0
  503. package/dist/turns/user_mute/first_speech_user_mute_strategy.d.ts +28 -0
  504. package/dist/turns/user_mute/first_speech_user_mute_strategy.js +52 -0
  505. package/dist/turns/user_mute/function_call_user_mute_strategy.d.ts +25 -0
  506. package/dist/turns/user_mute/function_call_user_mute_strategy.js +50 -0
  507. package/dist/turns/user_mute/index.d.ts +6 -0
  508. package/dist/turns/user_mute/index.js +11 -0
  509. package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.d.ts +43 -0
  510. package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.js +76 -0
  511. package/dist/turns/user_start/base_user_turn_start_strategy.d.ts +135 -0
  512. package/dist/turns/user_start/base_user_turn_start_strategy.js +134 -0
  513. package/dist/turns/user_start/external_user_turn_start_strategy.d.ts +45 -0
  514. package/dist/turns/user_start/external_user_turn_start_strategy.js +64 -0
  515. package/dist/turns/user_start/index.d.ts +8 -0
  516. package/dist/turns/user_start/index.js +16 -0
  517. package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.d.ts +133 -0
  518. package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.js +243 -0
  519. package/dist/turns/user_start/min_words_user_turn_start_strategy.d.ts +60 -0
  520. package/dist/turns/user_start/min_words_user_turn_start_strategy.js +102 -0
  521. package/dist/turns/user_start/transcription_user_turn_start_strategy.d.ts +29 -0
  522. package/dist/turns/user_start/transcription_user_turn_start_strategy.js +43 -0
  523. package/dist/turns/user_start/vad_user_turn_start_strategy.d.ts +20 -0
  524. package/dist/turns/user_start/vad_user_turn_start_strategy.js +31 -0
  525. package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.d.ts +141 -0
  526. package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.js +238 -0
  527. package/dist/turns/user_stop/base_user_turn_stop_strategy.d.ts +174 -0
  528. package/dist/turns/user_stop/base_user_turn_stop_strategy.js +170 -0
  529. package/dist/turns/user_stop/deferred_user_turn_stop_strategy.d.ts +81 -0
  530. package/dist/turns/user_stop/deferred_user_turn_stop_strategy.js +107 -0
  531. package/dist/turns/user_stop/eager_match_policy.d.ts +36 -0
  532. package/dist/turns/user_stop/eager_match_policy.js +50 -0
  533. package/dist/turns/user_stop/eager_user_turn_stop_strategy.d.ts +84 -0
  534. package/dist/turns/user_stop/eager_user_turn_stop_strategy.js +154 -0
  535. package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.d.ts +45 -0
  536. package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.js +55 -0
  537. package/dist/turns/user_stop/external_user_turn_stop_strategy.d.ts +115 -0
  538. package/dist/turns/user_stop/external_user_turn_stop_strategy.js +205 -0
  539. package/dist/turns/user_stop/index.d.ts +10 -0
  540. package/dist/turns/user_stop/index.js +15 -0
  541. package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.d.ts +44 -0
  542. package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.js +59 -0
  543. package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.d.ts +140 -0
  544. package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.js +303 -0
  545. package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.d.ts +135 -0
  546. package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.js +332 -0
  547. package/dist/turns/user_turn_completion_mixin.d.ts +147 -0
  548. package/dist/turns/user_turn_completion_mixin.js +591 -0
  549. package/dist/turns/user_turn_controller.d.ts +134 -0
  550. package/dist/turns/user_turn_controller.js +335 -0
  551. package/dist/turns/user_turn_processor.d.ts +87 -0
  552. package/dist/turns/user_turn_processor.js +180 -0
  553. package/dist/turns/user_turn_strategies.d.ts +187 -0
  554. package/dist/turns/user_turn_strategies.js +222 -0
  555. package/dist/utils/async_tool_cancellation.d.ts +35 -0
  556. package/dist/utils/async_tool_cancellation.js +78 -0
  557. package/dist/utils/asyncio/index.d.ts +2 -0
  558. package/dist/utils/asyncio/index.js +7 -0
  559. package/dist/utils/asyncio/task_manager.d.ts +49 -0
  560. package/dist/utils/asyncio/task_manager.js +105 -0
  561. package/dist/utils/base_object.d.ts +76 -0
  562. package/dist/utils/base_object.js +154 -0
  563. package/dist/utils/context/aggregated_frame_sequencer.d.ts +491 -0
  564. package/dist/utils/context/aggregated_frame_sequencer.js +803 -0
  565. package/dist/utils/context/audio_context_manager.d.ts +131 -0
  566. package/dist/utils/context/audio_context_manager.js +233 -0
  567. package/dist/utils/context/index.d.ts +2 -0
  568. package/dist/utils/context/index.js +7 -0
  569. package/dist/utils/context/llm_context_summarization.d.ts +258 -0
  570. package/dist/utils/context/llm_context_summarization.js +511 -0
  571. package/dist/utils/context/text_segment_map.d.ts +611 -0
  572. package/dist/utils/context/text_segment_map.js +1132 -0
  573. package/dist/utils/context/word_completion_tracker.d.ts +273 -0
  574. package/dist/utils/context/word_completion_tracker.js +441 -0
  575. package/dist/utils/context/word_timestamp_tracker.d.ts +72 -0
  576. package/dist/utils/context/word_timestamp_tracker.js +98 -0
  577. package/dist/utils/deprecation.d.ts +28 -0
  578. package/dist/utils/deprecation.js +75 -0
  579. package/dist/utils/env.d.ts +38 -0
  580. package/dist/utils/env.js +62 -0
  581. package/dist/utils/errors.d.ts +75 -0
  582. package/dist/utils/errors.js +202 -0
  583. package/dist/utils/file_resolver.d.ts +126 -0
  584. package/dist/utils/file_resolver.js +314 -0
  585. package/dist/utils/file_storage.d.ts +99 -0
  586. package/dist/utils/file_storage.js +100 -0
  587. package/dist/utils/frame_queue.d.ts +36 -0
  588. package/dist/utils/frame_queue.js +66 -0
  589. package/dist/utils/http.d.ts +39 -0
  590. package/dist/utils/http.js +53 -0
  591. package/dist/utils/image.d.ts +15 -0
  592. package/dist/utils/image.js +30 -0
  593. package/dist/utils/index.d.ts +2 -0
  594. package/dist/utils/index.js +8 -0
  595. package/dist/utils/log_config.d.ts +34 -0
  596. package/dist/utils/log_config.js +76 -0
  597. package/dist/utils/logger.d.ts +40 -0
  598. package/dist/utils/logger.js +91 -0
  599. package/dist/utils/mixin.d.ts +14 -0
  600. package/dist/utils/mixin.js +63 -0
  601. package/dist/utils/network.d.ts +73 -0
  602. package/dist/utils/network.js +90 -0
  603. package/dist/utils/security/allowed_origins.d.ts +16 -0
  604. package/dist/utils/security/allowed_origins.js +34 -0
  605. package/dist/utils/security/index.d.ts +2 -0
  606. package/dist/utils/security/index.js +7 -0
  607. package/dist/utils/security/redaction.d.ts +27 -0
  608. package/dist/utils/security/redaction.js +123 -0
  609. package/dist/utils/security/ssrf.d.ts +79 -0
  610. package/dist/utils/security/ssrf.js +327 -0
  611. package/dist/utils/shared.d.ts +35 -0
  612. package/dist/utils/shared.js +136 -0
  613. package/dist/utils/startup.d.ts +17 -0
  614. package/dist/utils/startup.js +130 -0
  615. package/dist/utils/string.d.ts +116 -0
  616. package/dist/utils/string.js +460 -0
  617. package/dist/utils/sync/base_notifier.d.ts +25 -0
  618. package/dist/utils/sync/base_notifier.js +16 -0
  619. package/dist/utils/sync/event_notifier.d.ts +38 -0
  620. package/dist/utils/sync/event_notifier.js +51 -0
  621. package/dist/utils/sync/index.d.ts +2 -0
  622. package/dist/utils/sync/index.js +7 -0
  623. package/dist/utils/text/alnum_utils.d.ts +109 -0
  624. package/dist/utils/text/alnum_utils.js +262 -0
  625. package/dist/utils/text/base_text_aggregator.d.ts +146 -0
  626. package/dist/utils/text/base_text_aggregator.js +102 -0
  627. package/dist/utils/text/base_text_filter.d.ts +54 -0
  628. package/dist/utils/text/base_text_filter.js +50 -0
  629. package/dist/utils/text/index.d.ts +2 -0
  630. package/dist/utils/text/index.js +7 -0
  631. package/dist/utils/text/markdown_text_filter.d.ts +147 -0
  632. package/dist/utils/text/markdown_text_filter.js +522 -0
  633. package/dist/utils/text/markup_utils.d.ts +54 -0
  634. package/dist/utils/text/markup_utils.js +156 -0
  635. package/dist/utils/text/pattern_pair_aggregator.d.ts +251 -0
  636. package/dist/utils/text/pattern_pair_aggregator.js +478 -0
  637. package/dist/utils/text/phonemes.d.ts +60 -0
  638. package/dist/utils/text/phonemes.js +172 -0
  639. package/dist/utils/text/simple_text_aggregator.d.ts +135 -0
  640. package/dist/utils/text/simple_text_aggregator.js +254 -0
  641. package/dist/utils/text/skip_tags_aggregator.d.ts +85 -0
  642. package/dist/utils/text/skip_tags_aggregator.js +147 -0
  643. package/dist/utils/text/transforms/pronunciations.d.ts +65 -0
  644. package/dist/utils/text/transforms/pronunciations.js +111 -0
  645. package/dist/utils/text/word_timestamp_utils.d.ts +26 -0
  646. package/dist/utils/text/word_timestamp_utils.js +52 -0
  647. package/dist/utils/time.d.ts +13 -0
  648. package/dist/utils/time.js +31 -0
  649. package/dist/utils/tracing/index.d.ts +3 -0
  650. package/dist/utils/tracing/index.js +8 -0
  651. package/dist/utils/tracing/service_attributes.d.ts +198 -0
  652. package/dist/utils/tracing/service_attributes.js +434 -0
  653. package/dist/utils/tracing/service_decorators.d.ts +214 -0
  654. package/dist/utils/tracing/service_decorators.js +1662 -0
  655. package/dist/utils/tracing/setup.d.ts +95 -0
  656. package/dist/utils/tracing/setup.js +110 -0
  657. package/dist/utils/tracing/tracing_context.d.ts +55 -0
  658. package/dist/utils/tracing/tracing_context.js +97 -0
  659. package/dist/utils/tracing/turn_trace_observer.d.ts +90 -0
  660. package/dist/utils/tracing/turn_trace_observer.js +219 -0
  661. package/dist/utils/types.d.ts +80 -0
  662. package/dist/utils/types.js +108 -0
  663. package/dist/utils/utils.d.ts +5 -0
  664. package/dist/utils/utils.js +22 -0
  665. package/dist/utils/yaml.d.ts +64 -0
  666. package/dist/utils/yaml.js +41 -0
  667. package/dist/version.d.ts +3 -0
  668. package/dist/version.js +7 -0
  669. package/dist/workers/base_worker.d.ts +772 -0
  670. package/dist/workers/base_worker.js +1298 -0
  671. package/dist/workers/index.d.ts +2 -0
  672. package/dist/workers/index.js +8 -0
  673. package/dist/workers/llm/backend_llm_worker.d.ts +552 -0
  674. package/dist/workers/llm/backend_llm_worker.js +1055 -0
  675. package/dist/workers/llm/index.d.ts +6 -0
  676. package/dist/workers/llm/index.js +11 -0
  677. package/dist/workers/llm/llm_context_worker.d.ts +66 -0
  678. package/dist/workers/llm/llm_context_worker.js +72 -0
  679. package/dist/workers/llm/llm_worker.d.ts +180 -0
  680. package/dist/workers/llm/llm_worker.js +323 -0
  681. package/dist/workers/llm/tool_decorator.d.ts +68 -0
  682. package/dist/workers/llm/tool_decorator.js +60 -0
  683. package/dist/workers/runner.d.ts +268 -0
  684. package/dist/workers/runner.js +489 -0
  685. package/dist/workers/ui/index.d.ts +22 -0
  686. package/dist/workers/ui/index.js +27 -0
  687. package/dist/workers/ui/ui_event_decorator.d.ts +43 -0
  688. package/dist/workers/ui/ui_event_decorator.js +75 -0
  689. package/dist/workers/ui/ui_job_context.d.ts +12 -0
  690. package/dist/workers/ui/ui_job_context.js +17 -0
  691. package/dist/workers/ui/ui_prompts.d.ts +21 -0
  692. package/dist/workers/ui/ui_prompts.js +41 -0
  693. package/dist/workers/ui/ui_tools.d.ts +32 -0
  694. package/dist/workers/ui/ui_tools.js +112 -0
  695. package/dist/workers/ui/ui_worker.d.ts +571 -0
  696. package/dist/workers/ui/ui_worker.js +1156 -0
  697. package/package.json +46 -3
  698. package/README.md +0 -5
@@ -0,0 +1,314 @@
1
+ // Copyright (c) 2024-2026, Daily
2
+ // Copyright (c) 2026, pipedog contributors
3
+ // SPDX-License-Identifier: BSD-2-Clause
4
+ //
5
+ // Ported from pipecat: src/pipecat/utils/file_resolver.py
6
+ /**
7
+ * Resolution of file URLs in an LLM context into bytes the provider can consume.
8
+ *
9
+ * A file reaches the context as a URL — `pipecat:<id>` from the development
10
+ * runner's upload endpoint, `gs://`/`s3://` from cloud storage, or plain
11
+ * `http(s)`. Whether that URL can be passed to the LLM provider as-is, or must
12
+ * first be fetched by this server and inlined as bytes, depends on the provider
13
+ * (each adapter declares what it can consume) and on who can reach the URL.
14
+ * `FileResolver` is the fetching half of that decision: it downloads the
15
+ * bytes when the provider can't, using the configured `FileStorage` for URLs
16
+ * the storage backend minted and plain HTTP for the rest, guarded by an SSRF
17
+ * reachability policy.
18
+ *
19
+ * The context itself is never modified: everything the resolver produces —
20
+ * downloaded bytes, base64 data URLs, reachability verdicts — is held in
21
+ * in-memory caches on the resolver, keyed by URL, where adapters read it
22
+ * synchronously during context conversion. The caches make resolved files
23
+ * provider-neutral: LLM services that share one resolver instance (e.g. services
24
+ * switched between mid-session) reuse each other's downloads, re-deciding only
25
+ * the per-provider question of whether a URL can be passed through.
26
+ *
27
+ * The resolver is configured on the LLM service (`fileResolver`), which
28
+ * resolves and converts in one step right before each completion — see
29
+ * `BaseLLMAdapter.getLlmInvocationParams`.
30
+ */
31
+ import { abortable, currentSignal, rethrowIfCancelled, TimeoutError } from "@pipedog/asyncio";
32
+ import { FileNotFoundError } from "./file_storage.js";
33
+ import { classifyUrlReachability, defaultAllowedFileUrlNetworks, IPNetwork, UrlReachability, } from "./security/ssrf.js";
34
+ const DEFAULT_MAX_FETCH_BYTES = 50 * 1024 * 1024;
35
+ const DEFAULT_FETCH_TIMEOUT_SECS = 30;
36
+ /** Raised when a file URL in the LLM context cannot be resolved to bytes. */
37
+ export class FileResolverError extends Error {
38
+ name = "FileResolverError";
39
+ }
40
+ const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
41
+ function bytesToBase64(data) {
42
+ let binary = "";
43
+ const chunk = 0x8000;
44
+ for (let i = 0; i < data.length; i += chunk) {
45
+ binary += String.fromCharCode(...data.subarray(i, i + chunk));
46
+ }
47
+ return btoa(binary);
48
+ }
49
+ function base64ToBytes(encoded) {
50
+ const binary = atob(encoded);
51
+ const out = new Uint8Array(binary.length);
52
+ for (let i = 0; i < binary.length; i++) {
53
+ out[i] = binary.charCodeAt(i);
54
+ }
55
+ return out;
56
+ }
57
+ function concatBytes(chunks, total) {
58
+ const out = new Uint8Array(total);
59
+ let offset = 0;
60
+ for (const chunk of chunks) {
61
+ out.set(chunk, offset);
62
+ offset += chunk.length;
63
+ }
64
+ return out;
65
+ }
66
+ function isTimeout(e) {
67
+ return (e instanceof TimeoutError ||
68
+ (typeof e === "object" && e !== null && e.name === "TimeoutError"));
69
+ }
70
+ /**
71
+ * Fetches and caches the bytes behind file URLs the LLM provider can't fetch itself.
72
+ *
73
+ * Handles three kinds of URL:
74
+ *
75
+ * - `data:` URLs are decoded directly.
76
+ * - `http(s)` URLs are fetched by this server, but only when the resolved
77
+ * address is publicly routable or falls within `allowedUrlNetworks` —
78
+ * a client-supplied URL must not be able to point this server at arbitrary
79
+ * private address space (SSRF). Redirects are refused rather than followed.
80
+ * - Any other scheme is delegated to `fileStorage`, which resolves the
81
+ * URLs it minted (`pipecat:<id>` for `LocalFileStorage`; a custom backend
82
+ * resolves whatever `save()` returned, e.g. `gs://` with the deployment's
83
+ * own credentials).
84
+ *
85
+ * Each URL is fetched once and served from the cache afterwards: a URL is
86
+ * assumed to identify one immutable piece of content, the same assumption
87
+ * the rest of the web's caches make. Content that changes should live at a
88
+ * new URL (uploads through the development runner mint a fresh URL per
89
+ * upload; a cache-busting query string works for external URLs), or use
90
+ * `forget` when the application knows a URL's content changed. Note the flip
91
+ * side for URLs a provider consumes directly: the provider fetches those
92
+ * itself, on its own schedule, so their freshness is out of this resolver's
93
+ * hands entirely.
94
+ *
95
+ * A stored file whose backend sets `deleteAfterLoad` is deleted only after
96
+ * its bytes are cached, so the cache entry becomes the surviving copy — which
97
+ * is why LLM services that may consume the same files (e.g. services switched
98
+ * between mid-session) should share one resolver instance rather than each
99
+ * constructing their own. Scope a resolver to one session: an instance shared
100
+ * across sessions would hold every session's files in memory and stretch the
101
+ * one-fetch-per-URL assumption across all of them.
102
+ *
103
+ * Subclass and override `fetch` to support additional schemes or
104
+ * credentialed fetches beyond what the storage backend provides.
105
+ */
106
+ export class FileResolver {
107
+ _fileStorage;
108
+ _allowedUrlNetworks;
109
+ _maxFetchBytes;
110
+ _fetchTimeoutSecs;
111
+ // Everything below is keyed by the URL exactly as it appears in the
112
+ // context, including data: URLs.
113
+ _bytesCache = new Map();
114
+ _dataUrlCache = new Map();
115
+ _reachabilityCache = new Map();
116
+ constructor(options = {}) {
117
+ this._fileStorage = options.fileStorage ?? null;
118
+ const allowedUrlNetworks = options.allowedUrlNetworks ?? defaultAllowedFileUrlNetworks();
119
+ this._allowedUrlNetworks = allowedUrlNetworks.map((net) => new IPNetwork(net));
120
+ this._maxFetchBytes = options.maxFetchBytes ?? DEFAULT_MAX_FETCH_BYTES;
121
+ this._fetchTimeoutSecs = options.fetchTimeoutSecs ?? DEFAULT_FETCH_TIMEOUT_SECS;
122
+ }
123
+ /** The storage backend used to resolve URLs it minted, if any. */
124
+ get fileStorage() {
125
+ return this._fileStorage;
126
+ }
127
+ /** Return the cached bytes for `url`, or null if it hasn't been fetched. */
128
+ cachedBytes(url) {
129
+ return this._bytesCache.get(url) ?? null;
130
+ }
131
+ /**
132
+ * Return the cached `data:` form for `url`, or null if not prepared.
133
+ *
134
+ * A `data:` URL is its own data-URL form.
135
+ */
136
+ cachedDataUrl(url) {
137
+ if (url.startsWith("data:")) {
138
+ return url;
139
+ }
140
+ return this._dataUrlCache.get(url) ?? null;
141
+ }
142
+ /** Return the cached reachability verdict for `url`, or null if unclassified. */
143
+ cachedReachability(url) {
144
+ return this._reachabilityCache.get(url) ?? null;
145
+ }
146
+ /**
147
+ * Drop everything cached for `url`, forcing a re-fetch on next use.
148
+ *
149
+ * For applications that know a URL's content has changed. A forgotten
150
+ * `deleteAfterLoad` upload can't be re-fetched — its stored copy was
151
+ * deleted when first cached — so forgetting one makes it unresolvable.
152
+ *
153
+ * @param url The URL whose cached content and reachability to drop.
154
+ */
155
+ forget(url) {
156
+ this._bytesCache.delete(url);
157
+ this._dataUrlCache.delete(url);
158
+ this._reachabilityCache.delete(url);
159
+ }
160
+ /**
161
+ * Classify who can reach an `http(s)` URL, honoring `allowedUrlNetworks`.
162
+ *
163
+ * Classified once per URL; later calls return the cached verdict.
164
+ */
165
+ async classify(url) {
166
+ let cached = this._reachabilityCache.get(url);
167
+ if (cached === undefined) {
168
+ cached = await classifyUrlReachability(url, this._allowedUrlNetworks);
169
+ this._reachabilityCache.set(url, cached);
170
+ }
171
+ return cached;
172
+ }
173
+ /**
174
+ * Return the bytes behind `url`, fetching and caching them on first use.
175
+ *
176
+ * @param url A `data:` URL, an `http(s)` URL, or a URL minted by the
177
+ * configured storage backend. A storage-resolved file is deleted after a
178
+ * successful load when the backend sets `deleteAfterLoad` — the bytes are
179
+ * cached first, so the cache entry becomes the surviving copy.
180
+ * @throws FileResolverError If the URL is refused by the reachability
181
+ * policy, exceeds the size limit, fails to download, or has a scheme
182
+ * nothing is configured to resolve.
183
+ */
184
+ async fetch(url) {
185
+ const cached = this._bytesCache.get(url);
186
+ if (cached !== undefined) {
187
+ return cached;
188
+ }
189
+ const data = await this._fetchUncached(url);
190
+ this._bytesCache.set(url, data);
191
+ return data;
192
+ }
193
+ /**
194
+ * Return the `data:` form of `url`'s bytes, encoding and caching it on first use.
195
+ *
196
+ * For adapters whose provider consumes base64 rather than raw bytes, so
197
+ * the encode happens once rather than on every context conversion.
198
+ *
199
+ * @param url A URL whose bytes are cached or fetchable — see `fetch`.
200
+ * @param mimeType The file's MIME type, used in the data URL.
201
+ * @throws FileResolverError If the bytes can't be fetched.
202
+ */
203
+ async ensureDataUrl(url, mimeType) {
204
+ if (url.startsWith("data:")) {
205
+ return url;
206
+ }
207
+ let cached = this._dataUrlCache.get(url);
208
+ if (cached === undefined) {
209
+ const data = await this.fetch(url);
210
+ const encoded = bytesToBase64(data);
211
+ cached = `data:${mimeType};base64,${encoded}`;
212
+ this._dataUrlCache.set(url, cached);
213
+ }
214
+ return cached;
215
+ }
216
+ async _fetchUncached(url) {
217
+ if (url.startsWith("data:")) {
218
+ return FileResolver._decodeDataUrl(url);
219
+ }
220
+ if (url.startsWith("http://") || url.startsWith("https://")) {
221
+ return await this._fetchHttp(url);
222
+ }
223
+ if (this._fileStorage !== null) {
224
+ let data;
225
+ try {
226
+ data = await this._fileStorage.load(url);
227
+ }
228
+ catch (e) {
229
+ if (e instanceof FileNotFoundError ||
230
+ (typeof e === "object" && e !== null && e.code === "ENOENT")) {
231
+ throw new FileResolverError(`File not found in storage: '${url}'`, { cause: e });
232
+ }
233
+ throw e;
234
+ }
235
+ // The bytes are about to be cached, so a backend whose URLs are
236
+ // all uploads it owns has no further use for the stored copy.
237
+ if (this._fileStorage.deleteAfterLoad) {
238
+ await this._fileStorage.delete(url);
239
+ }
240
+ return data;
241
+ }
242
+ throw new FileResolverError(`No way to resolve file URL '${url}': configure a FileResolver with a ` +
243
+ "fileStorage (or a custom fetch) that understands it.");
244
+ }
245
+ static _decodeDataUrl(url) {
246
+ const index = url.indexOf("base64,");
247
+ if (index < 0) {
248
+ throw new FileResolverError("Malformed data URL: not enough values to unpack");
249
+ }
250
+ try {
251
+ return base64ToBytes(url.slice(index + "base64,".length));
252
+ }
253
+ catch (e) {
254
+ throw new FileResolverError(`Malformed data URL: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
255
+ }
256
+ }
257
+ async _fetchHttp(url) {
258
+ const reachability = await this.classify(url);
259
+ if (reachability === UrlReachability.BLOCKED) {
260
+ throw new FileResolverError(`Refusing to fetch unreachable URL: '${url}'`);
261
+ }
262
+ const timeoutSignal = AbortSignal.timeout(this._fetchTimeoutSecs * 1000);
263
+ const signal = AbortSignal.any([currentSignal(), timeoutSignal]);
264
+ try {
265
+ // Redirects are not followed: re-validating the host on every hop is
266
+ // more machinery than this needs, and a redirect into unreachable
267
+ // address space is exactly what classify() above is meant to rule out.
268
+ const response = await abortable(fetch(url, { redirect: "manual", signal }));
269
+ if (REDIRECT_STATUSES.has(response.status) || response.type === "opaqueredirect") {
270
+ throw new FileResolverError(`Refusing to follow redirect fetching file from URL: '${url}'`);
271
+ }
272
+ if (!response.ok) {
273
+ throw new FileResolverError(`Failed to fetch file from URL '${url}': ${response.status}, message='${response.statusText}'`);
274
+ }
275
+ const contentLength = response.headers.get("content-length");
276
+ if (contentLength !== null && Number(contentLength) > this._maxFetchBytes) {
277
+ throw new FileResolverError(`File at URL exceeds ${this._maxFetchBytes} byte limit`);
278
+ }
279
+ // Accumulate chunks and enforce the size cap as they arrive.
280
+ const chunks = [];
281
+ let received = 0;
282
+ const body = response.body;
283
+ if (body) {
284
+ const reader = body.getReader();
285
+ try {
286
+ while (true) {
287
+ const { done, value } = await abortable(reader.read());
288
+ if (done)
289
+ break;
290
+ received += value.length;
291
+ if (received > this._maxFetchBytes) {
292
+ throw new FileResolverError(`File at URL exceeds ${this._maxFetchBytes} byte limit`);
293
+ }
294
+ chunks.push(value);
295
+ }
296
+ }
297
+ finally {
298
+ reader.cancel().catch(() => { });
299
+ }
300
+ }
301
+ return concatBytes(chunks, received);
302
+ }
303
+ catch (e) {
304
+ if (e instanceof FileResolverError)
305
+ throw e;
306
+ rethrowIfCancelled(e);
307
+ if (isTimeout(e) || timeoutSignal.aborted) {
308
+ throw new FileResolverError(`Timed out fetching file from URL: '${url}'`, { cause: e });
309
+ }
310
+ throw new FileResolverError(`Failed to fetch file from URL '${url}': ${e instanceof Error ? e.message : String(e)}`, { cause: e });
311
+ }
312
+ }
313
+ }
314
+ //# sourceMappingURL=file_resolver.js.map
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Pluggable storage for files uploaded by clients and referenced by URL later.
3
+ *
4
+ * `FileStorage` is the shared interface between the development runner's
5
+ * `POST /files` upload endpoint, which saves uploads and hands the resulting
6
+ * URL back to the client, and the LLM service's `FileResolver`, which loads
7
+ * the bytes back when the client references that URL in a send-file message.
8
+ * Passing the same storage instance to both means they agree on where uploads
9
+ * live without each needing its own copy of the configuration, and lets a
10
+ * deployment swap in a backend other than local disk by implementing this
11
+ * interface.
12
+ *
13
+ * The URL is the contract: `FileStorage.save` returns one, callers pass it
14
+ * back unmodified, and each implementation mints whatever form it can later
15
+ * resolve — `pipecat:<id>` for `LocalFileStorage`, or e.g. `gs://` / `s3://`
16
+ * for a custom cloud backend (which the LLM provider may then even fetch
17
+ * itself, without `FileStorage.load` being involved at all).
18
+ */
19
+ /**
20
+ * Thrown by `FileStorage.load` when a URL is invalid or no longer stored
21
+ * (Python's built-in `FileNotFoundError`).
22
+ */
23
+ export declare class FileNotFoundError extends Error {
24
+ name: string;
25
+ readonly code = "ENOENT";
26
+ }
27
+ /** Storage backend for files uploaded by clients and referenced by URL later. */
28
+ export declare abstract class FileStorage {
29
+ /**
30
+ * Whether a file should be deleted once its bytes have been consumed
31
+ * (loaded and inlined into the LLM context by a FileResolver, which then
32
+ * has no further use for the stored copy). Safe only when every URL this
33
+ * backend resolves is an upload it owns; leave false for backends whose
34
+ * URLs may point at shared data (e.g. arbitrary objects in a cloud
35
+ * bucket), where "read into a conversation" must not mean "destroy".
36
+ */
37
+ deleteAfterLoad: boolean;
38
+ /**
39
+ * Store a file and return the URL later passed to `load` or `delete`.
40
+ *
41
+ * @param filename The original filename, for backends that want to keep it
42
+ * (e.g. for content-type sniffing). Storage implementations should not use
43
+ * it to derive the returned URL.
44
+ * @param contents The raw file contents.
45
+ * @returns A URL identifying the stored file, in whatever form this backend
46
+ * can later resolve. Callers must pass it back unmodified to `load` or `delete`.
47
+ */
48
+ abstract save(filename: string, contents: Uint8Array): Promise<string>;
49
+ /**
50
+ * Return the stored contents for `fileUrl`.
51
+ *
52
+ * @param fileUrl A URL previously returned by `save`.
53
+ * @throws FileNotFoundError If `fileUrl` is invalid or no longer stored.
54
+ */
55
+ abstract load(fileUrl: string): Promise<Uint8Array>;
56
+ /**
57
+ * Remove the stored file for `fileUrl`, if present.
58
+ *
59
+ * @param fileUrl A URL previously returned by `save`.
60
+ */
61
+ abstract delete(fileUrl: string): Promise<void>;
62
+ }
63
+ export interface LocalFileStorageOptions {
64
+ /** Directory to store files in. Created on first save if missing. */
65
+ folder: string;
66
+ /**
67
+ * Maximum number of files to retain; oldest files (by mtime) are deleted
68
+ * once this is exceeded. Set to 0 to disable trimming.
69
+ */
70
+ maxFiles?: number;
71
+ }
72
+ /**
73
+ * Default storage backend: files on local disk, addressed as `pipecat:<hex>`.
74
+ *
75
+ * Suitable for local development and single-process deployments. The
76
+ * `pipecat:` scheme makes the URLs recognizable in logs and client payloads;
77
+ * the random hex suffix can't be used for path traversal and doesn't leak the
78
+ * original filename.
79
+ *
80
+ * STUB: disk I/O (`save`, `load`, `delete`, trimming) is not ported, since core
81
+ * cannot import `node:fs`. URL validation is.
82
+ */
83
+ export declare class LocalFileStorage extends FileStorage {
84
+ deleteAfterLoad: boolean;
85
+ protected static readonly _URL_PREFIX = "pipecat:";
86
+ protected static readonly _URL_SUFFIX_PATTERN: RegExp;
87
+ protected _folder: string;
88
+ protected _maxFiles: number;
89
+ constructor(options: LocalFileStorageOptions);
90
+ /** Write `contents` to a new randomly-named file and return its `pipecat:` URL. */
91
+ save(_filename: string, _contents: Uint8Array): Promise<string>;
92
+ /** Read and return the contents stored under `fileUrl`. */
93
+ load(fileUrl: string): Promise<Uint8Array>;
94
+ /** Delete the file stored under `fileUrl`, if it exists. */
95
+ delete(fileUrl: string): Promise<void>;
96
+ /** Validate `fileUrl` and return the on-disk filename it maps to. */
97
+ protected _resolveSuffix(fileUrl: string): string;
98
+ }
99
+ //# sourceMappingURL=file_storage.d.ts.map
@@ -0,0 +1,100 @@
1
+ // Copyright (c) 2024-2026, Daily
2
+ // Copyright (c) 2026, pipedog contributors
3
+ // SPDX-License-Identifier: BSD-2-Clause
4
+ //
5
+ // Ported from pipecat: src/pipecat/utils/file_storage.py
6
+ /**
7
+ * Pluggable storage for files uploaded by clients and referenced by URL later.
8
+ *
9
+ * `FileStorage` is the shared interface between the development runner's
10
+ * `POST /files` upload endpoint, which saves uploads and hands the resulting
11
+ * URL back to the client, and the LLM service's `FileResolver`, which loads
12
+ * the bytes back when the client references that URL in a send-file message.
13
+ * Passing the same storage instance to both means they agree on where uploads
14
+ * live without each needing its own copy of the configuration, and lets a
15
+ * deployment swap in a backend other than local disk by implementing this
16
+ * interface.
17
+ *
18
+ * The URL is the contract: `FileStorage.save` returns one, callers pass it
19
+ * back unmodified, and each implementation mints whatever form it can later
20
+ * resolve — `pipecat:<id>` for `LocalFileStorage`, or e.g. `gs://` / `s3://`
21
+ * for a custom cloud backend (which the LLM provider may then even fetch
22
+ * itself, without `FileStorage.load` being involved at all).
23
+ */
24
+ /**
25
+ * Thrown by `FileStorage.load` when a URL is invalid or no longer stored
26
+ * (Python's built-in `FileNotFoundError`).
27
+ */
28
+ export class FileNotFoundError extends Error {
29
+ name = "FileNotFoundError";
30
+ code = "ENOENT";
31
+ }
32
+ /** Storage backend for files uploaded by clients and referenced by URL later. */
33
+ export class FileStorage {
34
+ /**
35
+ * Whether a file should be deleted once its bytes have been consumed
36
+ * (loaded and inlined into the LLM context by a FileResolver, which then
37
+ * has no further use for the stored copy). Safe only when every URL this
38
+ * backend resolves is an upload it owns; leave false for backends whose
39
+ * URLs may point at shared data (e.g. arbitrary objects in a cloud
40
+ * bucket), where "read into a conversation" must not mean "destroy".
41
+ */
42
+ deleteAfterLoad = false;
43
+ }
44
+ const NOT_PORTED = "not ported yet: LocalFileStorage needs filesystem access, which @pipedog/core (runtime-agnostic) does not have";
45
+ /**
46
+ * Default storage backend: files on local disk, addressed as `pipecat:<hex>`.
47
+ *
48
+ * Suitable for local development and single-process deployments. The
49
+ * `pipecat:` scheme makes the URLs recognizable in logs and client payloads;
50
+ * the random hex suffix can't be used for path traversal and doesn't leak the
51
+ * original filename.
52
+ *
53
+ * STUB: disk I/O (`save`, `load`, `delete`, trimming) is not ported, since core
54
+ * cannot import `node:fs`. URL validation is.
55
+ */
56
+ export class LocalFileStorage extends FileStorage {
57
+ // Every pipecat: URL is an upload this backend owns, so the file is
58
+ // removed once its bytes have been consumed into the LLM context.
59
+ deleteAfterLoad = true;
60
+ static _URL_PREFIX = "pipecat:";
61
+ static _URL_SUFFIX_PATTERN = /^[0-9a-f]{32}$/;
62
+ _folder;
63
+ _maxFiles;
64
+ constructor(options) {
65
+ super();
66
+ this._folder = options.folder;
67
+ this._maxFiles = options.maxFiles ?? 10;
68
+ }
69
+ /** Write `contents` to a new randomly-named file and return its `pipecat:` URL. */
70
+ async save(_filename, _contents) {
71
+ throw new Error(NOT_PORTED);
72
+ }
73
+ /** Read and return the contents stored under `fileUrl`. */
74
+ async load(fileUrl) {
75
+ this._resolveSuffix(fileUrl);
76
+ throw new Error(NOT_PORTED);
77
+ }
78
+ /** Delete the file stored under `fileUrl`, if it exists. */
79
+ async delete(fileUrl) {
80
+ try {
81
+ this._resolveSuffix(fileUrl);
82
+ }
83
+ catch (e) {
84
+ if (e instanceof FileNotFoundError)
85
+ return;
86
+ throw e;
87
+ }
88
+ throw new Error(NOT_PORTED);
89
+ }
90
+ /** Validate `fileUrl` and return the on-disk filename it maps to. */
91
+ _resolveSuffix(fileUrl) {
92
+ const prefix = LocalFileStorage._URL_PREFIX;
93
+ const suffix = fileUrl.startsWith(prefix) ? fileUrl.slice(prefix.length) : fileUrl;
94
+ if (!LocalFileStorage._URL_SUFFIX_PATTERN.test(suffix)) {
95
+ throw new FileNotFoundError(fileUrl);
96
+ }
97
+ return suffix;
98
+ }
99
+ }
100
+ //# sourceMappingURL=file_storage.js.map
@@ -0,0 +1,36 @@
1
+ /** Frame queue utilities for Pipecat pipeline processors. */
2
+ import { Queue } from "@pipedog/asyncio";
3
+ import type { Frame } from "../frames/frames.ts";
4
+ export type FrameClass<T extends Frame = Frame> = abstract new (...args: any[]) => T;
5
+ /**
6
+ * A Queue that knows whether any uninterruptible frame is enqueued.
7
+ *
8
+ * `reset()` removes every interruptible item and keeps the uninterruptible
9
+ * ones (`frame.interruptible === false`) in place.
10
+ *
11
+ * Items may be raw frames or tuples whose first element is a frame. Pass a
12
+ * `frameGetter` to extract the frame from each item; queues that also carry
13
+ * non-frame items should return null from their getter for those.
14
+ */
15
+ export declare class FrameQueue<T = Frame> extends Queue<T> {
16
+ protected readonly _frameGetter: (item: T) => Frame | null;
17
+ constructor(frameGetter?: (item: T) => Frame | null);
18
+ /** Whether any frame of the given type is in the queue. */
19
+ hasFrame(frameType: FrameClass): boolean;
20
+ /** Whether any uninterruptible frame is currently in the queue. */
21
+ get hasUninterruptible(): boolean;
22
+ /** Remove all interruptible items, keeping uninterruptible ones. */
23
+ reset(): void;
24
+ protected _isUninterruptible(item: T): boolean;
25
+ }
26
+ /**
27
+ * A priority queue with frame-aware interruption handling. For
28
+ * `[priority, sequence, frame]` items pass `(item) => item[2]`.
29
+ */
30
+ export declare class FramePriorityQueue<T = Frame> extends FrameQueue<T> {
31
+ #private;
32
+ constructor(frameGetter?: (item: T) => Frame | null, compare?: (a: T, b: T) => number);
33
+ protected _put(item: T): void;
34
+ protected _get(): T;
35
+ }
36
+ //# sourceMappingURL=frame_queue.d.ts.map
@@ -0,0 +1,66 @@
1
+ // Copyright (c) 2024-2026, Daily
2
+ // Copyright (c) 2026, pipedog contributors
3
+ // SPDX-License-Identifier: BSD-2-Clause
4
+ //
5
+ // Ported from pipecat: src/pipecat/utils/frame_queue.py
6
+ /** Frame queue utilities for Pipecat pipeline processors. */
7
+ import { heapPop, heapPush, pythonCompare, Queue } from "@pipedog/asyncio";
8
+ /**
9
+ * A Queue that knows whether any uninterruptible frame is enqueued.
10
+ *
11
+ * `reset()` removes every interruptible item and keeps the uninterruptible
12
+ * ones (`frame.interruptible === false`) in place.
13
+ *
14
+ * Items may be raw frames or tuples whose first element is a frame. Pass a
15
+ * `frameGetter` to extract the frame from each item; queues that also carry
16
+ * non-frame items should return null from their getter for those.
17
+ */
18
+ export class FrameQueue extends Queue {
19
+ _frameGetter;
20
+ constructor(frameGetter = (item) => item) {
21
+ super();
22
+ this._frameGetter = frameGetter;
23
+ }
24
+ /** Whether any frame of the given type is in the queue. */
25
+ hasFrame(frameType) {
26
+ return this._items.some((item) => this._frameGetter(item) instanceof frameType);
27
+ }
28
+ /** Whether any uninterruptible frame is currently in the queue. */
29
+ get hasUninterruptible() {
30
+ return this._items.some((item) => this._isUninterruptible(item));
31
+ }
32
+ /** Remove all interruptible items, keeping uninterruptible ones. */
33
+ reset() {
34
+ const kept = [];
35
+ while (!this.empty()) {
36
+ const item = this.getNowait();
37
+ if (this._isUninterruptible(item))
38
+ kept.push(item);
39
+ this.taskDone();
40
+ }
41
+ for (const item of kept)
42
+ this.putNowait(item);
43
+ }
44
+ _isUninterruptible(item) {
45
+ const frame = this._frameGetter(item);
46
+ return frame !== null && !frame.interruptible;
47
+ }
48
+ }
49
+ /**
50
+ * A priority queue with frame-aware interruption handling. For
51
+ * `[priority, sequence, frame]` items pass `(item) => item[2]`.
52
+ */
53
+ export class FramePriorityQueue extends FrameQueue {
54
+ #compare;
55
+ constructor(frameGetter = (item) => item, compare = pythonCompare) {
56
+ super(frameGetter);
57
+ this.#compare = compare;
58
+ }
59
+ _put(item) {
60
+ heapPush(this._items, item, this.#compare);
61
+ }
62
+ _get() {
63
+ return heapPop(this._items, this.#compare);
64
+ }
65
+ }
66
+ //# sourceMappingURL=frame_queue.js.map
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Type of a caller-supplied async HTTP client. The class belongs to whichever
3
+ * SDK the caller uses, so there is no single type to name here.
4
+ */
5
+ export type AsyncHTTPClient = unknown;
6
+ type ErrorClass = abstract new (...args: any[]) => Error;
7
+ /**
8
+ * Timeout exception types to catch around SDK calls. SDKs wrap request-level
9
+ * timeouts in their own error type, but a timeout while iterating a response
10
+ * stream surfaces as the underlying transport exception.
11
+ *
12
+ * DIVERGENCE: upstream lists httpx/httpx2 `TimeoutException`. Here it is the
13
+ * asyncio `TimeoutError`; a `fetch` aborted by `AbortSignal.timeout()` rejects
14
+ * with a `DOMException` named "TimeoutError", which `isTimeoutException`
15
+ * also recognizes.
16
+ */
17
+ export declare const TIMEOUT_EXCEPTIONS: readonly ErrorClass[];
18
+ /** Whether `e` is one of `TIMEOUT_EXCEPTIONS` (or a fetch timeout `DOMException`). */
19
+ export declare function isTimeoutException(e: unknown): boolean;
20
+ /** Limits fields accepted by `connectionLimits`. */
21
+ export interface ConnectionLimits {
22
+ maxConnections?: number | null;
23
+ maxKeepaliveConnections?: number | null;
24
+ keepaliveExpiry?: number | null;
25
+ }
26
+ /**
27
+ * Build a connection-limits object accepted by the HTTP client.
28
+ *
29
+ * DIVERGENCE: upstream returns an httpx `Limits` instance. `fetch` has no
30
+ * such object, so this returns the plain options for an SDK or agent that
31
+ * reads them field by field.
32
+ *
33
+ * @param options Limits fields (`maxConnections`, `maxKeepaliveConnections`,
34
+ * `keepaliveExpiry`).
35
+ * @returns A limits object.
36
+ */
37
+ export declare function connectionLimits(options?: ConnectionLimits): ConnectionLimits;
38
+ export {};
39
+ //# sourceMappingURL=http.d.ts.map