cecli-dev 0.100.5__tar.gz → 0.100.6rc2__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.
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/PKG-INFO +1 -1
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/_version.py +3 -3
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/args.py +4 -1
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/args_formatter.py +10 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/agent_coder.py +1 -1
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/base_coder.py +48 -3
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/core.py +2 -2
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/conversation/files.py +6 -3
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/coroutines.py +3 -1
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/hashline.py +26 -109
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/hashpos/hashpos.py +4 -6
- cecli_dev-0.100.6rc2/cecli/helpers/threading.py +46 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/io.py +2 -1
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/linter.py +2 -1
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/mcp/server.py +26 -6
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/agent.yml +2 -2
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/hashline.yml +1 -1
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/_yield.py +2 -1
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/edit_text.py +7 -7
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/grep.py +4 -14
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/read_range.py +141 -83
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/validations/validations.py +103 -11
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli_dev.egg-info/PKG-INFO +1 -1
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli_dev.egg-info/SOURCES.txt +2 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/test_get_lines.py +10 -10
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/test_insert_block.py +1 -1
- cecli_dev-0.100.6rc2/tests/tools/test_read_range_execute.py +554 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/validations.py +206 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.dockerignore +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.flake8 +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.gitattributes +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/ISSUE_TEMPLATE/issue.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/check_pypi_version.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/docker-build-test.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/docker-release.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/issues.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/pages.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/pre-commit.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/release.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/ubuntu-tests.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/windows-tests.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/windows_check_pypi_version.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.gitignore +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.pre-commit-config.yaml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/CHANGELOG.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/CNAME +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/CONTRIBUTING.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/HISTORY.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/LICENSE.txt +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/MANIFEST.in +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/README.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/Dockerfile +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/README.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/benchmark.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/benchmark_classic.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/clone-exercism.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/cpp-test.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/docker.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/docker_build.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/install-docker-ubuntu.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/npm-test.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/over_time.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/plot.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/plots.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/problem_stats.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/prompts.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/refactor_tools.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/rsync.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/rungrid.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/swe-bench-lite.txt +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/swe-bench.txt +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/swe_bench.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/test_benchmark.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/variations.1.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/variations.2.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/variations.3.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/variations.4.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/__main__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/change_tracker.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/architect_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/ask_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/chat_chunks.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/context_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/copypaste_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/editblock_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/editblock_fenced_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/editblock_func_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/editor_diff_fenced_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/editor_editblock_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/editor_whole_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/hashline_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/help_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/patch_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/search_replace.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/shell.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/single_wholefile_func_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/sub_agent_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/udiff_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/udiff_simple.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/wholefile_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/wholefile_func_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/add.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/agent.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/agent_model.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/architect.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/ask.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/chat_mode.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/clear.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/code.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/command_prefix.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/commit.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/compact.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/context.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/context_blocks.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/context_management.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/copy.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/copy_context.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/diff.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/drop.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/editor.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/editor_model.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/exclude_skill.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/exit.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/git.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/hashline.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/help.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/history_search.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/hooks.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/include_skill.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/lint.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/list_sessions.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/list_skills.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/load.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/load_hook.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/load_mcp.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/load_session.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/load_skill.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/ls.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/map.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/map_refresh.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/merge.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/model.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/models.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/multiline_mode.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/paste.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/quit.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/read_only.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/read_only_stub.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/reap_agent.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/reasoning_effort.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/remove_hook.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/remove_mcp.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/remove_skill.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/report.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/reset.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/rules.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/run.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/save.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/save_session.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/settings.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/spawn_agent.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/switch_agent.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/terminal_data/linux.keytab +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/terminal_setup.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/test.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/think_tokens.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/tokens.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/undo.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/utils/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/utils/base_command.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/utils/helpers.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/utils/registry.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/utils/save_load_manager.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/voice.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/weak_model.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/web.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/workspace.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/deprecated_args.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/diffs.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/dump.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/editor.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/exceptions.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/format_settings.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/help.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/help_pats.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/agents/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/agents/config.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/agents/service.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/background_commands.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/command_parser.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/conversation/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/conversation/base_message.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/conversation/integration.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/conversation/manager.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/conversation/service.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/conversation/tags.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/conversation/utils.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/copypaste.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/crypto.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/file_searcher.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/file_system/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/file_system/builders.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/file_system/ignore.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/file_system/ngram_index.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/file_system/service.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/file_system/trie_index.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/grep_ast/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/grep_ast/dump.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/grep_ast/grep_ast.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/grep_ast/main.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/grep_ast/parsers.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/grep_ast/tsl.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/hashpos/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/hashpos/hashpos.v1.bak +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/io_proxy.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/leak_detect.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/model_providers.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/monorepo/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/monorepo/config.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/monorepo/local_workspace.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/monorepo/project.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/monorepo/workspace.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/monorepo/worktree.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/nested.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/observations/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/observations/service.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/plugin_manager.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/profiler.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/requests.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/responses.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/similarity.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/skills.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/history.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/hooks/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/hooks/base.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/hooks/integration.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/hooks/manager.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/hooks/registry.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/hooks/service.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/hooks/types.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/interruptible_input.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/llm.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/main.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/mcp/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/mcp/manager.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/mcp/oauth.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/mcp/utils.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/mdstream.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/models.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/onboarding.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/architect.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/ask.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/base.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/context.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/copypaste.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/editblock.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/editblock_fenced.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/editblock_func.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/editor_diff_fenced.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/editor_editblock.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/editor_whole.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/help.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/patch.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/single_wholefile_func.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/subagent.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/udiff.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/udiff_simple.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/utils/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/utils/registry.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/utils/system.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/wholefile.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/wholefile_func.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/README.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/bash-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/c-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/clojure-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/d-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/go-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/java-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/matlab-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/ocaml-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/ocaml_interface-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/python-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/r-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/README.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/bash-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/c-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/cpp-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/dart-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/elisp-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/elixir-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/elm-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/fortran-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/go-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/haskell-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/hcl-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/java-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/javascript-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/julia-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/matlab-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/ocaml_interface-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/php-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/python-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/ql-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/ruby-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/rust-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/scala-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/typescript-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/zig-tags.scm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/reasoning_tags.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/repo.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/repomap.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/report.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/resources/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/resources/model-metadata.json +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/resources/model-settings.yml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/resources/providers.json +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/run_cmd.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/scrape.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/sendchat.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/sessions.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/special.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/command.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/command_interactive.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/context_manager.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/delegate.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/explore_code.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/git_branch.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/git_diff.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/git_log.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/git_remote.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/git_show.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/git_status.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/load_skill.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/ls.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/remove_skill.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/thinking.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/undo_change.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/update_todo_list.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/utils/base_tool.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/utils/helpers.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/utils/output.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/utils/registry.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/validations/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/app.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/io.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/styles.tcss +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/completion_bar.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/file_list.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/footer.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/input_area.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/input_container.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/key_hints.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/output.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/status_bar.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/subagent_pills.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/worker.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/urls.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/utils.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/versioncheck.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/voice.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/waiting.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/watch.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/watch_prompts.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/Gemfile +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/blame.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/get-started.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/help-tip.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/help.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/install.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/keys.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/model-warnings.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/multi-line.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/python-m-aider.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/recording.css +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/recording.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/works-best.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_features.scss +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_footer.scss +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_hero.scss +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_info.scss +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_layout.scss +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_reset.scss +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_testimonials.scss +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_typography.scss +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_variables.scss +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/custom/custom.scss +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/global-overrides.scss +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/adv-model-settings.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/agent-mode.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/aider_conf.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/api-keys.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/custom-commands.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/custom-system-prompts.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/dotenv.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/editor.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/hooks.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/mcp.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/model-aliases.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/model-configuration.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/options.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/reasoning.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/security.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/skills.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/subagents.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/tui.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/workspaces.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/faq.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/git.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/index.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/install/docker.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/install/optional.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/install.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/languages.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/legal/contributor-agreement.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/legal/privacy.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/anthropic.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/azure.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/bedrock.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/cohere.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/deepseek.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/gemini.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/github.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/groq.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/lm-studio.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/ollama.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/openai-compat.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/openai.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/openrouter.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/other.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/vertex.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/warnings.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/xai.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/more/analytics.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/more/edit-formats.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/more/infinite-output.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/more-info.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/repomap.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/scripting.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/troubleshooting/cecli-not-found.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/troubleshooting/edit-errors.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/troubleshooting/imports.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/troubleshooting/models-and-keys.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/troubleshooting/support.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/troubleshooting/token-limits.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/troubleshooting/warnings.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/troubleshooting.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/commands.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/conventions.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/copypaste.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/images-urls.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/lint-test.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/modes.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/not-code.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/notifications.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/sessions.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/tips.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/voice.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/watch.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/share/index.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli_dev.egg-info/dependency_links.txt +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli_dev.egg-info/entry_points.txt +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli_dev.egg-info/requires.txt +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli_dev.egg-info/top_level.txt +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/docker/Dockerfile +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/docker/Dockerfile.local.nvidia.cuda.ubuntu +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/pyproject.toml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/pytest.ini +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/common-constraints.txt +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/requirements-dev.in +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/requirements-dev.txt +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/requirements-help.in +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/requirements-help.txt +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/requirements-playwright.in +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/requirements-playwright.txt +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/requirements.in +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/tree-sitter.in +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements.txt +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/30k-image.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/Dockerfile.jekyll +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/blame.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/clean_metadata.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/cost_analyzer.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/cost_calculator.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/dl_icons.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/filter-chat-mode.js +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/generate_providers.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/get_contributor_list.js +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/get_hashline.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/history_prompts.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/homepage.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/issues.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/jekyll_build.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/jekyll_run.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/logo_svg.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/pip-compile.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/recording_audio.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/redact-cast.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/rename_to_cecli.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/tmux_record.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/tsl_pack_langs.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/update-blame.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/update-docs.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/update-history.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/versionbump.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/yank-old-versions.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/setup.cfg +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/shim.pyproject.toml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/conftest.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_aws_credentials.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_background_commands.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_commands.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_custom_commands.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_deprecated.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_editblock.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_editor.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_exceptions.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_find_or_blocks.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_hashline.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_history.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_io.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_linter.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_main.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_model_info_manager.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_model_provider_manager.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_models.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_onboarding.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_plugin_manager.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_prompts.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_reasoning.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_repo.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_repomap.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_run_cmd.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_sanity_check_repo.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_scripting.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_sendchat.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_session_args.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_session_crypto.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_sessions.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_sessions_manager.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_skills.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_special.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_ssl_verification.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_udiff.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_urls.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_voice.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_watch.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_wholefile.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/coders/test_coder_switching.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/coders/test_copypaste_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/commands/test_compaction.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/commands/test_switch_agent.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/conftest.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/conversations/test_conversation_integration.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/conversations/test_conversation_system.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/chat-history-search-replace-gold.txt +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/chat-history.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/arduino/test.ino +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/bash/test.sh +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/c/test.c +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/chatito/test.chatito +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/clojure/test.clj +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/commonlisp/test.lisp +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/cpp/test.cpp +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/csharp/test.cs +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/d/test.d +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/dart/test.dart +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/elisp/test.el +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/elixir/test.ex +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/elm/test.elm +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/gleam/test.gleam +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/go/test.go +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/haskell/test.hs +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/hcl/test.tf +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/java/test.java +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/javascript/test.js +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/kotlin/test.kt +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/lua/test.lua +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/matlab/test.m +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/ocaml/test.ml +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/ocaml_interface/test.mli +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/php/test.php +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/pony/test.pony +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/properties/test.properties +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/python/test.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/ql/test.ql +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/r/test.r +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/racket/test.rkt +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/ruby/test.rb +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/rust/test.rs +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/scala/test.scala +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/solidity/test.sol +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/swift/test.swift +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/tsx/test.tsx +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/typescript/test.ts +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/udev/test.rules +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/zig/test.zig +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/sample-code-base/sample.js +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/sample-code-base/sample.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/sample-code-base-repo-map.txt +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/watch.js +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/watch.lisp +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/watch.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/watch_question.js +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/help/test_help.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/helpers/monorepo/LOCAL_WORKSPACE.md +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/helpers/monorepo/test_config.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/helpers/monorepo/test_config_active.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/helpers/monorepo/test_ignore_logic.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/helpers/monorepo/test_local_workspace.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/helpers/monorepo/test_repomap_workspace.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/helpers/monorepo/test_workspace.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/helpers/observations/test_observation_service.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/hooks/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/hooks/test_base.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/hooks/test_manager.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/hooks/test_registry.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/mcp/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/mcp/test_manager.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/scrape/test_playwright_disable.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/scrape/test_scrape.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/__init__.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/conftest.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/test_commands.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/test_config.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/test_delegate.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/test_finished.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/test_io_proxy.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/test_service.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/test_sub_agent_coder.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/test_extractions.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/test_git_branch.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/test_git_diff.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/test_grep.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/test_registry.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/test_tool_arguments.py +0 -0
- {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tui/test_app.py +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.100.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 100,
|
|
21
|
+
__version__ = version = '0.100.6rc2'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 100, 6, 'rc2')
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'g2be4b1f66'
|
|
@@ -276,7 +276,10 @@ def get_parser(default_config_files, git_root):
|
|
|
276
276
|
group.add_argument(
|
|
277
277
|
"--retries",
|
|
278
278
|
metavar="RETRIES_JSON",
|
|
279
|
-
help=
|
|
279
|
+
help=(
|
|
280
|
+
'Specify LLM retry configuration as a JSON/YAML string (e.g., \'{"retry_on_empty": '
|
|
281
|
+
"true}')"
|
|
282
|
+
),
|
|
280
283
|
default=None,
|
|
281
284
|
)
|
|
282
285
|
|
|
@@ -132,6 +132,16 @@ class YamlHelpFormatter(argparse.HelpFormatter):
|
|
|
132
132
|
break
|
|
133
133
|
switch = switch.lstrip("-")
|
|
134
134
|
|
|
135
|
+
if switch == "retries":
|
|
136
|
+
parts.append(f"## {action.help}")
|
|
137
|
+
parts.append("#retries:")
|
|
138
|
+
parts.append("# retry-timeout: 60")
|
|
139
|
+
parts.append("# retry-backoff-factor: 2.0")
|
|
140
|
+
parts.append("# retry-on-unavailable: true")
|
|
141
|
+
parts.append("# retry-on-empty: false")
|
|
142
|
+
parts.append("")
|
|
143
|
+
return "\n".join(parts)
|
|
144
|
+
|
|
135
145
|
if isinstance(action, argparse._StoreTrueAction):
|
|
136
146
|
default = False
|
|
137
147
|
elif isinstance(action, argparse._StoreConstAction):
|
|
@@ -1115,7 +1115,7 @@ class AgentCoder(Coder):
|
|
|
1115
1115
|
context_parts.append("## File Editing Tools Disabled")
|
|
1116
1116
|
context_parts.append(
|
|
1117
1117
|
"File editing tools are currently disabled. Use `ReadRange` to determine the"
|
|
1118
|
-
" current content
|
|
1118
|
+
" current content ID prefixes needed to perform an edit and activate them when"
|
|
1119
1119
|
" you are ready to edit a file."
|
|
1120
1120
|
)
|
|
1121
1121
|
|
|
@@ -46,6 +46,7 @@ from cecli.helpers.file_system import FileSystemService
|
|
|
46
46
|
from cecli.helpers.io_proxy import IOProxy
|
|
47
47
|
from cecli.helpers.observations.service import ObservationService
|
|
48
48
|
from cecli.helpers.profiler import TokenProfiler
|
|
49
|
+
from cecli.helpers.threading import ThreadSafeEvent
|
|
49
50
|
from cecli.history import ChatSummary
|
|
50
51
|
from cecli.hooks import HookIntegration
|
|
51
52
|
from cecli.io import ConfirmGroup, InputOutput
|
|
@@ -91,6 +92,10 @@ class FinishReasonLength(Exception):
|
|
|
91
92
|
pass
|
|
92
93
|
|
|
93
94
|
|
|
95
|
+
class EmptyResponseError(Exception):
|
|
96
|
+
pass
|
|
97
|
+
|
|
98
|
+
|
|
94
99
|
def wrap_fence(name):
|
|
95
100
|
return f"<{name}>", f"</{name}>"
|
|
96
101
|
|
|
@@ -420,7 +425,7 @@ class Coder(metaclass=UsageMeta):
|
|
|
420
425
|
# Each contains "included" and "excluded" sets that filter from the global singletons
|
|
421
426
|
self.registered_tools = {"included": set(), "excluded": set()}
|
|
422
427
|
self.registered_servers = {"included": set(), "excluded": set()}
|
|
423
|
-
self.interrupt_event =
|
|
428
|
+
self.interrupt_event = ThreadSafeEvent()
|
|
424
429
|
self.uuid = str(generate_unique_id())
|
|
425
430
|
|
|
426
431
|
if uuid:
|
|
@@ -1643,6 +1648,7 @@ class Coder(metaclass=UsageMeta):
|
|
|
1643
1648
|
|
|
1644
1649
|
async def generate(self, user_message, preproc):
|
|
1645
1650
|
await asyncio.sleep(0.1)
|
|
1651
|
+
self.interrupt_event.clear()
|
|
1646
1652
|
|
|
1647
1653
|
try:
|
|
1648
1654
|
if self.enable_context_compaction:
|
|
@@ -2402,6 +2408,39 @@ class Coder(metaclass=UsageMeta):
|
|
|
2402
2408
|
async for chunk in self.send(messages, tools=self.get_tool_list()):
|
|
2403
2409
|
yield chunk
|
|
2404
2410
|
break
|
|
2411
|
+
except EmptyResponseError:
|
|
2412
|
+
self.io.tool_warning(self.empty_llm_tool_warning())
|
|
2413
|
+
|
|
2414
|
+
retry_on_empty = False
|
|
2415
|
+
retries_config = self.get_active_model().retries
|
|
2416
|
+
if isinstance(retries_config, str):
|
|
2417
|
+
try:
|
|
2418
|
+
retries_config = json.loads(retries_config)
|
|
2419
|
+
except json.JSONDecodeError:
|
|
2420
|
+
self.io.tool_warning(
|
|
2421
|
+
f"Could not parse retries config: {retries_config}"
|
|
2422
|
+
)
|
|
2423
|
+
retries_config = {}
|
|
2424
|
+
if isinstance(retries_config, dict):
|
|
2425
|
+
retry_on_empty = retries_config.get("retry_on_empty", False)
|
|
2426
|
+
|
|
2427
|
+
if not retry_on_empty:
|
|
2428
|
+
break
|
|
2429
|
+
|
|
2430
|
+
retry_delay *= 2
|
|
2431
|
+
if retry_delay > RETRY_TIMEOUT:
|
|
2432
|
+
self.io.tool_error("Retry timeout exceeded on empty response.")
|
|
2433
|
+
break
|
|
2434
|
+
|
|
2435
|
+
self.io.tool_output(f"Retrying in {retry_delay:.1f} seconds...")
|
|
2436
|
+
|
|
2437
|
+
_res, interrupted_sleep = await coroutines.interruptible(
|
|
2438
|
+
asyncio.sleep(retry_delay), self.interrupt_event
|
|
2439
|
+
)
|
|
2440
|
+
if interrupted_sleep:
|
|
2441
|
+
interrupted = True
|
|
2442
|
+
break
|
|
2443
|
+
continue
|
|
2405
2444
|
except litellm_ex.exceptions_tuple() as err:
|
|
2406
2445
|
ex_info = litellm_ex.get_ex_info(err)
|
|
2407
2446
|
|
|
@@ -3252,6 +3291,7 @@ class Coder(metaclass=UsageMeta):
|
|
|
3252
3291
|
self.interrupt_event.clear()
|
|
3253
3292
|
self.got_reasoning_content = False
|
|
3254
3293
|
self.ended_reasoning_content = False
|
|
3294
|
+
self.empty_response = False
|
|
3255
3295
|
|
|
3256
3296
|
self._streaming_buffer_length = 0
|
|
3257
3297
|
self.io.reset_streaming_response()
|
|
@@ -3302,6 +3342,9 @@ class Coder(metaclass=UsageMeta):
|
|
|
3302
3342
|
else:
|
|
3303
3343
|
await self.show_send_output(completion)
|
|
3304
3344
|
|
|
3345
|
+
if self.empty_response:
|
|
3346
|
+
raise EmptyResponseError
|
|
3347
|
+
|
|
3305
3348
|
response, func_err, content_err = self.consolidate_chunks()
|
|
3306
3349
|
|
|
3307
3350
|
if response:
|
|
@@ -3382,7 +3425,8 @@ class Coder(metaclass=UsageMeta):
|
|
|
3382
3425
|
and not len(self.partial_response_tool_calls)
|
|
3383
3426
|
and not len(self.partial_response_reasoning_content)
|
|
3384
3427
|
):
|
|
3385
|
-
self.
|
|
3428
|
+
self.empty_response = True
|
|
3429
|
+
return
|
|
3386
3430
|
|
|
3387
3431
|
self.io.assistant_output(show_resp, pretty=self.show_pretty())
|
|
3388
3432
|
|
|
@@ -3539,7 +3583,8 @@ class Coder(metaclass=UsageMeta):
|
|
|
3539
3583
|
return
|
|
3540
3584
|
|
|
3541
3585
|
if not received_content and len(self.partial_response_tool_calls) == 0:
|
|
3542
|
-
self.
|
|
3586
|
+
self.empty_response = True
|
|
3587
|
+
return
|
|
3543
3588
|
|
|
3544
3589
|
def consolidate_chunks(self):
|
|
3545
3590
|
if self.partial_response_consolidated:
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import asyncio
|
|
2
1
|
import json
|
|
3
2
|
import re
|
|
4
3
|
import sys
|
|
@@ -7,6 +6,7 @@ from pathlib import Path
|
|
|
7
6
|
from cecli.commands.utils.registry import CommandRegistry
|
|
8
7
|
from cecli.helpers import nested, plugin_manager
|
|
9
8
|
from cecli.helpers.file_searcher import handle_core_files
|
|
9
|
+
from cecli.helpers.threading import ThreadSafeEvent
|
|
10
10
|
from cecli.repo import ANY_GIT_ERROR
|
|
11
11
|
|
|
12
12
|
|
|
@@ -94,7 +94,7 @@ class Commands:
|
|
|
94
94
|
self.custom_commands = nested.getter(customizations, "command-paths", [])
|
|
95
95
|
self._load_custom_commands(self.custom_commands)
|
|
96
96
|
|
|
97
|
-
self.cmd_running_event =
|
|
97
|
+
self.cmd_running_event = ThreadSafeEvent()
|
|
98
98
|
self.cmd_running_event.set()
|
|
99
99
|
self.last_command_show_notification = True
|
|
100
100
|
|
|
@@ -281,14 +281,17 @@ class ConversationFiles:
|
|
|
281
281
|
diff_message = {
|
|
282
282
|
"role": "user",
|
|
283
283
|
"content": (
|
|
284
|
-
f"{rel_fname} has been updated.
|
|
285
|
-
f"
|
|
284
|
+
f"{rel_fname} has been updated. Review this git diff of the changes to"
|
|
285
|
+
f" ensure the modifications are intended:\n\n{diff}"
|
|
286
286
|
),
|
|
287
287
|
}
|
|
288
288
|
|
|
289
289
|
assistant_msg = {
|
|
290
290
|
"role": "assistant",
|
|
291
|
-
"content":
|
|
291
|
+
"content": (
|
|
292
|
+
f"Thank you for sharing this diff of the updates to {rel_fname}."
|
|
293
|
+
" I will review their contents next turn."
|
|
294
|
+
),
|
|
292
295
|
}
|
|
293
296
|
|
|
294
297
|
ConversationService.get_manager(coder).add_message(
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
|
|
3
|
+
from cecli.helpers.threading import ThreadSafeEvent
|
|
4
|
+
|
|
3
5
|
|
|
4
6
|
async def interruptible_async_generator(async_generator, interrupt_event):
|
|
5
7
|
"""
|
|
@@ -57,7 +59,7 @@ async def interruptible(coroutine, interrupt_event):
|
|
|
57
59
|
- If interrupted: (None, True)
|
|
58
60
|
"""
|
|
59
61
|
if interrupt_event is None:
|
|
60
|
-
interrupt_event =
|
|
62
|
+
interrupt_event = ThreadSafeEvent()
|
|
61
63
|
|
|
62
64
|
main_task = asyncio.create_task(coroutine)
|
|
63
65
|
interrupt_task = asyncio.create_task(interrupt_event.wait())
|
|
@@ -650,6 +650,20 @@ def _apply_start_stitching(
|
|
|
650
650
|
# The replacement line matches the line being replaced
|
|
651
651
|
# Don't stitch to a line in lines_before_range
|
|
652
652
|
continue
|
|
653
|
+
|
|
654
|
+
# Require 2 consecutive matching lines to avoid false positives
|
|
655
|
+
# (single boilerplate lines like "import sys" or "def foo():"
|
|
656
|
+
# are too likely to be coincidental)
|
|
657
|
+
if line_idx + 1 < len(replacement_lines) and match_index + 1 < len(
|
|
658
|
+
lines_before_range_normalized
|
|
659
|
+
):
|
|
660
|
+
next_repl = replacement_lines[line_idx + 1]
|
|
661
|
+
next_repl_stripped = strip_hashline(next_repl)
|
|
662
|
+
if not next_repl_stripped.endswith("\n"):
|
|
663
|
+
next_repl_stripped += "\n"
|
|
664
|
+
if next_repl_stripped != lines_before_range_normalized[match_index + 1]:
|
|
665
|
+
continue # Only 1 line matches — likely coincidental
|
|
666
|
+
|
|
653
667
|
# Found a line that already exists before the range!
|
|
654
668
|
# This is a non-contiguous match - we need to "stitch" the replacement
|
|
655
669
|
# at this exact content match to prevent duplicate code structures
|
|
@@ -694,9 +708,9 @@ def _apply_start_stitching(
|
|
|
694
708
|
start_idx = new_start_idx
|
|
695
709
|
replacement_lines = new_replacement_lines
|
|
696
710
|
else:
|
|
697
|
-
# Can't extend backward due to overlap
|
|
698
|
-
#
|
|
699
|
-
|
|
711
|
+
# Can't extend backward due to overlap with another operation
|
|
712
|
+
# Don't truncate without extending — that would silently lose content
|
|
713
|
+
continue # Try next line instead
|
|
700
714
|
|
|
701
715
|
# We've found our stitching point, break out of the loop
|
|
702
716
|
break
|
|
@@ -772,6 +786,15 @@ def _apply_end_stitching(
|
|
|
772
786
|
# Check if this line exists anywhere in lines_after_range_normalized
|
|
773
787
|
try:
|
|
774
788
|
match_index = lines_after_range_normalized.index(replacement_line_stripped)
|
|
789
|
+
|
|
790
|
+
# Require 2 consecutive matching lines to reduce false positives
|
|
791
|
+
if line_idx - 1 >= 0 and match_index - 1 >= 0:
|
|
792
|
+
prev_repl = replacement_lines[line_idx - 1]
|
|
793
|
+
prev_repl_stripped = strip_hashline(prev_repl)
|
|
794
|
+
if not prev_repl_stripped.endswith("\n"):
|
|
795
|
+
prev_repl_stripped += "\n"
|
|
796
|
+
if prev_repl_stripped != lines_after_range_normalized[match_index - 1]:
|
|
797
|
+
continue # Only 1 line matches — likely coincidental
|
|
775
798
|
# Found a line that already exists after the range!
|
|
776
799
|
# This is a non-contiguous match - we need to "stitch" the replacement
|
|
777
800
|
# at this exact content match to prevent duplicate code structures
|
|
@@ -900,109 +923,6 @@ def _apply_range_shifting(hashed_lines, resolved_ops):
|
|
|
900
923
|
return resolved_ops
|
|
901
924
|
|
|
902
925
|
|
|
903
|
-
# Regex configuration
|
|
904
|
-
RE_CODE_NOISE = r'(#.*|//.*|/\*[\s\S]*?\*/|"(?:\\.|[^"\\])*"|\'(?:\\.|[^\'\\])*\')'
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
def get_brace_balance(lines_to_check: list[str]) -> int:
|
|
908
|
-
"""
|
|
909
|
-
Calculates the net curly brace debt of a list of lines.
|
|
910
|
-
Automatically strips hashlines, comments, and string literals.
|
|
911
|
-
"""
|
|
912
|
-
text = "".join(lines_to_check)
|
|
913
|
-
clean_code = strip_hashline(text)
|
|
914
|
-
clean_code = re.sub(RE_CODE_NOISE, "", clean_code)
|
|
915
|
-
return clean_code.count("{") - clean_code.count("}")
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
def _apply_closure_safeguard(hashed_lines, resolved_ops):
|
|
919
|
-
"""
|
|
920
|
-
Enhanced closure safeguard with dynamic bidirectional search.
|
|
921
|
-
"""
|
|
922
|
-
# Tune these to adjust how far the 'healing' logic searches
|
|
923
|
-
MAX_LOOK_DOWN = 5
|
|
924
|
-
# Note: We'll calculate the actual MAX_LOOK_UP per operation
|
|
925
|
-
# to ensure we don't scan past the start_idx.
|
|
926
|
-
|
|
927
|
-
for i, resolved in enumerate(resolved_ops):
|
|
928
|
-
op = resolved["op"]
|
|
929
|
-
if op["operation"] not in {"replace", "delete"}:
|
|
930
|
-
continue
|
|
931
|
-
|
|
932
|
-
replacement_text = op.get("text", "") or ""
|
|
933
|
-
replacement_lines = replacement_text.splitlines(keepends=True)
|
|
934
|
-
|
|
935
|
-
# --- PHASE 1: BIDIRECTIONAL STRUCTURAL HEALING ---
|
|
936
|
-
if get_brace_balance([replacement_text]) == 0:
|
|
937
|
-
start_idx = resolved["start_idx"]
|
|
938
|
-
orig_end_idx = resolved["end_idx"]
|
|
939
|
-
|
|
940
|
-
if get_brace_balance(hashed_lines[start_idx : orig_end_idx + 1]) != 0:
|
|
941
|
-
# Dynamic Search List Generation
|
|
942
|
-
# We limit look-up so we don't scan before the start_idx
|
|
943
|
-
actual_max_up = orig_end_idx - start_idx
|
|
944
|
-
actual_max_down = max(MAX_LOOK_DOWN, orig_end_idx - start_idx)
|
|
945
|
-
search_offsets = []
|
|
946
|
-
|
|
947
|
-
# Generate alternating offsets: [1, -1, 2, -2, ... N]
|
|
948
|
-
for dist in range(1, max(actual_max_down, actual_max_up) + 1):
|
|
949
|
-
if dist <= actual_max_down:
|
|
950
|
-
search_offsets.append(dist)
|
|
951
|
-
if dist <= actual_max_up:
|
|
952
|
-
search_offsets.append(-dist)
|
|
953
|
-
|
|
954
|
-
for offset in search_offsets:
|
|
955
|
-
candidate_end = orig_end_idx + offset
|
|
956
|
-
|
|
957
|
-
# Safety: check bounds and avoid overlapping other ops
|
|
958
|
-
if candidate_end < start_idx or candidate_end >= len(hashed_lines):
|
|
959
|
-
continue
|
|
960
|
-
|
|
961
|
-
if any(
|
|
962
|
-
j != i and (other["start_idx"] <= candidate_end <= other["end_idx"])
|
|
963
|
-
for j, other in enumerate(resolved_ops)
|
|
964
|
-
):
|
|
965
|
-
continue
|
|
966
|
-
|
|
967
|
-
if get_brace_balance(hashed_lines[start_idx : candidate_end + 1]) == 0:
|
|
968
|
-
resolved["end_idx"] = candidate_end
|
|
969
|
-
break
|
|
970
|
-
|
|
971
|
-
# --- PHASE 2: CONTRACTION (Indentation Guard) ---
|
|
972
|
-
# Prevents replacing an outer-scope brace if the replacement text already
|
|
973
|
-
# includes its own correctly indented closer.
|
|
974
|
-
if not replacement_lines:
|
|
975
|
-
continue
|
|
976
|
-
|
|
977
|
-
last_repl_line = strip_hashline(replacement_lines[-1])
|
|
978
|
-
last_repl_stripped = last_repl_line.strip().rstrip(";,")
|
|
979
|
-
|
|
980
|
-
if last_repl_stripped and last_repl_stripped[-1] in "})]":
|
|
981
|
-
# Calculate replacement indent
|
|
982
|
-
repl_indent = len(last_repl_line) - len(last_repl_line.lstrip(" \t"))
|
|
983
|
-
|
|
984
|
-
if resolved["end_idx"] < len(hashed_lines):
|
|
985
|
-
end_line = strip_hashline(hashed_lines[resolved["end_idx"]])
|
|
986
|
-
check_end = end_line.strip().rstrip(";,")
|
|
987
|
-
|
|
988
|
-
if check_end and check_end[-1] in "})]":
|
|
989
|
-
# Calculate indent of the existing brace in the file
|
|
990
|
-
file_indent = len(end_line) - len(end_line.lstrip(" \t"))
|
|
991
|
-
|
|
992
|
-
# If the file's brace is less indented, it belongs to an outer scope
|
|
993
|
-
if file_indent < repl_indent and resolved["end_idx"] > resolved["start_idx"]:
|
|
994
|
-
new_end_idx = resolved["end_idx"] - 1
|
|
995
|
-
|
|
996
|
-
# Safety: don't contract into another operation's territory
|
|
997
|
-
if not any(
|
|
998
|
-
j != i and (other["start_idx"] <= new_end_idx <= other["end_idx"])
|
|
999
|
-
for j, other in enumerate(resolved_ops)
|
|
1000
|
-
):
|
|
1001
|
-
resolved["end_idx"] = new_end_idx
|
|
1002
|
-
|
|
1003
|
-
return resolved_ops
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
926
|
def _merge_replace_operations(resolved_ops):
|
|
1007
927
|
"""
|
|
1008
928
|
Merge contiguous or overlapping replace operations.
|
|
@@ -1411,9 +1331,6 @@ def apply_hashline_operations(
|
|
|
1411
1331
|
resolved_ops = _merge_replace_operations(resolved_ops)
|
|
1412
1332
|
# Apply content-aware range expansion/shifting for replace operations
|
|
1413
1333
|
# resolved_ops = _apply_range_shifting(hashed_lines, resolved_ops)
|
|
1414
|
-
# Apply closure safeguard for braces/brackets
|
|
1415
|
-
resolved_ops = _apply_closure_safeguard(hashed_lines, resolved_ops)
|
|
1416
|
-
|
|
1417
1334
|
# Sort by start_idx descending to apply from bottom to top
|
|
1418
1335
|
# When operations have same start_idx, apply in order: insert, replace, delete
|
|
1419
1336
|
# This ensures correct behavior when multiple operations target the same line
|
|
@@ -52,7 +52,7 @@ class HashPos:
|
|
|
52
52
|
def generate_public_id(self, text: str, line_idx: int) -> str:
|
|
53
53
|
"""
|
|
54
54
|
Generates a 4-char Base64 ID combining modulo buckets and context hash.
|
|
55
|
-
Layout: [2-bit b1] [
|
|
55
|
+
Layout: [2-bit b1] [2-bit b2] [10-bit Hash A] [10-bit Hash B]
|
|
56
56
|
"""
|
|
57
57
|
b1, b2 = self._get_region_bits(line_idx)
|
|
58
58
|
neighborhood_hash = self._get_neighborhood_hash(line_idx)
|
|
@@ -62,8 +62,7 @@ class HashPos:
|
|
|
62
62
|
hash_b = neighborhood_hash & 0x3FF
|
|
63
63
|
|
|
64
64
|
# Construct the mixed 24-bit integer
|
|
65
|
-
packed = (b1 << 22) | (
|
|
66
|
-
|
|
65
|
+
packed = (b1 << 22) | (b2 << 20) | (hash_a << 10) | hash_b
|
|
67
66
|
res = ""
|
|
68
67
|
for _ in range(4):
|
|
69
68
|
res += self.B64[packed % 64]
|
|
@@ -79,10 +78,9 @@ class HashPos:
|
|
|
79
78
|
packed |= self.B64.index(char) << (6 * i)
|
|
80
79
|
|
|
81
80
|
b1 = (packed >> 22) & 3
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
b2 = (packed >> 20) & 3
|
|
82
|
+
hash_a = (packed >> 10) & 0x3FF
|
|
84
83
|
hash_b = packed & 0x3FF
|
|
85
|
-
|
|
86
84
|
mod_val = (b1 << 2) | b2
|
|
87
85
|
neighborhood_hash = (hash_a << 10) | hash_b
|
|
88
86
|
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import threading
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ThreadSafeEvent:
|
|
6
|
+
def __init__(self):
|
|
7
|
+
self._async_event = asyncio.Event()
|
|
8
|
+
self._thread_event = threading.Event()
|
|
9
|
+
|
|
10
|
+
@staticmethod
|
|
11
|
+
def _get_loop():
|
|
12
|
+
"""Dynamically resolve the running event loop (not cached)."""
|
|
13
|
+
try:
|
|
14
|
+
return asyncio.get_running_loop()
|
|
15
|
+
except RuntimeError:
|
|
16
|
+
return None
|
|
17
|
+
|
|
18
|
+
def set(self):
|
|
19
|
+
"""Can be called from ANY thread or coroutine safely."""
|
|
20
|
+
# Unblock threads
|
|
21
|
+
self._thread_event.set()
|
|
22
|
+
# Unblock async loop
|
|
23
|
+
if loop := self._get_loop():
|
|
24
|
+
loop.call_soon_threadsafe(self._async_event.set)
|
|
25
|
+
else:
|
|
26
|
+
self._async_event.set()
|
|
27
|
+
|
|
28
|
+
def clear(self):
|
|
29
|
+
"""Can be called from ANY thread or coroutine safely."""
|
|
30
|
+
self._thread_event.clear()
|
|
31
|
+
if loop := self._get_loop():
|
|
32
|
+
loop.call_soon_threadsafe(self._async_event.clear)
|
|
33
|
+
else:
|
|
34
|
+
self._async_event.clear()
|
|
35
|
+
|
|
36
|
+
def is_set(self):
|
|
37
|
+
"""Thread-safe check."""
|
|
38
|
+
return self._thread_event.is_set()
|
|
39
|
+
|
|
40
|
+
def thread_wait(self, timeout=None):
|
|
41
|
+
"""Call this from your background OS Thread."""
|
|
42
|
+
return self._thread_event.wait(timeout=timeout)
|
|
43
|
+
|
|
44
|
+
async def wait(self):
|
|
45
|
+
"""Call this (with await) from your Async Coroutines."""
|
|
46
|
+
await self._async_event.wait()
|
|
@@ -43,6 +43,7 @@ from rich.text import Text
|
|
|
43
43
|
|
|
44
44
|
from cecli.commands import SwitchCoderSignal
|
|
45
45
|
from cecli.helpers import coroutines
|
|
46
|
+
from cecli.helpers.threading import ThreadSafeEvent
|
|
46
47
|
from cecli.report import update_error_prefix
|
|
47
48
|
|
|
48
49
|
from .dump import dump # noqa: F401
|
|
@@ -395,7 +396,7 @@ class InputOutput:
|
|
|
395
396
|
self.linear = False
|
|
396
397
|
|
|
397
398
|
# State tracking for confirmation input
|
|
398
|
-
self.confirmation_in_progress_event =
|
|
399
|
+
self.confirmation_in_progress_event = ThreadSafeEvent()
|
|
399
400
|
self.confirmation_in_progress_event.set() # Initially set, meaning no confirmation in progress
|
|
400
401
|
self.confirmation_acknowledgement = False
|
|
401
402
|
self.confirmation_input_active = False
|
|
@@ -12,6 +12,7 @@ import oslex
|
|
|
12
12
|
from cecli.dump import dump # noqa: F401
|
|
13
13
|
from cecli.helpers.grep_ast import TreeContext, filename_to_lang
|
|
14
14
|
from cecli.helpers.grep_ast.tsl import get_parser # noqa: E402
|
|
15
|
+
from cecli.helpers.threading import ThreadSafeEvent
|
|
15
16
|
from cecli.run_cmd import run_cmd_async, run_cmd_subprocess # noqa: F401
|
|
16
17
|
|
|
17
18
|
# tree_sitter is throwing a FutureWarning
|
|
@@ -22,7 +23,7 @@ class Linter:
|
|
|
22
23
|
def __init__(self, encoding="utf-8", root=None, interrupt_event=None):
|
|
23
24
|
self.encoding = encoding
|
|
24
25
|
self.root = root
|
|
25
|
-
self.interrupt_event = interrupt_event or
|
|
26
|
+
self.interrupt_event = interrupt_event or ThreadSafeEvent()
|
|
26
27
|
|
|
27
28
|
self.languages = dict(
|
|
28
29
|
python=self.py_lint,
|
|
@@ -42,6 +42,7 @@ class McpServer:
|
|
|
42
42
|
self.io = io
|
|
43
43
|
self.verbose = verbose
|
|
44
44
|
self.session = None
|
|
45
|
+
self._connection_loop: asyncio.AbstractEventLoop | None = None
|
|
45
46
|
self._cleanup_lock: asyncio.Lock = asyncio.Lock()
|
|
46
47
|
self.exit_stack = AsyncExitStack()
|
|
47
48
|
|
|
@@ -59,10 +60,17 @@ class McpServer:
|
|
|
59
60
|
Returns:
|
|
60
61
|
ClientSession: The active session if mcp is not disabled
|
|
61
62
|
"""
|
|
63
|
+
current_loop = asyncio.get_running_loop()
|
|
62
64
|
if self.session is not None:
|
|
65
|
+
# Event loop affinity check: streams from stdio_client() are bound
|
|
66
|
+
# to the loop that created them. Reconnect if the loop changed.
|
|
67
|
+
if self._connection_loop is current_loop:
|
|
68
|
+
if self.verbose and self.io:
|
|
69
|
+
self.io.tool_output(f"Using existing session for MCP server: {self.name}")
|
|
70
|
+
return self.session
|
|
63
71
|
if self.verbose and self.io:
|
|
64
|
-
self.io.tool_output(f"
|
|
65
|
-
|
|
72
|
+
self.io.tool_output(f"Reconnecting MCP server {self.name} (event loop changed)")
|
|
73
|
+
await self.disconnect()
|
|
66
74
|
|
|
67
75
|
if self.verbose and self.io:
|
|
68
76
|
self.io.tool_output(f"Establishing new connection to MCP server: {self.name}")
|
|
@@ -87,6 +95,7 @@ class McpServer:
|
|
|
87
95
|
session = await self.exit_stack.enter_async_context(ClientSession(read, write))
|
|
88
96
|
await session.initialize()
|
|
89
97
|
self.session = session
|
|
98
|
+
self._connection_loop = current_loop
|
|
90
99
|
return session
|
|
91
100
|
except Exception as e:
|
|
92
101
|
logging.error(f"Error initializing server {self.name}: {e}")
|
|
@@ -193,10 +202,15 @@ class HttpBasedMcpServer(McpServer):
|
|
|
193
202
|
raise NotImplementedError("Subclasses must implement _create_transport")
|
|
194
203
|
|
|
195
204
|
async def connect(self):
|
|
205
|
+
current_loop = asyncio.get_running_loop()
|
|
196
206
|
if self.session is not None:
|
|
207
|
+
if self._connection_loop is current_loop:
|
|
208
|
+
if self.verbose and self.io:
|
|
209
|
+
self.io.tool_output(f"Using existing session for {self.name}")
|
|
210
|
+
return self.session
|
|
197
211
|
if self.verbose and self.io:
|
|
198
|
-
self.io.tool_output(f"
|
|
199
|
-
|
|
212
|
+
self.io.tool_output(f"Reconnecting {self.name} (event loop changed)")
|
|
213
|
+
await self.disconnect()
|
|
200
214
|
|
|
201
215
|
if self.verbose and self.io:
|
|
202
216
|
self.io.tool_output(f"Establishing new connection to {self.name}")
|
|
@@ -224,6 +238,7 @@ class HttpBasedMcpServer(McpServer):
|
|
|
224
238
|
session = await self.exit_stack.enter_async_context(ClientSession(read, write))
|
|
225
239
|
await session.initialize()
|
|
226
240
|
self.session = session
|
|
241
|
+
self._connection_loop = current_loop
|
|
227
242
|
|
|
228
243
|
if oauth_provider.context.oauth_metadata:
|
|
229
244
|
token_endpoint = oauth_provider._get_token_endpoint()
|
|
@@ -270,9 +285,13 @@ class SseServer(McpServer):
|
|
|
270
285
|
"""SSE (Server-Sent Events) MCP server using mcp.client.sse_client."""
|
|
271
286
|
|
|
272
287
|
async def connect(self):
|
|
288
|
+
current_loop = asyncio.get_running_loop()
|
|
273
289
|
if self.session is not None:
|
|
274
|
-
|
|
275
|
-
|
|
290
|
+
if self._connection_loop is current_loop:
|
|
291
|
+
logging.info(f"Using existing session for SSE MCP server: {self.name}")
|
|
292
|
+
return self.session
|
|
293
|
+
logging.info(f"Reconnecting SSE MCP server {self.name} (event loop changed)")
|
|
294
|
+
await self.disconnect()
|
|
276
295
|
|
|
277
296
|
logging.info(f"Establishing new connection to SSE MCP server: {self.name}")
|
|
278
297
|
try:
|
|
@@ -285,6 +304,7 @@ class SseServer(McpServer):
|
|
|
285
304
|
session = await self.exit_stack.enter_async_context(ClientSession(read, write))
|
|
286
305
|
await session.initialize()
|
|
287
306
|
self.session = session
|
|
307
|
+
self._connection_loop = current_loop
|
|
288
308
|
return session
|
|
289
309
|
except Exception as e:
|
|
290
310
|
logging.error(f"Error initializing SSE server {self.name}: {e}")
|
|
@@ -29,8 +29,8 @@ main_system: |
|
|
|
29
29
|
|
|
30
30
|
<context name="file_format">
|
|
31
31
|
### 1. FILE FORMAT
|
|
32
|
-
File contents will be prefixed with identifiers. Each line starts with a case-sensitive content
|
|
33
|
-
They are algorithmically generated, maintained, and subject to change. Do not search for these content
|
|
32
|
+
File contents will be prefixed with identifiers. Each line starts with a case-sensitive content ID followed by `::`. These are used to target where editing tools will perform edits.
|
|
33
|
+
They are algorithmically generated, maintained, and subject to change. Do not search for these content IDs. Focus on the lines they identify.
|
|
34
34
|
|
|
35
35
|
**Example File Format :**
|
|
36
36
|
il9n::#!/usr/bin/env python3
|
|
@@ -6,7 +6,7 @@ main_system: |
|
|
|
6
6
|
Act as an expert software developer. Plan carefully, explain your logic briefly, and execute via LOCATE/CONTENTS blocks.
|
|
7
7
|
|
|
8
8
|
### 1. FILE FORMAT
|
|
9
|
-
Files are provided in "hashline" format. Each line starts with a case-sensitive content
|
|
9
|
+
Files are provided in "hashline" format. Each line starts with a case-sensitive content ID followed by `::`.
|
|
10
10
|
These hashes are used as identifiers for lines when editing.
|
|
11
11
|
|
|
12
12
|
**Example File Format :**
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import logging
|
|
3
3
|
|
|
4
|
+
from cecli.helpers.threading import ThreadSafeEvent
|
|
4
5
|
from cecli.tools.utils.base_tool import BaseTool
|
|
5
6
|
from cecli.tools.utils.helpers import ToolError
|
|
6
7
|
from cecli.tools.utils.output import color_markers, tool_footer, tool_header
|
|
@@ -65,7 +66,7 @@ class Tool(BaseTool):
|
|
|
65
66
|
# the interrupt event, avoiding nested asyncio.wait() calls.
|
|
66
67
|
interrupt_event = coder.interrupt_event
|
|
67
68
|
if interrupt_event is None:
|
|
68
|
-
interrupt_event =
|
|
69
|
+
interrupt_event = ThreadSafeEvent()
|
|
69
70
|
|
|
70
71
|
interrupt_task = asyncio.create_task(interrupt_event.wait())
|
|
71
72
|
pending = set(active_tasks) | {interrupt_task}
|