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