@pipedog/core 0.0.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (736) 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/engine.d.ts +60 -0
  42. package/dist/audio/resamplers/engine.js +89 -0
  43. package/dist/audio/resamplers/index.d.ts +2 -0
  44. package/dist/audio/resamplers/index.js +8 -0
  45. package/dist/audio/resamplers/resampy_resampler.d.ts +10 -0
  46. package/dist/audio/resamplers/resampy_resampler.js +15 -0
  47. package/dist/audio/resamplers/sinc_engine.d.ts +10 -0
  48. package/dist/audio/resamplers/sinc_engine.js +235 -0
  49. package/dist/audio/resamplers/soxr_resampler.d.ts +58 -0
  50. package/dist/audio/resamplers/soxr_resampler.js +79 -0
  51. package/dist/audio/resamplers/soxr_stream_resampler.d.ts +78 -0
  52. package/dist/audio/resamplers/soxr_stream_resampler.js +159 -0
  53. package/dist/audio/turn/base_turn_analyzer.d.ts +84 -0
  54. package/dist/audio/turn/base_turn_analyzer.js +61 -0
  55. package/dist/audio/turn/index.d.ts +2 -0
  56. package/dist/audio/turn/index.js +8 -0
  57. package/dist/audio/turn/smart_turn/_whisper_features.d.ts +30 -0
  58. package/dist/audio/turn/smart_turn/_whisper_features.js +225 -0
  59. package/dist/audio/turn/smart_turn/base_smart_turn.d.ts +94 -0
  60. package/dist/audio/turn/smart_turn/base_smart_turn.js +239 -0
  61. package/dist/audio/turn/smart_turn/local_smart_turn_v3.d.ts +76 -0
  62. package/dist/audio/turn/smart_turn/local_smart_turn_v3.js +151 -0
  63. package/dist/audio/utils.d.ts +224 -0
  64. package/dist/audio/utils.js +634 -0
  65. package/dist/audio/vad/data/index.d.ts +2 -0
  66. package/dist/audio/vad/data/index.js +8 -0
  67. package/dist/audio/vad/index.d.ts +2 -0
  68. package/dist/audio/vad/index.js +8 -0
  69. package/dist/audio/vad/vad_analyzer.d.ts +134 -0
  70. package/dist/audio/vad/vad_analyzer.js +249 -0
  71. package/dist/audio/vad/vad_controller.d.ts +143 -0
  72. package/dist/audio/vad/vad_controller.js +228 -0
  73. package/dist/audio/volume.d.ts +38 -0
  74. package/dist/audio/volume.js +75 -0
  75. package/dist/bus/adapters/base.d.ts +35 -0
  76. package/dist/bus/adapters/base.js +19 -0
  77. package/dist/bus/adapters/index.d.ts +10 -0
  78. package/dist/bus/adapters/index.js +15 -0
  79. package/dist/bus/adapters/llm_context_adapter.d.ts +36 -0
  80. package/dist/bus/adapters/llm_context_adapter.js +82 -0
  81. package/dist/bus/adapters/tools_schema_adapter.d.ts +25 -0
  82. package/dist/bus/adapters/tools_schema_adapter.js +70 -0
  83. package/dist/bus/bridge_processor.d.ts +111 -0
  84. package/dist/bus/bridge_processor.js +166 -0
  85. package/dist/bus/bus.d.ts +110 -0
  86. package/dist/bus/bus.js +200 -0
  87. package/dist/bus/index.d.ts +22 -0
  88. package/dist/bus/index.js +27 -0
  89. package/dist/bus/local/async_queue.d.ts +12 -0
  90. package/dist/bus/local/async_queue.js +21 -0
  91. package/dist/bus/local/index.d.ts +3 -0
  92. package/dist/bus/local/index.js +8 -0
  93. package/dist/bus/messages.d.ts +378 -0
  94. package/dist/bus/messages.js +357 -0
  95. package/dist/bus/network/index.d.ts +16 -0
  96. package/dist/bus/network/index.js +21 -0
  97. package/dist/bus/queue.d.ts +27 -0
  98. package/dist/bus/queue.js +51 -0
  99. package/dist/bus/serializers/base.d.ts +25 -0
  100. package/dist/bus/serializers/base.js +14 -0
  101. package/dist/bus/serializers/index.d.ts +9 -0
  102. package/dist/bus/serializers/index.js +14 -0
  103. package/dist/bus/serializers/json.d.ts +77 -0
  104. package/dist/bus/serializers/json.js +367 -0
  105. package/dist/bus/subscriber.d.ts +46 -0
  106. package/dist/bus/subscriber.js +27 -0
  107. package/dist/bus/ui/index.d.ts +3 -0
  108. package/dist/bus/ui/index.js +8 -0
  109. package/dist/bus/ui/messages.d.ts +186 -0
  110. package/dist/bus/ui/messages.js +171 -0
  111. package/dist/classifiers/base_classifier.d.ts +263 -0
  112. package/dist/classifiers/base_classifier.js +346 -0
  113. package/dist/classifiers/cloudflare/clef/classifier.d.ts +70 -0
  114. package/dist/classifiers/cloudflare/clef/classifier.js +204 -0
  115. package/dist/classifiers/cloudflare/clef/client.d.ts +104 -0
  116. package/dist/classifiers/cloudflare/clef/client.js +234 -0
  117. package/dist/classifiers/cloudflare/clef/index.d.ts +2 -0
  118. package/dist/classifiers/cloudflare/clef/index.js +8 -0
  119. package/dist/classifiers/cloudflare/index.d.ts +2 -0
  120. package/dist/classifiers/cloudflare/index.js +8 -0
  121. package/dist/classifiers/http_client.d.ts +70 -0
  122. package/dist/classifiers/http_client.js +161 -0
  123. package/dist/classifiers/index.d.ts +2 -0
  124. package/dist/classifiers/index.js +8 -0
  125. package/dist/classifiers/jev/classifier.d.ts +8 -0
  126. package/dist/classifiers/jev/classifier.js +13 -0
  127. package/dist/classifiers/jev/client.d.ts +8 -0
  128. package/dist/classifiers/jev/client.js +13 -0
  129. package/dist/classifiers/jev/index.d.ts +2 -0
  130. package/dist/classifiers/jev/index.js +8 -0
  131. package/dist/classifiers/llm/classifier.d.ts +72 -0
  132. package/dist/classifiers/llm/classifier.js +304 -0
  133. package/dist/classifiers/llm/index.d.ts +2 -0
  134. package/dist/classifiers/llm/index.js +8 -0
  135. package/dist/classifiers/openai/decisions/classifier.d.ts +77 -0
  136. package/dist/classifiers/openai/decisions/classifier.js +241 -0
  137. package/dist/classifiers/openai/decisions/client.d.ts +108 -0
  138. package/dist/classifiers/openai/decisions/client.js +234 -0
  139. package/dist/classifiers/openai/decisions/index.d.ts +2 -0
  140. package/dist/classifiers/openai/decisions/index.js +8 -0
  141. package/dist/classifiers/openai/index.d.ts +2 -0
  142. package/dist/classifiers/openai/index.js +8 -0
  143. package/dist/classifiers/typesafe/index.d.ts +2 -0
  144. package/dist/classifiers/typesafe/index.js +8 -0
  145. package/dist/classifiers/typesafe/jev/classifier.d.ts +70 -0
  146. package/dist/classifiers/typesafe/jev/classifier.js +220 -0
  147. package/dist/classifiers/typesafe/jev/client.d.ts +105 -0
  148. package/dist/classifiers/typesafe/jev/client.js +233 -0
  149. package/dist/classifiers/typesafe/jev/index.d.ts +2 -0
  150. package/dist/classifiers/typesafe/jev/index.js +8 -0
  151. package/dist/clocks/base_clock.d.ts +13 -0
  152. package/dist/clocks/base_clock.js +14 -0
  153. package/dist/clocks/index.d.ts +2 -0
  154. package/dist/clocks/index.js +8 -0
  155. package/dist/clocks/system_clock.d.ts +15 -0
  156. package/dist/clocks/system_clock.js +25 -0
  157. package/dist/frames/frames.d.ts +2533 -0
  158. package/dist/frames/frames.js +2485 -0
  159. package/dist/frames/index.d.ts +2 -0
  160. package/dist/frames/index.js +8 -0
  161. package/dist/frames/protobufs/frames_pb2.d.ts +229 -0
  162. package/dist/frames/protobufs/frames_pb2.js +466 -0
  163. package/dist/index.d.ts +11 -0
  164. package/dist/index.js +56 -0
  165. package/dist/metrics/index.d.ts +2 -0
  166. package/dist/metrics/index.js +8 -0
  167. package/dist/metrics/metrics.d.ts +276 -0
  168. package/dist/metrics/metrics.js +254 -0
  169. package/dist/observers/base_observer.d.ts +173 -0
  170. package/dist/observers/base_observer.js +151 -0
  171. package/dist/observers/error_observer.d.ts +75 -0
  172. package/dist/observers/error_observer.js +87 -0
  173. package/dist/observers/function_call_observer.d.ts +157 -0
  174. package/dist/observers/function_call_observer.js +222 -0
  175. package/dist/observers/index.d.ts +2 -0
  176. package/dist/observers/index.js +8 -0
  177. package/dist/observers/loggers/debug_log_observer.d.ts +91 -0
  178. package/dist/observers/loggers/debug_log_observer.js +228 -0
  179. package/dist/observers/loggers/index.d.ts +2 -0
  180. package/dist/observers/loggers/index.js +8 -0
  181. package/dist/observers/loggers/llm_log_observer.d.ts +24 -0
  182. package/dist/observers/loggers/llm_log_observer.js +110 -0
  183. package/dist/observers/loggers/metrics_log_observer.d.ts +85 -0
  184. package/dist/observers/loggers/metrics_log_observer.js +186 -0
  185. package/dist/observers/loggers/transcription_log_observer.d.ts +23 -0
  186. package/dist/observers/loggers/transcription_log_observer.js +74 -0
  187. package/dist/observers/service_metrics_observer.d.ts +168 -0
  188. package/dist/observers/service_metrics_observer.js +236 -0
  189. package/dist/observers/speaking_observer.d.ts +104 -0
  190. package/dist/observers/speaking_observer.js +150 -0
  191. package/dist/observers/startup_timing_observer.d.ts +221 -0
  192. package/dist/observers/startup_timing_observer.js +365 -0
  193. package/dist/observers/turn_tracking_observer.d.ts +78 -0
  194. package/dist/observers/turn_tracking_observer.js +189 -0
  195. package/dist/observers/user_bot_latency_observer.d.ts +411 -0
  196. package/dist/observers/user_bot_latency_observer.js +974 -0
  197. package/dist/pipeline/base_pipeline.d.ts +49 -0
  198. package/dist/pipeline/base_pipeline.js +101 -0
  199. package/dist/pipeline/capabilities.d.ts +76 -0
  200. package/dist/pipeline/capabilities.js +97 -0
  201. package/dist/pipeline/index.d.ts +2 -0
  202. package/dist/pipeline/index.js +8 -0
  203. package/dist/pipeline/job_context.d.ts +317 -0
  204. package/dist/pipeline/job_context.js +450 -0
  205. package/dist/pipeline/job_decorator.d.ts +54 -0
  206. package/dist/pipeline/job_decorator.js +92 -0
  207. package/dist/pipeline/llm_switcher.d.ts +84 -0
  208. package/dist/pipeline/llm_switcher.js +107 -0
  209. package/dist/pipeline/llm_with_backend.d.ts +435 -0
  210. package/dist/pipeline/llm_with_backend.js +806 -0
  211. package/dist/pipeline/parallel_pipeline.d.ts +83 -0
  212. package/dist/pipeline/parallel_pipeline.js +200 -0
  213. package/dist/pipeline/pipeline.d.ts +126 -0
  214. package/dist/pipeline/pipeline.js +196 -0
  215. package/dist/pipeline/service_switcher.d.ts +287 -0
  216. package/dist/pipeline/service_switcher.js +509 -0
  217. package/dist/pipeline/sync_parallel_pipeline.d.ts +192 -0
  218. package/dist/pipeline/sync_parallel_pipeline.js +387 -0
  219. package/dist/pipeline/worker.d.ts +821 -0
  220. package/dist/pipeline/worker.js +1656 -0
  221. package/dist/pipeline/worker_observer.d.ts +131 -0
  222. package/dist/pipeline/worker_observer.js +274 -0
  223. package/dist/pipeline/worker_ready_decorator.d.ts +45 -0
  224. package/dist/pipeline/worker_ready_decorator.js +76 -0
  225. package/dist/processors/aggregators/async_tool_messages.d.ts +146 -0
  226. package/dist/processors/aggregators/async_tool_messages.js +291 -0
  227. package/dist/processors/aggregators/dtmf_aggregator.d.ts +61 -0
  228. package/dist/processors/aggregators/dtmf_aggregator.js +144 -0
  229. package/dist/processors/aggregators/gated.d.ts +43 -0
  230. package/dist/processors/aggregators/gated.js +86 -0
  231. package/dist/processors/aggregators/gated_llm_context.d.ts +42 -0
  232. package/dist/processors/aggregators/gated_llm_context.js +86 -0
  233. package/dist/processors/aggregators/index.d.ts +2 -0
  234. package/dist/processors/aggregators/index.js +8 -0
  235. package/dist/processors/aggregators/llm_context.d.ts +370 -0
  236. package/dist/processors/aggregators/llm_context.js +580 -0
  237. package/dist/processors/aggregators/llm_context_summarizer.d.ts +219 -0
  238. package/dist/processors/aggregators/llm_context_summarizer.js +447 -0
  239. package/dist/processors/aggregators/llm_response.d.ts +37 -0
  240. package/dist/processors/aggregators/llm_response.js +71 -0
  241. package/dist/processors/aggregators/llm_response_universal.d.ts +966 -0
  242. package/dist/processors/aggregators/llm_response_universal.js +2394 -0
  243. package/dist/processors/aggregators/llm_text_processor.d.ts +53 -0
  244. package/dist/processors/aggregators/llm_text_processor.js +102 -0
  245. package/dist/processors/aggregators/sentence.d.ts +39 -0
  246. package/dist/processors/aggregators/sentence.js +69 -0
  247. package/dist/processors/async_generator.d.ts +42 -0
  248. package/dist/processors/async_generator.js +76 -0
  249. package/dist/processors/audio/audio_buffer_processor.d.ts +241 -0
  250. package/dist/processors/audio/audio_buffer_processor.js +565 -0
  251. package/dist/processors/audio/index.d.ts +2 -0
  252. package/dist/processors/audio/index.js +8 -0
  253. package/dist/processors/audio/vad_processor.d.ts +67 -0
  254. package/dist/processors/audio/vad_processor.js +103 -0
  255. package/dist/processors/consumer_processor.d.ts +49 -0
  256. package/dist/processors/consumer_processor.js +85 -0
  257. package/dist/processors/filters/frame_filter.d.ts +39 -0
  258. package/dist/processors/filters/frame_filter.js +52 -0
  259. package/dist/processors/filters/function_filter.d.ts +59 -0
  260. package/dist/processors/filters/function_filter.js +78 -0
  261. package/dist/processors/filters/identity_filter.d.ts +33 -0
  262. package/dist/processors/filters/identity_filter.js +37 -0
  263. package/dist/processors/filters/index.d.ts +2 -0
  264. package/dist/processors/filters/index.js +8 -0
  265. package/dist/processors/filters/null_filter.d.ts +34 -0
  266. package/dist/processors/filters/null_filter.js +47 -0
  267. package/dist/processors/filters/wake_notifier_filter.d.ts +48 -0
  268. package/dist/processors/filters/wake_notifier_filter.js +49 -0
  269. package/dist/processors/frame_processor.d.ts +360 -0
  270. package/dist/processors/frame_processor.js +932 -0
  271. package/dist/processors/frameworks/index.d.ts +2 -0
  272. package/dist/processors/frameworks/index.js +8 -0
  273. package/dist/processors/frameworks/rtvi/frames.d.ts +241 -0
  274. package/dist/processors/frameworks/rtvi/frames.js +259 -0
  275. package/dist/processors/frameworks/rtvi/index.d.ts +6 -0
  276. package/dist/processors/frameworks/rtvi/index.js +11 -0
  277. package/dist/processors/frameworks/rtvi/models.d.ts +1741 -0
  278. package/dist/processors/frameworks/rtvi/models.js +1807 -0
  279. package/dist/processors/frameworks/rtvi/observer.d.ts +340 -0
  280. package/dist/processors/frameworks/rtvi/observer.js +1113 -0
  281. package/dist/processors/frameworks/rtvi/processor.d.ts +182 -0
  282. package/dist/processors/frameworks/rtvi/processor.js +676 -0
  283. package/dist/processors/idle_frame_processor.d.ts +44 -0
  284. package/dist/processors/idle_frame_processor.js +86 -0
  285. package/dist/processors/index.d.ts +2 -0
  286. package/dist/processors/index.js +8 -0
  287. package/dist/processors/logger.d.ts +42 -0
  288. package/dist/processors/logger.js +87 -0
  289. package/dist/processors/metrics/frame_processor_metrics.d.ts +172 -0
  290. package/dist/processors/metrics/frame_processor_metrics.js +372 -0
  291. package/dist/processors/metrics/index.d.ts +2 -0
  292. package/dist/processors/metrics/index.js +8 -0
  293. package/dist/processors/producer_processor.d.ts +68 -0
  294. package/dist/processors/producer_processor.js +78 -0
  295. package/dist/processors/text_transformer.d.ts +30 -0
  296. package/dist/processors/text_transformer.js +48 -0
  297. package/dist/registry/index.d.ts +3 -0
  298. package/dist/registry/index.js +8 -0
  299. package/dist/registry/registry.d.ts +69 -0
  300. package/dist/registry/registry.js +149 -0
  301. package/dist/registry/types.d.ts +47 -0
  302. package/dist/registry/types.js +39 -0
  303. package/dist/serializers/base_serializer.d.ts +94 -0
  304. package/dist/serializers/base_serializer.js +82 -0
  305. package/dist/serializers/index.d.ts +2 -0
  306. package/dist/serializers/index.js +8 -0
  307. package/dist/services/ai_service.d.ts +145 -0
  308. package/dist/services/ai_service.js +262 -0
  309. package/dist/services/anthropic/index.d.ts +2 -0
  310. package/dist/services/anthropic/index.js +7 -0
  311. package/dist/services/assemblyai/index.d.ts +2 -0
  312. package/dist/services/assemblyai/index.js +7 -0
  313. package/dist/services/asyncai/index.d.ts +2 -0
  314. package/dist/services/asyncai/index.js +7 -0
  315. package/dist/services/aws/index.d.ts +2 -0
  316. package/dist/services/aws/index.js +7 -0
  317. package/dist/services/azure/index.d.ts +2 -0
  318. package/dist/services/azure/index.js +7 -0
  319. package/dist/services/baseten/index.d.ts +2 -0
  320. package/dist/services/baseten/index.js +7 -0
  321. package/dist/services/bland/index.d.ts +2 -0
  322. package/dist/services/bland/index.js +7 -0
  323. package/dist/services/camb/index.d.ts +2 -0
  324. package/dist/services/camb/index.js +7 -0
  325. package/dist/services/cartesia/index.d.ts +2 -0
  326. package/dist/services/cartesia/index.js +7 -0
  327. package/dist/services/cerebras/index.d.ts +2 -0
  328. package/dist/services/cerebras/index.js +7 -0
  329. package/dist/services/crusoe/index.d.ts +2 -0
  330. package/dist/services/crusoe/index.js +7 -0
  331. package/dist/services/deepgram/index.d.ts +2 -0
  332. package/dist/services/deepgram/index.js +7 -0
  333. package/dist/services/deepseek/index.d.ts +2 -0
  334. package/dist/services/deepseek/index.js +7 -0
  335. package/dist/services/elevenlabs/index.d.ts +2 -0
  336. package/dist/services/elevenlabs/index.js +7 -0
  337. package/dist/services/fal/index.d.ts +2 -0
  338. package/dist/services/fal/index.js +7 -0
  339. package/dist/services/fireworks/index.d.ts +2 -0
  340. package/dist/services/fireworks/index.js +7 -0
  341. package/dist/services/fish/index.d.ts +2 -0
  342. package/dist/services/fish/index.js +7 -0
  343. package/dist/services/funasr/index.d.ts +3 -0
  344. package/dist/services/funasr/index.js +8 -0
  345. package/dist/services/gladia/index.d.ts +2 -0
  346. package/dist/services/gladia/index.js +7 -0
  347. package/dist/services/google/index.d.ts +2 -0
  348. package/dist/services/google/index.js +7 -0
  349. package/dist/services/gradium/index.d.ts +2 -0
  350. package/dist/services/gradium/index.js +7 -0
  351. package/dist/services/grok/index.d.ts +2 -0
  352. package/dist/services/grok/index.js +7 -0
  353. package/dist/services/groq/index.d.ts +2 -0
  354. package/dist/services/groq/index.js +7 -0
  355. package/dist/services/heygen/index.d.ts +2 -0
  356. package/dist/services/heygen/index.js +7 -0
  357. package/dist/services/hume/index.d.ts +2 -0
  358. package/dist/services/hume/index.js +7 -0
  359. package/dist/services/image_service.d.ts +52 -0
  360. package/dist/services/image_service.js +60 -0
  361. package/dist/services/inception/index.d.ts +2 -0
  362. package/dist/services/inception/index.js +7 -0
  363. package/dist/services/index.d.ts +2 -0
  364. package/dist/services/index.js +8 -0
  365. package/dist/services/inworld/index.d.ts +2 -0
  366. package/dist/services/inworld/index.js +7 -0
  367. package/dist/services/keenable/index.d.ts +2 -0
  368. package/dist/services/keenable/index.js +7 -0
  369. package/dist/services/kokoro/index.d.ts +2 -0
  370. package/dist/services/kokoro/index.js +7 -0
  371. package/dist/services/llm_service.d.ts +1106 -0
  372. package/dist/services/llm_service.js +2231 -0
  373. package/dist/services/mem0/index.d.ts +2 -0
  374. package/dist/services/mem0/index.js +7 -0
  375. package/dist/services/meta/index.d.ts +2 -0
  376. package/dist/services/meta/index.js +7 -0
  377. package/dist/services/minimax/index.d.ts +2 -0
  378. package/dist/services/minimax/index.js +7 -0
  379. package/dist/services/mistral/index.d.ts +2 -0
  380. package/dist/services/mistral/index.js +7 -0
  381. package/dist/services/moondream/index.d.ts +2 -0
  382. package/dist/services/moondream/index.js +7 -0
  383. package/dist/services/moonshine/index.d.ts +2 -0
  384. package/dist/services/moonshine/index.js +7 -0
  385. package/dist/services/nebius/index.d.ts +2 -0
  386. package/dist/services/nebius/index.js +7 -0
  387. package/dist/services/neuphonic/index.d.ts +2 -0
  388. package/dist/services/neuphonic/index.js +7 -0
  389. package/dist/services/novita/index.d.ts +2 -0
  390. package/dist/services/novita/index.js +7 -0
  391. package/dist/services/nvidia/index.d.ts +2 -0
  392. package/dist/services/nvidia/index.js +11 -0
  393. package/dist/services/ollama/index.d.ts +2 -0
  394. package/dist/services/ollama/index.js +7 -0
  395. package/dist/services/openai/index.d.ts +2 -0
  396. package/dist/services/openai/index.js +7 -0
  397. package/dist/services/openclaw/index.d.ts +14 -0
  398. package/dist/services/openclaw/index.js +19 -0
  399. package/dist/services/openrouter/index.d.ts +2 -0
  400. package/dist/services/openrouter/index.js +7 -0
  401. package/dist/services/perplexity/index.d.ts +2 -0
  402. package/dist/services/perplexity/index.js +7 -0
  403. package/dist/services/piper/index.d.ts +2 -0
  404. package/dist/services/piper/index.js +7 -0
  405. package/dist/services/pocket_tts/index.d.ts +2 -0
  406. package/dist/services/pocket_tts/index.js +7 -0
  407. package/dist/services/qwen/index.d.ts +2 -0
  408. package/dist/services/qwen/index.js +7 -0
  409. package/dist/services/resembleai/index.d.ts +2 -0
  410. package/dist/services/resembleai/index.js +7 -0
  411. package/dist/services/rime/index.d.ts +2 -0
  412. package/dist/services/rime/index.js +7 -0
  413. package/dist/services/sambanova/index.d.ts +2 -0
  414. package/dist/services/sambanova/index.js +7 -0
  415. package/dist/services/sarvam/index.d.ts +2 -0
  416. package/dist/services/sarvam/index.js +7 -0
  417. package/dist/services/settings.d.ts +356 -0
  418. package/dist/services/settings.js +437 -0
  419. package/dist/services/simli/index.d.ts +2 -0
  420. package/dist/services/simli/index.js +7 -0
  421. package/dist/services/smallest/index.d.ts +2 -0
  422. package/dist/services/smallest/index.js +7 -0
  423. package/dist/services/soniox/index.d.ts +2 -0
  424. package/dist/services/soniox/index.js +7 -0
  425. package/dist/services/speechify/index.d.ts +2 -0
  426. package/dist/services/speechify/index.js +7 -0
  427. package/dist/services/speechmatics/index.d.ts +2 -0
  428. package/dist/services/speechmatics/index.js +7 -0
  429. package/dist/services/stt_latency.d.ts +62 -0
  430. package/dist/services/stt_latency.js +71 -0
  431. package/dist/services/stt_service.d.ts +601 -0
  432. package/dist/services/stt_service.js +1044 -0
  433. package/dist/services/tavus/index.d.ts +2 -0
  434. package/dist/services/tavus/index.js +7 -0
  435. package/dist/services/together/index.d.ts +2 -0
  436. package/dist/services/together/index.js +7 -0
  437. package/dist/services/tts_service.d.ts +909 -0
  438. package/dist/services/tts_service.js +2018 -0
  439. package/dist/services/ultravox/index.d.ts +2 -0
  440. package/dist/services/ultravox/index.js +9 -0
  441. package/dist/services/vision_service.d.ts +56 -0
  442. package/dist/services/vision_service.js +62 -0
  443. package/dist/services/websocket_service.d.ts +213 -0
  444. package/dist/services/websocket_service.js +654 -0
  445. package/dist/services/whisper/index.d.ts +2 -0
  446. package/dist/services/whisper/index.js +9 -0
  447. package/dist/services/xai/index.d.ts +2 -0
  448. package/dist/services/xai/index.js +9 -0
  449. package/dist/services/xtts/index.d.ts +2 -0
  450. package/dist/services/xtts/index.js +9 -0
  451. package/dist/tests/index.d.ts +2 -0
  452. package/dist/tests/index.js +8 -0
  453. package/dist/tests/utils.d.ts +123 -0
  454. package/dist/tests/utils.js +212 -0
  455. package/dist/transcriptions/index.d.ts +2 -0
  456. package/dist/transcriptions/index.js +8 -0
  457. package/dist/transcriptions/language.d.ts +376 -0
  458. package/dist/transcriptions/language.js +543 -0
  459. package/dist/transports/base_input.d.ts +149 -0
  460. package/dist/transports/base_input.js +338 -0
  461. package/dist/transports/base_output.d.ts +432 -0
  462. package/dist/transports/base_output.js +1231 -0
  463. package/dist/transports/base_transport.d.ts +223 -0
  464. package/dist/transports/base_transport.js +167 -0
  465. package/dist/transports/daily/index.d.ts +2 -0
  466. package/dist/transports/daily/index.js +9 -0
  467. package/dist/transports/heygen/index.d.ts +2 -0
  468. package/dist/transports/heygen/index.js +9 -0
  469. package/dist/transports/index.d.ts +2 -0
  470. package/dist/transports/index.js +8 -0
  471. package/dist/transports/lemonslice/index.d.ts +2 -0
  472. package/dist/transports/lemonslice/index.js +9 -0
  473. package/dist/transports/livekit/index.d.ts +2 -0
  474. package/dist/transports/livekit/index.js +9 -0
  475. package/dist/transports/local/index.d.ts +2 -0
  476. package/dist/transports/local/index.js +9 -0
  477. package/dist/transports/moq/index.d.ts +2 -0
  478. package/dist/transports/moq/index.js +9 -0
  479. package/dist/transports/smallwebrtc/index.d.ts +2 -0
  480. package/dist/transports/smallwebrtc/index.js +9 -0
  481. package/dist/transports/tavus/index.d.ts +2 -0
  482. package/dist/transports/tavus/index.js +9 -0
  483. package/dist/transports/video_in_sampler.d.ts +157 -0
  484. package/dist/transports/video_in_sampler.js +258 -0
  485. package/dist/transports/vonage/index.d.ts +2 -0
  486. package/dist/transports/vonage/index.js +9 -0
  487. package/dist/transports/websocket/index.d.ts +2 -0
  488. package/dist/transports/websocket/index.js +9 -0
  489. package/dist/transports/whatsapp/index.d.ts +2 -0
  490. package/dist/transports/whatsapp/index.js +9 -0
  491. package/dist/turns/eager_end_of_turn_mixin.d.ts +70 -0
  492. package/dist/turns/eager_end_of_turn_mixin.js +122 -0
  493. package/dist/turns/empty_user_turn.d.ts +55 -0
  494. package/dist/turns/empty_user_turn.js +53 -0
  495. package/dist/turns/index.d.ts +2 -0
  496. package/dist/turns/index.js +8 -0
  497. package/dist/turns/speculation_gate.d.ts +169 -0
  498. package/dist/turns/speculation_gate.js +294 -0
  499. package/dist/turns/types.d.ts +33 -0
  500. package/dist/turns/types.js +35 -0
  501. package/dist/turns/user_idle_controller.d.ts +94 -0
  502. package/dist/turns/user_idle_controller.js +187 -0
  503. package/dist/turns/user_mute/always_user_mute_strategy.d.ts +15 -0
  504. package/dist/turns/user_mute/always_user_mute_strategy.js +29 -0
  505. package/dist/turns/user_mute/base_user_mute_strategy.d.ts +39 -0
  506. package/dist/turns/user_mute/base_user_mute_strategy.js +45 -0
  507. package/dist/turns/user_mute/first_speech_user_mute_strategy.d.ts +28 -0
  508. package/dist/turns/user_mute/first_speech_user_mute_strategy.js +52 -0
  509. package/dist/turns/user_mute/function_call_user_mute_strategy.d.ts +25 -0
  510. package/dist/turns/user_mute/function_call_user_mute_strategy.js +50 -0
  511. package/dist/turns/user_mute/index.d.ts +6 -0
  512. package/dist/turns/user_mute/index.js +11 -0
  513. package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.d.ts +43 -0
  514. package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.js +76 -0
  515. package/dist/turns/user_start/base_user_turn_start_strategy.d.ts +135 -0
  516. package/dist/turns/user_start/base_user_turn_start_strategy.js +134 -0
  517. package/dist/turns/user_start/external_user_turn_start_strategy.d.ts +45 -0
  518. package/dist/turns/user_start/external_user_turn_start_strategy.js +64 -0
  519. package/dist/turns/user_start/index.d.ts +8 -0
  520. package/dist/turns/user_start/index.js +16 -0
  521. package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.d.ts +133 -0
  522. package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.js +243 -0
  523. package/dist/turns/user_start/min_words_user_turn_start_strategy.d.ts +60 -0
  524. package/dist/turns/user_start/min_words_user_turn_start_strategy.js +102 -0
  525. package/dist/turns/user_start/transcription_user_turn_start_strategy.d.ts +29 -0
  526. package/dist/turns/user_start/transcription_user_turn_start_strategy.js +43 -0
  527. package/dist/turns/user_start/vad_user_turn_start_strategy.d.ts +20 -0
  528. package/dist/turns/user_start/vad_user_turn_start_strategy.js +31 -0
  529. package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.d.ts +141 -0
  530. package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.js +238 -0
  531. package/dist/turns/user_stop/base_user_turn_stop_strategy.d.ts +174 -0
  532. package/dist/turns/user_stop/base_user_turn_stop_strategy.js +170 -0
  533. package/dist/turns/user_stop/deferred_user_turn_stop_strategy.d.ts +81 -0
  534. package/dist/turns/user_stop/deferred_user_turn_stop_strategy.js +107 -0
  535. package/dist/turns/user_stop/eager_match_policy.d.ts +36 -0
  536. package/dist/turns/user_stop/eager_match_policy.js +50 -0
  537. package/dist/turns/user_stop/eager_user_turn_stop_strategy.d.ts +84 -0
  538. package/dist/turns/user_stop/eager_user_turn_stop_strategy.js +154 -0
  539. package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.d.ts +45 -0
  540. package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.js +55 -0
  541. package/dist/turns/user_stop/external_user_turn_stop_strategy.d.ts +115 -0
  542. package/dist/turns/user_stop/external_user_turn_stop_strategy.js +205 -0
  543. package/dist/turns/user_stop/index.d.ts +10 -0
  544. package/dist/turns/user_stop/index.js +15 -0
  545. package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.d.ts +44 -0
  546. package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.js +59 -0
  547. package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.d.ts +140 -0
  548. package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.js +303 -0
  549. package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.d.ts +135 -0
  550. package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.js +332 -0
  551. package/dist/turns/user_turn_completion_mixin.d.ts +147 -0
  552. package/dist/turns/user_turn_completion_mixin.js +591 -0
  553. package/dist/turns/user_turn_controller.d.ts +134 -0
  554. package/dist/turns/user_turn_controller.js +335 -0
  555. package/dist/turns/user_turn_processor.d.ts +87 -0
  556. package/dist/turns/user_turn_processor.js +180 -0
  557. package/dist/turns/user_turn_strategies.d.ts +187 -0
  558. package/dist/turns/user_turn_strategies.js +222 -0
  559. package/dist/utils/async_tool_cancellation.d.ts +35 -0
  560. package/dist/utils/async_tool_cancellation.js +78 -0
  561. package/dist/utils/asyncio/index.d.ts +2 -0
  562. package/dist/utils/asyncio/index.js +7 -0
  563. package/dist/utils/asyncio/task_manager.d.ts +49 -0
  564. package/dist/utils/asyncio/task_manager.js +105 -0
  565. package/dist/utils/base_object.d.ts +76 -0
  566. package/dist/utils/base_object.js +154 -0
  567. package/dist/utils/context/aggregated_frame_sequencer.d.ts +491 -0
  568. package/dist/utils/context/aggregated_frame_sequencer.js +803 -0
  569. package/dist/utils/context/audio_context_manager.d.ts +131 -0
  570. package/dist/utils/context/audio_context_manager.js +233 -0
  571. package/dist/utils/context/index.d.ts +2 -0
  572. package/dist/utils/context/index.js +7 -0
  573. package/dist/utils/context/llm_context_summarization.d.ts +258 -0
  574. package/dist/utils/context/llm_context_summarization.js +511 -0
  575. package/dist/utils/context/text_segment_map.d.ts +611 -0
  576. package/dist/utils/context/text_segment_map.js +1132 -0
  577. package/dist/utils/context/word_completion_tracker.d.ts +273 -0
  578. package/dist/utils/context/word_completion_tracker.js +441 -0
  579. package/dist/utils/context/word_timestamp_tracker.d.ts +72 -0
  580. package/dist/utils/context/word_timestamp_tracker.js +98 -0
  581. package/dist/utils/deprecation.d.ts +28 -0
  582. package/dist/utils/deprecation.js +75 -0
  583. package/dist/utils/env.d.ts +38 -0
  584. package/dist/utils/env.js +62 -0
  585. package/dist/utils/errors.d.ts +75 -0
  586. package/dist/utils/errors.js +202 -0
  587. package/dist/utils/file_resolver.d.ts +126 -0
  588. package/dist/utils/file_resolver.js +314 -0
  589. package/dist/utils/file_storage.d.ts +115 -0
  590. package/dist/utils/file_storage.js +178 -0
  591. package/dist/utils/frame_queue.d.ts +36 -0
  592. package/dist/utils/frame_queue.js +66 -0
  593. package/dist/utils/http.d.ts +39 -0
  594. package/dist/utils/http.js +53 -0
  595. package/dist/utils/image.d.ts +14 -0
  596. package/dist/utils/image.js +63 -0
  597. package/dist/utils/index.d.ts +2 -0
  598. package/dist/utils/index.js +8 -0
  599. package/dist/utils/jpeg_encoder.d.ts +14 -0
  600. package/dist/utils/jpeg_encoder.js +315 -0
  601. package/dist/utils/log_config.d.ts +34 -0
  602. package/dist/utils/log_config.js +76 -0
  603. package/dist/utils/logger.d.ts +40 -0
  604. package/dist/utils/logger.js +91 -0
  605. package/dist/utils/mixin.d.ts +14 -0
  606. package/dist/utils/mixin.js +63 -0
  607. package/dist/utils/network.d.ts +73 -0
  608. package/dist/utils/network.js +90 -0
  609. package/dist/utils/security/allowed_origins.d.ts +16 -0
  610. package/dist/utils/security/allowed_origins.js +34 -0
  611. package/dist/utils/security/index.d.ts +2 -0
  612. package/dist/utils/security/index.js +7 -0
  613. package/dist/utils/security/redaction.d.ts +27 -0
  614. package/dist/utils/security/redaction.js +123 -0
  615. package/dist/utils/security/ssrf.d.ts +79 -0
  616. package/dist/utils/security/ssrf.js +327 -0
  617. package/dist/utils/shared.d.ts +35 -0
  618. package/dist/utils/shared.js +136 -0
  619. package/dist/utils/startup.d.ts +17 -0
  620. package/dist/utils/startup.js +130 -0
  621. package/dist/utils/string.d.ts +116 -0
  622. package/dist/utils/string.js +460 -0
  623. package/dist/utils/sync/base_notifier.d.ts +25 -0
  624. package/dist/utils/sync/base_notifier.js +16 -0
  625. package/dist/utils/sync/event_notifier.d.ts +38 -0
  626. package/dist/utils/sync/event_notifier.js +51 -0
  627. package/dist/utils/sync/index.d.ts +2 -0
  628. package/dist/utils/sync/index.js +7 -0
  629. package/dist/utils/text/alnum_utils.d.ts +109 -0
  630. package/dist/utils/text/alnum_utils.js +262 -0
  631. package/dist/utils/text/base_text_aggregator.d.ts +146 -0
  632. package/dist/utils/text/base_text_aggregator.js +102 -0
  633. package/dist/utils/text/base_text_filter.d.ts +54 -0
  634. package/dist/utils/text/base_text_filter.js +50 -0
  635. package/dist/utils/text/index.d.ts +2 -0
  636. package/dist/utils/text/index.js +7 -0
  637. package/dist/utils/text/markdown_text_filter.d.ts +147 -0
  638. package/dist/utils/text/markdown_text_filter.js +522 -0
  639. package/dist/utils/text/markup_utils.d.ts +54 -0
  640. package/dist/utils/text/markup_utils.js +156 -0
  641. package/dist/utils/text/pattern_pair_aggregator.d.ts +251 -0
  642. package/dist/utils/text/pattern_pair_aggregator.js +478 -0
  643. package/dist/utils/text/phonemes.d.ts +60 -0
  644. package/dist/utils/text/phonemes.js +172 -0
  645. package/dist/utils/text/simple_text_aggregator.d.ts +135 -0
  646. package/dist/utils/text/simple_text_aggregator.js +254 -0
  647. package/dist/utils/text/skip_tags_aggregator.d.ts +85 -0
  648. package/dist/utils/text/skip_tags_aggregator.js +147 -0
  649. package/dist/utils/text/transforms/acronyms.d.ts +21 -0
  650. package/dist/utils/text/transforms/acronyms.js +31 -0
  651. package/dist/utils/text/transforms/currency.d.ts +16 -0
  652. package/dist/utils/text/transforms/currency.js +56 -0
  653. package/dist/utils/text/transforms/dates.d.ts +18 -0
  654. package/dist/utils/text/transforms/dates.js +102 -0
  655. package/dist/utils/text/transforms/email.d.ts +17 -0
  656. package/dist/utils/text/transforms/email.js +35 -0
  657. package/dist/utils/text/transforms/index.d.ts +37 -0
  658. package/dist/utils/text/transforms/index.js +42 -0
  659. package/dist/utils/text/transforms/numbers.d.ts +25 -0
  660. package/dist/utils/text/transforms/numbers.js +59 -0
  661. package/dist/utils/text/transforms/percentages.d.ts +16 -0
  662. package/dist/utils/text/transforms/percentages.js +32 -0
  663. package/dist/utils/text/transforms/phone.d.ts +21 -0
  664. package/dist/utils/text/transforms/phone.js +39 -0
  665. package/dist/utils/text/transforms/pronunciations.d.ts +65 -0
  666. package/dist/utils/text/transforms/pronunciations.js +112 -0
  667. package/dist/utils/text/transforms/replacements.d.ts +39 -0
  668. package/dist/utils/text/transforms/replacements.js +46 -0
  669. package/dist/utils/text/transforms/strip_markdown.d.ts +25 -0
  670. package/dist/utils/text/transforms/strip_markdown.js +60 -0
  671. package/dist/utils/text/transforms/units.d.ts +22 -0
  672. package/dist/utils/text/transforms/units.js +81 -0
  673. package/dist/utils/text/transforms/voice_formatter.d.ts +86 -0
  674. package/dist/utils/text/transforms/voice_formatter.js +98 -0
  675. package/dist/utils/text/unicode_digits.d.ts +3 -0
  676. package/dist/utils/text/unicode_digits.js +34 -0
  677. package/dist/utils/text/word_timestamp_utils.d.ts +26 -0
  678. package/dist/utils/text/word_timestamp_utils.js +52 -0
  679. package/dist/utils/time.d.ts +13 -0
  680. package/dist/utils/time.js +31 -0
  681. package/dist/utils/tracing/index.d.ts +3 -0
  682. package/dist/utils/tracing/index.js +8 -0
  683. package/dist/utils/tracing/service_attributes.d.ts +198 -0
  684. package/dist/utils/tracing/service_attributes.js +434 -0
  685. package/dist/utils/tracing/service_decorators.d.ts +214 -0
  686. package/dist/utils/tracing/service_decorators.js +1662 -0
  687. package/dist/utils/tracing/setup.d.ts +107 -0
  688. package/dist/utils/tracing/setup.js +160 -0
  689. package/dist/utils/tracing/tracing_context.d.ts +55 -0
  690. package/dist/utils/tracing/tracing_context.js +97 -0
  691. package/dist/utils/tracing/turn_trace_observer.d.ts +95 -0
  692. package/dist/utils/tracing/turn_trace_observer.js +233 -0
  693. package/dist/utils/types.d.ts +80 -0
  694. package/dist/utils/types.js +108 -0
  695. package/dist/utils/utils.d.ts +5 -0
  696. package/dist/utils/utils.js +22 -0
  697. package/dist/utils/yaml.d.ts +179 -0
  698. package/dist/utils/yaml.js +556 -0
  699. package/dist/version.d.ts +3 -0
  700. package/dist/version.js +7 -0
  701. package/dist/workers/base_worker.d.ts +772 -0
  702. package/dist/workers/base_worker.js +1298 -0
  703. package/dist/workers/index.d.ts +2 -0
  704. package/dist/workers/index.js +8 -0
  705. package/dist/workers/llm/backend_llm_worker.d.ts +552 -0
  706. package/dist/workers/llm/backend_llm_worker.js +1055 -0
  707. package/dist/workers/llm/index.d.ts +6 -0
  708. package/dist/workers/llm/index.js +11 -0
  709. package/dist/workers/llm/llm_context_worker.d.ts +66 -0
  710. package/dist/workers/llm/llm_context_worker.js +72 -0
  711. package/dist/workers/llm/llm_worker.d.ts +180 -0
  712. package/dist/workers/llm/llm_worker.js +323 -0
  713. package/dist/workers/llm/tool_decorator.d.ts +68 -0
  714. package/dist/workers/llm/tool_decorator.js +60 -0
  715. package/dist/workers/proxy/index.d.ts +3 -0
  716. package/dist/workers/proxy/index.js +9 -0
  717. package/dist/workers/proxy/websocket/client.d.ts +110 -0
  718. package/dist/workers/proxy/websocket/client.js +196 -0
  719. package/dist/workers/proxy/websocket/index.d.ts +3 -0
  720. package/dist/workers/proxy/websocket/index.js +10 -0
  721. package/dist/workers/runner.d.ts +268 -0
  722. package/dist/workers/runner.js +489 -0
  723. package/dist/workers/ui/index.d.ts +22 -0
  724. package/dist/workers/ui/index.js +27 -0
  725. package/dist/workers/ui/ui_event_decorator.d.ts +43 -0
  726. package/dist/workers/ui/ui_event_decorator.js +75 -0
  727. package/dist/workers/ui/ui_job_context.d.ts +12 -0
  728. package/dist/workers/ui/ui_job_context.js +17 -0
  729. package/dist/workers/ui/ui_prompts.d.ts +21 -0
  730. package/dist/workers/ui/ui_prompts.js +41 -0
  731. package/dist/workers/ui/ui_tools.d.ts +32 -0
  732. package/dist/workers/ui/ui_tools.js +112 -0
  733. package/dist/workers/ui/ui_worker.d.ts +571 -0
  734. package/dist/workers/ui/ui_worker.js +1156 -0
  735. package/package.json +61 -3
  736. package/README.md +0 -5
@@ -0,0 +1,189 @@
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/observers/turn_tracking_observer.py
6
+ /**
7
+ * Turn tracking observer for conversation flow monitoring.
8
+ *
9
+ * Provides an observer that monitors conversation turns in a pipeline,
10
+ * tracking when turns start and end based on user and bot speech patterns.
11
+ */
12
+ import { createTask, sleep } from "@pipedog/asyncio";
13
+ import { BotStartedSpeakingFrame, BotStoppedSpeakingFrame, CancelFrame, EndFrame, StartFrame, UserStartedSpeakingFrame, } from "../frames/frames.js";
14
+ import { logger } from "../utils/logger.js";
15
+ import { BaseObserver } from "./base_observer.js";
16
+ /**
17
+ * Observer that tracks conversation turns in a pipeline.
18
+ *
19
+ * This observer monitors the flow of conversation by tracking when turns
20
+ * start and end based on user and bot speaking patterns. It handles
21
+ * interruptions, timeouts, and maintains turn state throughout the pipeline.
22
+ *
23
+ * Turn tracking logic:
24
+ *
25
+ * - The first turn starts immediately when the pipeline starts (StartFrame)
26
+ * - Subsequent turns start when the user starts speaking
27
+ * - A turn ends when the bot stops speaking and either:
28
+ * - The user starts speaking again
29
+ * - A timeout period elapses with no more bot speech
30
+ *
31
+ * Events:
32
+ *
33
+ * - on_turn_started: Triggered when a turn starts, providing the turn number
34
+ * - on_turn_ended: Triggered when a turn ends, providing the turn number, the
35
+ * turn's duration in seconds, and whether it was interrupted
36
+ */
37
+ export class TurnTrackingObserver extends BaseObserver {
38
+ _turnCount = 0;
39
+ _isTurnActive = false;
40
+ _isBotSpeaking = false;
41
+ _hasBotSpoken = false;
42
+ _turnStartTime = 0;
43
+ _turnEndTimeoutSecs;
44
+ // Stands in for upstream's `loop.call_later` handle: a task that sleeps for
45
+ // the timeout and then ends the turn.
46
+ _endTurnTimer = null;
47
+ constructor(options = {}) {
48
+ super({ ...options, observeEveryPush: false });
49
+ this._turnEndTimeoutSecs = options.turnEndTimeoutSecs ?? 2.5;
50
+ this._registerEventHandler("on_turn_started");
51
+ this._registerEventHandler("on_turn_ended");
52
+ }
53
+ /**
54
+ * Process frame events for turn tracking.
55
+ *
56
+ * @param data Frame push event data containing the frame and metadata.
57
+ */
58
+ async onPushFrame(data) {
59
+ if (data.frame instanceof StartFrame) {
60
+ // Start the first turn immediately when the pipeline starts
61
+ if (this._turnCount === 0) {
62
+ await this._startTurn(data);
63
+ }
64
+ }
65
+ else if (data.frame instanceof UserStartedSpeakingFrame) {
66
+ await this._handleUserStartedSpeaking(data);
67
+ }
68
+ else if (data.frame instanceof BotStartedSpeakingFrame) {
69
+ await this._handleBotStartedSpeaking(data);
70
+ }
71
+ // A BotStoppedSpeakingFrame can arrive after a UserStartedSpeakingFrame
72
+ // following an interruption. We only want to end the turn if the bot was
73
+ // previously speaking.
74
+ else if (data.frame instanceof BotStoppedSpeakingFrame && this._isBotSpeaking) {
75
+ await this._handleBotStoppedSpeaking(data);
76
+ }
77
+ else if (data.frame instanceof EndFrame || data.frame instanceof CancelFrame) {
78
+ await this._handlePipelineEnd(data);
79
+ }
80
+ }
81
+ /**
82
+ * Cancel the pending turn end timer.
83
+ *
84
+ * The pipeline can be torn down before this observer receives its EndFrame
85
+ * or CancelFrame, and the timer's callback holds the pipeline until it fires.
86
+ */
87
+ async cleanup() {
88
+ this._cancelTurnEndTimer();
89
+ await super.cleanup();
90
+ }
91
+ /** Schedule turn end with a timeout. */
92
+ _scheduleTurnEnd(data) {
93
+ // Cancel any existing timer
94
+ this._cancelTurnEndTimer();
95
+ // Create a new timer
96
+ const timer = createTask(async () => {
97
+ await sleep(this._turnEndTimeoutSecs);
98
+ // The timer has fired: like a `call_later` handle, cancelling it from
99
+ // now on no longer stops the callback.
100
+ if (this._endTurnTimer === timer) {
101
+ this._endTurnTimer = null;
102
+ }
103
+ await this._endTurnAfterTimeout(data);
104
+ }, "TurnTrackingObserver::_end_turn_after_timeout");
105
+ this._endTurnTimer = timer;
106
+ }
107
+ /** Cancel the turn end timer if it exists. */
108
+ _cancelTurnEndTimer() {
109
+ if (this._endTurnTimer) {
110
+ this._endTurnTimer.cancel();
111
+ this._endTurnTimer = null;
112
+ }
113
+ }
114
+ /** End turn after timeout has expired. */
115
+ async _endTurnAfterTimeout(data) {
116
+ if (this._isTurnActive && !this._isBotSpeaking) {
117
+ logger.trace(`Turn ${this._turnCount} ending due to timeout`);
118
+ await this._endTurn(data, false);
119
+ this._endTurnTimer = null;
120
+ }
121
+ }
122
+ /** Handle user speaking events, including interruptions. */
123
+ async _handleUserStartedSpeaking(data) {
124
+ if (this._isBotSpeaking) {
125
+ // Handle interruption - end current turn and start a new one
126
+ this._cancelTurnEndTimer(); // Cancel any pending end turn timer
127
+ await this._endTurn(data, true);
128
+ this._isBotSpeaking = false; // Bot is considered interrupted
129
+ await this._startTurn(data);
130
+ }
131
+ else if (this._isTurnActive && this._hasBotSpoken) {
132
+ // User started speaking during the turnEndTimeoutSecs period after bot speech
133
+ this._cancelTurnEndTimer(); // Cancel any pending end turn timer
134
+ await this._endTurn(data, false);
135
+ await this._startTurn(data);
136
+ }
137
+ else if (!this._isTurnActive) {
138
+ // Start a new turn after previous one ended
139
+ await this._startTurn(data);
140
+ }
141
+ else {
142
+ // User is speaking within the same turn (before bot has responded)
143
+ logger.trace(`User is already speaking in Turn ${this._turnCount}`);
144
+ }
145
+ }
146
+ /** Handle bot speaking events. */
147
+ async _handleBotStartedSpeaking(_data) {
148
+ this._isBotSpeaking = true;
149
+ this._hasBotSpoken = true;
150
+ // Cancel any pending turn end timer when bot starts speaking again
151
+ this._cancelTurnEndTimer();
152
+ }
153
+ /** Handle bot stopped speaking events. */
154
+ async _handleBotStoppedSpeaking(data) {
155
+ this._isBotSpeaking = false;
156
+ // Schedule turn end with timeout.
157
+ // This is needed to handle cases where the bot's speech ends and then
158
+ // resumes. This can happen with HTTP TTS services or function calls.
159
+ this._scheduleTurnEnd(data);
160
+ }
161
+ /** Handle pipeline end or cancellation by flushing any active turn. */
162
+ async _handlePipelineEnd(data) {
163
+ this._cancelTurnEndTimer();
164
+ if (this._isTurnActive) {
165
+ await this._endTurn(data, true);
166
+ }
167
+ }
168
+ /** Start a new turn. */
169
+ async _startTurn(data) {
170
+ this._isTurnActive = true;
171
+ this._hasBotSpoken = false;
172
+ this._turnCount += 1;
173
+ this._turnStartTime = data.timestamp;
174
+ logger.trace(`Turn ${this._turnCount} started`);
175
+ await this._callEventHandler("on_turn_started", this._turnCount);
176
+ }
177
+ /** End the current turn. */
178
+ async _endTurn(data, wasInterrupted) {
179
+ if (!this._isTurnActive) {
180
+ return;
181
+ }
182
+ const duration = (data.timestamp - this._turnStartTime) / 1_000_000_000; // Convert to seconds
183
+ this._isTurnActive = false;
184
+ const status = wasInterrupted ? "interrupted" : "completed";
185
+ logger.trace(`Turn ${this._turnCount} ${status} after ${duration.toFixed(2)}s`);
186
+ await this._callEventHandler("on_turn_ended", this._turnCount, duration, wasInterrupted);
187
+ }
188
+ }
189
+ //# sourceMappingURL=turn_tracking_observer.js.map
@@ -0,0 +1,411 @@
1
+ import { MetricsFrame } from "../frames/frames.ts";
2
+ import { BaseObserver, type BaseObserverOptions, type FramePushed } from "./base_observer.ts";
3
+ export interface TTFBBreakdownMetricsOptions {
4
+ processor: string;
5
+ model?: string | null;
6
+ startTime: number;
7
+ durationSecs: number;
8
+ }
9
+ /**
10
+ * TTFB measurement with timestamp for timeline placement.
11
+ *
12
+ * - `processor`: name of the processor that reported the TTFB.
13
+ * - `model`: optional model name associated with the metric.
14
+ * - `startTime`: Unix timestamp (seconds) when the TTFB measurement started.
15
+ * - `durationSecs`: TTFB duration in seconds.
16
+ */
17
+ export declare class TTFBBreakdownMetrics {
18
+ processor: string;
19
+ model: string | null;
20
+ startTime: number;
21
+ durationSecs: number;
22
+ constructor(options: TTFBBreakdownMetricsOptions);
23
+ }
24
+ export interface TextAggregationBreakdownMetricsOptions {
25
+ processor: string;
26
+ startTime: number;
27
+ durationSecs: number;
28
+ }
29
+ /**
30
+ * Text aggregation measurement with timestamp for timeline placement.
31
+ *
32
+ * - `processor`: name of the processor that reported the metric.
33
+ * - `startTime`: Unix timestamp (seconds) when text aggregation started.
34
+ * - `durationSecs`: aggregation duration in seconds.
35
+ */
36
+ export declare class TextAggregationBreakdownMetrics {
37
+ processor: string;
38
+ startTime: number;
39
+ durationSecs: number;
40
+ constructor(options: TextAggregationBreakdownMetricsOptions);
41
+ }
42
+ export interface FunctionCallMetricsOptions {
43
+ functionName: string;
44
+ startTime: number;
45
+ durationSecs: number;
46
+ }
47
+ /**
48
+ * Latency for a single function call execution.
49
+ *
50
+ * - `functionName`: name of the function that was called.
51
+ * - `startTime`: Unix timestamp (seconds) when execution started.
52
+ * - `durationSecs`: time in seconds from execution start to result.
53
+ */
54
+ export declare class FunctionCallMetrics {
55
+ functionName: string;
56
+ startTime: number;
57
+ durationSecs: number;
58
+ constructor(options: FunctionCallMetricsOptions);
59
+ }
60
+ /**
61
+ * Anything shorter than this is a frame hop rather than work worth naming, so
62
+ * it is rolled into the single pipeline contribution.
63
+ */
64
+ export declare const MIN_CONTRIBUTION_SECS = 0.005;
65
+ /**
66
+ * Half of the last digit `turnContributionLines()` prints, below which a span
67
+ * would show as zero and so is not part of the timeline at all.
68
+ */
69
+ export declare const PRINTS_AS_ZERO_SECS = 0.0005;
70
+ /**
71
+ * A point in a user-to-bot cycle that a contribution can start or end at.
72
+ *
73
+ * Most are observed as frames. `LLM_CHUNK` and `SENTENCE` are worked back from
74
+ * a service's own metric, because no frame marks them.
75
+ */
76
+ declare const _MomentKind: {
77
+ readonly SILENCE: "silence";
78
+ readonly READY: "ready";
79
+ readonly VAD_STOP: "vad stop";
80
+ readonly TRANSCRIPT: "transcript";
81
+ readonly LLM_REQUEST: "llm request";
82
+ readonly LLM_CHUNK: "llm chunk";
83
+ readonly MARKER_COMPLETE: "marker complete";
84
+ readonly MARKER_INCOMPLETE: "marker incomplete";
85
+ readonly HANDLERS_START: "handlers start";
86
+ readonly HANDLERS_END: "handlers end";
87
+ readonly FIRST_TEXT: "first text";
88
+ readonly SENTENCE: "sentence";
89
+ readonly FIRST_AUDIO: "first audio";
90
+ readonly BOT_SPEAKING: "bot speaking";
91
+ };
92
+ type _MomentKind = (typeof _MomentKind)[keyof typeof _MomentKind];
93
+ /**
94
+ * One moment in a cycle.
95
+ *
96
+ * - `at`: Unix timestamp (seconds) of the moment.
97
+ * - `kind`: what happened.
98
+ * - `source`: name of whatever produced it, used when a span takes its owner
99
+ * from one end.
100
+ * - `derived`: whether it was worked back from a metric rather than observed
101
+ * as a frame. A derived moment sits at or before the frame that reported
102
+ * it, which decides the order when the two share a time.
103
+ */
104
+ declare class _Moment {
105
+ readonly at: number;
106
+ readonly kind: _MomentKind;
107
+ readonly source: string;
108
+ readonly derived: boolean;
109
+ constructor(options: {
110
+ at: number;
111
+ kind: _MomentKind;
112
+ source?: string;
113
+ derived?: boolean;
114
+ });
115
+ }
116
+ /**
117
+ * Where a measured interval was anchored.
118
+ *
119
+ * A greeting is timed from the client connecting, a turn from the user
120
+ * falling silent, so a partial interval is never mistaken for a whole one.
121
+ */
122
+ export declare const MeasuredFrom: {
123
+ readonly USER_SILENCE: "user_silence";
124
+ readonly CLIENT_CONNECTED: "client_connected";
125
+ };
126
+ export type MeasuredFrom = (typeof MeasuredFrom)[keyof typeof MeasuredFrom];
127
+ /**
128
+ * What kind of thing a contribution's owner is.
129
+ *
130
+ * Grouping on this answers where a turn's time went without matching on the
131
+ * owner's name: a service that could be swapped, a setting the bot chose, the
132
+ * bot's own code, or the pipeline between them.
133
+ */
134
+ export declare const LatencyOwnerKind: {
135
+ readonly SERVICE: "service";
136
+ readonly SETTING: "setting";
137
+ readonly BOT: "bot";
138
+ readonly PIPELINE: "pipeline";
139
+ };
140
+ export type LatencyOwnerKind = (typeof LatencyOwnerKind)[keyof typeof LatencyOwnerKind];
141
+ export interface LatencyContributionOptions {
142
+ key: string;
143
+ label: string;
144
+ owner: string;
145
+ ownerKind: LatencyOwnerKind;
146
+ startTime: number;
147
+ durationSecs: number;
148
+ }
149
+ /**
150
+ * One named part of the user-to-bot interval.
151
+ *
152
+ * Contributions account for the whole interval, so their durations sum to the
153
+ * measured latency. Unlike a TTFB, which reports what a service spent once it
154
+ * was asked, a contribution can also name time no service is measuring: the
155
+ * silence a VAD waits out, the tokens a turn-completion marker occupies before
156
+ * any speakable text, or a hold while the pipeline waits for the user to
157
+ * finish a sentence.
158
+ *
159
+ * - `key`: stable identifier for this part of a turn. Unlike `label`, it is
160
+ * safe to group on: it survives the label being reworded.
161
+ * - `label`: what the time was spent on.
162
+ * - `owner`: what spent it — a processor name, or a `config:` tag naming the
163
+ * setting that governs it.
164
+ * - `ownerKind`: what kind of thing the owner is.
165
+ * - `startTime`: Unix timestamp (seconds) when it started.
166
+ * - `durationSecs`: how long it took, in seconds.
167
+ */
168
+ export declare class LatencyContribution {
169
+ key: string;
170
+ label: string;
171
+ owner: string;
172
+ ownerKind: LatencyOwnerKind;
173
+ startTime: number;
174
+ durationSecs: number;
175
+ constructor(options: LatencyContributionOptions);
176
+ }
177
+ export interface LatencyBreakdownOptions {
178
+ ttfb?: TTFBBreakdownMetrics[];
179
+ contributions?: LatencyContribution[];
180
+ measuredFrom?: MeasuredFrom | null;
181
+ totalSecs?: number;
182
+ textAggregation?: TextAggregationBreakdownMetrics | null;
183
+ userTurnStartTime?: number | null;
184
+ userTurnSecs?: number | null;
185
+ functionCalls?: FunctionCallMetrics[];
186
+ }
187
+ /**
188
+ * Per-service latency breakdown for a single user-to-bot cycle.
189
+ *
190
+ * Collected between `VADUserStoppedSpeakingFrame` and
191
+ * `BotStartedSpeakingFrame` when `enableMetrics` is true in `PipelineParams`.
192
+ *
193
+ * - `ttfb`: time-to-first-byte metrics from each service in the pipeline.
194
+ * - `textAggregation`: first text aggregation measurement, representing the
195
+ * latency cost of sentence aggregation in the TTS pipeline.
196
+ * - `userTurnStartTime`: Unix timestamp when the user turn started (actual
197
+ * user silence, adjusted for VAD stop_secs). null if no
198
+ * `VADUserStoppedSpeakingFrame` was observed.
199
+ * - `userTurnSecs`: duration in seconds of the user's turn, measured from
200
+ * when the user actually stopped speaking to when the turn was released
201
+ * (`UserStoppedSpeakingFrame`). This includes VAD silence detection, STT
202
+ * finalization, and any turn analyzer wait. null if no
203
+ * `UserStoppedSpeakingFrame` was observed (e.g. no turn analyzer
204
+ * configured).
205
+ * - `functionCalls`: latency for each function call executed during this
206
+ * cycle. Empty if no function calls occurred.
207
+ * - `contributions`: named parts of the interval, in chronological order,
208
+ * summing to the measured latency. A part is listed only if it happened, so
209
+ * a bot without turn completion has no marker or wait entries.
210
+ * - `measuredFrom`: where the interval was anchored, so a greeting is not
211
+ * compared with a turn.
212
+ * - `totalSecs`: the measured interval, which the contributions sum to.
213
+ */
214
+ export declare class LatencyBreakdown {
215
+ ttfb: TTFBBreakdownMetrics[];
216
+ contributions: LatencyContribution[];
217
+ measuredFrom: MeasuredFrom | null;
218
+ totalSecs: number;
219
+ textAggregation: TextAggregationBreakdownMetrics | null;
220
+ userTurnStartTime: number | null;
221
+ userTurnSecs: number | null;
222
+ functionCalls: FunctionCallMetrics[];
223
+ constructor(options?: LatencyBreakdownOptions);
224
+ /**
225
+ * Format the contributions for logging, one per line plus a total.
226
+ *
227
+ * One breakdown covers one user-to-bot cycle, so these lines describe a
228
+ * single turn — or, for the first thing the bot says, the wait before it
229
+ * from the pipeline being ready with a client on it, which the total line
230
+ * names.
231
+ *
232
+ * @param options.byCost Order by duration, largest first, rather than in
233
+ * the order things happened. Useful when the question is what to optimize
234
+ * rather than what the turn did.
235
+ * @returns One formatted line per contribution, then a total line. Empty if
236
+ * no contributions were collected.
237
+ */
238
+ turnContributionLines(options?: {
239
+ byCost?: boolean;
240
+ }): string[];
241
+ }
242
+ export interface UserBotLatencyObserverOptions extends BaseObserverOptions {
243
+ /**
244
+ * Contributions shorter than this are rolled into the single pipeline entry
245
+ * rather than listed. Pass 0 to list every one, including individual frame
246
+ * hops.
247
+ */
248
+ minContributionSecs?: number;
249
+ /**
250
+ * Reads the current time in seconds. Supplying one lets a test drive a
251
+ * cycle without waiting out the intervals it describes.
252
+ */
253
+ timeSource?: () => number;
254
+ }
255
+ /**
256
+ * Observer that tracks user-to-bot response latency.
257
+ *
258
+ * Measures the time between when a user stops speaking
259
+ * (VADUserStoppedSpeakingFrame) and when the bot starts speaking
260
+ * (BotStartedSpeakingFrame). Emits events when latency is measured, allowing
261
+ * consumers to log, trace, or otherwise process the latency data.
262
+ *
263
+ * When `enableMetrics` is true in pipeline params, also collects a latency
264
+ * breakdown and emits an `on_latency_breakdown` event alongside the existing
265
+ * latency measurement. The breakdown carries per-service metrics (TTFB, text
266
+ * aggregation) and, in `contributions`, the whole interval named part by part:
267
+ *
268
+ * @example
269
+ * for (const line of breakdown.turnContributionLines()) {
270
+ * logger.info(line);
271
+ * }
272
+ * // 0.200s endpointing wait [config: VAD stop_secs]
273
+ * // 0.125s transcription [DeepgramSTTService#0]
274
+ * // 0.336s LLM inference [OpenAILLMService#0]
275
+ * // 0.359s speech synthesis [CartesiaTTSService#0]
276
+ * // 1.020s TOTAL
277
+ *
278
+ * This observer follows the composition pattern used by
279
+ * TurnTrackingObserver, acting as a reusable component for latency
280
+ * measurement.
281
+ *
282
+ * Events:
283
+ *
284
+ * - on_latency_measured(observer, latencySeconds): emitted when
285
+ * time-to-first-bot-speech is calculated. Measures the time from when the
286
+ * user stopped speaking to when the bot starts speaking.
287
+ * - on_latency_breakdown(observer, breakdown): emitted at each
288
+ * `BotStartedSpeakingFrame` with a `LatencyBreakdown` containing
289
+ * per-service metrics collected during the user→bot cycle.
290
+ * - on_first_bot_speech_latency(observer, latencySeconds): emitted once, the
291
+ * first time `BotStartedSpeakingFrame` arrives after `ClientConnectedFrame`.
292
+ * Measures the time from client connection to the first bot speech.
293
+ */
294
+ export declare class UserBotLatencyObserver extends BaseObserver {
295
+ protected _minContributionSecs: number;
296
+ protected _now: () => number;
297
+ protected _userStoppedTime: number | null;
298
+ protected _userTurnStartTime: number | null;
299
+ protected _userTurn: number | null;
300
+ protected _clientConnectedTime: number | null;
301
+ protected _pipelineStartedTime: number | null;
302
+ protected _firstBotSpeechMeasured: boolean;
303
+ protected _moments: _Moment[];
304
+ protected _llmRequest: _Moment | null;
305
+ protected _markersSeen: boolean;
306
+ protected _ttfb: TTFBBreakdownMetrics[];
307
+ protected _textAggregation: TextAggregationBreakdownMetrics | null;
308
+ protected _functionCallStarts: Map<string, [string, number]>;
309
+ protected _functionCallMetrics: FunctionCallMetrics[];
310
+ /**
311
+ * Initialize the user-bot latency observer.
312
+ *
313
+ * @param options.minContributionSecs Contributions shorter than this are
314
+ * rolled into the single pipeline entry rather than listed.
315
+ * @param options.timeSource Reads the current time in seconds.
316
+ */
317
+ constructor(options?: UserBotLatencyObserverOptions);
318
+ /**
319
+ * Record that the pipeline finished starting.
320
+ *
321
+ * The `StartFrame` has reached every processor by now, which is where
322
+ * `StartupTimingObserver` stops measuring. A greeting is timed from here so
323
+ * the two reports meet rather than overlap.
324
+ */
325
+ onPipelineStarted(): Promise<void>;
326
+ /**
327
+ * Process frames to track speech timing and calculate latency.
328
+ *
329
+ * Tracks VAD events and bot speaking events to measure the time between
330
+ * user stopping speech and bot starting speech. Also accumulates metrics
331
+ * from MetricsFrame for the latency breakdown.
332
+ *
333
+ * @param data Frame push event containing the frame and direction information.
334
+ */
335
+ onPushFrame(data: FramePushed): Promise<void>;
336
+ /**
337
+ * Record a moment, if a cycle is being measured.
338
+ *
339
+ * @param kind What happened.
340
+ * @param options.at When, defaulting to now. Derived moments pass their own time.
341
+ * @param options.source Name of whatever produced it.
342
+ * @param options.once Keep only the first of this kind, for frames that
343
+ * repeat within a cycle such as text and audio.
344
+ * @param options.derived Whether it comes from a metric rather than from a frame.
345
+ * @returns The recorded moment, or null if it was not recorded.
346
+ */
347
+ protected _mark(kind: _MomentKind, options?: {
348
+ at?: number | null;
349
+ source?: string;
350
+ once?: boolean;
351
+ derived?: boolean;
352
+ }): _Moment | null;
353
+ /** Whether a moment of this kind has been recorded this cycle. */
354
+ protected _seen(kind: _MomentKind): boolean;
355
+ /** Whether a cycle is open: a user turn, or the wait for the greeting. */
356
+ protected get _measuring(): boolean;
357
+ /**
358
+ * Moments that come from metrics rather than from frames.
359
+ *
360
+ * Handlers dispatched together run concurrently, so they become one pair of
361
+ * moments named for the one the wait actually depends on: listing each
362
+ * would count the same stretch of wall clock more than once.
363
+ *
364
+ * @returns The sentence-aggregation and function-handler moments, if any.
365
+ */
366
+ protected _derivedMoments(): _Moment[];
367
+ /**
368
+ * Group function handlers whose executions overlap in time.
369
+ *
370
+ * @returns Groups of overlapping calls, in the order they started.
371
+ */
372
+ protected _concurrentHandlers(): FunctionCallMetrics[][];
373
+ /**
374
+ * Name each stretch between one moment and the next.
375
+ *
376
+ * Spans run from one moment to the following one, so they tile the cycle
377
+ * and cannot overlap. A stretch whose pair of moments has no entry in the
378
+ * table is left unnamed and reported as pipeline time, which is what makes
379
+ * a gap in the accounting visible rather than silently absorbed.
380
+ *
381
+ * @returns Contributions in chronological order, or empty if the cycle was
382
+ * never measured.
383
+ */
384
+ protected _buildContributions(): LatencyContribution[];
385
+ /**
386
+ * Join neighbouring spans that say the same thing.
387
+ *
388
+ * A marker sits in the middle of what a reader thinks of as one stretch, so
389
+ * the table names both halves the same way and they are joined here. Only
390
+ * spans that meet are joined: two of the same name either side of an
391
+ * unnamed gap stay apart, so the gap is reported rather than absorbed.
392
+ *
393
+ * @param spans Contributions in chronological order.
394
+ * @returns The same coverage, with runs of one label and owner joined.
395
+ */
396
+ protected static _mergeAdjacent(spans: LatencyContribution[]): LatencyContribution[];
397
+ /** Handle BotStartedSpeakingFrame to emit latency and breakdown. */
398
+ protected _handleBotStartedSpeaking(): Promise<void>;
399
+ /**
400
+ * Extract latency metrics from a MetricsFrame.
401
+ *
402
+ * Accumulates metrics when a measurement is in progress: either a user→bot
403
+ * cycle (after `VADUserStoppedSpeakingFrame`) or the first-bot-speech
404
+ * window (after `ClientConnectedFrame`).
405
+ */
406
+ protected _handleMetricsFrame(frame: MetricsFrame): void;
407
+ /** Clear per-cycle metric accumulators. */
408
+ protected _resetAccumulators(): void;
409
+ }
410
+ export {};
411
+ //# sourceMappingURL=user_bot_latency_observer.d.ts.map