cecli-dev 0.100.6rc8__tar.gz → 0.100.7rc2__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.6rc8 → cecli_dev-0.100.7rc2}/PKG-INFO +1 -1
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/_version.py +3 -3
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/agent_coder.py +4 -1
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/base_coder.py +37 -13
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/utils/base_command.py +6 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/hashline.py +372 -38
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/reasoning_tags.py +18 -1
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/_yield.py +4 -1
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/command.py +9 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/command_interactive.py +13 -1
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/edit_text.py +4 -1
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/read_range.py +1 -1
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/agent-mode.md +2 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/skills.md +1 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli_dev.egg-info/PKG-INFO +1 -1
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli_dev.egg-info/SOURCES.txt +1 -0
- cecli_dev-0.100.7rc2/tests/basic/test_hashline_closure.py +423 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_insert_block.py +5 -4
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.dockerignore +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.flake8 +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.gitattributes +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/ISSUE_TEMPLATE/issue.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/check_pypi_version.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/docker-build-test.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/docker-release.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/issues.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/pages.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/pre-commit.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/release.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/ubuntu-tests.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/windows-tests.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/windows_check_pypi_version.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.gitignore +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.pre-commit-config.yaml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/CHANGELOG.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/CNAME +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/CONTRIBUTING.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/HISTORY.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/LICENSE.txt +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/MANIFEST.in +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/README.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/Dockerfile +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/README.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/benchmark.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/benchmark_classic.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/clone-exercism.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/cpp-test.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/docker.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/docker_build.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/install-docker-ubuntu.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/npm-test.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/over_time.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/plot.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/plots.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/problem_stats.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/prompts.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/refactor_tools.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/rsync.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/rungrid.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/swe-bench-lite.txt +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/swe-bench.txt +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/swe_bench.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/test_benchmark.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/variations.1.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/variations.2.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/variations.3.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/variations.4.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/__main__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/args.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/args_formatter.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/change_tracker.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/architect_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/ask_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/chat_chunks.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/context_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/copypaste_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/editblock_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/editblock_fenced_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/editblock_func_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/editor_diff_fenced_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/editor_editblock_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/editor_whole_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/hashline_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/help_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/patch_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/search_replace.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/shell.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/single_wholefile_func_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/sub_agent_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/udiff_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/udiff_simple.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/wholefile_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/wholefile_func_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/add.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/agent.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/agent_model.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/architect.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/ask.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/chat_mode.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/clear.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/code.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/command_prefix.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/commit.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/compact.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/context.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/context_blocks.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/context_management.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/copy.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/copy_context.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/core.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/diff.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/drop.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/editor.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/editor_model.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/exclude_skill.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/exit.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/git.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/hashline.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/help.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/history_search.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/hooks.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/include_skill.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/lint.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/list_sessions.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/list_skills.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/load.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/load_hook.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/load_mcp.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/load_session.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/load_skill.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/ls.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/map.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/map_refresh.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/merge.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/model.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/models.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/multiline_mode.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/paste.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/quit.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/read_only.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/read_only_stub.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/reap_agent.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/reasoning_effort.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/remove_hook.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/remove_mcp.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/remove_skill.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/report.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/reset.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/rules.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/run.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/save.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/save_session.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/settings.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/spawn_agent.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/switch_agent.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/terminal_data/linux.keytab +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/terminal_setup.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/test.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/think_tokens.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/tokens.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/undo.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/utils/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/utils/helpers.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/utils/registry.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/utils/save_load_manager.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/voice.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/weak_model.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/web.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/workspace.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/deprecated_args.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/diffs.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/dump.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/editor.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/exceptions.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/format_settings.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/help.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/help_pats.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/agents/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/agents/config.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/agents/service.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/background_commands.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/command_parser.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/conversation/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/conversation/base_message.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/conversation/files.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/conversation/integration.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/conversation/manager.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/conversation/service.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/conversation/tags.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/conversation/utils.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/copypaste.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/coroutines.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/crypto.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/file_searcher.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/file_system/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/file_system/builders.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/file_system/ignore.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/file_system/ngram_index.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/file_system/service.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/file_system/trie_index.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/grep_ast/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/grep_ast/dump.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/grep_ast/grep_ast.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/grep_ast/main.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/grep_ast/parsers.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/grep_ast/tsl.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/hashpos/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/hashpos/hashpos.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/hashpos/hashpos.v1.bak +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/io_proxy.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/leak_detect.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/model_providers.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/monorepo/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/monorepo/config.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/monorepo/local_workspace.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/monorepo/project.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/monorepo/workspace.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/monorepo/worktree.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/nested.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/observations/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/observations/service.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/plugin_manager.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/profiler.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/requests.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/responses.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/similarity.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/skills.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/threading.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/history.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/hooks/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/hooks/base.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/hooks/integration.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/hooks/manager.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/hooks/registry.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/hooks/service.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/hooks/types.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/interruptible_input.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/io.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/linter.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/llm.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/main.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/mcp/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/mcp/manager.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/mcp/oauth.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/mcp/server.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/mcp/utils.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/mdstream.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/models.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/onboarding.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/agent.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/architect.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/ask.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/base.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/context.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/copypaste.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/editblock.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/editblock_fenced.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/editblock_func.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/editor_diff_fenced.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/editor_editblock.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/editor_whole.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/hashline.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/help.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/patch.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/single_wholefile_func.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/subagent.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/udiff.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/udiff_simple.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/utils/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/utils/registry.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/utils/system.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/wholefile.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/wholefile_func.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/README.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/bash-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/c-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/clojure-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/d-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/go-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/java-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/matlab-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/ocaml-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/ocaml_interface-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/python-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/r-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/README.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/bash-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/c-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/cpp-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/dart-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/elisp-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/elixir-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/elm-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/fortran-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/go-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/haskell-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/hcl-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/java-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/javascript-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/julia-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/matlab-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/ocaml_interface-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/php-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/python-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/ql-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/ruby-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/rust-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/scala-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/typescript-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/zig-tags.scm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/repo.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/repomap.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/report.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/resources/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/resources/model-metadata.json +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/resources/model-settings.yml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/resources/providers.json +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/run_cmd.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/scrape.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/sendchat.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/sessions.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/special.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/context_manager.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/delegate.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/explore_code.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/git_branch.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/git_diff.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/git_log.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/git_remote.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/git_show.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/git_status.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/grep.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/load_skill.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/ls.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/remove_skill.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/thinking.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/undo_change.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/update_todo_list.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/utils/base_tool.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/utils/helpers.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/utils/output.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/utils/registry.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/validations/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/validations/validations.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/app.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/io.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/styles.tcss +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/completion_bar.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/file_list.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/footer.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/input_area.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/input_container.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/key_hints.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/output.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/status_bar.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/subagent_pills.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/worker.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/urls.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/utils.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/versioncheck.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/voice.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/waiting.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/watch.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/watch_prompts.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/Gemfile +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/blame.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/get-started.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/help-tip.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/help.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/install.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/keys.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/model-warnings.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/multi-line.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/python-m-aider.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/recording.css +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/recording.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/works-best.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_features.scss +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_footer.scss +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_hero.scss +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_info.scss +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_layout.scss +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_reset.scss +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_testimonials.scss +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_typography.scss +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_variables.scss +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/custom/custom.scss +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/global-overrides.scss +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/adv-model-settings.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/aider_conf.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/api-keys.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/custom-commands.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/custom-system-prompts.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/dotenv.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/editor.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/hooks.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/mcp.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/model-aliases.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/model-configuration.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/options.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/reasoning.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/security.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/subagents.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/tui.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/workspaces.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/faq.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/git.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/index.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/install/docker.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/install/optional.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/install.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/languages.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/legal/contributor-agreement.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/legal/privacy.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/anthropic.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/azure.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/bedrock.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/cohere.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/deepseek.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/gemini.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/github.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/groq.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/lm-studio.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/ollama.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/openai-compat.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/openai.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/openrouter.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/other.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/vertex.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/warnings.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/xai.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/more/analytics.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/more/edit-formats.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/more/infinite-output.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/more-info.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/repomap.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/scripting.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/troubleshooting/cecli-not-found.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/troubleshooting/edit-errors.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/troubleshooting/imports.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/troubleshooting/models-and-keys.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/troubleshooting/support.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/troubleshooting/token-limits.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/troubleshooting/warnings.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/troubleshooting.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/commands.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/conventions.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/copypaste.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/images-urls.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/lint-test.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/modes.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/not-code.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/notifications.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/sessions.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/tips.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/voice.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/watch.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/share/index.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli_dev.egg-info/dependency_links.txt +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli_dev.egg-info/entry_points.txt +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli_dev.egg-info/requires.txt +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli_dev.egg-info/top_level.txt +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/docker/Dockerfile +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/docker/Dockerfile.local.nvidia.cuda.ubuntu +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/pyproject.toml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/pytest.ini +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/common-constraints.txt +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/requirements-dev.in +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/requirements-dev.txt +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/requirements-help.in +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/requirements-help.txt +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/requirements-playwright.in +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/requirements-playwright.txt +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/requirements.in +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/tree-sitter.in +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements.txt +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/30k-image.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/Dockerfile.jekyll +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/blame.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/clean_metadata.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/cost_analyzer.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/cost_calculator.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/dl_icons.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/filter-chat-mode.js +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/generate_providers.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/get_contributor_list.js +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/get_hashline.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/history_prompts.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/homepage.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/issues.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/jekyll_build.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/jekyll_run.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/logo_svg.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/pip-compile.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/recording_audio.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/redact-cast.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/rename_to_cecli.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/tmux_record.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/tsl_pack_langs.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/update-blame.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/update-docs.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/update-history.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/versionbump.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/yank-old-versions.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/setup.cfg +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/shim.pyproject.toml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/conftest.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_aws_credentials.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_background_commands.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_commands.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_custom_commands.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_deprecated.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_editblock.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_editor.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_exceptions.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_find_or_blocks.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_hashline.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_history.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_io.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_linter.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_main.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_model_info_manager.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_model_provider_manager.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_models.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_onboarding.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_plugin_manager.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_prompts.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_reasoning.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_repo.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_repomap.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_run_cmd.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_sanity_check_repo.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_scripting.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_sendchat.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_session_args.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_session_crypto.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_sessions.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_sessions_manager.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_skills.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_special.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_ssl_verification.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_udiff.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_urls.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_voice.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_watch.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_wholefile.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/coders/test_coder_switching.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/coders/test_copypaste_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/commands/test_compaction.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/commands/test_switch_agent.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/conftest.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/conversations/test_conversation_integration.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/conversations/test_conversation_system.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/chat-history-search-replace-gold.txt +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/chat-history.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/arduino/test.ino +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/bash/test.sh +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/c/test.c +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/chatito/test.chatito +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/clojure/test.clj +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/commonlisp/test.lisp +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/cpp/test.cpp +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/csharp/test.cs +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/d/test.d +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/dart/test.dart +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/elisp/test.el +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/elixir/test.ex +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/elm/test.elm +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/gleam/test.gleam +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/go/test.go +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/haskell/test.hs +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/hcl/test.tf +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/java/test.java +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/javascript/test.js +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/kotlin/test.kt +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/lua/test.lua +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/matlab/test.m +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/ocaml/test.ml +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/ocaml_interface/test.mli +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/php/test.php +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/pony/test.pony +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/properties/test.properties +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/python/test.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/ql/test.ql +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/r/test.r +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/racket/test.rkt +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/ruby/test.rb +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/rust/test.rs +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/scala/test.scala +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/solidity/test.sol +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/swift/test.swift +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/tsx/test.tsx +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/typescript/test.ts +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/udev/test.rules +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/zig/test.zig +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/sample-code-base/sample.js +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/sample-code-base/sample.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/sample-code-base-repo-map.txt +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/watch.js +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/watch.lisp +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/watch.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/watch_question.js +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/help/test_help.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/helpers/monorepo/LOCAL_WORKSPACE.md +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/helpers/monorepo/test_config.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/helpers/monorepo/test_config_active.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/helpers/monorepo/test_ignore_logic.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/helpers/monorepo/test_local_workspace.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/helpers/monorepo/test_repomap_workspace.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/helpers/monorepo/test_workspace.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/helpers/observations/test_observation_service.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/hooks/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/hooks/test_base.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/hooks/test_manager.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/hooks/test_registry.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/mcp/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/mcp/test_manager.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/scrape/test_playwright_disable.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/scrape/test_scrape.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/__init__.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/conftest.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/test_commands.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/test_config.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/test_delegate.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/test_finished.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/test_io_proxy.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/test_service.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/test_sub_agent_coder.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_extractions.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_get_lines.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_git_branch.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_git_diff.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_grep.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_read_range_execute.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_registry.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_tool_arguments.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/validations.py +0 -0
- {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/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.7rc2'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 100, 7, 'rc2')
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'g845b666e7'
|
|
@@ -153,6 +153,7 @@ class AgentCoder(Coder):
|
|
|
153
153
|
config, "skip_cli_confirmations", nested.getter(config, "yolo", [])
|
|
154
154
|
)
|
|
155
155
|
config["command_timeout"] = nested.getter(config, "command_timeout", 30)
|
|
156
|
+
config["allowed_commands"] = nested.getter(config, "allowed_commands", [])
|
|
156
157
|
config["hot_reload"] = nested.getter(config, "hot_reload", False)
|
|
157
158
|
config["allow_nested_delegation"] = nested.getter(config, "allow_nested_delegation", False)
|
|
158
159
|
|
|
@@ -1433,9 +1434,11 @@ Todo list does not exist. Please update it with the `UpdateTodoList` tool.</cont
|
|
|
1433
1434
|
content = self.io.read_text(abs_path)
|
|
1434
1435
|
if content is None or not content.strip():
|
|
1435
1436
|
return None
|
|
1437
|
+
|
|
1438
|
+
current_tasks = "\n".join(self.current_tasks)
|
|
1436
1439
|
result = '<context name="todo_list" from="agent">\n'
|
|
1437
1440
|
result += "## Current Active Tasks\n\n"
|
|
1438
|
-
result += f"```{
|
|
1441
|
+
result += f"```{current_tasks}```\n"
|
|
1439
1442
|
result += "</context>"
|
|
1440
1443
|
return result
|
|
1441
1444
|
except Exception as e:
|
|
@@ -427,6 +427,7 @@ class Coder(metaclass=UsageMeta):
|
|
|
427
427
|
self.registered_servers = {"included": set(), "excluded": set()}
|
|
428
428
|
self.interrupt_event = ThreadSafeEvent()
|
|
429
429
|
self.uuid = str(generate_unique_id())
|
|
430
|
+
self.reflected_message = None
|
|
430
431
|
|
|
431
432
|
if uuid:
|
|
432
433
|
self.uuid = str(uuid)
|
|
@@ -2560,7 +2561,9 @@ class Coder(metaclass=UsageMeta):
|
|
|
2560
2561
|
return
|
|
2561
2562
|
finally:
|
|
2562
2563
|
if self.mdstream:
|
|
2563
|
-
content_to_show =
|
|
2564
|
+
content_to_show = (
|
|
2565
|
+
"" if self.tui and self.tui() else self.live_incremental_response(True)
|
|
2566
|
+
)
|
|
2564
2567
|
self.stream_wrapper(content_to_show, final=True)
|
|
2565
2568
|
self.mdstream = None
|
|
2566
2569
|
|
|
@@ -3583,24 +3586,13 @@ class Coder(metaclass=UsageMeta):
|
|
|
3583
3586
|
except AttributeError:
|
|
3584
3587
|
reasoning_content = None
|
|
3585
3588
|
|
|
3586
|
-
if reasoning_content:
|
|
3587
|
-
if nested.getter(self.args, "show_thinking"):
|
|
3588
|
-
if not self.got_reasoning_content:
|
|
3589
|
-
text += f"<{REASONING_TAG}>\n\n"
|
|
3590
|
-
text += reasoning_content
|
|
3591
|
-
self.got_reasoning_content = True
|
|
3592
|
-
received_content = True
|
|
3593
|
-
self.token_profiler.on_token()
|
|
3594
|
-
self.io.update_spinner_suffix(reasoning_content)
|
|
3595
|
-
self.partial_response_reasoning_content += reasoning_content
|
|
3596
|
-
|
|
3597
3589
|
try:
|
|
3598
3590
|
content = chunk.choices[0].delta.content
|
|
3599
3591
|
if content:
|
|
3600
3592
|
if self.got_reasoning_content and not self.ended_reasoning_content:
|
|
3601
3593
|
text += f"\n\n</{self.reasoning_tag_name}>\n\n"
|
|
3602
|
-
self.ended_reasoning_content = True
|
|
3603
3594
|
|
|
3595
|
+
self.ended_reasoning_content = True
|
|
3604
3596
|
text += content
|
|
3605
3597
|
received_content = True
|
|
3606
3598
|
self.token_profiler.on_token()
|
|
@@ -3608,6 +3600,22 @@ class Coder(metaclass=UsageMeta):
|
|
|
3608
3600
|
except AttributeError:
|
|
3609
3601
|
pass
|
|
3610
3602
|
|
|
3603
|
+
if reasoning_content:
|
|
3604
|
+
if (
|
|
3605
|
+
nested.getter(self.args, "show_thinking")
|
|
3606
|
+
and not self.ended_reasoning_content
|
|
3607
|
+
):
|
|
3608
|
+
if not self.got_reasoning_content:
|
|
3609
|
+
text += f"<{REASONING_TAG}>\n\n"
|
|
3610
|
+
|
|
3611
|
+
text += reasoning_content
|
|
3612
|
+
self.got_reasoning_content = True
|
|
3613
|
+
received_content = True
|
|
3614
|
+
|
|
3615
|
+
self.token_profiler.on_token()
|
|
3616
|
+
self.io.update_spinner_suffix(reasoning_content)
|
|
3617
|
+
self.partial_response_reasoning_content += reasoning_content
|
|
3618
|
+
|
|
3611
3619
|
self.partial_response_content += text
|
|
3612
3620
|
|
|
3613
3621
|
chunk_index += 1
|
|
@@ -3634,6 +3642,16 @@ class Coder(metaclass=UsageMeta):
|
|
|
3634
3642
|
except (asyncio.CancelledError, KeyboardInterrupt):
|
|
3635
3643
|
raise KeyboardInterrupt
|
|
3636
3644
|
|
|
3645
|
+
if (
|
|
3646
|
+
self.show_pretty()
|
|
3647
|
+
and nested.getter(self.args, "show_thinking")
|
|
3648
|
+
and self.got_reasoning_content
|
|
3649
|
+
and not self.ended_reasoning_content
|
|
3650
|
+
):
|
|
3651
|
+
self.partial_response_content += f"\n\n</{self.reasoning_tag_name}>\n\n"
|
|
3652
|
+
content_to_show = self.live_incremental_response(False)
|
|
3653
|
+
self.stream_wrapper(content_to_show, final=False)
|
|
3654
|
+
|
|
3637
3655
|
# The Part Doing the Heavy Lifting Now
|
|
3638
3656
|
self.consolidate_chunks()
|
|
3639
3657
|
|
|
@@ -3657,6 +3675,11 @@ class Coder(metaclass=UsageMeta):
|
|
|
3657
3675
|
func_err = None
|
|
3658
3676
|
content_err = None
|
|
3659
3677
|
|
|
3678
|
+
last_chunk = self.partial_response_chunks[len(self.partial_response_chunks) - 1]
|
|
3679
|
+
if last_chunk:
|
|
3680
|
+
if getattr(last_chunk, "usage", None):
|
|
3681
|
+
response.usage = last_chunk.usage
|
|
3682
|
+
|
|
3660
3683
|
# Collect provider-specific fields from chunks to preserve them
|
|
3661
3684
|
# We need to track both by ID (primary) and index (fallback) since
|
|
3662
3685
|
# early chunks might not have IDs established yet
|
|
@@ -3848,6 +3871,7 @@ class Coder(metaclass=UsageMeta):
|
|
|
3848
3871
|
cache_hit_tokens = (
|
|
3849
3872
|
getattr(completion.usage, "prompt_cache_hit_tokens", 0)
|
|
3850
3873
|
or getattr(completion.usage, "cache_read_input_tokens", 0)
|
|
3874
|
+
or nested.getter(completion.usage, "prompt_tokens_details.cached_tokens", 0)
|
|
3851
3875
|
or 0
|
|
3852
3876
|
)
|
|
3853
3877
|
cache_write_tokens = getattr(completion.usage, "cache_creation_input_tokens", 0) or 0
|
|
@@ -159,6 +159,12 @@ class BaseCommand(ABC, metaclass=CommandMeta):
|
|
|
159
159
|
await new_coder.generate(user_message=user_msg, preproc=False)
|
|
160
160
|
coder.coder_commit_hashes = new_coder.coder_commit_hashes
|
|
161
161
|
|
|
162
|
+
# Transfer files added during the /agent (or other temp-coder) turn back to the original
|
|
163
|
+
if new_coder.abs_fnames - original_coder.abs_fnames:
|
|
164
|
+
original_coder.abs_fnames.update(new_coder.abs_fnames)
|
|
165
|
+
if new_coder.abs_read_only_fnames - original_coder.abs_read_only_fnames:
|
|
166
|
+
original_coder.abs_read_only_fnames.update(new_coder.abs_read_only_fnames)
|
|
167
|
+
|
|
162
168
|
# Clear manager and restore original state
|
|
163
169
|
ConversationService.get_manager(original_coder).initialize(
|
|
164
170
|
reset=True,
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import difflib
|
|
2
2
|
import re
|
|
3
3
|
|
|
4
|
+
from cecli.helpers.grep_ast.parsers import filename_to_lang
|
|
5
|
+
from cecli.helpers.grep_ast.tsl import get_language, get_parser
|
|
4
6
|
from cecli.helpers.hashpos.hashpos import HashPos
|
|
5
7
|
|
|
6
8
|
HASHLINE_PREFIX_RE = HashPos.HASH_PREFIX_RE
|
|
@@ -245,8 +247,13 @@ def resolve_content_to_hashline_ids(
|
|
|
245
247
|
Resolve potential line content values to proper hashline content IDs.
|
|
246
248
|
|
|
247
249
|
If start_value or end_value does not look like a content ID (hash),
|
|
248
|
-
search for the content in the original file
|
|
249
|
-
|
|
250
|
+
search for the content in the original file using substring matching.
|
|
251
|
+
|
|
252
|
+
For start_value: Only resolves if exactly one line contains it as a
|
|
253
|
+
substring (unique match).
|
|
254
|
+
|
|
255
|
+
For end_value: Resolves by finding the closest line (by position) to
|
|
256
|
+
the resolved start line that contains it as a substring.
|
|
250
257
|
|
|
251
258
|
This handles the case where LLMs return entire line content or fragments
|
|
252
259
|
instead of content IDs in edit parameters.
|
|
@@ -274,42 +281,55 @@ def resolve_content_to_hashline_ids(
|
|
|
274
281
|
except (ContentHashError, ValueError):
|
|
275
282
|
return False
|
|
276
283
|
|
|
277
|
-
def
|
|
278
|
-
|
|
279
|
-
return value
|
|
280
|
-
if _looks_like_content_id(value):
|
|
281
|
-
return value
|
|
282
|
-
|
|
283
|
-
# Value doesn't look like a content ID - try to find it as line content
|
|
284
|
-
lines = original_content.splitlines()
|
|
284
|
+
def _find_substring_matches(lines, value):
|
|
285
|
+
"""Find all line indices where the value appears as a substring."""
|
|
285
286
|
value_stripped = value.rstrip("\r\n")
|
|
287
|
+
return [i for i, line in enumerate(lines) if value_stripped in line]
|
|
286
288
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
289
|
+
def _resolve_to_hash_id(lines, idx, hp):
|
|
290
|
+
"""Generate a hash ID for the line at the given index."""
|
|
291
|
+
hash_id = hp.generate_public_id(lines[idx], idx)
|
|
292
|
+
return hash_id + "::"
|
|
291
293
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
hp = HashPos(original_content)
|
|
295
|
-
hash_id = hp.generate_public_id(lines[idx], idx)
|
|
296
|
-
return hash_id + "::"
|
|
294
|
+
lines = original_content.splitlines()
|
|
295
|
+
hp = HashPos(original_content)
|
|
297
296
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
297
|
+
# Resolve start_value first (must be unique substring match)
|
|
298
|
+
resolved_start = start_value
|
|
299
|
+
resolved_start_idx = None
|
|
301
300
|
|
|
301
|
+
if start_value is not None and not _looks_like_content_id(start_value):
|
|
302
|
+
containing_indices = _find_substring_matches(lines, start_value)
|
|
302
303
|
if len(containing_indices) == 1:
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
304
|
+
resolved_start_idx = containing_indices[0]
|
|
305
|
+
resolved_start = _resolve_to_hash_id(lines, resolved_start_idx, hp)
|
|
306
|
+
elif start_value is not None and _looks_like_content_id(start_value):
|
|
307
|
+
# Already a content ID - try to resolve it to find the line position
|
|
308
|
+
# for proximity matching with end_value
|
|
309
|
+
try:
|
|
310
|
+
normalized = normalize_hashline(start_value)
|
|
311
|
+
candidates = hp.resolve_to_lines(normalized)
|
|
312
|
+
if candidates:
|
|
313
|
+
resolved_start_idx = candidates[0]
|
|
314
|
+
except (ContentHashError, ValueError):
|
|
315
|
+
pass
|
|
307
316
|
|
|
308
|
-
|
|
309
|
-
|
|
317
|
+
# Resolve end_value based on proximity to start position
|
|
318
|
+
resolved_end = end_value
|
|
310
319
|
|
|
311
|
-
|
|
312
|
-
|
|
320
|
+
if end_value is not None and not _looks_like_content_id(end_value):
|
|
321
|
+
containing_indices = _find_substring_matches(lines, end_value)
|
|
322
|
+
if len(containing_indices) == 1:
|
|
323
|
+
# Unique match - resolve directly
|
|
324
|
+
idx = containing_indices[0]
|
|
325
|
+
resolved_end = _resolve_to_hash_id(lines, idx, hp)
|
|
326
|
+
elif len(containing_indices) > 1 and resolved_start_idx is not None:
|
|
327
|
+
# Multiple matches - pick closest to start position
|
|
328
|
+
closest_idx = min(
|
|
329
|
+
containing_indices,
|
|
330
|
+
key=lambda idx: abs(idx - resolved_start_idx),
|
|
331
|
+
)
|
|
332
|
+
resolved_end = _resolve_to_hash_id(lines, closest_idx, hp)
|
|
313
333
|
|
|
314
334
|
return resolved_start, resolved_end
|
|
315
335
|
|
|
@@ -1269,9 +1289,302 @@ def sort_ranges(op):
|
|
|
1269
1289
|
return (-start_idx, priority)
|
|
1270
1290
|
|
|
1271
1291
|
|
|
1292
|
+
def _would_create_duplicate_content(source_lines, candidate_start, candidate_end, repl_lines):
|
|
1293
|
+
"""
|
|
1294
|
+
Check if applying the edit would create duplicate adjacent content at boundaries.
|
|
1295
|
+
"""
|
|
1296
|
+
if not repl_lines:
|
|
1297
|
+
return False
|
|
1298
|
+
|
|
1299
|
+
# Check start boundary: first replacement line matches line before edit range
|
|
1300
|
+
if candidate_start > 0:
|
|
1301
|
+
line_before = source_lines[candidate_start - 1].strip()
|
|
1302
|
+
first_repl = repl_lines[0].strip()
|
|
1303
|
+
# Ensure the line actually contains text to prevent eating blank lines
|
|
1304
|
+
if line_before and line_before == first_repl:
|
|
1305
|
+
return True
|
|
1306
|
+
|
|
1307
|
+
# Check end boundary: last replacement line matches line after edit range
|
|
1308
|
+
if candidate_end < len(source_lines) - 1:
|
|
1309
|
+
line_after = source_lines[candidate_end + 1].strip()
|
|
1310
|
+
last_repl = repl_lines[-1].strip()
|
|
1311
|
+
if line_after and line_after == last_repl:
|
|
1312
|
+
return True
|
|
1313
|
+
|
|
1314
|
+
return False
|
|
1315
|
+
|
|
1316
|
+
|
|
1317
|
+
def _fix_duplicate_content_boundaries(source_lines, resolved_ops):
|
|
1318
|
+
"""
|
|
1319
|
+
Expand edit boundaries when replacement content duplicates adjacent lines.
|
|
1320
|
+
"""
|
|
1321
|
+
for resolved in resolved_ops:
|
|
1322
|
+
op = resolved["op"]
|
|
1323
|
+
if op["operation"] not in {"replace", "insert", "delete"}:
|
|
1324
|
+
continue
|
|
1325
|
+
repl_text = op.get("text", "") or ""
|
|
1326
|
+
repl_lines = repl_text.splitlines()
|
|
1327
|
+
if not repl_lines:
|
|
1328
|
+
continue
|
|
1329
|
+
|
|
1330
|
+
start_idx = resolved["start_idx"]
|
|
1331
|
+
end_idx = resolved["end_idx"]
|
|
1332
|
+
|
|
1333
|
+
# Expand start backward if first replacement line duplicates line before
|
|
1334
|
+
while start_idx > 0:
|
|
1335
|
+
line_before = source_lines[start_idx - 1].strip()
|
|
1336
|
+
first_repl = repl_lines[0].strip()
|
|
1337
|
+
if line_before and line_before == first_repl:
|
|
1338
|
+
start_idx -= 1
|
|
1339
|
+
else:
|
|
1340
|
+
break
|
|
1341
|
+
|
|
1342
|
+
# Expand end forward if last replacement line duplicates line after
|
|
1343
|
+
while end_idx < len(source_lines) - 1:
|
|
1344
|
+
line_after = source_lines[end_idx + 1].strip()
|
|
1345
|
+
last_repl = repl_lines[-1].strip()
|
|
1346
|
+
if line_after and line_after == last_repl:
|
|
1347
|
+
end_idx += 1
|
|
1348
|
+
else:
|
|
1349
|
+
break
|
|
1350
|
+
|
|
1351
|
+
resolved["start_idx"] = start_idx
|
|
1352
|
+
resolved["end_idx"] = end_idx
|
|
1353
|
+
|
|
1354
|
+
return resolved_ops
|
|
1355
|
+
|
|
1356
|
+
|
|
1357
|
+
def _apply_closure_safeguard(
|
|
1358
|
+
original_content: str,
|
|
1359
|
+
resolved_ops: list,
|
|
1360
|
+
file_path: str = None,
|
|
1361
|
+
) -> list:
|
|
1362
|
+
"""
|
|
1363
|
+
Use tree-sitter to heal edit boundaries by simulating edits and checking syntax.
|
|
1364
|
+
|
|
1365
|
+
For each replace/delete operation, this simulates applying the edit with
|
|
1366
|
+
the replacement text, parses the resulting code with tree-sitter, and
|
|
1367
|
+
checks if the result is syntactically valid (no ERROR/MISSING nodes).
|
|
1368
|
+
|
|
1369
|
+
If the edit produces invalid syntax (e.g., missing closing braces),
|
|
1370
|
+
it progressively expands/contracts the start and end boundaries by a
|
|
1371
|
+
step and re-tests until the resulting code parses correctly or the
|
|
1372
|
+
maximum number of expansion steps is exhausted.
|
|
1373
|
+
|
|
1374
|
+
This prevents the common LLM edit error of "eating" outer scope
|
|
1375
|
+
closing braces, parentheses, or brackets by finding the nearest
|
|
1376
|
+
syntactically valid edit boundary.
|
|
1377
|
+
|
|
1378
|
+
Args:
|
|
1379
|
+
original_content: Original source code (without hashlines)
|
|
1380
|
+
resolved_ops: List of resolved operation dicts with start_idx/end_idx
|
|
1381
|
+
file_path: File path to determine tree-sitter language
|
|
1382
|
+
|
|
1383
|
+
Returns:
|
|
1384
|
+
Modified resolved_ops with healed boundaries
|
|
1385
|
+
"""
|
|
1386
|
+
|
|
1387
|
+
def is_syntactically_valid(source_bytes: bytes, parser) -> bool:
|
|
1388
|
+
try:
|
|
1389
|
+
tree = parser.parse(source_bytes)
|
|
1390
|
+
return not tree.root_node.has_error
|
|
1391
|
+
except Exception:
|
|
1392
|
+
return False
|
|
1393
|
+
|
|
1394
|
+
def apply_edit(
|
|
1395
|
+
source_lines: list[str],
|
|
1396
|
+
start: int,
|
|
1397
|
+
end: int,
|
|
1398
|
+
replacement: list[str],
|
|
1399
|
+
) -> bytes:
|
|
1400
|
+
"""Applies the edit and returns the new source code as bytes."""
|
|
1401
|
+
new_lines = source_lines[:start] + replacement + source_lines[end + 1 :]
|
|
1402
|
+
return "\n".join(new_lines).encode("utf-8")
|
|
1403
|
+
|
|
1404
|
+
def count_closures(source_bytes: bytes) -> int:
|
|
1405
|
+
"""Counts the total number of brackets, braces, and parenthesis."""
|
|
1406
|
+
return sum(source_bytes.count(b) for b in b"{}[]()")
|
|
1407
|
+
|
|
1408
|
+
def get_indentation(line: str) -> int:
|
|
1409
|
+
"""Helper to safely calculate the leading whitespace of a line."""
|
|
1410
|
+
return len(line) - len(line.lstrip(" \t"))
|
|
1411
|
+
|
|
1412
|
+
if not resolved_ops or not file_path:
|
|
1413
|
+
return resolved_ops
|
|
1414
|
+
|
|
1415
|
+
# Determine language from file path
|
|
1416
|
+
lang = filename_to_lang(file_path)
|
|
1417
|
+
if not lang:
|
|
1418
|
+
return resolved_ops
|
|
1419
|
+
|
|
1420
|
+
# Set up tree-sitter parser
|
|
1421
|
+
try:
|
|
1422
|
+
language = get_language(lang) # noqa
|
|
1423
|
+
parser = get_parser(lang)
|
|
1424
|
+
except Exception:
|
|
1425
|
+
# Can't determine language, skip safeguard
|
|
1426
|
+
return resolved_ops
|
|
1427
|
+
|
|
1428
|
+
source_lines = original_content.splitlines()
|
|
1429
|
+
MAX_STEPS = 3 # Maximum expansion steps
|
|
1430
|
+
|
|
1431
|
+
for resolved in resolved_ops:
|
|
1432
|
+
op = resolved["op"]
|
|
1433
|
+
if op["operation"] not in {"replace", "insert", "delete"}:
|
|
1434
|
+
continue
|
|
1435
|
+
|
|
1436
|
+
llm_start = resolved["start_idx"]
|
|
1437
|
+
llm_end = resolved["end_idx"]
|
|
1438
|
+
|
|
1439
|
+
# Clamp to valid bounds
|
|
1440
|
+
if llm_start < 0 or llm_start >= len(source_lines):
|
|
1441
|
+
continue
|
|
1442
|
+
if llm_end < llm_start:
|
|
1443
|
+
continue
|
|
1444
|
+
|
|
1445
|
+
# Get replacement text
|
|
1446
|
+
replacement_text = op.get("text", "") or ""
|
|
1447
|
+
if op["operation"] == "delete":
|
|
1448
|
+
replacement_text = ""
|
|
1449
|
+
repl_lines = replacement_text.splitlines()
|
|
1450
|
+
|
|
1451
|
+
# Clamp end to valid range
|
|
1452
|
+
llm_end = min(llm_end, len(source_lines) - 1)
|
|
1453
|
+
|
|
1454
|
+
# --- THE HEALING LOOP ---
|
|
1455
|
+
# Try original bounds first (distance 0), then progressively expand
|
|
1456
|
+
# outward in rounds. At each round d>=1, test exactly 4 candidates:
|
|
1457
|
+
# 1. Both indices down by d lines (range shifts down)
|
|
1458
|
+
# 2. Both indices up by d lines (range shifts up)
|
|
1459
|
+
# 3. Start index down by d lines, end unchanged (partial expansion)
|
|
1460
|
+
# 4. End index down by d lines, start unchanged (partial expansion)
|
|
1461
|
+
#
|
|
1462
|
+
# If multiple candidates are valid at a round, select using:
|
|
1463
|
+
# 1. Longest resulting source code (preserve more code)
|
|
1464
|
+
# 2. Partial expansions over full range shifts
|
|
1465
|
+
# 3. Downward changes over upward changes
|
|
1466
|
+
|
|
1467
|
+
found_valid = False
|
|
1468
|
+
EFFECTIVE_STEPS = MAX_STEPS
|
|
1469
|
+
|
|
1470
|
+
if llm_start == llm_end:
|
|
1471
|
+
EFFECTIVE_STEPS = 1
|
|
1472
|
+
|
|
1473
|
+
for distance in range(EFFECTIVE_STEPS + 1):
|
|
1474
|
+
if distance == 0:
|
|
1475
|
+
round_candidates = [(0, 0)]
|
|
1476
|
+
else:
|
|
1477
|
+
round_candidates = [
|
|
1478
|
+
(-distance, 0), # Start down only (partial)
|
|
1479
|
+
(+distance, 0), # Start up only (partial)
|
|
1480
|
+
(0, +distance), # End down only (partial)
|
|
1481
|
+
(0, -distance), # End up only (partial)
|
|
1482
|
+
(-distance, +distance), # Both indices down
|
|
1483
|
+
(+distance, -distance), # Both indices up
|
|
1484
|
+
(+distance, +distance), # Expand outward (start up, end down)
|
|
1485
|
+
(-distance, -distance), # Contract inward (start down, end up)
|
|
1486
|
+
]
|
|
1487
|
+
|
|
1488
|
+
valid_at_round = []
|
|
1489
|
+
for start_shift, end_shift in round_candidates:
|
|
1490
|
+
candidate_start = max(0, llm_start - start_shift)
|
|
1491
|
+
candidate_end = min(len(source_lines) - 1, llm_end + end_shift)
|
|
1492
|
+
|
|
1493
|
+
if candidate_end < candidate_start:
|
|
1494
|
+
continue
|
|
1495
|
+
|
|
1496
|
+
# Skip candidates that would create duplicate adjacent content at edit boundaries
|
|
1497
|
+
if _would_create_duplicate_content(
|
|
1498
|
+
source_lines, candidate_start, candidate_end, repl_lines
|
|
1499
|
+
):
|
|
1500
|
+
continue
|
|
1501
|
+
|
|
1502
|
+
test_source = apply_edit(
|
|
1503
|
+
source_lines,
|
|
1504
|
+
candidate_start,
|
|
1505
|
+
candidate_end,
|
|
1506
|
+
repl_lines,
|
|
1507
|
+
)
|
|
1508
|
+
|
|
1509
|
+
if is_syntactically_valid(test_source, parser):
|
|
1510
|
+
# Determine properties for tiebreaking
|
|
1511
|
+
is_partial = (start_shift == 0) ^ (end_shift == 0) # XOR: exactly one is zero
|
|
1512
|
+
is_downward = start_shift <= 0 # Negative/zero shift = moving down
|
|
1513
|
+
is_both = start_shift == end_shift # Whole range expansion/contraction
|
|
1514
|
+
closures = count_closures(test_source)
|
|
1515
|
+
|
|
1516
|
+
# --- INDENTATION SCORING ---
|
|
1517
|
+
indent_score = 0
|
|
1518
|
+
if repl_lines:
|
|
1519
|
+
# Safely grab the first and last non-empty replacement lines
|
|
1520
|
+
first_repl = next((line for line in repl_lines if line.strip()), "")
|
|
1521
|
+
last_repl = next(
|
|
1522
|
+
(line for line in reversed(repl_lines) if line.strip()), ""
|
|
1523
|
+
)
|
|
1524
|
+
|
|
1525
|
+
# Check Start Boundary Match
|
|
1526
|
+
if first_repl and candidate_start < len(source_lines):
|
|
1527
|
+
source_start_line = source_lines[candidate_start]
|
|
1528
|
+
if source_start_line.strip() and get_indentation(
|
|
1529
|
+
first_repl
|
|
1530
|
+
) == get_indentation(source_start_line):
|
|
1531
|
+
indent_score += 1
|
|
1532
|
+
|
|
1533
|
+
# Check End Boundary Match
|
|
1534
|
+
if last_repl and candidate_end < len(source_lines):
|
|
1535
|
+
source_end_line = source_lines[candidate_end]
|
|
1536
|
+
if source_end_line.strip() and get_indentation(
|
|
1537
|
+
last_repl
|
|
1538
|
+
) == get_indentation(source_end_line):
|
|
1539
|
+
indent_score += 1
|
|
1540
|
+
|
|
1541
|
+
valid_at_round.append(
|
|
1542
|
+
{
|
|
1543
|
+
"start_idx": candidate_start,
|
|
1544
|
+
"end_idx": candidate_end,
|
|
1545
|
+
"source_len": len(test_source),
|
|
1546
|
+
"is_partial": is_partial,
|
|
1547
|
+
"is_downward": is_downward,
|
|
1548
|
+
"is_both": is_both,
|
|
1549
|
+
"closure_count": closures,
|
|
1550
|
+
"indent_score": indent_score,
|
|
1551
|
+
}
|
|
1552
|
+
)
|
|
1553
|
+
|
|
1554
|
+
if valid_at_round:
|
|
1555
|
+
# Sort using the new hierarchy:
|
|
1556
|
+
# 1. Fewest total closures (minimize structural pollution)
|
|
1557
|
+
# 2. Indentation Score (Descending: 2 is better than 0)
|
|
1558
|
+
# 3. Longest source (preserve more file content)
|
|
1559
|
+
# 4. Partial expansions over full range shifts
|
|
1560
|
+
# 5. Downward changes over upward changes
|
|
1561
|
+
valid_at_round.sort(
|
|
1562
|
+
key=lambda r: (
|
|
1563
|
+
-r["indent_score"], # Descending: larger score is better (2 > 1 > 0)
|
|
1564
|
+
-r["source_len"], # Descending: larger is better
|
|
1565
|
+
r["closure_count"], # Ascending: smaller is better
|
|
1566
|
+
not r["is_partial"], # Booleans: False comes before True
|
|
1567
|
+
not r["is_downward"], # Booleans: False comes before True
|
|
1568
|
+
r["is_both"], # Booleans: False comes before True
|
|
1569
|
+
)
|
|
1570
|
+
)
|
|
1571
|
+
|
|
1572
|
+
best = valid_at_round[0]
|
|
1573
|
+
resolved["start_idx"] = best["start_idx"]
|
|
1574
|
+
resolved["end_idx"] = best["end_idx"]
|
|
1575
|
+
found_valid = True
|
|
1576
|
+
break
|
|
1577
|
+
|
|
1578
|
+
if not found_valid:
|
|
1579
|
+
pass
|
|
1580
|
+
|
|
1581
|
+
return resolved_ops
|
|
1582
|
+
|
|
1583
|
+
|
|
1272
1584
|
def apply_hashline_operations(
|
|
1273
1585
|
original_content: str,
|
|
1274
1586
|
operations: list,
|
|
1587
|
+
file_path: str = None,
|
|
1275
1588
|
) -> tuple[str, list, list]:
|
|
1276
1589
|
"""
|
|
1277
1590
|
Apply multiple hashline operations sequentially.
|
|
@@ -1308,6 +1621,13 @@ def apply_hashline_operations(
|
|
|
1308
1621
|
|
|
1309
1622
|
if not normalized_operations:
|
|
1310
1623
|
return original_content, [], failed_ops
|
|
1624
|
+
# Convert insert operations without @000 marker to inclusive replace operations
|
|
1625
|
+
for op in normalized_operations:
|
|
1626
|
+
if op["operation"] == "insert":
|
|
1627
|
+
start_hash_fragment, _, _ = parse_hashline(op["start_line_hash"])
|
|
1628
|
+
if start_hash_fragment != "@000" and start_hash_fragment != "000@":
|
|
1629
|
+
op["operation"] = "replace"
|
|
1630
|
+
op["end_line_hash"] = op["start_line_hash"]
|
|
1311
1631
|
|
|
1312
1632
|
# Apply hashline to original content once
|
|
1313
1633
|
# This converts content to hashed lines for line tracking
|
|
@@ -1334,12 +1654,6 @@ def apply_hashline_operations(
|
|
|
1334
1654
|
hashed_lines, start_hash_fragment, start_line_num_str
|
|
1335
1655
|
)
|
|
1336
1656
|
|
|
1337
|
-
# if found_start is None:
|
|
1338
|
-
# # Fall back to fragment matching if exact match fails
|
|
1339
|
-
# found_start = find_hashline_by_fragment(
|
|
1340
|
-
# hashed_lines, start_hash_fragment, start_line_num
|
|
1341
|
-
# )
|
|
1342
|
-
|
|
1343
1657
|
if found_start is None:
|
|
1344
1658
|
raise ContentHashError(
|
|
1345
1659
|
f"Start line hash fragment '{start_hash_fragment}' not found in file"
|
|
@@ -1407,8 +1721,14 @@ def apply_hashline_operations(
|
|
|
1407
1721
|
resolved_ops = _merged_contained_ranges(resolved_ops)
|
|
1408
1722
|
# Merge contiguous replace operations
|
|
1409
1723
|
resolved_ops = _merge_replace_operations(resolved_ops)
|
|
1410
|
-
|
|
1411
|
-
|
|
1724
|
+
if file_path:
|
|
1725
|
+
# Apply tree-sitter based closure safeguard to snap boundaries to AST nodes
|
|
1726
|
+
resolved_ops = _apply_closure_safeguard(original_content, resolved_ops, file_path)
|
|
1727
|
+
|
|
1728
|
+
# Fix edit boundaries where replacement content duplicates adjacent lines
|
|
1729
|
+
source_lines = original_content.splitlines()
|
|
1730
|
+
resolved_ops = _fix_duplicate_content_boundaries(source_lines, resolved_ops)
|
|
1731
|
+
|
|
1412
1732
|
# Sort by start_idx descending to apply from bottom to top
|
|
1413
1733
|
# When operations have same start_idx, apply in order: insert, replace, delete
|
|
1414
1734
|
# This ensures correct behavior when multiple operations target the same line
|
|
@@ -1470,8 +1790,22 @@ def apply_hashline_operations(
|
|
|
1470
1790
|
# end_idx, replacement_lines = _apply_end_stitching(
|
|
1471
1791
|
# hashed_lines, start_idx, end_idx, replacement_lines, max_overlap_check
|
|
1472
1792
|
# )
|
|
1793
|
+
# Preserve empty lines after the edit range
|
|
1794
|
+
# If there is an empty line immediately after the edit boundary,
|
|
1795
|
+
# track it so it can be restored if consumed by the replacement
|
|
1796
|
+
next_idx = end_idx + 1
|
|
1797
|
+
preserve_trailing_empty = (
|
|
1798
|
+
next_idx < len(hashed_lines) and hashed_lines[next_idx].strip() == ""
|
|
1799
|
+
)
|
|
1473
1800
|
|
|
1474
1801
|
hashed_lines[start_idx : end_idx + 1] = replacement_lines
|
|
1802
|
+
|
|
1803
|
+
# Ensure the trailing empty line is preserved after replacement
|
|
1804
|
+
if preserve_trailing_empty:
|
|
1805
|
+
check_idx = start_idx + len(replacement_lines)
|
|
1806
|
+
if check_idx >= len(hashed_lines) or hashed_lines[check_idx].strip() != "":
|
|
1807
|
+
hashed_lines.insert(check_idx, "\n")
|
|
1808
|
+
|
|
1475
1809
|
else:
|
|
1476
1810
|
# Empty text - replace with nothing (delete)
|
|
1477
1811
|
hashed_lines[start_idx : end_idx + 1] = []
|