@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.
- package/LICENSE +25 -0
- package/NOTICE +9 -0
- package/dist/adapters/base_llm_adapter.d.ts +266 -0
- package/dist/adapters/base_llm_adapter.js +489 -0
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/schemas/direct_function.d.ts +202 -0
- package/dist/adapters/schemas/direct_function.js +302 -0
- package/dist/adapters/schemas/function_schema.d.ts +67 -0
- package/dist/adapters/schemas/function_schema.js +72 -0
- package/dist/adapters/schemas/index.d.ts +2 -0
- package/dist/adapters/schemas/index.js +8 -0
- package/dist/adapters/schemas/tools_schema.d.ts +57 -0
- package/dist/adapters/schemas/tools_schema.js +79 -0
- package/dist/adapters/services/index.d.ts +2 -0
- package/dist/adapters/services/index.js +8 -0
- package/dist/adapters/services/open_ai_adapter.d.ts +147 -0
- package/dist/adapters/services/open_ai_adapter.js +250 -0
- package/dist/audio/dtmf/dtmf_data.d.ts +3 -0
- package/dist/audio/dtmf/dtmf_data.js +22 -0
- package/dist/audio/dtmf/index.d.ts +2 -0
- package/dist/audio/dtmf/index.js +8 -0
- package/dist/audio/dtmf/types.d.ts +31 -0
- package/dist/audio/dtmf/types.js +35 -0
- package/dist/audio/dtmf/utils.d.ts +13 -0
- package/dist/audio/dtmf/utils.js +62 -0
- package/dist/audio/filters/base_audio_filter.d.ts +51 -0
- package/dist/audio/filters/base_audio_filter.js +17 -0
- package/dist/audio/filters/index.d.ts +2 -0
- package/dist/audio/filters/index.js +8 -0
- package/dist/audio/index.d.ts +2 -0
- package/dist/audio/index.js +8 -0
- package/dist/audio/krisp_instance.d.ts +95 -0
- package/dist/audio/krisp_instance.js +229 -0
- package/dist/audio/mixers/base_audio_mixer.d.ts +56 -0
- package/dist/audio/mixers/base_audio_mixer.js +16 -0
- package/dist/audio/mixers/index.d.ts +2 -0
- package/dist/audio/mixers/index.js +8 -0
- package/dist/audio/resamplers/base_audio_resampler.d.ts +46 -0
- package/dist/audio/resamplers/base_audio_resampler.js +35 -0
- package/dist/audio/resamplers/index.d.ts +2 -0
- package/dist/audio/resamplers/index.js +8 -0
- package/dist/audio/resamplers/resampy_resampler.d.ts +10 -0
- package/dist/audio/resamplers/resampy_resampler.js +15 -0
- package/dist/audio/resamplers/soxr_resampler.d.ts +54 -0
- package/dist/audio/resamplers/soxr_resampler.js +69 -0
- package/dist/audio/resamplers/soxr_stream_resampler.d.ts +75 -0
- package/dist/audio/resamplers/soxr_stream_resampler.js +146 -0
- package/dist/audio/turn/base_turn_analyzer.d.ts +84 -0
- package/dist/audio/turn/base_turn_analyzer.js +61 -0
- package/dist/audio/turn/index.d.ts +2 -0
- package/dist/audio/turn/index.js +8 -0
- package/dist/audio/turn/smart_turn/_whisper_features.d.ts +30 -0
- package/dist/audio/turn/smart_turn/_whisper_features.js +225 -0
- package/dist/audio/turn/smart_turn/base_smart_turn.d.ts +94 -0
- package/dist/audio/turn/smart_turn/base_smart_turn.js +239 -0
- package/dist/audio/turn/smart_turn/local_smart_turn_v3.d.ts +76 -0
- package/dist/audio/turn/smart_turn/local_smart_turn_v3.js +143 -0
- package/dist/audio/utils.d.ts +224 -0
- package/dist/audio/utils.js +634 -0
- package/dist/audio/vad/data/index.d.ts +2 -0
- package/dist/audio/vad/data/index.js +8 -0
- package/dist/audio/vad/index.d.ts +2 -0
- package/dist/audio/vad/index.js +8 -0
- package/dist/audio/vad/vad_analyzer.d.ts +126 -0
- package/dist/audio/vad/vad_analyzer.js +211 -0
- package/dist/audio/vad/vad_controller.d.ts +143 -0
- package/dist/audio/vad/vad_controller.js +228 -0
- package/dist/audio/volume.d.ts +38 -0
- package/dist/audio/volume.js +75 -0
- package/dist/bus/adapters/base.d.ts +35 -0
- package/dist/bus/adapters/base.js +19 -0
- package/dist/bus/adapters/index.d.ts +10 -0
- package/dist/bus/adapters/index.js +15 -0
- package/dist/bus/adapters/llm_context_adapter.d.ts +36 -0
- package/dist/bus/adapters/llm_context_adapter.js +82 -0
- package/dist/bus/adapters/tools_schema_adapter.d.ts +25 -0
- package/dist/bus/adapters/tools_schema_adapter.js +70 -0
- package/dist/bus/bridge_processor.d.ts +111 -0
- package/dist/bus/bridge_processor.js +166 -0
- package/dist/bus/bus.d.ts +110 -0
- package/dist/bus/bus.js +200 -0
- package/dist/bus/index.d.ts +22 -0
- package/dist/bus/index.js +27 -0
- package/dist/bus/local/async_queue.d.ts +12 -0
- package/dist/bus/local/async_queue.js +21 -0
- package/dist/bus/local/index.d.ts +3 -0
- package/dist/bus/local/index.js +8 -0
- package/dist/bus/messages.d.ts +378 -0
- package/dist/bus/messages.js +357 -0
- package/dist/bus/network/index.d.ts +16 -0
- package/dist/bus/network/index.js +21 -0
- package/dist/bus/queue.d.ts +27 -0
- package/dist/bus/queue.js +51 -0
- package/dist/bus/serializers/base.d.ts +25 -0
- package/dist/bus/serializers/base.js +14 -0
- package/dist/bus/serializers/index.d.ts +9 -0
- package/dist/bus/serializers/index.js +14 -0
- package/dist/bus/serializers/json.d.ts +77 -0
- package/dist/bus/serializers/json.js +367 -0
- package/dist/bus/subscriber.d.ts +46 -0
- package/dist/bus/subscriber.js +27 -0
- package/dist/bus/ui/index.d.ts +3 -0
- package/dist/bus/ui/index.js +8 -0
- package/dist/bus/ui/messages.d.ts +186 -0
- package/dist/bus/ui/messages.js +171 -0
- package/dist/classifiers/base_classifier.d.ts +263 -0
- package/dist/classifiers/base_classifier.js +346 -0
- package/dist/classifiers/cloudflare/clef/classifier.d.ts +70 -0
- package/dist/classifiers/cloudflare/clef/classifier.js +204 -0
- package/dist/classifiers/cloudflare/clef/client.d.ts +104 -0
- package/dist/classifiers/cloudflare/clef/client.js +234 -0
- package/dist/classifiers/cloudflare/clef/index.d.ts +2 -0
- package/dist/classifiers/cloudflare/clef/index.js +8 -0
- package/dist/classifiers/cloudflare/index.d.ts +2 -0
- package/dist/classifiers/cloudflare/index.js +8 -0
- package/dist/classifiers/http_client.d.ts +70 -0
- package/dist/classifiers/http_client.js +161 -0
- package/dist/classifiers/index.d.ts +2 -0
- package/dist/classifiers/index.js +8 -0
- package/dist/classifiers/jev/classifier.d.ts +8 -0
- package/dist/classifiers/jev/classifier.js +13 -0
- package/dist/classifiers/jev/client.d.ts +8 -0
- package/dist/classifiers/jev/client.js +13 -0
- package/dist/classifiers/jev/index.d.ts +2 -0
- package/dist/classifiers/jev/index.js +8 -0
- package/dist/classifiers/llm/classifier.d.ts +72 -0
- package/dist/classifiers/llm/classifier.js +304 -0
- package/dist/classifiers/llm/index.d.ts +2 -0
- package/dist/classifiers/llm/index.js +8 -0
- package/dist/classifiers/openai/decisions/classifier.d.ts +77 -0
- package/dist/classifiers/openai/decisions/classifier.js +241 -0
- package/dist/classifiers/openai/decisions/client.d.ts +108 -0
- package/dist/classifiers/openai/decisions/client.js +234 -0
- package/dist/classifiers/openai/decisions/index.d.ts +2 -0
- package/dist/classifiers/openai/decisions/index.js +8 -0
- package/dist/classifiers/openai/index.d.ts +2 -0
- package/dist/classifiers/openai/index.js +8 -0
- package/dist/classifiers/typesafe/index.d.ts +2 -0
- package/dist/classifiers/typesafe/index.js +8 -0
- package/dist/classifiers/typesafe/jev/classifier.d.ts +70 -0
- package/dist/classifiers/typesafe/jev/classifier.js +220 -0
- package/dist/classifiers/typesafe/jev/client.d.ts +105 -0
- package/dist/classifiers/typesafe/jev/client.js +233 -0
- package/dist/classifiers/typesafe/jev/index.d.ts +2 -0
- package/dist/classifiers/typesafe/jev/index.js +8 -0
- package/dist/clocks/base_clock.d.ts +13 -0
- package/dist/clocks/base_clock.js +14 -0
- package/dist/clocks/index.d.ts +2 -0
- package/dist/clocks/index.js +8 -0
- package/dist/clocks/system_clock.d.ts +15 -0
- package/dist/clocks/system_clock.js +25 -0
- package/dist/frames/frames.d.ts +2533 -0
- package/dist/frames/frames.js +2485 -0
- package/dist/frames/index.d.ts +2 -0
- package/dist/frames/index.js +8 -0
- package/dist/frames/protobufs/frames_pb2.d.ts +229 -0
- package/dist/frames/protobufs/frames_pb2.js +466 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +56 -0
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.js +8 -0
- package/dist/metrics/metrics.d.ts +276 -0
- package/dist/metrics/metrics.js +254 -0
- package/dist/observers/base_observer.d.ts +173 -0
- package/dist/observers/base_observer.js +151 -0
- package/dist/observers/error_observer.d.ts +75 -0
- package/dist/observers/error_observer.js +87 -0
- package/dist/observers/function_call_observer.d.ts +157 -0
- package/dist/observers/function_call_observer.js +222 -0
- package/dist/observers/index.d.ts +2 -0
- package/dist/observers/index.js +8 -0
- package/dist/observers/loggers/debug_log_observer.d.ts +91 -0
- package/dist/observers/loggers/debug_log_observer.js +228 -0
- package/dist/observers/loggers/index.d.ts +2 -0
- package/dist/observers/loggers/index.js +8 -0
- package/dist/observers/loggers/llm_log_observer.d.ts +24 -0
- package/dist/observers/loggers/llm_log_observer.js +110 -0
- package/dist/observers/loggers/metrics_log_observer.d.ts +85 -0
- package/dist/observers/loggers/metrics_log_observer.js +186 -0
- package/dist/observers/loggers/transcription_log_observer.d.ts +23 -0
- package/dist/observers/loggers/transcription_log_observer.js +74 -0
- package/dist/observers/service_metrics_observer.d.ts +168 -0
- package/dist/observers/service_metrics_observer.js +236 -0
- package/dist/observers/speaking_observer.d.ts +104 -0
- package/dist/observers/speaking_observer.js +150 -0
- package/dist/observers/startup_timing_observer.d.ts +221 -0
- package/dist/observers/startup_timing_observer.js +365 -0
- package/dist/observers/turn_tracking_observer.d.ts +78 -0
- package/dist/observers/turn_tracking_observer.js +189 -0
- package/dist/observers/user_bot_latency_observer.d.ts +411 -0
- package/dist/observers/user_bot_latency_observer.js +974 -0
- package/dist/pipeline/base_pipeline.d.ts +49 -0
- package/dist/pipeline/base_pipeline.js +101 -0
- package/dist/pipeline/capabilities.d.ts +76 -0
- package/dist/pipeline/capabilities.js +97 -0
- package/dist/pipeline/index.d.ts +2 -0
- package/dist/pipeline/index.js +8 -0
- package/dist/pipeline/job_context.d.ts +317 -0
- package/dist/pipeline/job_context.js +450 -0
- package/dist/pipeline/job_decorator.d.ts +54 -0
- package/dist/pipeline/job_decorator.js +92 -0
- package/dist/pipeline/llm_switcher.d.ts +84 -0
- package/dist/pipeline/llm_switcher.js +107 -0
- package/dist/pipeline/llm_with_backend.d.ts +435 -0
- package/dist/pipeline/llm_with_backend.js +806 -0
- package/dist/pipeline/parallel_pipeline.d.ts +83 -0
- package/dist/pipeline/parallel_pipeline.js +200 -0
- package/dist/pipeline/pipeline.d.ts +126 -0
- package/dist/pipeline/pipeline.js +196 -0
- package/dist/pipeline/service_switcher.d.ts +287 -0
- package/dist/pipeline/service_switcher.js +509 -0
- package/dist/pipeline/sync_parallel_pipeline.d.ts +192 -0
- package/dist/pipeline/sync_parallel_pipeline.js +387 -0
- package/dist/pipeline/worker.d.ts +814 -0
- package/dist/pipeline/worker.js +1639 -0
- package/dist/pipeline/worker_observer.d.ts +131 -0
- package/dist/pipeline/worker_observer.js +274 -0
- package/dist/pipeline/worker_ready_decorator.d.ts +45 -0
- package/dist/pipeline/worker_ready_decorator.js +76 -0
- package/dist/processors/aggregators/async_tool_messages.d.ts +146 -0
- package/dist/processors/aggregators/async_tool_messages.js +291 -0
- package/dist/processors/aggregators/dtmf_aggregator.d.ts +61 -0
- package/dist/processors/aggregators/dtmf_aggregator.js +144 -0
- package/dist/processors/aggregators/gated.d.ts +43 -0
- package/dist/processors/aggregators/gated.js +86 -0
- package/dist/processors/aggregators/gated_llm_context.d.ts +42 -0
- package/dist/processors/aggregators/gated_llm_context.js +86 -0
- package/dist/processors/aggregators/index.d.ts +2 -0
- package/dist/processors/aggregators/index.js +8 -0
- package/dist/processors/aggregators/llm_context.d.ts +370 -0
- package/dist/processors/aggregators/llm_context.js +580 -0
- package/dist/processors/aggregators/llm_context_summarizer.d.ts +219 -0
- package/dist/processors/aggregators/llm_context_summarizer.js +447 -0
- package/dist/processors/aggregators/llm_response.d.ts +37 -0
- package/dist/processors/aggregators/llm_response.js +71 -0
- package/dist/processors/aggregators/llm_response_universal.d.ts +966 -0
- package/dist/processors/aggregators/llm_response_universal.js +2394 -0
- package/dist/processors/aggregators/llm_text_processor.d.ts +53 -0
- package/dist/processors/aggregators/llm_text_processor.js +102 -0
- package/dist/processors/aggregators/sentence.d.ts +39 -0
- package/dist/processors/aggregators/sentence.js +69 -0
- package/dist/processors/async_generator.d.ts +42 -0
- package/dist/processors/async_generator.js +76 -0
- package/dist/processors/audio/audio_buffer_processor.d.ts +241 -0
- package/dist/processors/audio/audio_buffer_processor.js +565 -0
- package/dist/processors/audio/index.d.ts +2 -0
- package/dist/processors/audio/index.js +8 -0
- package/dist/processors/audio/vad_processor.d.ts +67 -0
- package/dist/processors/audio/vad_processor.js +103 -0
- package/dist/processors/consumer_processor.d.ts +49 -0
- package/dist/processors/consumer_processor.js +85 -0
- package/dist/processors/filters/frame_filter.d.ts +39 -0
- package/dist/processors/filters/frame_filter.js +52 -0
- package/dist/processors/filters/function_filter.d.ts +59 -0
- package/dist/processors/filters/function_filter.js +78 -0
- package/dist/processors/filters/identity_filter.d.ts +33 -0
- package/dist/processors/filters/identity_filter.js +37 -0
- package/dist/processors/filters/index.d.ts +2 -0
- package/dist/processors/filters/index.js +8 -0
- package/dist/processors/filters/null_filter.d.ts +34 -0
- package/dist/processors/filters/null_filter.js +47 -0
- package/dist/processors/filters/wake_notifier_filter.d.ts +48 -0
- package/dist/processors/filters/wake_notifier_filter.js +49 -0
- package/dist/processors/frame_processor.d.ts +360 -0
- package/dist/processors/frame_processor.js +932 -0
- package/dist/processors/frameworks/index.d.ts +2 -0
- package/dist/processors/frameworks/index.js +8 -0
- package/dist/processors/frameworks/rtvi/frames.d.ts +241 -0
- package/dist/processors/frameworks/rtvi/frames.js +259 -0
- package/dist/processors/frameworks/rtvi/index.d.ts +6 -0
- package/dist/processors/frameworks/rtvi/index.js +11 -0
- package/dist/processors/frameworks/rtvi/models.d.ts +1741 -0
- package/dist/processors/frameworks/rtvi/models.js +1807 -0
- package/dist/processors/frameworks/rtvi/observer.d.ts +340 -0
- package/dist/processors/frameworks/rtvi/observer.js +1113 -0
- package/dist/processors/frameworks/rtvi/processor.d.ts +182 -0
- package/dist/processors/frameworks/rtvi/processor.js +676 -0
- package/dist/processors/idle_frame_processor.d.ts +44 -0
- package/dist/processors/idle_frame_processor.js +86 -0
- package/dist/processors/index.d.ts +2 -0
- package/dist/processors/index.js +8 -0
- package/dist/processors/logger.d.ts +42 -0
- package/dist/processors/logger.js +87 -0
- package/dist/processors/metrics/frame_processor_metrics.d.ts +172 -0
- package/dist/processors/metrics/frame_processor_metrics.js +372 -0
- package/dist/processors/metrics/index.d.ts +2 -0
- package/dist/processors/metrics/index.js +8 -0
- package/dist/processors/producer_processor.d.ts +68 -0
- package/dist/processors/producer_processor.js +78 -0
- package/dist/processors/text_transformer.d.ts +30 -0
- package/dist/processors/text_transformer.js +48 -0
- package/dist/registry/index.d.ts +3 -0
- package/dist/registry/index.js +8 -0
- package/dist/registry/registry.d.ts +69 -0
- package/dist/registry/registry.js +149 -0
- package/dist/registry/types.d.ts +47 -0
- package/dist/registry/types.js +39 -0
- package/dist/serializers/base_serializer.d.ts +94 -0
- package/dist/serializers/base_serializer.js +82 -0
- package/dist/serializers/index.d.ts +2 -0
- package/dist/serializers/index.js +8 -0
- package/dist/services/ai_service.d.ts +145 -0
- package/dist/services/ai_service.js +262 -0
- package/dist/services/anthropic/index.d.ts +2 -0
- package/dist/services/anthropic/index.js +7 -0
- package/dist/services/assemblyai/index.d.ts +2 -0
- package/dist/services/assemblyai/index.js +7 -0
- package/dist/services/asyncai/index.d.ts +2 -0
- package/dist/services/asyncai/index.js +7 -0
- package/dist/services/aws/index.d.ts +2 -0
- package/dist/services/aws/index.js +7 -0
- package/dist/services/azure/index.d.ts +2 -0
- package/dist/services/azure/index.js +7 -0
- package/dist/services/baseten/index.d.ts +2 -0
- package/dist/services/baseten/index.js +7 -0
- package/dist/services/bland/index.d.ts +2 -0
- package/dist/services/bland/index.js +7 -0
- package/dist/services/camb/index.d.ts +2 -0
- package/dist/services/camb/index.js +7 -0
- package/dist/services/cartesia/index.d.ts +2 -0
- package/dist/services/cartesia/index.js +7 -0
- package/dist/services/cerebras/index.d.ts +2 -0
- package/dist/services/cerebras/index.js +7 -0
- package/dist/services/crusoe/index.d.ts +2 -0
- package/dist/services/crusoe/index.js +7 -0
- package/dist/services/deepgram/index.d.ts +2 -0
- package/dist/services/deepgram/index.js +7 -0
- package/dist/services/deepseek/index.d.ts +2 -0
- package/dist/services/deepseek/index.js +7 -0
- package/dist/services/elevenlabs/index.d.ts +2 -0
- package/dist/services/elevenlabs/index.js +7 -0
- package/dist/services/fal/index.d.ts +2 -0
- package/dist/services/fal/index.js +7 -0
- package/dist/services/fireworks/index.d.ts +2 -0
- package/dist/services/fireworks/index.js +7 -0
- package/dist/services/fish/index.d.ts +2 -0
- package/dist/services/fish/index.js +7 -0
- package/dist/services/funasr/index.d.ts +3 -0
- package/dist/services/funasr/index.js +8 -0
- package/dist/services/gladia/index.d.ts +2 -0
- package/dist/services/gladia/index.js +7 -0
- package/dist/services/google/index.d.ts +2 -0
- package/dist/services/google/index.js +7 -0
- package/dist/services/gradium/index.d.ts +2 -0
- package/dist/services/gradium/index.js +7 -0
- package/dist/services/grok/index.d.ts +2 -0
- package/dist/services/grok/index.js +7 -0
- package/dist/services/groq/index.d.ts +2 -0
- package/dist/services/groq/index.js +7 -0
- package/dist/services/heygen/index.d.ts +2 -0
- package/dist/services/heygen/index.js +7 -0
- package/dist/services/hume/index.d.ts +2 -0
- package/dist/services/hume/index.js +7 -0
- package/dist/services/image_service.d.ts +52 -0
- package/dist/services/image_service.js +60 -0
- package/dist/services/inception/index.d.ts +2 -0
- package/dist/services/inception/index.js +7 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.js +8 -0
- package/dist/services/inworld/index.d.ts +2 -0
- package/dist/services/inworld/index.js +7 -0
- package/dist/services/keenable/index.d.ts +2 -0
- package/dist/services/keenable/index.js +7 -0
- package/dist/services/kokoro/index.d.ts +2 -0
- package/dist/services/kokoro/index.js +7 -0
- package/dist/services/llm_service.d.ts +1106 -0
- package/dist/services/llm_service.js +2231 -0
- package/dist/services/mem0/index.d.ts +2 -0
- package/dist/services/mem0/index.js +7 -0
- package/dist/services/meta/index.d.ts +2 -0
- package/dist/services/meta/index.js +7 -0
- package/dist/services/minimax/index.d.ts +2 -0
- package/dist/services/minimax/index.js +7 -0
- package/dist/services/mistral/index.d.ts +2 -0
- package/dist/services/mistral/index.js +7 -0
- package/dist/services/moondream/index.d.ts +2 -0
- package/dist/services/moondream/index.js +7 -0
- package/dist/services/moonshine/index.d.ts +2 -0
- package/dist/services/moonshine/index.js +7 -0
- package/dist/services/nebius/index.d.ts +2 -0
- package/dist/services/nebius/index.js +7 -0
- package/dist/services/neuphonic/index.d.ts +2 -0
- package/dist/services/neuphonic/index.js +7 -0
- package/dist/services/novita/index.d.ts +2 -0
- package/dist/services/novita/index.js +7 -0
- package/dist/services/nvidia/index.d.ts +2 -0
- package/dist/services/nvidia/index.js +11 -0
- package/dist/services/ollama/index.d.ts +2 -0
- package/dist/services/ollama/index.js +7 -0
- package/dist/services/openai/index.d.ts +2 -0
- package/dist/services/openai/index.js +7 -0
- package/dist/services/openclaw/index.d.ts +14 -0
- package/dist/services/openclaw/index.js +19 -0
- package/dist/services/openrouter/index.d.ts +2 -0
- package/dist/services/openrouter/index.js +7 -0
- package/dist/services/perplexity/index.d.ts +2 -0
- package/dist/services/perplexity/index.js +7 -0
- package/dist/services/piper/index.d.ts +2 -0
- package/dist/services/piper/index.js +7 -0
- package/dist/services/pocket_tts/index.d.ts +2 -0
- package/dist/services/pocket_tts/index.js +7 -0
- package/dist/services/qwen/index.d.ts +2 -0
- package/dist/services/qwen/index.js +7 -0
- package/dist/services/resembleai/index.d.ts +2 -0
- package/dist/services/resembleai/index.js +7 -0
- package/dist/services/rime/index.d.ts +2 -0
- package/dist/services/rime/index.js +7 -0
- package/dist/services/sambanova/index.d.ts +2 -0
- package/dist/services/sambanova/index.js +7 -0
- package/dist/services/sarvam/index.d.ts +2 -0
- package/dist/services/sarvam/index.js +7 -0
- package/dist/services/settings.d.ts +356 -0
- package/dist/services/settings.js +437 -0
- package/dist/services/simli/index.d.ts +2 -0
- package/dist/services/simli/index.js +7 -0
- package/dist/services/smallest/index.d.ts +2 -0
- package/dist/services/smallest/index.js +7 -0
- package/dist/services/soniox/index.d.ts +2 -0
- package/dist/services/soniox/index.js +7 -0
- package/dist/services/speechify/index.d.ts +2 -0
- package/dist/services/speechify/index.js +7 -0
- package/dist/services/speechmatics/index.d.ts +2 -0
- package/dist/services/speechmatics/index.js +7 -0
- package/dist/services/stt_latency.d.ts +62 -0
- package/dist/services/stt_latency.js +71 -0
- package/dist/services/stt_service.d.ts +601 -0
- package/dist/services/stt_service.js +1044 -0
- package/dist/services/tavus/index.d.ts +2 -0
- package/dist/services/tavus/index.js +7 -0
- package/dist/services/together/index.d.ts +2 -0
- package/dist/services/together/index.js +7 -0
- package/dist/services/tts_service.d.ts +909 -0
- package/dist/services/tts_service.js +2018 -0
- package/dist/services/ultravox/index.d.ts +2 -0
- package/dist/services/ultravox/index.js +9 -0
- package/dist/services/vision_service.d.ts +56 -0
- package/dist/services/vision_service.js +62 -0
- package/dist/services/websocket_service.d.ts +213 -0
- package/dist/services/websocket_service.js +654 -0
- package/dist/services/whisper/index.d.ts +2 -0
- package/dist/services/whisper/index.js +9 -0
- package/dist/services/xai/index.d.ts +2 -0
- package/dist/services/xai/index.js +9 -0
- package/dist/services/xtts/index.d.ts +2 -0
- package/dist/services/xtts/index.js +9 -0
- package/dist/tests/index.d.ts +2 -0
- package/dist/tests/index.js +8 -0
- package/dist/tests/utils.d.ts +123 -0
- package/dist/tests/utils.js +212 -0
- package/dist/transcriptions/index.d.ts +2 -0
- package/dist/transcriptions/index.js +8 -0
- package/dist/transcriptions/language.d.ts +376 -0
- package/dist/transcriptions/language.js +543 -0
- package/dist/transports/base_input.d.ts +149 -0
- package/dist/transports/base_input.js +338 -0
- package/dist/transports/base_output.d.ts +432 -0
- package/dist/transports/base_output.js +1231 -0
- package/dist/transports/base_transport.d.ts +223 -0
- package/dist/transports/base_transport.js +167 -0
- package/dist/transports/daily/index.d.ts +2 -0
- package/dist/transports/daily/index.js +9 -0
- package/dist/transports/heygen/index.d.ts +2 -0
- package/dist/transports/heygen/index.js +9 -0
- package/dist/transports/index.d.ts +2 -0
- package/dist/transports/index.js +8 -0
- package/dist/transports/lemonslice/index.d.ts +2 -0
- package/dist/transports/lemonslice/index.js +9 -0
- package/dist/transports/livekit/index.d.ts +2 -0
- package/dist/transports/livekit/index.js +9 -0
- package/dist/transports/local/index.d.ts +2 -0
- package/dist/transports/local/index.js +9 -0
- package/dist/transports/moq/index.d.ts +2 -0
- package/dist/transports/moq/index.js +9 -0
- package/dist/transports/smallwebrtc/index.d.ts +2 -0
- package/dist/transports/smallwebrtc/index.js +9 -0
- package/dist/transports/tavus/index.d.ts +2 -0
- package/dist/transports/tavus/index.js +9 -0
- package/dist/transports/video_in_sampler.d.ts +157 -0
- package/dist/transports/video_in_sampler.js +258 -0
- package/dist/transports/vonage/index.d.ts +2 -0
- package/dist/transports/vonage/index.js +9 -0
- package/dist/transports/websocket/index.d.ts +2 -0
- package/dist/transports/websocket/index.js +9 -0
- package/dist/transports/whatsapp/index.d.ts +2 -0
- package/dist/transports/whatsapp/index.js +9 -0
- package/dist/turns/eager_end_of_turn_mixin.d.ts +70 -0
- package/dist/turns/eager_end_of_turn_mixin.js +122 -0
- package/dist/turns/empty_user_turn.d.ts +55 -0
- package/dist/turns/empty_user_turn.js +53 -0
- package/dist/turns/index.d.ts +2 -0
- package/dist/turns/index.js +8 -0
- package/dist/turns/speculation_gate.d.ts +169 -0
- package/dist/turns/speculation_gate.js +294 -0
- package/dist/turns/types.d.ts +33 -0
- package/dist/turns/types.js +35 -0
- package/dist/turns/user_idle_controller.d.ts +94 -0
- package/dist/turns/user_idle_controller.js +187 -0
- package/dist/turns/user_mute/always_user_mute_strategy.d.ts +15 -0
- package/dist/turns/user_mute/always_user_mute_strategy.js +29 -0
- package/dist/turns/user_mute/base_user_mute_strategy.d.ts +39 -0
- package/dist/turns/user_mute/base_user_mute_strategy.js +45 -0
- package/dist/turns/user_mute/first_speech_user_mute_strategy.d.ts +28 -0
- package/dist/turns/user_mute/first_speech_user_mute_strategy.js +52 -0
- package/dist/turns/user_mute/function_call_user_mute_strategy.d.ts +25 -0
- package/dist/turns/user_mute/function_call_user_mute_strategy.js +50 -0
- package/dist/turns/user_mute/index.d.ts +6 -0
- package/dist/turns/user_mute/index.js +11 -0
- package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.d.ts +43 -0
- package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.js +76 -0
- package/dist/turns/user_start/base_user_turn_start_strategy.d.ts +135 -0
- package/dist/turns/user_start/base_user_turn_start_strategy.js +134 -0
- package/dist/turns/user_start/external_user_turn_start_strategy.d.ts +45 -0
- package/dist/turns/user_start/external_user_turn_start_strategy.js +64 -0
- package/dist/turns/user_start/index.d.ts +8 -0
- package/dist/turns/user_start/index.js +16 -0
- package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.d.ts +133 -0
- package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.js +243 -0
- package/dist/turns/user_start/min_words_user_turn_start_strategy.d.ts +60 -0
- package/dist/turns/user_start/min_words_user_turn_start_strategy.js +102 -0
- package/dist/turns/user_start/transcription_user_turn_start_strategy.d.ts +29 -0
- package/dist/turns/user_start/transcription_user_turn_start_strategy.js +43 -0
- package/dist/turns/user_start/vad_user_turn_start_strategy.d.ts +20 -0
- package/dist/turns/user_start/vad_user_turn_start_strategy.js +31 -0
- package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.d.ts +141 -0
- package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.js +238 -0
- package/dist/turns/user_stop/base_user_turn_stop_strategy.d.ts +174 -0
- package/dist/turns/user_stop/base_user_turn_stop_strategy.js +170 -0
- package/dist/turns/user_stop/deferred_user_turn_stop_strategy.d.ts +81 -0
- package/dist/turns/user_stop/deferred_user_turn_stop_strategy.js +107 -0
- package/dist/turns/user_stop/eager_match_policy.d.ts +36 -0
- package/dist/turns/user_stop/eager_match_policy.js +50 -0
- package/dist/turns/user_stop/eager_user_turn_stop_strategy.d.ts +84 -0
- package/dist/turns/user_stop/eager_user_turn_stop_strategy.js +154 -0
- package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.d.ts +45 -0
- package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.js +55 -0
- package/dist/turns/user_stop/external_user_turn_stop_strategy.d.ts +115 -0
- package/dist/turns/user_stop/external_user_turn_stop_strategy.js +205 -0
- package/dist/turns/user_stop/index.d.ts +10 -0
- package/dist/turns/user_stop/index.js +15 -0
- package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.d.ts +44 -0
- package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.js +59 -0
- package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.d.ts +140 -0
- package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.js +303 -0
- package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.d.ts +135 -0
- package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.js +332 -0
- package/dist/turns/user_turn_completion_mixin.d.ts +147 -0
- package/dist/turns/user_turn_completion_mixin.js +591 -0
- package/dist/turns/user_turn_controller.d.ts +134 -0
- package/dist/turns/user_turn_controller.js +335 -0
- package/dist/turns/user_turn_processor.d.ts +87 -0
- package/dist/turns/user_turn_processor.js +180 -0
- package/dist/turns/user_turn_strategies.d.ts +187 -0
- package/dist/turns/user_turn_strategies.js +222 -0
- package/dist/utils/async_tool_cancellation.d.ts +35 -0
- package/dist/utils/async_tool_cancellation.js +78 -0
- package/dist/utils/asyncio/index.d.ts +2 -0
- package/dist/utils/asyncio/index.js +7 -0
- package/dist/utils/asyncio/task_manager.d.ts +49 -0
- package/dist/utils/asyncio/task_manager.js +105 -0
- package/dist/utils/base_object.d.ts +76 -0
- package/dist/utils/base_object.js +154 -0
- package/dist/utils/context/aggregated_frame_sequencer.d.ts +491 -0
- package/dist/utils/context/aggregated_frame_sequencer.js +803 -0
- package/dist/utils/context/audio_context_manager.d.ts +131 -0
- package/dist/utils/context/audio_context_manager.js +233 -0
- package/dist/utils/context/index.d.ts +2 -0
- package/dist/utils/context/index.js +7 -0
- package/dist/utils/context/llm_context_summarization.d.ts +258 -0
- package/dist/utils/context/llm_context_summarization.js +511 -0
- package/dist/utils/context/text_segment_map.d.ts +611 -0
- package/dist/utils/context/text_segment_map.js +1132 -0
- package/dist/utils/context/word_completion_tracker.d.ts +273 -0
- package/dist/utils/context/word_completion_tracker.js +441 -0
- package/dist/utils/context/word_timestamp_tracker.d.ts +72 -0
- package/dist/utils/context/word_timestamp_tracker.js +98 -0
- package/dist/utils/deprecation.d.ts +28 -0
- package/dist/utils/deprecation.js +75 -0
- package/dist/utils/env.d.ts +38 -0
- package/dist/utils/env.js +62 -0
- package/dist/utils/errors.d.ts +75 -0
- package/dist/utils/errors.js +202 -0
- package/dist/utils/file_resolver.d.ts +126 -0
- package/dist/utils/file_resolver.js +314 -0
- package/dist/utils/file_storage.d.ts +99 -0
- package/dist/utils/file_storage.js +100 -0
- package/dist/utils/frame_queue.d.ts +36 -0
- package/dist/utils/frame_queue.js +66 -0
- package/dist/utils/http.d.ts +39 -0
- package/dist/utils/http.js +53 -0
- package/dist/utils/image.d.ts +15 -0
- package/dist/utils/image.js +30 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/log_config.d.ts +34 -0
- package/dist/utils/log_config.js +76 -0
- package/dist/utils/logger.d.ts +40 -0
- package/dist/utils/logger.js +91 -0
- package/dist/utils/mixin.d.ts +14 -0
- package/dist/utils/mixin.js +63 -0
- package/dist/utils/network.d.ts +73 -0
- package/dist/utils/network.js +90 -0
- package/dist/utils/security/allowed_origins.d.ts +16 -0
- package/dist/utils/security/allowed_origins.js +34 -0
- package/dist/utils/security/index.d.ts +2 -0
- package/dist/utils/security/index.js +7 -0
- package/dist/utils/security/redaction.d.ts +27 -0
- package/dist/utils/security/redaction.js +123 -0
- package/dist/utils/security/ssrf.d.ts +79 -0
- package/dist/utils/security/ssrf.js +327 -0
- package/dist/utils/shared.d.ts +35 -0
- package/dist/utils/shared.js +136 -0
- package/dist/utils/startup.d.ts +17 -0
- package/dist/utils/startup.js +130 -0
- package/dist/utils/string.d.ts +116 -0
- package/dist/utils/string.js +460 -0
- package/dist/utils/sync/base_notifier.d.ts +25 -0
- package/dist/utils/sync/base_notifier.js +16 -0
- package/dist/utils/sync/event_notifier.d.ts +38 -0
- package/dist/utils/sync/event_notifier.js +51 -0
- package/dist/utils/sync/index.d.ts +2 -0
- package/dist/utils/sync/index.js +7 -0
- package/dist/utils/text/alnum_utils.d.ts +109 -0
- package/dist/utils/text/alnum_utils.js +262 -0
- package/dist/utils/text/base_text_aggregator.d.ts +146 -0
- package/dist/utils/text/base_text_aggregator.js +102 -0
- package/dist/utils/text/base_text_filter.d.ts +54 -0
- package/dist/utils/text/base_text_filter.js +50 -0
- package/dist/utils/text/index.d.ts +2 -0
- package/dist/utils/text/index.js +7 -0
- package/dist/utils/text/markdown_text_filter.d.ts +147 -0
- package/dist/utils/text/markdown_text_filter.js +522 -0
- package/dist/utils/text/markup_utils.d.ts +54 -0
- package/dist/utils/text/markup_utils.js +156 -0
- package/dist/utils/text/pattern_pair_aggregator.d.ts +251 -0
- package/dist/utils/text/pattern_pair_aggregator.js +478 -0
- package/dist/utils/text/phonemes.d.ts +60 -0
- package/dist/utils/text/phonemes.js +172 -0
- package/dist/utils/text/simple_text_aggregator.d.ts +135 -0
- package/dist/utils/text/simple_text_aggregator.js +254 -0
- package/dist/utils/text/skip_tags_aggregator.d.ts +85 -0
- package/dist/utils/text/skip_tags_aggregator.js +147 -0
- package/dist/utils/text/transforms/pronunciations.d.ts +65 -0
- package/dist/utils/text/transforms/pronunciations.js +111 -0
- package/dist/utils/text/word_timestamp_utils.d.ts +26 -0
- package/dist/utils/text/word_timestamp_utils.js +52 -0
- package/dist/utils/time.d.ts +13 -0
- package/dist/utils/time.js +31 -0
- package/dist/utils/tracing/index.d.ts +3 -0
- package/dist/utils/tracing/index.js +8 -0
- package/dist/utils/tracing/service_attributes.d.ts +198 -0
- package/dist/utils/tracing/service_attributes.js +434 -0
- package/dist/utils/tracing/service_decorators.d.ts +214 -0
- package/dist/utils/tracing/service_decorators.js +1662 -0
- package/dist/utils/tracing/setup.d.ts +95 -0
- package/dist/utils/tracing/setup.js +110 -0
- package/dist/utils/tracing/tracing_context.d.ts +55 -0
- package/dist/utils/tracing/tracing_context.js +97 -0
- package/dist/utils/tracing/turn_trace_observer.d.ts +90 -0
- package/dist/utils/tracing/turn_trace_observer.js +219 -0
- package/dist/utils/types.d.ts +80 -0
- package/dist/utils/types.js +108 -0
- package/dist/utils/utils.d.ts +5 -0
- package/dist/utils/utils.js +22 -0
- package/dist/utils/yaml.d.ts +64 -0
- package/dist/utils/yaml.js +41 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.js +7 -0
- package/dist/workers/base_worker.d.ts +772 -0
- package/dist/workers/base_worker.js +1298 -0
- package/dist/workers/index.d.ts +2 -0
- package/dist/workers/index.js +8 -0
- package/dist/workers/llm/backend_llm_worker.d.ts +552 -0
- package/dist/workers/llm/backend_llm_worker.js +1055 -0
- package/dist/workers/llm/index.d.ts +6 -0
- package/dist/workers/llm/index.js +11 -0
- package/dist/workers/llm/llm_context_worker.d.ts +66 -0
- package/dist/workers/llm/llm_context_worker.js +72 -0
- package/dist/workers/llm/llm_worker.d.ts +180 -0
- package/dist/workers/llm/llm_worker.js +323 -0
- package/dist/workers/llm/tool_decorator.d.ts +68 -0
- package/dist/workers/llm/tool_decorator.js +60 -0
- package/dist/workers/runner.d.ts +268 -0
- package/dist/workers/runner.js +489 -0
- package/dist/workers/ui/index.d.ts +22 -0
- package/dist/workers/ui/index.js +27 -0
- package/dist/workers/ui/ui_event_decorator.d.ts +43 -0
- package/dist/workers/ui/ui_event_decorator.js +75 -0
- package/dist/workers/ui/ui_job_context.d.ts +12 -0
- package/dist/workers/ui/ui_job_context.js +17 -0
- package/dist/workers/ui/ui_prompts.d.ts +21 -0
- package/dist/workers/ui/ui_prompts.js +41 -0
- package/dist/workers/ui/ui_tools.d.ts +32 -0
- package/dist/workers/ui/ui_tools.js +112 -0
- package/dist/workers/ui/ui_worker.d.ts +571 -0
- package/dist/workers/ui/ui_worker.js +1156 -0
- package/package.json +46 -3
- 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
|