@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,478 @@
1
+ // Copyright (c) 2024-2026, Daily
2
+ // Copyright (c) 2026, pipedog contributors
3
+ // SPDX-License-Identifier: BSD-2-Clause
4
+ //
5
+ // Ported from pipecat: src/pipecat/utils/text/pattern_pair_aggregator.py
6
+ /**
7
+ * Pattern pair aggregator for processing structured content in streaming text.
8
+ *
9
+ * This module provides an aggregator that identifies and processes content between
10
+ * pattern pairs (like XML tags or custom delimiters) in streaming text, with
11
+ * support for custom handlers and configurable actions for when a pattern is found.
12
+ */
13
+ import { rethrowIfCancelled } from "@pipedog/asyncio";
14
+ import { logger } from "../logger.js";
15
+ import { longestTrailingPartialMatch } from "../string.js";
16
+ import { Aggregation, TextType } from "./base_text_aggregator.js";
17
+ import { SimpleTextAggregator, } from "./simple_text_aggregator.js";
18
+ /**
19
+ * Actions to take when a pattern pair is matched.
20
+ *
21
+ * - `REMOVE`: The text along with its delimiters will be removed from the streaming text.
22
+ * Sentence aggregation will continue on as if this text did not exist.
23
+ * - `KEEP`: The delimiters will be removed, but the content between them will be kept.
24
+ * Sentence aggregation will continue on with the internal text included.
25
+ * - `AGGREGATE`: The delimiters will be removed and the content between will be treated
26
+ * as a separate aggregation. Any text before the start of the pattern will be
27
+ * returned early, whether or not a complete sentence was found. Then the pattern
28
+ * will be returned. Then the aggregation will continue on sentence matching after
29
+ * the closing delimiter is found. The content between the delimiters is not
30
+ * aggregated by sentence. It is aggregated as one single block of text.
31
+ */
32
+ export const MatchAction = {
33
+ REMOVE: "remove",
34
+ KEEP: "keep",
35
+ AGGREGATE: "aggregate",
36
+ };
37
+ /**
38
+ * Represents a matched pattern pair with its content.
39
+ *
40
+ * A PatternMatch object is created when a complete pattern pair is found
41
+ * in the text. It contains information about which pattern was matched,
42
+ * the full matched text (including start and end patterns), and the
43
+ * content between the patterns.
44
+ */
45
+ export class PatternMatch extends Aggregation {
46
+ fullMatch;
47
+ /** Initialize a pattern match. */
48
+ constructor(options) {
49
+ super({ text: options.content, type: options.type });
50
+ this.fullMatch = options.fullMatch;
51
+ }
52
+ /**
53
+ * Return a string representation of the pattern match.
54
+ *
55
+ * @returns A descriptive string showing the pattern type and content.
56
+ */
57
+ toString() {
58
+ return `PatternMatch(type=${this.type}, text=${this.text}, full_match=${this.fullMatch})`;
59
+ }
60
+ }
61
+ /** Python `re.escape`. */
62
+ function escapeRegex(text) {
63
+ return text.replace(/[.*+?^${}()|[\]\\/-]/g, "\\$&");
64
+ }
65
+ /** Python `str.count`: non-overlapping occurrences of `sub` in `text`. */
66
+ function countOccurrences(text, sub) {
67
+ if (!sub)
68
+ return text.length + 1;
69
+ let count = 0;
70
+ let index = text.indexOf(sub);
71
+ while (index !== -1) {
72
+ count++;
73
+ index = text.indexOf(sub, index + sub.length);
74
+ }
75
+ return count;
76
+ }
77
+ function patternRegex(start, end) {
78
+ // The .*? is non-greedy to handle nested patterns
79
+ return new RegExp(`${escapeRegex(start)}(.*?)${escapeRegex(end)}`, "gs");
80
+ }
81
+ /**
82
+ * Aggregator that identifies and processes content between pattern pairs.
83
+ *
84
+ * This aggregator buffers text until it can identify complete pattern pairs
85
+ * (defined by start and end patterns), processes the content between these
86
+ * patterns using registered handlers. By default, its aggregation method
87
+ * returns text at sentence boundaries, and remove the content found between
88
+ * any matched patterns. However, matched patterns can also be configured to
89
+ * returned as a separate aggregation object containing the content between
90
+ * their start and end patterns or left in, so that only the delimiters are
91
+ * removed and a callback can be triggered.
92
+ *
93
+ * This aggregator is particularly useful for processing structured content in
94
+ * streaming text, such as XML tags, markdown formatting, or custom delimiters.
95
+ *
96
+ * The aggregator ensures that patterns spanning multiple text chunks are
97
+ * correctly identified.
98
+ */
99
+ export class PatternPairAggregator extends SimpleTextAggregator {
100
+ _patterns = new Map();
101
+ _handlers = new Map();
102
+ // Track where we last checked for complete patterns
103
+ _lastProcessedPosition = 0;
104
+ /**
105
+ * Initialize the pattern pair aggregator.
106
+ *
107
+ * Creates an empty aggregator with no patterns or handlers registered.
108
+ * Text buffering and pattern detection will begin when text is aggregated.
109
+ *
110
+ * @param options Additional arguments passed to SimpleTextAggregator (e.g. aggregationType).
111
+ */
112
+ constructor(options = {}) {
113
+ super(options);
114
+ }
115
+ /**
116
+ * Get the currently aggregated text.
117
+ *
118
+ * @returns The text that has been accumulated in the buffer.
119
+ */
120
+ get text() {
121
+ const patternStart = this._matchStartOfPattern(this._text);
122
+ const strippedText = this._text.trim();
123
+ const type = patternStart ? (patternStart[1].type ?? TextType.SENTENCE) : TextType.SENTENCE;
124
+ return new Aggregation({ text: strippedText, type });
125
+ }
126
+ /**
127
+ * Add a pattern pair to detect in the text.
128
+ *
129
+ * Registers a new pattern pair with a unique identifier. The aggregator
130
+ * will look for text that starts with the start pattern and ends with
131
+ * the end pattern, and treat the content between them as a match.
132
+ *
133
+ * @param type Identifier for this pattern pair. Should be unique and ideally descriptive.
134
+ * (e.g., 'code', 'speaker', 'custom'). type can not be 'sentence' or 'word' as
135
+ * those are reserved for the default behavior.
136
+ * @param startPattern Pattern that marks the beginning of content.
137
+ * @param endPattern Pattern that marks the end of content.
138
+ * @param action What to do when a complete pattern is matched.
139
+ *
140
+ * - `MatchAction.REMOVE`: Remove the matched pattern from the text.
141
+ * - `MatchAction.KEEP`: Keep the matched pattern in the text and treat it as
142
+ * normal text. This allows you to register handlers for the pattern without
143
+ * affecting the aggregation logic.
144
+ * - `MatchAction.AGGREGATE`: Return the matched pattern as a separate aggregation object.
145
+ * @returns Self for method chaining.
146
+ * @throws Error If `type` is reserved (upstream: ValueError).
147
+ */
148
+ addPattern(type, startPattern, endPattern, action = MatchAction.REMOVE) {
149
+ if (type === TextType.SENTENCE || type === TextType.WORD || type === TextType.TOKEN) {
150
+ throw new Error(`The text type '${type}' is reserved for default behavior and can not be used for custom patterns.`);
151
+ }
152
+ this._patterns.set(type, { start: startPattern, end: endPattern, type, action });
153
+ return this;
154
+ }
155
+ /**
156
+ * Register a handler for when a pattern pair is matched.
157
+ *
158
+ * The handler will be called whenever a complete match for the
159
+ * specified type is found in the text.
160
+ *
161
+ * @param type The type of the pattern pair to trigger the handler.
162
+ * @param handler Async function to call when pattern is matched.
163
+ * The function should accept a PatternMatch object.
164
+ * @returns Self for method chaining.
165
+ */
166
+ onPatternMatch(type, handler) {
167
+ this._handlers.set(type, handler);
168
+ return this;
169
+ }
170
+ /**
171
+ * Process newly complete pattern pairs in the text.
172
+ *
173
+ * Searches for pattern pairs that have been completed since lastProcessedPosition,
174
+ * calls the appropriate handlers, and optionally removes the matches.
175
+ *
176
+ * @param text The text to process for pattern matches.
177
+ * @param lastProcessedPosition The position in text that was already processed.
178
+ * Only patterns that end at or after this position will be processed.
179
+ * @returns Tuple of [allMatches, processedText] where:
180
+ *
181
+ * - allMatches is a list of all pattern matches found. Note: There really should only ever be 1.
182
+ * - processedText is the text after processing patterns. If no patterns are
183
+ * found, it will be the same as input text.
184
+ */
185
+ async _processCompletePatterns(text, lastProcessedPosition = 0) {
186
+ const allMatches = [];
187
+ let processedText = text;
188
+ for (const [type, patternInfo] of this._patterns) {
189
+ const action = patternInfo.action;
190
+ // Create regex to match from start pattern to end pattern, and find all
191
+ // matches (converted to a list for safe iteration).
192
+ const matches = [...processedText.matchAll(patternRegex(patternInfo.start, patternInfo.end))];
193
+ for (const match of matches) {
194
+ const content = match[1]; // Content between patterns
195
+ const fullMatch = match[0]; // Full match including patterns
196
+ // Create pattern match object
197
+ const patternMatch = new PatternMatch({ content: content.trim(), type, fullMatch });
198
+ // Check if this pattern was already processed
199
+ const alreadyProcessed = (match.index ?? 0) + fullMatch.length <= lastProcessedPosition;
200
+ // Only call handler for newly completed patterns
201
+ const handler = this._handlers.get(type);
202
+ if (!alreadyProcessed && handler) {
203
+ try {
204
+ await handler(patternMatch);
205
+ }
206
+ catch (e) {
207
+ rethrowIfCancelled(e);
208
+ logger.error(`Error in pattern handler for ${type}: ${e instanceof Error ? e.message : e}`);
209
+ }
210
+ }
211
+ // Handle pattern based on action
212
+ if (action === MatchAction.REMOVE) {
213
+ // Remove patterns are only removed once (when newly completed)
214
+ if (!alreadyProcessed) {
215
+ processedText = processedText.replace(fullMatch, () => "");
216
+ }
217
+ }
218
+ else {
219
+ // KEEP/AGGREGATE patterns stay in allMatches
220
+ allMatches.push(patternMatch);
221
+ }
222
+ }
223
+ }
224
+ return [allMatches, processedText];
225
+ }
226
+ /**
227
+ * Check if text contains incomplete pattern pairs.
228
+ *
229
+ * Determines whether the text contains any start patterns without
230
+ * matching end patterns, which would indicate incomplete content.
231
+ *
232
+ * @param text The text to check for incomplete patterns.
233
+ * @returns A tuple of [startIndex, patternInfo] if an incomplete pattern is found,
234
+ * or null if no patterns are found or all patterns are complete.
235
+ */
236
+ _matchStartOfPattern(text) {
237
+ for (const patternInfo of this._patterns.values()) {
238
+ const start = patternInfo.start;
239
+ const end = patternInfo.end;
240
+ // Count occurrences
241
+ const startCount = countOccurrences(text, start);
242
+ const endCount = countOccurrences(text, end);
243
+ // If there are more starts than ends, we have incomplete patterns
244
+ // Again, this is written generically but there only ever should
245
+ // be one pattern active at a time, so the counts should be 0 or 1.
246
+ // Which is why we base the return on the first found.
247
+ if (startCount > endCount) {
248
+ const startIndex = text.indexOf(start);
249
+ return [startIndex, patternInfo];
250
+ }
251
+ }
252
+ return null;
253
+ }
254
+ /**
255
+ * Aggregate text and process pattern pairs.
256
+ *
257
+ * Processes the input text character-by-character, handles pattern pairs,
258
+ * and uses the parent's lookahead logic for sentence detection when no
259
+ * patterns are active.
260
+ *
261
+ * In TOKEN mode, pattern detection still works but non-pattern text is
262
+ * yielded as TOKEN aggregations instead of waiting for sentence boundaries.
263
+ * Text ending in a partial start delimiter (e.g. `<thin` of `<think>`) is
264
+ * held back until a later chunk determines whether it begins a pattern, so
265
+ * a delimiter split across chunks is still recognized.
266
+ *
267
+ * @param text Text to aggregate.
268
+ * @returns PatternMatch objects as patterns complete or sentences are detected.
269
+ */
270
+ async *aggregate(text) {
271
+ // Process text character by character
272
+ for (const char of text) {
273
+ this._text += char;
274
+ // Process any newly complete patterns in the buffer
275
+ // Only patterns that complete after _lastProcessedPosition will trigger handlers
276
+ const [patterns, processedText] = await this._processCompletePatterns(this._text, this._lastProcessedPosition);
277
+ // Update the last processed position to prevent re-processing patterns
278
+ // This tracks where in the buffer we've already called handlers, so we
279
+ // only trigger handlers once when a pattern completes
280
+ this._lastProcessedPosition = this._text.length;
281
+ this._text = processedText;
282
+ if (patterns.length > 0) {
283
+ const first = patterns[0];
284
+ if (patterns.length > 1) {
285
+ logger.warning(`Multiple patterns matched: ${JSON.stringify(patterns.map((p) => p.type))}. Only the first pattern will be returned.`);
286
+ }
287
+ // If the pattern found is set to be aggregated, return it
288
+ const action = this._patterns.get(first.type)?.action ?? MatchAction.REMOVE;
289
+ if (action === MatchAction.AGGREGATE) {
290
+ this._text = "";
291
+ yield first;
292
+ continue;
293
+ }
294
+ }
295
+ // Check if we have incomplete patterns
296
+ const patternStart = this._matchStartOfPattern(this._text);
297
+ if (patternStart !== null) {
298
+ // If the start pattern is at the beginning or should not be separately aggregated, continue
299
+ if (patternStart[0] === 0 ||
300
+ (patternStart[1].action ?? MatchAction.REMOVE) !== MatchAction.AGGREGATE) {
301
+ continue;
302
+ }
303
+ // For AGGREGATE patterns: yield any text before the pattern starts
304
+ // This ensures text doesn't get stuck in the buffer waiting for sentence
305
+ // boundaries when a pattern begins (e.g., "Here is code <code>..." yields "Here is code")
306
+ const result = this._text.slice(0, patternStart[0]);
307
+ this._text = this._text.slice(patternStart[0]);
308
+ const aggType = this._aggregationType === TextType.TOKEN ? TextType.TOKEN : TextType.SENTENCE;
309
+ yield new PatternMatch({ content: result.trim(), type: aggType, fullMatch: result });
310
+ continue;
311
+ }
312
+ if (this._aggregationType !== TextType.TOKEN) {
313
+ // Use parent's lookahead logic for sentence detection
314
+ const aggregation = await super._checkSentenceWithLookahead(char);
315
+ if (aggregation) {
316
+ // Convert to PatternMatch for consistency with return type
317
+ yield new PatternMatch({
318
+ content: aggregation.text,
319
+ type: aggregation.type,
320
+ fullMatch: aggregation.text,
321
+ });
322
+ }
323
+ }
324
+ }
325
+ // In TOKEN mode, yield any accumulated text after processing all chars,
326
+ // but only if there's no incomplete pattern being buffered. A trailing
327
+ // partial start delimiter (e.g. "<thin" of "<think>") is held back so a
328
+ // delimiter split across chunks isn't leaked as plain text; it's
329
+ // retained in the buffer to be completed by the next chunk.
330
+ if (this._aggregationType === TextType.TOKEN && this._text) {
331
+ if (this._matchStartOfPattern(this._text) === null) {
332
+ const heldBack = longestTrailingPartialMatch(this._text, [...this._patterns.values()].map((pattern) => pattern.start));
333
+ const yieldLength = this._text.length - heldBack;
334
+ if (yieldLength > 0) {
335
+ const content = this._text.slice(0, yieldLength);
336
+ this._text = this._text.slice(yieldLength);
337
+ this._lastProcessedPosition = this._text.length;
338
+ yield new PatternMatch({ content, type: TextType.TOKEN, fullMatch: content });
339
+ }
340
+ }
341
+ }
342
+ }
343
+ /**
344
+ * Flush any remaining text in the buffer.
345
+ *
346
+ * Degrades incomplete pattern state the same way a closed pair's
347
+ * action would, without knowing whether the pair would ever have
348
+ * closed:
349
+ *
350
+ * - REMOVE and AGGREGATE: an unclosed start delimiter and everything
351
+ * from it onward is dropped (their content is either stripped or
352
+ * treated as a side channel once closed, so it's never spoken
353
+ * incomplete). The pattern handler is not invoked. Text before the
354
+ * earliest such unclosed start delimiter is kept.
355
+ * - KEEP: a closed KEEP pair is spoken verbatim, delimiters included
356
+ * (see `aggregate`), so an unclosed one degrades to the same
357
+ * thing rather than being dropped.
358
+ *
359
+ * If the buffer ends with a proper prefix of a REMOVE/AGGREGATE start
360
+ * delimiter (the stream cut off mid-delimiter), that trailing partial
361
+ * text is trimmed too. This accepts an inherent ambiguity: a legitimate
362
+ * trailing character sequence that happens to match a delimiter prefix
363
+ * (e.g. a stray `<`) is trimmed the same way.
364
+ *
365
+ * @returns Any remaining text with incomplete REMOVE/AGGREGATE pattern
366
+ * content dropped, or null if there is nothing left to return.
367
+ */
368
+ async flush() {
369
+ const cutIndex = this._findEarliestDroppableStart(this._text);
370
+ let resultText = cutIndex === null ? this._text : this._text.slice(0, cutIndex);
371
+ resultText = this._trimTrailingPartialStart(resultText);
372
+ await this.reset();
373
+ const stripped = resultText.trim();
374
+ if (!stripped) {
375
+ return null;
376
+ }
377
+ const aggType = this._aggregationType === TextType.TOKEN ? TextType.TOKEN : TextType.SENTENCE;
378
+ return new PatternMatch({ content: stripped, type: aggType, fullMatch: resultText });
379
+ }
380
+ /**
381
+ * Find the earliest unmatched start delimiter that flush() should cut at.
382
+ *
383
+ * For each registered pattern, replicates the same left-to-right,
384
+ * non-overlapping pairing that `_processCompletePatterns` uses
385
+ * (earliest start paired with earliest following end) to determine
386
+ * which start-delimiter occurrences are still unmatched. Only
387
+ * REMOVE/AGGREGATE patterns' unmatched starts are candidates: KEEP
388
+ * patterns are excluded because unclosed KEEP content is kept, not cut.
389
+ *
390
+ * @param text The buffered text to scan.
391
+ * @returns The index of the earliest droppable unmatched start delimiter,
392
+ * or null if there isn't one.
393
+ */
394
+ _findEarliestDroppableStart(text) {
395
+ let earliest = null;
396
+ for (const patternInfo of this._patterns.values()) {
397
+ if ((patternInfo.action ?? MatchAction.REMOVE) === MatchAction.KEEP) {
398
+ continue;
399
+ }
400
+ const start = patternInfo.start;
401
+ const matchedSpans = [
402
+ ...text.matchAll(patternRegex(start, patternInfo.end)),
403
+ ].map((match) => [match.index ?? 0, (match.index ?? 0) + match[0].length]);
404
+ let searchFrom = 0;
405
+ while (true) {
406
+ const index = text.indexOf(start, searchFrom);
407
+ if (index === -1) {
408
+ break;
409
+ }
410
+ const span = matchedSpans.find((s) => s[0] <= index && index < s[1]);
411
+ if (span !== undefined) {
412
+ // This occurrence belongs to a completed match; skip past
413
+ // it entirely so a start nested inside its content isn't
414
+ // mistaken for an unmatched one.
415
+ searchFrom = span[1];
416
+ continue;
417
+ }
418
+ if (earliest === null || index < earliest) {
419
+ earliest = index;
420
+ }
421
+ break;
422
+ }
423
+ }
424
+ return earliest;
425
+ }
426
+ /**
427
+ * Trim a trailing partial REMOVE/AGGREGATE start delimiter, if any.
428
+ *
429
+ * The stream can end mid-delimiter (e.g. buffered text ending in
430
+ * `<te` of `<test>`). That partial text isn't a complete start
431
+ * delimiter, so `_findEarliestDroppableStart` won't catch it,
432
+ * but it also isn't safe to speak. KEEP patterns are excluded since a
433
+ * KEEP delimiter is kept whether or not it's complete.
434
+ *
435
+ * @param text The text to check for a trailing partial delimiter.
436
+ * @returns The text with a trailing partial start delimiter removed, or the
437
+ * original text if there isn't one.
438
+ */
439
+ _trimTrailingPartialStart(text) {
440
+ let maxTrim = 0;
441
+ for (const patternInfo of this._patterns.values()) {
442
+ if ((patternInfo.action ?? MatchAction.REMOVE) === MatchAction.KEEP) {
443
+ continue;
444
+ }
445
+ const start = patternInfo.start;
446
+ for (let length = Math.min(start.length - 1, text.length); length > 0; length--) {
447
+ if (text.endsWith(start.slice(0, length))) {
448
+ maxTrim = Math.max(maxTrim, length);
449
+ break;
450
+ }
451
+ }
452
+ }
453
+ return maxTrim ? text.slice(0, -maxTrim) : text;
454
+ }
455
+ /**
456
+ * Handle interruptions by clearing the buffer and pattern state.
457
+ *
458
+ * Called when an interruption occurs in the processing pipeline,
459
+ * to reset the state and discard any partially aggregated text.
460
+ */
461
+ async handleInterruption() {
462
+ await super.handleInterruption();
463
+ this._lastProcessedPosition = 0;
464
+ // Pattern and handler state persists across interruptions
465
+ }
466
+ /**
467
+ * Clear the internally aggregated text.
468
+ *
469
+ * Resets the aggregator to its initial state, discarding any
470
+ * buffered text and clearing pattern tracking state.
471
+ */
472
+ async reset() {
473
+ await super.reset();
474
+ this._lastProcessedPosition = 0;
475
+ // Pattern and handler state persists across resets
476
+ }
477
+ }
478
+ //# sourceMappingURL=pattern_pair_aggregator.js.map
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Shared pronunciation parsing and normalization utilities for TTS services.
3
+ *
4
+ * A pronunciation reaches a TTS service as an IPA string. Services each want their
5
+ * own markup for it, but they all start from the same steps: tidy the notation,
6
+ * split it into phones, and find which vowel each stress mark belongs to. Those
7
+ * steps live here, so a service's formatter only has to render the result.
8
+ *
9
+ * Normalization is notation-only. It unifies ways of writing the same symbol
10
+ * (`ʧ` and `tʃ`, `g` and `ɡ`, `'` and `ˈ`) and never changes which sound
11
+ * is written, so it is safe for any language.
12
+ */
13
+ export declare const PRIMARY_STRESS = "\u02C8";
14
+ export declare const SECONDARY_STRESS = "\u02CC";
15
+ export declare const STRESS_MARKS: readonly ["ˈ", "ˌ"];
16
+ export declare const TIE_BAR = "\u0361";
17
+ /**
18
+ * Unify the notation of an IPA string without changing what it says.
19
+ *
20
+ * Strips surrounding `/…/` or `[…]`, composes Unicode, replaces ligatures and
21
+ * ASCII look-alikes with their IPA symbols, writes `tʃ` and `dʒ` untied and
22
+ * other affricates tied (`ʦ` becomes `t͡s`), drops syllable breaks, and
23
+ * collapses whitespace.
24
+ *
25
+ * @param ipa An IPA transcription.
26
+ * @returns The same transcription in canonical notation.
27
+ *
28
+ * @example
29
+ * normalizeIpa("/ˈʧɪ.kən/"); // "ˈtʃɪkən"
30
+ */
31
+ export declare function normalizeIpa(ipa: string): string;
32
+ /**
33
+ * Split one IPA word into phones, in written order.
34
+ *
35
+ * Stress marks are returned as tokens of their own, where they were written.
36
+ * Tied sequences (`t͡s`), `tʃ`, `dʒ` and the English diphthongs are one
37
+ * phone each, returned without the tie bar; length marks and combining
38
+ * diacritics stay with the phone they modify.
39
+ *
40
+ * @param ipa An IPA transcription of a single word.
41
+ * @returns The phones and stress marks of the word.
42
+ *
43
+ * @example
44
+ * ipaPhones("mɛtˈfɔɹmɪn"); // ["m", "ɛ", "t", "ˈ", "f", "ɔ", "ɹ", "m", "ɪ", "n"]
45
+ */
46
+ export declare function ipaPhones(ipa: string): string[];
47
+ /** Whether an IPA phone (as returned by `ipaPhones`) is a vowel. */
48
+ export declare function isIpaVowel(phone: string): boolean;
49
+ /**
50
+ * Move each stress mark from where it was written to just before its vowel.
51
+ *
52
+ * Transcriptions usually put stress at the start of the syllable
53
+ * (`mɛtˈfɔɹmɪn`); some services want it on the vowel itself
54
+ * (`mɛtfˈɔɹmɪn`). A stress mark with no vowel after it is dropped.
55
+ *
56
+ * @param phones Phones and stress marks, as returned by `ipaPhones`.
57
+ * @returns The same phones with every stress mark directly before a vowel.
58
+ */
59
+ export declare function stressBeforeVowels(phones: readonly string[]): string[];
60
+ //# sourceMappingURL=phonemes.d.ts.map