@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,147 @@
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/skip_tags_aggregator.py
6
+ /**
7
+ * Skip tags aggregator for preventing sentence boundaries within tagged content.
8
+ *
9
+ * This module provides a text aggregator that prevents end-of-sentence matching
10
+ * between specified start/end tag pairs, ensuring that tagged content is processed
11
+ * as a unit regardless of internal punctuation.
12
+ */
13
+ import { longestTrailingPartialMatch, parseStartEndTags } from "../string.js";
14
+ import { Aggregation, TextType } from "./base_text_aggregator.js";
15
+ import { SimpleTextAggregator, } from "./simple_text_aggregator.js";
16
+ /**
17
+ * Aggregator that prevents end of sentence matching between start/end tags.
18
+ *
19
+ * This aggregator buffers text until it finds an end of sentence or a start
20
+ * tag. If a start tag is found the aggregator will keep aggregating text
21
+ * unconditionally until the corresponding end tag is found. It's particularly
22
+ * useful for processing content with custom delimiters that should prevent
23
+ * text from being considered for end of sentence matching.
24
+ *
25
+ * The aggregator ensures that tags spanning multiple text chunks are correctly
26
+ * identified and that content within tags is never split at sentence boundaries.
27
+ */
28
+ export class SkipTagsAggregator extends SimpleTextAggregator {
29
+ _tags;
30
+ _currentTag;
31
+ _currentTagIndex;
32
+ /**
33
+ * Initialize the skip tags aggregator.
34
+ *
35
+ * @param options.tags Tag pairs that should prevent sentence boundary detection.
36
+ * Other options are passed to SimpleTextAggregator (e.g. aggregationType).
37
+ */
38
+ constructor(options) {
39
+ super(options);
40
+ this._tags = options.tags;
41
+ this._currentTag = null;
42
+ this._currentTagIndex = 0;
43
+ }
44
+ /**
45
+ * Aggregate text while respecting tag boundaries.
46
+ *
47
+ * Processes the input text character-by-character, updates tag state, and
48
+ * uses the parent's lookahead logic for sentence detection when not
49
+ * inside tags.
50
+ *
51
+ * In TOKEN mode, text is passed through immediately unless we're inside
52
+ * a tag, in which case we buffer until the closing tag is found. Text
53
+ * ending in a partial start tag (e.g. `<spe` of `<spell>`) is held
54
+ * back until a later chunk determines whether it begins a tag, so a tag
55
+ * split across chunks is still recognized.
56
+ *
57
+ * @param text Text to aggregate.
58
+ * @returns Aggregation objects containing text up to a sentence boundary,
59
+ * marked as SENTENCE type (or TOKEN type in TOKEN mode).
60
+ */
61
+ async *aggregate(text) {
62
+ if (this._aggregationType === TextType.TOKEN) {
63
+ // In TOKEN mode, process chars for tag tracking but yield the
64
+ // full input as a single token when not inside a tag.
65
+ for (const char of text) {
66
+ this._text += char;
67
+ // Update tag state
68
+ [this._currentTag, this._currentTagIndex] = parseStartEndTags(this._text, this._tags, this._currentTag, this._currentTagIndex);
69
+ }
70
+ // After processing all chars: if not inside a tag, yield accumulated text.
71
+ // A trailing partial start tag (e.g. "<spe" of "<spell>") is held back
72
+ // so a tag split across chunks isn't leaked as plain text; it's retained
73
+ // in the buffer to be completed by the next chunk. The tag-scan index
74
+ // resets to 0 so the retained partial tag is rescanned once complete.
75
+ if (!this._currentTag && this._text) {
76
+ const heldBack = longestTrailingPartialMatch(this._text, this._tags.map(([start]) => start));
77
+ const yieldLength = this._text.length - heldBack;
78
+ if (yieldLength > 0) {
79
+ const content = this._text.slice(0, yieldLength);
80
+ this._text = this._text.slice(yieldLength);
81
+ this._currentTagIndex = 0;
82
+ yield new Aggregation({ text: content, type: TextType.TOKEN });
83
+ }
84
+ }
85
+ return;
86
+ }
87
+ // Process text character by character
88
+ for (const char of text) {
89
+ this._text += char;
90
+ // Update tag state
91
+ [this._currentTag, this._currentTagIndex] = parseStartEndTags(this._text, this._tags, this._currentTag, this._currentTagIndex);
92
+ // If inside tags, don't check for sentences
93
+ if (this._currentTag) {
94
+ continue;
95
+ }
96
+ // Otherwise, use parent's lookahead logic for sentence detection
97
+ const result = await super._checkSentenceWithLookahead(char);
98
+ if (result) {
99
+ yield result;
100
+ }
101
+ }
102
+ }
103
+ /**
104
+ * Flush any remaining text in the buffer.
105
+ *
106
+ * In SENTENCE mode, returns the buffered text as-is: tags are
107
+ * pass-through markers, so content is spoken whether or not a start
108
+ * tag's closing tag ever arrived. In TOKEN mode, returns any text
109
+ * still buffered behind an unclosed tag instead of discarding it.
110
+ *
111
+ * @returns Any remaining text, or null if the buffer is empty.
112
+ */
113
+ async flush() {
114
+ if (this._aggregationType === TextType.TOKEN) {
115
+ if (this._text) {
116
+ const result = this._text;
117
+ await this.reset();
118
+ return new Aggregation({ text: result, type: TextType.TOKEN });
119
+ }
120
+ return null;
121
+ }
122
+ return await super.flush();
123
+ }
124
+ /**
125
+ * Handle interruptions by clearing the buffer and tag state.
126
+ *
127
+ * Called when an interruption occurs in the processing pipeline,
128
+ * to reset the state and discard any partially aggregated text.
129
+ */
130
+ async handleInterruption() {
131
+ await super.handleInterruption();
132
+ this._currentTag = null;
133
+ this._currentTagIndex = 0;
134
+ }
135
+ /**
136
+ * Clear the internally aggregated text and tag state.
137
+ *
138
+ * Resets the aggregator to its initial state, discarding any
139
+ * buffered text.
140
+ */
141
+ async reset() {
142
+ await super.reset();
143
+ this._currentTag = null;
144
+ this._currentTagIndex = 0;
145
+ }
146
+ }
147
+ //# sourceMappingURL=skip_tags_aggregator.js.map
@@ -0,0 +1,21 @@
1
+ /** Normalize acronyms so TTS pronounces each letter individually. */
2
+ import type { TextType } from "../../../frames/frames.ts";
3
+ /**
4
+ * Insert spaces between letters of uppercase acronyms.
5
+ *
6
+ * This transformer is alphanumeric-preserving: the same letters are kept,
7
+ * only spaces are added between them, so the `WordCompletionTracker`
8
+ * requires no segment-map overhead.
9
+ *
10
+ * @param text Input text possibly containing acronyms like API or HTTP.
11
+ * @param _textType Text type of the text frame (unused).
12
+ * @returns Text with acronyms letter-spaced (e.g. `"API"` → `"A P I"`).
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * const result = await normalizeAcronyms("Use the API or HTTP endpoint", "*");
17
+ * // "Use the A P I or H T T P endpoint"
18
+ * ```
19
+ */
20
+ export declare function normalizeAcronyms(text: string, _textType: string | TextType): Promise<string>;
21
+ //# sourceMappingURL=acronyms.d.ts.map
@@ -0,0 +1,31 @@
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/transforms/acronyms.py
6
+ // Two or more consecutive uppercase letters not immediately followed by a lowercase
7
+ // letter (to avoid splitting CamelCase words like "iPhone" or "McDonalds").
8
+ // Python's `\b` is Unicode-aware; the lookarounds rebuild it with Unicode `\w`
9
+ // (letters, digits and underscore).
10
+ const ACRONYM_RE = /(?<![\p{L}\p{N}_])[A-Z]{2,}(?![a-z])(?![\p{L}\p{N}_])/gu;
11
+ /**
12
+ * Insert spaces between letters of uppercase acronyms.
13
+ *
14
+ * This transformer is alphanumeric-preserving: the same letters are kept,
15
+ * only spaces are added between them, so the `WordCompletionTracker`
16
+ * requires no segment-map overhead.
17
+ *
18
+ * @param text Input text possibly containing acronyms like API or HTTP.
19
+ * @param _textType Text type of the text frame (unused).
20
+ * @returns Text with acronyms letter-spaced (e.g. `"API"` → `"A P I"`).
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * const result = await normalizeAcronyms("Use the API or HTTP endpoint", "*");
25
+ * // "Use the A P I or H T T P endpoint"
26
+ * ```
27
+ */
28
+ export async function normalizeAcronyms(text, _textType) {
29
+ return text.replace(ACRONYM_RE, (match) => [...match].join(" "));
30
+ }
31
+ //# sourceMappingURL=acronyms.js.map
@@ -0,0 +1,16 @@
1
+ import type { TextType } from "../../../frames/frames.ts";
2
+ /**
3
+ * Expand currency amounts to their spoken form.
4
+ *
5
+ * @param text Input text possibly containing currency expressions.
6
+ * @param _textType Text type of the text frame (unused).
7
+ * @returns Text with currency amounts replaced by spoken equivalents.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * const result = await expandCurrency("Your balance is $42.50", "*");
12
+ * // "Your balance is forty-two dollars and fifty cents"
13
+ * ```
14
+ */
15
+ export declare function expandCurrency(text: string, _textType: string | TextType): Promise<string>;
16
+ //# sourceMappingURL=currency.d.ts.map
@@ -0,0 +1,56 @@
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/transforms/currency.py
6
+ /** Expand currency amounts into spoken form for TTS. */
7
+ import { num2words } from "num2words-ts";
8
+ import { toAsciiDigits } from "../unicode_digits.js";
9
+ /** Maps currency symbol to (singular, plural, cents_singular, cents_plural). */
10
+ const CURRENCY_MAP = {
11
+ $: ["dollar", "dollars", "cent", "cents"],
12
+ "€": ["euro", "euros", "cent", "cents"],
13
+ "£": ["pound", "pounds", "penny", "pence"],
14
+ "¥": ["yen", "yen", null, null],
15
+ "₹": ["rupee", "rupees", "paisa", "paise"],
16
+ };
17
+ // Python's `\b` (after a digit here) is Unicode-aware; the lookahead rebuilds
18
+ // it with Unicode `\w` (letters, digits and underscore).
19
+ // `\p{Nd}` is Python's Unicode `\d`; toAsciiDigits() lets BigInt/Number parse what int()/float() accept.
20
+ const CURRENCY_RE = /([€£¥₹$])\s*(\p{Nd}{1,3}(?:,\p{Nd}{3})*|\p{Nd}+)(?![\p{L}\p{N}_])(?:\.(\p{Nd}+))?/gu;
21
+ function amountToWords(n, singular, plural) {
22
+ const words = num2words(n, { lang: "en" });
23
+ const unit = n === 1n ? singular : plural;
24
+ return `${words} ${unit}`;
25
+ }
26
+ function currencyMatch(symbol, wholeMatch, fracStr) {
27
+ const wholeStr = wholeMatch.replaceAll(",", "");
28
+ const currency = CURRENCY_MAP[symbol] ?? ["unit", "units", "cent", "cents"];
29
+ const [singular, plural, cSingular, cPlural] = currency;
30
+ const whole = BigInt(toAsciiDigits(wholeStr));
31
+ let result = amountToWords(whole, singular, plural);
32
+ if (fracStr && cSingular && cPlural) {
33
+ const frac = BigInt(toAsciiDigits(fracStr.slice(0, 2).padEnd(2, "0")));
34
+ if (frac > 0n) {
35
+ result += ` and ${amountToWords(frac, cSingular, cPlural)}`;
36
+ }
37
+ }
38
+ return result;
39
+ }
40
+ /**
41
+ * Expand currency amounts to their spoken form.
42
+ *
43
+ * @param text Input text possibly containing currency expressions.
44
+ * @param _textType Text type of the text frame (unused).
45
+ * @returns Text with currency amounts replaced by spoken equivalents.
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * const result = await expandCurrency("Your balance is $42.50", "*");
50
+ * // "Your balance is forty-two dollars and fifty cents"
51
+ * ```
52
+ */
53
+ export async function expandCurrency(text, _textType) {
54
+ return text.replace(CURRENCY_RE, (_match, symbol, whole, frac) => currencyMatch(symbol, whole, frac));
55
+ }
56
+ //# sourceMappingURL=currency.js.map
@@ -0,0 +1,18 @@
1
+ import type { TextType } from "../../../frames/frames.ts";
2
+ /**
3
+ * Expand date expressions to their spoken form.
4
+ *
5
+ * Handles ISO format (`YYYY-MM-DD`) and US format (`MM/DD/YYYY` or `MM-DD-YYYY`).
6
+ *
7
+ * @param text Input text possibly containing date expressions.
8
+ * @param _textType Text type of the text frame (unused).
9
+ * @returns Text with date expressions replaced by spoken equivalents.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const result = await normalizeDates("Meeting on 2023-05-10", "*");
14
+ * // "Meeting on May 10th, two thousand and twenty three"
15
+ * ```
16
+ */
17
+ export declare function normalizeDates(text: string, _textType: string | TextType): Promise<string>;
18
+ //# sourceMappingURL=dates.d.ts.map
@@ -0,0 +1,102 @@
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/transforms/dates.py
6
+ /** Expand date expressions into spoken form for TTS. */
7
+ import { num2words } from "num2words-ts";
8
+ import { toAsciiDigits } from "../unicode_digits.js";
9
+ const pyInt = (digits) => Number(toAsciiDigits(digits));
10
+ // Python's `\b` (next to a digit here) is Unicode-aware; the lookarounds
11
+ // rebuild it with Unicode `\w` (letters, digits and underscore).
12
+ // ISO dates: 2023-05-10
13
+ // `\p{Nd}` is Python's Unicode `\d`; toAsciiDigits() lets BigInt/Number parse what int()/float() accept.
14
+ const ISO_DATE_RE = /(?<![\p{L}\p{N}_])(\p{Nd}{4})-(\p{Nd}{2})-(\p{Nd}{2})(?![\p{L}\p{N}_])/gu;
15
+ // US dates: 05/10/2023 or 05-10-2023 (not matched by ISO because ISO has 4-digit year first)
16
+ const US_DATE_RE = /(?<![\p{L}\p{N}_])(\p{Nd}{1,2})[/-](\p{Nd}{1,2})[/-](\p{Nd}{4})(?![\p{L}\p{N}_])/gu;
17
+ const ORDINAL_SUFFIXES = { 1: "st", 2: "nd", 3: "rd" };
18
+ // Indexed by month - 1. Hardcoded rather than derived from strftime("%B"), which
19
+ // renders the month in the process's LC_TIME locale and would produce a
20
+ // mixed-language result alongside the English year and ordinal suffix.
21
+ const MONTH_NAMES = [
22
+ "January",
23
+ "February",
24
+ "March",
25
+ "April",
26
+ "May",
27
+ "June",
28
+ "July",
29
+ "August",
30
+ "September",
31
+ "October",
32
+ "November",
33
+ "December",
34
+ ];
35
+ function ordinal(n) {
36
+ const key = [11, 12, 13].includes(n % 100) ? 0 : n % 10;
37
+ const suffix = ORDINAL_SUFFIXES[key] ?? "th";
38
+ return `${n}${suffix}`;
39
+ }
40
+ /**
41
+ * Build a date like Python's `datetime(year, month, day)`.
42
+ *
43
+ * @throws RangeError for an out-of-range year, month or day (Python's `ValueError`).
44
+ */
45
+ function makeDate(year, month, day) {
46
+ if (year < 1 || year > 9999)
47
+ throw new RangeError(`year ${year} is out of range`);
48
+ if (month < 1 || month > 12)
49
+ throw new RangeError("month must be in 1..12");
50
+ const leap = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
51
+ const daysInMonth = [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1];
52
+ if (day < 1 || day > daysInMonth)
53
+ throw new RangeError("day is out of range for month");
54
+ return { year, month, day };
55
+ }
56
+ function dateToSpoken(dt) {
57
+ const yearWords = num2words(dt.year, { lang: "en" });
58
+ const month = MONTH_NAMES[dt.month - 1];
59
+ const day = ordinal(dt.day);
60
+ return `${month} ${day}, ${yearWords}`;
61
+ }
62
+ function isoReplace(match, year, month, day) {
63
+ try {
64
+ return dateToSpoken(makeDate(pyInt(year), pyInt(month), pyInt(day)));
65
+ }
66
+ catch (e) {
67
+ if (e instanceof RangeError)
68
+ return match;
69
+ throw e;
70
+ }
71
+ }
72
+ function usReplace(match, month, day, year) {
73
+ try {
74
+ return dateToSpoken(makeDate(pyInt(year), pyInt(month), pyInt(day)));
75
+ }
76
+ catch (e) {
77
+ if (e instanceof RangeError)
78
+ return match;
79
+ throw e;
80
+ }
81
+ }
82
+ /**
83
+ * Expand date expressions to their spoken form.
84
+ *
85
+ * Handles ISO format (`YYYY-MM-DD`) and US format (`MM/DD/YYYY` or `MM-DD-YYYY`).
86
+ *
87
+ * @param text Input text possibly containing date expressions.
88
+ * @param _textType Text type of the text frame (unused).
89
+ * @returns Text with date expressions replaced by spoken equivalents.
90
+ *
91
+ * @example
92
+ * ```ts
93
+ * const result = await normalizeDates("Meeting on 2023-05-10", "*");
94
+ * // "Meeting on May 10th, two thousand and twenty three"
95
+ * ```
96
+ */
97
+ export async function normalizeDates(text, _textType) {
98
+ text = text.replace(ISO_DATE_RE, isoReplace);
99
+ text = text.replace(US_DATE_RE, usReplace);
100
+ return text;
101
+ }
102
+ //# sourceMappingURL=dates.js.map
@@ -0,0 +1,17 @@
1
+ /** Transform email addresses into spoken form for TTS. */
2
+ import type { TextType } from "../../../frames/frames.ts";
3
+ /**
4
+ * Transform email addresses into their spoken form.
5
+ *
6
+ * @param text Input text possibly containing email addresses.
7
+ * @param _textType Text type of the text frame (unused).
8
+ * @returns Text with email addresses replaced by spoken equivalents.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const result = await emailToSpeech("Contact user@example.com today", "*");
13
+ * // "Contact user at example dot com today"
14
+ * ```
15
+ */
16
+ export declare function emailToSpeech(text: string, _textType: string | TextType): Promise<string>;
17
+ //# sourceMappingURL=email.d.ts.map
@@ -0,0 +1,35 @@
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/transforms/email.py
6
+ const EMAIL_RE = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;
7
+ function emailToSpoken(email) {
8
+ const at = email.indexOf("@");
9
+ const local = email.slice(0, at);
10
+ const domain = email.slice(at + 1);
11
+ const localSpoken = local
12
+ .replaceAll(".", " dot ")
13
+ .replaceAll("_", " underscore ")
14
+ .replaceAll("-", " dash ")
15
+ .replaceAll("+", " plus ");
16
+ const domainSpoken = domain.replaceAll(".", " dot ").replaceAll("-", " dash ");
17
+ return `${localSpoken} at ${domainSpoken}`;
18
+ }
19
+ /**
20
+ * Transform email addresses into their spoken form.
21
+ *
22
+ * @param text Input text possibly containing email addresses.
23
+ * @param _textType Text type of the text frame (unused).
24
+ * @returns Text with email addresses replaced by spoken equivalents.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * const result = await emailToSpeech("Contact user@example.com today", "*");
29
+ * // "Contact user at example dot com today"
30
+ * ```
31
+ */
32
+ export async function emailToSpeech(text, _textType) {
33
+ return text.replace(EMAIL_RE, (match) => emailToSpoken(match));
34
+ }
35
+ //# sourceMappingURL=email.js.map
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Built-in text transformers for TTS voice formatting.
3
+ *
4
+ * Transformers are async callables with signature:
5
+ *
6
+ * ```ts
7
+ * async function transform(text: string, textType: string): Promise<string>
8
+ * ```
9
+ *
10
+ * They are registered with a TTS service via `textTransforms`:
11
+ *
12
+ * ```ts
13
+ * const tts = new CartesiaTTSService({
14
+ * textTransforms: [["*", stripMarkdown], ["*", expandCurrency]],
15
+ * });
16
+ * ```
17
+ *
18
+ * Or use `VoiceFormatter` for a single configurable bundle:
19
+ *
20
+ * ```ts
21
+ * const tts = new CartesiaTTSService({
22
+ * textTransforms: [["*", new VoiceFormatter({ expandCurrency: true })]],
23
+ * });
24
+ * ```
25
+ */
26
+ export { normalizeAcronyms } from "./acronyms.ts";
27
+ export { expandCurrency } from "./currency.ts";
28
+ export { normalizeDates } from "./dates.ts";
29
+ export { emailToSpeech } from "./email.ts";
30
+ export { expandNumbers } from "./numbers.ts";
31
+ export { expandPercentages } from "./percentages.ts";
32
+ export { expandPhoneNumbers } from "./phone.ts";
33
+ export { replaceText } from "./replacements.ts";
34
+ export { stripMarkdown } from "./strip_markdown.ts";
35
+ export { expandUnits } from "./units.ts";
36
+ export { VoiceFormatter } from "./voice_formatter.ts";
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,42 @@
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/transforms/__init__.py
6
+ /**
7
+ * Built-in text transformers for TTS voice formatting.
8
+ *
9
+ * Transformers are async callables with signature:
10
+ *
11
+ * ```ts
12
+ * async function transform(text: string, textType: string): Promise<string>
13
+ * ```
14
+ *
15
+ * They are registered with a TTS service via `textTransforms`:
16
+ *
17
+ * ```ts
18
+ * const tts = new CartesiaTTSService({
19
+ * textTransforms: [["*", stripMarkdown], ["*", expandCurrency]],
20
+ * });
21
+ * ```
22
+ *
23
+ * Or use `VoiceFormatter` for a single configurable bundle:
24
+ *
25
+ * ```ts
26
+ * const tts = new CartesiaTTSService({
27
+ * textTransforms: [["*", new VoiceFormatter({ expandCurrency: true })]],
28
+ * });
29
+ * ```
30
+ */
31
+ export { normalizeAcronyms } from "./acronyms.js";
32
+ export { expandCurrency } from "./currency.js";
33
+ export { normalizeDates } from "./dates.js";
34
+ export { emailToSpeech } from "./email.js";
35
+ export { expandNumbers } from "./numbers.js";
36
+ export { expandPercentages } from "./percentages.js";
37
+ export { expandPhoneNumbers } from "./phone.js";
38
+ export { replaceText } from "./replacements.js";
39
+ export { stripMarkdown } from "./strip_markdown.js";
40
+ export { expandUnits } from "./units.js";
41
+ export { VoiceFormatter } from "./voice_formatter.js";
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,25 @@
1
+ import type { TextType } from "../../../frames/frames.ts";
2
+ /**
3
+ * Return a transform that expands numbers to their spoken form.
4
+ *
5
+ * When `digitCutoff` is set, numbers above it are read digit-by-digit
6
+ * (e.g. `"2026"` → `"2 0 2 6"`). Numbers at or below the cutoff are
7
+ * expanded as quantities (e.g. `"42"` → `"forty two"`). Pass `null`
8
+ * to expand all numbers as words regardless of magnitude.
9
+ *
10
+ * Decimals are read as the whole part followed by their fractional digits, one at a
11
+ * time, so every written digit is spoken (`"1.0"` → `"one point zero"`).
12
+ *
13
+ * @param digitCutoff Numbers larger than this value are read digit-by-digit.
14
+ * `null` disables the cutoff so every number is expanded as a word.
15
+ * @returns An async transform callable compatible with `textTransforms`.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * const transform = expandNumbers(2025);
20
+ * const result = await transform("Room 42 has 1234 seats and opens in 2026", "*");
21
+ * // "Room forty two has one thousand two hundred thirty four seats and opens in 2 0 2 6"
22
+ * ```
23
+ */
24
+ export declare function expandNumbers(digitCutoff?: number | bigint | null): (text: string, textType: string | TextType) => Promise<string>;
25
+ //# sourceMappingURL=numbers.d.ts.map
@@ -0,0 +1,59 @@
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/transforms/numbers.py
6
+ /** Expand numeric expressions into spoken form for TTS. */
7
+ import { num2words } from "num2words-ts";
8
+ import { toAsciiDigits } from "../unicode_digits.js";
9
+ // Matches integers and decimals, with optional thousand separators.
10
+ // Python's `\b` (next to a digit here) is Unicode-aware; the lookarounds
11
+ // rebuild it with Unicode `\w` (letters, digits and underscore).
12
+ // `\p{Nd}` is Python's Unicode `\d`; toAsciiDigits() lets BigInt/Number parse what int()/float() accept.
13
+ const NUMBER_RE = /(?<![\p{L}\p{N}_])(\p{Nd}{1,3}(?:,\p{Nd}{3})*|\p{Nd}+)(?:\.(\p{Nd}+))?(?![\p{L}\p{N}_])/gu;
14
+ /**
15
+ * Return a transform that expands numbers to their spoken form.
16
+ *
17
+ * When `digitCutoff` is set, numbers above it are read digit-by-digit
18
+ * (e.g. `"2026"` → `"2 0 2 6"`). Numbers at or below the cutoff are
19
+ * expanded as quantities (e.g. `"42"` → `"forty two"`). Pass `null`
20
+ * to expand all numbers as words regardless of magnitude.
21
+ *
22
+ * Decimals are read as the whole part followed by their fractional digits, one at a
23
+ * time, so every written digit is spoken (`"1.0"` → `"one point zero"`).
24
+ *
25
+ * @param digitCutoff Numbers larger than this value are read digit-by-digit.
26
+ * `null` disables the cutoff so every number is expanded as a word.
27
+ * @returns An async transform callable compatible with `textTransforms`.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * const transform = expandNumbers(2025);
32
+ * const result = await transform("Room 42 has 1234 seats and opens in 2026", "*");
33
+ * // "Room forty two has one thousand two hundred thirty four seats and opens in 2 0 2 6"
34
+ * ```
35
+ */
36
+ export function expandNumbers(digitCutoff = 2025) {
37
+ const numToWords = (wholeMatch, fracStr) => {
38
+ const wholeStr = wholeMatch.replaceAll(",", "");
39
+ const whole = BigInt(toAsciiDigits(wholeStr));
40
+ if (digitCutoff !== null && whole > digitCutoff) {
41
+ let result = [...wholeStr].join(" ");
42
+ if (fracStr) {
43
+ result += ` point ${[...fracStr].join(" ")}`;
44
+ }
45
+ return result;
46
+ }
47
+ if (fracStr) {
48
+ // Reading the fraction one digit at a time keeps trailing zeros audible,
49
+ // which also keeps a decimal agreeing with the plural unit expandUnits
50
+ // picks for it ("1.0 kilometers").
51
+ return `${num2words(whole, { lang: "en" })} point ${[...fracStr]
52
+ .map((digit) => num2words(Number(toAsciiDigits(digit)), { lang: "en" }))
53
+ .join(" ")}`;
54
+ }
55
+ return num2words(whole, { lang: "en" });
56
+ };
57
+ return async (text, _textType) => text.replace(NUMBER_RE, (_match, whole, frac) => numToWords(whole, frac));
58
+ }
59
+ //# sourceMappingURL=numbers.js.map
@@ -0,0 +1,16 @@
1
+ import type { TextType } from "../../../frames/frames.ts";
2
+ /**
3
+ * Expand percentage expressions to their spoken form.
4
+ *
5
+ * @param text Input text possibly containing percentage expressions.
6
+ * @param _textType Text type of the text frame (unused).
7
+ * @returns Text with percentages replaced by spoken equivalents.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * const result = await expandPercentages("50% off today", "*");
12
+ * // "fifty percent off today"
13
+ * ```
14
+ */
15
+ export declare function expandPercentages(text: string, _textType: string | TextType): Promise<string>;
16
+ //# sourceMappingURL=percentages.d.ts.map
@@ -0,0 +1,32 @@
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/transforms/percentages.py
6
+ /** Expand percentage expressions into spoken form for TTS. */
7
+ import { asFloat, num2words } from "num2words-ts";
8
+ import { toAsciiDigits } from "../unicode_digits.js";
9
+ // `\p{Nd}` is Python's Unicode `\d`; toAsciiDigits() lets BigInt/Number parse what int()/float() accept.
10
+ const PERCENT_RE = /(\p{Nd}+(?:\.\p{Nd}+)?)\s*%/gu;
11
+ function percentToWords(value) {
12
+ // Upstream converts with `float(value)`, so "50" reads as the float 50.0.
13
+ const numberStr = num2words(asFloat(Number.parseFloat(toAsciiDigits(value))), { lang: "en" });
14
+ return `${numberStr} percent`;
15
+ }
16
+ /**
17
+ * Expand percentage expressions to their spoken form.
18
+ *
19
+ * @param text Input text possibly containing percentage expressions.
20
+ * @param _textType Text type of the text frame (unused).
21
+ * @returns Text with percentages replaced by spoken equivalents.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * const result = await expandPercentages("50% off today", "*");
26
+ * // "fifty percent off today"
27
+ * ```
28
+ */
29
+ export async function expandPercentages(text, _textType) {
30
+ return text.replace(PERCENT_RE, (_match, value) => percentToWords(value));
31
+ }
32
+ //# sourceMappingURL=percentages.js.map