@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,238 @@
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_start/wake_phrase_user_turn_start_strategy.py
6
+ /** User turn start strategy that gates interaction behind wake phrase detection. */
7
+ import { Event, TimeoutError, waitFor } from "@pipedog/asyncio";
8
+ import { BotSpeakingFrame, TranscriptionFrame, UserSpeakingFrame, VADUserStartedSpeakingFrame, } from "../../frames/frames.js";
9
+ import { logger } from "../../utils/logger.js";
10
+ import { ProcessFrameResult } from "../types.js";
11
+ import { BaseUserTurnStartStrategy, } from "./base_user_turn_start_strategy.js";
12
+ /** Internal state for wake phrase detection. */
13
+ export const _WakeState = {
14
+ IDLE: "idle",
15
+ AWAKE: "awake",
16
+ };
17
+ // Python's `\w` is Unicode-aware; JS's is ASCII-only even with the `u` flag.
18
+ const WORD_CHAR = "[\\p{L}\\p{N}\\p{M}_]";
19
+ const NON_WORD_NON_SPACE = /[^\p{L}\p{N}\p{M}_\s]/gu;
20
+ function escapeRegExp(text) {
21
+ return text.replace(/[.*+?^${}()|[\]\\/-]/g, "\\$&");
22
+ }
23
+ /**
24
+ * User turn start strategy that requires a wake phrase before interaction.
25
+ *
26
+ * Blocks subsequent strategies until a wake phrase is detected in a final
27
+ * transcription. After detection, allows interaction for a configurable
28
+ * timeout period before requiring the wake phrase again. Use
29
+ * `singleActivation: true` to require the wake phrase before every turn.
30
+ *
31
+ * This strategy should be placed first in the start strategies list.
32
+ *
33
+ * Event handlers available:
34
+ *
35
+ * - on_wake_phrase_detected: Called when a wake phrase is matched.
36
+ * - on_wake_phrase_timeout: Called when the inactivity timeout expires
37
+ * (timeout mode only).
38
+ *
39
+ * @example
40
+ * // Timeout mode (default): wake phrase unlocks interaction for 10s
41
+ * const strategy = new WakePhraseUserTurnStartStrategy({
42
+ * phrases: ["hey pipecat", "ok pipecat"],
43
+ * timeout: 10.0,
44
+ * });
45
+ *
46
+ * // Single activation: wake phrase required before every turn
47
+ * const single = new WakePhraseUserTurnStartStrategy({
48
+ * phrases: ["hey pipecat"],
49
+ * singleActivation: true,
50
+ * });
51
+ *
52
+ * strategy.eventHandler("on_wake_phrase_detected", async (strategy, phrase) => { ... });
53
+ * strategy.eventHandler("on_wake_phrase_timeout", async (strategy) => { ... });
54
+ *
55
+ * `timeout`: In timeout mode, the timer resets on activity (user, bot speech).
56
+ * In single activation mode, acts as a keepalive window — the strategy stays
57
+ * AWAKE for this duration after wake phrase detection, allowing the current
58
+ * turn to complete before returning to IDLE.
59
+ */
60
+ export class WakePhraseUserTurnStartStrategy extends BaseUserTurnStartStrategy {
61
+ _phrases;
62
+ _timeout;
63
+ _singleActivation;
64
+ _patterns = [];
65
+ _state = _WakeState.IDLE;
66
+ _accumulatedText = "";
67
+ _timeoutEvent = new Event();
68
+ _timeoutTask = null;
69
+ constructor(options) {
70
+ super(options);
71
+ this._phrases = options.phrases;
72
+ this._timeout = options.timeout ?? 10.0;
73
+ this._singleActivation = options.singleActivation ?? false;
74
+ for (const phrase of this._phrases) {
75
+ const words = phrase.split(/\s+/).filter((word) => word.length > 0);
76
+ const pattern = new RegExp(`(?<!${WORD_CHAR})${words.map(escapeRegExp).join("\\s*")}(?!${WORD_CHAR})`, "iu");
77
+ this._patterns.push(pattern);
78
+ }
79
+ this._registerEventHandler("on_wake_phrase_detected");
80
+ this._registerEventHandler("on_wake_phrase_timeout");
81
+ }
82
+ /** Returns the current wake state. */
83
+ get state() {
84
+ return this._state;
85
+ }
86
+ /**
87
+ * Set up the strategy.
88
+ *
89
+ * @param setup Configuration object containing setup parameters.
90
+ */
91
+ async setup(setup) {
92
+ await super.setup(setup);
93
+ if (!this._timeoutTask) {
94
+ this._timeoutTask = this.taskManager.createTask(() => this._timeoutTaskHandler(), `${this}::_timeout_task_handler`);
95
+ }
96
+ }
97
+ /** Cleanup the strategy. */
98
+ async cleanup() {
99
+ await super.cleanup();
100
+ if (this._timeoutTask) {
101
+ await this.taskManager.cancelTask(this._timeoutTask);
102
+ this._timeoutTask = null;
103
+ }
104
+ }
105
+ /**
106
+ * Ready the strategy for a new user turn.
107
+ *
108
+ * In timeout mode, preserves state and refreshes the timeout — a turn
109
+ * starting is the activity that keeps the strategy awake. In single
110
+ * activation mode, does nothing: the keepalive timeout (started when the
111
+ * wake phrase was detected) handles the transition back to IDLE.
112
+ */
113
+ async handleUserTurnStarted() {
114
+ if (this._state === _WakeState.AWAKE) {
115
+ if (!this._singleActivation) {
116
+ this._refreshTimeout();
117
+ }
118
+ }
119
+ }
120
+ /**
121
+ * Process an incoming frame for wake phrase detection or passthrough.
122
+ *
123
+ * @param frame The frame to be processed.
124
+ * @returns STOP when the wake phrase is detected or when in IDLE state
125
+ * (blocks subsequent strategies), CONTINUE when in AWAKE state (allows
126
+ * subsequent strategies to proceed).
127
+ */
128
+ async processFrame(frame) {
129
+ await super.processFrame(frame);
130
+ if (this._state === _WakeState.IDLE) {
131
+ return await this._processIdle(frame);
132
+ }
133
+ return await this._processAwake(frame);
134
+ }
135
+ /**
136
+ * Process a frame while in IDLE state.
137
+ *
138
+ * Only final `TranscriptionFrame` instances are checked for wake phrase
139
+ * matches. When a match is found, a user turn start is triggered.
140
+ * Transcription frames that don't match have their text cleared so that
141
+ * pre-wake-phrase speech is not added to the LLM context. All frames
142
+ * return STOP to block subsequent strategies.
143
+ */
144
+ async _processIdle(frame) {
145
+ if (frame instanceof TranscriptionFrame) {
146
+ if (this._checkWakePhrase(frame.text)) {
147
+ await this.triggerUserTurnStarted();
148
+ return ProcessFrameResult.STOP;
149
+ }
150
+ await this.triggerResetAggregation();
151
+ }
152
+ return ProcessFrameResult.STOP;
153
+ }
154
+ /**
155
+ * Process a frame while in AWAKE state.
156
+ *
157
+ * Refreshes the timeout on activity frames (timeout mode only). Returns
158
+ * CONTINUE so subsequent strategies can process the frame.
159
+ */
160
+ async _processAwake(frame) {
161
+ if (!this._singleActivation) {
162
+ if (frame instanceof UserSpeakingFrame || frame instanceof BotSpeakingFrame) {
163
+ this._refreshTimeout();
164
+ }
165
+ else if (frame instanceof TranscriptionFrame) {
166
+ this._refreshTimeout();
167
+ }
168
+ else if (frame instanceof VADUserStartedSpeakingFrame) {
169
+ this._refreshTimeout();
170
+ }
171
+ }
172
+ return ProcessFrameResult.CONTINUE;
173
+ }
174
+ /** Strip punctuation from text, keeping only letters, digits, and whitespace. */
175
+ static _stripPunctuation(text) {
176
+ return text.replace(NON_WORD_NON_SPACE, "");
177
+ }
178
+ /**
179
+ * Check if the accumulated text contains a wake phrase.
180
+ *
181
+ * Punctuation is stripped before matching so that STT output like
182
+ * "Hey, Pipecat!" still matches the phrase "hey pipecat".
183
+ *
184
+ * @param text New transcription text to append and check.
185
+ * @returns True if a wake phrase was found, false otherwise.
186
+ */
187
+ _checkWakePhrase(text) {
188
+ this._accumulatedText += ` ${WakePhraseUserTurnStartStrategy._stripPunctuation(text)}`;
189
+ // Cap accumulated text to prevent unbounded growth.
190
+ if (this._accumulatedText.length > 250) {
191
+ this._accumulatedText = this._accumulatedText.slice(-250);
192
+ }
193
+ for (const [i, pattern] of this._patterns.entries()) {
194
+ if (pattern.test(this._accumulatedText)) {
195
+ const phrase = this._phrases[i];
196
+ logger.debug(`${this} wake phrase detected: '${phrase}'`);
197
+ this._transitionToAwake(phrase);
198
+ return true;
199
+ }
200
+ }
201
+ return false;
202
+ }
203
+ /** Transition from IDLE to AWAKE state. */
204
+ _transitionToAwake(phrase) {
205
+ this._state = _WakeState.AWAKE;
206
+ this._accumulatedText = "";
207
+ this._refreshTimeout();
208
+ this.taskManager.createTask(() => this._callEventHandler("on_wake_phrase_detected", phrase), `${this}::on_wake_phrase_detected`);
209
+ }
210
+ /** Transition from AWAKE to IDLE state. */
211
+ _transitionToIdle() {
212
+ logger.debug(`${this} wake phrase timeout, returning to IDLE`);
213
+ this._state = _WakeState.IDLE;
214
+ this._accumulatedText = "";
215
+ this.taskManager.createTask(() => this._callEventHandler("on_wake_phrase_timeout"), `${this}::on_wake_phrase_timeout`);
216
+ }
217
+ /** Refresh the inactivity timeout. */
218
+ _refreshTimeout() {
219
+ this._timeoutEvent.set();
220
+ }
221
+ /** Background task that monitors inactivity timeout. */
222
+ async _timeoutTaskHandler() {
223
+ while (true) {
224
+ try {
225
+ await waitFor(() => this._timeoutEvent.wait(), this._timeout);
226
+ this._timeoutEvent.clear();
227
+ }
228
+ catch (e) {
229
+ if (!(e instanceof TimeoutError))
230
+ throw e;
231
+ if (this._state === _WakeState.AWAKE) {
232
+ this._transitionToIdle();
233
+ }
234
+ }
235
+ }
236
+ }
237
+ }
238
+ //# sourceMappingURL=wake_phrase_user_turn_start_strategy.js.map
@@ -0,0 +1,174 @@
1
+ /** Base user turn stop strategy for determining when the user stopped speaking. */
2
+ import type { Frame } from "../../frames/frames.ts";
3
+ import { FrameDirection, type FrameProcessorSetup } from "../../processors/frame_processor.ts";
4
+ import { BaseObject, type BaseObjectOptions } from "../../utils/base_object.ts";
5
+ import type { ProcessFrameResult, UserTurnSpeculation } from "../types.ts";
6
+ export interface UserTurnStoppedParamsOptions {
7
+ /**
8
+ * Whether to emit `UserStoppedSpeakingFrame` for this turn. False when the
9
+ * turn end was already announced elsewhere — by a shared
10
+ * `UserTurnProcessor`, or by a service that emits turn frames rather than
11
+ * proposing them.
12
+ */
13
+ enableUserSpeakingFrames: boolean;
14
+ /**
15
+ * Whether this turn end confirms a speculative response that was already
16
+ * generated. The aggregator then writes the turn to the context without
17
+ * running inference again, since the answer is already on its way.
18
+ */
19
+ confirmsSpeculation?: boolean;
20
+ }
21
+ /**
22
+ * Parameters emitted when a user turn stops.
23
+ *
24
+ * These parameters are passed to the `on_user_turn_stopped` event and provide
25
+ * contextual information about how the end of user turn should be handled by
26
+ * the user aggregator.
27
+ *
28
+ * - `enableUserSpeakingFrames`: Whether to emit `UserStoppedSpeakingFrame`
29
+ * for this turn. False when the turn end was already announced elsewhere.
30
+ * - `confirmsSpeculation`: Whether this turn end confirms a speculative
31
+ * response that was already generated.
32
+ */
33
+ export declare class UserTurnStoppedParams {
34
+ enableUserSpeakingFrames: boolean;
35
+ confirmsSpeculation: boolean;
36
+ constructor(options: UserTurnStoppedParamsOptions);
37
+ }
38
+ export interface BaseUserTurnStopStrategyOptions extends BaseObjectOptions {
39
+ }
40
+ export interface TriggerUserTurnStoppedOptions {
41
+ /**
42
+ * Whether to emit `UserStoppedSpeakingFrame` for this turn. Pass false when
43
+ * something else in the pipeline has already emitted it.
44
+ */
45
+ enableUserSpeakingFrames?: boolean | null;
46
+ }
47
+ export interface TriggerUserTurnInferenceTriggeredOptions {
48
+ /**
49
+ * Set to run this inference speculatively, against a provisional context
50
+ * carrying the turn text it names, for a turn that hasn't ended yet. The
51
+ * response it produces is held back until the turn is confirmed. Leave null
52
+ * to run the inference against the conversation as it stands.
53
+ */
54
+ speculation?: UserTurnSpeculation | null;
55
+ }
56
+ export interface TriggerUserTurnFinalizedOptions extends TriggerUserTurnStoppedOptions {
57
+ /**
58
+ * Whether a response generated ahead of this turn ending already answers
59
+ * it, so inference should not run again.
60
+ */
61
+ confirmsSpeculation?: boolean;
62
+ }
63
+ /**
64
+ * Base class for strategies that determine when the user stops speaking.
65
+ *
66
+ * Subclasses should implement logic to detect when the user stops
67
+ * speaking. This could be based on analyzing incoming frames (such as
68
+ * transcriptions), conversation state, or other heuristics.
69
+ *
70
+ * Events triggered by strategies:
71
+ *
72
+ * - `on_push_frame`: Indicates the strategy wants to push a frame.
73
+ * - `on_user_turn_inference_triggered`: Signals that enough evidence
74
+ * exists to start LLM inference for the current user turn, carrying a
75
+ * `UserTurnSpeculation` when the turn it answers hasn't ended yet. In
76
+ * most cases this fires together with `on_user_turn_stopped`. Strategies
77
+ * that gate finalization on the LLM (e.g.
78
+ * `LLMTurnCompletionUserTurnStopStrategy`) fire only this event
79
+ * upstream and a separate strategy fires `on_user_turn_stopped` once
80
+ * the LLM confirms the turn is complete.
81
+ * - `on_user_turn_stopped`: Signals that the user turn is semantically
82
+ * final. Observers, transcript appenders, and UI indicators should
83
+ * bind this event.
84
+ *
85
+ * Porting note: the deprecated `enable_user_speaking_frames` constructor
86
+ * argument and the deprecated `reset()` hook are not ported.
87
+ */
88
+ export declare class BaseUserTurnStopStrategy extends BaseObject {
89
+ protected _enableUserSpeakingFrames: boolean;
90
+ constructor(options?: BaseUserTurnStopStrategyOptions);
91
+ /**
92
+ * Whether this strategy resolves proposals into turn stops.
93
+ *
94
+ * A `ProposedUserStoppedSpeakingFrame` is a request for a decision, so a
95
+ * strategy that acts on one consumes it: the frame stops travelling, and no
96
+ * resolver further along decides the same turn a second time. Override to
97
+ * true in a strategy that handles that frame — including one that holds the
98
+ * proposal for a while before deciding.
99
+ */
100
+ get resolvesProposedTurnStopFrames(): boolean;
101
+ /**
102
+ * Set up the strategy.
103
+ *
104
+ * @param setup Configuration object containing setup parameters.
105
+ */
106
+ setup(setup: FrameProcessorSetup): Promise<void>;
107
+ /** Cleanup the strategy. */
108
+ cleanup(): Promise<void>;
109
+ /**
110
+ * Notify the strategy that a user turn has started.
111
+ *
112
+ * The controller calls this on every stop strategy when a turn begins.
113
+ * Override to run, for example, logic to arm the strategy to detect the
114
+ * end of the turn now in progress.
115
+ */
116
+ handleUserTurnStarted(): Promise<void>;
117
+ /**
118
+ * Notify the strategy that the user turn has stopped.
119
+ *
120
+ * The controller calls this on every stop strategy when a turn ends,
121
+ * regardless of which strategy (or the stop watchdog timeout) ended it.
122
+ * Override to run stop-specific logic — e.g. dropping a turn analyzer's
123
+ * buffered speech that must not survive an externally-ended turn.
124
+ */
125
+ handleUserTurnStopped(): Promise<void>;
126
+ /**
127
+ * Process an incoming frame to decide whether the user stopped speaking.
128
+ *
129
+ * Subclasses should override this to implement logic that decides whether
130
+ * the user has stopped speaking.
131
+ *
132
+ * @param frame The frame to be analyzed.
133
+ * @returns A ProcessFrameResult indicating the outcome, or null (treated as
134
+ * CONTINUE for backward compatibility).
135
+ */
136
+ processFrame(_frame: Frame): Promise<ProcessFrameResult | null>;
137
+ /**
138
+ * Emit on_push_frame to push a frame using the user aggregator.
139
+ *
140
+ * @param frame The frame to be pushed.
141
+ * @param direction What direction the frame should be pushed to.
142
+ */
143
+ pushFrame(frame: Frame, direction?: FrameDirection): Promise<void>;
144
+ /**
145
+ * Emit on_broadcast_frame to broadcast a frame using the user aggregator.
146
+ *
147
+ * @param frameCls The class of the frame to be broadcasted.
148
+ * @param options Options to be passed to the frame's constructor.
149
+ */
150
+ broadcastFrame<O>(frameCls: new (options: O) => Frame, options?: O): Promise<void>;
151
+ /**
152
+ * Withdraw the speculation this strategy has in flight.
153
+ *
154
+ * Emitted rather than pushed so the host broadcasts it the same way it
155
+ * broadcasts the turn end. A withdrawal that took the queued path would
156
+ * reach a downstream gate *after* the turn end that follows it, and the
157
+ * gate would release the response the withdrawal was meant to discard.
158
+ */
159
+ triggerUserTurnSpeculationCancelled(): Promise<void>;
160
+ /**
161
+ * Fire both `on_user_turn_inference_triggered` and `on_user_turn_stopped`.
162
+ *
163
+ * Most strategies call this when they decide a turn has ended. To
164
+ * defer finalization to another strategy (so this strategy fires
165
+ * only the inference-triggered event), wrap this strategy with
166
+ * `deferred()` instead of changing the trigger call.
167
+ */
168
+ triggerUserTurnStopped(options?: TriggerUserTurnStoppedOptions): Promise<void>;
169
+ /** Trigger only the `on_user_turn_inference_triggered` event. */
170
+ triggerUserTurnInferenceTriggered(options?: TriggerUserTurnInferenceTriggeredOptions): Promise<void>;
171
+ /** Trigger only the `on_user_turn_stopped` event. */
172
+ triggerUserTurnFinalized(options?: TriggerUserTurnFinalizedOptions): Promise<void>;
173
+ }
174
+ //# sourceMappingURL=base_user_turn_stop_strategy.d.ts.map
@@ -0,0 +1,170 @@
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/base_user_turn_stop_strategy.py
6
+ import { FrameDirection } from "../../processors/frame_processor.js";
7
+ import { BaseObject } from "../../utils/base_object.js";
8
+ /**
9
+ * Parameters emitted when a user turn stops.
10
+ *
11
+ * These parameters are passed to the `on_user_turn_stopped` event and provide
12
+ * contextual information about how the end of user turn should be handled by
13
+ * the user aggregator.
14
+ *
15
+ * - `enableUserSpeakingFrames`: Whether to emit `UserStoppedSpeakingFrame`
16
+ * for this turn. False when the turn end was already announced elsewhere.
17
+ * - `confirmsSpeculation`: Whether this turn end confirms a speculative
18
+ * response that was already generated.
19
+ */
20
+ export class UserTurnStoppedParams {
21
+ enableUserSpeakingFrames;
22
+ confirmsSpeculation;
23
+ constructor(options) {
24
+ this.enableUserSpeakingFrames = options.enableUserSpeakingFrames;
25
+ this.confirmsSpeculation = options.confirmsSpeculation ?? false;
26
+ }
27
+ }
28
+ /**
29
+ * Base class for strategies that determine when the user stops speaking.
30
+ *
31
+ * Subclasses should implement logic to detect when the user stops
32
+ * speaking. This could be based on analyzing incoming frames (such as
33
+ * transcriptions), conversation state, or other heuristics.
34
+ *
35
+ * Events triggered by strategies:
36
+ *
37
+ * - `on_push_frame`: Indicates the strategy wants to push a frame.
38
+ * - `on_user_turn_inference_triggered`: Signals that enough evidence
39
+ * exists to start LLM inference for the current user turn, carrying a
40
+ * `UserTurnSpeculation` when the turn it answers hasn't ended yet. In
41
+ * most cases this fires together with `on_user_turn_stopped`. Strategies
42
+ * that gate finalization on the LLM (e.g.
43
+ * `LLMTurnCompletionUserTurnStopStrategy`) fire only this event
44
+ * upstream and a separate strategy fires `on_user_turn_stopped` once
45
+ * the LLM confirms the turn is complete.
46
+ * - `on_user_turn_stopped`: Signals that the user turn is semantically
47
+ * final. Observers, transcript appenders, and UI indicators should
48
+ * bind this event.
49
+ *
50
+ * Porting note: the deprecated `enable_user_speaking_frames` constructor
51
+ * argument and the deprecated `reset()` hook are not ported.
52
+ */
53
+ export class BaseUserTurnStopStrategy extends BaseObject {
54
+ _enableUserSpeakingFrames = true;
55
+ constructor(options = {}) {
56
+ super(options);
57
+ this._registerEventHandler("on_push_frame", true);
58
+ this._registerEventHandler("on_broadcast_frame", true);
59
+ this._registerEventHandler("on_user_turn_inference_triggered", true);
60
+ this._registerEventHandler("on_user_turn_speculation_cancelled", true);
61
+ this._registerEventHandler("on_user_turn_stopped", true);
62
+ }
63
+ /**
64
+ * Whether this strategy resolves proposals into turn stops.
65
+ *
66
+ * A `ProposedUserStoppedSpeakingFrame` is a request for a decision, so a
67
+ * strategy that acts on one consumes it: the frame stops travelling, and no
68
+ * resolver further along decides the same turn a second time. Override to
69
+ * true in a strategy that handles that frame — including one that holds the
70
+ * proposal for a while before deciding.
71
+ */
72
+ get resolvesProposedTurnStopFrames() {
73
+ return false;
74
+ }
75
+ /**
76
+ * Set up the strategy.
77
+ *
78
+ * @param setup Configuration object containing setup parameters.
79
+ */
80
+ async setup(setup) {
81
+ await super.setup(setup.taskManager);
82
+ }
83
+ /** Cleanup the strategy. */
84
+ async cleanup() { }
85
+ /**
86
+ * Notify the strategy that a user turn has started.
87
+ *
88
+ * The controller calls this on every stop strategy when a turn begins.
89
+ * Override to run, for example, logic to arm the strategy to detect the
90
+ * end of the turn now in progress.
91
+ */
92
+ async handleUserTurnStarted() { }
93
+ /**
94
+ * Notify the strategy that the user turn has stopped.
95
+ *
96
+ * The controller calls this on every stop strategy when a turn ends,
97
+ * regardless of which strategy (or the stop watchdog timeout) ended it.
98
+ * Override to run stop-specific logic — e.g. dropping a turn analyzer's
99
+ * buffered speech that must not survive an externally-ended turn.
100
+ */
101
+ async handleUserTurnStopped() { }
102
+ /**
103
+ * Process an incoming frame to decide whether the user stopped speaking.
104
+ *
105
+ * Subclasses should override this to implement logic that decides whether
106
+ * the user has stopped speaking.
107
+ *
108
+ * @param frame The frame to be analyzed.
109
+ * @returns A ProcessFrameResult indicating the outcome, or null (treated as
110
+ * CONTINUE for backward compatibility).
111
+ */
112
+ async processFrame(_frame) {
113
+ return null;
114
+ }
115
+ /**
116
+ * Emit on_push_frame to push a frame using the user aggregator.
117
+ *
118
+ * @param frame The frame to be pushed.
119
+ * @param direction What direction the frame should be pushed to.
120
+ */
121
+ async pushFrame(frame, direction = FrameDirection.DOWNSTREAM) {
122
+ await this._callEventHandler("on_push_frame", frame, direction);
123
+ }
124
+ /**
125
+ * Emit on_broadcast_frame to broadcast a frame using the user aggregator.
126
+ *
127
+ * @param frameCls The class of the frame to be broadcasted.
128
+ * @param options Options to be passed to the frame's constructor.
129
+ */
130
+ async broadcastFrame(frameCls, options) {
131
+ await this._callEventHandler("on_broadcast_frame", frameCls, options);
132
+ }
133
+ /**
134
+ * Withdraw the speculation this strategy has in flight.
135
+ *
136
+ * Emitted rather than pushed so the host broadcasts it the same way it
137
+ * broadcasts the turn end. A withdrawal that took the queued path would
138
+ * reach a downstream gate *after* the turn end that follows it, and the
139
+ * gate would release the response the withdrawal was meant to discard.
140
+ */
141
+ async triggerUserTurnSpeculationCancelled() {
142
+ await this._callEventHandler("on_user_turn_speculation_cancelled");
143
+ }
144
+ /**
145
+ * Fire both `on_user_turn_inference_triggered` and `on_user_turn_stopped`.
146
+ *
147
+ * Most strategies call this when they decide a turn has ended. To
148
+ * defer finalization to another strategy (so this strategy fires
149
+ * only the inference-triggered event), wrap this strategy with
150
+ * `deferred()` instead of changing the trigger call.
151
+ */
152
+ async triggerUserTurnStopped(options = {}) {
153
+ await this.triggerUserTurnInferenceTriggered();
154
+ await this.triggerUserTurnFinalized({
155
+ enableUserSpeakingFrames: options.enableUserSpeakingFrames ?? null,
156
+ });
157
+ }
158
+ /** Trigger only the `on_user_turn_inference_triggered` event. */
159
+ async triggerUserTurnInferenceTriggered(options = {}) {
160
+ await this._callEventHandler("on_user_turn_inference_triggered", options.speculation ?? null);
161
+ }
162
+ /** Trigger only the `on_user_turn_stopped` event. */
163
+ async triggerUserTurnFinalized(options = {}) {
164
+ await this._callEventHandler("on_user_turn_stopped", new UserTurnStoppedParams({
165
+ enableUserSpeakingFrames: options.enableUserSpeakingFrames ?? this._enableUserSpeakingFrames,
166
+ confirmsSpeculation: options.confirmsSpeculation ?? false,
167
+ }));
168
+ }
169
+ }
170
+ //# sourceMappingURL=base_user_turn_stop_strategy.js.map
@@ -0,0 +1,81 @@
1
+ /** Wrapper that defers a stop strategy's finalization to another strategy. */
2
+ import type { Frame } from "../../frames/frames.ts";
3
+ import type { FrameProcessorSetup } from "../../processors/frame_processor.ts";
4
+ import type { EventHandlerFn } from "../../utils/base_object.ts";
5
+ import type { ProcessFrameResult } from "../types.ts";
6
+ import { BaseUserTurnStopStrategy, type BaseUserTurnStopStrategyOptions } from "./base_user_turn_stop_strategy.ts";
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 declare class DeferredUserTurnStopStrategy extends BaseUserTurnStopStrategy {
26
+ protected _inner: BaseUserTurnStopStrategy;
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: BaseUserTurnStopStrategy, options?: BaseUserTurnStopStrategyOptions);
32
+ /** Return the wrapped strategy. */
33
+ get inner(): BaseUserTurnStopStrategy;
34
+ /**
35
+ * Report what the inner strategy does with proposals.
36
+ *
37
+ * Frame processing is forwarded, so a proposal reaches the inner strategy
38
+ * and is resolved there. Deferring finalization changes when the turn ends,
39
+ * not who decides it.
40
+ */
41
+ get resolvesProposedTurnStopFrames(): boolean;
42
+ /**
43
+ * Forward event subscriptions to the inner strategy.
44
+ *
45
+ * `on_user_turn_stopped` is silently dropped — that's the whole point of
46
+ * the wrapper. Every other event handler is attached to the inner strategy
47
+ * directly, so the inner's events reach the listener without any per-event
48
+ * proxy method on the wrapper.
49
+ */
50
+ addEventHandler(eventName: string, handler: EventHandlerFn<this>): void;
51
+ /** Set up the inner strategy. */
52
+ setup(setup: FrameProcessorSetup): Promise<void>;
53
+ /** Clean up the inner strategy. */
54
+ cleanup(): Promise<void>;
55
+ /** Forward the turn-started callback to the inner strategy. */
56
+ handleUserTurnStarted(): Promise<void>;
57
+ /** Forward the turn-stopped callback to the inner strategy. */
58
+ handleUserTurnStopped(): Promise<void>;
59
+ /** Forward frame processing to the inner strategy. */
60
+ processFrame(frame: Frame): Promise<ProcessFrameResult | null>;
61
+ }
62
+ /**
63
+ * Defer this stop strategy's finalization to another strategy.
64
+ *
65
+ * Wraps `strategy` in a `DeferredUserTurnStopStrategy`: the inner strategy
66
+ * continues to drive inference-triggered events, but its
67
+ * `on_user_turn_stopped` event is suppressed. Use when another strategy in
68
+ * the chain (e.g. `LLMTurnCompletionUserTurnStopStrategy`) owns finalization.
69
+ *
70
+ * @example
71
+ * stop: [
72
+ * deferred(new TurnAnalyzerUserTurnStopStrategy({ turnAnalyzer })),
73
+ * new LLMTurnCompletionUserTurnStopStrategy(),
74
+ * ]
75
+ *
76
+ * @param strategy The stop strategy to defer.
77
+ * @returns A wrapper that exposes the inner strategy's behavior with
78
+ * finalization suppressed.
79
+ */
80
+ export declare function deferred(strategy: BaseUserTurnStopStrategy): DeferredUserTurnStopStrategy;
81
+ //# sourceMappingURL=deferred_user_turn_stop_strategy.d.ts.map