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.
Files changed (677) hide show
  1. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/PKG-INFO +1 -1
  2. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/_version.py +3 -3
  3. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/agent_coder.py +4 -1
  4. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/base_coder.py +37 -13
  5. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/utils/base_command.py +6 -0
  6. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/hashline.py +372 -38
  7. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/reasoning_tags.py +18 -1
  8. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/_yield.py +4 -1
  9. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/command.py +9 -0
  10. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/command_interactive.py +13 -1
  11. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/edit_text.py +4 -1
  12. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/read_range.py +1 -1
  13. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/agent-mode.md +2 -0
  14. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/skills.md +1 -0
  15. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli_dev.egg-info/PKG-INFO +1 -1
  16. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli_dev.egg-info/SOURCES.txt +1 -0
  17. cecli_dev-0.100.7rc2/tests/basic/test_hashline_closure.py +423 -0
  18. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_insert_block.py +5 -4
  19. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.dockerignore +0 -0
  20. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.flake8 +0 -0
  21. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.gitattributes +0 -0
  22. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/ISSUE_TEMPLATE/issue.yml +0 -0
  23. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/check_pypi_version.yml +0 -0
  24. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/docker-build-test.yml +0 -0
  25. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/docker-release.yml +0 -0
  26. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/issues.yml +0 -0
  27. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/pages.yml +0 -0
  28. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/pre-commit.yml +0 -0
  29. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/release.yml +0 -0
  30. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/ubuntu-tests.yml +0 -0
  31. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/windows-tests.yml +0 -0
  32. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.github/workflows/windows_check_pypi_version.yml +0 -0
  33. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.gitignore +0 -0
  34. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/.pre-commit-config.yaml +0 -0
  35. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/CHANGELOG.md +0 -0
  36. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/CNAME +0 -0
  37. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/CONTRIBUTING.md +0 -0
  38. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/HISTORY.md +0 -0
  39. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/LICENSE.txt +0 -0
  40. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/MANIFEST.in +0 -0
  41. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/README.md +0 -0
  42. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/Dockerfile +0 -0
  43. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/README.md +0 -0
  44. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/__init__.py +0 -0
  45. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/benchmark.py +0 -0
  46. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/benchmark_classic.py +0 -0
  47. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/clone-exercism.sh +0 -0
  48. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/cpp-test.sh +0 -0
  49. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/docker.sh +0 -0
  50. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/docker_build.sh +0 -0
  51. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/install-docker-ubuntu.sh +0 -0
  52. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/npm-test.sh +0 -0
  53. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/over_time.py +0 -0
  54. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/plot.sh +0 -0
  55. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/plots.py +0 -0
  56. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/problem_stats.py +0 -0
  57. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/prompts.py +0 -0
  58. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/refactor_tools.py +0 -0
  59. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/rsync.sh +0 -0
  60. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/rungrid.py +0 -0
  61. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/swe-bench-lite.txt +0 -0
  62. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/swe-bench.txt +0 -0
  63. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/swe_bench.py +0 -0
  64. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/test_benchmark.py +0 -0
  65. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/variations.1.sh +0 -0
  66. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/variations.2.sh +0 -0
  67. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/variations.3.sh +0 -0
  68. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/benchmark/variations.4.sh +0 -0
  69. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/__init__.py +0 -0
  70. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/__main__.py +0 -0
  71. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/args.py +0 -0
  72. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/args_formatter.py +0 -0
  73. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/change_tracker.py +0 -0
  74. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/__init__.py +0 -0
  75. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/architect_coder.py +0 -0
  76. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/ask_coder.py +0 -0
  77. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/chat_chunks.py +0 -0
  78. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/context_coder.py +0 -0
  79. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/copypaste_coder.py +0 -0
  80. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/editblock_coder.py +0 -0
  81. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/editblock_fenced_coder.py +0 -0
  82. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/editblock_func_coder.py +0 -0
  83. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/editor_diff_fenced_coder.py +0 -0
  84. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/editor_editblock_coder.py +0 -0
  85. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/editor_whole_coder.py +0 -0
  86. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/hashline_coder.py +0 -0
  87. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/help_coder.py +0 -0
  88. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/patch_coder.py +0 -0
  89. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/search_replace.py +0 -0
  90. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/shell.py +0 -0
  91. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/single_wholefile_func_coder.py +0 -0
  92. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/sub_agent_coder.py +0 -0
  93. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/udiff_coder.py +0 -0
  94. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/udiff_simple.py +0 -0
  95. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/wholefile_coder.py +0 -0
  96. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/coders/wholefile_func_coder.py +0 -0
  97. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/__init__.py +0 -0
  98. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/add.py +0 -0
  99. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/agent.py +0 -0
  100. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/agent_model.py +0 -0
  101. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/architect.py +0 -0
  102. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/ask.py +0 -0
  103. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/chat_mode.py +0 -0
  104. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/clear.py +0 -0
  105. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/code.py +0 -0
  106. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/command_prefix.py +0 -0
  107. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/commit.py +0 -0
  108. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/compact.py +0 -0
  109. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/context.py +0 -0
  110. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/context_blocks.py +0 -0
  111. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/context_management.py +0 -0
  112. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/copy.py +0 -0
  113. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/copy_context.py +0 -0
  114. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/core.py +0 -0
  115. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/diff.py +0 -0
  116. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/drop.py +0 -0
  117. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/editor.py +0 -0
  118. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/editor_model.py +0 -0
  119. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/exclude_skill.py +0 -0
  120. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/exit.py +0 -0
  121. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/git.py +0 -0
  122. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/hashline.py +0 -0
  123. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/help.py +0 -0
  124. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/history_search.py +0 -0
  125. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/hooks.py +0 -0
  126. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/include_skill.py +0 -0
  127. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/lint.py +0 -0
  128. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/list_sessions.py +0 -0
  129. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/list_skills.py +0 -0
  130. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/load.py +0 -0
  131. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/load_hook.py +0 -0
  132. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/load_mcp.py +0 -0
  133. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/load_session.py +0 -0
  134. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/load_skill.py +0 -0
  135. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/ls.py +0 -0
  136. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/map.py +0 -0
  137. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/map_refresh.py +0 -0
  138. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/merge.py +0 -0
  139. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/model.py +0 -0
  140. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/models.py +0 -0
  141. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/multiline_mode.py +0 -0
  142. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/paste.py +0 -0
  143. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/quit.py +0 -0
  144. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/read_only.py +0 -0
  145. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/read_only_stub.py +0 -0
  146. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/reap_agent.py +0 -0
  147. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/reasoning_effort.py +0 -0
  148. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/remove_hook.py +0 -0
  149. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/remove_mcp.py +0 -0
  150. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/remove_skill.py +0 -0
  151. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/report.py +0 -0
  152. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/reset.py +0 -0
  153. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/rules.py +0 -0
  154. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/run.py +0 -0
  155. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/save.py +0 -0
  156. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/save_session.py +0 -0
  157. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/settings.py +0 -0
  158. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/spawn_agent.py +0 -0
  159. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/switch_agent.py +0 -0
  160. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/terminal_data/linux.keytab +0 -0
  161. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/terminal_setup.py +0 -0
  162. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/test.py +0 -0
  163. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/think_tokens.py +0 -0
  164. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/tokens.py +0 -0
  165. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/undo.py +0 -0
  166. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/utils/__init__.py +0 -0
  167. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/utils/helpers.py +0 -0
  168. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/utils/registry.py +0 -0
  169. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/utils/save_load_manager.py +0 -0
  170. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/voice.py +0 -0
  171. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/weak_model.py +0 -0
  172. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/web.py +0 -0
  173. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/commands/workspace.py +0 -0
  174. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/deprecated_args.py +0 -0
  175. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/diffs.py +0 -0
  176. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/dump.py +0 -0
  177. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/editor.py +0 -0
  178. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/exceptions.py +0 -0
  179. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/format_settings.py +0 -0
  180. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/help.py +0 -0
  181. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/help_pats.py +0 -0
  182. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/__init__.py +0 -0
  183. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/agents/__init__.py +0 -0
  184. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/agents/config.py +0 -0
  185. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/agents/service.py +0 -0
  186. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/background_commands.py +0 -0
  187. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/command_parser.py +0 -0
  188. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/conversation/__init__.py +0 -0
  189. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/conversation/base_message.py +0 -0
  190. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/conversation/files.py +0 -0
  191. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/conversation/integration.py +0 -0
  192. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/conversation/manager.py +0 -0
  193. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/conversation/service.py +0 -0
  194. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/conversation/tags.py +0 -0
  195. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/conversation/utils.py +0 -0
  196. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/copypaste.py +0 -0
  197. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/coroutines.py +0 -0
  198. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/crypto.py +0 -0
  199. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/file_searcher.py +0 -0
  200. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/file_system/__init__.py +0 -0
  201. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/file_system/builders.py +0 -0
  202. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/file_system/ignore.py +0 -0
  203. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/file_system/ngram_index.py +0 -0
  204. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/file_system/service.py +0 -0
  205. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/file_system/trie_index.py +0 -0
  206. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/grep_ast/__init__.py +0 -0
  207. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/grep_ast/dump.py +0 -0
  208. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/grep_ast/grep_ast.py +0 -0
  209. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/grep_ast/main.py +0 -0
  210. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/grep_ast/parsers.py +0 -0
  211. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/grep_ast/tsl.py +0 -0
  212. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/hashpos/__init__.py +0 -0
  213. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/hashpos/hashpos.py +0 -0
  214. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/hashpos/hashpos.v1.bak +0 -0
  215. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/io_proxy.py +0 -0
  216. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/leak_detect.py +0 -0
  217. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/model_providers.py +0 -0
  218. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/monorepo/__init__.py +0 -0
  219. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/monorepo/config.py +0 -0
  220. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/monorepo/local_workspace.py +0 -0
  221. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/monorepo/project.py +0 -0
  222. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/monorepo/workspace.py +0 -0
  223. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/monorepo/worktree.py +0 -0
  224. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/nested.py +0 -0
  225. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/observations/__init__.py +0 -0
  226. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/observations/service.py +0 -0
  227. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/plugin_manager.py +0 -0
  228. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/profiler.py +0 -0
  229. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/requests.py +0 -0
  230. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/responses.py +0 -0
  231. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/similarity.py +0 -0
  232. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/skills.py +0 -0
  233. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/helpers/threading.py +0 -0
  234. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/history.py +0 -0
  235. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/hooks/__init__.py +0 -0
  236. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/hooks/base.py +0 -0
  237. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/hooks/integration.py +0 -0
  238. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/hooks/manager.py +0 -0
  239. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/hooks/registry.py +0 -0
  240. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/hooks/service.py +0 -0
  241. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/hooks/types.py +0 -0
  242. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/interruptible_input.py +0 -0
  243. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/io.py +0 -0
  244. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/linter.py +0 -0
  245. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/llm.py +0 -0
  246. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/main.py +0 -0
  247. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/mcp/__init__.py +0 -0
  248. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/mcp/manager.py +0 -0
  249. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/mcp/oauth.py +0 -0
  250. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/mcp/server.py +0 -0
  251. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/mcp/utils.py +0 -0
  252. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/mdstream.py +0 -0
  253. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/models.py +0 -0
  254. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/onboarding.py +0 -0
  255. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/__init__.py +0 -0
  256. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/agent.yml +0 -0
  257. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/architect.yml +0 -0
  258. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/ask.yml +0 -0
  259. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/base.yml +0 -0
  260. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/context.yml +0 -0
  261. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/copypaste.yml +0 -0
  262. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/editblock.yml +0 -0
  263. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/editblock_fenced.yml +0 -0
  264. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/editblock_func.yml +0 -0
  265. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/editor_diff_fenced.yml +0 -0
  266. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/editor_editblock.yml +0 -0
  267. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/editor_whole.yml +0 -0
  268. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/hashline.yml +0 -0
  269. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/help.yml +0 -0
  270. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/patch.yml +0 -0
  271. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/single_wholefile_func.yml +0 -0
  272. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/subagent.yml +0 -0
  273. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/udiff.yml +0 -0
  274. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/udiff_simple.yml +0 -0
  275. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/utils/__init__.py +0 -0
  276. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/utils/registry.py +0 -0
  277. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/utils/system.py +0 -0
  278. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/wholefile.yml +0 -0
  279. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/prompts/wholefile_func.yml +0 -0
  280. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/README.md +0 -0
  281. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
  282. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/bash-tags.scm +0 -0
  283. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/c-tags.scm +0 -0
  284. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
  285. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/clojure-tags.scm +0 -0
  286. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
  287. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
  288. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
  289. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/d-tags.scm +0 -0
  290. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
  291. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
  292. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
  293. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
  294. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
  295. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/go-tags.scm +0 -0
  296. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/java-tags.scm +0 -0
  297. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
  298. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
  299. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/matlab-tags.scm +0 -0
  300. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/ocaml-tags.scm +0 -0
  301. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/ocaml_interface-tags.scm +0 -0
  302. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
  303. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
  304. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/python-tags.scm +0 -0
  305. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/r-tags.scm +0 -0
  306. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
  307. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
  308. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
  309. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
  310. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
  311. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
  312. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/README.md +0 -0
  313. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/bash-tags.scm +0 -0
  314. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/c-tags.scm +0 -0
  315. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
  316. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/cpp-tags.scm +0 -0
  317. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/dart-tags.scm +0 -0
  318. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/elisp-tags.scm +0 -0
  319. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/elixir-tags.scm +0 -0
  320. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/elm-tags.scm +0 -0
  321. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/fortran-tags.scm +0 -0
  322. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/go-tags.scm +0 -0
  323. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/haskell-tags.scm +0 -0
  324. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/hcl-tags.scm +0 -0
  325. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/java-tags.scm +0 -0
  326. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/javascript-tags.scm +0 -0
  327. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/julia-tags.scm +0 -0
  328. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
  329. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/matlab-tags.scm +0 -0
  330. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
  331. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/ocaml_interface-tags.scm +0 -0
  332. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/php-tags.scm +0 -0
  333. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/python-tags.scm +0 -0
  334. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/ql-tags.scm +0 -0
  335. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/ruby-tags.scm +0 -0
  336. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/rust-tags.scm +0 -0
  337. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/scala-tags.scm +0 -0
  338. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/typescript-tags.scm +0 -0
  339. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/queries/tree-sitter-languages/zig-tags.scm +0 -0
  340. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/repo.py +0 -0
  341. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/repomap.py +0 -0
  342. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/report.py +0 -0
  343. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/resources/__init__.py +0 -0
  344. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/resources/model-metadata.json +0 -0
  345. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/resources/model-settings.yml +0 -0
  346. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/resources/providers.json +0 -0
  347. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/run_cmd.py +0 -0
  348. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/scrape.py +0 -0
  349. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/sendchat.py +0 -0
  350. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/sessions.py +0 -0
  351. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/special.py +0 -0
  352. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/__init__.py +0 -0
  353. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/context_manager.py +0 -0
  354. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/delegate.py +0 -0
  355. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/explore_code.py +0 -0
  356. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/git_branch.py +0 -0
  357. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/git_diff.py +0 -0
  358. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/git_log.py +0 -0
  359. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/git_remote.py +0 -0
  360. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/git_show.py +0 -0
  361. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/git_status.py +0 -0
  362. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/grep.py +0 -0
  363. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/load_skill.py +0 -0
  364. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/ls.py +0 -0
  365. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/remove_skill.py +0 -0
  366. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/thinking.py +0 -0
  367. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/undo_change.py +0 -0
  368. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/update_todo_list.py +0 -0
  369. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/utils/base_tool.py +0 -0
  370. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/utils/helpers.py +0 -0
  371. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/utils/output.py +0 -0
  372. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/utils/registry.py +0 -0
  373. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/validations/__init__.py +0 -0
  374. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tools/validations/validations.py +0 -0
  375. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/__init__.py +0 -0
  376. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/app.py +0 -0
  377. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/io.py +0 -0
  378. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/styles.tcss +0 -0
  379. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/__init__.py +0 -0
  380. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/completion_bar.py +0 -0
  381. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/file_list.py +0 -0
  382. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/footer.py +0 -0
  383. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/input_area.py +0 -0
  384. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/input_container.py +0 -0
  385. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/key_hints.py +0 -0
  386. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/output.py +0 -0
  387. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/status_bar.py +0 -0
  388. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/widgets/subagent_pills.py +0 -0
  389. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/tui/worker.py +0 -0
  390. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/urls.py +0 -0
  391. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/utils.py +0 -0
  392. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/versioncheck.py +0 -0
  393. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/voice.py +0 -0
  394. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/waiting.py +0 -0
  395. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/watch.py +0 -0
  396. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/watch_prompts.py +0 -0
  397. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/Gemfile +0 -0
  398. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/blame.md +0 -0
  399. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/get-started.md +0 -0
  400. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/help-tip.md +0 -0
  401. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/help.md +0 -0
  402. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/install.md +0 -0
  403. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/keys.md +0 -0
  404. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/model-warnings.md +0 -0
  405. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/multi-line.md +0 -0
  406. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/python-m-aider.md +0 -0
  407. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/recording.css +0 -0
  408. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/recording.md +0 -0
  409. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_includes/works-best.md +0 -0
  410. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_features.scss +0 -0
  411. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_footer.scss +0 -0
  412. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_hero.scss +0 -0
  413. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_info.scss +0 -0
  414. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_layout.scss +0 -0
  415. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_reset.scss +0 -0
  416. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_testimonials.scss +0 -0
  417. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_typography.scss +0 -0
  418. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/_variables.scss +0 -0
  419. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/custom/custom.scss +0 -0
  420. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/_sass/global-overrides.scss +0 -0
  421. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/adv-model-settings.md +0 -0
  422. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/aider_conf.md +0 -0
  423. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/api-keys.md +0 -0
  424. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/custom-commands.md +0 -0
  425. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/custom-system-prompts.md +0 -0
  426. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/dotenv.md +0 -0
  427. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/editor.md +0 -0
  428. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/hooks.md +0 -0
  429. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/mcp.md +0 -0
  430. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/model-aliases.md +0 -0
  431. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/model-configuration.md +0 -0
  432. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/options.md +0 -0
  433. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/reasoning.md +0 -0
  434. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/security.md +0 -0
  435. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/subagents.md +0 -0
  436. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/tui.md +0 -0
  437. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config/workspaces.md +0 -0
  438. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/config.md +0 -0
  439. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/faq.md +0 -0
  440. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/git.md +0 -0
  441. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/index.md +0 -0
  442. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/install/docker.md +0 -0
  443. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/install/optional.md +0 -0
  444. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/install.md +0 -0
  445. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/languages.md +0 -0
  446. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/legal/contributor-agreement.md +0 -0
  447. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/legal/privacy.md +0 -0
  448. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/anthropic.md +0 -0
  449. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/azure.md +0 -0
  450. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/bedrock.md +0 -0
  451. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/cohere.md +0 -0
  452. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/deepseek.md +0 -0
  453. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/gemini.md +0 -0
  454. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/github.md +0 -0
  455. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/groq.md +0 -0
  456. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/lm-studio.md +0 -0
  457. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/ollama.md +0 -0
  458. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/openai-compat.md +0 -0
  459. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/openai.md +0 -0
  460. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/openrouter.md +0 -0
  461. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/other.md +0 -0
  462. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/vertex.md +0 -0
  463. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/warnings.md +0 -0
  464. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms/xai.md +0 -0
  465. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/llms.md +0 -0
  466. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/more/analytics.md +0 -0
  467. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/more/edit-formats.md +0 -0
  468. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/more/infinite-output.md +0 -0
  469. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/more-info.md +0 -0
  470. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/repomap.md +0 -0
  471. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/scripting.md +0 -0
  472. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/troubleshooting/cecli-not-found.md +0 -0
  473. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/troubleshooting/edit-errors.md +0 -0
  474. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/troubleshooting/imports.md +0 -0
  475. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/troubleshooting/models-and-keys.md +0 -0
  476. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/troubleshooting/support.md +0 -0
  477. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/troubleshooting/token-limits.md +0 -0
  478. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/troubleshooting/warnings.md +0 -0
  479. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/troubleshooting.md +0 -0
  480. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/commands.md +0 -0
  481. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/conventions.md +0 -0
  482. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/copypaste.md +0 -0
  483. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/images-urls.md +0 -0
  484. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/lint-test.md +0 -0
  485. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/modes.md +0 -0
  486. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/not-code.md +0 -0
  487. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/notifications.md +0 -0
  488. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/sessions.md +0 -0
  489. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/tips.md +0 -0
  490. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/voice.md +0 -0
  491. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage/watch.md +0 -0
  492. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/docs/usage.md +0 -0
  493. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli/website/share/index.md +0 -0
  494. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli_dev.egg-info/dependency_links.txt +0 -0
  495. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli_dev.egg-info/entry_points.txt +0 -0
  496. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli_dev.egg-info/requires.txt +0 -0
  497. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/cecli_dev.egg-info/top_level.txt +0 -0
  498. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/docker/Dockerfile +0 -0
  499. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/docker/Dockerfile.local.nvidia.cuda.ubuntu +0 -0
  500. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/pyproject.toml +0 -0
  501. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/pytest.ini +0 -0
  502. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/common-constraints.txt +0 -0
  503. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/requirements-dev.in +0 -0
  504. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/requirements-dev.txt +0 -0
  505. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/requirements-help.in +0 -0
  506. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/requirements-help.txt +0 -0
  507. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/requirements-playwright.in +0 -0
  508. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/requirements-playwright.txt +0 -0
  509. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/requirements.in +0 -0
  510. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements/tree-sitter.in +0 -0
  511. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/requirements.txt +0 -0
  512. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/30k-image.py +0 -0
  513. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/Dockerfile.jekyll +0 -0
  514. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/__init__.py +0 -0
  515. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/blame.py +0 -0
  516. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/clean_metadata.py +0 -0
  517. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/cost_analyzer.py +0 -0
  518. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/cost_calculator.py +0 -0
  519. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/dl_icons.py +0 -0
  520. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/filter-chat-mode.js +0 -0
  521. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/generate_providers.py +0 -0
  522. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/get_contributor_list.js +0 -0
  523. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/get_hashline.py +0 -0
  524. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/history_prompts.py +0 -0
  525. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/homepage.py +0 -0
  526. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/issues.py +0 -0
  527. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/jekyll_build.sh +0 -0
  528. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/jekyll_run.sh +0 -0
  529. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/logo_svg.py +0 -0
  530. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/pip-compile.sh +0 -0
  531. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/recording_audio.py +0 -0
  532. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/redact-cast.py +0 -0
  533. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/rename_to_cecli.py +0 -0
  534. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/tmux_record.sh +0 -0
  535. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/tsl_pack_langs.py +0 -0
  536. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/update-blame.sh +0 -0
  537. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/update-docs.sh +0 -0
  538. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/update-history.py +0 -0
  539. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/versionbump.py +0 -0
  540. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/scripts/yank-old-versions.py +0 -0
  541. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/setup.cfg +0 -0
  542. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/shim.pyproject.toml +0 -0
  543. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/__init__.py +0 -0
  544. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/__init__.py +0 -0
  545. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/conftest.py +0 -0
  546. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_aws_credentials.py +0 -0
  547. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_background_commands.py +0 -0
  548. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_coder.py +0 -0
  549. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_commands.py +0 -0
  550. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_custom_commands.py +0 -0
  551. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_deprecated.py +0 -0
  552. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_editblock.py +0 -0
  553. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_editor.py +0 -0
  554. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_exceptions.py +0 -0
  555. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_find_or_blocks.py +0 -0
  556. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_hashline.py +0 -0
  557. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_history.py +0 -0
  558. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_io.py +0 -0
  559. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_linter.py +0 -0
  560. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_main.py +0 -0
  561. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_model_info_manager.py +0 -0
  562. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_model_provider_manager.py +0 -0
  563. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_models.py +0 -0
  564. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_onboarding.py +0 -0
  565. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_plugin_manager.py +0 -0
  566. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_prompts.py +0 -0
  567. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_reasoning.py +0 -0
  568. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_repo.py +0 -0
  569. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_repomap.py +0 -0
  570. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_run_cmd.py +0 -0
  571. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_sanity_check_repo.py +0 -0
  572. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_scripting.py +0 -0
  573. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_sendchat.py +0 -0
  574. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_session_args.py +0 -0
  575. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_session_crypto.py +0 -0
  576. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_sessions.py +0 -0
  577. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_sessions_manager.py +0 -0
  578. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_skills.py +0 -0
  579. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_special.py +0 -0
  580. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_ssl_verification.py +0 -0
  581. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_udiff.py +0 -0
  582. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_urls.py +0 -0
  583. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_voice.py +0 -0
  584. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_watch.py +0 -0
  585. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/basic/test_wholefile.py +0 -0
  586. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/coders/test_coder_switching.py +0 -0
  587. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/coders/test_copypaste_coder.py +0 -0
  588. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/commands/test_compaction.py +0 -0
  589. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/commands/test_switch_agent.py +0 -0
  590. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/conftest.py +0 -0
  591. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/conversations/test_conversation_integration.py +0 -0
  592. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/conversations/test_conversation_system.py +0 -0
  593. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/chat-history-search-replace-gold.txt +0 -0
  594. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/chat-history.md +0 -0
  595. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/arduino/test.ino +0 -0
  596. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/bash/test.sh +0 -0
  597. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/c/test.c +0 -0
  598. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/chatito/test.chatito +0 -0
  599. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/clojure/test.clj +0 -0
  600. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/commonlisp/test.lisp +0 -0
  601. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/cpp/test.cpp +0 -0
  602. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/csharp/test.cs +0 -0
  603. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/d/test.d +0 -0
  604. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/dart/test.dart +0 -0
  605. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/elisp/test.el +0 -0
  606. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/elixir/test.ex +0 -0
  607. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/elm/test.elm +0 -0
  608. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/gleam/test.gleam +0 -0
  609. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/go/test.go +0 -0
  610. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/haskell/test.hs +0 -0
  611. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/hcl/test.tf +0 -0
  612. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/java/test.java +0 -0
  613. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/javascript/test.js +0 -0
  614. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/kotlin/test.kt +0 -0
  615. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/lua/test.lua +0 -0
  616. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/matlab/test.m +0 -0
  617. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/ocaml/test.ml +0 -0
  618. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/ocaml_interface/test.mli +0 -0
  619. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/php/test.php +0 -0
  620. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/pony/test.pony +0 -0
  621. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/properties/test.properties +0 -0
  622. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/python/test.py +0 -0
  623. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/ql/test.ql +0 -0
  624. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/r/test.r +0 -0
  625. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/racket/test.rkt +0 -0
  626. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/ruby/test.rb +0 -0
  627. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/rust/test.rs +0 -0
  628. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/scala/test.scala +0 -0
  629. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/solidity/test.sol +0 -0
  630. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/swift/test.swift +0 -0
  631. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/tsx/test.tsx +0 -0
  632. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/typescript/test.ts +0 -0
  633. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/udev/test.rules +0 -0
  634. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/languages/zig/test.zig +0 -0
  635. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/sample-code-base/sample.js +0 -0
  636. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/sample-code-base/sample.py +0 -0
  637. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/sample-code-base-repo-map.txt +0 -0
  638. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/watch.js +0 -0
  639. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/watch.lisp +0 -0
  640. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/watch.py +0 -0
  641. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/fixtures/watch_question.js +0 -0
  642. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/help/test_help.py +0 -0
  643. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/helpers/monorepo/LOCAL_WORKSPACE.md +0 -0
  644. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/helpers/monorepo/test_config.py +0 -0
  645. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/helpers/monorepo/test_config_active.py +0 -0
  646. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/helpers/monorepo/test_ignore_logic.py +0 -0
  647. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/helpers/monorepo/test_local_workspace.py +0 -0
  648. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/helpers/monorepo/test_repomap_workspace.py +0 -0
  649. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/helpers/monorepo/test_workspace.py +0 -0
  650. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/helpers/observations/test_observation_service.py +0 -0
  651. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/hooks/__init__.py +0 -0
  652. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/hooks/test_base.py +0 -0
  653. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/hooks/test_manager.py +0 -0
  654. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/hooks/test_registry.py +0 -0
  655. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/mcp/__init__.py +0 -0
  656. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/mcp/test_manager.py +0 -0
  657. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/scrape/test_playwright_disable.py +0 -0
  658. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/scrape/test_scrape.py +0 -0
  659. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/__init__.py +0 -0
  660. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/conftest.py +0 -0
  661. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/test_commands.py +0 -0
  662. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/test_config.py +0 -0
  663. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/test_delegate.py +0 -0
  664. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/test_finished.py +0 -0
  665. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/test_io_proxy.py +0 -0
  666. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/test_service.py +0 -0
  667. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/subagents/test_sub_agent_coder.py +0 -0
  668. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_extractions.py +0 -0
  669. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_get_lines.py +0 -0
  670. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_git_branch.py +0 -0
  671. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_git_diff.py +0 -0
  672. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_grep.py +0 -0
  673. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_read_range_execute.py +0 -0
  674. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_registry.py +0 -0
  675. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/test_tool_arguments.py +0 -0
  676. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tools/validations.py +0 -0
  677. {cecli_dev-0.100.6rc8 → cecli_dev-0.100.7rc2}/tests/tui/test_app.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cecli-dev
3
- Version: 0.100.6rc8
3
+ Version: 0.100.7rc2
4
4
  Summary: we also can't pronounce cecli
5
5
  Project-URL: Homepage, https://github.com/dwash96/cecli
6
6
  Project-URL: Documentation, https://github.com/dwash96/cecli
@@ -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.6rc8'
22
- __version_tuple__ = version_tuple = (0, 100, 6, 'rc8')
21
+ __version__ = version = '0.100.7rc2'
22
+ __version_tuple__ = version_tuple = (0, 100, 7, 'rc2')
23
23
 
24
- __commit_id__ = commit_id = 'g2da275a7a'
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"```{"\n".join(self.current_tasks)}```\n"
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 = self.live_incremental_response(True)
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. If found exactly once,
249
- return the hash ID for that line instead.
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 _resolve_value(value: str) -> str:
278
- if value is None:
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
- # First try exact match (full line content)
288
- matching_indices = [
289
- i for i, line in enumerate(lines) if line.rstrip("\r\n") == value_stripped
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
- if len(matching_indices) == 1:
293
- idx = matching_indices[0]
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
- # If no exact match, try substring match (value might be a fragment)
299
- # Only resolve if exactly one line contains the value
300
- containing_indices = [i for i, line in enumerate(lines) if value_stripped in line]
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
- idx = containing_indices[0]
304
- hp = HashPos(original_content)
305
- hash_id = hp.generate_public_id(lines[idx], idx)
306
- return hash_id + "::"
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
- # Can't resolve uniquely - return original value
309
- return value
317
+ # Resolve end_value based on proximity to start position
318
+ resolved_end = end_value
310
319
 
311
- resolved_start = _resolve_value(start_value)
312
- resolved_end = _resolve_value(end_value) if end_value is not None else end_value
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
- # Apply content-aware range expansion/shifting for replace operations
1411
- # resolved_ops = _apply_range_shifting(hashed_lines, resolved_ops)
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] = []