@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,611 @@
1
+ export interface TextSegmentOptions {
2
+ /** The piece as a client displays it. */
3
+ original: string;
4
+ /**
5
+ * The same piece as it was sent to the TTS. Identical to `original` unless
6
+ * something rewrote it, and empty if it was dropped entirely.
7
+ */
8
+ tts: string;
9
+ /** Where the piece starts in the full original text. */
10
+ originalStart: number;
11
+ /**
12
+ * Where it ends. Cursors jump straight here once a rewritten piece is
13
+ * finished, since no position inside one means anything.
14
+ */
15
+ originalEnd: number;
16
+ }
17
+ /**
18
+ * A piece of the utterance, paired with what the TTS was given in its place.
19
+ *
20
+ * The map is a list of these, laid end to end over the whole utterance. In
21
+ * most of them the two sides are identical; the interesting ones are where a
22
+ * transform, a filter or a tag made them differ (see `isTransformed`).
23
+ *
24
+ * - `original`: the piece as a client displays it.
25
+ * - `tts`: the same piece as it was sent to the TTS. Identical to `original`
26
+ * unless something rewrote it, and empty if it was dropped entirely.
27
+ * - `originalStart`: where the piece starts in the full original text.
28
+ * - `originalEnd`: where it ends. Cursors jump straight here once a rewritten
29
+ * piece is finished, since no position inside one means anything.
30
+ */
31
+ export declare class TextSegment {
32
+ readonly original: string;
33
+ readonly tts: string;
34
+ readonly originalStart: number;
35
+ readonly originalEnd: number;
36
+ constructor(options: TextSegmentOptions);
37
+ /**
38
+ * True when the two sides cannot be followed together, character by character.
39
+ *
40
+ * A segment like this is all or nothing. The cursors into the other texts
41
+ * wait at its start until every spoken word of it has arrived, then jump
42
+ * straight to its end, because no position inside it means anything.
43
+ *
44
+ * Any one of these makes it true:
45
+ *
46
+ * - the letters and digits differ, as in `"$42.50"` against
47
+ * `"forty two dollars"`;
48
+ * - the two sides have different numbers of words;
49
+ * - the TTS side has tags in it, even when the words match. The cursor
50
+ * through the spoken text has tag characters to cross that the other
51
+ * texts do not have.
52
+ *
53
+ * Only the shape of a tag matters, never its name: `<phoneme
54
+ * ...>Siobhan</phoneme>` counts because of the tags around the word.
55
+ */
56
+ get isTransformed(): boolean;
57
+ /**
58
+ * How many letters and digits the spoken side of this segment has.
59
+ *
60
+ * This is what the provider's words spend as they arrive. On a rewritten
61
+ * segment it has nothing to do with `originalAlnumCount`: "forty two
62
+ * dollars" against "$42.50".
63
+ */
64
+ get ttsAlnumCount(): number;
65
+ /**
66
+ * How many letters and digits the original side of this segment has.
67
+ *
68
+ * This is what the cursors into `originalText` and `llmText` spend, since
69
+ * those texts hold the original characters, not the spoken ones.
70
+ */
71
+ get originalAlnumCount(): number;
72
+ toString(): string;
73
+ }
74
+ /**
75
+ * What happened when a word was offered to one segment.
76
+ *
77
+ * Trying one word against one segment is called a hop. Two of these answers
78
+ * end the attempt; the other two send the word on to the next segment.
79
+ *
80
+ * - `PLACED`: the word fits here. Move to the end of the match and stop.
81
+ * - `CROSSES`: this segment holds only the beginning of the word. Finish the
82
+ * segment and take the rest of the word to the next one.
83
+ * - `EXHAUSTED`: there is nothing here that can be spoken, so no word will
84
+ * ever match -- an empty side of the diff, or a lone `<break/>`. Finish the
85
+ * segment and try the whole word again on the next one.
86
+ * - `NO_MATCH`: nothing here matches the word, usually a symbol the provider
87
+ * reports differently from the text. Step every cursor past the next run of
88
+ * punctuation, which the word stands for, and stop.
89
+ */
90
+ export declare const _HopKind: {
91
+ readonly PLACED: 1;
92
+ readonly CROSSES: 2;
93
+ readonly EXHAUSTED: 3;
94
+ readonly NO_MATCH: 4;
95
+ };
96
+ export type _HopKind = (typeof _HopKind)[keyof typeof _HopKind];
97
+ /**
98
+ * The outcome of offering one word to one segment.
99
+ *
100
+ * Produced by `TextSegmentMap._classifyHop`, collected by
101
+ * `TextSegmentMap._planHops`, and acted on by `TextSegmentMap._consumeWord`.
102
+ *
103
+ * - `kind`: which of the four outcomes happened.
104
+ * - `segmentAdvance`: how many characters to move forward in this segment.
105
+ * The length of the match for `PLACED`, or a step past the next run of
106
+ * punctuation for `NO_MATCH`. The other two leave it at 0 because they
107
+ * finish the whole segment anyway.
108
+ * - `wordConsumed`: how many characters of the word this segment used up, and
109
+ * so how many to drop before offering the rest to the next segment. Only
110
+ * `CROSSES` sets it; `EXHAUSTED` passes the word on whole.
111
+ */
112
+ export interface _Hop {
113
+ readonly kind: _HopKind;
114
+ readonly segmentAdvance: number;
115
+ readonly wordConsumed: number;
116
+ }
117
+ /**
118
+ * Answers "where are we?" in three versions of one utterance, word by word.
119
+ *
120
+ * A TTS provider reports the words it speaks. Each report has to be turned
121
+ * into a position -- but into a position in *three* different strings,
122
+ * because the same utterance exists in three forms at once:
123
+ *
124
+ * - `ttsText` -- what was actually spoken, tags and all:
125
+ * `"Your balance is forty two dollars"`
126
+ * - `originalText` -- what a client displays: `"Your balance is $42.50"`
127
+ * - `llmText` -- what the LLM wrote, so what the transcript should keep:
128
+ * `"Your balance is <b>$42.50</b>"`. Defaults to `originalText`.
129
+ *
130
+ * For a frame nothing rewrote, all three are the same string and every
131
+ * position is the same.
132
+ *
133
+ * **The hard part is that a spoken word need not appear in the other two.**
134
+ * The provider says `"dollars"`; nothing in `"$42.50"` matches it. So the map
135
+ * is built once, by diffing `ttsText` against `originalText` into aligned
136
+ * `TextSegment` pieces -- each either survived unchanged or was rewritten
137
+ * whole.
138
+ *
139
+ * `llmText` is never compared against the others, and does not need to be.
140
+ * It holds the same letters and digits as `originalText`, in the same order,
141
+ * and differs only in what is wrapped around them -- tags, delimiters,
142
+ * punctuation. So counting letters and digits is enough to keep it in step,
143
+ * and its cursor moves by that count.
144
+ *
145
+ * From then on one real cursor moves: `rawPos`, how far into `ttsText` the
146
+ * provider has got. `userFacingPos` and the two LLM cursors follow it:
147
+ *
148
+ * - Through an **unchanged** segment they keep pace, word for word.
149
+ * - Through a **rewritten** one they wait. There is no honest position
150
+ * halfway through `"$42.50"` while `"forty two dollars"` is being spoken, so
151
+ * they hold and then jump to the end of the span in one step when the last
152
+ * of its words lands.
153
+ *
154
+ * The LLM side carries two of them because one position cannot answer both
155
+ * questions asked of it. `llmSpokenPos` is what the provider has reported;
156
+ * `llmPos` is what has been attributed to a word, and runs ahead of it over a
157
+ * mark stuck to a word the provider has already named. See
158
+ * `_advanceLlmCursors`.
159
+ *
160
+ * Callers ask two things. `wordBelongsCurrentSegment` -- does this token
161
+ * plausibly continue what is left to speak? -- and `advanceWord`, which
162
+ * consumes it. Both tolerate the ways providers mangle tokens (added
163
+ * punctuation, changed case or diacritics, a fragment of a half-open SSML
164
+ * tag) without the caller knowing anything about it; `_classifyHop` holds
165
+ * that logic.
166
+ *
167
+ * A word need not sit at the cursor to be placed. When the provider garbles
168
+ * or drops an event, the next good word still matches a few words on, and the
169
+ * text stepped over -- which no event will ever name -- is consumed with it.
170
+ * So the two questions above stay simple: a token either has a home somewhere
171
+ * in what is left to speak, or it belongs to another utterance entirely.
172
+ *
173
+ * @example
174
+ * // "$42.50" was sent to the TTS as "forty two dollars and fifty cents"
175
+ * const smap = new TextSegmentMap(
176
+ * "Your balance is forty two dollars and fifty cents",
177
+ * "Your balance is $42.50",
178
+ * );
179
+ * for (const word of ["Your", "balance", "is"]) {
180
+ * smap.advanceWord(word); // unchanged: every cursor keeps pace
181
+ * }
182
+ * for (const word of ["forty", "two", "dollars", "and", "fifty"]) {
183
+ * smap.advanceWord(word); // rewritten: the other two cursors wait
184
+ * }
185
+ * smap.advanceWord("cents"); // the span is done, so they jump to its end
186
+ * // smap.lastCompletedSegment.original === "$42.50"
187
+ * // smap.inTransformedSegment === false
188
+ */
189
+ export declare class TextSegmentMap {
190
+ /** How many words a word may be placed past -- see `_lookaheadHop`. */
191
+ static readonly LOOKAHEAD_WORDS = 3;
192
+ protected _ttsText: string;
193
+ protected _originalText: string;
194
+ protected _llmText: string;
195
+ protected _segments: TextSegment[];
196
+ protected _segIdx: number;
197
+ protected _segRawPos: number;
198
+ protected _userFacingPos: number;
199
+ protected _llmPos: number;
200
+ protected _llmSpokenPos: number;
201
+ protected _lastCompleted: TextSegment | null;
202
+ protected _lastOverflow: string | null;
203
+ protected _lastLeadingDuplicate: number;
204
+ /**
205
+ * Line the three texts up against each other.
206
+ *
207
+ * The comparison happens once, here. Everything after this only moves
208
+ * cursors.
209
+ *
210
+ * @param ttsText What was sent to the TTS, and so what incoming words are
211
+ * matched against. May carry synthesis tags and rewritten values.
212
+ * @param originalText The same content as a client displays it, before any
213
+ * rewriting. Diffed against `ttsText` to build the segments.
214
+ * @param llmText The same content as the LLM wrote it, which may add
215
+ * delimiters the other two never see. Rides its own cursor rather than
216
+ * being diffed. Defaults to `originalText`.
217
+ */
218
+ constructor(ttsText: string, originalText: string, llmText?: string | null);
219
+ /**
220
+ * Compare the two texts and cut them into the segments the map walks.
221
+ *
222
+ * `difflib` lines them up a word at a time and reports each piece as equal,
223
+ * replaced, inserted or deleted. Every piece becomes one `TextSegment`.
224
+ * Spaces are kept as words of their own so that the positions stay exact.
225
+ *
226
+ * One extra step: a piece that came out equal is cut around any tag inside
227
+ * it, so a single tag does not turn the whole sentence into an
228
+ * all-or-nothing segment.
229
+ *
230
+ * Called once, from the constructor.
231
+ */
232
+ protected static _buildSegments(ttsText: string, originalText: string): TextSegment[];
233
+ protected _resetState(): void;
234
+ /**
235
+ * Return `word`, then with its last mark removed, then with every trailing
236
+ * mark removed.
237
+ *
238
+ * A TTS can add punctuation the text it was given never had -- reading a
239
+ * list item `"my account"` as a sentence and reporting `"account."`.
240
+ * Matching tries the word as it arrived first, then the trimmed forms.
241
+ *
242
+ * Dropping only the added mark comes before dropping them all, so the marks
243
+ * the text does have are still matched: `"images:."` lands past the colon
244
+ * in `"images:"`, and `"---."` keeps something to match at all. The
245
+ * variants are tried in order and empty ones are skipped.
246
+ */
247
+ protected static _wordVariants(word: string): string[];
248
+ /**
249
+ * Compare `remainingWord` to each candidate, character for character.
250
+ *
251
+ * Two things can match. If a candidate starts with the word, the word fits
252
+ * here (`PLACED`). If the word starts with a candidate, the candidate ran
253
+ * out first, so the rest of the word belongs to the next segment
254
+ * (`CROSSES`).
255
+ *
256
+ * `_foldedHop` calls this too, on folded copies of the same strings.
257
+ * Folding never changes a string's length, so a position found in a folded
258
+ * copy is the same position in the original.
259
+ *
260
+ * @param candidates `[text, offset]` pairs to match `remainingWord` against,
261
+ * tried in order.
262
+ * @param remainingWord The word (or its trailing-punctuation-stripped
263
+ * variant) to match.
264
+ * @param requireWordBoundary When true, the word must end where a word ends
265
+ * in the candidate -- either it used the candidate up, or the next
266
+ * character is not a letter or digit. This stops `"account"` from matching
267
+ * the start of `"Accountant"`. Only the folded pass asks for it, because
268
+ * folding away case makes that kind of accidental match much easier to hit.
269
+ * @returns A `PLACED` or `CROSSES` hop, or `null` if nothing matched.
270
+ */
271
+ protected static _literalHop(candidates: [string, number][], remainingWord: string, requireWordBoundary?: boolean): _Hop | null;
272
+ /**
273
+ * Count the characters at the start of `text` that are not letters or digits.
274
+ *
275
+ * For `", I can"` this returns 2 -- the comma and the space.
276
+ *
277
+ * With `stopAtMarkup`, counting also stops at a `'<'`, so the count never
278
+ * reaches inside a tag. Without it, `"<break/>hello"` would count past the
279
+ * `'<'`, and a provider that reports the tag's name `"break"` as a word
280
+ * would look like it had spoken it.
281
+ */
282
+ protected static _leadingNonalnumLen(text: string, stopAtMarkup?: boolean): number;
283
+ /**
284
+ * Return the three starting points a word may be matched against here.
285
+ *
286
+ * Providers disagree about what they include in a word, so the same text is
287
+ * offered from three places, each paired with how far in it starts:
288
+ *
289
+ * 1. The text as it is, for a provider that reports `" world"` with its own
290
+ * leading space.
291
+ * 2. Past any spaces.
292
+ * 3. Past everything that is not a letter or digit, for a provider that
293
+ * does not repeat punctuation it already spoke -- when `"I"` arrives for
294
+ * `"Yeah, I can"`, the `", "` is still waiting here.
295
+ *
296
+ * Each start is further in than the last, so the closest match is tried
297
+ * first. Identical starting points are dropped.
298
+ */
299
+ protected static _matchCandidates(segmentRemaining: string): [string, number][];
300
+ /**
301
+ * Match `remainingWord` again, ignoring differences in how it is written.
302
+ *
303
+ * A provider may report a word in lower case, without accents, or with
304
+ * plain quotes: `"SQL"` as `"sql"`, `"cafรฉ"` as `"cafe"`, `"donโ€™t"` as
305
+ * `"don't"`. Folding both sides makes those the same.
306
+ *
307
+ * Folding swaps characters one for one and never adds or removes any, so
308
+ * the strings keep their length and a position found here means the same
309
+ * position in the original text.
310
+ *
311
+ * Because folding hides case, a short word could now match inside a longer
312
+ * one -- `"account"` inside `"Accountant"`. So a match here is only accepted
313
+ * if it ends where a word ends.
314
+ */
315
+ protected static _foldedHop(candidates: [string, number][], remainingWord: string): _Hop | null;
316
+ /**
317
+ * Match `remainingWord` again, with tags removed from both sides.
318
+ *
319
+ * A provider may report a word wrapped in tags the text it was given did
320
+ * not have, or the other way round. Removing tags from both sides lets the
321
+ * words themselves be compared.
322
+ *
323
+ * The match is found in text that has no tags, so its position has to be
324
+ * translated back to a position in the real text, tags included, by
325
+ * `rawOffsetAfterCleanChars`.
326
+ *
327
+ * Only `PLACED` comes out of this. A word that runs past the end of the
328
+ * segment is left to the two earlier passes.
329
+ */
330
+ protected static _markupHop(segmentRemaining: string, remainingWord: string): _Hop | null;
331
+ /**
332
+ * Look for `remainingWord` a few words further into this segment.
333
+ *
334
+ * Reached only once the three strategies above have all declined, which
335
+ * means the provider garbled or dropped an event and the text at the cursor
336
+ * will never be reported on its own. Matching a word a little further on
337
+ * puts the segment back in step, and the text stepped over is consumed with
338
+ * the word that found it rather than being lost.
339
+ *
340
+ * Two limits keep a coincidence from being read as a recovery. Only whole
341
+ * words anchor the match, so a partial prefix is not enough, and only the
342
+ * next `LOOKAHEAD_WORDS` of them are tried, so a word repeated later in a
343
+ * long segment cannot swallow everything before it.
344
+ *
345
+ * Word separators are what those anchors are found by, so a script written
346
+ * without them -- Japanese, Chinese -- offers a single word start for the
347
+ * whole run and never matches here; frames in one recover through
348
+ * force-complete instead. Spaced scripts, Korean among them, recover
349
+ * normally.
350
+ *
351
+ * `_foldedHop` alone does the matching, since it already demands the whole
352
+ * word this needs and folding only ever widens what matches -- the fold is
353
+ * one character for one, so anything matching literally matches folded too.
354
+ *
355
+ * A segment holding markup is left alone: tag names are made of letters, so
356
+ * a word start inside one would read as something spoken. That also keeps
357
+ * the match from anchoring inside a rewritten span whose words carry tags.
358
+ */
359
+ protected static _lookaheadHop(segmentRemaining: string, remainingWord: string): _Hop | null;
360
+ /**
361
+ * Decide what `remainingWord` does to the text left in this segment.
362
+ *
363
+ * Everything here is plain string comparison. No tag names are understood,
364
+ * and nothing is remembered between calls.
365
+ *
366
+ * Four ways of matching are tried, each more forgiving than the one before:
367
+ * `_literalHop`, then `_foldedHop`, then `_markupHop`. Any of them can
368
+ * report that the word fits here (`PLACED`) or that it runs past the end of
369
+ * the segment (`CROSSES`). Last comes `_lookaheadHop`, which places the word
370
+ * a few words further in, stepping over text a garbled or dropped event left
371
+ * unaccounted for.
372
+ *
373
+ * If none of them match, the answer depends on what is left in the segment:
374
+ *
375
+ * - `EXHAUSTED` when nothing here can be spoken -- only a tag such as
376
+ * `<break/>`, or trailing spaces and punctuation. The segment is finished
377
+ * so the word can try the next one. This is checked last, so a word that
378
+ * really does match something like a trailing emoji is found by the
379
+ * passes above first.
380
+ * - `NO_MATCH` otherwise. The word is taken to stand for the next run of
381
+ * punctuation (see `_unmatchedSymbolLen`), so the cursors step past that
382
+ * run alone, never past a letter or digit.
383
+ */
384
+ protected static _classifyHop(segmentRemaining: string, remainingWord: string): _Hop;
385
+ /**
386
+ * Count how far a word that matched nothing moves the cursor.
387
+ *
388
+ * Such a word is usually a symbol the provider reports differently from the
389
+ * text -- `"-"` for `"โ†’"` -- so it stands for the next run of punctuation,
390
+ * and the cursor steps past that run alone:
391
+ *
392
+ * " โ†’ step two" -> 2, stops before " step"
393
+ * " โ†’ ### **Title**" -> 2, stops before " ###"
394
+ *
395
+ * Stopping at whitespace is what matters: the symbols after it (`###`,
396
+ * `**`) arrive as events of their own, and stepping past them would leave
397
+ * those events nothing to match.
398
+ */
399
+ protected static _unmatchedSymbolLen(segmentRemaining: string): number;
400
+ /**
401
+ * Move every cursor to `newPos` within `seg`, and finish `seg` if reached.
402
+ *
403
+ * This is where the "keep pace or wait" rule from the class docstring is
404
+ * applied, and the only place the cursors into the other two texts move.
405
+ *
406
+ * **Unchanged segment** -- both sides hold the same text, so the other two
407
+ * cursors keep pace. They move by a count, not a position: however many
408
+ * letters and digits this step used up in the spoken text is how many they
409
+ * move past. `advanceByAlnums` does that, crossing tags for free (which is
410
+ * how a tag travels with the word beside it) and taking any punctuation
411
+ * stuck to the end of the word, so `"you?"` moves as one.
412
+ *
413
+ * **Rewritten segment** -- the other two cursors do not move at all until
414
+ * the segment is finished, then jump straight to its end.
415
+ *
416
+ * Either way a cursor stops before trailing spaces, which belong to
417
+ * whatever comes next.
418
+ */
419
+ protected _advanceCursorsTo(seg: TextSegment, newPos: number): void;
420
+ /**
421
+ * Move the cursors into the other two texts by what this step just spoke.
422
+ *
423
+ * The user-facing cursor moves by the count of letters and digits consumed
424
+ * here. The two LLM cursors have their own rule -- see `_advanceLlmCursors`.
425
+ */
426
+ protected _keepDerivedCursorsInPace(seg: TextSegment, newPos: number): void;
427
+ /**
428
+ * Move both LLM cursors for a step that just spoke `crossed`.
429
+ *
430
+ * The two answer different questions and so stop in different places,
431
+ * which is the whole reason there are two of them:
432
+ *
433
+ * - `llmSpokenPos` -- what has been **reported spoken**. It crosses exactly
434
+ * the characters the raw cursor did, so it stops in front of a mark no
435
+ * event has arrived for.
436
+ * - `llmPos` -- what has been **attributed**. It also takes a mark stuck to
437
+ * the end of the word, since the conversation context is rebuilt by
438
+ * joining the attributed spans and every character has to belong to one
439
+ * of them: `"Yeah,"` then `"I"` reads back correctly where `"Yeah"` then
440
+ * `", I"` would put a space before the comma.
441
+ *
442
+ * Attribution never moves backwards and never trails what was spoken, so a
443
+ * step that spends no budget on the attributed side -- an emoji, a symbol
444
+ * the source spells differently -- is still credited to the word that
445
+ * crossed it.
446
+ */
447
+ protected _advanceLlmCursors(crossed: string, nAlnum: number): void;
448
+ /** Jump the other two cursors to the end of `seg`, now that it is done. */
449
+ protected _commitTransformedSpan(seg: TextSegment): void;
450
+ /** Record `seg` as finished and move on to the next segment. */
451
+ protected _finishSegment(seg: TextSegment): void;
452
+ /**
453
+ * Work out what `word` would do, without moving anything.
454
+ *
455
+ * This decides; `_consumeWord` acts. Keeping them apart is what stops them
456
+ * disagreeing, since `_canConsumeWord` asks the same question and must get
457
+ * the same answer.
458
+ *
459
+ * Most words are placed by the first segment tried, and the walk stops
460
+ * there. It goes on when a segment cannot finish the job -- the word runs
461
+ * past it, or it has nothing speakable left -- and whatever remains of the
462
+ * word is offered to the next segment.
463
+ *
464
+ * @returns What each segment answered, in order, and whatever is left of
465
+ * the word once the segments run out. Anything left over is the word
466
+ * running past the end of this text.
467
+ */
468
+ protected _planHops(word: string): [_Hop[], string];
469
+ /**
470
+ * Move the cursors according to what `_planHops` decided.
471
+ *
472
+ * Anything left unplaced ran past the end of this text and is kept in
473
+ * `lastOverflow`, for the caller to hand to the next frame.
474
+ */
475
+ protected _consumeWord(word: string): void;
476
+ /**
477
+ * Take one spoken word and move every cursor to where it ends.
478
+ *
479
+ * Afterwards `lastCompletedSegment`, `lastOverflow` and
480
+ * `lastLeadingDuplicate` describe what this particular word did; each is
481
+ * cleared at the start of the next call.
482
+ *
483
+ * @param word One token from the provider's word-timestamp stream. It may
484
+ * be a plain word, a word carrying its own spacing or punctuation, or a
485
+ * fragment of a half-open tag -- matching is textual, so the caller does
486
+ * not have to know which.
487
+ */
488
+ advanceWord(word: string): void;
489
+ /**
490
+ * Count characters at the start of `word` that were already spoken.
491
+ *
492
+ * In `"Yeah, I can"` the comma travels with `"Yeah"`. If the provider then
493
+ * reports the next word as `", I"` instead of `"I"`, the comma would be
494
+ * recorded twice, so this returns 2 -- the comma and its space.
495
+ *
496
+ * Returns 0 when that punctuation is new text instead (`'"hello'`), and
497
+ * when the word is nothing but punctuation, which is a mark arriving on its
498
+ * own. Must be called before the cursors move, while `llmPos` still sits at
499
+ * the end of the previous word.
500
+ */
501
+ protected _leadingDuplicateLen(word: string): number;
502
+ /**
503
+ * Return true if `word` could be the next thing spoken here.
504
+ *
505
+ * `advanceWord` without the moving, so a caller can check first. A false
506
+ * answer means the provider skipped ahead, and the word should go to the
507
+ * next frame instead.
508
+ *
509
+ * A word with no letters or digits gets a second chance from
510
+ * `_symbolBelongsHere`, since there is nothing in it to match on.
511
+ */
512
+ wordBelongsCurrentSegment(word: string): boolean;
513
+ /**
514
+ * Ask whether this word would be placed, without placing it.
515
+ *
516
+ * True if some segment would take the word, or if the word simply runs off
517
+ * the end. False if there are no segments left, or a segment turns it down.
518
+ */
519
+ protected _canConsumeWord(word: string): boolean;
520
+ /**
521
+ * Decide whether a word made only of punctuation or symbols belongs here.
522
+ *
523
+ * There is nothing in such a word to match on, so it gets two chances:
524
+ *
525
+ * 1. Look for the word itself in the text still to be spoken. The search
526
+ * starts a little before the cursor, because punctuation is often taken
527
+ * along with the word before it.
528
+ *
529
+ * 2. Accept it as a stand-in. Some providers report a different symbol than
530
+ * the one they were given -- ElevenLabs reports `"->"` as `"-"` -- so the
531
+ * first check can never succeed. If words remain to be spoken and the
532
+ * next thing in the text is itself a symbol, treat the word as that
533
+ * symbol.
534
+ */
535
+ protected _symbolBelongsHere(word: string): boolean;
536
+ /** How far into the user-facing text the spoken words have reached. */
537
+ get userFacingPos(): number;
538
+ /**
539
+ * How far into the LLM's text has been attributed to a word so far.
540
+ *
541
+ * Ahead of `llmSpokenPos` whenever a word swept up a mark that no event has
542
+ * reported yet; the text between the two is attributed but not yet spoken.
543
+ */
544
+ get llmPos(): number;
545
+ /**
546
+ * How far into the LLM's text the provider has actually reported speaking.
547
+ *
548
+ * What a caller showing progress, or ending a frame early, should read:
549
+ * text past this point has had no word event, so it still belongs to what
550
+ * is left to say even when `llmPos` has already credited it to a word.
551
+ */
552
+ get llmSpokenPos(): number;
553
+ /** How far into `ttsText` the provider has spoken, counted from its start. */
554
+ get rawPos(): number;
555
+ /**
556
+ * The end of the last word passed to `advanceWord`, if it did not fit.
557
+ *
558
+ * `null` most of the time. It is set only when that word ran past the end
559
+ * of `ttsText`, with no segment left to take the rest, which means the
560
+ * leftover belongs to the next frame. It is always the tail of the word
561
+ * that was passed in, so the part that did fit is
562
+ * `word.slice(0, word.length - lastOverflow.length)`.
563
+ */
564
+ get lastOverflow(): string | null;
565
+ /**
566
+ * How much of the last word's start was punctuation already spoken.
567
+ *
568
+ * The opposite end of the word from `lastOverflow`: that one is about a
569
+ * tail running past this text, this one about a head repeating punctuation
570
+ * the previous word already took. Cut both off to get the part of the word
571
+ * that belongs to this frame:
572
+ *
573
+ * word.slice(lastLeadingDuplicate, word.length - (lastOverflow ?? "").length)
574
+ */
575
+ get lastLeadingDuplicate(): number;
576
+ /**
577
+ * True once every letter and digit in the text has been spoken.
578
+ *
579
+ * This is not the same as the cursor reaching the end. If all that is left
580
+ * is punctuation or tags, the text counts as finished even though those
581
+ * characters have not been walked over, because no word event is coming
582
+ * for them.
583
+ *
584
+ * There is one exception. Punctuation separated from its word by a space,
585
+ * as French writes `"Comment รงa va ?"`, does arrive as its own word event,
586
+ * so the text stays unfinished until it does (see
587
+ * `_pendingSeparatedPunctuation`). Punctuation stuck to the word itself, as
588
+ * in `"you?"`, was already taken with the word.
589
+ */
590
+ get isComplete(): boolean;
591
+ /**
592
+ * True when all that is left is punctuation set off from its word by a space.
593
+ *
594
+ * Some languages write a space before a mark, as in `"va ?"` or
595
+ * `"Bonjour !"`. A TTS reports that mark as a word of its own, so the
596
+ * segment has to stay open until it arrives.
597
+ *
598
+ * Only real punctuation counts. A trailing emoji or arrow (`"day! ๐Ÿ˜Š"`,
599
+ * `"โ†’"`) never arrives as its own word, so it must not keep the segment
600
+ * open, and tags are removed first for the same reason. Only called once no
601
+ * letters or digits are left.
602
+ */
603
+ protected static _pendingSeparatedPunctuation(remaining: string): boolean;
604
+ /** True when the cursor is partway through a rewritten segment. */
605
+ get inTransformedSegment(): boolean;
606
+ /** The segment finished by the last `advanceWord` call, if any. */
607
+ get lastCompletedSegment(): TextSegment | null;
608
+ /** Put every cursor back to the start of the text. */
609
+ reset(): void;
610
+ }
611
+ //# sourceMappingURL=text_segment_map.d.ts.map