@pipedog/core 0.0.0 → 0.2.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/engine.d.ts +60 -0
- package/dist/audio/resamplers/engine.js +89 -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/sinc_engine.d.ts +10 -0
- package/dist/audio/resamplers/sinc_engine.js +235 -0
- package/dist/audio/resamplers/soxr_resampler.d.ts +58 -0
- package/dist/audio/resamplers/soxr_resampler.js +79 -0
- package/dist/audio/resamplers/soxr_stream_resampler.d.ts +78 -0
- package/dist/audio/resamplers/soxr_stream_resampler.js +159 -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 +151 -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 +134 -0
- package/dist/audio/vad/vad_analyzer.js +249 -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 +821 -0
- package/dist/pipeline/worker.js +1656 -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 +115 -0
- package/dist/utils/file_storage.js +178 -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 +14 -0
- package/dist/utils/image.js +63 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/jpeg_encoder.d.ts +14 -0
- package/dist/utils/jpeg_encoder.js +315 -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/acronyms.d.ts +21 -0
- package/dist/utils/text/transforms/acronyms.js +31 -0
- package/dist/utils/text/transforms/currency.d.ts +16 -0
- package/dist/utils/text/transforms/currency.js +56 -0
- package/dist/utils/text/transforms/dates.d.ts +18 -0
- package/dist/utils/text/transforms/dates.js +102 -0
- package/dist/utils/text/transforms/email.d.ts +17 -0
- package/dist/utils/text/transforms/email.js +35 -0
- package/dist/utils/text/transforms/index.d.ts +37 -0
- package/dist/utils/text/transforms/index.js +42 -0
- package/dist/utils/text/transforms/numbers.d.ts +25 -0
- package/dist/utils/text/transforms/numbers.js +59 -0
- package/dist/utils/text/transforms/percentages.d.ts +16 -0
- package/dist/utils/text/transforms/percentages.js +32 -0
- package/dist/utils/text/transforms/phone.d.ts +21 -0
- package/dist/utils/text/transforms/phone.js +39 -0
- package/dist/utils/text/transforms/pronunciations.d.ts +65 -0
- package/dist/utils/text/transforms/pronunciations.js +112 -0
- package/dist/utils/text/transforms/replacements.d.ts +39 -0
- package/dist/utils/text/transforms/replacements.js +46 -0
- package/dist/utils/text/transforms/strip_markdown.d.ts +25 -0
- package/dist/utils/text/transforms/strip_markdown.js +60 -0
- package/dist/utils/text/transforms/units.d.ts +22 -0
- package/dist/utils/text/transforms/units.js +81 -0
- package/dist/utils/text/transforms/voice_formatter.d.ts +86 -0
- package/dist/utils/text/transforms/voice_formatter.js +98 -0
- package/dist/utils/text/unicode_digits.d.ts +3 -0
- package/dist/utils/text/unicode_digits.js +34 -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 +107 -0
- package/dist/utils/tracing/setup.js +160 -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 +95 -0
- package/dist/utils/tracing/turn_trace_observer.js +233 -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 +179 -0
- package/dist/utils/yaml.js +556 -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/proxy/index.d.ts +3 -0
- package/dist/workers/proxy/index.js +9 -0
- package/dist/workers/proxy/websocket/client.d.ts +110 -0
- package/dist/workers/proxy/websocket/client.js +196 -0
- package/dist/workers/proxy/websocket/index.d.ts +3 -0
- package/dist/workers/proxy/websocket/index.js +10 -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 +61 -3
- package/README.md +0 -5
|
@@ -0,0 +1,489 @@
|
|
|
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/workers/runner.py
|
|
6
|
+
/**
|
|
7
|
+
* Worker runner for managing worker execution and orchestration.
|
|
8
|
+
*
|
|
9
|
+
* This module provides the `WorkerRunner` class. It runs `BaseWorker`
|
|
10
|
+
* instances (including `PipelineWorker`) to completion, owning the shared
|
|
11
|
+
* `WorkerBus`, the worker registry, and the worker manager that backs the
|
|
12
|
+
* entire session.
|
|
13
|
+
*
|
|
14
|
+
* For a typical single-pipeline bot, register the worker with
|
|
15
|
+
* `WorkerRunner.addWorkers` and then call `WorkerRunner.run`:
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const runner = new WorkerRunner();
|
|
20
|
+
* await runner.addWorkers(worker);
|
|
21
|
+
* await runner.run();
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* For multi-worker setups, register every worker the same way:
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* const runner = new WorkerRunner();
|
|
29
|
+
* await runner.addWorkers(new CodeWorker("code-worker", ...), worker);
|
|
30
|
+
* await runner.run();
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* By default, `run()` ends once every root worker has finished — so a
|
|
34
|
+
* single-pipeline bot naturally ends when its pipeline does. Multi-worker
|
|
35
|
+
* bots whose helpers run forever (e.g. waiting for bus messages) end by
|
|
36
|
+
* calling `WorkerRunner.end` / `WorkerRunner.cancel` from an event handler
|
|
37
|
+
* (typically on transport disconnect). For long-lived hosts that add and
|
|
38
|
+
* remove workers over many sessions (e.g. an HTTP server), pass
|
|
39
|
+
* `autoEnd: false` to `run()` so the runner does not exit when no workers
|
|
40
|
+
* are left.
|
|
41
|
+
*/
|
|
42
|
+
import { CancelledError, createTask, Event, gather, gatherSettled, sleep, } from "@pipedog/asyncio";
|
|
43
|
+
import { AsyncQueueBus, BusAddWorkerMessage, BusCancelMessage, BusCancelWorkerMessage, BusEndMessage, BusEndWorkerMessage, BusWorkerRegistryMessage, } from "../bus/index.js";
|
|
44
|
+
import { BusSubscriber } from "../bus/subscriber.js";
|
|
45
|
+
import { PipelineWorker } from "../pipeline/worker.js";
|
|
46
|
+
import { WorkerRegistry } from "../registry/index.js";
|
|
47
|
+
import { WorkerReadyData, WorkerRegistryEntry } from "../registry/types.js";
|
|
48
|
+
import { TaskManager } from "../utils/asyncio/task_manager.js";
|
|
49
|
+
import { BaseObject } from "../utils/base_object.js";
|
|
50
|
+
import { logger } from "../utils/logger.js";
|
|
51
|
+
import { runSetupHook } from "../utils/startup.js";
|
|
52
|
+
import { WorkerParams } from "./base_worker.js";
|
|
53
|
+
/** A worker registered on the runner and its background task. */
|
|
54
|
+
class _WorkerEntry {
|
|
55
|
+
worker;
|
|
56
|
+
runnerTask;
|
|
57
|
+
constructor(options) {
|
|
58
|
+
this.worker = options.worker;
|
|
59
|
+
this.runnerTask = options.runnerTask ?? null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** The host's `process`, when it has one that delivers signals (Bun, Node, Deno). */
|
|
63
|
+
function signalProcess() {
|
|
64
|
+
const proc = globalThis.process;
|
|
65
|
+
return proc && typeof proc.on === "function" ? proc : undefined;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Manages worker execution.
|
|
69
|
+
*
|
|
70
|
+
* Provides a high-level interface for running workers with automatic signal
|
|
71
|
+
* handling (SIGINT/SIGTERM), optional garbage collection, proper cleanup of
|
|
72
|
+
* resources, and a worker bus + registry for multi-worker orchestration.
|
|
73
|
+
*
|
|
74
|
+
* Two entry points:
|
|
75
|
+
*
|
|
76
|
+
* - `addWorkers(...workers)` — register one or more workers on the runner's
|
|
77
|
+
* bus and start them in the background. Workers run concurrently and
|
|
78
|
+
* remaining workers are cancelled when the runner ends.
|
|
79
|
+
* - `run()` — block until the runner ends. By default (`autoEnd: true`) the
|
|
80
|
+
* runner ends once every root worker has finished; pass `autoEnd: false`
|
|
81
|
+
* to keep the runner up until `end()` / `cancel()` is called.
|
|
82
|
+
*
|
|
83
|
+
* Event handlers available:
|
|
84
|
+
*
|
|
85
|
+
* - `on_ready` — fired after the runner has finished its initialization and
|
|
86
|
+
* any added workers have been started.
|
|
87
|
+
* - `on_error` — fired when starting an added worker fails.
|
|
88
|
+
*/
|
|
89
|
+
export class WorkerRunner extends BusSubscriber(BaseObject) {
|
|
90
|
+
_bus;
|
|
91
|
+
_registry;
|
|
92
|
+
_checkDanglingTasks;
|
|
93
|
+
_entries = new Map();
|
|
94
|
+
_knownRunners = new Set();
|
|
95
|
+
_running = false;
|
|
96
|
+
_autoEnd = true;
|
|
97
|
+
_cancelReason = null;
|
|
98
|
+
_shutdownEvent = new Event();
|
|
99
|
+
_sigTask = null;
|
|
100
|
+
_handleSigint;
|
|
101
|
+
_handleSigterm;
|
|
102
|
+
_forceGc;
|
|
103
|
+
/**
|
|
104
|
+
* Initialize the worker runner.
|
|
105
|
+
*
|
|
106
|
+
* @param options Runner options (see `WorkerRunnerOptions`).
|
|
107
|
+
*/
|
|
108
|
+
constructor(options = {}) {
|
|
109
|
+
const taskManager = options.taskManager || new TaskManager();
|
|
110
|
+
const name = options.name || `runner-${crypto.randomUUID().replaceAll("-", "").slice(0, 8)}`;
|
|
111
|
+
super({ name, taskManager });
|
|
112
|
+
this._bus = options.bus || new AsyncQueueBus();
|
|
113
|
+
this._registry = new WorkerRegistry(this.name);
|
|
114
|
+
this._checkDanglingTasks = options.checkDanglingTasks ?? true;
|
|
115
|
+
this._handleSigint = options.handleSigint ?? true;
|
|
116
|
+
this._handleSigterm = options.handleSigterm ?? false;
|
|
117
|
+
this._forceGc = options.forceGc ?? false;
|
|
118
|
+
this._registerEventHandler("on_ready");
|
|
119
|
+
this._registerEventHandler("on_error");
|
|
120
|
+
}
|
|
121
|
+
/** The bus this runner hosts; shared across launched workers. */
|
|
122
|
+
get bus() {
|
|
123
|
+
return this._bus;
|
|
124
|
+
}
|
|
125
|
+
/** The worker registry this runner owns. */
|
|
126
|
+
get registry() {
|
|
127
|
+
return this._registry;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Look up a worker running on this runner by name.
|
|
131
|
+
*
|
|
132
|
+
* Only workers added to this runner have a local instance to return. A
|
|
133
|
+
* worker on another runner is addressable over the bus by name but has no
|
|
134
|
+
* object here, so it looks the same as an unknown name.
|
|
135
|
+
*
|
|
136
|
+
* @param name The name the worker was created with.
|
|
137
|
+
* @returns The worker, or null if this runner has no worker by that name.
|
|
138
|
+
*/
|
|
139
|
+
getWorker(name) {
|
|
140
|
+
const entry = this._entries.get(name);
|
|
141
|
+
return entry ? entry.worker : null;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Add one or more workers to the runner.
|
|
145
|
+
*
|
|
146
|
+
* Adding a worker attaches it to the runner's bus and registry, and starts
|
|
147
|
+
* it in the background. If the runner is not yet running (`addWorkers` was
|
|
148
|
+
* called before `run()`), workers are queued and started during run setup;
|
|
149
|
+
* if the runner is already running, each worker starts immediately.
|
|
150
|
+
*
|
|
151
|
+
* Every added worker is a peer: the runner privileges none of them. They
|
|
152
|
+
* run concurrently, and whichever are still running when the runner ends
|
|
153
|
+
* are cancelled. With `autoEnd: true` the runner ends once every root
|
|
154
|
+
* worker has finished, so a worker that never finishes on its own, such as
|
|
155
|
+
* a bus-only one waiting for messages, keeps it up until `end()` or
|
|
156
|
+
* `cancel()` is called.
|
|
157
|
+
*
|
|
158
|
+
* @param workers One or more workers to add.
|
|
159
|
+
*/
|
|
160
|
+
async addWorkers(...workers) {
|
|
161
|
+
for (const worker of workers) {
|
|
162
|
+
if (this._entries.has(worker.name)) {
|
|
163
|
+
logger.error(`WorkerRunner '${this}': worker '${worker.name}' already exists, skipping`);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
// `attach` is async because it also subscribes the worker to the bus —
|
|
167
|
+
// eager subscription is required so workers added later are listening
|
|
168
|
+
// before earlier workers emit their first messages.
|
|
169
|
+
await worker.attach({ registry: this._registry, bus: this._bus, workerRunner: this });
|
|
170
|
+
await this._registry.watch(worker.name, (data) => this._onLocalWorkerReady(data));
|
|
171
|
+
const entry = new _WorkerEntry({ worker });
|
|
172
|
+
this._entries.set(worker.name, entry);
|
|
173
|
+
logger.debug(`WorkerRunner '${this}': added worker '${worker.name}'`);
|
|
174
|
+
if (this._running) {
|
|
175
|
+
await this._startWorker(entry);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Run all added workers until the runner is stopped.
|
|
181
|
+
*
|
|
182
|
+
* By default (`autoEnd: true`), the runner ends once every root worker has
|
|
183
|
+
* finished — so a single-pipeline bot naturally ends when its pipeline
|
|
184
|
+
* does. Multi-worker bots whose helpers run forever (e.g. waiting for bus
|
|
185
|
+
* messages) end by calling `end()` / `cancel()` from an event handler
|
|
186
|
+
* (typically on transport disconnect). For long-lived hosts that add and
|
|
187
|
+
* remove workers over many sessions (e.g. an HTTP server), pass
|
|
188
|
+
* `autoEnd: false` so the runner does not exit when no workers are left.
|
|
189
|
+
*
|
|
190
|
+
* @param options.autoEnd When true (the default), the runner ends once
|
|
191
|
+
* every root worker has finished. When false, the runner blocks until
|
|
192
|
+
* `end()` or `cancel()` is called.
|
|
193
|
+
*/
|
|
194
|
+
async run(options = {}) {
|
|
195
|
+
logger.debug(`WorkerRunner '${this}': started running`);
|
|
196
|
+
this._autoEnd = options.autoEnd ?? true;
|
|
197
|
+
this._shutdownEvent.clear();
|
|
198
|
+
await this._setupSession();
|
|
199
|
+
await this._callEventHandler("on_ready");
|
|
200
|
+
// Wait for shutdown. With `autoEnd: true`, `_runWorker` sets
|
|
201
|
+
// `_shutdownEvent` once the last root worker finishes.
|
|
202
|
+
try {
|
|
203
|
+
await this._shutdownEvent.wait();
|
|
204
|
+
}
|
|
205
|
+
catch (e) {
|
|
206
|
+
if (!(e instanceof CancelledError))
|
|
207
|
+
throw e;
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
// Cancel any worker still going and wait for it to finish.
|
|
211
|
+
await this._cancelSpawnedWorkers();
|
|
212
|
+
// Cleanup base object.
|
|
213
|
+
await this.cleanup();
|
|
214
|
+
// If we are cancelling through a signal, make sure we wait for it so
|
|
215
|
+
// everything gets cleaned up nicely.
|
|
216
|
+
if (this._sigTask) {
|
|
217
|
+
await this._sigTask;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
finally {
|
|
221
|
+
await this._bus.stop();
|
|
222
|
+
this._running = false;
|
|
223
|
+
}
|
|
224
|
+
if (this._forceGc) {
|
|
225
|
+
await this._gcCollect();
|
|
226
|
+
}
|
|
227
|
+
// Report dangling tasks on the shared task manager after everything has
|
|
228
|
+
// been torn down. Workers sharing this task manager leave the report to
|
|
229
|
+
// us; only workers with their own task manager report themselves.
|
|
230
|
+
this._printDanglingTasks();
|
|
231
|
+
logger.debug(`WorkerRunner '${this}': finished running`);
|
|
232
|
+
}
|
|
233
|
+
/** Schedule all root pipeline workers to stop when their current processing is complete. */
|
|
234
|
+
async stopWhenDone() {
|
|
235
|
+
logger.debug(`WorkerRunner '${this}': scheduled to stop when all workers are done`);
|
|
236
|
+
await gather(...[...this._entries.values()]
|
|
237
|
+
.filter((entry) => entry.worker instanceof PipelineWorker && entry.worker.parent === null)
|
|
238
|
+
.map((entry) => () => entry.worker.stopWhenDone()));
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Gracefully end all running workers.
|
|
242
|
+
*
|
|
243
|
+
* Idempotent; subsequent calls are ignored.
|
|
244
|
+
*
|
|
245
|
+
* @param reason Optional human-readable reason for ending.
|
|
246
|
+
*/
|
|
247
|
+
async end(reason = null) {
|
|
248
|
+
if (this._shutdownEvent.isSet()) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
logger.debug(`WorkerRunner '${this}': ending gracefully (reason=${reason})`);
|
|
252
|
+
this._shutdownEvent.set();
|
|
253
|
+
await this._finishRunningWorkers(BusEndWorkerMessage, reason);
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Immediately cancel all running workers.
|
|
257
|
+
*
|
|
258
|
+
* Signals shutdown, which `run()` answers by cancelling every worker still
|
|
259
|
+
* going and waiting for it. Idempotent; subsequent calls are ignored.
|
|
260
|
+
*
|
|
261
|
+
* @param reason Optional human-readable reason for cancelling. Reaches each
|
|
262
|
+
* worker on the cancel message sent as the runner exits.
|
|
263
|
+
*/
|
|
264
|
+
async cancel(reason = null) {
|
|
265
|
+
if (this._shutdownEvent.isSet()) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
logger.debug(`WorkerRunner '${this}': cancelling (reason=${reason})`);
|
|
269
|
+
this._cancelReason = reason;
|
|
270
|
+
this._shutdownEvent.set();
|
|
271
|
+
}
|
|
272
|
+
/** Process incoming bus messages for runner-level concerns. */
|
|
273
|
+
async onBusMessage(message) {
|
|
274
|
+
if (message.source === this.name) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
if (message instanceof BusEndMessage) {
|
|
278
|
+
this.createTask(() => this.end(message.reason), "end");
|
|
279
|
+
}
|
|
280
|
+
else if (message instanceof BusCancelMessage) {
|
|
281
|
+
this.createTask(() => this.cancel(message.reason), "cancel");
|
|
282
|
+
}
|
|
283
|
+
else if (message instanceof BusAddWorkerMessage && message.worker) {
|
|
284
|
+
await this.addWorkers(message.worker);
|
|
285
|
+
}
|
|
286
|
+
else if (message instanceof BusWorkerRegistryMessage) {
|
|
287
|
+
await this._handleWorkerRegistry(message);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/** One-time per-run setup: worker manager, bus, signal handlers, launched workers. */
|
|
291
|
+
async _setupSession() {
|
|
292
|
+
if (this._running) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
await this._bus.setup(this.taskManager);
|
|
296
|
+
if (this._handleSigint) {
|
|
297
|
+
this._setupSigint();
|
|
298
|
+
}
|
|
299
|
+
if (this._handleSigterm) {
|
|
300
|
+
this._setupSigterm();
|
|
301
|
+
}
|
|
302
|
+
await this._bus.subscribe(this);
|
|
303
|
+
await this._bus.start();
|
|
304
|
+
await this._loadSetupFiles();
|
|
305
|
+
// Running from here on, so a worker that adds another one while it
|
|
306
|
+
// starts gets it started right away through addWorkers().
|
|
307
|
+
this._running = true;
|
|
308
|
+
for (const entry of [...this._entries.values()]) {
|
|
309
|
+
await this._startWorker(entry);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Cancel every worker still going and wait for it to finish.
|
|
314
|
+
*
|
|
315
|
+
* The one place the runner cancels its workers, reached on every way out:
|
|
316
|
+
* an ended session, a cancelled one, or the last root worker finishing. A
|
|
317
|
+
* worker whose task has already finished is left alone.
|
|
318
|
+
*/
|
|
319
|
+
async _cancelSpawnedWorkers() {
|
|
320
|
+
const running = await this._finishRunningWorkers(BusCancelWorkerMessage, this._cancelReason || "runner exiting");
|
|
321
|
+
await gatherSettled(...running.flatMap((entry) => (entry.runnerTask ? [entry.runnerTask] : [])));
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Ask each root worker that has not finished to wind down.
|
|
325
|
+
*
|
|
326
|
+
* Both messages this takes end a worker, gracefully or not. A worker whose
|
|
327
|
+
* task has already finished is skipped; one that has not started yet has
|
|
328
|
+
* not finished either, so it is still told.
|
|
329
|
+
*
|
|
330
|
+
* Sending is all this does. The worker finishes in its own time, which is
|
|
331
|
+
* what the returned entries are for.
|
|
332
|
+
*
|
|
333
|
+
* @param messageClass The per-worker message to send.
|
|
334
|
+
* @param reason Optional human-readable reason, carried on each message.
|
|
335
|
+
* @returns The entries that were messaged, root or otherwise.
|
|
336
|
+
*/
|
|
337
|
+
async _finishRunningWorkers(messageClass, reason) {
|
|
338
|
+
// A worker with no task has not started rather than finished, so it is
|
|
339
|
+
// still owed the message.
|
|
340
|
+
const running = [...this._entries.values()].filter((entry) => !entry.runnerTask?.done());
|
|
341
|
+
for (const entry of running) {
|
|
342
|
+
if (entry.worker.parent === null) {
|
|
343
|
+
await this._bus.send(new messageClass({ source: this.name, target: entry.worker.name, reason }));
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return running;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Run `setup_worker_runner` from each file in `PIPECAT_SETUP_FILES`.
|
|
350
|
+
*
|
|
351
|
+
* A setup file may define `setup_worker_runner(runner)` (or `setupWorkerRunner`) to add workers,
|
|
352
|
+
* attach event handlers, or wire other runner-level configuration.
|
|
353
|
+
*/
|
|
354
|
+
async _loadSetupFiles() {
|
|
355
|
+
await runSetupHook({ target: this, functionName: "setup_worker_runner" });
|
|
356
|
+
}
|
|
357
|
+
/** Run a registered worker as a background task. */
|
|
358
|
+
async _startWorker(entry) {
|
|
359
|
+
const worker = entry.worker;
|
|
360
|
+
logger.debug(`WorkerRunner '${this}': starting worker '${worker.name}'`);
|
|
361
|
+
entry.runnerTask = this.createTask(() => this._runWorker(worker), `task_${worker.name}`);
|
|
362
|
+
// Add the worker to event loop right away without needing to `await`.
|
|
363
|
+
await sleep(0);
|
|
364
|
+
}
|
|
365
|
+
/** Drive a registered worker to completion. */
|
|
366
|
+
async _runWorker(worker) {
|
|
367
|
+
try {
|
|
368
|
+
const params = new WorkerParams({ taskManager: this.taskManager });
|
|
369
|
+
await worker.run(params);
|
|
370
|
+
}
|
|
371
|
+
catch (e) {
|
|
372
|
+
if (!(e instanceof CancelledError))
|
|
373
|
+
throw e;
|
|
374
|
+
}
|
|
375
|
+
finally {
|
|
376
|
+
// End the runner once every root worker has finished. The current
|
|
377
|
+
// worker's task is still "running" (we're inside its body), so exclude
|
|
378
|
+
// it from the check.
|
|
379
|
+
if (this._autoEnd && worker.parent === null) {
|
|
380
|
+
const othersRunning = [...this._entries.values()].some((e) => e.worker.parent === null &&
|
|
381
|
+
e.worker !== worker &&
|
|
382
|
+
e.runnerTask !== null &&
|
|
383
|
+
!e.runnerTask.done());
|
|
384
|
+
if (!othersRunning) {
|
|
385
|
+
this._shutdownEvent.set();
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
/** Called when a local added worker registers as ready. */
|
|
391
|
+
async _onLocalWorkerReady(data) {
|
|
392
|
+
if (data.runner !== this.name) {
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
const entry = this._entries.get(data.workerName);
|
|
396
|
+
if (!entry || entry.worker.parent !== null) {
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
await this._sendRegistry();
|
|
400
|
+
}
|
|
401
|
+
/** Broadcast this runner's workers to the bus. */
|
|
402
|
+
async _sendRegistry() {
|
|
403
|
+
const workers = [...this._entries.values()].map((entry) => new WorkerRegistryEntry({
|
|
404
|
+
name: entry.worker.name,
|
|
405
|
+
parent: entry.worker.parent,
|
|
406
|
+
active: entry.worker.active,
|
|
407
|
+
bridged: entry.worker.bridged,
|
|
408
|
+
startedAt: entry.worker.startedAt,
|
|
409
|
+
}));
|
|
410
|
+
if (workers.length > 0) {
|
|
411
|
+
const names = workers.map((w) => w.name);
|
|
412
|
+
logger.debug(`WorkerRunner '${this}': broadcasting registry: [${names.map((n) => `'${n}'`).join(", ")}]`);
|
|
413
|
+
await this._bus.send(new BusWorkerRegistryMessage({
|
|
414
|
+
source: this.name,
|
|
415
|
+
runner: this.name,
|
|
416
|
+
workers,
|
|
417
|
+
}));
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
/** Handle a registry message from a remote runner. */
|
|
421
|
+
async _handleWorkerRegistry(message) {
|
|
422
|
+
const workerNames = message.workers.map((w) => w.name);
|
|
423
|
+
logger.debug(`WorkerRunner '${this}': received registry from '${message.runner}' ` +
|
|
424
|
+
`with workers: [${workerNames.map((n) => `'${n}'`).join(", ")}]`);
|
|
425
|
+
for (const entry of message.workers) {
|
|
426
|
+
await this._registry.register(new WorkerReadyData({ workerName: entry.name, runner: message.runner }));
|
|
427
|
+
}
|
|
428
|
+
if (!this._knownRunners.has(message.runner)) {
|
|
429
|
+
this._knownRunners.add(message.runner);
|
|
430
|
+
logger.debug(`WorkerRunner '${this}': new runner '${message.runner}', sending our registry back`);
|
|
431
|
+
await this._sendRegistry();
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Set up SIGINT handler for graceful shutdown.
|
|
436
|
+
*
|
|
437
|
+
* DIVERGENCE: installed through the host's `process.on` when there is one
|
|
438
|
+
* (Bun, Node, Deno); a no-op on runtimes without process signals (Workers).
|
|
439
|
+
*/
|
|
440
|
+
_setupSigint() {
|
|
441
|
+
signalProcess()?.on?.("SIGINT", () => this._sigHandler());
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Set up SIGTERM handler for graceful shutdown.
|
|
445
|
+
*
|
|
446
|
+
* DIVERGENCE: see `_setupSigint`.
|
|
447
|
+
*/
|
|
448
|
+
_setupSigterm() {
|
|
449
|
+
signalProcess()?.on?.("SIGTERM", () => this._sigHandler());
|
|
450
|
+
}
|
|
451
|
+
/** Handle interrupt signals by cancelling the runner. */
|
|
452
|
+
_sigHandler() {
|
|
453
|
+
if (!this._sigTask) {
|
|
454
|
+
this._sigTask = createTask(() => this._sigCancel());
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
/** Cancel the runner due to signal interruption. */
|
|
458
|
+
async _sigCancel() {
|
|
459
|
+
logger.warning(`WorkerRunner '${this}': interruption detected, cancelling.`);
|
|
460
|
+
await this.cancel("interrupt signal");
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Force garbage collection and log results.
|
|
464
|
+
*
|
|
465
|
+
* DIVERGENCE: JS has no `gc.collect()` count or `gc.garbage`; this calls
|
|
466
|
+
* the global `gc()` when the runtime exposes one (e.g. Node/Deno with
|
|
467
|
+
* `--expose-gc`).
|
|
468
|
+
*/
|
|
469
|
+
async _gcCollect() {
|
|
470
|
+
const gc = globalThis.gc;
|
|
471
|
+
if (typeof gc === "function") {
|
|
472
|
+
gc();
|
|
473
|
+
logger.debug("Garbage collector: collected.");
|
|
474
|
+
}
|
|
475
|
+
else {
|
|
476
|
+
logger.debug("Garbage collector: not exposed by this runtime, skipping.");
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
/** Warn about tasks left running on the task manager this runner owns. */
|
|
480
|
+
_printDanglingTasks() {
|
|
481
|
+
if (this._checkDanglingTasks) {
|
|
482
|
+
const tasks = this.taskManager.currentTasks().map((t) => t.getName());
|
|
483
|
+
if (tasks.length > 0) {
|
|
484
|
+
logger.warning(`${this} dangling tasks detected: [${tasks.map((t) => `'${t}'`).join(", ")}]`);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI worker: an LLM worker that observes and drives a client GUI over RTVI.
|
|
3
|
+
*
|
|
4
|
+
* Composes the RTVI UI wire protocol (client events, accessibility snapshots,
|
|
5
|
+
* server UI commands) with `screenTools`, the tool a voice LLM uses to ask a
|
|
6
|
+
* `UIWorker` about the screen. `PipelineWorker` connects a `UIWorker` to the
|
|
7
|
+
* client automatically whenever RTVI is enabled — no decorator or separate
|
|
8
|
+
* component to wire up.
|
|
9
|
+
*
|
|
10
|
+
* Built-in UI command payload models (Toast, Navigate, ScrollTo, Highlight,
|
|
11
|
+
* Focus, Click, SetInputValue, SelectText) live in
|
|
12
|
+
* `processors/frameworks/rtvi/models`. Import them from there directly.
|
|
13
|
+
*
|
|
14
|
+
* Porting notes: the deprecated `BaseUIWorker` and `ReplyToolMixin`
|
|
15
|
+
* re-exports are not ported.
|
|
16
|
+
*/
|
|
17
|
+
export { BusUICommandMessage, BusUIEventMessage, BusUIJobCompletedMessage, BusUIJobGroupCompletedMessage, BusUIJobGroupStartedMessage, BusUIJobUpdateMessage, } from "../../bus/ui/messages.ts";
|
|
18
|
+
export { uiEvent } from "./ui_event_decorator.ts";
|
|
19
|
+
export { UI_STATE_PROMPT_GUIDE } from "./ui_prompts.ts";
|
|
20
|
+
export { screenTools } from "./ui_tools.ts";
|
|
21
|
+
export { UISelection, UIWorker } from "./ui_worker.ts";
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,27 @@
|
|
|
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/workers/ui/__init__.py
|
|
6
|
+
/**
|
|
7
|
+
* UI worker: an LLM worker that observes and drives a client GUI over RTVI.
|
|
8
|
+
*
|
|
9
|
+
* Composes the RTVI UI wire protocol (client events, accessibility snapshots,
|
|
10
|
+
* server UI commands) with `screenTools`, the tool a voice LLM uses to ask a
|
|
11
|
+
* `UIWorker` about the screen. `PipelineWorker` connects a `UIWorker` to the
|
|
12
|
+
* client automatically whenever RTVI is enabled — no decorator or separate
|
|
13
|
+
* component to wire up.
|
|
14
|
+
*
|
|
15
|
+
* Built-in UI command payload models (Toast, Navigate, ScrollTo, Highlight,
|
|
16
|
+
* Focus, Click, SetInputValue, SelectText) live in
|
|
17
|
+
* `processors/frameworks/rtvi/models`. Import them from there directly.
|
|
18
|
+
*
|
|
19
|
+
* Porting notes: the deprecated `BaseUIWorker` and `ReplyToolMixin`
|
|
20
|
+
* re-exports are not ported.
|
|
21
|
+
*/
|
|
22
|
+
export { BusUICommandMessage, BusUIEventMessage, BusUIJobCompletedMessage, BusUIJobGroupCompletedMessage, BusUIJobGroupStartedMessage, BusUIJobUpdateMessage, } from "../../bus/ui/messages.js";
|
|
23
|
+
export { uiEvent } from "./ui_event_decorator.js";
|
|
24
|
+
export { UI_STATE_PROMPT_GUIDE } from "./ui_prompts.js";
|
|
25
|
+
export { screenTools } from "./ui_tools.js";
|
|
26
|
+
export { UISelection, UIWorker } from "./ui_worker.js";
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** Decorator for marking worker methods as UI event handlers. */
|
|
2
|
+
type AnyFn = (...args: any[]) => any;
|
|
3
|
+
/** A function marked by `uiEvent()`. */
|
|
4
|
+
export type UIEventHandler<F extends AnyFn = AnyFn> = F & {
|
|
5
|
+
isUiEventHandler: true;
|
|
6
|
+
uiEventName: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Mark a worker method as a handler for a named UI event.
|
|
10
|
+
*
|
|
11
|
+
* On `UIWorker` subclasses, decorated methods are automatically dispatched
|
|
12
|
+
* when a `BusUIEventMessage` with a matching `name` arrives.
|
|
13
|
+
*
|
|
14
|
+
* The returned decorator works both as a standard (TC39) method decorator and
|
|
15
|
+
* as a plain function, since runtimes that strip types (Node) do not run
|
|
16
|
+
* decorator syntax.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* class MyUIWorker extends UIWorker {
|
|
20
|
+
* async onNav(message: BusUIEventMessage): Promise<void> {
|
|
21
|
+
* const view = (message.payload as Record<string, unknown>).view;
|
|
22
|
+
* ...
|
|
23
|
+
* }
|
|
24
|
+
* static {
|
|
25
|
+
* uiEvent("nav_click")(this.prototype.onNav);
|
|
26
|
+
* }
|
|
27
|
+
* }
|
|
28
|
+
*
|
|
29
|
+
* @param name The UI event name to match.
|
|
30
|
+
*/
|
|
31
|
+
export declare function uiEvent(name: string): <F extends AnyFn>(fn: F, _context?: unknown) => F;
|
|
32
|
+
/**
|
|
33
|
+
* Collect all `uiEvent` decorated bound methods from an object.
|
|
34
|
+
*
|
|
35
|
+
* Walks the prototype chain so that overridden methods in subclasses take
|
|
36
|
+
* precedence over base-class definitions.
|
|
37
|
+
*
|
|
38
|
+
* @returns A map from event name to the bound method.
|
|
39
|
+
* @throws Error If two handlers share the same event name.
|
|
40
|
+
*/
|
|
41
|
+
export declare function _collectUiEventHandlers(obj: object): Map<string, AnyFn>;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=ui_event_decorator.d.ts.map
|
|
@@ -0,0 +1,75 @@
|
|
|
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/workers/ui/ui_event_decorator.py
|
|
6
|
+
/**
|
|
7
|
+
* Mark a worker method as a handler for a named UI event.
|
|
8
|
+
*
|
|
9
|
+
* On `UIWorker` subclasses, decorated methods are automatically dispatched
|
|
10
|
+
* when a `BusUIEventMessage` with a matching `name` arrives.
|
|
11
|
+
*
|
|
12
|
+
* The returned decorator works both as a standard (TC39) method decorator and
|
|
13
|
+
* as a plain function, since runtimes that strip types (Node) do not run
|
|
14
|
+
* decorator syntax.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* class MyUIWorker extends UIWorker {
|
|
18
|
+
* async onNav(message: BusUIEventMessage): Promise<void> {
|
|
19
|
+
* const view = (message.payload as Record<string, unknown>).view;
|
|
20
|
+
* ...
|
|
21
|
+
* }
|
|
22
|
+
* static {
|
|
23
|
+
* uiEvent("nav_click")(this.prototype.onNav);
|
|
24
|
+
* }
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* @param name The UI event name to match.
|
|
28
|
+
*/
|
|
29
|
+
export function uiEvent(name) {
|
|
30
|
+
return function decorator(fn, _context) {
|
|
31
|
+
const handler = fn;
|
|
32
|
+
handler.isUiEventHandler = true;
|
|
33
|
+
handler.uiEventName = name;
|
|
34
|
+
return fn;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Collect all `uiEvent` decorated bound methods from an object.
|
|
39
|
+
*
|
|
40
|
+
* Walks the prototype chain so that overridden methods in subclasses take
|
|
41
|
+
* precedence over base-class definitions.
|
|
42
|
+
*
|
|
43
|
+
* @returns A map from event name to the bound method.
|
|
44
|
+
* @throws Error If two handlers share the same event name.
|
|
45
|
+
*/
|
|
46
|
+
export function _collectUiEventHandlers(obj) {
|
|
47
|
+
const seen = new Set();
|
|
48
|
+
const handlers = new Map();
|
|
49
|
+
// event name -> defining method name, for errors
|
|
50
|
+
const sourceNames = new Map();
|
|
51
|
+
let proto = Object.getPrototypeOf(obj);
|
|
52
|
+
while (proto !== null && proto !== Object.prototype) {
|
|
53
|
+
for (const attrName of Object.getOwnPropertyNames(proto)) {
|
|
54
|
+
if (seen.has(attrName)) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
seen.add(attrName);
|
|
58
|
+
const descriptor = Object.getOwnPropertyDescriptor(proto, attrName);
|
|
59
|
+
// Skip accessors so collecting never runs a getter.
|
|
60
|
+
const val = descriptor && "value" in descriptor ? descriptor.value : undefined;
|
|
61
|
+
if (typeof val === "function" && val.isUiEventHandler === true) {
|
|
62
|
+
const eventName = val.uiEventName;
|
|
63
|
+
if (handlers.has(eventName)) {
|
|
64
|
+
throw new Error(`Duplicate @ui_event handler for '${eventName}': ` +
|
|
65
|
+
`'${attrName}' conflicts with '${sourceNames.get(eventName)}'`);
|
|
66
|
+
}
|
|
67
|
+
handlers.set(eventName, val.bind(obj));
|
|
68
|
+
sourceNames.set(eventName, attrName);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
proto = Object.getPrototypeOf(proto);
|
|
72
|
+
}
|
|
73
|
+
return handlers;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=ui_event_decorator.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User-facing job group context (compatibility shim).
|
|
3
|
+
*
|
|
4
|
+
* Porting notes:
|
|
5
|
+
* - Upstream this module holds only `UIJobGroupContext`, a deprecated alias
|
|
6
|
+
* (since 1.8.0) for `JobGroupContext` with the historical constructor
|
|
7
|
+
* signature. Deprecated upstream APIs are not ported, so this module is
|
|
8
|
+
* intentionally empty: a group dispatched by a `UIWorker` is client-visible,
|
|
9
|
+
* so use `JobGroupContext` (`worker.jobGroup(...)`) instead.
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=ui_job_context.d.ts.map
|