echotools 2.3.85__tar.gz → 2.3.87__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 (250) hide show
  1. {echotools-2.3.85 → echotools-2.3.87}/PKG-INFO +144 -144
  2. {echotools-2.3.85/docs → echotools-2.3.87}/README.md +88 -88
  3. {echotools-2.3.85 → echotools-2.3.87}/pyproject.toml +2 -2
  4. {echotools-2.3.85 → echotools-2.3.87}/setup.cfg +8 -8
  5. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/__init__.py +215 -215
  6. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/cache/__init__.py +8 -8
  7. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/cache/list_cache.py +155 -155
  8. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/cache/memory_cache.py +74 -74
  9. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/config/__init__.py +23 -23
  10. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/config/base.py +155 -155
  11. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/config/center.py +285 -285
  12. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/config/center_notify.py +39 -39
  13. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/config/center_template.py +142 -142
  14. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/config/loader.py +138 -138
  15. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/errors/__init__.py +49 -49
  16. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/errors/base.py +32 -32
  17. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/errors/classify.py +79 -79
  18. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/errors/common.py +74 -74
  19. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/errors/http.py +126 -126
  20. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/ids/__init__.py +7 -7
  21. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/ids/generator.py +62 -62
  22. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/io/__init__.py +37 -37
  23. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/io/io_utils.py +81 -81
  24. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/logger/__init__.py +12 -12
  25. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/logger/manager.py +187 -187
  26. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/retry/__init__.py +12 -12
  27. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/retry/retry.py +171 -171
  28. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/compat.py +88 -88
  29. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/dispatch/__init__.py +21 -21
  30. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/dispatch/candidate.py +51 -51
  31. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/dispatch/dispatcher.py +233 -233
  32. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/dispatch/proxy_selector.py +154 -154
  33. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/dispatch/race.py +119 -119
  34. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/dispatch/selector.py +400 -400
  35. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/__init__.py +44 -44
  36. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/parsers/__init__.py +6 -6
  37. echotools-2.3.87/src/echotools/exec/fncall/parsers/stream.py +196 -0
  38. echotools-2.3.87/src/echotools/exec/fncall/parsers/stream_delta.py +269 -0
  39. echotools-2.3.87/src/echotools/exec/fncall/parsers/stream_feed.py +167 -0
  40. echotools-2.3.87/src/echotools/exec/fncall/parsers/stream_final.py +217 -0
  41. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/parsers/xml_params.py +40 -40
  42. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/parsers/xml_parser.py +285 -285
  43. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/prompt/__init__.py +5 -5
  44. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/prompt/history.py +322 -322
  45. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/prompt/history_format.py +113 -113
  46. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/prompt/inject.py +203 -192
  47. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/prompt/prompt_helpers.py +259 -259
  48. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/prompt/templates.py +167 -167
  49. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/protocols/__init__.py +14 -14
  50. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/protocols/entml.py +351 -351
  51. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/protocols/entml_invoke.py +199 -173
  52. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/protocols/entml_patterns.py +391 -464
  53. echotools-2.3.87/src/echotools/exec/fncall/protocols/entml_schema.py +392 -0
  54. echotools-2.3.87/src/echotools/exec/fncall/protocols/entml_stream/__init__.py +22 -0
  55. echotools-2.3.85/src/echotools/exec/fncall/protocols/entml_stream_json.py → echotools-2.3.87/src/echotools/exec/fncall/protocols/entml_stream/body.py +308 -445
  56. echotools-2.3.87/src/echotools/exec/fncall/protocols/entml_stream/snap.py +175 -0
  57. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/protocols/entml_think/__init__.py +33 -33
  58. echotools-2.3.85/src/echotools/exec/fncall/protocols/entml_tool_blocks.py → echotools-2.3.87/src/echotools/exec/fncall/protocols/entml_think/blocks.py +362 -311
  59. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/protocols/entml_think/core.py +230 -230
  60. echotools-2.3.87/src/echotools/exec/fncall/protocols/entml_think/filter.py +303 -0
  61. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/protocols/entml_think/hist.py +168 -168
  62. echotools-2.3.87/src/echotools/exec/fncall/protocols/entml_think/hold.py +321 -0
  63. echotools-2.3.87/src/echotools/exec/fncall/protocols/entml_think/parse.py +265 -0
  64. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/registry.py +111 -111
  65. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/shared/__init__.py +29 -29
  66. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/shared/coercion.py +289 -289
  67. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/shared/history_markup.py +326 -328
  68. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/shared/loop_detect.py +97 -97
  69. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/shared/normalization.py +181 -181
  70. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/shared/schema_render.py +126 -126
  71. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/fncall/shared/xml_helpers.py +56 -56
  72. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/lifecycle/__init__.py +8 -8
  73. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/lifecycle/manager.py +72 -72
  74. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/lifecycle/updater.py +197 -197
  75. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/lifecycle/updater_pull.py +33 -33
  76. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/process/__init__.py +10 -10
  77. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/process/port.py +193 -193
  78. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/protocol/__init__.py +19 -19
  79. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/protocol/base.py +135 -135
  80. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/terminal/conpty.py +246 -246
  81. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/terminal/local/__init__.py +6 -6
  82. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/terminal/local/core.py +318 -318
  83. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/terminal/local/proc.py +331 -331
  84. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/terminal/local/unix.py +195 -195
  85. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/terminal/local/win.py +199 -199
  86. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/terminal/session/__init__.py +20 -20
  87. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/terminal/session/base.py +353 -353
  88. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/terminal/session/client.py +155 -155
  89. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/terminal/tmux.py +105 -105
  90. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/__init__.py +38 -38
  91. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/charmap.py +148 -148
  92. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/spinner.py +342 -342
  93. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uicore/mixins/__init__.py +15 -15
  94. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uicore/mixins/uibase.py +195 -195
  95. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uicore/mixins/uicmds.py +224 -224
  96. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uicore/mixins/uiinteract.py +199 -199
  97. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uicore/mixins/uioutput.py +304 -304
  98. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uicore/mixins/uistream.py +144 -144
  99. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uicore/ui_console.py +20 -20
  100. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uicore/ui_io.py +27 -27
  101. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uicore/ui_log.py +67 -67
  102. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uicore/ui_platform.py +389 -389
  103. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uicore/ui_text.py +368 -368
  104. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uicore/ui_types.py +246 -246
  105. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uilayout/ui_countdown.py +62 -62
  106. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uilayout/ui_layout.py +50 -50
  107. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uilayout/ui_misc.py +336 -336
  108. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uilayout/ui_panel.py +137 -137
  109. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uilayout/ui_table.py +205 -205
  110. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uilayout/ui_tree.py +146 -146
  111. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uiwidgets/ui_box.py +197 -197
  112. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uiwidgets/ui_editor.py +360 -360
  113. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uiwidgets/ui_progress.py +296 -296
  114. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uiwidgets/ui_select.py +199 -199
  115. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/uiwidgets/ui_stream.py +85 -85
  116. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/events/__init__.py +8 -8
  117. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/events/bus.py +104 -104
  118. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/events/event.py +31 -31
  119. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/spinner/__init__.py +24 -24
  120. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/spinner/spinner.py +324 -324
  121. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/spinner/spinner_color.py +98 -98
  122. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/tracing/__init__.py +28 -28
  123. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/tracing/context.py +63 -63
  124. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/tracing/span.py +135 -135
  125. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/tracing/tracer.py +97 -97
  126. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/watcher/__init__.py +7 -7
  127. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/watcher/file_watcher.py +110 -110
  128. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/__init__.py +37 -37
  129. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/application.py +120 -120
  130. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/input_box/components/sendbutton.js +64 -64
  131. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/input_box/components/sortablelist.js +104 -104
  132. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/input_box/components/textinput.js +185 -185
  133. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/input_box/inputbox.js +277 -277
  134. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/input_box/style.css +170 -170
  135. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/input_box/voicegif.js +1 -1
  136. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/middleware.py +129 -129
  137. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/utils.py +187 -187
  138. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/plat/files/__init__.py +7 -7
  139. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/plat/files/file_util.py +155 -155
  140. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/plat/network/__init__.py +11 -11
  141. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/plat/network/http_utils.py +68 -68
  142. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/plat/plugin/__init__.py +9 -9
  143. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/plat/plugin/base.py +41 -41
  144. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/plat/plugin/discovery.py +179 -179
  145. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/plat/plugin/registry.py +245 -245
  146. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/plat/plugin/registry_ops.py +99 -99
  147. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/plat/proxy/__init__.py +7 -7
  148. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/plat/proxy/manager.py +268 -268
  149. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/plat/runtime/__init__.py +7 -7
  150. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/plat/runtime/collector.py +60 -60
  151. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/plat/scheduler/__init__.py +7 -7
  152. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/plat/scheduler/scheduler.py +69 -69
  153. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/plat/sdk/__init__.py +7 -7
  154. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/plat/sdk/facade.py +251 -251
  155. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/version.py +15 -15
  156. {echotools-2.3.85 → echotools-2.3.87}/src/echotools.egg-info/PKG-INFO +144 -144
  157. {echotools-2.3.85 → echotools-2.3.87}/src/echotools.egg-info/SOURCES.txt +10 -6
  158. {echotools-2.3.85 → echotools-2.3.87}/src/tests/bench_import.py +14 -14
  159. {echotools-2.3.85 → echotools-2.3.87}/src/tests/conftest.py +19 -19
  160. {echotools-2.3.85 → echotools-2.3.87}/src/tests/fixtures/simulated_fake_history_markup_responses.py +484 -484
  161. {echotools-2.3.85 → echotools-2.3.87}/src/tests/fixtures/simulated_fault_thinking_responses.py +220 -220
  162. {echotools-2.3.85 → echotools-2.3.87}/src/tests/fixtures/simulated_llm_tool_responses.py +805 -805
  163. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_adversarial_stream_splits.py +144 -144
  164. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_cache_retry.py +128 -128
  165. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_completion.py +48 -48
  166. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_config.py +85 -85
  167. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_config_extended.py +45 -45
  168. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_console.py +26 -26
  169. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_coverage_core.py +515 -515
  170. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_dispatch.py +35 -35
  171. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_dispatch_extended.py +44 -44
  172. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_dispatch_race.py +55 -55
  173. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_entml_agent_output_formats.py +143 -143
  174. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_entml_bare_invoke_format.py +375 -375
  175. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_entml_batch_stream_comprehensive.py +501 -498
  176. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_entml_parser_comprehensive.py +654 -654
  177. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_entml_protocol.py +1702 -1545
  178. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_entml_stream_json.py +77 -77
  179. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_entml_stream_json_exhaustive.py +268 -268
  180. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_entml_thinking_history.py +71 -71
  181. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_entml_tool_parse_leak.py +256 -256
  182. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_entml_tool_pipeline.py +866 -866
  183. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_entml_tools.py +1 -1
  184. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_errors.py +45 -45
  185. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_errors_common.py +24 -24
  186. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_events.py +56 -56
  187. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_events_event.py +18 -18
  188. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_facade.py +33 -33
  189. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_fake_history_markup_batch.py +70 -70
  190. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_fake_history_markup_invoke_preserve.py +130 -130
  191. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_fake_history_markup_reply_protect.py +168 -168
  192. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_fake_history_markup_stream.py +151 -151
  193. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_fault_thinking_close_batch.py +86 -86
  194. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_fault_thinking_close_stream.py +149 -149
  195. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_fncall.py +99 -99
  196. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_fncall_stream_thinking.py +436 -436
  197. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_history_markup_filter.py +321 -321
  198. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_ids.py +25 -25
  199. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_imports.py +51 -51
  200. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_io.py +20 -20
  201. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_keys.py +27 -27
  202. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_lifecycle.py +34 -34
  203. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_logger.py +37 -37
  204. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_merge.py +26 -26
  205. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_model_branch_matrix.py +204 -204
  206. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_plugin.py +31 -31
  207. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_printstream.py +337 -337
  208. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_protocols.py +25 -25
  209. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_proxy.py +56 -56
  210. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_proxy_selector.py +27 -27
  211. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_runtime.py +25 -25
  212. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_scheduler.py +27 -27
  213. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_simulated_llm_tool_parse.py +171 -171
  214. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_stream_partial_json_parity.py +333 -296
  215. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_stream_realtime_parse.py +134 -134
  216. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_tracing.py +30 -30
  217. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_usage.py +37 -37
  218. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_web.py +48 -48
  219. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_web_broker.py +50 -50
  220. echotools-2.3.85/README.md +0 -3
  221. echotools-2.3.85/src/echotools/exec/fncall/parsers/stream.py +0 -848
  222. echotools-2.3.85/src/echotools/exec/fncall/protocols/entml_think/parse.py +0 -713
  223. echotools-2.3.85/src/echotools/exec/fncall/protocols/entml_tools.py +0 -156
  224. echotools-2.3.85/src/echotools/exec/fncall/protocols/entml_values.py +0 -131
  225. echotools-2.3.85/src/tests/_check_parity.py +0 -72
  226. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/config/merge.py +0 -0
  227. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/base/io/printstream.py +0 -0
  228. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/dispatch/usage.py +0 -0
  229. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/keys.py +0 -0
  230. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/terminal/__init__.py +0 -0
  231. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/terminal/sanitize.py +0 -0
  232. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/exec/terminal/ssh.py +0 -0
  233. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/console/ui.py +0 -0
  234. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/translate.py +0 -0
  235. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/broker.py +0 -0
  236. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/input_box/app.js +0 -0
  237. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/input_box/components/filezone.js +0 -0
  238. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/input_box/components/motionkit.js +0 -0
  239. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/input_box/components/sortablelist.css +0 -0
  240. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/input_box/components/voiceinput.js +0 -0
  241. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/input_box/fonts/inter-500.woff2 +0 -0
  242. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/input_box/fonts/inter-600.woff2 +0 -0
  243. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/input_box/fonts/inter400.woff2 +0 -0
  244. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/input_box/inputbox.css +0 -0
  245. {echotools-2.3.85 → echotools-2.3.87}/src/echotools/media/web/stats.py +0 -0
  246. {echotools-2.3.85 → echotools-2.3.87}/src/echotools.egg-info/dependency_links.txt +0 -0
  247. {echotools-2.3.85 → echotools-2.3.87}/src/echotools.egg-info/requires.txt +0 -0
  248. {echotools-2.3.85 → echotools-2.3.87}/src/echotools.egg-info/top_level.txt +0 -0
  249. {echotools-2.3.85 → echotools-2.3.87}/src/tests/fixtures/__init__.py +0 -0
  250. {echotools-2.3.85 → echotools-2.3.87}/src/tests/test_entml_thinking_parse.py +0 -0
@@ -1,144 +1,144 @@
1
- Metadata-Version: 2.4
2
- Name: echotools
3
- Version: 2.3.85
4
- Summary: 通用基础设施 SDK:配置、日志、事件、调度、插件、协议、调用链
5
- Home-page: https://github.com/nichengfuben/echotools
6
- Author: nichengfuben
7
- License: MIT
8
- Project-URL: Homepage, https://github.com/nichengfuben/echotools
9
- Project-URL: Repository, https://github.com/nichengfuben/echotools
10
- Project-URL: Issues, https://github.com/nichengfuben/echotools/issues
11
- Classifier: Development Status :: 4 - Beta
12
- Classifier: Intended Audience :: Developers
13
- Classifier: Programming Language :: Python :: 3
14
- Classifier: Programming Language :: Python :: 3.8
15
- Classifier: Programming Language :: Python :: 3.9
16
- Classifier: Programming Language :: Python :: 3.10
17
- Classifier: Programming Language :: Python :: 3.11
18
- Classifier: Programming Language :: Python :: 3.12
19
- Classifier: Programming Language :: Python :: 3.13
20
- Classifier: Topic :: Software Development :: Libraries
21
- Requires-Python: >=3.8
22
- Description-Content-Type: text/markdown
23
- Requires-Dist: typing-extensions>=4.7.0
24
- Provides-Extra: toml
25
- Requires-Dist: tomlkit>=0.11.0; extra == "toml"
26
- Requires-Dist: tomli>=2.0.0; python_version < "3.11" and extra == "toml"
27
- Provides-Extra: watch
28
- Requires-Dist: watchdog>=3.0.0; extra == "watch"
29
- Provides-Extra: http
30
- Requires-Dist: aiohttp>=3.8.0; extra == "http"
31
- Provides-Extra: socks
32
- Requires-Dist: aiohttp-socks>=0.8.0; extra == "socks"
33
- Provides-Extra: ssh
34
- Requires-Dist: paramiko>=3.0.0; extra == "ssh"
35
- Provides-Extra: terminal
36
- Requires-Dist: pywinpty>=2.0.0; sys_platform == "win32" and extra == "terminal"
37
- Provides-Extra: console
38
- Requires-Dist: rich>=13.0; extra == "console"
39
- Requires-Dist: wcwidth>=0.2; extra == "console"
40
- Provides-Extra: all
41
- Requires-Dist: tomlkit>=0.11.0; extra == "all"
42
- Requires-Dist: tomli>=2.0.0; python_version < "3.11" and extra == "all"
43
- Requires-Dist: watchdog>=3.0.0; extra == "all"
44
- Requires-Dist: aiohttp>=3.8.0; extra == "all"
45
- Requires-Dist: aiohttp-socks>=0.8.0; extra == "all"
46
- Requires-Dist: paramiko>=3.0.0; extra == "all"
47
- Requires-Dist: pywinpty>=2.0.0; sys_platform == "win32" and extra == "all"
48
- Requires-Dist: rich>=13.0; extra == "all"
49
- Requires-Dist: wcwidth>=0.2; extra == "all"
50
- Provides-Extra: dev
51
- Requires-Dist: pytest>=7.4.0; extra == "dev"
52
- Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
53
- Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
54
- Requires-Dist: mypy>=1.5.0; extra == "dev"
55
- Requires-Dist: ruff>=0.4.0; extra == "dev"
56
-
57
- # echotools
58
-
59
- 通用基础设施 SDK:配置中心、日志、事件总线、调用链、任务调度、
60
- 插件框架、协议系统、自适应选择器,完全项目无关,兼容 Python 3.8–3.14。
61
-
62
- ## 安装
63
-
64
- ```bash
65
- # 核心(仅 typing-extensions)
66
- pip install echotools
67
-
68
- # 完整功能
69
- pip install echotools[all]
70
- ```
71
-
72
- ### 可选依赖
73
-
74
- | Extra | 用途 |
75
- |-------|------|
76
- | `toml` | TOML 配置读写 |
77
- | `watch` | watchdog 文件监视 |
78
- | `http` | aiohttp Web 层 |
79
- | `socks` | SOCKS 代理 |
80
- | `ssh` | SSH 终端 |
81
- | `terminal` | Windows ConPTY |
82
- | `all` | 全部可选依赖 |
83
- | `dev` | pytest, ruff, mypy |
84
-
85
- ### PyPI 重装(`uninstall-no-record-file`)
86
-
87
- 本地 `pip install -e .` 或中断的 wheel 安装可能留下无 `RECORD` 的元数据,导致
88
- `pip install --upgrade echotools` 报 `Cannot uninstall echotools None`。
89
-
90
- ```powershell
91
- # 在仓库根目录
92
- powershell -File scripts/reinstall_from_pypi.ps1 -Version 2.3.81
93
- ```
94
-
95
- 或手动:删除 `src/echotools.egg-info` 与 site-packages 里仅有 `direct_url.json` 的
96
- `echotools-*.dist-info`,再执行
97
- `pip install --force-reinstall --no-cache-dir echotools==2.3.81`。
98
-
99
- ## 快速开始
100
-
101
- ```python
102
- from echotools import EchoTools
103
-
104
- et = EchoTools(service_name="myapp")
105
- et.logger.configure(level="INFO", color=True)
106
- cfg = et.config
107
- cfg.load("config.toml")
108
-
109
- with et.tracer.trace("request") as trace:
110
- with et.tracer.span(trace, "db") as span:
111
- span.set_tag("query", "select 1")
112
-
113
- await et.shutdown()
114
- ```
115
-
116
- ## 能力总览
117
-
118
- | 模块 | 说明 |
119
- |------|------|
120
- | `ConfigCenter` | 点路径配置 + 热重载 + 类型绑定 |
121
- | `LoggerManager` | 调用链注入 + 颜色 + 轮转 |
122
- | `EventBus` | 同步/异步事件 |
123
- | `Tracer` | 轻量调用链 |
124
- | `TaskDispatcher` | 单发/竞速 + 贝叶斯自适应选择 |
125
- | `PluginRegistry` | 自动发现 + 热重载 |
126
- | `get_protocol` | XML/antml/original/bracket/nous 等 LLM 工具协议 |
127
- | `ProxyManager` | HTTP/HTTPS/SOCKS |
128
- | `AutoUpdater` | git 自动更新 |
129
- | `FileWatcher` | 轮询文件监视 |
130
-
131
- ## 开发
132
-
133
- ```bash
134
- pip install -e ".[dev,all]"
135
- make lint
136
- make test
137
- make cov
138
- ```
139
-
140
- 模块指南见 [docs/modules.md](docs/modules.md),API 参考见 [docs/api.md](docs/api.md)。
141
-
142
- ## 许可证
143
-
144
- MIT
1
+ Metadata-Version: 2.4
2
+ Name: echotools
3
+ Version: 2.3.87
4
+ Summary: 通用基础设施 SDK:配置、日志、事件、调度、插件、协议、调用链
5
+ Home-page: https://github.com/nichengfuben/echotools
6
+ Author: nichengfuben
7
+ License: MIT
8
+ Project-URL: Homepage, https://github.com/nichengfuben/echotools
9
+ Project-URL: Repository, https://github.com/nichengfuben/echotools
10
+ Project-URL: Issues, https://github.com/nichengfuben/echotools/issues
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.8
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Software Development :: Libraries
21
+ Requires-Python: >=3.8
22
+ Description-Content-Type: text/markdown
23
+ Requires-Dist: typing-extensions>=4.7.0
24
+ Provides-Extra: toml
25
+ Requires-Dist: tomlkit>=0.11.0; extra == "toml"
26
+ Requires-Dist: tomli>=2.0.0; python_version < "3.11" and extra == "toml"
27
+ Provides-Extra: watch
28
+ Requires-Dist: watchdog>=3.0.0; extra == "watch"
29
+ Provides-Extra: http
30
+ Requires-Dist: aiohttp>=3.8.0; extra == "http"
31
+ Provides-Extra: socks
32
+ Requires-Dist: aiohttp-socks>=0.8.0; extra == "socks"
33
+ Provides-Extra: ssh
34
+ Requires-Dist: paramiko>=3.0.0; extra == "ssh"
35
+ Provides-Extra: terminal
36
+ Requires-Dist: pywinpty>=2.0.0; sys_platform == "win32" and extra == "terminal"
37
+ Provides-Extra: console
38
+ Requires-Dist: rich>=13.0; extra == "console"
39
+ Requires-Dist: wcwidth>=0.2; extra == "console"
40
+ Provides-Extra: all
41
+ Requires-Dist: tomlkit>=0.11.0; extra == "all"
42
+ Requires-Dist: tomli>=2.0.0; python_version < "3.11" and extra == "all"
43
+ Requires-Dist: watchdog>=3.0.0; extra == "all"
44
+ Requires-Dist: aiohttp>=3.8.0; extra == "all"
45
+ Requires-Dist: aiohttp-socks>=0.8.0; extra == "all"
46
+ Requires-Dist: paramiko>=3.0.0; extra == "all"
47
+ Requires-Dist: pywinpty>=2.0.0; sys_platform == "win32" and extra == "all"
48
+ Requires-Dist: rich>=13.0; extra == "all"
49
+ Requires-Dist: wcwidth>=0.2; extra == "all"
50
+ Provides-Extra: dev
51
+ Requires-Dist: pytest>=7.4.0; extra == "dev"
52
+ Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
53
+ Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
54
+ Requires-Dist: mypy>=1.5.0; extra == "dev"
55
+ Requires-Dist: ruff>=0.4.0; extra == "dev"
56
+
57
+ # echotools
58
+
59
+ 通用基础设施 SDK:配置中心、日志、事件总线、调用链、任务调度、
60
+ 插件框架、协议系统、自适应选择器,完全项目无关,兼容 Python 3.8–3.14。
61
+
62
+ ## 安装
63
+
64
+ ```bash
65
+ # 核心(仅 typing-extensions)
66
+ pip install echotools
67
+
68
+ # 完整功能
69
+ pip install echotools[all]
70
+ ```
71
+
72
+ ### 可选依赖
73
+
74
+ | Extra | 用途 |
75
+ |-------|------|
76
+ | `toml` | TOML 配置读写 |
77
+ | `watch` | watchdog 文件监视 |
78
+ | `http` | aiohttp Web 层 |
79
+ | `socks` | SOCKS 代理 |
80
+ | `ssh` | SSH 终端 |
81
+ | `terminal` | Windows ConPTY |
82
+ | `all` | 全部可选依赖 |
83
+ | `dev` | pytest, ruff, mypy |
84
+
85
+ ### PyPI 重装(`uninstall-no-record-file`)
86
+
87
+ 本地 `pip install -e .` 或中断的 wheel 安装可能留下无 `RECORD` 的元数据,导致
88
+ `pip install --upgrade echotools` 报 `Cannot uninstall echotools None`。
89
+
90
+ ```powershell
91
+ # 在仓库根目录
92
+ powershell -File scripts/reinstall_from_pypi.ps1 -Version 2.3.81
93
+ ```
94
+
95
+ 或手动:删除 `src/echotools.egg-info` 与 site-packages 里仅有 `direct_url.json` 的
96
+ `echotools-*.dist-info`,再执行
97
+ `pip install --force-reinstall --no-cache-dir echotools==2.3.81`。
98
+
99
+ ## 快速开始
100
+
101
+ ```python
102
+ from echotools import EchoTools
103
+
104
+ et = EchoTools(service_name="myapp")
105
+ et.logger.configure(level="INFO", color=True)
106
+ cfg = et.config
107
+ cfg.load("config.toml")
108
+
109
+ with et.tracer.trace("request") as trace:
110
+ with et.tracer.span(trace, "db") as span:
111
+ span.set_tag("query", "select 1")
112
+
113
+ await et.shutdown()
114
+ ```
115
+
116
+ ## 能力总览
117
+
118
+ | 模块 | 说明 |
119
+ |------|------|
120
+ | `ConfigCenter` | 点路径配置 + 热重载 + 类型绑定 |
121
+ | `LoggerManager` | 调用链注入 + 颜色 + 轮转 |
122
+ | `EventBus` | 同步/异步事件 |
123
+ | `Tracer` | 轻量调用链 |
124
+ | `TaskDispatcher` | 单发/竞速 + 贝叶斯自适应选择 |
125
+ | `PluginRegistry` | 自动发现 + 热重载 |
126
+ | `get_protocol` | XML/antml/original/bracket/nous 等 LLM 工具协议 |
127
+ | `ProxyManager` | HTTP/HTTPS/SOCKS |
128
+ | `AutoUpdater` | git 自动更新 |
129
+ | `FileWatcher` | 轮询文件监视 |
130
+
131
+ ## 开发
132
+
133
+ ```bash
134
+ pip install -e ".[dev,all]"
135
+ make lint
136
+ make test
137
+ make cov
138
+ ```
139
+
140
+ 模块指南见 [docs/modules.md](docs/modules.md),API 参考见 [docs/api.md](docs/api.md)。
141
+
142
+ ## 许可证
143
+
144
+ MIT
@@ -1,88 +1,88 @@
1
- # echotools
2
-
3
- 通用基础设施 SDK:配置中心、日志、事件总线、调用链、任务调度、
4
- 插件框架、协议系统、自适应选择器,完全项目无关,兼容 Python 3.8–3.14。
5
-
6
- ## 安装
7
-
8
- ```bash
9
- # 核心(仅 typing-extensions)
10
- pip install echotools
11
-
12
- # 完整功能
13
- pip install echotools[all]
14
- ```
15
-
16
- ### 可选依赖
17
-
18
- | Extra | 用途 |
19
- |-------|------|
20
- | `toml` | TOML 配置读写 |
21
- | `watch` | watchdog 文件监视 |
22
- | `http` | aiohttp Web 层 |
23
- | `socks` | SOCKS 代理 |
24
- | `ssh` | SSH 终端 |
25
- | `terminal` | Windows ConPTY |
26
- | `all` | 全部可选依赖 |
27
- | `dev` | pytest, ruff, mypy |
28
-
29
- ### PyPI 重装(`uninstall-no-record-file`)
30
-
31
- 本地 `pip install -e .` 或中断的 wheel 安装可能留下无 `RECORD` 的元数据,导致
32
- `pip install --upgrade echotools` 报 `Cannot uninstall echotools None`。
33
-
34
- ```powershell
35
- # 在仓库根目录
36
- powershell -File scripts/reinstall_from_pypi.ps1 -Version 2.3.81
37
- ```
38
-
39
- 或手动:删除 `src/echotools.egg-info` 与 site-packages 里仅有 `direct_url.json` 的
40
- `echotools-*.dist-info`,再执行
41
- `pip install --force-reinstall --no-cache-dir echotools==2.3.81`。
42
-
43
- ## 快速开始
44
-
45
- ```python
46
- from echotools import EchoTools
47
-
48
- et = EchoTools(service_name="myapp")
49
- et.logger.configure(level="INFO", color=True)
50
- cfg = et.config
51
- cfg.load("config.toml")
52
-
53
- with et.tracer.trace("request") as trace:
54
- with et.tracer.span(trace, "db") as span:
55
- span.set_tag("query", "select 1")
56
-
57
- await et.shutdown()
58
- ```
59
-
60
- ## 能力总览
61
-
62
- | 模块 | 说明 |
63
- |------|------|
64
- | `ConfigCenter` | 点路径配置 + 热重载 + 类型绑定 |
65
- | `LoggerManager` | 调用链注入 + 颜色 + 轮转 |
66
- | `EventBus` | 同步/异步事件 |
67
- | `Tracer` | 轻量调用链 |
68
- | `TaskDispatcher` | 单发/竞速 + 贝叶斯自适应选择 |
69
- | `PluginRegistry` | 自动发现 + 热重载 |
70
- | `get_protocol` | XML/antml/original/bracket/nous 等 LLM 工具协议 |
71
- | `ProxyManager` | HTTP/HTTPS/SOCKS |
72
- | `AutoUpdater` | git 自动更新 |
73
- | `FileWatcher` | 轮询文件监视 |
74
-
75
- ## 开发
76
-
77
- ```bash
78
- pip install -e ".[dev,all]"
79
- make lint
80
- make test
81
- make cov
82
- ```
83
-
84
- 模块指南见 [docs/modules.md](docs/modules.md),API 参考见 [docs/api.md](docs/api.md)。
85
-
86
- ## 许可证
87
-
88
- MIT
1
+ # echotools
2
+
3
+ 通用基础设施 SDK:配置中心、日志、事件总线、调用链、任务调度、
4
+ 插件框架、协议系统、自适应选择器,完全项目无关,兼容 Python 3.8–3.14。
5
+
6
+ ## 安装
7
+
8
+ ```bash
9
+ # 核心(仅 typing-extensions)
10
+ pip install echotools
11
+
12
+ # 完整功能
13
+ pip install echotools[all]
14
+ ```
15
+
16
+ ### 可选依赖
17
+
18
+ | Extra | 用途 |
19
+ |-------|------|
20
+ | `toml` | TOML 配置读写 |
21
+ | `watch` | watchdog 文件监视 |
22
+ | `http` | aiohttp Web 层 |
23
+ | `socks` | SOCKS 代理 |
24
+ | `ssh` | SSH 终端 |
25
+ | `terminal` | Windows ConPTY |
26
+ | `all` | 全部可选依赖 |
27
+ | `dev` | pytest, ruff, mypy |
28
+
29
+ ### PyPI 重装(`uninstall-no-record-file`)
30
+
31
+ 本地 `pip install -e .` 或中断的 wheel 安装可能留下无 `RECORD` 的元数据,导致
32
+ `pip install --upgrade echotools` 报 `Cannot uninstall echotools None`。
33
+
34
+ ```powershell
35
+ # 在仓库根目录
36
+ powershell -File scripts/reinstall_from_pypi.ps1 -Version 2.3.81
37
+ ```
38
+
39
+ 或手动:删除 `src/echotools.egg-info` 与 site-packages 里仅有 `direct_url.json` 的
40
+ `echotools-*.dist-info`,再执行
41
+ `pip install --force-reinstall --no-cache-dir echotools==2.3.81`。
42
+
43
+ ## 快速开始
44
+
45
+ ```python
46
+ from echotools import EchoTools
47
+
48
+ et = EchoTools(service_name="myapp")
49
+ et.logger.configure(level="INFO", color=True)
50
+ cfg = et.config
51
+ cfg.load("config.toml")
52
+
53
+ with et.tracer.trace("request") as trace:
54
+ with et.tracer.span(trace, "db") as span:
55
+ span.set_tag("query", "select 1")
56
+
57
+ await et.shutdown()
58
+ ```
59
+
60
+ ## 能力总览
61
+
62
+ | 模块 | 说明 |
63
+ |------|------|
64
+ | `ConfigCenter` | 点路径配置 + 热重载 + 类型绑定 |
65
+ | `LoggerManager` | 调用链注入 + 颜色 + 轮转 |
66
+ | `EventBus` | 同步/异步事件 |
67
+ | `Tracer` | 轻量调用链 |
68
+ | `TaskDispatcher` | 单发/竞速 + 贝叶斯自适应选择 |
69
+ | `PluginRegistry` | 自动发现 + 热重载 |
70
+ | `get_protocol` | XML/antml/original/bracket/nous 等 LLM 工具协议 |
71
+ | `ProxyManager` | HTTP/HTTPS/SOCKS |
72
+ | `AutoUpdater` | git 自动更新 |
73
+ | `FileWatcher` | 轮询文件监视 |
74
+
75
+ ## 开发
76
+
77
+ ```bash
78
+ pip install -e ".[dev,all]"
79
+ make lint
80
+ make test
81
+ make cov
82
+ ```
83
+
84
+ 模块指南见 [docs/modules.md](docs/modules.md),API 参考见 [docs/api.md](docs/api.md)。
85
+
86
+ ## 许可证
87
+
88
+ MIT
@@ -4,9 +4,9 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "echotools"
7
- version = "2.3.85"
7
+ version = "2.3.87"
8
8
  description = "通用基础设施 SDK:配置、日志、事件、调度、插件、协议、调用链"
9
- readme = "docs/README.md"
9
+ readme = "README.md"
10
10
  requires-python = ">=3.8"
11
11
  license = { text = "MIT" }
12
12
  authors = [{ name = "nichengfuben" }]
@@ -1,8 +1,8 @@
1
- [metadata]
2
- url = https://github.com/nichengfuben/echotools
3
- home_page = https://github.com/nichengfuben/echotools
4
-
5
- [egg_info]
6
- tag_build =
7
- tag_date = 0
8
-
1
+ [metadata]
2
+ url = https://github.com/nichengfuben/echotools
3
+ home_page = https://github.com/nichengfuben/echotools
4
+
5
+ [egg_info]
6
+ tag_build =
7
+ tag_date = 0
8
+