@pipedog/core 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (698) hide show
  1. package/LICENSE +25 -0
  2. package/NOTICE +9 -0
  3. package/dist/adapters/base_llm_adapter.d.ts +266 -0
  4. package/dist/adapters/base_llm_adapter.js +489 -0
  5. package/dist/adapters/index.d.ts +2 -0
  6. package/dist/adapters/index.js +8 -0
  7. package/dist/adapters/schemas/direct_function.d.ts +202 -0
  8. package/dist/adapters/schemas/direct_function.js +302 -0
  9. package/dist/adapters/schemas/function_schema.d.ts +67 -0
  10. package/dist/adapters/schemas/function_schema.js +72 -0
  11. package/dist/adapters/schemas/index.d.ts +2 -0
  12. package/dist/adapters/schemas/index.js +8 -0
  13. package/dist/adapters/schemas/tools_schema.d.ts +57 -0
  14. package/dist/adapters/schemas/tools_schema.js +79 -0
  15. package/dist/adapters/services/index.d.ts +2 -0
  16. package/dist/adapters/services/index.js +8 -0
  17. package/dist/adapters/services/open_ai_adapter.d.ts +147 -0
  18. package/dist/adapters/services/open_ai_adapter.js +250 -0
  19. package/dist/audio/dtmf/dtmf_data.d.ts +3 -0
  20. package/dist/audio/dtmf/dtmf_data.js +22 -0
  21. package/dist/audio/dtmf/index.d.ts +2 -0
  22. package/dist/audio/dtmf/index.js +8 -0
  23. package/dist/audio/dtmf/types.d.ts +31 -0
  24. package/dist/audio/dtmf/types.js +35 -0
  25. package/dist/audio/dtmf/utils.d.ts +13 -0
  26. package/dist/audio/dtmf/utils.js +62 -0
  27. package/dist/audio/filters/base_audio_filter.d.ts +51 -0
  28. package/dist/audio/filters/base_audio_filter.js +17 -0
  29. package/dist/audio/filters/index.d.ts +2 -0
  30. package/dist/audio/filters/index.js +8 -0
  31. package/dist/audio/index.d.ts +2 -0
  32. package/dist/audio/index.js +8 -0
  33. package/dist/audio/krisp_instance.d.ts +95 -0
  34. package/dist/audio/krisp_instance.js +229 -0
  35. package/dist/audio/mixers/base_audio_mixer.d.ts +56 -0
  36. package/dist/audio/mixers/base_audio_mixer.js +16 -0
  37. package/dist/audio/mixers/index.d.ts +2 -0
  38. package/dist/audio/mixers/index.js +8 -0
  39. package/dist/audio/resamplers/base_audio_resampler.d.ts +46 -0
  40. package/dist/audio/resamplers/base_audio_resampler.js +35 -0
  41. package/dist/audio/resamplers/index.d.ts +2 -0
  42. package/dist/audio/resamplers/index.js +8 -0
  43. package/dist/audio/resamplers/resampy_resampler.d.ts +10 -0
  44. package/dist/audio/resamplers/resampy_resampler.js +15 -0
  45. package/dist/audio/resamplers/soxr_resampler.d.ts +54 -0
  46. package/dist/audio/resamplers/soxr_resampler.js +69 -0
  47. package/dist/audio/resamplers/soxr_stream_resampler.d.ts +75 -0
  48. package/dist/audio/resamplers/soxr_stream_resampler.js +146 -0
  49. package/dist/audio/turn/base_turn_analyzer.d.ts +84 -0
  50. package/dist/audio/turn/base_turn_analyzer.js +61 -0
  51. package/dist/audio/turn/index.d.ts +2 -0
  52. package/dist/audio/turn/index.js +8 -0
  53. package/dist/audio/turn/smart_turn/_whisper_features.d.ts +30 -0
  54. package/dist/audio/turn/smart_turn/_whisper_features.js +225 -0
  55. package/dist/audio/turn/smart_turn/base_smart_turn.d.ts +94 -0
  56. package/dist/audio/turn/smart_turn/base_smart_turn.js +239 -0
  57. package/dist/audio/turn/smart_turn/local_smart_turn_v3.d.ts +76 -0
  58. package/dist/audio/turn/smart_turn/local_smart_turn_v3.js +143 -0
  59. package/dist/audio/utils.d.ts +224 -0
  60. package/dist/audio/utils.js +634 -0
  61. package/dist/audio/vad/data/index.d.ts +2 -0
  62. package/dist/audio/vad/data/index.js +8 -0
  63. package/dist/audio/vad/index.d.ts +2 -0
  64. package/dist/audio/vad/index.js +8 -0
  65. package/dist/audio/vad/vad_analyzer.d.ts +126 -0
  66. package/dist/audio/vad/vad_analyzer.js +211 -0
  67. package/dist/audio/vad/vad_controller.d.ts +143 -0
  68. package/dist/audio/vad/vad_controller.js +228 -0
  69. package/dist/audio/volume.d.ts +38 -0
  70. package/dist/audio/volume.js +75 -0
  71. package/dist/bus/adapters/base.d.ts +35 -0
  72. package/dist/bus/adapters/base.js +19 -0
  73. package/dist/bus/adapters/index.d.ts +10 -0
  74. package/dist/bus/adapters/index.js +15 -0
  75. package/dist/bus/adapters/llm_context_adapter.d.ts +36 -0
  76. package/dist/bus/adapters/llm_context_adapter.js +82 -0
  77. package/dist/bus/adapters/tools_schema_adapter.d.ts +25 -0
  78. package/dist/bus/adapters/tools_schema_adapter.js +70 -0
  79. package/dist/bus/bridge_processor.d.ts +111 -0
  80. package/dist/bus/bridge_processor.js +166 -0
  81. package/dist/bus/bus.d.ts +110 -0
  82. package/dist/bus/bus.js +200 -0
  83. package/dist/bus/index.d.ts +22 -0
  84. package/dist/bus/index.js +27 -0
  85. package/dist/bus/local/async_queue.d.ts +12 -0
  86. package/dist/bus/local/async_queue.js +21 -0
  87. package/dist/bus/local/index.d.ts +3 -0
  88. package/dist/bus/local/index.js +8 -0
  89. package/dist/bus/messages.d.ts +378 -0
  90. package/dist/bus/messages.js +357 -0
  91. package/dist/bus/network/index.d.ts +16 -0
  92. package/dist/bus/network/index.js +21 -0
  93. package/dist/bus/queue.d.ts +27 -0
  94. package/dist/bus/queue.js +51 -0
  95. package/dist/bus/serializers/base.d.ts +25 -0
  96. package/dist/bus/serializers/base.js +14 -0
  97. package/dist/bus/serializers/index.d.ts +9 -0
  98. package/dist/bus/serializers/index.js +14 -0
  99. package/dist/bus/serializers/json.d.ts +77 -0
  100. package/dist/bus/serializers/json.js +367 -0
  101. package/dist/bus/subscriber.d.ts +46 -0
  102. package/dist/bus/subscriber.js +27 -0
  103. package/dist/bus/ui/index.d.ts +3 -0
  104. package/dist/bus/ui/index.js +8 -0
  105. package/dist/bus/ui/messages.d.ts +186 -0
  106. package/dist/bus/ui/messages.js +171 -0
  107. package/dist/classifiers/base_classifier.d.ts +263 -0
  108. package/dist/classifiers/base_classifier.js +346 -0
  109. package/dist/classifiers/cloudflare/clef/classifier.d.ts +70 -0
  110. package/dist/classifiers/cloudflare/clef/classifier.js +204 -0
  111. package/dist/classifiers/cloudflare/clef/client.d.ts +104 -0
  112. package/dist/classifiers/cloudflare/clef/client.js +234 -0
  113. package/dist/classifiers/cloudflare/clef/index.d.ts +2 -0
  114. package/dist/classifiers/cloudflare/clef/index.js +8 -0
  115. package/dist/classifiers/cloudflare/index.d.ts +2 -0
  116. package/dist/classifiers/cloudflare/index.js +8 -0
  117. package/dist/classifiers/http_client.d.ts +70 -0
  118. package/dist/classifiers/http_client.js +161 -0
  119. package/dist/classifiers/index.d.ts +2 -0
  120. package/dist/classifiers/index.js +8 -0
  121. package/dist/classifiers/jev/classifier.d.ts +8 -0
  122. package/dist/classifiers/jev/classifier.js +13 -0
  123. package/dist/classifiers/jev/client.d.ts +8 -0
  124. package/dist/classifiers/jev/client.js +13 -0
  125. package/dist/classifiers/jev/index.d.ts +2 -0
  126. package/dist/classifiers/jev/index.js +8 -0
  127. package/dist/classifiers/llm/classifier.d.ts +72 -0
  128. package/dist/classifiers/llm/classifier.js +304 -0
  129. package/dist/classifiers/llm/index.d.ts +2 -0
  130. package/dist/classifiers/llm/index.js +8 -0
  131. package/dist/classifiers/openai/decisions/classifier.d.ts +77 -0
  132. package/dist/classifiers/openai/decisions/classifier.js +241 -0
  133. package/dist/classifiers/openai/decisions/client.d.ts +108 -0
  134. package/dist/classifiers/openai/decisions/client.js +234 -0
  135. package/dist/classifiers/openai/decisions/index.d.ts +2 -0
  136. package/dist/classifiers/openai/decisions/index.js +8 -0
  137. package/dist/classifiers/openai/index.d.ts +2 -0
  138. package/dist/classifiers/openai/index.js +8 -0
  139. package/dist/classifiers/typesafe/index.d.ts +2 -0
  140. package/dist/classifiers/typesafe/index.js +8 -0
  141. package/dist/classifiers/typesafe/jev/classifier.d.ts +70 -0
  142. package/dist/classifiers/typesafe/jev/classifier.js +220 -0
  143. package/dist/classifiers/typesafe/jev/client.d.ts +105 -0
  144. package/dist/classifiers/typesafe/jev/client.js +233 -0
  145. package/dist/classifiers/typesafe/jev/index.d.ts +2 -0
  146. package/dist/classifiers/typesafe/jev/index.js +8 -0
  147. package/dist/clocks/base_clock.d.ts +13 -0
  148. package/dist/clocks/base_clock.js +14 -0
  149. package/dist/clocks/index.d.ts +2 -0
  150. package/dist/clocks/index.js +8 -0
  151. package/dist/clocks/system_clock.d.ts +15 -0
  152. package/dist/clocks/system_clock.js +25 -0
  153. package/dist/frames/frames.d.ts +2533 -0
  154. package/dist/frames/frames.js +2485 -0
  155. package/dist/frames/index.d.ts +2 -0
  156. package/dist/frames/index.js +8 -0
  157. package/dist/frames/protobufs/frames_pb2.d.ts +229 -0
  158. package/dist/frames/protobufs/frames_pb2.js +466 -0
  159. package/dist/index.d.ts +11 -0
  160. package/dist/index.js +56 -0
  161. package/dist/metrics/index.d.ts +2 -0
  162. package/dist/metrics/index.js +8 -0
  163. package/dist/metrics/metrics.d.ts +276 -0
  164. package/dist/metrics/metrics.js +254 -0
  165. package/dist/observers/base_observer.d.ts +173 -0
  166. package/dist/observers/base_observer.js +151 -0
  167. package/dist/observers/error_observer.d.ts +75 -0
  168. package/dist/observers/error_observer.js +87 -0
  169. package/dist/observers/function_call_observer.d.ts +157 -0
  170. package/dist/observers/function_call_observer.js +222 -0
  171. package/dist/observers/index.d.ts +2 -0
  172. package/dist/observers/index.js +8 -0
  173. package/dist/observers/loggers/debug_log_observer.d.ts +91 -0
  174. package/dist/observers/loggers/debug_log_observer.js +228 -0
  175. package/dist/observers/loggers/index.d.ts +2 -0
  176. package/dist/observers/loggers/index.js +8 -0
  177. package/dist/observers/loggers/llm_log_observer.d.ts +24 -0
  178. package/dist/observers/loggers/llm_log_observer.js +110 -0
  179. package/dist/observers/loggers/metrics_log_observer.d.ts +85 -0
  180. package/dist/observers/loggers/metrics_log_observer.js +186 -0
  181. package/dist/observers/loggers/transcription_log_observer.d.ts +23 -0
  182. package/dist/observers/loggers/transcription_log_observer.js +74 -0
  183. package/dist/observers/service_metrics_observer.d.ts +168 -0
  184. package/dist/observers/service_metrics_observer.js +236 -0
  185. package/dist/observers/speaking_observer.d.ts +104 -0
  186. package/dist/observers/speaking_observer.js +150 -0
  187. package/dist/observers/startup_timing_observer.d.ts +221 -0
  188. package/dist/observers/startup_timing_observer.js +365 -0
  189. package/dist/observers/turn_tracking_observer.d.ts +78 -0
  190. package/dist/observers/turn_tracking_observer.js +189 -0
  191. package/dist/observers/user_bot_latency_observer.d.ts +411 -0
  192. package/dist/observers/user_bot_latency_observer.js +974 -0
  193. package/dist/pipeline/base_pipeline.d.ts +49 -0
  194. package/dist/pipeline/base_pipeline.js +101 -0
  195. package/dist/pipeline/capabilities.d.ts +76 -0
  196. package/dist/pipeline/capabilities.js +97 -0
  197. package/dist/pipeline/index.d.ts +2 -0
  198. package/dist/pipeline/index.js +8 -0
  199. package/dist/pipeline/job_context.d.ts +317 -0
  200. package/dist/pipeline/job_context.js +450 -0
  201. package/dist/pipeline/job_decorator.d.ts +54 -0
  202. package/dist/pipeline/job_decorator.js +92 -0
  203. package/dist/pipeline/llm_switcher.d.ts +84 -0
  204. package/dist/pipeline/llm_switcher.js +107 -0
  205. package/dist/pipeline/llm_with_backend.d.ts +435 -0
  206. package/dist/pipeline/llm_with_backend.js +806 -0
  207. package/dist/pipeline/parallel_pipeline.d.ts +83 -0
  208. package/dist/pipeline/parallel_pipeline.js +200 -0
  209. package/dist/pipeline/pipeline.d.ts +126 -0
  210. package/dist/pipeline/pipeline.js +196 -0
  211. package/dist/pipeline/service_switcher.d.ts +287 -0
  212. package/dist/pipeline/service_switcher.js +509 -0
  213. package/dist/pipeline/sync_parallel_pipeline.d.ts +192 -0
  214. package/dist/pipeline/sync_parallel_pipeline.js +387 -0
  215. package/dist/pipeline/worker.d.ts +814 -0
  216. package/dist/pipeline/worker.js +1639 -0
  217. package/dist/pipeline/worker_observer.d.ts +131 -0
  218. package/dist/pipeline/worker_observer.js +274 -0
  219. package/dist/pipeline/worker_ready_decorator.d.ts +45 -0
  220. package/dist/pipeline/worker_ready_decorator.js +76 -0
  221. package/dist/processors/aggregators/async_tool_messages.d.ts +146 -0
  222. package/dist/processors/aggregators/async_tool_messages.js +291 -0
  223. package/dist/processors/aggregators/dtmf_aggregator.d.ts +61 -0
  224. package/dist/processors/aggregators/dtmf_aggregator.js +144 -0
  225. package/dist/processors/aggregators/gated.d.ts +43 -0
  226. package/dist/processors/aggregators/gated.js +86 -0
  227. package/dist/processors/aggregators/gated_llm_context.d.ts +42 -0
  228. package/dist/processors/aggregators/gated_llm_context.js +86 -0
  229. package/dist/processors/aggregators/index.d.ts +2 -0
  230. package/dist/processors/aggregators/index.js +8 -0
  231. package/dist/processors/aggregators/llm_context.d.ts +370 -0
  232. package/dist/processors/aggregators/llm_context.js +580 -0
  233. package/dist/processors/aggregators/llm_context_summarizer.d.ts +219 -0
  234. package/dist/processors/aggregators/llm_context_summarizer.js +447 -0
  235. package/dist/processors/aggregators/llm_response.d.ts +37 -0
  236. package/dist/processors/aggregators/llm_response.js +71 -0
  237. package/dist/processors/aggregators/llm_response_universal.d.ts +966 -0
  238. package/dist/processors/aggregators/llm_response_universal.js +2394 -0
  239. package/dist/processors/aggregators/llm_text_processor.d.ts +53 -0
  240. package/dist/processors/aggregators/llm_text_processor.js +102 -0
  241. package/dist/processors/aggregators/sentence.d.ts +39 -0
  242. package/dist/processors/aggregators/sentence.js +69 -0
  243. package/dist/processors/async_generator.d.ts +42 -0
  244. package/dist/processors/async_generator.js +76 -0
  245. package/dist/processors/audio/audio_buffer_processor.d.ts +241 -0
  246. package/dist/processors/audio/audio_buffer_processor.js +565 -0
  247. package/dist/processors/audio/index.d.ts +2 -0
  248. package/dist/processors/audio/index.js +8 -0
  249. package/dist/processors/audio/vad_processor.d.ts +67 -0
  250. package/dist/processors/audio/vad_processor.js +103 -0
  251. package/dist/processors/consumer_processor.d.ts +49 -0
  252. package/dist/processors/consumer_processor.js +85 -0
  253. package/dist/processors/filters/frame_filter.d.ts +39 -0
  254. package/dist/processors/filters/frame_filter.js +52 -0
  255. package/dist/processors/filters/function_filter.d.ts +59 -0
  256. package/dist/processors/filters/function_filter.js +78 -0
  257. package/dist/processors/filters/identity_filter.d.ts +33 -0
  258. package/dist/processors/filters/identity_filter.js +37 -0
  259. package/dist/processors/filters/index.d.ts +2 -0
  260. package/dist/processors/filters/index.js +8 -0
  261. package/dist/processors/filters/null_filter.d.ts +34 -0
  262. package/dist/processors/filters/null_filter.js +47 -0
  263. package/dist/processors/filters/wake_notifier_filter.d.ts +48 -0
  264. package/dist/processors/filters/wake_notifier_filter.js +49 -0
  265. package/dist/processors/frame_processor.d.ts +360 -0
  266. package/dist/processors/frame_processor.js +932 -0
  267. package/dist/processors/frameworks/index.d.ts +2 -0
  268. package/dist/processors/frameworks/index.js +8 -0
  269. package/dist/processors/frameworks/rtvi/frames.d.ts +241 -0
  270. package/dist/processors/frameworks/rtvi/frames.js +259 -0
  271. package/dist/processors/frameworks/rtvi/index.d.ts +6 -0
  272. package/dist/processors/frameworks/rtvi/index.js +11 -0
  273. package/dist/processors/frameworks/rtvi/models.d.ts +1741 -0
  274. package/dist/processors/frameworks/rtvi/models.js +1807 -0
  275. package/dist/processors/frameworks/rtvi/observer.d.ts +340 -0
  276. package/dist/processors/frameworks/rtvi/observer.js +1113 -0
  277. package/dist/processors/frameworks/rtvi/processor.d.ts +182 -0
  278. package/dist/processors/frameworks/rtvi/processor.js +676 -0
  279. package/dist/processors/idle_frame_processor.d.ts +44 -0
  280. package/dist/processors/idle_frame_processor.js +86 -0
  281. package/dist/processors/index.d.ts +2 -0
  282. package/dist/processors/index.js +8 -0
  283. package/dist/processors/logger.d.ts +42 -0
  284. package/dist/processors/logger.js +87 -0
  285. package/dist/processors/metrics/frame_processor_metrics.d.ts +172 -0
  286. package/dist/processors/metrics/frame_processor_metrics.js +372 -0
  287. package/dist/processors/metrics/index.d.ts +2 -0
  288. package/dist/processors/metrics/index.js +8 -0
  289. package/dist/processors/producer_processor.d.ts +68 -0
  290. package/dist/processors/producer_processor.js +78 -0
  291. package/dist/processors/text_transformer.d.ts +30 -0
  292. package/dist/processors/text_transformer.js +48 -0
  293. package/dist/registry/index.d.ts +3 -0
  294. package/dist/registry/index.js +8 -0
  295. package/dist/registry/registry.d.ts +69 -0
  296. package/dist/registry/registry.js +149 -0
  297. package/dist/registry/types.d.ts +47 -0
  298. package/dist/registry/types.js +39 -0
  299. package/dist/serializers/base_serializer.d.ts +94 -0
  300. package/dist/serializers/base_serializer.js +82 -0
  301. package/dist/serializers/index.d.ts +2 -0
  302. package/dist/serializers/index.js +8 -0
  303. package/dist/services/ai_service.d.ts +145 -0
  304. package/dist/services/ai_service.js +262 -0
  305. package/dist/services/anthropic/index.d.ts +2 -0
  306. package/dist/services/anthropic/index.js +7 -0
  307. package/dist/services/assemblyai/index.d.ts +2 -0
  308. package/dist/services/assemblyai/index.js +7 -0
  309. package/dist/services/asyncai/index.d.ts +2 -0
  310. package/dist/services/asyncai/index.js +7 -0
  311. package/dist/services/aws/index.d.ts +2 -0
  312. package/dist/services/aws/index.js +7 -0
  313. package/dist/services/azure/index.d.ts +2 -0
  314. package/dist/services/azure/index.js +7 -0
  315. package/dist/services/baseten/index.d.ts +2 -0
  316. package/dist/services/baseten/index.js +7 -0
  317. package/dist/services/bland/index.d.ts +2 -0
  318. package/dist/services/bland/index.js +7 -0
  319. package/dist/services/camb/index.d.ts +2 -0
  320. package/dist/services/camb/index.js +7 -0
  321. package/dist/services/cartesia/index.d.ts +2 -0
  322. package/dist/services/cartesia/index.js +7 -0
  323. package/dist/services/cerebras/index.d.ts +2 -0
  324. package/dist/services/cerebras/index.js +7 -0
  325. package/dist/services/crusoe/index.d.ts +2 -0
  326. package/dist/services/crusoe/index.js +7 -0
  327. package/dist/services/deepgram/index.d.ts +2 -0
  328. package/dist/services/deepgram/index.js +7 -0
  329. package/dist/services/deepseek/index.d.ts +2 -0
  330. package/dist/services/deepseek/index.js +7 -0
  331. package/dist/services/elevenlabs/index.d.ts +2 -0
  332. package/dist/services/elevenlabs/index.js +7 -0
  333. package/dist/services/fal/index.d.ts +2 -0
  334. package/dist/services/fal/index.js +7 -0
  335. package/dist/services/fireworks/index.d.ts +2 -0
  336. package/dist/services/fireworks/index.js +7 -0
  337. package/dist/services/fish/index.d.ts +2 -0
  338. package/dist/services/fish/index.js +7 -0
  339. package/dist/services/funasr/index.d.ts +3 -0
  340. package/dist/services/funasr/index.js +8 -0
  341. package/dist/services/gladia/index.d.ts +2 -0
  342. package/dist/services/gladia/index.js +7 -0
  343. package/dist/services/google/index.d.ts +2 -0
  344. package/dist/services/google/index.js +7 -0
  345. package/dist/services/gradium/index.d.ts +2 -0
  346. package/dist/services/gradium/index.js +7 -0
  347. package/dist/services/grok/index.d.ts +2 -0
  348. package/dist/services/grok/index.js +7 -0
  349. package/dist/services/groq/index.d.ts +2 -0
  350. package/dist/services/groq/index.js +7 -0
  351. package/dist/services/heygen/index.d.ts +2 -0
  352. package/dist/services/heygen/index.js +7 -0
  353. package/dist/services/hume/index.d.ts +2 -0
  354. package/dist/services/hume/index.js +7 -0
  355. package/dist/services/image_service.d.ts +52 -0
  356. package/dist/services/image_service.js +60 -0
  357. package/dist/services/inception/index.d.ts +2 -0
  358. package/dist/services/inception/index.js +7 -0
  359. package/dist/services/index.d.ts +2 -0
  360. package/dist/services/index.js +8 -0
  361. package/dist/services/inworld/index.d.ts +2 -0
  362. package/dist/services/inworld/index.js +7 -0
  363. package/dist/services/keenable/index.d.ts +2 -0
  364. package/dist/services/keenable/index.js +7 -0
  365. package/dist/services/kokoro/index.d.ts +2 -0
  366. package/dist/services/kokoro/index.js +7 -0
  367. package/dist/services/llm_service.d.ts +1106 -0
  368. package/dist/services/llm_service.js +2231 -0
  369. package/dist/services/mem0/index.d.ts +2 -0
  370. package/dist/services/mem0/index.js +7 -0
  371. package/dist/services/meta/index.d.ts +2 -0
  372. package/dist/services/meta/index.js +7 -0
  373. package/dist/services/minimax/index.d.ts +2 -0
  374. package/dist/services/minimax/index.js +7 -0
  375. package/dist/services/mistral/index.d.ts +2 -0
  376. package/dist/services/mistral/index.js +7 -0
  377. package/dist/services/moondream/index.d.ts +2 -0
  378. package/dist/services/moondream/index.js +7 -0
  379. package/dist/services/moonshine/index.d.ts +2 -0
  380. package/dist/services/moonshine/index.js +7 -0
  381. package/dist/services/nebius/index.d.ts +2 -0
  382. package/dist/services/nebius/index.js +7 -0
  383. package/dist/services/neuphonic/index.d.ts +2 -0
  384. package/dist/services/neuphonic/index.js +7 -0
  385. package/dist/services/novita/index.d.ts +2 -0
  386. package/dist/services/novita/index.js +7 -0
  387. package/dist/services/nvidia/index.d.ts +2 -0
  388. package/dist/services/nvidia/index.js +11 -0
  389. package/dist/services/ollama/index.d.ts +2 -0
  390. package/dist/services/ollama/index.js +7 -0
  391. package/dist/services/openai/index.d.ts +2 -0
  392. package/dist/services/openai/index.js +7 -0
  393. package/dist/services/openclaw/index.d.ts +14 -0
  394. package/dist/services/openclaw/index.js +19 -0
  395. package/dist/services/openrouter/index.d.ts +2 -0
  396. package/dist/services/openrouter/index.js +7 -0
  397. package/dist/services/perplexity/index.d.ts +2 -0
  398. package/dist/services/perplexity/index.js +7 -0
  399. package/dist/services/piper/index.d.ts +2 -0
  400. package/dist/services/piper/index.js +7 -0
  401. package/dist/services/pocket_tts/index.d.ts +2 -0
  402. package/dist/services/pocket_tts/index.js +7 -0
  403. package/dist/services/qwen/index.d.ts +2 -0
  404. package/dist/services/qwen/index.js +7 -0
  405. package/dist/services/resembleai/index.d.ts +2 -0
  406. package/dist/services/resembleai/index.js +7 -0
  407. package/dist/services/rime/index.d.ts +2 -0
  408. package/dist/services/rime/index.js +7 -0
  409. package/dist/services/sambanova/index.d.ts +2 -0
  410. package/dist/services/sambanova/index.js +7 -0
  411. package/dist/services/sarvam/index.d.ts +2 -0
  412. package/dist/services/sarvam/index.js +7 -0
  413. package/dist/services/settings.d.ts +356 -0
  414. package/dist/services/settings.js +437 -0
  415. package/dist/services/simli/index.d.ts +2 -0
  416. package/dist/services/simli/index.js +7 -0
  417. package/dist/services/smallest/index.d.ts +2 -0
  418. package/dist/services/smallest/index.js +7 -0
  419. package/dist/services/soniox/index.d.ts +2 -0
  420. package/dist/services/soniox/index.js +7 -0
  421. package/dist/services/speechify/index.d.ts +2 -0
  422. package/dist/services/speechify/index.js +7 -0
  423. package/dist/services/speechmatics/index.d.ts +2 -0
  424. package/dist/services/speechmatics/index.js +7 -0
  425. package/dist/services/stt_latency.d.ts +62 -0
  426. package/dist/services/stt_latency.js +71 -0
  427. package/dist/services/stt_service.d.ts +601 -0
  428. package/dist/services/stt_service.js +1044 -0
  429. package/dist/services/tavus/index.d.ts +2 -0
  430. package/dist/services/tavus/index.js +7 -0
  431. package/dist/services/together/index.d.ts +2 -0
  432. package/dist/services/together/index.js +7 -0
  433. package/dist/services/tts_service.d.ts +909 -0
  434. package/dist/services/tts_service.js +2018 -0
  435. package/dist/services/ultravox/index.d.ts +2 -0
  436. package/dist/services/ultravox/index.js +9 -0
  437. package/dist/services/vision_service.d.ts +56 -0
  438. package/dist/services/vision_service.js +62 -0
  439. package/dist/services/websocket_service.d.ts +213 -0
  440. package/dist/services/websocket_service.js +654 -0
  441. package/dist/services/whisper/index.d.ts +2 -0
  442. package/dist/services/whisper/index.js +9 -0
  443. package/dist/services/xai/index.d.ts +2 -0
  444. package/dist/services/xai/index.js +9 -0
  445. package/dist/services/xtts/index.d.ts +2 -0
  446. package/dist/services/xtts/index.js +9 -0
  447. package/dist/tests/index.d.ts +2 -0
  448. package/dist/tests/index.js +8 -0
  449. package/dist/tests/utils.d.ts +123 -0
  450. package/dist/tests/utils.js +212 -0
  451. package/dist/transcriptions/index.d.ts +2 -0
  452. package/dist/transcriptions/index.js +8 -0
  453. package/dist/transcriptions/language.d.ts +376 -0
  454. package/dist/transcriptions/language.js +543 -0
  455. package/dist/transports/base_input.d.ts +149 -0
  456. package/dist/transports/base_input.js +338 -0
  457. package/dist/transports/base_output.d.ts +432 -0
  458. package/dist/transports/base_output.js +1231 -0
  459. package/dist/transports/base_transport.d.ts +223 -0
  460. package/dist/transports/base_transport.js +167 -0
  461. package/dist/transports/daily/index.d.ts +2 -0
  462. package/dist/transports/daily/index.js +9 -0
  463. package/dist/transports/heygen/index.d.ts +2 -0
  464. package/dist/transports/heygen/index.js +9 -0
  465. package/dist/transports/index.d.ts +2 -0
  466. package/dist/transports/index.js +8 -0
  467. package/dist/transports/lemonslice/index.d.ts +2 -0
  468. package/dist/transports/lemonslice/index.js +9 -0
  469. package/dist/transports/livekit/index.d.ts +2 -0
  470. package/dist/transports/livekit/index.js +9 -0
  471. package/dist/transports/local/index.d.ts +2 -0
  472. package/dist/transports/local/index.js +9 -0
  473. package/dist/transports/moq/index.d.ts +2 -0
  474. package/dist/transports/moq/index.js +9 -0
  475. package/dist/transports/smallwebrtc/index.d.ts +2 -0
  476. package/dist/transports/smallwebrtc/index.js +9 -0
  477. package/dist/transports/tavus/index.d.ts +2 -0
  478. package/dist/transports/tavus/index.js +9 -0
  479. package/dist/transports/video_in_sampler.d.ts +157 -0
  480. package/dist/transports/video_in_sampler.js +258 -0
  481. package/dist/transports/vonage/index.d.ts +2 -0
  482. package/dist/transports/vonage/index.js +9 -0
  483. package/dist/transports/websocket/index.d.ts +2 -0
  484. package/dist/transports/websocket/index.js +9 -0
  485. package/dist/transports/whatsapp/index.d.ts +2 -0
  486. package/dist/transports/whatsapp/index.js +9 -0
  487. package/dist/turns/eager_end_of_turn_mixin.d.ts +70 -0
  488. package/dist/turns/eager_end_of_turn_mixin.js +122 -0
  489. package/dist/turns/empty_user_turn.d.ts +55 -0
  490. package/dist/turns/empty_user_turn.js +53 -0
  491. package/dist/turns/index.d.ts +2 -0
  492. package/dist/turns/index.js +8 -0
  493. package/dist/turns/speculation_gate.d.ts +169 -0
  494. package/dist/turns/speculation_gate.js +294 -0
  495. package/dist/turns/types.d.ts +33 -0
  496. package/dist/turns/types.js +35 -0
  497. package/dist/turns/user_idle_controller.d.ts +94 -0
  498. package/dist/turns/user_idle_controller.js +187 -0
  499. package/dist/turns/user_mute/always_user_mute_strategy.d.ts +15 -0
  500. package/dist/turns/user_mute/always_user_mute_strategy.js +29 -0
  501. package/dist/turns/user_mute/base_user_mute_strategy.d.ts +39 -0
  502. package/dist/turns/user_mute/base_user_mute_strategy.js +45 -0
  503. package/dist/turns/user_mute/first_speech_user_mute_strategy.d.ts +28 -0
  504. package/dist/turns/user_mute/first_speech_user_mute_strategy.js +52 -0
  505. package/dist/turns/user_mute/function_call_user_mute_strategy.d.ts +25 -0
  506. package/dist/turns/user_mute/function_call_user_mute_strategy.js +50 -0
  507. package/dist/turns/user_mute/index.d.ts +6 -0
  508. package/dist/turns/user_mute/index.js +11 -0
  509. package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.d.ts +43 -0
  510. package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.js +76 -0
  511. package/dist/turns/user_start/base_user_turn_start_strategy.d.ts +135 -0
  512. package/dist/turns/user_start/base_user_turn_start_strategy.js +134 -0
  513. package/dist/turns/user_start/external_user_turn_start_strategy.d.ts +45 -0
  514. package/dist/turns/user_start/external_user_turn_start_strategy.js +64 -0
  515. package/dist/turns/user_start/index.d.ts +8 -0
  516. package/dist/turns/user_start/index.js +16 -0
  517. package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.d.ts +133 -0
  518. package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.js +243 -0
  519. package/dist/turns/user_start/min_words_user_turn_start_strategy.d.ts +60 -0
  520. package/dist/turns/user_start/min_words_user_turn_start_strategy.js +102 -0
  521. package/dist/turns/user_start/transcription_user_turn_start_strategy.d.ts +29 -0
  522. package/dist/turns/user_start/transcription_user_turn_start_strategy.js +43 -0
  523. package/dist/turns/user_start/vad_user_turn_start_strategy.d.ts +20 -0
  524. package/dist/turns/user_start/vad_user_turn_start_strategy.js +31 -0
  525. package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.d.ts +141 -0
  526. package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.js +238 -0
  527. package/dist/turns/user_stop/base_user_turn_stop_strategy.d.ts +174 -0
  528. package/dist/turns/user_stop/base_user_turn_stop_strategy.js +170 -0
  529. package/dist/turns/user_stop/deferred_user_turn_stop_strategy.d.ts +81 -0
  530. package/dist/turns/user_stop/deferred_user_turn_stop_strategy.js +107 -0
  531. package/dist/turns/user_stop/eager_match_policy.d.ts +36 -0
  532. package/dist/turns/user_stop/eager_match_policy.js +50 -0
  533. package/dist/turns/user_stop/eager_user_turn_stop_strategy.d.ts +84 -0
  534. package/dist/turns/user_stop/eager_user_turn_stop_strategy.js +154 -0
  535. package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.d.ts +45 -0
  536. package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.js +55 -0
  537. package/dist/turns/user_stop/external_user_turn_stop_strategy.d.ts +115 -0
  538. package/dist/turns/user_stop/external_user_turn_stop_strategy.js +205 -0
  539. package/dist/turns/user_stop/index.d.ts +10 -0
  540. package/dist/turns/user_stop/index.js +15 -0
  541. package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.d.ts +44 -0
  542. package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.js +59 -0
  543. package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.d.ts +140 -0
  544. package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.js +303 -0
  545. package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.d.ts +135 -0
  546. package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.js +332 -0
  547. package/dist/turns/user_turn_completion_mixin.d.ts +147 -0
  548. package/dist/turns/user_turn_completion_mixin.js +591 -0
  549. package/dist/turns/user_turn_controller.d.ts +134 -0
  550. package/dist/turns/user_turn_controller.js +335 -0
  551. package/dist/turns/user_turn_processor.d.ts +87 -0
  552. package/dist/turns/user_turn_processor.js +180 -0
  553. package/dist/turns/user_turn_strategies.d.ts +187 -0
  554. package/dist/turns/user_turn_strategies.js +222 -0
  555. package/dist/utils/async_tool_cancellation.d.ts +35 -0
  556. package/dist/utils/async_tool_cancellation.js +78 -0
  557. package/dist/utils/asyncio/index.d.ts +2 -0
  558. package/dist/utils/asyncio/index.js +7 -0
  559. package/dist/utils/asyncio/task_manager.d.ts +49 -0
  560. package/dist/utils/asyncio/task_manager.js +105 -0
  561. package/dist/utils/base_object.d.ts +76 -0
  562. package/dist/utils/base_object.js +154 -0
  563. package/dist/utils/context/aggregated_frame_sequencer.d.ts +491 -0
  564. package/dist/utils/context/aggregated_frame_sequencer.js +803 -0
  565. package/dist/utils/context/audio_context_manager.d.ts +131 -0
  566. package/dist/utils/context/audio_context_manager.js +233 -0
  567. package/dist/utils/context/index.d.ts +2 -0
  568. package/dist/utils/context/index.js +7 -0
  569. package/dist/utils/context/llm_context_summarization.d.ts +258 -0
  570. package/dist/utils/context/llm_context_summarization.js +511 -0
  571. package/dist/utils/context/text_segment_map.d.ts +611 -0
  572. package/dist/utils/context/text_segment_map.js +1132 -0
  573. package/dist/utils/context/word_completion_tracker.d.ts +273 -0
  574. package/dist/utils/context/word_completion_tracker.js +441 -0
  575. package/dist/utils/context/word_timestamp_tracker.d.ts +72 -0
  576. package/dist/utils/context/word_timestamp_tracker.js +98 -0
  577. package/dist/utils/deprecation.d.ts +28 -0
  578. package/dist/utils/deprecation.js +75 -0
  579. package/dist/utils/env.d.ts +38 -0
  580. package/dist/utils/env.js +62 -0
  581. package/dist/utils/errors.d.ts +75 -0
  582. package/dist/utils/errors.js +202 -0
  583. package/dist/utils/file_resolver.d.ts +126 -0
  584. package/dist/utils/file_resolver.js +314 -0
  585. package/dist/utils/file_storage.d.ts +99 -0
  586. package/dist/utils/file_storage.js +100 -0
  587. package/dist/utils/frame_queue.d.ts +36 -0
  588. package/dist/utils/frame_queue.js +66 -0
  589. package/dist/utils/http.d.ts +39 -0
  590. package/dist/utils/http.js +53 -0
  591. package/dist/utils/image.d.ts +15 -0
  592. package/dist/utils/image.js +30 -0
  593. package/dist/utils/index.d.ts +2 -0
  594. package/dist/utils/index.js +8 -0
  595. package/dist/utils/log_config.d.ts +34 -0
  596. package/dist/utils/log_config.js +76 -0
  597. package/dist/utils/logger.d.ts +40 -0
  598. package/dist/utils/logger.js +91 -0
  599. package/dist/utils/mixin.d.ts +14 -0
  600. package/dist/utils/mixin.js +63 -0
  601. package/dist/utils/network.d.ts +73 -0
  602. package/dist/utils/network.js +90 -0
  603. package/dist/utils/security/allowed_origins.d.ts +16 -0
  604. package/dist/utils/security/allowed_origins.js +34 -0
  605. package/dist/utils/security/index.d.ts +2 -0
  606. package/dist/utils/security/index.js +7 -0
  607. package/dist/utils/security/redaction.d.ts +27 -0
  608. package/dist/utils/security/redaction.js +123 -0
  609. package/dist/utils/security/ssrf.d.ts +79 -0
  610. package/dist/utils/security/ssrf.js +327 -0
  611. package/dist/utils/shared.d.ts +35 -0
  612. package/dist/utils/shared.js +136 -0
  613. package/dist/utils/startup.d.ts +17 -0
  614. package/dist/utils/startup.js +130 -0
  615. package/dist/utils/string.d.ts +116 -0
  616. package/dist/utils/string.js +460 -0
  617. package/dist/utils/sync/base_notifier.d.ts +25 -0
  618. package/dist/utils/sync/base_notifier.js +16 -0
  619. package/dist/utils/sync/event_notifier.d.ts +38 -0
  620. package/dist/utils/sync/event_notifier.js +51 -0
  621. package/dist/utils/sync/index.d.ts +2 -0
  622. package/dist/utils/sync/index.js +7 -0
  623. package/dist/utils/text/alnum_utils.d.ts +109 -0
  624. package/dist/utils/text/alnum_utils.js +262 -0
  625. package/dist/utils/text/base_text_aggregator.d.ts +146 -0
  626. package/dist/utils/text/base_text_aggregator.js +102 -0
  627. package/dist/utils/text/base_text_filter.d.ts +54 -0
  628. package/dist/utils/text/base_text_filter.js +50 -0
  629. package/dist/utils/text/index.d.ts +2 -0
  630. package/dist/utils/text/index.js +7 -0
  631. package/dist/utils/text/markdown_text_filter.d.ts +147 -0
  632. package/dist/utils/text/markdown_text_filter.js +522 -0
  633. package/dist/utils/text/markup_utils.d.ts +54 -0
  634. package/dist/utils/text/markup_utils.js +156 -0
  635. package/dist/utils/text/pattern_pair_aggregator.d.ts +251 -0
  636. package/dist/utils/text/pattern_pair_aggregator.js +478 -0
  637. package/dist/utils/text/phonemes.d.ts +60 -0
  638. package/dist/utils/text/phonemes.js +172 -0
  639. package/dist/utils/text/simple_text_aggregator.d.ts +135 -0
  640. package/dist/utils/text/simple_text_aggregator.js +254 -0
  641. package/dist/utils/text/skip_tags_aggregator.d.ts +85 -0
  642. package/dist/utils/text/skip_tags_aggregator.js +147 -0
  643. package/dist/utils/text/transforms/pronunciations.d.ts +65 -0
  644. package/dist/utils/text/transforms/pronunciations.js +111 -0
  645. package/dist/utils/text/word_timestamp_utils.d.ts +26 -0
  646. package/dist/utils/text/word_timestamp_utils.js +52 -0
  647. package/dist/utils/time.d.ts +13 -0
  648. package/dist/utils/time.js +31 -0
  649. package/dist/utils/tracing/index.d.ts +3 -0
  650. package/dist/utils/tracing/index.js +8 -0
  651. package/dist/utils/tracing/service_attributes.d.ts +198 -0
  652. package/dist/utils/tracing/service_attributes.js +434 -0
  653. package/dist/utils/tracing/service_decorators.d.ts +214 -0
  654. package/dist/utils/tracing/service_decorators.js +1662 -0
  655. package/dist/utils/tracing/setup.d.ts +95 -0
  656. package/dist/utils/tracing/setup.js +110 -0
  657. package/dist/utils/tracing/tracing_context.d.ts +55 -0
  658. package/dist/utils/tracing/tracing_context.js +97 -0
  659. package/dist/utils/tracing/turn_trace_observer.d.ts +90 -0
  660. package/dist/utils/tracing/turn_trace_observer.js +219 -0
  661. package/dist/utils/types.d.ts +80 -0
  662. package/dist/utils/types.js +108 -0
  663. package/dist/utils/utils.d.ts +5 -0
  664. package/dist/utils/utils.js +22 -0
  665. package/dist/utils/yaml.d.ts +64 -0
  666. package/dist/utils/yaml.js +41 -0
  667. package/dist/version.d.ts +3 -0
  668. package/dist/version.js +7 -0
  669. package/dist/workers/base_worker.d.ts +772 -0
  670. package/dist/workers/base_worker.js +1298 -0
  671. package/dist/workers/index.d.ts +2 -0
  672. package/dist/workers/index.js +8 -0
  673. package/dist/workers/llm/backend_llm_worker.d.ts +552 -0
  674. package/dist/workers/llm/backend_llm_worker.js +1055 -0
  675. package/dist/workers/llm/index.d.ts +6 -0
  676. package/dist/workers/llm/index.js +11 -0
  677. package/dist/workers/llm/llm_context_worker.d.ts +66 -0
  678. package/dist/workers/llm/llm_context_worker.js +72 -0
  679. package/dist/workers/llm/llm_worker.d.ts +180 -0
  680. package/dist/workers/llm/llm_worker.js +323 -0
  681. package/dist/workers/llm/tool_decorator.d.ts +68 -0
  682. package/dist/workers/llm/tool_decorator.js +60 -0
  683. package/dist/workers/runner.d.ts +268 -0
  684. package/dist/workers/runner.js +489 -0
  685. package/dist/workers/ui/index.d.ts +22 -0
  686. package/dist/workers/ui/index.js +27 -0
  687. package/dist/workers/ui/ui_event_decorator.d.ts +43 -0
  688. package/dist/workers/ui/ui_event_decorator.js +75 -0
  689. package/dist/workers/ui/ui_job_context.d.ts +12 -0
  690. package/dist/workers/ui/ui_job_context.js +17 -0
  691. package/dist/workers/ui/ui_prompts.d.ts +21 -0
  692. package/dist/workers/ui/ui_prompts.js +41 -0
  693. package/dist/workers/ui/ui_tools.d.ts +32 -0
  694. package/dist/workers/ui/ui_tools.js +112 -0
  695. package/dist/workers/ui/ui_worker.d.ts +571 -0
  696. package/dist/workers/ui/ui_worker.js +1156 -0
  697. package/package.json +46 -3
  698. package/README.md +0 -5
@@ -0,0 +1,107 @@
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/turns/user_stop/deferred_user_turn_stop_strategy.py
6
+ import { BaseUserTurnStopStrategy, } from "./base_user_turn_stop_strategy.js";
7
+ /**
8
+ * Wraps a stop strategy and suppresses its `on_user_turn_stopped` event.
9
+ *
10
+ * Event subscriptions added to the wrapper are forwarded directly to
11
+ * the inner strategy, except for `on_user_turn_stopped`, which is
12
+ * dropped. The inner strategy's frame-side and inference-triggered
13
+ * events therefore reach external listeners (the controller, etc.)
14
+ * unchanged; finalization is left to another strategy in the chain
15
+ * such as `LLMTurnCompletionUserTurnStopStrategy`.
16
+ *
17
+ * Use the `deferred` helper for ergonomic construction:
18
+ *
19
+ * @example
20
+ * stop: [
21
+ * deferred(new TurnAnalyzerUserTurnStopStrategy({ turnAnalyzer })),
22
+ * new LLMTurnCompletionUserTurnStopStrategy(),
23
+ * ]
24
+ */
25
+ export class DeferredUserTurnStopStrategy extends BaseUserTurnStopStrategy {
26
+ _inner;
27
+ /**
28
+ * @param inner The strategy whose finalization should be deferred.
29
+ * @param options Additional options forwarded to the base class.
30
+ */
31
+ constructor(inner, options = {}) {
32
+ super(options);
33
+ this._inner = inner;
34
+ }
35
+ /** Return the wrapped strategy. */
36
+ get inner() {
37
+ return this._inner;
38
+ }
39
+ /**
40
+ * Report what the inner strategy does with proposals.
41
+ *
42
+ * Frame processing is forwarded, so a proposal reaches the inner strategy
43
+ * and is resolved there. Deferring finalization changes when the turn ends,
44
+ * not who decides it.
45
+ */
46
+ get resolvesProposedTurnStopFrames() {
47
+ return this._inner.resolvesProposedTurnStopFrames;
48
+ }
49
+ /**
50
+ * Forward event subscriptions to the inner strategy.
51
+ *
52
+ * `on_user_turn_stopped` is silently dropped — that's the whole point of
53
+ * the wrapper. Every other event handler is attached to the inner strategy
54
+ * directly, so the inner's events reach the listener without any per-event
55
+ * proxy method on the wrapper.
56
+ */
57
+ addEventHandler(eventName, handler) {
58
+ if (eventName === "on_user_turn_stopped") {
59
+ return;
60
+ }
61
+ this._inner.addEventHandler(eventName, handler);
62
+ }
63
+ /** Set up the inner strategy. */
64
+ async setup(setup) {
65
+ await super.setup(setup);
66
+ await this._inner.setup(setup);
67
+ }
68
+ /** Clean up the inner strategy. */
69
+ async cleanup() {
70
+ await super.cleanup();
71
+ await this._inner.cleanup();
72
+ }
73
+ /** Forward the turn-started callback to the inner strategy. */
74
+ async handleUserTurnStarted() {
75
+ await this._inner.handleUserTurnStarted();
76
+ }
77
+ /** Forward the turn-stopped callback to the inner strategy. */
78
+ async handleUserTurnStopped() {
79
+ await this._inner.handleUserTurnStopped();
80
+ }
81
+ /** Forward frame processing to the inner strategy. */
82
+ async processFrame(frame) {
83
+ return await this._inner.processFrame(frame);
84
+ }
85
+ }
86
+ /**
87
+ * Defer this stop strategy's finalization to another strategy.
88
+ *
89
+ * Wraps `strategy` in a `DeferredUserTurnStopStrategy`: the inner strategy
90
+ * continues to drive inference-triggered events, but its
91
+ * `on_user_turn_stopped` event is suppressed. Use when another strategy in
92
+ * the chain (e.g. `LLMTurnCompletionUserTurnStopStrategy`) owns finalization.
93
+ *
94
+ * @example
95
+ * stop: [
96
+ * deferred(new TurnAnalyzerUserTurnStopStrategy({ turnAnalyzer })),
97
+ * new LLMTurnCompletionUserTurnStopStrategy(),
98
+ * ]
99
+ *
100
+ * @param strategy The stop strategy to defer.
101
+ * @returns A wrapper that exposes the inner strategy's behavior with
102
+ * finalization suppressed.
103
+ */
104
+ export function deferred(strategy) {
105
+ return new DeferredUserTurnStopStrategy(strategy);
106
+ }
107
+ //# sourceMappingURL=deferred_user_turn_stop_strategy.js.map
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Decides whether a speculative response is still the right answer.
3
+ *
4
+ * A speculative response is generated from an eager transcript, before the
5
+ * service commits one. This decides whether the committed transcript is close
6
+ * enough to the eager one for that response to stand.
7
+ */
8
+ export declare abstract class EagerMatchPolicy {
9
+ /**
10
+ * Report whether the committed transcript still matches the eager one.
11
+ *
12
+ * @param eager The transcript the speculative response was generated from.
13
+ * @param final The transcript the service committed to.
14
+ * @returns True to keep the speculative response, false to discard it and
15
+ * answer the committed transcript instead.
16
+ */
17
+ abstract matches(eager: string, final: string): boolean;
18
+ }
19
+ /** Keep the response only when the two transcripts are identical. */
20
+ export declare class ExactMatch extends EagerMatchPolicy {
21
+ /** Report whether the two transcripts are identical. */
22
+ matches(eager: string, final: string): boolean;
23
+ }
24
+ /**
25
+ * Keep the response when the transcripts differ only in formatting.
26
+ *
27
+ * Compares with case, punctuation and whitespace removed. Services commonly
28
+ * format the committed transcript — capitalizing it, punctuating it — while
29
+ * leaving the eager one raw, which `ExactMatch` counts as a difference.
30
+ */
31
+ export declare class NormalizedMatch extends EagerMatchPolicy {
32
+ /** Report whether the two transcripts match once formatting is removed. */
33
+ matches(eager: string, final: string): boolean;
34
+ protected static _normalize(text: string): string;
35
+ }
36
+ //# sourceMappingURL=eager_match_policy.d.ts.map
@@ -0,0 +1,50 @@
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/turns/user_stop/eager_match_policy.py
6
+ /** Policies deciding whether an eager transcript still matches the committed one. */
7
+ // Apostrophes are dropped rather than spaced out, so a service that writes
8
+ // "it's" matches one that writes "its".
9
+ const APOSTROPHES = /['’ʼ]/gu;
10
+ // Python's `[^\w\s]` with re.UNICODE.
11
+ const PUNCTUATION = /[^\p{L}\p{N}\p{M}_\s]/gu;
12
+ const WHITESPACE = /\s+/gu;
13
+ /**
14
+ * Decides whether a speculative response is still the right answer.
15
+ *
16
+ * A speculative response is generated from an eager transcript, before the
17
+ * service commits one. This decides whether the committed transcript is close
18
+ * enough to the eager one for that response to stand.
19
+ */
20
+ export class EagerMatchPolicy {
21
+ }
22
+ /** Keep the response only when the two transcripts are identical. */
23
+ export class ExactMatch extends EagerMatchPolicy {
24
+ /** Report whether the two transcripts are identical. */
25
+ matches(eager, final) {
26
+ return eager === final;
27
+ }
28
+ }
29
+ /**
30
+ * Keep the response when the transcripts differ only in formatting.
31
+ *
32
+ * Compares with case, punctuation and whitespace removed. Services commonly
33
+ * format the committed transcript — capitalizing it, punctuating it — while
34
+ * leaving the eager one raw, which `ExactMatch` counts as a difference.
35
+ */
36
+ export class NormalizedMatch extends EagerMatchPolicy {
37
+ /** Report whether the two transcripts match once formatting is removed. */
38
+ matches(eager, final) {
39
+ return NormalizedMatch._normalize(eager) === NormalizedMatch._normalize(final);
40
+ }
41
+ static _normalize(text) {
42
+ // NFKC + full case folding (Python's casefold); toLowerCase after an
43
+ // uppercase pass approximates folding for the common special cases (ß).
44
+ let normalized = text.normalize("NFKC").toUpperCase().toLowerCase();
45
+ normalized = normalized.replace(APOSTROPHES, "");
46
+ normalized = normalized.replace(PUNCTUATION, " ");
47
+ return normalized.replace(WHITESPACE, " ").trim();
48
+ }
49
+ }
50
+ //# sourceMappingURL=eager_match_policy.js.map
@@ -0,0 +1,84 @@
1
+ /** User turn stop strategy that answers an eager end of turn speculatively. */
2
+ import { type Task } from "@pipedog/asyncio";
3
+ import { EagerTranscriptionFrame, type Frame } from "../../frames/frames.ts";
4
+ import { type ProcessFrameResult, UserTurnSpeculation } from "../types.ts";
5
+ import type { TriggerUserTurnStoppedOptions } from "./base_user_turn_stop_strategy.ts";
6
+ import { type EagerMatchPolicy } from "./eager_match_policy.ts";
7
+ import { ExternalUserTurnStopStrategy, type ExternalUserTurnStopStrategyOptions } from "./external_user_turn_stop_strategy.ts";
8
+ export interface EagerUserTurnStopStrategyOptions extends ExternalUserTurnStopStrategyOptions {
9
+ /**
10
+ * Decides whether the committed transcript is close enough to the eager one
11
+ * to keep the speculative response. Defaults to `NormalizedMatch`, which
12
+ * ignores the capitalization and punctuation services commonly add when
13
+ * they commit a transcript. Pass `ExactMatch` to require the two to be
14
+ * identical.
15
+ */
16
+ matchPolicy?: EagerMatchPolicy | null;
17
+ /**
18
+ * Seconds a prediction may go unresolved before it is withdrawn. A service
19
+ * that stops sending turn signals mid-speculation would otherwise leave the
20
+ * response held and the bot silent for the rest of the session.
21
+ */
22
+ speculationTimeout?: number;
23
+ }
24
+ /**
25
+ * Answers an eager end of turn while the turn is still open.
26
+ *
27
+ * Some STT services predict the end of a turn before committing to it, and
28
+ * withdraw the prediction if the user turns out to be mid-sentence. This
29
+ * strategy starts generating a response on that prediction, so the gap between
30
+ * it and the committed end of turn is spent generating rather than waiting.
31
+ *
32
+ * The prediction can be wrong in three ways, and each withdraws the response:
33
+ *
34
+ * - the user resumes speaking, and the service withdraws the eager end of turn
35
+ * - the committed transcript differs from the eager one, per `matchPolicy`
36
+ * - the turn never commits within `speculationTimeout`
37
+ *
38
+ * Every one of those leaves as an `EagerEndOfTurnCancelFrame` from here, so a
39
+ * response is never dropped somewhere the rest of the pipeline cannot see.
40
+ *
41
+ * Nothing the speculation produces reaches the user or the context. The
42
+ * inference runs against a provisional context, and its response is held by
43
+ * the LLM service's `SpeculationGate` until the turn is confirmed. The turn
44
+ * ends normally: the user message written to the context is always the
45
+ * committed transcript, never the eager one.
46
+ *
47
+ * Install it with `EagerUserTurnStrategies` rather than directly — the
48
+ * service owns turn detection here, so it replaces the detector chain instead
49
+ * of running alongside it.
50
+ */
51
+ export declare class EagerUserTurnStopStrategy extends ExternalUserTurnStopStrategy {
52
+ protected _matchPolicy: EagerMatchPolicy;
53
+ protected _speculationTimeout: number;
54
+ protected _speculationTimeoutTask: Task<unknown> | null;
55
+ protected _speculation: UserTurnSpeculation | null;
56
+ constructor(options?: EagerUserTurnStopStrategyOptions);
57
+ /** The policy deciding whether a speculative response still applies. */
58
+ get matchPolicy(): EagerMatchPolicy;
59
+ /**
60
+ * Start a speculation on an eager end of turn, or withdraw one.
61
+ *
62
+ * @param frame The frame to be analyzed.
63
+ * @returns Always CONTINUE, so subsequent stop strategies are evaluated.
64
+ */
65
+ processFrame(frame: Frame): Promise<ProcessFrameResult>;
66
+ /** End the turn, keeping the speculative response only if it still applies. */
67
+ triggerUserTurnStopped(options?: TriggerUserTurnStoppedOptions): Promise<void>;
68
+ /** Clear per-turn state. Runs at both turn boundaries. */
69
+ protected _reset(): Promise<void>;
70
+ /** Answer an eager end of turn, leaving the turn open. */
71
+ protected _speculate(frame: EagerTranscriptionFrame): Promise<void>;
72
+ /** Withdraw a prediction the turn never resolved. */
73
+ protected _speculationTimeoutHandler(speculation: UserTurnSpeculation): Promise<void>;
74
+ /**
75
+ * Take the speculation in flight, stopping the clock on it.
76
+ *
77
+ * The single exit, so a resolved speculation can never be withdrawn again
78
+ * by a timer still running for it.
79
+ */
80
+ protected _takeSpeculation(): Promise<UserTurnSpeculation | null>;
81
+ /** Drop a speculation the service withdrew. */
82
+ protected _forget(): Promise<void>;
83
+ }
84
+ //# sourceMappingURL=eager_user_turn_stop_strategy.d.ts.map
@@ -0,0 +1,154 @@
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/turns/user_stop/eager_user_turn_stop_strategy.py
6
+ /** User turn stop strategy that answers an eager end of turn speculatively. */
7
+ import { sleep } from "@pipedog/asyncio";
8
+ import { EagerEndOfTurnCancelFrame, EagerTranscriptionFrame, } from "../../frames/frames.js";
9
+ import { logger } from "../../utils/logger.js";
10
+ import { UserTurnSpeculation } from "../types.js";
11
+ import { NormalizedMatch } from "./eager_match_policy.js";
12
+ import { ExternalUserTurnStopStrategy, } from "./external_user_turn_stop_strategy.js";
13
+ /**
14
+ * Answers an eager end of turn while the turn is still open.
15
+ *
16
+ * Some STT services predict the end of a turn before committing to it, and
17
+ * withdraw the prediction if the user turns out to be mid-sentence. This
18
+ * strategy starts generating a response on that prediction, so the gap between
19
+ * it and the committed end of turn is spent generating rather than waiting.
20
+ *
21
+ * The prediction can be wrong in three ways, and each withdraws the response:
22
+ *
23
+ * - the user resumes speaking, and the service withdraws the eager end of turn
24
+ * - the committed transcript differs from the eager one, per `matchPolicy`
25
+ * - the turn never commits within `speculationTimeout`
26
+ *
27
+ * Every one of those leaves as an `EagerEndOfTurnCancelFrame` from here, so a
28
+ * response is never dropped somewhere the rest of the pipeline cannot see.
29
+ *
30
+ * Nothing the speculation produces reaches the user or the context. The
31
+ * inference runs against a provisional context, and its response is held by
32
+ * the LLM service's `SpeculationGate` until the turn is confirmed. The turn
33
+ * ends normally: the user message written to the context is always the
34
+ * committed transcript, never the eager one.
35
+ *
36
+ * Install it with `EagerUserTurnStrategies` rather than directly — the
37
+ * service owns turn detection here, so it replaces the detector chain instead
38
+ * of running alongside it.
39
+ */
40
+ export class EagerUserTurnStopStrategy extends ExternalUserTurnStopStrategy {
41
+ _matchPolicy;
42
+ _speculationTimeout;
43
+ _speculationTimeoutTask = null;
44
+ _speculation = null;
45
+ constructor(options = {}) {
46
+ super(options);
47
+ this._matchPolicy = options.matchPolicy ?? new NormalizedMatch();
48
+ this._speculationTimeout = options.speculationTimeout ?? 5.0;
49
+ }
50
+ /** The policy deciding whether a speculative response still applies. */
51
+ get matchPolicy() {
52
+ return this._matchPolicy;
53
+ }
54
+ /**
55
+ * Start a speculation on an eager end of turn, or withdraw one.
56
+ *
57
+ * @param frame The frame to be analyzed.
58
+ * @returns Always CONTINUE, so subsequent stop strategies are evaluated.
59
+ */
60
+ async processFrame(frame) {
61
+ if (frame instanceof EagerTranscriptionFrame) {
62
+ await this._speculate(frame);
63
+ }
64
+ else if (frame instanceof EagerEndOfTurnCancelFrame) {
65
+ // The service withdrew its prediction, and its frame reaches every
66
+ // consumer on its own. Only our own state is left to clear.
67
+ await this._forget();
68
+ }
69
+ return await super.processFrame(frame);
70
+ }
71
+ /** End the turn, keeping the speculative response only if it still applies. */
72
+ async triggerUserTurnStopped(options = {}) {
73
+ const enableUserSpeakingFrames = options.enableUserSpeakingFrames ?? null;
74
+ const speculation = await this._takeSpeculation();
75
+ if (!speculation) {
76
+ await super.triggerUserTurnStopped({ enableUserSpeakingFrames });
77
+ return;
78
+ }
79
+ if (this._matchPolicy.matches(speculation.text, this._text)) {
80
+ logger.debug(`${this}: eager end of turn held, keeping the speculative response`);
81
+ // Inference already ran, on the eager transcript. Only finalize:
82
+ // the UserStoppedSpeakingFrame it emits is what releases the
83
+ // response, and the flag stops a second inference answering the
84
+ // same turn.
85
+ await this.triggerUserTurnFinalized({
86
+ enableUserSpeakingFrames,
87
+ confirmsSpeculation: true,
88
+ });
89
+ return;
90
+ }
91
+ logger.debug(`${this}: eager end of turn missed, discarding the speculative response ` +
92
+ `(eager: [${speculation.text}], committed: [${this._text}])`);
93
+ await this.triggerUserTurnSpeculationCancelled();
94
+ // Inference has to run again, on the committed transcript, so fire both
95
+ // events rather than just finalizing.
96
+ await super.triggerUserTurnStopped({ enableUserSpeakingFrames });
97
+ }
98
+ /** Clear per-turn state. Runs at both turn boundaries. */
99
+ async _reset() {
100
+ const speculation = await this._takeSpeculation();
101
+ await super._reset();
102
+ if (speculation) {
103
+ // The turn ended without resolving the speculation — the stop
104
+ // watchdog, an interruption, session end. Nothing else will withdraw
105
+ // it, so the response would be held until the gate times out.
106
+ logger.debug(`${this}: turn ended unresolved, discarding the speculative response`);
107
+ await this.triggerUserTurnSpeculationCancelled();
108
+ }
109
+ }
110
+ /** Answer an eager end of turn, leaving the turn open. */
111
+ async _speculate(frame) {
112
+ // Segments committed earlier in this turn are part of what the LLM will
113
+ // see, so they're part of what the committed transcript is compared to.
114
+ const speculation = new UserTurnSpeculation({ text: this._text + frame.text });
115
+ this._speculation = speculation;
116
+ this._speculationTimeoutTask = this.taskManager.createTask(() => this._speculationTimeoutHandler(speculation), `${this}::_speculation_timeout_handler`);
117
+ logger.debug(`${this}: speculating on eager end of turn: [${speculation.text}]`);
118
+ await this.triggerUserTurnInferenceTriggered({ speculation });
119
+ }
120
+ /** Withdraw a prediction the turn never resolved. */
121
+ async _speculationTimeoutHandler(speculation) {
122
+ await sleep(this._speculationTimeout);
123
+ // Cleared here rather than by a cancellation, since this timer fired.
124
+ this._speculationTimeoutTask = null;
125
+ if (this._speculation !== speculation) {
126
+ return;
127
+ }
128
+ logger.debug(`${this}: eager end of turn unresolved after ${this._speculationTimeout}s, ` +
129
+ "discarding the speculative response");
130
+ this._speculation = null;
131
+ await this.triggerUserTurnSpeculationCancelled();
132
+ }
133
+ /**
134
+ * Take the speculation in flight, stopping the clock on it.
135
+ *
136
+ * The single exit, so a resolved speculation can never be withdrawn again
137
+ * by a timer still running for it.
138
+ */
139
+ async _takeSpeculation() {
140
+ const speculation = this._speculation;
141
+ this._speculation = null;
142
+ if (this._speculationTimeoutTask) {
143
+ const task = this._speculationTimeoutTask;
144
+ this._speculationTimeoutTask = null;
145
+ await this.cancelTask(task);
146
+ }
147
+ return speculation;
148
+ }
149
+ /** Drop a speculation the service withdrew. */
150
+ async _forget() {
151
+ await this._takeSpeculation();
152
+ }
153
+ }
154
+ //# sourceMappingURL=eager_user_turn_stop_strategy.js.map
@@ -0,0 +1,45 @@
1
+ /** User turn stop strategy that finalizes on `UserTurnInferenceCompletedFrame`. */
2
+ import { type Frame } from "../../frames/frames.ts";
3
+ import { ProcessFrameResult } from "../types.ts";
4
+ import { BaseUserTurnStopStrategy } from "./base_user_turn_stop_strategy.ts";
5
+ /**
6
+ * Finalize the user turn whenever a `UserTurnInferenceCompletedFrame` arrives.
7
+ *
8
+ * Generic stop strategy for pipelines where some external component
9
+ * (LLM with completion markers, STT with built-in turn detection, a
10
+ * dedicated end-of-turn classifier, custom user code, etc.) judges
11
+ * when a turn is semantically complete and emits
12
+ * `UserTurnInferenceCompletedFrame`.
13
+ *
14
+ * Pair this with one or more `deferred(...)`-wrapped detector
15
+ * strategies that drive `on_user_turn_inference_triggered` but
16
+ * leave finalization to this strategy:
17
+ *
18
+ * @example
19
+ * stop: [
20
+ * deferred(new TurnAnalyzerUserTurnStopStrategy({ turnAnalyzer })),
21
+ * new ExternalUserTurnCompletionStopStrategy(),
22
+ * ]
23
+ *
24
+ * For LLM-completion-marker gating specifically, use the subclass
25
+ * `LLMTurnCompletionUserTurnStopStrategy` instead, which additionally pushes
26
+ * the `LLMUpdateSettingsFrame` that enables the marker protocol on the LLM.
27
+ *
28
+ * A completion resolves with some latency (e.g. the LLM `●` arrives
29
+ * after the inference finishes), so the user may have resumed speaking
30
+ * in the meantime. The controller drops a finalization that arrives
31
+ * while the user is speaking, so a stale completion does not end the
32
+ * turn (and talk over the user); the turn stays open for the next
33
+ * inference to re-evaluate. That check lives in the controller, which
34
+ * holds the authoritative user-speaking state.
35
+ *
36
+ * If the producer never emits `UserTurnInferenceCompletedFrame`, the
37
+ * controller's `userTurnStopTimeout` watchdog finalizes the turn after no
38
+ * activity. Tune that timeout if your producer can take longer than the
39
+ * default to respond.
40
+ */
41
+ export declare class ExternalUserTurnCompletionStopStrategy extends BaseUserTurnStopStrategy {
42
+ /** Fire `on_user_turn_stopped` whenever `UserTurnInferenceCompletedFrame` is seen. */
43
+ processFrame(frame: Frame): Promise<ProcessFrameResult>;
44
+ }
45
+ //# sourceMappingURL=external_user_turn_completion_stop_strategy.d.ts.map
@@ -0,0 +1,55 @@
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/turns/user_stop/external_user_turn_completion_stop_strategy.py
6
+ /** User turn stop strategy that finalizes on `UserTurnInferenceCompletedFrame`. */
7
+ import { UserTurnInferenceCompletedFrame } from "../../frames/frames.js";
8
+ import { ProcessFrameResult } from "../types.js";
9
+ import { BaseUserTurnStopStrategy } from "./base_user_turn_stop_strategy.js";
10
+ /**
11
+ * Finalize the user turn whenever a `UserTurnInferenceCompletedFrame` arrives.
12
+ *
13
+ * Generic stop strategy for pipelines where some external component
14
+ * (LLM with completion markers, STT with built-in turn detection, a
15
+ * dedicated end-of-turn classifier, custom user code, etc.) judges
16
+ * when a turn is semantically complete and emits
17
+ * `UserTurnInferenceCompletedFrame`.
18
+ *
19
+ * Pair this with one or more `deferred(...)`-wrapped detector
20
+ * strategies that drive `on_user_turn_inference_triggered` but
21
+ * leave finalization to this strategy:
22
+ *
23
+ * @example
24
+ * stop: [
25
+ * deferred(new TurnAnalyzerUserTurnStopStrategy({ turnAnalyzer })),
26
+ * new ExternalUserTurnCompletionStopStrategy(),
27
+ * ]
28
+ *
29
+ * For LLM-completion-marker gating specifically, use the subclass
30
+ * `LLMTurnCompletionUserTurnStopStrategy` instead, which additionally pushes
31
+ * the `LLMUpdateSettingsFrame` that enables the marker protocol on the LLM.
32
+ *
33
+ * A completion resolves with some latency (e.g. the LLM `●` arrives
34
+ * after the inference finishes), so the user may have resumed speaking
35
+ * in the meantime. The controller drops a finalization that arrives
36
+ * while the user is speaking, so a stale completion does not end the
37
+ * turn (and talk over the user); the turn stays open for the next
38
+ * inference to re-evaluate. That check lives in the controller, which
39
+ * holds the authoritative user-speaking state.
40
+ *
41
+ * If the producer never emits `UserTurnInferenceCompletedFrame`, the
42
+ * controller's `userTurnStopTimeout` watchdog finalizes the turn after no
43
+ * activity. Tune that timeout if your producer can take longer than the
44
+ * default to respond.
45
+ */
46
+ export class ExternalUserTurnCompletionStopStrategy extends BaseUserTurnStopStrategy {
47
+ /** Fire `on_user_turn_stopped` whenever `UserTurnInferenceCompletedFrame` is seen. */
48
+ async processFrame(frame) {
49
+ if (frame instanceof UserTurnInferenceCompletedFrame) {
50
+ await this.triggerUserTurnFinalized();
51
+ }
52
+ return ProcessFrameResult.CONTINUE;
53
+ }
54
+ }
55
+ //# sourceMappingURL=external_user_turn_completion_stop_strategy.js.map
@@ -0,0 +1,115 @@
1
+ /** User turn stop strategy driven by another component in the pipeline. */
2
+ import { Event, type Task } from "@pipedog/asyncio";
3
+ import { type Frame, InterimTranscriptionFrame, TranscriptionFrame } from "../../frames/frames.ts";
4
+ import type { FrameProcessorSetup } from "../../processors/frame_processor.ts";
5
+ import { ProcessFrameResult } from "../types.ts";
6
+ import { BaseUserTurnStopStrategy, type BaseUserTurnStopStrategyOptions } from "./base_user_turn_stop_strategy.ts";
7
+ export interface ExternalUserTurnStopStrategyOptions extends BaseUserTurnStopStrategyOptions {
8
+ /**
9
+ * A short delay (seconds) used internally to handle consecutive or slightly
10
+ * delayed transcriptions.
11
+ */
12
+ timeout?: number;
13
+ /**
14
+ * When true (default), turn-stop signaling waits for transcript text to
15
+ * arrive after the external stop signal. When false, the strategy signals
16
+ * turn-stop as soon as that signal arrives — independent of transcripts.
17
+ * Set this to false when local turn detection is the intended driver of the
18
+ * conversation (e.g. with a realtime LLM service consuming audio directly),
19
+ * so transcripts are off the latency critical path.
20
+ * `LLMContextAggregatorPair` flips this for you when
21
+ * `realtimeServiceMode: true`.
22
+ */
23
+ waitForTranscript?: boolean;
24
+ }
25
+ /**
26
+ * User turn stop strategy driven by another component in the pipeline.
27
+ *
28
+ * The end-of-turn counterpart to `ExternalUserTurnStartStrategy`, taking the
29
+ * same two signals:
30
+ *
31
+ * - `ProposedUserStoppedSpeakingFrame` — a service proposing that the turn has
32
+ * ended. This strategy decides, and emits the `UserStoppedSpeakingFrame`
33
+ * itself. It may also hold the turn open past the proposal, which is what
34
+ * `waitForTranscript` does.
35
+ *
36
+ * - `UserStoppedSpeakingFrame` — the turn end was already decided and
37
+ * announced elsewhere, typically by a shared `UserTurnProcessor`. This
38
+ * strategy adopts that decision and emits nothing.
39
+ *
40
+ * To shift the timing further, subclass this strategy and override
41
+ * `BaseUserTurnStopStrategy.triggerUserTurnStopped`, which both paths reach
42
+ * once they decide the turn is over. Its `enableUserSpeakingFrames` option
43
+ * already carries whichever path got there, so pass it through when the
44
+ * override eventually finalizes.
45
+ */
46
+ export declare class ExternalUserTurnStopStrategy extends BaseUserTurnStopStrategy {
47
+ protected _timeout: number;
48
+ protected _waitForTranscript: boolean;
49
+ protected _text: string;
50
+ protected _userSpeaking: boolean;
51
+ protected _seenInterimResults: boolean;
52
+ protected _turnAnnouncedElsewhere: boolean;
53
+ protected _turnOpen: boolean;
54
+ protected _event: Event;
55
+ protected _task: Task<unknown> | null;
56
+ constructor(options?: ExternalUserTurnStopStrategyOptions);
57
+ /** Whether this strategy resolves proposals into turn stops. */
58
+ get resolvesProposedTurnStopFrames(): boolean;
59
+ /** Whether turn-stop signaling waits for transcript text. */
60
+ get waitForTranscript(): boolean;
61
+ set waitForTranscript(value: boolean);
62
+ /** Ready the strategy to detect the end of the turn now starting. */
63
+ handleUserTurnStarted(): Promise<void>;
64
+ /** Clear per-turn state once the turn has ended. */
65
+ handleUserTurnStopped(): Promise<void>;
66
+ /** Clear per-turn state. Runs at both turn boundaries. */
67
+ protected _reset(): Promise<void>;
68
+ /**
69
+ * Set up the strategy.
70
+ *
71
+ * @param setup Configuration object containing setup parameters.
72
+ */
73
+ setup(setup: FrameProcessorSetup): Promise<void>;
74
+ /** Cleanup the strategy. */
75
+ cleanup(): Promise<void>;
76
+ /**
77
+ * Process an incoming frame to update strategy state.
78
+ *
79
+ * Updates internal transcription text and speaking state. The user end
80
+ * turn will be triggered when appropriate based on the collected frames.
81
+ *
82
+ * @param frame The frame to be analyzed.
83
+ * @returns Always returns CONTINUE so subsequent stop strategies are evaluated.
84
+ */
85
+ processFrame(frame: Frame): Promise<ProcessFrameResult>;
86
+ /** Handle the external signal that the user is speaking. */
87
+ protected _handleUserStartedSpeaking(options: {
88
+ announcedElsewhere: boolean;
89
+ }): Promise<void>;
90
+ /** Handle the external signal that the user has stopped speaking. */
91
+ protected _handleUserStoppedSpeaking(options: {
92
+ announcedElsewhere: boolean;
93
+ }): Promise<void>;
94
+ protected _handleInterimTranscription(_frame: InterimTranscriptionFrame): Promise<void>;
95
+ /** Handle user transcription. */
96
+ protected _handleTranscription(frame: TranscriptionFrame): Promise<void>;
97
+ /**
98
+ * Asynchronously monitor transcriptions and trigger user end turn when ready.
99
+ *
100
+ * If transcription text exists and the user is not currently speaking,
101
+ * triggers the user end turn. Handles multiple or delayed transcriptions
102
+ * gracefully.
103
+ */
104
+ protected _taskHandler(): Promise<void>;
105
+ /**
106
+ * End the turn, emitting the turn frame unless it was already announced.
107
+ *
108
+ * Reads the flag rather than taking it as an argument: finalization can
109
+ * land here from the transcript timeout above, long after the signal that
110
+ * set it.
111
+ */
112
+ protected _triggerUserTurnStopped(): Promise<void>;
113
+ protected _maybeTriggerUserTurnStopped(): Promise<void>;
114
+ }
115
+ //# sourceMappingURL=external_user_turn_stop_strategy.d.ts.map