echotools 2.4.7__tar.gz → 2.4.8__tar.gz

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 (291) hide show
  1. {echotools-2.4.7 → echotools-2.4.8}/PKG-INFO +2 -2
  2. {echotools-2.4.7 → echotools-2.4.8}/README.md +1 -1
  3. {echotools-2.4.7 → echotools-2.4.8}/pyproject.toml +18 -1
  4. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/shared/__init__.py +11 -12
  5. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/shared/win_com.py +6 -1
  6. {echotools-2.4.7 → echotools-2.4.8}/src/echotools.egg-info/PKG-INFO +2 -2
  7. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_plat_capture.py +95 -2
  8. {echotools-2.4.7 → echotools-2.4.8}/setup.cfg +0 -0
  9. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/__init__.py +0 -0
  10. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/cache/__init__.py +0 -0
  11. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/cache/list_cache.py +0 -0
  12. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/cache/memory_cache.py +0 -0
  13. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/config/__init__.py +0 -0
  14. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/config/base.py +0 -0
  15. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/config/center.py +0 -0
  16. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/config/center_notify.py +0 -0
  17. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/config/center_template.py +0 -0
  18. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/config/loader.py +0 -0
  19. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/config/merge.py +0 -0
  20. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/errors/__init__.py +0 -0
  21. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/errors/base.py +0 -0
  22. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/errors/classify.py +0 -0
  23. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/errors/common.py +0 -0
  24. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/errors/http.py +0 -0
  25. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/ids/__init__.py +0 -0
  26. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/ids/generator.py +0 -0
  27. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/io/__init__.py +0 -0
  28. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/io/io_utils.py +0 -0
  29. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/io/printstream.py +0 -0
  30. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/logger/__init__.py +0 -0
  31. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/logger/manager.py +0 -0
  32. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/retry/__init__.py +0 -0
  33. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/base/retry/retry.py +0 -0
  34. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/dispatch/__init__.py +0 -0
  35. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/dispatch/candidate.py +0 -0
  36. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/dispatch/dispatcher.py +0 -0
  37. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/dispatch/proxy_selector.py +0 -0
  38. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/dispatch/race.py +0 -0
  39. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/dispatch/selector.py +0 -0
  40. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/dispatch/usage.py +0 -0
  41. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/__init__.py +0 -0
  42. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/parsers/__init__.py +0 -0
  43. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/parsers/stream.py +0 -0
  44. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/parsers/stream_delta.py +0 -0
  45. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/parsers/stream_feed.py +0 -0
  46. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/parsers/stream_final.py +0 -0
  47. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/prompt/__init__.py +0 -0
  48. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/prompt/behavior_blocks.py +0 -0
  49. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/prompt/history.py +0 -0
  50. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/prompt/history_format.py +0 -0
  51. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/prompt/inject.py +0 -0
  52. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/prompt/prompt_helpers.py +0 -0
  53. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/__init__.py +0 -0
  54. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml.py +0 -0
  55. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_patterns/__init__.py +0 -0
  56. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_patterns/invoke.py +0 -0
  57. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_patterns/params.py +0 -0
  58. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_patterns/regex.py +0 -0
  59. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_patterns/strip.py +0 -0
  60. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_schema/__init__.py +0 -0
  61. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_schema/mangled.py +0 -0
  62. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_schema/validate.py +0 -0
  63. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_stream/__init__.py +0 -0
  64. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_stream/body.py +0 -0
  65. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_stream/snap.py +0 -0
  66. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_think/__init__.py +0 -0
  67. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_think/core.py +0 -0
  68. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_think/filter.py +0 -0
  69. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_think/hist.py +0 -0
  70. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_think/hold.py +0 -0
  71. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_think/parse.py +0 -0
  72. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_tool/__init__.py +0 -0
  73. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_tool/comment.py +0 -0
  74. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_tool/fakemarkup.py +0 -0
  75. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_tool/invoke.py +0 -0
  76. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_tool/tools.py +0 -0
  77. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/protocols/entml_tool/values.py +0 -0
  78. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/registry.py +0 -0
  79. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/shared/__init__.py +0 -0
  80. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/shared/coercion.py +0 -0
  81. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/shared/entml_format.py +0 -0
  82. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/shared/history_markup.py +0 -0
  83. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/shared/loop_detect.py +0 -0
  84. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/shared/normalization.py +0 -0
  85. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/shared/schema_render.py +0 -0
  86. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/fncall/tool_id.py +0 -0
  87. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/keys.py +0 -0
  88. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/lifecycle/__init__.py +0 -0
  89. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/lifecycle/manager.py +0 -0
  90. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/lifecycle/updater.py +0 -0
  91. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/lifecycle/updater_pull.py +0 -0
  92. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/process/__init__.py +0 -0
  93. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/process/port.py +0 -0
  94. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/protocol/__init__.py +0 -0
  95. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/protocol/base.py +0 -0
  96. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/terminal/__init__.py +0 -0
  97. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/terminal/conpty.py +0 -0
  98. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/terminal/local/__init__.py +0 -0
  99. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/terminal/local/core.py +0 -0
  100. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/terminal/local/proc.py +0 -0
  101. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/terminal/local/unix.py +0 -0
  102. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/terminal/local/win.py +0 -0
  103. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/terminal/sanitize.py +0 -0
  104. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/terminal/session/__init__.py +0 -0
  105. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/terminal/session/base.py +0 -0
  106. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/terminal/session/client.py +0 -0
  107. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/terminal/ssh.py +0 -0
  108. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/exec/terminal/tmux.py +0 -0
  109. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/__init__.py +0 -0
  110. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/charmap.py +0 -0
  111. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/spinner.py +0 -0
  112. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/ui.py +0 -0
  113. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uicore/mixins/__init__.py +0 -0
  114. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uicore/mixins/uibase.py +0 -0
  115. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uicore/mixins/uicmds.py +0 -0
  116. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uicore/mixins/uiinteract.py +0 -0
  117. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uicore/mixins/uioutput.py +0 -0
  118. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uicore/mixins/uistream.py +0 -0
  119. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uicore/ui_console.py +0 -0
  120. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uicore/ui_io.py +0 -0
  121. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uicore/ui_log.py +0 -0
  122. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uicore/ui_platform.py +0 -0
  123. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uicore/ui_text.py +0 -0
  124. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uicore/ui_types.py +0 -0
  125. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uilayout/ui_bridge.py +0 -0
  126. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uilayout/ui_countdown.py +0 -0
  127. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uilayout/ui_layout.py +0 -0
  128. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uilayout/ui_misc.py +0 -0
  129. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uilayout/ui_panel.py +0 -0
  130. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uilayout/ui_table.py +0 -0
  131. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uilayout/ui_tree.py +0 -0
  132. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uiwidgets/ui_box.py +0 -0
  133. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uiwidgets/ui_editor.py +0 -0
  134. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uiwidgets/ui_progress.py +0 -0
  135. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uiwidgets/ui_richcli.py +0 -0
  136. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uiwidgets/ui_select.py +0 -0
  137. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uiwidgets/ui_stream.py +0 -0
  138. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/console/uiwidgets/ui_themes.py +0 -0
  139. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/events/__init__.py +0 -0
  140. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/events/bus.py +0 -0
  141. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/events/event.py +0 -0
  142. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/spinner/__init__.py +0 -0
  143. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/spinner/spinner.py +0 -0
  144. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/spinner/spinner_color.py +0 -0
  145. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/tracing/__init__.py +0 -0
  146. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/tracing/context.py +0 -0
  147. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/tracing/span.py +0 -0
  148. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/tracing/tracer.py +0 -0
  149. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/translate.py +0 -0
  150. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/watcher/__init__.py +0 -0
  151. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/watcher/file_watcher.py +0 -0
  152. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/__init__.py +0 -0
  153. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/application.py +0 -0
  154. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/broker.py +0 -0
  155. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/input_box/app.js +0 -0
  156. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/input_box/components/filezone.js +0 -0
  157. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/input_box/components/motionkit.js +0 -0
  158. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/input_box/components/sendbutton.js +0 -0
  159. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/input_box/components/sortablelist.css +0 -0
  160. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/input_box/components/sortablelist.js +0 -0
  161. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/input_box/components/textinput.js +0 -0
  162. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/input_box/components/voiceinput.js +0 -0
  163. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/input_box/fonts/inter-500.woff2 +0 -0
  164. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/input_box/fonts/inter-600.woff2 +0 -0
  165. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/input_box/fonts/inter400.woff2 +0 -0
  166. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/input_box/inputbox.css +0 -0
  167. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/input_box/inputbox.js +0 -0
  168. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/input_box/style.css +0 -0
  169. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/input_box/voicegif.js +0 -0
  170. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/middleware.py +0 -0
  171. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/stats.py +0 -0
  172. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/media/web/utils.py +0 -0
  173. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/__init__.py +0 -0
  174. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/audio_monitor/api.py +0 -0
  175. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/audio_monitor/config.py +0 -0
  176. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/audio_monitor/linux.py +0 -0
  177. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/audio_monitor/mac.py +0 -0
  178. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/audio_monitor/types.py +0 -0
  179. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/audio_monitor/win.py +0 -0
  180. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/audio_record/api.py +0 -0
  181. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/audio_record/config.py +0 -0
  182. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/audio_record/linux.py +0 -0
  183. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/audio_record/mac.py +0 -0
  184. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/audio_record/win.py +0 -0
  185. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/audio_record/win_wasapi.py +0 -0
  186. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/audio_record/win_winmm.py +0 -0
  187. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/screenshot/api.py +0 -0
  188. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/screenshot/config.py +0 -0
  189. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/screenshot/linux.py +0 -0
  190. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/screenshot/mac.py +0 -0
  191. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/screenshot/win.py +0 -0
  192. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/screenshot/win_dxgi.py +0 -0
  193. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/screenshot/win_gdi.py +0 -0
  194. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/shared/bmp.py +0 -0
  195. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/shared/pcm.py +0 -0
  196. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/shared/platform.py +0 -0
  197. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/capture/shared/wav.py +0 -0
  198. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/files/__init__.py +0 -0
  199. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/files/file_util.py +0 -0
  200. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/network/__init__.py +0 -0
  201. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/network/http_utils.py +0 -0
  202. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/plugin/__init__.py +0 -0
  203. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/plugin/base.py +0 -0
  204. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/plugin/discovery.py +0 -0
  205. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/plugin/registry.py +0 -0
  206. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/plugin/registry_ops.py +0 -0
  207. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/proxy/__init__.py +0 -0
  208. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/proxy/manager.py +0 -0
  209. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/sdk/__init__.py +0 -0
  210. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/sdk/facade.py +0 -0
  211. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/sdk/runtime.py +0 -0
  212. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/plat/sdk/scheduler.py +0 -0
  213. {echotools-2.4.7 → echotools-2.4.8}/src/echotools/version.py +0 -0
  214. {echotools-2.4.7 → echotools-2.4.8}/src/echotools.egg-info/SOURCES.txt +0 -0
  215. {echotools-2.4.7 → echotools-2.4.8}/src/echotools.egg-info/dependency_links.txt +0 -0
  216. {echotools-2.4.7 → echotools-2.4.8}/src/echotools.egg-info/requires.txt +0 -0
  217. {echotools-2.4.7 → echotools-2.4.8}/src/echotools.egg-info/top_level.txt +0 -0
  218. {echotools-2.4.7 → echotools-2.4.8}/src/tests/_check_parity.py +0 -0
  219. {echotools-2.4.7 → echotools-2.4.8}/src/tests/bench_import.py +0 -0
  220. {echotools-2.4.7 → echotools-2.4.8}/src/tests/conftest.py +0 -0
  221. {echotools-2.4.7 → echotools-2.4.8}/src/tests/fixtures/__init__.py +0 -0
  222. {echotools-2.4.7 → echotools-2.4.8}/src/tests/fixtures/entml_golden.py +0 -0
  223. {echotools-2.4.7 → echotools-2.4.8}/src/tests/fixtures/entml_golden_update.py +0 -0
  224. {echotools-2.4.7 → echotools-2.4.8}/src/tests/fixtures/simulated_fake_history_markup_responses.py +0 -0
  225. {echotools-2.4.7 → echotools-2.4.8}/src/tests/fixtures/simulated_fault_thinking_responses.py +0 -0
  226. {echotools-2.4.7 → echotools-2.4.8}/src/tests/fixtures/simulated_llm_tool_responses.py +0 -0
  227. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_adversarial_stream_splits.py +0 -0
  228. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_cache_retry.py +0 -0
  229. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_completion.py +0 -0
  230. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_config.py +0 -0
  231. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_config_extended.py +0 -0
  232. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_console.py +0 -0
  233. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_coverage_core.py +0 -0
  234. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_dispatch.py +0 -0
  235. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_dispatch_extended.py +0 -0
  236. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_dispatch_race.py +0 -0
  237. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_entml_agent_output_formats.py +0 -0
  238. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_entml_bare_invoke_format.py +0 -0
  239. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_entml_batch_stream_comprehensive.py +0 -0
  240. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_entml_fake_structure_markup.py +0 -0
  241. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_entml_golden.py +0 -0
  242. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_entml_invoke_known_tool_gate.py +0 -0
  243. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_entml_parser_comprehensive.py +0 -0
  244. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_entml_protocol.py +0 -0
  245. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_entml_stream_json.py +0 -0
  246. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_entml_stream_json_exhaustive.py +0 -0
  247. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_entml_thinking_history.py +0 -0
  248. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_entml_thinking_parse.py +0 -0
  249. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_entml_tool_parse_leak.py +0 -0
  250. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_entml_tool_pipeline.py +0 -0
  251. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_entml_tools.py +0 -0
  252. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_errors.py +0 -0
  253. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_errors_common.py +0 -0
  254. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_events.py +0 -0
  255. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_events_event.py +0 -0
  256. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_facade.py +0 -0
  257. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_fake_history_markup_batch.py +0 -0
  258. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_fake_history_markup_invoke_preserve.py +0 -0
  259. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_fake_history_markup_reply_protect.py +0 -0
  260. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_fake_history_markup_stream.py +0 -0
  261. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_fault_thinking_close_batch.py +0 -0
  262. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_fault_thinking_close_stream.py +0 -0
  263. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_fncall.py +0 -0
  264. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_fncall_stream_thinking.py +0 -0
  265. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_history_markup_filter.py +0 -0
  266. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_ids.py +0 -0
  267. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_imports.py +0 -0
  268. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_io.py +0 -0
  269. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_keys.py +0 -0
  270. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_lifecycle.py +0 -0
  271. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_logger.py +0 -0
  272. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_merge.py +0 -0
  273. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_model_branch_matrix.py +0 -0
  274. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_multiline_parameter_comprehensive.py +0 -0
  275. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_plugin.py +0 -0
  276. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_printstream.py +0 -0
  277. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_protocols.py +0 -0
  278. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_proxy.py +0 -0
  279. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_proxy_selector.py +0 -0
  280. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_runtime.py +0 -0
  281. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_scheduler.py +0 -0
  282. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_schema_validate.py +0 -0
  283. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_simulated_llm_tool_parse.py +0 -0
  284. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_stream_partial_json_parity.py +0 -0
  285. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_stream_realtime_parse.py +0 -0
  286. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_tool_id.py +0 -0
  287. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_tracing.py +0 -0
  288. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_ui_bridge.py +0 -0
  289. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_usage.py +0 -0
  290. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_web.py +0 -0
  291. {echotools-2.4.7 → echotools-2.4.8}/src/tests/test_web_broker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: echotools
3
- Version: 2.4.7
3
+ Version: 2.4.8
4
4
  Summary: 通用基础设施 SDK:配置、日志、事件、调度、插件、协议、调用链
5
5
  Home-page: https://github.com/nichengfuben/echotools
6
6
  Author: nichengfuben
@@ -58,7 +58,7 @@ Requires-Dist: ruff>=0.4.0; extra == "dev"
58
58
 
59
59
  通用基础设施 SDK:配置、日志、事件、调度、插件、调用链,以及 **entml** LLM 工具调用协议与终端 Console UI。
60
60
 
61
- 完全项目无关,兼容 Python 3.8–3.14。当前版本:**2.4.7**(详见 [CHANGELOG](docs/CHANGELOG.md))。
61
+ 完全项目无关,兼容 Python 3.8–3.14。当前版本:**2.4.8**(详见 [CHANGELOG](docs/CHANGELOG.md))。
62
62
 
63
63
  ## 安装
64
64
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  通用基础设施 SDK:配置、日志、事件、调度、插件、调用链,以及 **entml** LLM 工具调用协议与终端 Console UI。
4
4
 
5
- 完全项目无关,兼容 Python 3.8–3.14。当前版本:**2.4.7**(详见 [CHANGELOG](docs/CHANGELOG.md))。
5
+ 完全项目无关,兼容 Python 3.8–3.14。当前版本:**2.4.8**(详见 [CHANGELOG](docs/CHANGELOG.md))。
6
6
 
7
7
  ## 安装
8
8
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "echotools"
7
- version = "2.4.7"
7
+ version = "2.4.8"
8
8
  description = "通用基础设施 SDK:配置、日志、事件、调度、插件、协议、调用链"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
@@ -142,6 +142,23 @@ omit = [
142
142
  "*/web/application.py",
143
143
  "*/web/middleware.py",
144
144
  "*/web/utils.py",
145
+ "*/plat/capture/shared/win_com.py",
146
+ "*/plat/capture/audio_monitor/api.py",
147
+ "*/plat/capture/audio_record/api.py",
148
+ "*/plat/capture/screenshot/api.py",
149
+ "*/plat/capture/audio_monitor/win.py",
150
+ "*/plat/capture/audio_monitor/mac.py",
151
+ "*/plat/capture/audio_monitor/linux.py",
152
+ "*/plat/capture/audio_record/win.py",
153
+ "*/plat/capture/audio_record/win_wasapi.py",
154
+ "*/plat/capture/audio_record/win_winmm.py",
155
+ "*/plat/capture/audio_record/mac.py",
156
+ "*/plat/capture/audio_record/linux.py",
157
+ "*/plat/capture/screenshot/win.py",
158
+ "*/plat/capture/screenshot/win_dxgi.py",
159
+ "*/plat/capture/screenshot/win_gdi.py",
160
+ "*/plat/capture/screenshot/mac.py",
161
+ "*/plat/capture/screenshot/linux.py",
145
162
  ]
146
163
 
147
164
  [tool.coverage.report]
@@ -10,29 +10,28 @@ from echotools.plat.capture.shared.platform import (
10
10
  load_lib,
11
11
  )
12
12
  from echotools.plat.capture.shared.wav import write_wav
13
- from echotools.plat.capture.shared.win_com import (
14
- GUID,
15
- com_call,
16
- com_qi,
17
- com_release,
18
- make_guid,
19
- )
13
+
14
+ if IS_WINDOWS:
15
+ from echotools.plat.capture.shared.win_com import (
16
+ GUID,
17
+ com_call,
18
+ com_qi,
19
+ com_release,
20
+ make_guid,
21
+ )
20
22
 
21
23
  __all__ = [
22
- "GUID",
23
24
  "IS_LINUX",
24
25
  "IS_MACOS",
25
26
  "IS_WINDOWS",
26
27
  "_OS",
27
28
  "clamp",
28
- "com_call",
29
- "com_qi",
30
- "com_release",
31
29
  "load_lib",
32
- "make_guid",
33
30
  "mix_streams",
34
31
  "resample_pcm",
35
32
  "rgba_to_bgra",
36
33
  "write_bmp",
37
34
  "write_wav",
38
35
  ]
36
+ if IS_WINDOWS:
37
+ __all__ += ["GUID", "com_call", "com_qi", "com_release", "make_guid"]
@@ -3,8 +3,8 @@ from __future__ import annotations
3
3
  """Windows COM vtable helpers shared by capture backends."""
4
4
 
5
5
  from ctypes import (
6
+ CFUNCTYPE,
6
7
  POINTER,
7
- WINFUNCTYPE,
8
8
  Structure,
9
9
  byref,
10
10
  c_int,
@@ -16,6 +16,11 @@ from ctypes import (
16
16
  sizeof,
17
17
  )
18
18
 
19
+ try:
20
+ from ctypes import WINFUNCTYPE
21
+ except ImportError: # non-Windows: coverage import only
22
+ WINFUNCTYPE = CFUNCTYPE # type: ignore[misc,assignment]
23
+
19
24
  HRESULT = c_int
20
25
  PTR_SIZE = sizeof(c_void_p)
21
26
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: echotools
3
- Version: 2.4.7
3
+ Version: 2.4.8
4
4
  Summary: 通用基础设施 SDK:配置、日志、事件、调度、插件、协议、调用链
5
5
  Home-page: https://github.com/nichengfuben/echotools
6
6
  Author: nichengfuben
@@ -58,7 +58,7 @@ Requires-Dist: ruff>=0.4.0; extra == "dev"
58
58
 
59
59
  通用基础设施 SDK:配置、日志、事件、调度、插件、调用链,以及 **entml** LLM 工具调用协议与终端 Console UI。
60
60
 
61
- 完全项目无关,兼容 Python 3.8–3.14。当前版本:**2.4.7**(详见 [CHANGELOG](docs/CHANGELOG.md))。
61
+ 完全项目无关,兼容 Python 3.8–3.14。当前版本:**2.4.8**(详见 [CHANGELOG](docs/CHANGELOG.md))。
62
62
 
63
63
  ## 安装
64
64
 
@@ -12,8 +12,15 @@ from echotools.plat.capture import (
12
12
  ScreenshotConfig,
13
13
  get_playing_processes,
14
14
  )
15
- from echotools.plat.capture.shared.bmp import write_bmp
16
- from echotools.plat.capture.shared.pcm import mix_streams
15
+ from echotools.plat.capture.shared.bmp import rgba_to_bgra, write_bmp
16
+ from echotools.plat.capture.shared.pcm import clamp, mix_streams, resample_pcm
17
+ from echotools.plat.capture.shared.platform import (
18
+ _OS,
19
+ IS_LINUX,
20
+ IS_MACOS,
21
+ IS_WINDOWS,
22
+ load_lib,
23
+ )
17
24
  from echotools.plat.capture.shared.wav import write_wav
18
25
 
19
26
 
@@ -33,11 +40,96 @@ def test_audio_process_unknown_volume() -> None:
33
40
  assert "vol=" not in repr(ap)
34
41
 
35
42
 
43
+ def test_audio_process_eq_not_implemented() -> None:
44
+ assert AudioProcess(1, "x").__eq__(None) is NotImplemented
45
+ assert AudioProcess(0, "anon") == AudioProcess(0, "anon")
46
+ assert "anon" in repr(AudioProcess(0, "anon"))
47
+
48
+
49
+ def test_mix_streams_empty() -> None:
50
+ assert mix_streams([], 16) == b""
51
+
52
+
36
53
  def test_mix_streams_single() -> None:
37
54
  data = b"\x00\x01\x00\x02"
38
55
  assert mix_streams([data], 16) == data
39
56
 
40
57
 
58
+ def test_mix_streams_pads_shorter_stream() -> None:
59
+ s1 = struct.pack("<hh", 1000, 2000)
60
+ s2 = struct.pack("<h", 3000)
61
+ mixed = mix_streams([s1, s2], 16, mix_normalize=False)
62
+ assert len(mixed) == len(s1)
63
+
64
+
65
+ def test_mix_streams_32bit() -> None:
66
+ s1 = struct.pack("<ii", 1000, 2000)
67
+ s2 = struct.pack("<ii", 3000, 4000)
68
+ mixed = mix_streams([s1, s2], 32, mix_normalize=False)
69
+ v1, v2 = struct.unpack("<ii", mixed)
70
+ assert v1 == 2000
71
+ assert v2 == 3000
72
+
73
+
74
+ def test_clamp() -> None:
75
+ assert clamp(5, 0, 10) == 5
76
+ assert clamp(-1, 0, 10) == 0
77
+ assert clamp(100, 0, 10) == 10
78
+
79
+
80
+ def test_resample_pcm_identity() -> None:
81
+ pcm = struct.pack("<hh", 100, 200)
82
+ assert resample_pcm(pcm, 44100, 2, 16, 44100, 2, 16) == pcm
83
+
84
+
85
+ def test_resample_pcm_mono_to_stereo() -> None:
86
+ pcm = struct.pack("<h", 1000)
87
+ out = resample_pcm(pcm, 44100, 1, 16, 44100, 2, 16)
88
+ v1, v2 = struct.unpack("<hh", out)
89
+ assert v1 == v2 == 1000
90
+
91
+
92
+ def test_resample_pcm_downsample() -> None:
93
+ pcm = struct.pack("<hh", 100, 200) * 20
94
+ out = resample_pcm(pcm, 44100, 2, 16, 22050, 2, 16)
95
+ assert len(out) < len(pcm)
96
+
97
+
98
+ def test_resample_pcm_multi_channel() -> None:
99
+ pcm = struct.pack("<hhhh", 1, 2, 3, 4)
100
+ out = resample_pcm(pcm, 44100, 4, 16, 44100, 3, 16)
101
+ assert len(out) == 6
102
+ assert struct.unpack("<hhh", out) == (1, 2, 3)
103
+
104
+
105
+ def test_load_lib_missing() -> None:
106
+ assert load_lib("echotools_nonexistent_lib_xyz") is None
107
+
108
+
109
+ def test_platform_flags() -> None:
110
+ import platform
111
+
112
+ assert _OS == platform.system()
113
+ assert sum((IS_WINDOWS, IS_MACOS, IS_LINUX)) <= 1
114
+
115
+
116
+ def test_rgba_to_bgra() -> None:
117
+ data = bytes([255, 0, 0, 255])
118
+ out = rgba_to_bgra(data)
119
+ assert out[0] == 0
120
+ assert out[2] == 255
121
+
122
+
123
+ def test_write_bmp_bottom_up() -> None:
124
+ pixels = b"\x00" * (4 * 2 * 2)
125
+ with tempfile.TemporaryDirectory() as tmp:
126
+ path = str(Path(tmp) / "bottom.bmp")
127
+ write_bmp(path, 2, 2, pixels, top_down=False)
128
+ raw = Path(path).read_bytes()
129
+ (height,) = struct.unpack_from("<i", raw, 22)
130
+ assert height == 2
131
+
132
+
41
133
  def test_mix_streams_average() -> None:
42
134
  s1 = struct.pack("<hh", 1000, 2000)
43
135
  s2 = struct.pack("<hh", 3000, 4000)
@@ -98,6 +190,7 @@ def test_audio_record_config_defaults() -> None:
98
190
  assert cfg.buffer_ms == 50
99
191
  assert cfg.frame_bytes == 4
100
192
  assert cfg.buffer_frames == int(44100 * 50 / 1000)
193
+ assert cfg.total_frames == int(44100 * cfg.record_seconds)
101
194
 
102
195
 
103
196
  def test_screenshot_config_defaults() -> None:
File without changes