echotools 2.3.96__tar.gz → 2.3.97__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.
- {echotools-2.3.96 → echotools-2.3.97}/PKG-INFO +1 -1
- {echotools-2.3.96 → echotools-2.3.97}/pyproject.toml +1 -1
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_fake_structure_markup.py +21 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools.egg-info/PKG-INFO +1 -1
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_entml_fake_structure_markup.py +35 -0
- {echotools-2.3.96 → echotools-2.3.97}/README.md +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/setup.cfg +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/cache/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/cache/list_cache.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/cache/memory_cache.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/config/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/config/base.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/config/center.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/config/center_notify.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/config/center_template.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/config/loader.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/config/merge.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/errors/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/errors/base.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/errors/classify.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/errors/common.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/errors/http.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/ids/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/ids/generator.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/io/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/io/io_utils.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/io/printstream.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/logger/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/logger/manager.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/retry/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/base/retry/retry.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/compat.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/dispatch/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/dispatch/candidate.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/dispatch/dispatcher.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/dispatch/proxy_selector.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/dispatch/race.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/dispatch/selector.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/dispatch/usage.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/parsers/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/parsers/stream.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/parsers/stream_delta.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/parsers/stream_feed.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/parsers/stream_final.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/parsers/xml_params.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/parsers/xml_parser.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/prompt/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/prompt/behavior_blocks.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/prompt/history.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/prompt/history_format.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/prompt/inject.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/prompt/prompt_helpers.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/prompt/templates.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_invoke.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_patterns.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_schema.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_stream/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_stream/body.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_stream/snap.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_think/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_think/blocks.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_think/core.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_think/filter.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_think/hist.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_think/hold.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_think/parse.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_tool_result_comment.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/registry.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/shared/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/shared/coercion.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/shared/history_markup.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/shared/loop_detect.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/shared/normalization.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/shared/schema_render.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/shared/xml_helpers.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/keys.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/lifecycle/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/lifecycle/manager.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/lifecycle/updater.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/lifecycle/updater_pull.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/process/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/process/port.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/protocol/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/protocol/base.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/terminal/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/terminal/conpty.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/terminal/local/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/terminal/local/core.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/terminal/local/proc.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/terminal/local/unix.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/terminal/local/win.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/terminal/sanitize.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/terminal/session/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/terminal/session/base.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/terminal/session/client.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/terminal/ssh.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/terminal/tmux.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/charmap.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/spinner.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/ui.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uicore/mixins/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uicore/mixins/uibase.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uicore/mixins/uicmds.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uicore/mixins/uiinteract.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uicore/mixins/uioutput.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uicore/mixins/uistream.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uicore/ui_console.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uicore/ui_io.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uicore/ui_log.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uicore/ui_platform.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uicore/ui_text.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uicore/ui_types.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uilayout/ui_countdown.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uilayout/ui_layout.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uilayout/ui_misc.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uilayout/ui_panel.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uilayout/ui_table.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uilayout/ui_tree.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uiwidgets/ui_box.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uiwidgets/ui_editor.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uiwidgets/ui_progress.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uiwidgets/ui_select.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uiwidgets/ui_stream.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/events/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/events/bus.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/events/event.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/spinner/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/spinner/spinner.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/spinner/spinner_color.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/tracing/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/tracing/context.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/tracing/span.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/tracing/tracer.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/translate.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/watcher/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/watcher/file_watcher.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/application.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/broker.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/app.js +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/components/filezone.js +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/components/motionkit.js +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/components/sendbutton.js +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/components/sortablelist.css +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/components/sortablelist.js +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/components/textinput.js +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/components/voiceinput.js +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/fonts/inter-500.woff2 +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/fonts/inter-600.woff2 +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/fonts/inter400.woff2 +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/inputbox.css +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/inputbox.js +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/style.css +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/voicegif.js +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/middleware.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/stats.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/utils.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/plat/files/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/plat/files/file_util.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/plat/network/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/plat/network/http_utils.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/plat/plugin/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/plat/plugin/base.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/plat/plugin/discovery.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/plat/plugin/registry.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/plat/plugin/registry_ops.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/plat/proxy/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/plat/proxy/manager.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/plat/runtime/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/plat/runtime/collector.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/plat/scheduler/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/plat/scheduler/scheduler.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/plat/sdk/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/plat/sdk/facade.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools/version.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools.egg-info/SOURCES.txt +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools.egg-info/dependency_links.txt +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools.egg-info/requires.txt +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/echotools.egg-info/top_level.txt +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/bench_import.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/conftest.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/fixtures/__init__.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/fixtures/simulated_fake_history_markup_responses.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/fixtures/simulated_fault_thinking_responses.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/fixtures/simulated_llm_tool_responses.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_adversarial_stream_splits.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_cache_retry.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_completion.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_config.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_config_extended.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_console.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_coverage_core.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_dispatch.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_dispatch_extended.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_dispatch_race.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_entml_agent_output_formats.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_entml_bare_invoke_format.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_entml_batch_stream_comprehensive.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_entml_invoke_known_tool_gate.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_entml_parser_comprehensive.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_entml_protocol.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_entml_stream_json.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_entml_stream_json_exhaustive.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_entml_thinking_history.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_entml_thinking_parse.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_entml_tool_parse_leak.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_entml_tool_pipeline.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_entml_tools.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_errors.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_errors_common.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_events.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_events_event.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_facade.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_fake_history_markup_batch.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_fake_history_markup_invoke_preserve.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_fake_history_markup_reply_protect.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_fake_history_markup_stream.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_fault_thinking_close_batch.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_fault_thinking_close_stream.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_fncall.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_fncall_stream_thinking.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_history_markup_filter.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_ids.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_imports.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_io.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_keys.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_lifecycle.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_logger.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_merge.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_model_branch_matrix.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_plugin.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_printstream.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_protocols.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_proxy.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_proxy_selector.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_runtime.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_scheduler.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_simulated_llm_tool_parse.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_stream_partial_json_parity.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_stream_realtime_parse.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_tracing.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_usage.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_web.py +0 -0
- {echotools-2.3.96 → echotools-2.3.97}/src/tests/test_web_broker.py +0 -0
|
@@ -52,6 +52,19 @@ _FAKE_ENTML_TAG_PREFIXES: Tuple[str, ...] = (
|
|
|
52
52
|
"</function_calling_behavior",
|
|
53
53
|
"<thinking_behavior",
|
|
54
54
|
"</thinking_behavior",
|
|
55
|
+
"</entml:invoke",
|
|
56
|
+
"</entml:parameter",
|
|
57
|
+
"</entml:thinking",
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
# 模型误输出的残缺/单行 ``</entml:…``(无完整闭标签名或未收齐 ``>``)。
|
|
61
|
+
_ORPHAN_ENTML_CLOSE_LINE_RE = re.compile(
|
|
62
|
+
r"(?m)^\s*(?:●\s*)?</entml:?[a-z0-9_-]*\s*$",
|
|
63
|
+
re.IGNORECASE,
|
|
64
|
+
)
|
|
65
|
+
_TRAILING_INCOMPLETE_ENTML_CLOSE_RE = re.compile(
|
|
66
|
+
r"</entml:?[a-z0-9_-]*\s*$",
|
|
67
|
+
re.IGNORECASE,
|
|
55
68
|
)
|
|
56
69
|
|
|
57
70
|
|
|
@@ -69,6 +82,12 @@ def _strip_tag_only_markup(text: str) -> Tuple[str, bool]:
|
|
|
69
82
|
return text, found
|
|
70
83
|
|
|
71
84
|
|
|
85
|
+
def _strip_orphan_entml_close_leaks(text: str) -> Tuple[str, bool]:
|
|
86
|
+
text, n1 = _ORPHAN_ENTML_CLOSE_LINE_RE.subn("", text)
|
|
87
|
+
text, n2 = _TRAILING_INCOMPLETE_ENTML_CLOSE_RE.subn("", text)
|
|
88
|
+
return text, (n1 + n2) > 0
|
|
89
|
+
|
|
90
|
+
|
|
72
91
|
def _could_be_fake_entml_tag_prefix(fragment: str) -> bool:
|
|
73
92
|
frag = fragment.lower()
|
|
74
93
|
if not frag.startswith("<"):
|
|
@@ -153,6 +172,8 @@ def strip_fake_entml_structure_markup(content: str) -> Tuple[str, bool]:
|
|
|
153
172
|
found = found or hit
|
|
154
173
|
text, hit = _strip_tag_only_markup(text)
|
|
155
174
|
found = found or hit
|
|
175
|
+
text, hit = _strip_orphan_entml_close_leaks(text)
|
|
176
|
+
found = found or hit
|
|
156
177
|
text = re.sub(r"\n{3,}", "\n\n", text)
|
|
157
178
|
return text, found
|
|
158
179
|
|
|
@@ -135,6 +135,41 @@ def test_bare_result_tags_only_not_body() -> None:
|
|
|
135
135
|
assert "尾" in cleaned
|
|
136
136
|
|
|
137
137
|
|
|
138
|
+
def test_orphan_incomplete_entml_close_leak() -> None:
|
|
139
|
+
raw = (
|
|
140
|
+
"说明正文\n"
|
|
141
|
+
"<!-- Tool Result ID:toolu_check_theme_btn -->\n"
|
|
142
|
+
"</entml:"
|
|
143
|
+
)
|
|
144
|
+
cleaned, found = strip_fake_entml_structure_markup(raw)
|
|
145
|
+
assert found
|
|
146
|
+
assert "说明正文" in cleaned
|
|
147
|
+
assert "entml" not in cleaned.lower()
|
|
148
|
+
assert "Tool Result ID" not in cleaned
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def test_rogator_response_log_corpus_no_entml_tail() -> None:
|
|
152
|
+
from pathlib import Path
|
|
153
|
+
|
|
154
|
+
log = Path(__file__).resolve().parent / "fixtures" / "rogator_entml_close_leak.txt"
|
|
155
|
+
raw = log.read_text(encoding="utf-8")
|
|
156
|
+
READ = {
|
|
157
|
+
"type": "function",
|
|
158
|
+
"function": {
|
|
159
|
+
"name": "Grep",
|
|
160
|
+
"parameters": {
|
|
161
|
+
"type": "object",
|
|
162
|
+
"properties": {"pattern": {"type": "string"}, "path": {"type": "string"}},
|
|
163
|
+
"required": ["pattern"],
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
}
|
|
167
|
+
proto = get_protocol("entml")
|
|
168
|
+
clean, calls = proto.parse(raw, [READ])
|
|
169
|
+
assert calls
|
|
170
|
+
assert "entml" not in clean.lower()
|
|
171
|
+
|
|
172
|
+
|
|
138
173
|
def test_batch_parse_strips_fake_structure() -> None:
|
|
139
174
|
text = (
|
|
140
175
|
"回答正文\n"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_stream/__init__.py
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_stream/body.py
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_stream/snap.py
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_think/__init__.py
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_think/blocks.py
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_think/core.py
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_think/filter.py
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_think/hist.py
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_think/hold.py
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/exec/fncall/protocols/entml_think/parse.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/console/uicore/mixins/uiinteract.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/components/filezone.js
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/components/motionkit.js
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/components/sendbutton.js
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/components/sortablelist.css
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/components/sortablelist.js
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/components/textinput.js
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/components/voiceinput.js
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/fonts/inter-500.woff2
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/fonts/inter-600.woff2
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/echotools/media/web/input_box/fonts/inter400.woff2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/tests/fixtures/simulated_fake_history_markup_responses.py
RENAMED
|
File without changes
|
{echotools-2.3.96 → echotools-2.3.97}/src/tests/fixtures/simulated_fault_thinking_responses.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|