echotools 2.4.4__tar.gz → 2.4.5__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 (266) hide show
  1. {echotools-2.4.4 → echotools-2.4.5}/PKG-INFO +2 -2
  2. {echotools-2.4.4 → echotools-2.4.5}/README.md +1 -1
  3. {echotools-2.4.4 → echotools-2.4.5}/pyproject.toml +1 -1
  4. echotools-2.4.5/src/echotools/base/ids/__init__.py +7 -0
  5. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/ids/generator.py +6 -1
  6. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/__init__.py +10 -0
  7. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_tool/fakemarkup.py +12 -0
  8. echotools-2.4.5/src/echotools/exec/fncall/tool_id.py +42 -0
  9. {echotools-2.4.4 → echotools-2.4.5}/src/echotools.egg-info/PKG-INFO +2 -2
  10. {echotools-2.4.4 → echotools-2.4.5}/src/echotools.egg-info/SOURCES.txt +2 -0
  11. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_entml_fake_structure_markup.py +24 -0
  12. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_ids.py +7 -1
  13. echotools-2.4.5/src/tests/test_tool_id.py +47 -0
  14. echotools-2.4.4/src/echotools/base/ids/__init__.py +0 -7
  15. {echotools-2.4.4 → echotools-2.4.5}/setup.cfg +0 -0
  16. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/__init__.py +0 -0
  17. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/cache/__init__.py +0 -0
  18. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/cache/list_cache.py +0 -0
  19. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/cache/memory_cache.py +0 -0
  20. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/config/__init__.py +0 -0
  21. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/config/base.py +0 -0
  22. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/config/center.py +0 -0
  23. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/config/center_notify.py +0 -0
  24. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/config/center_template.py +0 -0
  25. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/config/loader.py +0 -0
  26. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/config/merge.py +0 -0
  27. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/errors/__init__.py +0 -0
  28. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/errors/base.py +0 -0
  29. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/errors/classify.py +0 -0
  30. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/errors/common.py +0 -0
  31. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/errors/http.py +0 -0
  32. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/io/__init__.py +0 -0
  33. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/io/io_utils.py +0 -0
  34. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/io/printstream.py +0 -0
  35. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/logger/__init__.py +0 -0
  36. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/logger/manager.py +0 -0
  37. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/retry/__init__.py +0 -0
  38. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/base/retry/retry.py +0 -0
  39. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/dispatch/__init__.py +0 -0
  40. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/dispatch/candidate.py +0 -0
  41. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/dispatch/dispatcher.py +0 -0
  42. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/dispatch/proxy_selector.py +0 -0
  43. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/dispatch/race.py +0 -0
  44. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/dispatch/selector.py +0 -0
  45. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/dispatch/usage.py +0 -0
  46. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/parsers/__init__.py +0 -0
  47. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/parsers/stream.py +0 -0
  48. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/parsers/stream_delta.py +0 -0
  49. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/parsers/stream_feed.py +0 -0
  50. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/parsers/stream_final.py +0 -0
  51. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/prompt/__init__.py +0 -0
  52. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/prompt/behavior_blocks.py +0 -0
  53. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/prompt/history.py +0 -0
  54. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/prompt/history_format.py +0 -0
  55. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/prompt/inject.py +0 -0
  56. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/prompt/prompt_helpers.py +0 -0
  57. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/__init__.py +0 -0
  58. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml.py +0 -0
  59. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_patterns/__init__.py +0 -0
  60. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_patterns/invoke.py +0 -0
  61. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_patterns/params.py +0 -0
  62. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_patterns/regex.py +0 -0
  63. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_patterns/strip.py +0 -0
  64. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_schema/__init__.py +0 -0
  65. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_schema/mangled.py +0 -0
  66. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_schema/validate.py +0 -0
  67. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_stream/__init__.py +0 -0
  68. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_stream/body.py +0 -0
  69. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_stream/snap.py +0 -0
  70. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_think/__init__.py +0 -0
  71. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_think/core.py +0 -0
  72. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_think/filter.py +0 -0
  73. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_think/hist.py +0 -0
  74. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_think/hold.py +0 -0
  75. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_think/parse.py +0 -0
  76. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_tool/__init__.py +0 -0
  77. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_tool/comment.py +0 -0
  78. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_tool/invoke.py +0 -0
  79. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_tool/tools.py +0 -0
  80. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/protocols/entml_tool/values.py +0 -0
  81. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/registry.py +0 -0
  82. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/shared/__init__.py +0 -0
  83. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/shared/coercion.py +0 -0
  84. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/shared/entml_format.py +0 -0
  85. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/shared/history_markup.py +0 -0
  86. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/shared/loop_detect.py +0 -0
  87. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/shared/normalization.py +0 -0
  88. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/fncall/shared/schema_render.py +0 -0
  89. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/keys.py +0 -0
  90. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/lifecycle/__init__.py +0 -0
  91. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/lifecycle/manager.py +0 -0
  92. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/lifecycle/updater.py +0 -0
  93. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/lifecycle/updater_pull.py +0 -0
  94. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/process/__init__.py +0 -0
  95. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/process/port.py +0 -0
  96. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/protocol/__init__.py +0 -0
  97. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/protocol/base.py +0 -0
  98. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/terminal/__init__.py +0 -0
  99. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/terminal/conpty.py +0 -0
  100. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/terminal/local/__init__.py +0 -0
  101. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/terminal/local/core.py +0 -0
  102. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/terminal/local/proc.py +0 -0
  103. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/terminal/local/unix.py +0 -0
  104. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/terminal/local/win.py +0 -0
  105. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/terminal/sanitize.py +0 -0
  106. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/terminal/session/__init__.py +0 -0
  107. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/terminal/session/base.py +0 -0
  108. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/terminal/session/client.py +0 -0
  109. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/terminal/ssh.py +0 -0
  110. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/exec/terminal/tmux.py +0 -0
  111. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/__init__.py +0 -0
  112. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/charmap.py +0 -0
  113. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/spinner.py +0 -0
  114. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/ui.py +0 -0
  115. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uicore/mixins/__init__.py +0 -0
  116. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uicore/mixins/uibase.py +0 -0
  117. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uicore/mixins/uicmds.py +0 -0
  118. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uicore/mixins/uiinteract.py +0 -0
  119. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uicore/mixins/uioutput.py +0 -0
  120. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uicore/mixins/uistream.py +0 -0
  121. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uicore/ui_console.py +0 -0
  122. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uicore/ui_io.py +0 -0
  123. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uicore/ui_log.py +0 -0
  124. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uicore/ui_platform.py +0 -0
  125. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uicore/ui_text.py +0 -0
  126. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uicore/ui_types.py +0 -0
  127. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uilayout/ui_bridge.py +0 -0
  128. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uilayout/ui_countdown.py +0 -0
  129. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uilayout/ui_layout.py +0 -0
  130. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uilayout/ui_misc.py +0 -0
  131. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uilayout/ui_panel.py +0 -0
  132. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uilayout/ui_table.py +0 -0
  133. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uilayout/ui_tree.py +0 -0
  134. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uiwidgets/ui_box.py +0 -0
  135. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uiwidgets/ui_editor.py +0 -0
  136. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uiwidgets/ui_progress.py +0 -0
  137. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uiwidgets/ui_richcli.py +0 -0
  138. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uiwidgets/ui_select.py +0 -0
  139. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uiwidgets/ui_stream.py +0 -0
  140. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/console/uiwidgets/ui_themes.py +0 -0
  141. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/events/__init__.py +0 -0
  142. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/events/bus.py +0 -0
  143. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/events/event.py +0 -0
  144. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/spinner/__init__.py +0 -0
  145. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/spinner/spinner.py +0 -0
  146. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/spinner/spinner_color.py +0 -0
  147. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/tracing/__init__.py +0 -0
  148. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/tracing/context.py +0 -0
  149. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/tracing/span.py +0 -0
  150. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/tracing/tracer.py +0 -0
  151. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/translate.py +0 -0
  152. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/watcher/__init__.py +0 -0
  153. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/watcher/file_watcher.py +0 -0
  154. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/__init__.py +0 -0
  155. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/application.py +0 -0
  156. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/broker.py +0 -0
  157. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/input_box/app.js +0 -0
  158. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/input_box/components/filezone.js +0 -0
  159. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/input_box/components/motionkit.js +0 -0
  160. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/input_box/components/sendbutton.js +0 -0
  161. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/input_box/components/sortablelist.css +0 -0
  162. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/input_box/components/sortablelist.js +0 -0
  163. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/input_box/components/textinput.js +0 -0
  164. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/input_box/components/voiceinput.js +0 -0
  165. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/input_box/fonts/inter-500.woff2 +0 -0
  166. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/input_box/fonts/inter-600.woff2 +0 -0
  167. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/input_box/fonts/inter400.woff2 +0 -0
  168. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/input_box/inputbox.css +0 -0
  169. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/input_box/inputbox.js +0 -0
  170. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/input_box/style.css +0 -0
  171. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/input_box/voicegif.js +0 -0
  172. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/middleware.py +0 -0
  173. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/stats.py +0 -0
  174. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/media/web/utils.py +0 -0
  175. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/plat/files/__init__.py +0 -0
  176. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/plat/files/file_util.py +0 -0
  177. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/plat/network/__init__.py +0 -0
  178. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/plat/network/http_utils.py +0 -0
  179. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/plat/plugin/__init__.py +0 -0
  180. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/plat/plugin/base.py +0 -0
  181. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/plat/plugin/discovery.py +0 -0
  182. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/plat/plugin/registry.py +0 -0
  183. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/plat/plugin/registry_ops.py +0 -0
  184. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/plat/proxy/__init__.py +0 -0
  185. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/plat/proxy/manager.py +0 -0
  186. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/plat/runtime/__init__.py +0 -0
  187. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/plat/runtime/collector.py +0 -0
  188. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/plat/scheduler/__init__.py +0 -0
  189. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/plat/scheduler/scheduler.py +0 -0
  190. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/plat/sdk/__init__.py +0 -0
  191. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/plat/sdk/facade.py +0 -0
  192. {echotools-2.4.4 → echotools-2.4.5}/src/echotools/version.py +0 -0
  193. {echotools-2.4.4 → echotools-2.4.5}/src/echotools.egg-info/dependency_links.txt +0 -0
  194. {echotools-2.4.4 → echotools-2.4.5}/src/echotools.egg-info/requires.txt +0 -0
  195. {echotools-2.4.4 → echotools-2.4.5}/src/echotools.egg-info/top_level.txt +0 -0
  196. {echotools-2.4.4 → echotools-2.4.5}/src/tests/_check_parity.py +0 -0
  197. {echotools-2.4.4 → echotools-2.4.5}/src/tests/bench_import.py +0 -0
  198. {echotools-2.4.4 → echotools-2.4.5}/src/tests/conftest.py +0 -0
  199. {echotools-2.4.4 → echotools-2.4.5}/src/tests/fixtures/__init__.py +0 -0
  200. {echotools-2.4.4 → echotools-2.4.5}/src/tests/fixtures/entml_golden.py +0 -0
  201. {echotools-2.4.4 → echotools-2.4.5}/src/tests/fixtures/entml_golden_update.py +0 -0
  202. {echotools-2.4.4 → echotools-2.4.5}/src/tests/fixtures/simulated_fake_history_markup_responses.py +0 -0
  203. {echotools-2.4.4 → echotools-2.4.5}/src/tests/fixtures/simulated_fault_thinking_responses.py +0 -0
  204. {echotools-2.4.4 → echotools-2.4.5}/src/tests/fixtures/simulated_llm_tool_responses.py +0 -0
  205. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_adversarial_stream_splits.py +0 -0
  206. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_cache_retry.py +0 -0
  207. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_completion.py +0 -0
  208. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_config.py +0 -0
  209. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_config_extended.py +0 -0
  210. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_console.py +0 -0
  211. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_coverage_core.py +0 -0
  212. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_dispatch.py +0 -0
  213. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_dispatch_extended.py +0 -0
  214. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_dispatch_race.py +0 -0
  215. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_entml_agent_output_formats.py +0 -0
  216. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_entml_bare_invoke_format.py +0 -0
  217. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_entml_batch_stream_comprehensive.py +0 -0
  218. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_entml_golden.py +0 -0
  219. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_entml_invoke_known_tool_gate.py +0 -0
  220. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_entml_parser_comprehensive.py +0 -0
  221. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_entml_protocol.py +0 -0
  222. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_entml_stream_json.py +0 -0
  223. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_entml_stream_json_exhaustive.py +0 -0
  224. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_entml_thinking_history.py +0 -0
  225. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_entml_thinking_parse.py +0 -0
  226. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_entml_tool_parse_leak.py +0 -0
  227. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_entml_tool_pipeline.py +0 -0
  228. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_entml_tools.py +0 -0
  229. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_errors.py +0 -0
  230. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_errors_common.py +0 -0
  231. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_events.py +0 -0
  232. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_events_event.py +0 -0
  233. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_facade.py +0 -0
  234. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_fake_history_markup_batch.py +0 -0
  235. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_fake_history_markup_invoke_preserve.py +0 -0
  236. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_fake_history_markup_reply_protect.py +0 -0
  237. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_fake_history_markup_stream.py +0 -0
  238. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_fault_thinking_close_batch.py +0 -0
  239. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_fault_thinking_close_stream.py +0 -0
  240. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_fncall.py +0 -0
  241. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_fncall_stream_thinking.py +0 -0
  242. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_history_markup_filter.py +0 -0
  243. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_imports.py +0 -0
  244. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_io.py +0 -0
  245. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_keys.py +0 -0
  246. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_lifecycle.py +0 -0
  247. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_logger.py +0 -0
  248. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_merge.py +0 -0
  249. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_model_branch_matrix.py +0 -0
  250. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_multiline_parameter_comprehensive.py +0 -0
  251. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_plugin.py +0 -0
  252. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_printstream.py +0 -0
  253. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_protocols.py +0 -0
  254. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_proxy.py +0 -0
  255. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_proxy_selector.py +0 -0
  256. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_runtime.py +0 -0
  257. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_scheduler.py +0 -0
  258. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_schema_validate.py +0 -0
  259. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_simulated_llm_tool_parse.py +0 -0
  260. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_stream_partial_json_parity.py +0 -0
  261. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_stream_realtime_parse.py +0 -0
  262. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_tracing.py +0 -0
  263. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_ui_bridge.py +0 -0
  264. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_usage.py +0 -0
  265. {echotools-2.4.4 → echotools-2.4.5}/src/tests/test_web.py +0 -0
  266. {echotools-2.4.4 → echotools-2.4.5}/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.4
3
+ Version: 2.4.5
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.4**(详见 [CHANGELOG](docs/CHANGELOG.md))。
61
+ 完全项目无关,兼容 Python 3.8–3.14。当前版本:**2.4.5**(详见 [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.4**(详见 [CHANGELOG](docs/CHANGELOG.md))。
5
+ 完全项目无关,兼容 Python 3.8–3.14。当前版本:**2.4.5**(详见 [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.4"
7
+ version = "2.4.5"
8
8
  description = "通用基础设施 SDK:配置、日志、事件、调度、插件、协议、调用链"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
@@ -0,0 +1,7 @@
1
+ from __future__ import annotations
2
+
3
+ """ids 模块导出。"""
4
+
5
+ from echotools.base.ids.generator import gen_tool_id, short_id, span_id, trace_id, uuid7
6
+
7
+ __all__ = ["uuid7", "short_id", "trace_id", "span_id", "gen_tool_id"]
@@ -7,7 +7,7 @@ import struct
7
7
  import time
8
8
  import uuid
9
9
 
10
- __all__ = ["uuid7", "short_id", "trace_id", "span_id"]
10
+ __all__ = ["uuid7", "short_id", "trace_id", "span_id", "gen_tool_id"]
11
11
 
12
12
 
13
13
  def uuid7() -> str:
@@ -60,3 +60,8 @@ def span_id() -> str:
60
60
  span_id 字符串。
61
61
  """
62
62
  return secrets.token_hex(8)
63
+
64
+
65
+ def gen_tool_id() -> str:
66
+ """生成 Anthropic 兼容的 tool_use id(``toolu_`` + 24 位十六进制)。"""
67
+ return f"toolu_{uuid.uuid4().hex[:24]}"
@@ -15,6 +15,12 @@ from echotools.exec.fncall.shared.normalization import (
15
15
  normalize_tool_call,
16
16
  normalize_tool_calls,
17
17
  )
18
+ from echotools.base.ids.generator import gen_tool_id
19
+ from echotools.exec.fncall.tool_id import (
20
+ ensure_toolu_tool_call_id,
21
+ fix_tool_call_id,
22
+ is_placeholder_tool_call_id,
23
+ )
18
24
  from echotools.exec.protocol.base import (
19
25
  ToolProtocol,
20
26
  get_protocol_by_id,
@@ -28,6 +34,10 @@ __all__ = [
28
34
  "normalize_content",
29
35
  "normalize_tool_call",
30
36
  "normalize_tool_calls",
37
+ "gen_tool_id",
38
+ "is_placeholder_tool_call_id",
39
+ "ensure_toolu_tool_call_id",
40
+ "fix_tool_call_id",
31
41
  "detect_tool_loop",
32
42
  "LoopDetectionResult",
33
43
  "ToolProtocol",
@@ -29,6 +29,9 @@ _TAG_ONLY_OPEN_RES = (
29
29
  re.compile(r"<entml:call\b[^>]*>", re.IGNORECASE),
30
30
  re.compile(r"<function_calling_behavior\b[^>]*>", re.IGNORECASE),
31
31
  re.compile(r"<thinking_behavior\b[^>]*>", re.IGNORECASE),
32
+ re.compile(r"<function_results\b[^>]*>", re.IGNORECASE),
33
+ re.compile(r"<function_result\b[^>]*>", re.IGNORECASE),
34
+ re.compile(r"<redacted_thinking\b[^>]*>", re.IGNORECASE),
32
35
  re.compile(r"<entml:hard_constraint_restatement\b[^>]*>", re.IGNORECASE),
33
36
  re.compile(r"<entml:result\b[^>]*>", re.IGNORECASE),
34
37
  re.compile(r"<entml:todo\b[^>]*>", re.IGNORECASE),
@@ -40,6 +43,9 @@ _TAG_ONLY_CLOSE_RES = (
40
43
  re.compile(r"</entml:call\s*>", re.IGNORECASE),
41
44
  re.compile(r"</function_calling_behavior\s*>", re.IGNORECASE),
42
45
  re.compile(r"</thinking_behavior\s*>", re.IGNORECASE),
46
+ re.compile(r"</function_results\s*>", re.IGNORECASE),
47
+ re.compile(r"</function_result\s*>", re.IGNORECASE),
48
+ re.compile(r"</redacted_thinking\s*>", re.IGNORECASE),
43
49
  re.compile(r"</entml:hard_constraint_restatement\s*>", re.IGNORECASE),
44
50
  re.compile(r"</entml:result\s*>", re.IGNORECASE),
45
51
  re.compile(r"</entml:todo\s*>", re.IGNORECASE),
@@ -60,6 +66,12 @@ _FAKE_ENTML_TAG_PREFIXES: Tuple[str, ...] = (
60
66
  "</function_calling_behavior",
61
67
  "<thinking_behavior",
62
68
  "</thinking_behavior",
69
+ "<function_results",
70
+ "</function_results",
71
+ "<function_result",
72
+ "</function_result",
73
+ "<redacted_thinking",
74
+ "</redacted_thinking",
63
75
  "<entml:hard_constraint_restatement",
64
76
  "</entml:hard_constraint_restatement",
65
77
  "<entml:todo",
@@ -0,0 +1,42 @@
1
+ """Tool call id 生成与规范化(Anthropic ``toolu_`` 约定)。"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, Dict
6
+
7
+ from echotools.base.ids.generator import gen_tool_id
8
+
9
+ _PLACEHOLDER_EXACT = frozenset({"", "call_0000", "toolu_call_0001"})
10
+ _PLACEHOLDER_PREFIXES = ("call_", "toolu_call_")
11
+
12
+
13
+ def is_placeholder_tool_call_id(raw_id: str) -> bool:
14
+ """echotools 解析占位 id(``call_0000`` / ``toolu_call_*`` 等)应视为无效。"""
15
+ if not raw_id or raw_id in _PLACEHOLDER_EXACT:
16
+ return True
17
+ return raw_id.startswith(_PLACEHOLDER_PREFIXES)
18
+
19
+
20
+ def ensure_toolu_tool_call_id(raw_id: str) -> str:
21
+ """占位 id 换新;已有 id 无 ``toolu_`` 前缀则补上(Anthropic tool_use 输出)。"""
22
+ tid = (raw_id or "").strip()
23
+ if is_placeholder_tool_call_id(tid):
24
+ return gen_tool_id()
25
+ if not tid.startswith("toolu_"):
26
+ return f"toolu_{tid}"
27
+ return tid
28
+
29
+
30
+ def fix_tool_call_id(tc: Dict[str, Any]) -> Dict[str, Any]:
31
+ """将 OpenAI 格式 tool call 的占位 id 替换为 ``gen_tool_id()`` 结果。"""
32
+ raw_id = str(tc.get("id") or "")
33
+ call_id = gen_tool_id() if is_placeholder_tool_call_id(raw_id) else raw_id
34
+ func = tc.get("function") or {}
35
+ return {
36
+ "id": call_id,
37
+ "type": "function",
38
+ "function": {
39
+ "name": func.get("name", ""),
40
+ "arguments": func.get("arguments", "{}"),
41
+ },
42
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: echotools
3
- Version: 2.4.4
3
+ Version: 2.4.5
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.4**(详见 [CHANGELOG](docs/CHANGELOG.md))。
61
+ 完全项目无关,兼容 Python 3.8–3.14。当前版本:**2.4.5**(详见 [CHANGELOG](docs/CHANGELOG.md))。
62
62
 
63
63
  ## 安装
64
64
 
@@ -42,6 +42,7 @@ src/echotools/exec/dispatch/selector.py
42
42
  src/echotools/exec/dispatch/usage.py
43
43
  src/echotools/exec/fncall/__init__.py
44
44
  src/echotools/exec/fncall/registry.py
45
+ src/echotools/exec/fncall/tool_id.py
45
46
  src/echotools/exec/fncall/parsers/__init__.py
46
47
  src/echotools/exec/fncall/parsers/stream.py
47
48
  src/echotools/exec/fncall/parsers/stream_delta.py
@@ -249,6 +250,7 @@ src/tests/test_schema_validate.py
249
250
  src/tests/test_simulated_llm_tool_parse.py
250
251
  src/tests/test_stream_partial_json_parity.py
251
252
  src/tests/test_stream_realtime_parse.py
253
+ src/tests/test_tool_id.py
252
254
  src/tests/test_tracing.py
253
255
  src/tests/test_ui_bridge.py
254
256
  src/tests/test_usage.py
@@ -13,6 +13,8 @@ from echotools.exec.fncall.protocols.entml_tool.fakemarkup import (
13
13
  strip_orphan_entml_close_tags,
14
14
  )
15
15
 
16
+ _REDACTED_THINKING = "redacted" + "_thinking"
17
+
16
18
  READ_TOOL = {
17
19
  "type": "function",
18
20
  "function": {
@@ -83,6 +85,18 @@ READ_TOOL = {
83
85
  "hard_constraint_restatement",
84
86
  "后",
85
87
  ),
88
+ (
89
+ "正文\n<function_results>\n假结果\n</function_results>\n继续",
90
+ "假结果",
91
+ "function_results",
92
+ "继续",
93
+ ),
94
+ (
95
+ "除此之外</function_result>,中间保留",
96
+ "中间保留",
97
+ "function_result",
98
+ "除此之外",
99
+ ),
86
100
  (
87
101
  "<entml:result>\nbody\n</entml:result>\nok",
88
102
  "body",
@@ -117,6 +131,16 @@ def test_strip_fake_entml_structure_batch(
117
131
  assert expect_present in cleaned
118
132
 
119
133
 
134
+ def test_strip_redacted_thinking_tags_only() -> None:
135
+ rt = _REDACTED_THINKING
136
+ raw = f"前\n<{rt}>\n已脱敏思考\n</{rt}>\n后"
137
+ cleaned, found = strip_fake_entml_structure_markup(raw)
138
+ assert found
139
+ assert rt not in cleaned
140
+ assert "已脱敏思考" in cleaned
141
+ assert "后" in cleaned
142
+
143
+
120
144
  def test_tool_result_comment_partial_hold() -> None:
121
145
  partial = "可见\n<!-- Tool Result ID:toolu_abc"
122
146
  assert trailing_partial_tool_result_id_comment_len(partial) == len(
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import pytest
4
4
 
5
- from echotools.base.ids import short_id, span_id, trace_id, uuid7
5
+ from echotools.base.ids import short_id, span_id, trace_id, uuid7, gen_tool_id
6
6
 
7
7
 
8
8
  def test_uuid7_format() -> None:
@@ -23,3 +23,9 @@ def test_short_id_invalid_length() -> None:
23
23
  def test_trace_and_span_ids() -> None:
24
24
  assert len(trace_id()) == 32
25
25
  assert len(span_id()) == 16
26
+
27
+
28
+ def test_gen_tool_id_unique() -> None:
29
+ a = gen_tool_id()
30
+ b = gen_tool_id()
31
+ assert a != b
@@ -0,0 +1,47 @@
1
+ from __future__ import annotations
2
+
3
+ import pytest
4
+
5
+ from echotools.base.ids import gen_tool_id
6
+ from echotools.exec.fncall.tool_id import (
7
+ ensure_toolu_tool_call_id,
8
+ fix_tool_call_id,
9
+ is_placeholder_tool_call_id,
10
+ )
11
+
12
+
13
+ def test_gen_tool_id_format() -> None:
14
+ tid = gen_tool_id()
15
+ assert tid.startswith("toolu_")
16
+ assert len(tid) == len("toolu_") + 24
17
+
18
+
19
+ def test_is_placeholder_tool_call_id() -> None:
20
+ assert is_placeholder_tool_call_id("")
21
+ assert is_placeholder_tool_call_id("call_0000")
22
+ assert is_placeholder_tool_call_id("toolu_call_0001")
23
+ assert is_placeholder_tool_call_id("call_abc")
24
+ assert not is_placeholder_tool_call_id("toolu_real123")
25
+
26
+
27
+ def test_fix_tool_call_id_replaces_placeholder() -> None:
28
+ fixed = fix_tool_call_id({
29
+ "id": "call_0000",
30
+ "function": {"name": "search", "arguments": '{"q":"x"}'},
31
+ })
32
+ assert fixed["id"].startswith("toolu_")
33
+ assert fixed["function"]["name"] == "search"
34
+
35
+
36
+ def test_fix_tool_call_id_keeps_valid() -> None:
37
+ fixed = fix_tool_call_id({
38
+ "id": "toolu_abc123",
39
+ "function": {"name": "search", "arguments": "{}"},
40
+ })
41
+ assert fixed["id"] == "toolu_abc123"
42
+
43
+
44
+ def test_ensure_toolu_tool_call_id() -> None:
45
+ assert ensure_toolu_tool_call_id("call_0000").startswith("toolu_")
46
+ assert ensure_toolu_tool_call_id("abc") == "toolu_abc"
47
+ assert ensure_toolu_tool_call_id("toolu_xyz") == "toolu_xyz"
@@ -1,7 +0,0 @@
1
- from __future__ import annotations
2
-
3
- """ids 模块导出。"""
4
-
5
- from echotools.base.ids.generator import short_id, span_id, trace_id, uuid7
6
-
7
- __all__ = ["uuid7", "short_id", "trace_id", "span_id"]
File without changes