@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,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Masks credentials in text bound for logs and error reports.
|
|
3
|
+
*
|
|
4
|
+
* Error messages often quote whatever a failure carried: an SDK exception that
|
|
5
|
+
* prints the headers it sent, a URL signed for one download, a provider body
|
|
6
|
+
* echoing the key it rejected. `redactSecrets` masks the credential and keeps
|
|
7
|
+
* the rest, so a message still says what went wrong.
|
|
8
|
+
*
|
|
9
|
+
* It masks three things:
|
|
10
|
+
*
|
|
11
|
+
* - The value of any `name=value` or `name: value` pair, quoted or not,
|
|
12
|
+
* whose name marks a credential (`api_key`, `Authorization`,
|
|
13
|
+
* `X-Amz-Signature`, `apiKey`...). This covers query strings, printed
|
|
14
|
+
* header dicts and plain prose alike.
|
|
15
|
+
* - A URL's password (`scheme://user:password@host`).
|
|
16
|
+
* - Tokens recognizable by their format alone: provider key prefixes, AWS
|
|
17
|
+
* access key IDs and JWTs.
|
|
18
|
+
*/
|
|
19
|
+
export declare const REDACTED = "[REDACTED]";
|
|
20
|
+
/**
|
|
21
|
+
* Mask the credentials in `text`, leaving the rest as written.
|
|
22
|
+
*
|
|
23
|
+
* @param text Text that may quote a credential, such as an error message.
|
|
24
|
+
* @returns The text with each credential replaced by `[REDACTED]`.
|
|
25
|
+
*/
|
|
26
|
+
export declare function redactSecrets(text: string): string;
|
|
27
|
+
//# sourceMappingURL=redaction.d.ts.map
|
|
@@ -0,0 +1,123 @@
|
|
|
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/security/redaction.py
|
|
6
|
+
/**
|
|
7
|
+
* Masks credentials in text bound for logs and error reports.
|
|
8
|
+
*
|
|
9
|
+
* Error messages often quote whatever a failure carried: an SDK exception that
|
|
10
|
+
* prints the headers it sent, a URL signed for one download, a provider body
|
|
11
|
+
* echoing the key it rejected. `redactSecrets` masks the credential and keeps
|
|
12
|
+
* the rest, so a message still says what went wrong.
|
|
13
|
+
*
|
|
14
|
+
* It masks three things:
|
|
15
|
+
*
|
|
16
|
+
* - The value of any `name=value` or `name: value` pair, quoted or not,
|
|
17
|
+
* whose name marks a credential (`api_key`, `Authorization`,
|
|
18
|
+
* `X-Amz-Signature`, `apiKey`...). This covers query strings, printed
|
|
19
|
+
* header dicts and plain prose alike.
|
|
20
|
+
* - A URL's password (`scheme://user:password@host`).
|
|
21
|
+
* - Tokens recognizable by their format alone: provider key prefixes, AWS
|
|
22
|
+
* access key IDs and JWTs.
|
|
23
|
+
*/
|
|
24
|
+
export const REDACTED = "[REDACTED]";
|
|
25
|
+
// A name marks a credential when one of its words is one of these, so
|
|
26
|
+
// `x-api-key` and `X-Amz-Security-Token` do while `keyterms` and `max_tokens`
|
|
27
|
+
// don't.
|
|
28
|
+
const CREDENTIAL_WORDS = new Set([
|
|
29
|
+
"apikey",
|
|
30
|
+
"auth",
|
|
31
|
+
"authorization",
|
|
32
|
+
"cookie",
|
|
33
|
+
"credential",
|
|
34
|
+
"credentials",
|
|
35
|
+
"creds",
|
|
36
|
+
"jwt",
|
|
37
|
+
"key",
|
|
38
|
+
"passwd",
|
|
39
|
+
"password",
|
|
40
|
+
"pwd",
|
|
41
|
+
"secret",
|
|
42
|
+
"sig",
|
|
43
|
+
"signature",
|
|
44
|
+
"token",
|
|
45
|
+
// Google's resumable upload session ID, which authorizes the upload by itself.
|
|
46
|
+
"uploadid",
|
|
47
|
+
]);
|
|
48
|
+
// `name=value` or `name: value` (or `:=`, `=>`), the name optionally quoted as
|
|
49
|
+
// in a printed dict, the value quoted or running to the next delimiter. A
|
|
50
|
+
// quoted value cut short before its closing quote, as a truncated repr leaves
|
|
51
|
+
// it, runs to the next delimiter instead. An auth scheme (`Bearer`, `Basic`...)
|
|
52
|
+
// ahead of the value is kept. A value already redacted is matched whole, so
|
|
53
|
+
// text redacted twice reads the same as text redacted once.
|
|
54
|
+
const PAIR = new RegExp(String.raw `(?<name>(?<![\w.-])(?<nq>["']?)[A-Za-z][\w.-]*\k<nq>)` +
|
|
55
|
+
String.raw `(?<sep>\s*(?::=|=>|[:=])\s*)` +
|
|
56
|
+
String.raw `(?<scheme>(?:Bearer|Basic|Token|Api-Token|Key|Digest|AWS4-HMAC-SHA256)\s+)?` +
|
|
57
|
+
String.raw `(?:(?<vq>["'])(?<quoted>.*?)\k<vq>` +
|
|
58
|
+
String.raw `|(?<oq>["']?)(?<bare>(?:\[REDACTED\]|[^\s,;&"'}\])\[])+))`, "g");
|
|
59
|
+
const URL_PASSWORD = /(?<prefix>\b[a-z][a-z0-9+.-]*:\/\/[^\s:/@]+:)[^\s/@]+(?=@)/gi;
|
|
60
|
+
// Formats after gitleaks' rules for the same credentials
|
|
61
|
+
// (github.com/gitleaks/gitleaks, config/gitleaks.toml), loosened where a
|
|
62
|
+
// looser match costs nothing: a log line is masked, not scanned for findings.
|
|
63
|
+
const KNOWN_TOKENS = new RegExp(String.raw `\b(?:` +
|
|
64
|
+
String.raw `sk-[A-Za-z0-9_-]{20,}` + // OpenAI, Anthropic
|
|
65
|
+
String.raw `|(?:A3T[A-Z0-9]|AKIA|ASIA|ABIA|ACCA)[A-Z0-9]{16}` + // AWS access key IDs
|
|
66
|
+
String.raw `|ABSK[A-Za-z0-9+/]{109,269}={0,2}` + // Amazon Bedrock API keys, long-lived
|
|
67
|
+
String.raw `|bedrock-api-key-[A-Za-z0-9+/=_-]+` + // Amazon Bedrock API keys, short-lived
|
|
68
|
+
String.raw `|AIza[0-9A-Za-z_-]{35}` + // Google API keys
|
|
69
|
+
String.raw `|gh[pousr]_[A-Za-z0-9]{36,}|github_pat_\w{82,}` + // GitHub
|
|
70
|
+
String.raw `|xox[abeoprs]-[A-Za-z0-9-]{10,}|xapp-\d-[A-Za-z0-9-]{10,}` + // Slack
|
|
71
|
+
// Slack webhooks, whose path is the secret
|
|
72
|
+
String.raw `|(?:(?<=hooks\.slack\.com/services/)|(?<=hooks\.slack\.com/workflows/)` +
|
|
73
|
+
String.raw `|(?<=hooks\.slack\.com/triggers/))[A-Za-z0-9+/]{20,}` +
|
|
74
|
+
String.raw `|(?:hf|api_org)_[A-Za-z]{34}` + // Hugging Face
|
|
75
|
+
String.raw `|pplx-[A-Za-z0-9]{48}` + // Perplexity
|
|
76
|
+
String.raw `|SK[0-9a-fA-F]{32}` + // Twilio API keys
|
|
77
|
+
String.raw `|eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]*` + // JWTs, signed or not
|
|
78
|
+
String.raw `)` +
|
|
79
|
+
// A PEM private key, through its END line or, cut short, the end of the text.
|
|
80
|
+
String.raw `|-----BEGIN[ A-Z0-9_-]{0,100}PRIVATE KEY(?: BLOCK)?-----` +
|
|
81
|
+
String.raw `(?:[\s\S]*?-----END[ A-Z0-9_-]{0,100}PRIVATE KEY(?: BLOCK)?-----|[\s\S]*)`, "g");
|
|
82
|
+
function stripQuotes(name) {
|
|
83
|
+
return name.replace(/^["']+/, "").replace(/["']+$/, "");
|
|
84
|
+
}
|
|
85
|
+
function isCredentialName(name) {
|
|
86
|
+
const words = stripQuotes(name)
|
|
87
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1_$2")
|
|
88
|
+
.toLowerCase();
|
|
89
|
+
const parts = words.split(/[-_.]/).filter((p) => p);
|
|
90
|
+
return CREDENTIAL_WORDS.has(parts.join("")) || parts.some((p) => CREDENTIAL_WORDS.has(p));
|
|
91
|
+
}
|
|
92
|
+
function redactPairs(text) {
|
|
93
|
+
// String.prototype.replace collects every match before calling the
|
|
94
|
+
// replacer, so recursing with the same global regex is safe.
|
|
95
|
+
return text.replace(PAIR, (...args) => redactPair(args[args.length - 1]));
|
|
96
|
+
}
|
|
97
|
+
function redactPair(match) {
|
|
98
|
+
const quote = match.vq || "";
|
|
99
|
+
let value;
|
|
100
|
+
if (isCredentialName(match.name)) {
|
|
101
|
+
value = REDACTED;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// The value may itself hold pairs, as `URL: https://...?token=...` does.
|
|
105
|
+
value = redactPairs(match.quoted || match.bare || "");
|
|
106
|
+
}
|
|
107
|
+
const opening = match.oq || "";
|
|
108
|
+
return `${match.name}${match.sep}${match.scheme || ""}${quote || opening}${value}${quote}`;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Mask the credentials in `text`, leaving the rest as written.
|
|
112
|
+
*
|
|
113
|
+
* @param text Text that may quote a credential, such as an error message.
|
|
114
|
+
* @returns The text with each credential replaced by `[REDACTED]`.
|
|
115
|
+
*/
|
|
116
|
+
export function redactSecrets(text) {
|
|
117
|
+
// Known formats go first: a PEM key spans lines, and masking its first line
|
|
118
|
+
// as a pair's value would leave the rest unrecognizable.
|
|
119
|
+
text = text.replace(KNOWN_TOKENS, REDACTED);
|
|
120
|
+
text = redactPairs(text);
|
|
121
|
+
return text.replace(URL_PASSWORD, `$<prefix>${REDACTED}`);
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=redaction.js.map
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/** Who can safely reach a URL's host. */
|
|
2
|
+
export declare const UrlReachability: {
|
|
3
|
+
/** Publicly routable — safe to hand to a third party to fetch itself. */
|
|
4
|
+
readonly PUBLIC: "public";
|
|
5
|
+
/**
|
|
6
|
+
* Within a trusted private network — safe for this server to fetch
|
|
7
|
+
* directly, but not to hand off to a third party that can't reach it.
|
|
8
|
+
*/
|
|
9
|
+
readonly ALLOWED: "allowed";
|
|
10
|
+
/** Nobody should fetch it. */
|
|
11
|
+
readonly BLOCKED: "blocked";
|
|
12
|
+
};
|
|
13
|
+
export type UrlReachability = (typeof UrlReachability)[keyof typeof UrlReachability];
|
|
14
|
+
/** A parsed IP address: its version and its value as a bigint. */
|
|
15
|
+
export interface IPAddress {
|
|
16
|
+
version: 4 | 6;
|
|
17
|
+
value: bigint;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Parse an IPv4 or IPv6 address (Python's `ipaddress.ip_address`).
|
|
21
|
+
*
|
|
22
|
+
* @throws Error If `text` is not a valid address (upstream: ValueError).
|
|
23
|
+
*/
|
|
24
|
+
export declare function ipAddress(text: string): IPAddress;
|
|
25
|
+
/** An IPv4 or IPv6 network in CIDR form (Python's `IPv4Network | IPv6Network`). */
|
|
26
|
+
export declare class IPNetwork {
|
|
27
|
+
#private;
|
|
28
|
+
readonly version: 4 | 6;
|
|
29
|
+
readonly networkAddress: bigint;
|
|
30
|
+
readonly prefixlen: number;
|
|
31
|
+
/**
|
|
32
|
+
* @param cidr A network such as `"10.0.0.0/8"` or `"fd00::/8"`. A bare
|
|
33
|
+
* address is a single-host network. Host bits must be zero, as Python's
|
|
34
|
+
* strict default requires.
|
|
35
|
+
* @throws Error If `cidr` is not a valid network (upstream: ValueError).
|
|
36
|
+
*/
|
|
37
|
+
constructor(cidr: string);
|
|
38
|
+
/** Whether `address` lies in this network (Python's `ip in network`). */
|
|
39
|
+
contains(address: IPAddress): boolean;
|
|
40
|
+
toString(): string;
|
|
41
|
+
}
|
|
42
|
+
/** Python's `ip_address(...).is_global`. */
|
|
43
|
+
export declare function ipAddressIsGlobal(address: IPAddress): boolean;
|
|
44
|
+
/** Resolve a hostname to its IP addresses (as `getaddrinfo` does). Throw if it fails. */
|
|
45
|
+
export type HostResolver = (hostname: string) => Promise<string[]>;
|
|
46
|
+
/** The default resolver: IP literals as-is, hostnames through `node:dns` if available. */
|
|
47
|
+
export declare const defaultHostResolver: HostResolver;
|
|
48
|
+
/** Install the resolver `classifyUrlReachability` uses. Pass `null` for the default. */
|
|
49
|
+
export declare function setHostResolver(resolver: HostResolver | null): void;
|
|
50
|
+
/**
|
|
51
|
+
* Return trusted networks from the `PIPECAT_ALLOWED_FILE_URL_NETWORKS` env var.
|
|
52
|
+
*
|
|
53
|
+
* Parses a comma-separated list of CIDR ranges (e.g.
|
|
54
|
+
* `10.0.0.0/8,192.168.0.0/16`). Returns an empty list (trust only the
|
|
55
|
+
* public internet) when the variable is unset or empty.
|
|
56
|
+
*/
|
|
57
|
+
export declare function defaultAllowedFileUrlNetworks(): string[];
|
|
58
|
+
/**
|
|
59
|
+
* Classify who can safely reach `url`'s host: the public internet, this server, or no one.
|
|
60
|
+
*
|
|
61
|
+
* Resolution happens once, up front; it doesn't defend against a target
|
|
62
|
+
* that resolves differently between this check and the actual connection
|
|
63
|
+
* (DNS rebinding).
|
|
64
|
+
*
|
|
65
|
+
* @param url The URL to classify.
|
|
66
|
+
* @param allowedNetworks Private networks this server is trusted to reach
|
|
67
|
+
* directly (e.g. where a deployment's own file servers live), beyond the
|
|
68
|
+
* public internet.
|
|
69
|
+
* @returns `PUBLIC` if every resolved address is publicly routable — safe to
|
|
70
|
+
* hand to a third party (e.g. an LLM provider) to fetch itself.
|
|
71
|
+
* `ALLOWED` if not publicly routable, but every address falls within
|
|
72
|
+
* `allowedNetworks` — safe for this server to fetch directly, but not to
|
|
73
|
+
* hand off to a third party that can't reach it.
|
|
74
|
+
* `BLOCKED` otherwise: loopback, link-local (including the cloud metadata
|
|
75
|
+
* range `169.254.0.0/16`), private (RFC 1918), or unique-local (IPv6 ULA)
|
|
76
|
+
* addresses outside `allowedNetworks`, or a host that fails to resolve.
|
|
77
|
+
*/
|
|
78
|
+
export declare function classifyUrlReachability(url: string, allowedNetworks?: readonly IPNetwork[]): Promise<UrlReachability>;
|
|
79
|
+
//# sourceMappingURL=ssrf.d.ts.map
|
|
@@ -0,0 +1,327 @@
|
|
|
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/security/ssrf.py
|
|
6
|
+
/**
|
|
7
|
+
* Guards against server-side request forgery via client-supplied URLs.
|
|
8
|
+
*
|
|
9
|
+
* Porting notes: Python's `ipaddress` module has no JavaScript counterpart, so
|
|
10
|
+
* this module carries the small part of it it needs (`IPNetwork`,
|
|
11
|
+
* `ipAddressIsGlobal`). Host resolution goes through a pluggable
|
|
12
|
+
* `HostResolver`; the default one uses `node:dns` through
|
|
13
|
+
* `process.getBuiltinModule` where the runtime provides it (Bun, Node, Deno),
|
|
14
|
+
* and otherwise only resolves IP literals, so a hostname that cannot be
|
|
15
|
+
* resolved is `BLOCKED`.
|
|
16
|
+
*/
|
|
17
|
+
import { abortable, rethrowIfCancelled } from "@pipedog/asyncio";
|
|
18
|
+
/** Who can safely reach a URL's host. */
|
|
19
|
+
export const UrlReachability = {
|
|
20
|
+
/** Publicly routable — safe to hand to a third party to fetch itself. */
|
|
21
|
+
PUBLIC: "public",
|
|
22
|
+
/**
|
|
23
|
+
* Within a trusted private network — safe for this server to fetch
|
|
24
|
+
* directly, but not to hand off to a third party that can't reach it.
|
|
25
|
+
*/
|
|
26
|
+
ALLOWED: "allowed",
|
|
27
|
+
/** Nobody should fetch it. */
|
|
28
|
+
BLOCKED: "blocked",
|
|
29
|
+
};
|
|
30
|
+
function parseIPv4(text) {
|
|
31
|
+
const parts = text.split(".");
|
|
32
|
+
if (parts.length !== 4)
|
|
33
|
+
return null;
|
|
34
|
+
let value = 0n;
|
|
35
|
+
for (const part of parts) {
|
|
36
|
+
if (!/^\d{1,3}$/.test(part))
|
|
37
|
+
return null;
|
|
38
|
+
// Python rejects leading zeros (ambiguous octal).
|
|
39
|
+
if (part.length > 1 && part.startsWith("0"))
|
|
40
|
+
return null;
|
|
41
|
+
const n = Number(part);
|
|
42
|
+
if (n > 255)
|
|
43
|
+
return null;
|
|
44
|
+
value = (value << 8n) | BigInt(n);
|
|
45
|
+
}
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
function parseIPv6(text) {
|
|
49
|
+
// Drop a scope id ("fe80::1%eth0").
|
|
50
|
+
const address = text.split("%")[0] ?? "";
|
|
51
|
+
if (!address.includes(":"))
|
|
52
|
+
return null;
|
|
53
|
+
let head = address;
|
|
54
|
+
let tailV4 = null;
|
|
55
|
+
const lastColon = address.lastIndexOf(":");
|
|
56
|
+
const last = address.slice(lastColon + 1);
|
|
57
|
+
if (last.includes(".")) {
|
|
58
|
+
tailV4 = parseIPv4(last);
|
|
59
|
+
if (tailV4 === null)
|
|
60
|
+
return null;
|
|
61
|
+
head = `${address.slice(0, lastColon + 1)}0:0`;
|
|
62
|
+
}
|
|
63
|
+
const halves = head.split("::");
|
|
64
|
+
if (halves.length > 2)
|
|
65
|
+
return null;
|
|
66
|
+
const parseGroups = (s) => {
|
|
67
|
+
if (s === "")
|
|
68
|
+
return [];
|
|
69
|
+
const groups = [];
|
|
70
|
+
for (const g of s.split(":")) {
|
|
71
|
+
if (!/^[0-9a-fA-F]{1,4}$/.test(g))
|
|
72
|
+
return null;
|
|
73
|
+
groups.push(Number.parseInt(g, 16));
|
|
74
|
+
}
|
|
75
|
+
return groups;
|
|
76
|
+
};
|
|
77
|
+
const left = parseGroups(halves[0] ?? "");
|
|
78
|
+
const right = halves.length === 2 ? parseGroups(halves[1] ?? "") : [];
|
|
79
|
+
if (left === null || right === null)
|
|
80
|
+
return null;
|
|
81
|
+
let groups;
|
|
82
|
+
if (halves.length === 2) {
|
|
83
|
+
const missing = 8 - left.length - right.length;
|
|
84
|
+
if (missing < 1)
|
|
85
|
+
return null;
|
|
86
|
+
groups = [...left, ...new Array(missing).fill(0), ...right];
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
groups = left;
|
|
90
|
+
}
|
|
91
|
+
if (groups.length !== 8)
|
|
92
|
+
return null;
|
|
93
|
+
let value = 0n;
|
|
94
|
+
for (const g of groups)
|
|
95
|
+
value = (value << 16n) | BigInt(g);
|
|
96
|
+
if (tailV4 !== null)
|
|
97
|
+
value = (value & ~0xffffffffn) | tailV4;
|
|
98
|
+
return value;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Parse an IPv4 or IPv6 address (Python's `ipaddress.ip_address`).
|
|
102
|
+
*
|
|
103
|
+
* @throws Error If `text` is not a valid address (upstream: ValueError).
|
|
104
|
+
*/
|
|
105
|
+
export function ipAddress(text) {
|
|
106
|
+
const v4 = parseIPv4(text);
|
|
107
|
+
if (v4 !== null)
|
|
108
|
+
return { version: 4, value: v4 };
|
|
109
|
+
const v6 = parseIPv6(text);
|
|
110
|
+
if (v6 !== null)
|
|
111
|
+
return { version: 6, value: v6 };
|
|
112
|
+
throw new Error(`'${text}' does not appear to be an IPv4 or IPv6 address`);
|
|
113
|
+
}
|
|
114
|
+
/** An IPv4 or IPv6 network in CIDR form (Python's `IPv4Network | IPv6Network`). */
|
|
115
|
+
export class IPNetwork {
|
|
116
|
+
version;
|
|
117
|
+
networkAddress;
|
|
118
|
+
prefixlen;
|
|
119
|
+
#mask;
|
|
120
|
+
/**
|
|
121
|
+
* @param cidr A network such as `"10.0.0.0/8"` or `"fd00::/8"`. A bare
|
|
122
|
+
* address is a single-host network. Host bits must be zero, as Python's
|
|
123
|
+
* strict default requires.
|
|
124
|
+
* @throws Error If `cidr` is not a valid network (upstream: ValueError).
|
|
125
|
+
*/
|
|
126
|
+
constructor(cidr) {
|
|
127
|
+
const [addressText, prefixText] = cidr.trim().split("/");
|
|
128
|
+
const address = ipAddress(addressText ?? "");
|
|
129
|
+
const bits = address.version === 4 ? 32 : 128;
|
|
130
|
+
const prefixlen = prefixText === undefined ? bits : Number(prefixText);
|
|
131
|
+
if (!Number.isInteger(prefixlen) || prefixlen < 0 || prefixlen > bits) {
|
|
132
|
+
throw new Error(`'${cidr}' does not appear to be an IPv4 or IPv6 network`);
|
|
133
|
+
}
|
|
134
|
+
const all = (1n << BigInt(bits)) - 1n;
|
|
135
|
+
const mask = (all << BigInt(bits - prefixlen)) & all;
|
|
136
|
+
if ((address.value & mask) !== address.value) {
|
|
137
|
+
throw new Error(`${cidr} has host bits set`);
|
|
138
|
+
}
|
|
139
|
+
this.version = address.version;
|
|
140
|
+
this.networkAddress = address.value;
|
|
141
|
+
this.prefixlen = prefixlen;
|
|
142
|
+
this.#mask = mask;
|
|
143
|
+
}
|
|
144
|
+
/** Whether `address` lies in this network (Python's `ip in network`). */
|
|
145
|
+
contains(address) {
|
|
146
|
+
return address.version === this.version && (address.value & this.#mask) === this.networkAddress;
|
|
147
|
+
}
|
|
148
|
+
toString() {
|
|
149
|
+
return `${formatAddress({ version: this.version, value: this.networkAddress })}/${this.prefixlen}`;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function formatAddress(address) {
|
|
153
|
+
if (address.version === 4) {
|
|
154
|
+
const v = address.value;
|
|
155
|
+
return [24n, 16n, 8n, 0n].map((s) => ((v >> s) & 0xffn).toString()).join(".");
|
|
156
|
+
}
|
|
157
|
+
const groups = [];
|
|
158
|
+
for (let s = 112n; s >= 0n; s -= 16n)
|
|
159
|
+
groups.push(((address.value >> s) & 0xffffn).toString(16));
|
|
160
|
+
return groups.join(":");
|
|
161
|
+
}
|
|
162
|
+
// The IANA special-purpose registries, as Python's `ipaddress` lists them.
|
|
163
|
+
const IPV4_PRIVATE = [
|
|
164
|
+
"0.0.0.0/8",
|
|
165
|
+
"10.0.0.0/8",
|
|
166
|
+
"127.0.0.0/8",
|
|
167
|
+
"169.254.0.0/16",
|
|
168
|
+
"172.16.0.0/12",
|
|
169
|
+
"192.0.0.0/29",
|
|
170
|
+
"192.0.0.170/31",
|
|
171
|
+
"192.0.2.0/24",
|
|
172
|
+
"192.168.0.0/16",
|
|
173
|
+
"198.18.0.0/15",
|
|
174
|
+
"198.51.100.0/24",
|
|
175
|
+
"203.0.113.0/24",
|
|
176
|
+
"240.0.0.0/4",
|
|
177
|
+
"255.255.255.255/32",
|
|
178
|
+
].map((n) => new IPNetwork(n));
|
|
179
|
+
const IPV4_PRIVATE_EXCEPTIONS = ["192.0.0.9/32", "192.0.0.10/32"].map((n) => new IPNetwork(n));
|
|
180
|
+
const IPV4_SHARED_ADDRESS_SPACE = new IPNetwork("100.64.0.0/10");
|
|
181
|
+
const IPV6_PRIVATE = [
|
|
182
|
+
"::1/128",
|
|
183
|
+
"::/128",
|
|
184
|
+
"::ffff:0:0/96",
|
|
185
|
+
"64:ff9b:1::/48",
|
|
186
|
+
"100::/64",
|
|
187
|
+
"2001::/23",
|
|
188
|
+
"2001:db8::/32",
|
|
189
|
+
"2002::/16",
|
|
190
|
+
"3fff::/20",
|
|
191
|
+
"fc00::/7",
|
|
192
|
+
"fe80::/10",
|
|
193
|
+
].map((n) => new IPNetwork(n));
|
|
194
|
+
const IPV6_PRIVATE_EXCEPTIONS = [
|
|
195
|
+
"2001:1::1/128",
|
|
196
|
+
"2001:1::2/128",
|
|
197
|
+
"2001:3::/32",
|
|
198
|
+
"2001:4:112::/48",
|
|
199
|
+
"2001:20::/28",
|
|
200
|
+
"2001:30::/28",
|
|
201
|
+
].map((n) => new IPNetwork(n));
|
|
202
|
+
const IPV4_MAPPED = new IPNetwork("::ffff:0:0/96");
|
|
203
|
+
/** Python's `ip_address(...).is_global`. */
|
|
204
|
+
export function ipAddressIsGlobal(address) {
|
|
205
|
+
if (address.version === 4) {
|
|
206
|
+
const isPrivate = IPV4_PRIVATE.some((n) => n.contains(address)) &&
|
|
207
|
+
!IPV4_PRIVATE_EXCEPTIONS.some((n) => n.contains(address));
|
|
208
|
+
return !IPV4_SHARED_ADDRESS_SPACE.contains(address) && !isPrivate;
|
|
209
|
+
}
|
|
210
|
+
// An IPv4-mapped address is judged by the IPv4 address it carries.
|
|
211
|
+
if (IPV4_MAPPED.contains(address)) {
|
|
212
|
+
return ipAddressIsGlobal({ version: 4, value: address.value & 0xffffffffn });
|
|
213
|
+
}
|
|
214
|
+
const isPrivate = IPV6_PRIVATE.some((n) => n.contains(address)) &&
|
|
215
|
+
!IPV6_PRIVATE_EXCEPTIONS.some((n) => n.contains(address));
|
|
216
|
+
return !isPrivate;
|
|
217
|
+
}
|
|
218
|
+
function nodeDns() {
|
|
219
|
+
const proc = globalThis.process;
|
|
220
|
+
try {
|
|
221
|
+
return proc?.getBuiltinModule?.("node:dns")?.promises ?? null;
|
|
222
|
+
}
|
|
223
|
+
catch (e) {
|
|
224
|
+
rethrowIfCancelled(e);
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/** The default resolver: IP literals as-is, hostnames through `node:dns` if available. */
|
|
229
|
+
export const defaultHostResolver = async (hostname) => {
|
|
230
|
+
try {
|
|
231
|
+
ipAddress(hostname);
|
|
232
|
+
return [hostname];
|
|
233
|
+
}
|
|
234
|
+
catch (e) {
|
|
235
|
+
rethrowIfCancelled(e);
|
|
236
|
+
}
|
|
237
|
+
const dns = nodeDns();
|
|
238
|
+
if (!dns) {
|
|
239
|
+
throw new Error(`no DNS resolver available to resolve '${hostname}'`);
|
|
240
|
+
}
|
|
241
|
+
const infos = await abortable(dns.lookup(hostname, { all: true }));
|
|
242
|
+
return infos.map((info) => info.address);
|
|
243
|
+
};
|
|
244
|
+
let hostResolver = defaultHostResolver;
|
|
245
|
+
/** Install the resolver `classifyUrlReachability` uses. Pass `null` for the default. */
|
|
246
|
+
export function setHostResolver(resolver) {
|
|
247
|
+
hostResolver = resolver ?? defaultHostResolver;
|
|
248
|
+
}
|
|
249
|
+
function getenv(name) {
|
|
250
|
+
return globalThis.process?.env?.[name];
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Return trusted networks from the `PIPECAT_ALLOWED_FILE_URL_NETWORKS` env var.
|
|
254
|
+
*
|
|
255
|
+
* Parses a comma-separated list of CIDR ranges (e.g.
|
|
256
|
+
* `10.0.0.0/8,192.168.0.0/16`). Returns an empty list (trust only the
|
|
257
|
+
* public internet) when the variable is unset or empty.
|
|
258
|
+
*/
|
|
259
|
+
export function defaultAllowedFileUrlNetworks() {
|
|
260
|
+
const val = getenv("PIPECAT_ALLOWED_FILE_URL_NETWORKS") ?? "";
|
|
261
|
+
return val
|
|
262
|
+
.split(",")
|
|
263
|
+
.map((n) => n.trim())
|
|
264
|
+
.filter((n) => n);
|
|
265
|
+
}
|
|
266
|
+
function urlHostname(url) {
|
|
267
|
+
let parsed;
|
|
268
|
+
try {
|
|
269
|
+
parsed = new URL(url);
|
|
270
|
+
}
|
|
271
|
+
catch (e) {
|
|
272
|
+
rethrowIfCancelled(e);
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
let hostname = parsed.hostname;
|
|
276
|
+
// `URL` keeps the brackets around IPv6 literals; `urlsplit` does not.
|
|
277
|
+
if (hostname.startsWith("[") && hostname.endsWith("]")) {
|
|
278
|
+
hostname = hostname.slice(1, -1);
|
|
279
|
+
}
|
|
280
|
+
return hostname ? hostname.toLowerCase() : null;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Classify who can safely reach `url`'s host: the public internet, this server, or no one.
|
|
284
|
+
*
|
|
285
|
+
* Resolution happens once, up front; it doesn't defend against a target
|
|
286
|
+
* that resolves differently between this check and the actual connection
|
|
287
|
+
* (DNS rebinding).
|
|
288
|
+
*
|
|
289
|
+
* @param url The URL to classify.
|
|
290
|
+
* @param allowedNetworks Private networks this server is trusted to reach
|
|
291
|
+
* directly (e.g. where a deployment's own file servers live), beyond the
|
|
292
|
+
* public internet.
|
|
293
|
+
* @returns `PUBLIC` if every resolved address is publicly routable — safe to
|
|
294
|
+
* hand to a third party (e.g. an LLM provider) to fetch itself.
|
|
295
|
+
* `ALLOWED` if not publicly routable, but every address falls within
|
|
296
|
+
* `allowedNetworks` — safe for this server to fetch directly, but not to
|
|
297
|
+
* hand off to a third party that can't reach it.
|
|
298
|
+
* `BLOCKED` otherwise: loopback, link-local (including the cloud metadata
|
|
299
|
+
* range `169.254.0.0/16`), private (RFC 1918), or unique-local (IPv6 ULA)
|
|
300
|
+
* addresses outside `allowedNetworks`, or a host that fails to resolve.
|
|
301
|
+
*/
|
|
302
|
+
export async function classifyUrlReachability(url, allowedNetworks = []) {
|
|
303
|
+
const hostname = urlHostname(url);
|
|
304
|
+
if (!hostname) {
|
|
305
|
+
return UrlReachability.BLOCKED;
|
|
306
|
+
}
|
|
307
|
+
let addresses;
|
|
308
|
+
try {
|
|
309
|
+
addresses = await hostResolver(hostname);
|
|
310
|
+
}
|
|
311
|
+
catch (e) {
|
|
312
|
+
rethrowIfCancelled(e);
|
|
313
|
+
return UrlReachability.BLOCKED;
|
|
314
|
+
}
|
|
315
|
+
if (addresses.length === 0) {
|
|
316
|
+
return UrlReachability.BLOCKED;
|
|
317
|
+
}
|
|
318
|
+
const ips = addresses.map((a) => ipAddress(a));
|
|
319
|
+
if (ips.every((ip) => ipAddressIsGlobal(ip))) {
|
|
320
|
+
return UrlReachability.PUBLIC;
|
|
321
|
+
}
|
|
322
|
+
if (ips.every((ip) => ipAddressIsGlobal(ip) || allowedNetworks.some((network) => network.contains(ip)))) {
|
|
323
|
+
return UrlReachability.ALLOWED;
|
|
324
|
+
}
|
|
325
|
+
return UrlReachability.BLOCKED;
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=ssrf.js.map
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
type AsyncMethod<This, A extends unknown[], T> = (this: This, ...args: A) => Promise<T>;
|
|
2
|
+
/**
|
|
3
|
+
* Run the decorated method for the first owner to acquire `name`.
|
|
4
|
+
*
|
|
5
|
+
* Owners that arrive while the first is still running wait for it to finish,
|
|
6
|
+
* so no caller continues against a half-built resource. Later owners return
|
|
7
|
+
* `null` without running the method again.
|
|
8
|
+
*
|
|
9
|
+
* A method that throws leaves the resource unbuilt, and every owner of it is
|
|
10
|
+
* told: the error is re-thrown to each one that arrives later, rather than the
|
|
11
|
+
* method being attempted again. So the owners of a resource share its verdict,
|
|
12
|
+
* and a pair of processors sharing a client either both come up or both fail.
|
|
13
|
+
*
|
|
14
|
+
* Note: the lock is not reentrant, so a method must not call another method
|
|
15
|
+
* that acquires the same resource.
|
|
16
|
+
*
|
|
17
|
+
* @param name The resource being acquired. Names are per instance, so paired
|
|
18
|
+
* operations on the same object (e.g. `setup`/`cleanup` and `join`/`leave`)
|
|
19
|
+
* count their owners separately.
|
|
20
|
+
*/
|
|
21
|
+
export declare function acquires(name: string): <This extends object, A extends unknown[], T>(func: AsyncMethod<This, A, T>, _context?: unknown) => AsyncMethod<This, A, T | null>;
|
|
22
|
+
/**
|
|
23
|
+
* Run the decorated method for the last owner to release `name`.
|
|
24
|
+
*
|
|
25
|
+
* Every other owner returns `null`, as does a release that no acquire
|
|
26
|
+
* matched.
|
|
27
|
+
*
|
|
28
|
+
* Note: the lock is not reentrant, so a method must not call another method
|
|
29
|
+
* that releases the same resource.
|
|
30
|
+
*
|
|
31
|
+
* @param name The resource being released, matching the `acquires` name.
|
|
32
|
+
*/
|
|
33
|
+
export declare function releases(name: string): <This extends object, A extends unknown[], T>(func: AsyncMethod<This, A, T>, _context?: unknown) => AsyncMethod<This, A, T | null>;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=shared.d.ts.map
|