vibego 0.2.35__tar.gz → 0.2.42__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.
Potentially problematic release.
This version of vibego might be problematic. Click here for more details.
- {vibego-0.2.35 → vibego-0.2.42}/PKG-INFO +1 -1
- {vibego-0.2.35 → vibego-0.2.42}/bot.py +157 -76
- {vibego-0.2.35 → vibego-0.2.42}/pyproject.toml +3 -3
- {vibego-0.2.35 → vibego-0.2.42}/tests/test_long_poll_mechanism.py +18 -15
- vibego-0.2.42/tests/test_markdown_guard.py +91 -0
- {vibego-0.2.35 → vibego-0.2.42}/tests/test_task_description.py +7 -1
- vibego-0.2.42/tests/test_telegram_markdown_renderer.py +44 -0
- {vibego-0.2.35 → vibego-0.2.42}/tests/test_unescape_markdown.py +2 -2
- {vibego-0.2.35 → vibego-0.2.42}/vibego.egg-info/PKG-INFO +1 -1
- {vibego-0.2.35 → vibego-0.2.42}/vibego.egg-info/SOURCES.txt +0 -1
- {vibego-0.2.35 → vibego-0.2.42}/vibego.egg-info/top_level.txt +0 -1
- {vibego-0.2.35 → vibego-0.2.42}/vibego_cli/__init__.py +1 -1
- vibego-0.2.35/telegram_markdown/__init__.py +0 -269
- vibego-0.2.35/tests/test_markdown_guard.py +0 -43
- vibego-0.2.35/tests/test_telegram_markdown_renderer.py +0 -58
- {vibego-0.2.35 → vibego-0.2.42}/MANIFEST.in +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/README.md +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/config/projects.json.example +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/logging_setup.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/master.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/project_repository.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/__main__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/__pip-runner__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/build_env.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/cache.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/cli/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/cli/autocompletion.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/cli/base_command.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/cli/cmdoptions.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/cli/command_context.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/cli/index_command.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/cli/main.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/cli/main_parser.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/cli/parser.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/cli/progress_bars.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/cli/req_command.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/cli/spinners.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/cli/status_codes.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/cache.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/check.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/completion.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/configuration.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/debug.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/download.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/freeze.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/hash.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/help.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/index.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/inspect.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/install.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/list.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/lock.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/search.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/show.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/uninstall.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/commands/wheel.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/configuration.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/distributions/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/distributions/base.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/distributions/installed.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/distributions/sdist.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/distributions/wheel.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/exceptions.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/index/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/index/collector.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/index/package_finder.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/index/sources.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/locations/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/locations/_distutils.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/locations/_sysconfig.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/locations/base.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/main.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/metadata/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/metadata/_json.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/metadata/base.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/metadata/importlib/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/metadata/importlib/_compat.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/metadata/importlib/_dists.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/metadata/importlib/_envs.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/metadata/pkg_resources.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/models/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/models/candidate.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/models/direct_url.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/models/format_control.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/models/index.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/models/installation_report.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/models/link.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/models/pylock.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/models/scheme.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/models/search_scope.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/models/selection_prefs.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/models/target_python.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/models/wheel.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/network/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/network/auth.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/network/cache.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/network/download.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/network/lazy_wheel.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/network/session.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/network/utils.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/network/xmlrpc.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/operations/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/operations/build/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/operations/build/build_tracker.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/operations/build/metadata.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/operations/build/metadata_editable.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/operations/build/metadata_legacy.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/operations/build/wheel.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/operations/build/wheel_editable.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/operations/build/wheel_legacy.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/operations/check.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/operations/freeze.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/operations/install/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/operations/install/editable_legacy.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/operations/install/wheel.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/operations/prepare.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/pyproject.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/req/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/req/constructors.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/req/req_dependency_group.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/req/req_file.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/req/req_install.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/req/req_set.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/req/req_uninstall.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/resolution/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/resolution/base.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/resolution/legacy/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/resolution/legacy/resolver.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/resolution/resolvelib/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/resolution/resolvelib/base.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/resolution/resolvelib/candidates.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/resolution/resolvelib/factory.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/resolution/resolvelib/provider.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/resolution/resolvelib/reporter.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/resolution/resolvelib/requirements.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/resolution/resolvelib/resolver.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/self_outdated_check.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/_jaraco_text.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/_log.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/appdirs.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/compat.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/compatibility_tags.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/datetime.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/deprecation.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/direct_url_helpers.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/egg_link.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/entrypoints.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/filesystem.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/filetypes.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/glibc.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/hashes.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/logging.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/misc.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/packaging.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/retry.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/setuptools_build.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/subprocess.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/temp_dir.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/unpacking.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/urls.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/virtualenv.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/utils/wheel.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/vcs/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/vcs/bazaar.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/vcs/git.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/vcs/mercurial.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/vcs/subversion.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/vcs/versioncontrol.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_internal/wheel_builder.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/cachecontrol/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/cachecontrol/_cmd.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/cachecontrol/adapter.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/cachecontrol/cache.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/cachecontrol/controller.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/cachecontrol/filewrapper.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/cachecontrol/heuristics.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/cachecontrol/serialize.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/cachecontrol/wrapper.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/certifi/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/certifi/__main__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/certifi/core.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/dependency_groups/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/dependency_groups/__main__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/dependency_groups/_implementation.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/dependency_groups/_lint_dependency_groups.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/dependency_groups/_pip_wrapper.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/dependency_groups/_toml_compat.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/distlib/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/distlib/compat.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/distlib/resources.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/distlib/scripts.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/distlib/util.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/distro/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/distro/__main__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/distro/distro.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/idna/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/idna/codec.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/idna/compat.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/idna/core.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/idna/idnadata.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/idna/intranges.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/idna/package_data.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/idna/uts46data.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/msgpack/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/msgpack/exceptions.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/msgpack/ext.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/msgpack/fallback.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/packaging/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/packaging/_elffile.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/packaging/_manylinux.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/packaging/_musllinux.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/packaging/_parser.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/packaging/_structures.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/packaging/_tokenizer.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/packaging/licenses/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/packaging/licenses/_spdx.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/packaging/markers.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/packaging/metadata.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/packaging/requirements.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/packaging/specifiers.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/packaging/tags.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/packaging/utils.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/packaging/version.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pkg_resources/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/platformdirs/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/platformdirs/__main__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/platformdirs/android.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/platformdirs/api.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/platformdirs/macos.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/platformdirs/unix.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/platformdirs/version.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/platformdirs/windows.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/__main__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/console.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/filter.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/filters/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/formatter.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/formatters/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/formatters/_mapping.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/lexer.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/lexers/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/lexers/_mapping.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/lexers/python.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/modeline.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/plugin.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/regexopt.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/scanner.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/sphinxext.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/style.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/styles/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/styles/_mapping.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/token.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/unistring.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pygments/util.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pyproject_hooks/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pyproject_hooks/_impl.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/__version__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/_internal_utils.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/adapters.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/api.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/auth.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/certs.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/compat.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/cookies.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/exceptions.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/help.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/hooks.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/models.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/packages.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/sessions.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/status_codes.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/structures.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/requests/utils.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/resolvelib/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/resolvelib/providers.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/resolvelib/reporters.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/resolvelib/resolvers/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/resolvelib/resolvers/abstract.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/resolvelib/resolvers/criterion.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/resolvelib/resolvers/exceptions.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/resolvelib/structs.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/__main__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_cell_widths.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_emoji_codes.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_emoji_replace.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_export_format.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_extension.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_fileno.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_inspect.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_log_render.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_loop.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_null_file.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_palettes.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_pick.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_ratio.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_spinners.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_stack.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_timer.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_win32_console.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_windows.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_windows_renderer.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/_wrap.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/abc.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/align.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/ansi.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/bar.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/box.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/cells.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/color.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/color_triplet.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/columns.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/console.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/constrain.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/containers.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/control.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/default_styles.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/diagnose.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/emoji.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/errors.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/file_proxy.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/filesize.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/highlighter.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/json.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/jupyter.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/layout.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/live.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/live_render.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/logging.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/markup.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/measure.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/padding.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/pager.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/palette.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/panel.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/pretty.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/progress.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/progress_bar.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/prompt.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/protocol.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/region.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/repr.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/rule.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/scope.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/screen.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/segment.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/spinner.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/status.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/style.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/styled.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/syntax.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/table.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/terminal_theme.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/text.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/theme.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/themes.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/traceback.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/rich/tree.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/tomli/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/tomli/_parser.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/tomli/_re.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/tomli/_types.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/tomli_w/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/tomli_w/_writer.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/truststore/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/truststore/_api.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/truststore/_macos.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/truststore/_openssl.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/truststore/_ssl_constants.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/truststore/_windows.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/_collections.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/_version.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/connection.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/connectionpool.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/contrib/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/contrib/appengine.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/contrib/socks.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/exceptions.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/fields.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/filepost.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/packages/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/packages/six.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/poolmanager.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/request.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/response.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/util/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/util/connection.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/util/proxy.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/util/queue.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/util/request.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/util/response.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/util/retry.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/util/ssl_.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/util/ssltransport.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/util/timeout.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/util/url.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/.venv/lib/python3.14/site-packages/pip/_vendor/urllib3/util/wait.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/bump_version.sh +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/log_writer.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/master_healthcheck.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/models/claudecode.sh +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/models/codex.sh +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/models/common.sh +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/models/gemini.sh +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/publish.sh +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/requirements.txt +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/run_bot.sh +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/start.sh +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/start_tmux_codex.sh +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/stop_all.sh +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/stop_bot.sh +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/scripts/test_deps_check.sh +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/setup.cfg +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/tasks/__init__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/tasks/commands.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/tasks/constants.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/tasks/fsm.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/tasks/models.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/tasks/service.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/tests/test_auto_compact.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/tests/test_chat_menu_buttons.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/tests/test_claudecode_jsonl.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/tests/test_master_project_management.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/tests/test_master_restart.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/tests/test_numbered_reply_inputs.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/tests/test_plan_progress.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/tests/test_task_create_flow.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/tests/test_task_detail_back.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/tests/test_task_list_entry.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/tests/test_version_display.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/vibego.egg-info/dependency_links.txt +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/vibego.egg-info/entry_points.txt +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/vibego.egg-info/requires.txt +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/vibego_cli/__main__.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/vibego_cli/config.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/vibego_cli/data/worker_requirements.txt +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/vibego_cli/deps.py +0 -0
- {vibego-0.2.35 → vibego-0.2.42}/vibego_cli/main.py +0 -0
|
@@ -69,8 +69,6 @@ from tasks.fsm import (
|
|
|
69
69
|
TaskNoteStates,
|
|
70
70
|
TaskPushStates,
|
|
71
71
|
)
|
|
72
|
-
from telegram_markdown import render_markdown_to_telegram
|
|
73
|
-
|
|
74
72
|
# --- 简单 .env 加载 ---
|
|
75
73
|
def load_env(p: str = ".env"):
|
|
76
74
|
"""从指定路径加载 dotenv 格式的键值对到进程环境变量。"""
|
|
@@ -128,7 +126,7 @@ TEST_PHASE_PROMPT = f"进入测试阶段{AGENTS_PHASE_SUFFIX}"
|
|
|
128
126
|
# 报告缺陷时的专用前缀,插入在统一提示语之前
|
|
129
127
|
BUG_REPORT_PREFIX = "报告一个缺陷,详见底部最新的缺陷描述。"
|
|
130
128
|
|
|
131
|
-
_parse_mode_env = (os.environ.get("TELEGRAM_PARSE_MODE") or "
|
|
129
|
+
_parse_mode_env = (os.environ.get("TELEGRAM_PARSE_MODE") or "Markdown").strip()
|
|
132
130
|
_parse_mode_key = _parse_mode_env.replace("-", "").replace("_", "").lower()
|
|
133
131
|
MODEL_OUTPUT_PARSE_MODE: Optional[ParseMode]
|
|
134
132
|
if _parse_mode_key in _PARSE_MODE_CANDIDATES:
|
|
@@ -136,7 +134,12 @@ if _parse_mode_key in _PARSE_MODE_CANDIDATES:
|
|
|
136
134
|
if MODEL_OUTPUT_PARSE_MODE is None:
|
|
137
135
|
worker_log.info("模型输出将按纯文本发送")
|
|
138
136
|
else:
|
|
139
|
-
|
|
137
|
+
mode_value = (
|
|
138
|
+
MODEL_OUTPUT_PARSE_MODE.value
|
|
139
|
+
if isinstance(MODEL_OUTPUT_PARSE_MODE, ParseMode)
|
|
140
|
+
else str(MODEL_OUTPUT_PARSE_MODE)
|
|
141
|
+
)
|
|
142
|
+
worker_log.info("模型输出 parse_mode:%s", mode_value)
|
|
140
143
|
else:
|
|
141
144
|
MODEL_OUTPUT_PARSE_MODE = ParseMode.MARKDOWN_V2
|
|
142
145
|
worker_log.warning(
|
|
@@ -482,7 +485,6 @@ _ESCAPED_CODE_BLOCK_PATTERN = re.compile(
|
|
|
482
485
|
re.DOTALL
|
|
483
486
|
)
|
|
484
487
|
|
|
485
|
-
|
|
486
488
|
def _is_already_escaped(text: str) -> bool:
|
|
487
489
|
"""检测文本是否已经包含 MarkdownV2 转义字符。
|
|
488
490
|
|
|
@@ -504,8 +506,8 @@ def _is_already_escaped(text: str) -> bool:
|
|
|
504
506
|
|
|
505
507
|
# 对于短文本,放宽检测条件
|
|
506
508
|
if len(text) < 20:
|
|
507
|
-
#
|
|
508
|
-
if len(matches) >=
|
|
509
|
+
# 短文本出现任意转义字符即可认定为已转义,防止重复转义
|
|
510
|
+
if len(matches) >= 1:
|
|
509
511
|
return True
|
|
510
512
|
else:
|
|
511
513
|
# 检查转义字符密度(降低到 3%)
|
|
@@ -534,77 +536,62 @@ def _unescape_markdown_v2(text: str) -> str:
|
|
|
534
536
|
return re.sub(r"\\([_*\[\]()~`>#+=|{}.!:-])", r"\1", text)
|
|
535
537
|
|
|
536
538
|
|
|
537
|
-
def
|
|
538
|
-
"""
|
|
539
|
-
|
|
540
|
-
改进的分段处理策略:
|
|
541
|
-
1. 先识别已转义的代码块(\`\`\`...\`\`\` 和 \`...\`)
|
|
542
|
-
2. 对这些代码块先反转义边界反引号,变成正常代码块
|
|
543
|
-
3. 然后用正常的 CODE_SEGMENT_RE 识别代码块
|
|
544
|
-
4. 只对非代码块的普通文本进行反转义
|
|
545
|
-
5. 代码块内容保持转义状态(因为是代码本身)
|
|
546
|
-
6. 重新组合所有段落
|
|
547
|
-
|
|
548
|
-
Args:
|
|
549
|
-
text: 待处理的文本
|
|
550
|
-
|
|
551
|
-
Returns:
|
|
552
|
-
处理后的文本(如未检测到预转义,返回原文本)
|
|
553
|
-
"""
|
|
539
|
+
def _force_unescape_markdown(text: str) -> str:
|
|
540
|
+
"""强制移除 MarkdownV2 转义,同时保护代码块语法不被破坏。"""
|
|
554
541
|
if not text:
|
|
555
542
|
return text
|
|
556
543
|
|
|
557
|
-
# 快速检测:如果没有任何转义字符,直接返回
|
|
558
|
-
if not _is_already_escaped(text):
|
|
559
|
-
return text
|
|
560
|
-
|
|
561
|
-
# 第一步:处理已转义的代码块,将边界反引号反转义
|
|
562
|
-
# 这样后续可以用正常的 CODE_SEGMENT_RE 识别它们
|
|
563
544
|
processed = text
|
|
564
|
-
|
|
565
|
-
# 先标记所有已转义的代码块,用占位符替换
|
|
566
545
|
code_blocks: list[str] = []
|
|
567
546
|
|
|
568
547
|
def _preserve_code_block(match: re.Match[str]) -> str:
|
|
569
|
-
"""
|
|
548
|
+
"""临时替换代码块,防止内部字符被错误反转义。"""
|
|
570
549
|
block = match.group(0)
|
|
571
|
-
# 代码块边界的反引号需要反转义,但内容保持不变
|
|
572
|
-
# 例如:\`\`\`bash\npython -m vibego\_cli\`\`\`
|
|
573
|
-
# -> ```bash\npython -m vibego\_cli```
|
|
574
550
|
if block.startswith(r"\`\`\`"):
|
|
575
|
-
#
|
|
576
|
-
unescaped_block = block.replace(r"\`", "`", 6)
|
|
551
|
+
# 多行代码块保留内容,只修复边界反引号
|
|
552
|
+
unescaped_block = block.replace(r"\`", "`", 6)
|
|
577
553
|
else:
|
|
578
|
-
#
|
|
579
|
-
unescaped_block = block.replace(r"\`", "`", 2)
|
|
554
|
+
# 单行代码块同理处理首尾反引号
|
|
555
|
+
unescaped_block = block.replace(r"\`", "`", 2)
|
|
580
556
|
|
|
581
557
|
placeholder = f"__CODE_BLOCK_{len(code_blocks)}__"
|
|
582
558
|
code_blocks.append(unescaped_block)
|
|
583
559
|
return placeholder
|
|
584
560
|
|
|
585
561
|
processed = _ESCAPED_CODE_BLOCK_PATTERN.sub(_preserve_code_block, processed)
|
|
562
|
+
processed = _unescape_markdown_v2(processed)
|
|
586
563
|
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
processed = _unescape_markdown_v2(processed)
|
|
590
|
-
|
|
591
|
-
# 第三步:恢复代码块
|
|
592
|
-
for i, block in enumerate(code_blocks):
|
|
593
|
-
placeholder = f"__CODE_BLOCK_{i}__"
|
|
594
|
-
processed = processed.replace(placeholder, block)
|
|
564
|
+
for index, block in enumerate(code_blocks):
|
|
565
|
+
processed = processed.replace(f"__CODE_BLOCK_{index}__", block)
|
|
595
566
|
|
|
596
567
|
return processed
|
|
597
568
|
|
|
598
569
|
|
|
570
|
+
def _unescape_if_already_escaped(text: str) -> str:
|
|
571
|
+
"""智能检测并清理预转义文本,必要时触发强制反转义。"""
|
|
572
|
+
if not text:
|
|
573
|
+
return text
|
|
574
|
+
if not _is_already_escaped(text):
|
|
575
|
+
return text
|
|
576
|
+
return _force_unescape_markdown(text)
|
|
577
|
+
|
|
578
|
+
|
|
599
579
|
def _prepare_model_payload(text: str) -> str:
|
|
600
580
|
if _IS_MARKDOWN_V2:
|
|
601
581
|
cleaned = _unescape_if_already_escaped(text)
|
|
602
|
-
return
|
|
582
|
+
return _escape_markdown_v2(cleaned)
|
|
603
583
|
if _IS_MARKDOWN:
|
|
604
584
|
return _normalize_legacy_markdown(text)
|
|
605
585
|
return text
|
|
606
586
|
|
|
607
587
|
|
|
588
|
+
def _prepare_model_payload_variants(text: str) -> tuple[str, Optional[str]]:
|
|
589
|
+
"""返回首选与备用内容,默认为单一格式。"""
|
|
590
|
+
|
|
591
|
+
payload = _prepare_model_payload(text)
|
|
592
|
+
return payload, None
|
|
593
|
+
|
|
594
|
+
|
|
608
595
|
def _extract_bad_request_message(exc: TelegramBadRequest) -> str:
|
|
609
596
|
message = getattr(exc, "message", None)
|
|
610
597
|
if not message:
|
|
@@ -658,6 +645,7 @@ async def _send_with_markdown_guard(
|
|
|
658
645
|
sender: Callable[[str], Awaitable[None]],
|
|
659
646
|
*,
|
|
660
647
|
raw_sender: Optional[Callable[[str], Awaitable[None]]] = None,
|
|
648
|
+
fallback_payload: Optional[str] = None,
|
|
661
649
|
) -> str:
|
|
662
650
|
try:
|
|
663
651
|
await sender(text)
|
|
@@ -666,6 +654,19 @@ async def _send_with_markdown_guard(
|
|
|
666
654
|
if not _is_markdown_parse_error(exc):
|
|
667
655
|
raise
|
|
668
656
|
|
|
657
|
+
if fallback_payload and fallback_payload != text:
|
|
658
|
+
try:
|
|
659
|
+
await sender(fallback_payload)
|
|
660
|
+
worker_log.debug(
|
|
661
|
+
"Markdown 优化回退为严格转义版本",
|
|
662
|
+
extra={"length": len(fallback_payload)},
|
|
663
|
+
)
|
|
664
|
+
return fallback_payload
|
|
665
|
+
except TelegramBadRequest as fallback_exc:
|
|
666
|
+
if not _is_markdown_parse_error(fallback_exc):
|
|
667
|
+
raise
|
|
668
|
+
exc = fallback_exc
|
|
669
|
+
|
|
669
670
|
sanitized: Optional[str]
|
|
670
671
|
if _IS_MARKDOWN_V2:
|
|
671
672
|
sanitized = _escape_markdown_v2(text)
|
|
@@ -694,20 +695,12 @@ async def _send_with_markdown_guard(
|
|
|
694
695
|
if raw_sender is None:
|
|
695
696
|
raise
|
|
696
697
|
|
|
697
|
-
# Markdown 彻底失败时退回纯文本发送,需要先清理 MarkdownV2 转义符号
|
|
698
|
-
fallback_payload = _unescape_if_already_escaped(text)
|
|
699
|
-
if fallback_payload != text:
|
|
700
|
-
worker_log.debug(
|
|
701
|
-
"Markdown 降级为纯文本发送,已移除转义符号",
|
|
702
|
-
extra={"original_length": len(text), "fallback_length": len(fallback_payload)},
|
|
703
|
-
)
|
|
704
|
-
|
|
705
698
|
worker_log.warning(
|
|
706
699
|
"Markdown 解析仍失败,将以纯文本发送",
|
|
707
700
|
extra={"length": len(text)},
|
|
708
701
|
)
|
|
709
|
-
await raw_sender(
|
|
710
|
-
return
|
|
702
|
+
await raw_sender(text)
|
|
703
|
+
return text
|
|
711
704
|
|
|
712
705
|
|
|
713
706
|
async def _notify_send_failure_message(chat_id: int) -> None:
|
|
@@ -762,7 +755,11 @@ async def reply_large_text(
|
|
|
762
755
|
"""
|
|
763
756
|
bot = current_bot()
|
|
764
757
|
parse_mode_value = parse_mode if parse_mode is not None else _parse_mode_value()
|
|
765
|
-
|
|
758
|
+
if preformatted:
|
|
759
|
+
prepared = text
|
|
760
|
+
fallback_payload = None
|
|
761
|
+
else:
|
|
762
|
+
prepared, fallback_payload = _prepare_model_payload_variants(text)
|
|
766
763
|
|
|
767
764
|
async def _send_formatted_message(payload: str) -> None:
|
|
768
765
|
await bot.send_message(
|
|
@@ -779,6 +776,7 @@ async def reply_large_text(
|
|
|
779
776
|
prepared,
|
|
780
777
|
_send_formatted_message,
|
|
781
778
|
raw_sender=_send_raw_message,
|
|
779
|
+
fallback_payload=fallback_payload,
|
|
782
780
|
)
|
|
783
781
|
|
|
784
782
|
worker_log.info(
|
|
@@ -797,10 +795,12 @@ async def reply_large_text(
|
|
|
797
795
|
f"内容较长,已生成附件 `{attachment_name}`,请下载查看全文。"
|
|
798
796
|
)
|
|
799
797
|
|
|
798
|
+
summary_prepared, summary_fallback = _prepare_model_payload_variants(summary_text)
|
|
800
799
|
delivered_summary = await _send_with_markdown_guard(
|
|
801
|
-
|
|
800
|
+
summary_prepared,
|
|
802
801
|
_send_formatted_message,
|
|
803
802
|
raw_sender=_send_raw_message,
|
|
803
|
+
fallback_payload=summary_fallback,
|
|
804
804
|
)
|
|
805
805
|
|
|
806
806
|
document = BufferedInputFile(text.encode("utf-8"), filename=attachment_name)
|
|
@@ -1514,7 +1514,7 @@ async def _broadcast_worker_keyboard(bot: Bot) -> None:
|
|
|
1514
1514
|
continue
|
|
1515
1515
|
|
|
1516
1516
|
parse_mode = _parse_mode_value()
|
|
1517
|
-
prepared =
|
|
1517
|
+
prepared, fallback_payload = _prepare_model_payload_variants(text)
|
|
1518
1518
|
|
|
1519
1519
|
async def _send_formatted(payload: str) -> None:
|
|
1520
1520
|
await bot.send_message(
|
|
@@ -1537,6 +1537,7 @@ async def _broadcast_worker_keyboard(bot: Bot) -> None:
|
|
|
1537
1537
|
prepared,
|
|
1538
1538
|
_send_formatted,
|
|
1539
1539
|
raw_sender=_send_raw,
|
|
1540
|
+
fallback_payload=fallback_payload,
|
|
1540
1541
|
)
|
|
1541
1542
|
except TelegramForbiddenError as exc:
|
|
1542
1543
|
worker_log.warning("推送任务列表被拒绝:%s", exc, extra={**_session_extra(), "chat": chat_id})
|
|
@@ -2620,7 +2621,7 @@ def _build_status_buttons(task_id: str, current_status: str) -> list[list[Inline
|
|
|
2620
2621
|
for status in STATUS_DISPLAY_ORDER:
|
|
2621
2622
|
text = _format_status(status)
|
|
2622
2623
|
if status == current_status:
|
|
2623
|
-
text = f"
|
|
2624
|
+
text = f"{text} (当前)"
|
|
2624
2625
|
row.append(
|
|
2625
2626
|
InlineKeyboardButton(
|
|
2626
2627
|
text=text,
|
|
@@ -2794,13 +2795,32 @@ async def _answer_with_markdown(
|
|
|
2794
2795
|
*,
|
|
2795
2796
|
reply_markup: InlineKeyboardMarkup | ReplyKeyboardMarkup | None = None,
|
|
2796
2797
|
) -> Optional[Message]:
|
|
2797
|
-
prepared =
|
|
2798
|
-
|
|
2799
|
-
|
|
2800
|
-
|
|
2798
|
+
prepared, fallback_payload = _prepare_model_payload_variants(text)
|
|
2799
|
+
sent_message: Optional[Message] = None
|
|
2800
|
+
|
|
2801
|
+
async def _send(payload: str) -> None:
|
|
2802
|
+
nonlocal sent_message
|
|
2803
|
+
sent_message = await message.answer(
|
|
2804
|
+
payload,
|
|
2801
2805
|
parse_mode=_parse_mode_value(),
|
|
2802
2806
|
reply_markup=reply_markup,
|
|
2803
2807
|
)
|
|
2808
|
+
|
|
2809
|
+
async def _send_raw(payload: str) -> None:
|
|
2810
|
+
nonlocal sent_message
|
|
2811
|
+
sent_message = await message.answer(
|
|
2812
|
+
payload,
|
|
2813
|
+
parse_mode=None,
|
|
2814
|
+
reply_markup=reply_markup,
|
|
2815
|
+
)
|
|
2816
|
+
|
|
2817
|
+
try:
|
|
2818
|
+
await _send_with_markdown_guard(
|
|
2819
|
+
prepared,
|
|
2820
|
+
_send,
|
|
2821
|
+
raw_sender=_send_raw,
|
|
2822
|
+
fallback_payload=fallback_payload,
|
|
2823
|
+
)
|
|
2804
2824
|
except TelegramBadRequest as exc:
|
|
2805
2825
|
worker_log.warning(
|
|
2806
2826
|
"发送消息失败:%s",
|
|
@@ -2808,7 +2828,7 @@ async def _answer_with_markdown(
|
|
|
2808
2828
|
extra={"chat": getattr(message.chat, "id", None)},
|
|
2809
2829
|
)
|
|
2810
2830
|
return None
|
|
2811
|
-
return
|
|
2831
|
+
return sent_message
|
|
2812
2832
|
|
|
2813
2833
|
|
|
2814
2834
|
async def _edit_message_with_markdown(
|
|
@@ -2817,11 +2837,27 @@ async def _edit_message_with_markdown(
|
|
|
2817
2837
|
*,
|
|
2818
2838
|
reply_markup: InlineKeyboardMarkup | None = None,
|
|
2819
2839
|
) -> None:
|
|
2820
|
-
prepared =
|
|
2821
|
-
|
|
2840
|
+
prepared, fallback_payload = _prepare_model_payload_variants(text)
|
|
2841
|
+
|
|
2842
|
+
async def _send(payload: str) -> None:
|
|
2843
|
+
await callback.message.edit_text(
|
|
2844
|
+
payload,
|
|
2845
|
+
parse_mode=_parse_mode_value(),
|
|
2846
|
+
reply_markup=reply_markup,
|
|
2847
|
+
)
|
|
2848
|
+
|
|
2849
|
+
async def _send_raw(payload: str) -> None:
|
|
2850
|
+
await callback.message.edit_text(
|
|
2851
|
+
payload,
|
|
2852
|
+
parse_mode=None,
|
|
2853
|
+
reply_markup=reply_markup,
|
|
2854
|
+
)
|
|
2855
|
+
|
|
2856
|
+
await _send_with_markdown_guard(
|
|
2822
2857
|
prepared,
|
|
2823
|
-
|
|
2824
|
-
|
|
2858
|
+
_send,
|
|
2859
|
+
raw_sender=_send_raw,
|
|
2860
|
+
fallback_payload=fallback_payload,
|
|
2825
2861
|
)
|
|
2826
2862
|
|
|
2827
2863
|
|
|
@@ -2833,13 +2869,29 @@ async def _try_edit_message(
|
|
|
2833
2869
|
) -> bool:
|
|
2834
2870
|
if message is None:
|
|
2835
2871
|
return False
|
|
2836
|
-
prepared =
|
|
2837
|
-
|
|
2872
|
+
prepared, fallback_payload = _prepare_model_payload_variants(text)
|
|
2873
|
+
|
|
2874
|
+
async def _send(payload: str) -> None:
|
|
2838
2875
|
await message.edit_text(
|
|
2839
|
-
|
|
2876
|
+
payload,
|
|
2840
2877
|
parse_mode=_parse_mode_value(),
|
|
2841
2878
|
reply_markup=reply_markup,
|
|
2842
2879
|
)
|
|
2880
|
+
|
|
2881
|
+
async def _send_raw(payload: str) -> None:
|
|
2882
|
+
await message.edit_text(
|
|
2883
|
+
payload,
|
|
2884
|
+
parse_mode=None,
|
|
2885
|
+
reply_markup=reply_markup,
|
|
2886
|
+
)
|
|
2887
|
+
|
|
2888
|
+
try:
|
|
2889
|
+
await _send_with_markdown_guard(
|
|
2890
|
+
prepared,
|
|
2891
|
+
_send,
|
|
2892
|
+
raw_sender=_send_raw,
|
|
2893
|
+
fallback_payload=fallback_payload,
|
|
2894
|
+
)
|
|
2843
2895
|
return True
|
|
2844
2896
|
except TelegramBadRequest as exc:
|
|
2845
2897
|
worker_log.info(
|
|
@@ -4197,6 +4249,7 @@ async def _deliver_pending_messages(
|
|
|
4197
4249
|
"chat": chat_id,
|
|
4198
4250
|
},
|
|
4199
4251
|
)
|
|
4252
|
+
return False
|
|
4200
4253
|
else:
|
|
4201
4254
|
worker_log.info(
|
|
4202
4255
|
"模型输出已发送且计划完成",
|
|
@@ -4523,7 +4576,13 @@ async def _interrupt_long_poll(chat_id: int) -> None:
|
|
|
4523
4576
|
线程安全:使用 asyncio.Lock 保护状态访问。
|
|
4524
4577
|
"""
|
|
4525
4578
|
if CHAT_LONG_POLL_LOCK is None:
|
|
4526
|
-
|
|
4579
|
+
state = CHAT_LONG_POLL_STATE.get(chat_id)
|
|
4580
|
+
if state is not None:
|
|
4581
|
+
state["interrupted"] = True
|
|
4582
|
+
worker_log.info(
|
|
4583
|
+
"标记延迟轮询为待中断",
|
|
4584
|
+
extra={"chat": chat_id},
|
|
4585
|
+
)
|
|
4527
4586
|
return
|
|
4528
4587
|
|
|
4529
4588
|
async with CHAT_LONG_POLL_LOCK:
|
|
@@ -4616,6 +4675,13 @@ async def _watch_and_notify(chat_id: int, session_path: Path,
|
|
|
4616
4675
|
"max_rounds": long_poll_max_rounds,
|
|
4617
4676
|
"interrupted": False,
|
|
4618
4677
|
}
|
|
4678
|
+
else:
|
|
4679
|
+
CHAT_LONG_POLL_STATE[chat_id] = {
|
|
4680
|
+
"active": True,
|
|
4681
|
+
"round": 0,
|
|
4682
|
+
"max_rounds": long_poll_max_rounds,
|
|
4683
|
+
"interrupted": False,
|
|
4684
|
+
}
|
|
4619
4685
|
worker_log.info(
|
|
4620
4686
|
"首次发送成功,启动延迟轮询模式",
|
|
4621
4687
|
extra={
|
|
@@ -4637,6 +4703,10 @@ async def _watch_and_notify(chat_id: int, session_path: Path,
|
|
|
4637
4703
|
state = CHAT_LONG_POLL_STATE.get(chat_id)
|
|
4638
4704
|
if state is not None:
|
|
4639
4705
|
state["round"] = 0
|
|
4706
|
+
else:
|
|
4707
|
+
state = CHAT_LONG_POLL_STATE.get(chat_id)
|
|
4708
|
+
if state is not None:
|
|
4709
|
+
state["round"] = 0
|
|
4640
4710
|
worker_log.info(
|
|
4641
4711
|
"延迟轮询中收到新消息,重置计数",
|
|
4642
4712
|
extra={
|
|
@@ -4652,6 +4722,10 @@ async def _watch_and_notify(chat_id: int, session_path: Path,
|
|
|
4652
4722
|
state = CHAT_LONG_POLL_STATE.get(chat_id)
|
|
4653
4723
|
if state is not None:
|
|
4654
4724
|
state["round"] = long_poll_rounds
|
|
4725
|
+
else:
|
|
4726
|
+
state = CHAT_LONG_POLL_STATE.get(chat_id)
|
|
4727
|
+
if state is not None:
|
|
4728
|
+
state["round"] = long_poll_rounds
|
|
4655
4729
|
|
|
4656
4730
|
if long_poll_rounds >= long_poll_max_rounds:
|
|
4657
4731
|
worker_log.info(
|
|
@@ -4688,6 +4762,13 @@ async def _watch_and_notify(chat_id: int, session_path: Path,
|
|
|
4688
4762
|
"监听任务退出,已清理延迟轮询状态",
|
|
4689
4763
|
extra={"chat": chat_id},
|
|
4690
4764
|
)
|
|
4765
|
+
else:
|
|
4766
|
+
if chat_id in CHAT_LONG_POLL_STATE:
|
|
4767
|
+
CHAT_LONG_POLL_STATE.pop(chat_id, None)
|
|
4768
|
+
worker_log.debug(
|
|
4769
|
+
"监听任务退出,已清理延迟轮询状态",
|
|
4770
|
+
extra={"chat": chat_id},
|
|
4771
|
+
)
|
|
4691
4772
|
|
|
4692
4773
|
|
|
4693
4774
|
def _read_pointer_path(pointer: Path) -> Optional[Path]:
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "vibego"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.42"
|
|
8
8
|
description = "vibego CLI:用于初始化与管理 Telegram Master Bot 的工具"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -35,14 +35,14 @@ include-package-data = true
|
|
|
35
35
|
py-modules = ["bot", "master", "logging_setup", "project_repository"]
|
|
36
36
|
|
|
37
37
|
[tool.setuptools.packages.find]
|
|
38
|
-
include = ["vibego_cli", "tasks", "scripts"
|
|
38
|
+
include = ["vibego_cli", "tasks", "scripts"]
|
|
39
39
|
|
|
40
40
|
[tool.setuptools.package-data]
|
|
41
41
|
"vibego_cli" = ["data/*.txt"]
|
|
42
42
|
"scripts" = ["*.sh", "models/*.sh"]
|
|
43
43
|
|
|
44
44
|
[tool.bumpversion]
|
|
45
|
-
current_version = "0.2.
|
|
45
|
+
current_version = "0.2.42"
|
|
46
46
|
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
|
|
47
47
|
serialize = ["{major}.{minor}.{patch}"]
|
|
48
48
|
search = "{current_version}"
|
|
@@ -50,11 +50,13 @@ def reset_global_state():
|
|
|
50
50
|
bot.SESSION_OFFSETS.clear()
|
|
51
51
|
bot.CHAT_DELIVERED_HASHES.clear()
|
|
52
52
|
bot.CHAT_DELIVERED_OFFSETS.clear()
|
|
53
|
+
bot.CHAT_LONG_POLL_LOCK = None
|
|
53
54
|
yield
|
|
54
55
|
bot.CHAT_LONG_POLL_STATE.clear()
|
|
55
56
|
bot.SESSION_OFFSETS.clear()
|
|
56
57
|
bot.CHAT_DELIVERED_HASHES.clear()
|
|
57
58
|
bot.CHAT_DELIVERED_OFFSETS.clear()
|
|
59
|
+
bot.CHAT_LONG_POLL_LOCK = None
|
|
58
60
|
|
|
59
61
|
|
|
60
62
|
# ============================================================================
|
|
@@ -72,7 +74,7 @@ def test_interrupt_long_poll_sets_flag():
|
|
|
72
74
|
"interrupted": False,
|
|
73
75
|
}
|
|
74
76
|
|
|
75
|
-
bot._interrupt_long_poll(chat_id)
|
|
77
|
+
asyncio.run(bot._interrupt_long_poll(chat_id))
|
|
76
78
|
|
|
77
79
|
assert bot.CHAT_LONG_POLL_STATE[chat_id]["interrupted"] is True
|
|
78
80
|
|
|
@@ -84,7 +86,7 @@ def test_interrupt_long_poll_no_state():
|
|
|
84
86
|
bot.CHAT_LONG_POLL_STATE.pop(chat_id, None)
|
|
85
87
|
|
|
86
88
|
# 不应抛出异常
|
|
87
|
-
bot._interrupt_long_poll(chat_id)
|
|
89
|
+
asyncio.run(bot._interrupt_long_poll(chat_id))
|
|
88
90
|
|
|
89
91
|
|
|
90
92
|
# ============================================================================
|
|
@@ -126,7 +128,7 @@ async def test_watch_and_notify_enters_long_poll_after_first_delivery(mock_sessi
|
|
|
126
128
|
chat_id = 12345
|
|
127
129
|
delivery_count = 0
|
|
128
130
|
|
|
129
|
-
async def mock_deliver(cid, path):
|
|
131
|
+
async def mock_deliver(cid, path, **kwargs):
|
|
130
132
|
nonlocal delivery_count
|
|
131
133
|
delivery_count += 1
|
|
132
134
|
# 第一次返回 True(首次发送成功)
|
|
@@ -151,10 +153,10 @@ async def test_watch_and_notify_enters_long_poll_after_first_delivery(mock_sessi
|
|
|
151
153
|
assert chat_id in bot.CHAT_LONG_POLL_STATE
|
|
152
154
|
assert bot.CHAT_LONG_POLL_STATE[chat_id]["active"] is True
|
|
153
155
|
assert bot.CHAT_LONG_POLL_STATE[chat_id]["round"] == 0
|
|
154
|
-
assert bot.CHAT_LONG_POLL_STATE[chat_id]["max_rounds"] ==
|
|
156
|
+
assert bot.CHAT_LONG_POLL_STATE[chat_id]["max_rounds"] == 600
|
|
155
157
|
|
|
156
158
|
# 中断任务(避免等待 3 分钟)
|
|
157
|
-
bot._interrupt_long_poll(chat_id)
|
|
159
|
+
await bot._interrupt_long_poll(chat_id)
|
|
158
160
|
await asyncio.sleep(0.1)
|
|
159
161
|
|
|
160
162
|
# 取消任务
|
|
@@ -173,7 +175,7 @@ async def test_watch_and_notify_long_poll_increments_round(mock_session_path):
|
|
|
173
175
|
chat_id = 12345
|
|
174
176
|
delivery_count = 0
|
|
175
177
|
|
|
176
|
-
async def mock_deliver(cid, path):
|
|
178
|
+
async def mock_deliver(cid, path, **kwargs):
|
|
177
179
|
nonlocal delivery_count
|
|
178
180
|
delivery_count += 1
|
|
179
181
|
# 第一次返回 True,之后返回 False
|
|
@@ -204,7 +206,7 @@ async def test_watch_and_notify_long_poll_increments_round(mock_session_path):
|
|
|
204
206
|
await asyncio.sleep(0.3)
|
|
205
207
|
|
|
206
208
|
# 中断并清理
|
|
207
|
-
bot._interrupt_long_poll(chat_id)
|
|
209
|
+
await bot._interrupt_long_poll(chat_id)
|
|
208
210
|
await asyncio.sleep(0.1)
|
|
209
211
|
task.cancel()
|
|
210
212
|
try:
|
|
@@ -221,7 +223,7 @@ async def test_watch_and_notify_interrupted_by_new_message(mock_session_path):
|
|
|
221
223
|
chat_id = 12345
|
|
222
224
|
delivery_count = 0
|
|
223
225
|
|
|
224
|
-
async def mock_deliver(cid, path):
|
|
226
|
+
async def mock_deliver(cid, path, **kwargs):
|
|
225
227
|
nonlocal delivery_count
|
|
226
228
|
delivery_count += 1
|
|
227
229
|
return delivery_count == 1 # 只第一次返回 True
|
|
@@ -241,7 +243,7 @@ async def test_watch_and_notify_interrupted_by_new_message(mock_session_path):
|
|
|
241
243
|
assert chat_id in bot.CHAT_LONG_POLL_STATE
|
|
242
244
|
|
|
243
245
|
# 模拟新消息到达,中断轮询
|
|
244
|
-
bot._interrupt_long_poll(chat_id)
|
|
246
|
+
await bot._interrupt_long_poll(chat_id)
|
|
245
247
|
|
|
246
248
|
# 等待任务检测到中断标志并退出
|
|
247
249
|
await asyncio.sleep(0.2)
|
|
@@ -267,7 +269,7 @@ async def test_watch_and_notify_long_poll_resets_on_new_delivery(mock_session_pa
|
|
|
267
269
|
delivery_sequence = [True, False, False, True, False] # 第 1 和第 4 次有消息
|
|
268
270
|
delivery_index = 0
|
|
269
271
|
|
|
270
|
-
async def mock_deliver(cid, path):
|
|
272
|
+
async def mock_deliver(cid, path, **kwargs):
|
|
271
273
|
nonlocal delivery_index
|
|
272
274
|
result = delivery_sequence[delivery_index] if delivery_index < len(delivery_sequence) else False
|
|
273
275
|
delivery_index += 1
|
|
@@ -291,7 +293,7 @@ async def test_watch_and_notify_long_poll_resets_on_new_delivery(mock_session_pa
|
|
|
291
293
|
await asyncio.sleep(0.25)
|
|
292
294
|
|
|
293
295
|
# 中断并清理
|
|
294
|
-
bot._interrupt_long_poll(chat_id)
|
|
296
|
+
await bot._interrupt_long_poll(chat_id)
|
|
295
297
|
await asyncio.sleep(0.1)
|
|
296
298
|
task.cancel()
|
|
297
299
|
try:
|
|
@@ -316,11 +318,11 @@ def test_interrupt_long_poll_idempotent():
|
|
|
316
318
|
}
|
|
317
319
|
|
|
318
320
|
# 第一次调用
|
|
319
|
-
bot._interrupt_long_poll(chat_id)
|
|
321
|
+
asyncio.run(bot._interrupt_long_poll(chat_id))
|
|
320
322
|
assert bot.CHAT_LONG_POLL_STATE[chat_id]["interrupted"] is True
|
|
321
323
|
|
|
322
324
|
# 第二次调用(应该仍然是 True,不报错)
|
|
323
|
-
bot._interrupt_long_poll(chat_id)
|
|
325
|
+
asyncio.run(bot._interrupt_long_poll(chat_id))
|
|
324
326
|
assert bot.CHAT_LONG_POLL_STATE[chat_id]["interrupted"] is True
|
|
325
327
|
|
|
326
328
|
|
|
@@ -335,7 +337,7 @@ async def test_watch_and_notify_max_rounds_limit(mock_session_path):
|
|
|
335
337
|
chat_id = 12345
|
|
336
338
|
|
|
337
339
|
# 修改最大轮询次数为 2(便于测试)
|
|
338
|
-
async def mock_deliver(cid, path):
|
|
340
|
+
async def mock_deliver(cid, path, **kwargs):
|
|
339
341
|
# 只在第一次返回 True,进入延迟轮询
|
|
340
342
|
# 后续返回 False,让轮询计数递增
|
|
341
343
|
if not hasattr(mock_deliver, "called"):
|
|
@@ -362,7 +364,7 @@ async def test_watch_and_notify_does_not_block_event_loop(mock_session_path):
|
|
|
362
364
|
"""
|
|
363
365
|
chat_id = 12345
|
|
364
366
|
|
|
365
|
-
async def mock_deliver(cid, path):
|
|
367
|
+
async def mock_deliver(cid, path, **kwargs):
|
|
366
368
|
return False
|
|
367
369
|
|
|
368
370
|
with patch.object(bot, "_deliver_pending_messages", side_effect=mock_deliver):
|
|
@@ -397,3 +399,4 @@ async def test_watch_and_notify_does_not_block_event_loop(mock_session_path):
|
|
|
397
399
|
await task
|
|
398
400
|
except asyncio.CancelledError:
|
|
399
401
|
pass
|
|
402
|
+
import asyncio
|