echotools 2.3.38__tar.gz → 2.3.39__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 (189) hide show
  1. {echotools-2.3.38 → echotools-2.3.39}/PKG-INFO +1 -1
  2. {echotools-2.3.38 → echotools-2.3.39}/pyproject.toml +5 -1
  3. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/parsers/stream.py +7 -2
  4. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/prompt/inject.py +4 -1
  5. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/prompt/prompt_helpers.py +6 -6
  6. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/protocols/entml.py +0 -1
  7. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/protocols/entml_invoke.py +0 -1
  8. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/console/spinner.py +4 -4
  9. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/console/ui.py +28 -29
  10. {echotools-2.3.38 → echotools-2.3.39}/src/echotools.egg-info/PKG-INFO +1 -1
  11. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_console.py +0 -2
  12. {echotools-2.3.38 → echotools-2.3.39}/README.md +0 -0
  13. {echotools-2.3.38 → echotools-2.3.39}/docs/README.md +0 -0
  14. {echotools-2.3.38 → echotools-2.3.39}/setup.cfg +0 -0
  15. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/__init__.py +0 -0
  16. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/cache/__init__.py +0 -0
  17. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/cache/list_cache.py +0 -0
  18. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/cache/memory_cache.py +0 -0
  19. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/config/__init__.py +0 -0
  20. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/config/base.py +0 -0
  21. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/config/center.py +0 -0
  22. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/config/center_notify.py +0 -0
  23. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/config/center_template.py +0 -0
  24. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/config/loader.py +0 -0
  25. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/config/merge.py +0 -0
  26. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/errors/__init__.py +0 -0
  27. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/errors/base.py +0 -0
  28. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/errors/classify.py +0 -0
  29. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/errors/common.py +0 -0
  30. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/errors/http.py +0 -0
  31. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/ids/__init__.py +0 -0
  32. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/ids/generator.py +0 -0
  33. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/io/__init__.py +0 -0
  34. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/io/io_utils.py +0 -0
  35. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/io/printstream.py +0 -0
  36. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/logger/__init__.py +0 -0
  37. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/logger/manager.py +0 -0
  38. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/retry/__init__.py +0 -0
  39. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/base/retry/retry.py +0 -0
  40. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/compat.py +0 -0
  41. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/dispatch/__init__.py +0 -0
  42. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/dispatch/candidate.py +0 -0
  43. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/dispatch/dispatcher.py +0 -0
  44. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/dispatch/proxy_selector.py +0 -0
  45. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/dispatch/race.py +0 -0
  46. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/dispatch/selector.py +0 -0
  47. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/dispatch/usage.py +0 -0
  48. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/__init__.py +0 -0
  49. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/parsers/__init__.py +0 -0
  50. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/parsers/xml_params.py +0 -0
  51. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/parsers/xml_parser.py +0 -0
  52. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/prompt/__init__.py +0 -0
  53. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/prompt/history.py +0 -0
  54. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/prompt/history_format.py +0 -0
  55. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/prompt/templates.py +0 -0
  56. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/protocols/__init__.py +0 -0
  57. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/protocols/entml_patterns.py +0 -0
  58. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/protocols/entml_sanitize.py +0 -0
  59. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/protocols/entml_thinking.py +0 -0
  60. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/protocols/entml_thinking_history.py +0 -0
  61. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/protocols/entml_thinking_parse.py +0 -0
  62. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/protocols/entml_tools.py +0 -0
  63. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/protocols/entml_values.py +0 -0
  64. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/registry.py +0 -0
  65. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/shared/__init__.py +0 -0
  66. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/shared/coercion.py +0 -0
  67. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/shared/loop_detect.py +0 -0
  68. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/shared/normalization.py +0 -0
  69. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/shared/schema_render.py +0 -0
  70. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/fncall/shared/xml_helpers.py +0 -0
  71. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/keys.py +0 -0
  72. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/lifecycle/__init__.py +0 -0
  73. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/lifecycle/manager.py +0 -0
  74. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/lifecycle/updater.py +0 -0
  75. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/lifecycle/updater_pull.py +0 -0
  76. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/process/__init__.py +0 -0
  77. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/process/port.py +0 -0
  78. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/protocol/__init__.py +0 -0
  79. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/protocol/base.py +0 -0
  80. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/terminal/__init__.py +0 -0
  81. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/terminal/conpty.py +0 -0
  82. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/terminal/local/__init__.py +0 -0
  83. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/terminal/local/core.py +0 -0
  84. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/terminal/local/proc.py +0 -0
  85. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/terminal/local/unix.py +0 -0
  86. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/terminal/local/win.py +0 -0
  87. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/terminal/sanitize.py +0 -0
  88. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/terminal/session/__init__.py +0 -0
  89. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/terminal/session/base.py +0 -0
  90. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/terminal/session/client.py +0 -0
  91. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/terminal/ssh.py +0 -0
  92. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/exec/terminal/tmux.py +0 -0
  93. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/console/__init__.py +1 -1
  94. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/console/charmap.py +0 -0
  95. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/events/__init__.py +0 -0
  96. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/events/bus.py +0 -0
  97. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/events/event.py +0 -0
  98. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/spinner/__init__.py +0 -0
  99. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/spinner/spinner.py +0 -0
  100. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/spinner/spinner_color.py +0 -0
  101. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/tracing/__init__.py +0 -0
  102. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/tracing/context.py +0 -0
  103. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/tracing/span.py +0 -0
  104. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/tracing/tracer.py +0 -0
  105. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/translate.py +0 -0
  106. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/watcher/__init__.py +0 -0
  107. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/watcher/file_watcher.py +0 -0
  108. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/__init__.py +0 -0
  109. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/application.py +0 -0
  110. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/broker.py +0 -0
  111. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/input_box/app.js +0 -0
  112. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/input_box/components/filezone.js +0 -0
  113. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/input_box/components/motionkit.js +0 -0
  114. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/input_box/components/sendbutton.js +0 -0
  115. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/input_box/components/sortablelist.css +0 -0
  116. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/input_box/components/sortablelist.js +0 -0
  117. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/input_box/components/textinput.js +0 -0
  118. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/input_box/components/voiceinput.js +0 -0
  119. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/input_box/fonts/inter-500.woff2 +0 -0
  120. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/input_box/fonts/inter-600.woff2 +0 -0
  121. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/input_box/fonts/inter400.woff2 +0 -0
  122. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/input_box/fonts/tailwind.css +0 -0
  123. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/input_box/inputbox.css +0 -0
  124. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/input_box/inputbox.js +0 -0
  125. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/input_box/style.css +0 -0
  126. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/input_box/voicegif.js +0 -0
  127. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/middleware.py +0 -0
  128. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/stats.py +0 -0
  129. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/media/web/utils.py +0 -0
  130. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/plat/files/__init__.py +0 -0
  131. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/plat/files/file_util.py +0 -0
  132. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/plat/network/__init__.py +0 -0
  133. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/plat/network/http_utils.py +0 -0
  134. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/plat/plugin/__init__.py +0 -0
  135. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/plat/plugin/base.py +0 -0
  136. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/plat/plugin/discovery.py +0 -0
  137. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/plat/plugin/registry.py +0 -0
  138. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/plat/plugin/registry_ops.py +0 -0
  139. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/plat/proxy/__init__.py +0 -0
  140. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/plat/proxy/manager.py +0 -0
  141. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/plat/runtime/__init__.py +0 -0
  142. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/plat/runtime/collector.py +0 -0
  143. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/plat/scheduler/__init__.py +0 -0
  144. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/plat/scheduler/scheduler.py +0 -0
  145. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/plat/sdk/__init__.py +0 -0
  146. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/plat/sdk/facade.py +0 -0
  147. {echotools-2.3.38 → echotools-2.3.39}/src/echotools/version.py +0 -0
  148. {echotools-2.3.38 → echotools-2.3.39}/src/echotools.egg-info/SOURCES.txt +0 -0
  149. {echotools-2.3.38 → echotools-2.3.39}/src/echotools.egg-info/dependency_links.txt +0 -0
  150. {echotools-2.3.38 → echotools-2.3.39}/src/echotools.egg-info/requires.txt +0 -0
  151. {echotools-2.3.38 → echotools-2.3.39}/src/echotools.egg-info/top_level.txt +0 -0
  152. {echotools-2.3.38 → echotools-2.3.39}/src/tests/bench_import.py +0 -0
  153. {echotools-2.3.38 → echotools-2.3.39}/src/tests/conftest.py +0 -0
  154. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_cache_retry.py +0 -0
  155. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_completion.py +0 -0
  156. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_config.py +0 -0
  157. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_config_extended.py +0 -0
  158. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_coverage_core.py +0 -0
  159. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_dispatch.py +0 -0
  160. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_dispatch_extended.py +0 -0
  161. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_dispatch_race.py +0 -0
  162. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_entml_protocol.py +0 -0
  163. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_entml_thinking_history.py +0 -0
  164. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_entml_thinking_parse.py +0 -0
  165. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_entml_tools.py +0 -0
  166. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_errors.py +0 -0
  167. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_errors_common.py +0 -0
  168. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_events.py +0 -0
  169. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_events_event.py +0 -0
  170. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_facade.py +0 -0
  171. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_fncall.py +0 -0
  172. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_ids.py +0 -0
  173. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_imports.py +0 -0
  174. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_io.py +0 -0
  175. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_keys.py +0 -0
  176. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_lifecycle.py +0 -0
  177. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_logger.py +0 -0
  178. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_merge.py +0 -0
  179. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_plugin.py +0 -0
  180. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_printstream.py +0 -0
  181. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_protocols.py +0 -0
  182. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_proxy.py +0 -0
  183. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_proxy_selector.py +0 -0
  184. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_runtime.py +0 -0
  185. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_scheduler.py +0 -0
  186. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_tracing.py +0 -0
  187. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_usage.py +0 -0
  188. {echotools-2.3.38 → echotools-2.3.39}/src/tests/test_web.py +0 -0
  189. {echotools-2.3.38 → echotools-2.3.39}/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.3.38
3
+ Version: 2.3.39
4
4
  Summary: 通用基础设施 SDK:配置、日志、事件、调度、插件、协议、调用链
5
5
  Author: nichengfuben
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "echotools"
7
- version = "2.3.38"
7
+ version = "2.3.39"
8
8
  description = "通用基础设施 SDK:配置、日志、事件、调度、插件、协议、调用链"
9
9
  readme = "docs/README.md"
10
10
  requires-python = ">=3.8"
@@ -97,6 +97,10 @@ disable_error_code = [
97
97
  module = "echotools.exec.terminal.*"
98
98
  ignore_errors = true
99
99
 
100
+ [[tool.mypy.overrides]]
101
+ module = "echotools.media.console.ui"
102
+ ignore_errors = true
103
+
100
104
  [tool.pytest.ini_options]
101
105
  testpaths = ["src/tests"]
102
106
  asyncio_mode = "auto"
@@ -9,10 +9,13 @@ from typing import Any, Dict, List, Optional, Tuple
9
9
 
10
10
  from echotools.exec.protocol.base import ToolProtocol
11
11
 
12
+
12
13
  # 懒导入:仅 entml 协议需要
13
14
  def _make_thinking_filter(protocol: ToolProtocol):
14
15
  if getattr(protocol, "id", None) == "entml":
15
- from echotools.exec.fncall.protocols.entml_thinking_parse import EntmlThinkingStreamFilter
16
+ from echotools.exec.fncall.protocols.entml_thinking_parse import (
17
+ EntmlThinkingStreamFilter,
18
+ )
16
19
  return EntmlThinkingStreamFilter()
17
20
  return None
18
21
 
@@ -213,7 +216,9 @@ class FncallStreamParser:
213
216
 
214
217
  # 兜底:剥离残留 <entml:thinking>(holdback 边界/分片异常时)
215
218
  if self._thinking_filter is not None and clean_text:
216
- from echotools.exec.fncall.protocols.entml_thinking_parse import split_entml_thinking
219
+ from echotools.exec.fncall.protocols.entml_thinking_parse import (
220
+ split_entml_thinking,
221
+ )
217
222
  clean_text, more_thinking = split_entml_thinking(clean_text)
218
223
  if more_thinking:
219
224
  self._thinking_parts.append(more_thinking)
@@ -28,7 +28,10 @@ from echotools.exec.fncall.protocols.entml_thinking_history import (
28
28
  parse_include_thinking_in_history,
29
29
  )
30
30
  from echotools.exec.fncall.shared.loop_detect import detect_tool_loop
31
- from echotools.exec.fncall.shared.normalization import format_tool_descs, normalize_content
31
+ from echotools.exec.fncall.shared.normalization import (
32
+ format_tool_descs,
33
+ normalize_content,
34
+ )
32
35
  from echotools.exec.protocol.base import ToolProtocol
33
36
 
34
37
  __all__ = ["inject_fncall"]
@@ -3,6 +3,10 @@ from __future__ import annotations
3
3
  from typing import Any, Dict, List, Optional, Set, Tuple
4
4
 
5
5
  from echotools.base.logger.manager import get_logger
6
+ from echotools.exec.fncall.protocols.entml_thinking_history import (
7
+ extract_reasoning_text,
8
+ format_entml_thinking_history_block,
9
+ )
6
10
  from echotools.exec.fncall.shared.normalization import normalize_content
7
11
 
8
12
  from .history import (
@@ -15,11 +19,6 @@ from .history import (
15
19
  _try_convert_user_to_tool,
16
20
  )
17
21
 
18
- from echotools.exec.fncall.protocols.entml_thinking_history import (
19
- extract_reasoning_text,
20
- format_entml_thinking_history_block,
21
- )
22
-
23
22
  logger = get_logger(__name__)
24
23
 
25
24
 
@@ -86,7 +85,8 @@ def _format_assistant_text_block(
86
85
  )
87
86
  if not blocks:
88
87
  return None
89
- return f"<assistant>\n{'\n\n'.join(blocks)}\n</assistant>"
88
+ body = "\n\n".join(blocks)
89
+ return f"<assistant>\n{body}\n</assistant>"
90
90
 
91
91
 
92
92
  def _register_tool_call_names(
@@ -15,7 +15,6 @@ from echotools.exec.fncall.prompt.templates import (
15
15
  _HISTORY_TOOL_INVOKE_REMINDER_EN,
16
16
  )
17
17
  from echotools.exec.fncall.protocols.entml_invoke import (
18
- format_entml_tool_calls,
19
18
  parse_entml_tool_calls,
20
19
  )
21
20
  from echotools.exec.fncall.protocols.entml_patterns import BLOCK_RE
@@ -4,7 +4,6 @@ import json
4
4
  from typing import Any, Dict, List, Optional
5
5
 
6
6
  from .entml_patterns import (
7
- BLOCK_RE,
8
7
  INVOKE_RE,
9
8
  PARAM_RE,
10
9
  PARAMETERS_RE,
@@ -6,13 +6,13 @@ Spinner 动画引擎 - 绿→蓝单向渐变版
6
6
  - stop() 后恢复光标并清除 spinner 行
7
7
  """
8
8
 
9
- import sys
10
- import time
9
+ import math
11
10
  import os
12
11
  import platform
13
- import math
12
+ import sys
14
13
  import threading
15
- from typing import List, Tuple, Dict, Callable, Optional
14
+ import time
15
+ from typing import Callable, Dict, List, Optional, Tuple
16
16
 
17
17
  try:
18
18
  from wcwidth import wcswidth as _wcswidth
@@ -22,12 +22,11 @@ import math
22
22
  import os
23
23
  import re
24
24
  import sys
25
- from pathlib import Path
26
25
  import threading
27
26
  import time
28
- from contextlib import contextmanager
29
27
  from dataclasses import dataclass, field
30
28
  from enum import Enum, auto
29
+ from pathlib import Path
31
30
  from typing import (
32
31
  Any,
33
32
  AsyncIterator,
@@ -51,7 +50,7 @@ from typing import (
51
50
 
52
51
  from rich.console import Console
53
52
  from rich.text import Text
54
- from wcwidth import wcwidth, wcswidth
53
+ from wcwidth import wcswidth, wcwidth
55
54
 
56
55
  # ══════════════════════════════════════════════════════════════════════════════
57
56
  # 类型定义与平台常量
@@ -133,39 +132,39 @@ class _WindowsBackend:
133
132
 
134
133
  def _define_structures(self) -> None:
135
134
  """定义 Windows 控制台输入记录结构体"""
136
- ctypes = self._ctypes
135
+ ct = self._ctypes
137
136
 
138
- class COORD(ctypes.Structure):
139
- _fields_ = [("X", ctypes.c_short), ("Y", ctypes.c_short)]
137
+ class COORD(ct.Structure):
138
+ _fields_ = [("X", ct.c_short), ("Y", ct.c_short)]
140
139
 
141
- class KEY_EVENT_RECORD(ctypes.Structure):
140
+ class KEY_EVENT_RECORD(ct.Structure):
142
141
  _fields_ = [
143
- ("bKeyDown", ctypes.wintypes.BOOL),
144
- ("wRepeatCount", ctypes.wintypes.WORD),
145
- ("wVirtualKeyCode", ctypes.wintypes.WORD),
146
- ("wVirtualScanCode", ctypes.wintypes.WORD),
147
- ("uChar", ctypes.wintypes.WCHAR),
148
- ("dwControlKeyState", ctypes.wintypes.DWORD),
142
+ ("bKeyDown", ct.wintypes.BOOL),
143
+ ("wRepeatCount", ct.wintypes.WORD),
144
+ ("wVirtualKeyCode", ct.wintypes.WORD),
145
+ ("wVirtualScanCode", ct.wintypes.WORD),
146
+ ("uChar", ct.wintypes.WCHAR),
147
+ ("dwControlKeyState", ct.wintypes.DWORD),
149
148
  ]
150
149
 
151
- class MOUSE_EVENT_RECORD(ctypes.Structure):
150
+ class MOUSE_EVENT_RECORD(ct.Structure):
152
151
  _fields_ = [
153
152
  ("dwMousePosition", COORD),
154
- ("dwButtonState", ctypes.wintypes.DWORD),
155
- ("dwControlKeyState", ctypes.wintypes.DWORD),
156
- ("dwEventFlags", ctypes.wintypes.DWORD),
153
+ ("dwButtonState", ct.wintypes.DWORD),
154
+ ("dwControlKeyState", ct.wintypes.DWORD),
155
+ ("dwEventFlags", ct.wintypes.DWORD),
157
156
  ]
158
157
 
159
- class WINDOW_BUFFER_SIZE_RECORD(ctypes.Structure):
158
+ class WINDOW_BUFFER_SIZE_RECORD(ct.Structure):
160
159
  _fields_ = [("dwSize", COORD)]
161
160
 
162
- class MENU_EVENT_RECORD(ctypes.Structure):
163
- _fields_ = [("dwCommandId", ctypes.wintypes.UINT)]
161
+ class MENU_EVENT_RECORD(ct.Structure):
162
+ _fields_ = [("dwCommandId", ct.wintypes.UINT)]
164
163
 
165
- class FOCUS_EVENT_RECORD(ctypes.Structure):
166
- _fields_ = [("bSetFocus", ctypes.wintypes.BOOL)]
164
+ class FOCUS_EVENT_RECORD(ct.Structure):
165
+ _fields_ = [("bSetFocus", ct.wintypes.BOOL)]
167
166
 
168
- class INPUT_RECORD_EVENT(ctypes.Union):
167
+ class INPUT_RECORD_EVENT(ct.Union):
169
168
  _fields_ = [
170
169
  ("KeyEvent", KEY_EVENT_RECORD),
171
170
  ("MouseEvent", MOUSE_EVENT_RECORD),
@@ -174,9 +173,9 @@ class _WindowsBackend:
174
173
  ("FocusEvent", FOCUS_EVENT_RECORD),
175
174
  ]
176
175
 
177
- class INPUT_RECORD(ctypes.Structure):
176
+ class INPUT_RECORD(ct.Structure):
178
177
  _fields_ = [
179
- ("EventType", ctypes.wintypes.WORD),
178
+ ("EventType", ct.wintypes.WORD),
180
179
  ("Event", INPUT_RECORD_EVENT),
181
180
  ]
182
181
 
@@ -304,8 +303,8 @@ class _UnixBackend:
304
303
  vk = arrow_map.get(ch3, "unknown")
305
304
  # 消费 Delete 键的尾部 '~'
306
305
  if ch3 == "3":
307
- extra, _, _ = select.select([fd], [], [], 0.02)
308
- if extra:
306
+ pending_del, _, _ = select.select([fd], [], [], 0.02)
307
+ if pending_del:
309
308
  os.read(fd, 1)
310
309
  results.append({
311
310
  "type": "key", "vk": vk,
@@ -389,10 +388,10 @@ class _UnixBackend:
389
388
  # 尝试读取更多字节以组成完整 UTF-8 字符
390
389
  more, _, _ = select.select([fd], [], [], 0.02)
391
390
  if more:
392
- extra = os.read(fd, 3).decode(
391
+ utf_tail = os.read(fd, 3).decode(
393
392
  "utf-8", errors="replace",
394
393
  )
395
- full_char += extra
394
+ full_char += utf_tail
396
395
  results.append({
397
396
  "type": "key", "vk": "char",
398
397
  "char": full_char, "ctrl": False,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: echotools
3
- Version: 2.3.38
3
+ Version: 2.3.39
4
4
  Summary: 通用基础设施 SDK:配置、日志、事件、调度、插件、协议、调用链
5
5
  Author: nichengfuben
6
6
  License: MIT
@@ -8,8 +8,6 @@ def test_console_package_import() -> None:
8
8
  BorderStyle,
9
9
  Clock,
10
10
  ConsoleUI,
11
- FontStyle,
12
- GradientTheme,
13
11
  Spinner,
14
12
  char_map,
15
13
  )
File without changes
File without changes
File without changes
@@ -16,9 +16,9 @@ from echotools.media.console.ui import (
16
16
  FontStyle,
17
17
  GradientTheme,
18
18
  TextUtils,
19
- create_ui,
20
19
  _get_backend,
21
20
  _normalize_key_event,
21
+ create_ui,
22
22
  )
23
23
 
24
24
  __all__ = [