cecli-dev 0.100.5__tar.gz → 0.100.6rc2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (676) hide show
  1. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/PKG-INFO +1 -1
  2. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/_version.py +3 -3
  3. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/args.py +4 -1
  4. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/args_formatter.py +10 -0
  5. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/agent_coder.py +1 -1
  6. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/base_coder.py +48 -3
  7. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/core.py +2 -2
  8. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/conversation/files.py +6 -3
  9. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/coroutines.py +3 -1
  10. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/hashline.py +26 -109
  11. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/hashpos/hashpos.py +4 -6
  12. cecli_dev-0.100.6rc2/cecli/helpers/threading.py +46 -0
  13. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/io.py +2 -1
  14. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/linter.py +2 -1
  15. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/mcp/server.py +26 -6
  16. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/agent.yml +2 -2
  17. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/hashline.yml +1 -1
  18. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/_yield.py +2 -1
  19. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/edit_text.py +7 -7
  20. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/grep.py +4 -14
  21. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/read_range.py +141 -83
  22. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/validations/validations.py +103 -11
  23. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli_dev.egg-info/PKG-INFO +1 -1
  24. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli_dev.egg-info/SOURCES.txt +2 -0
  25. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/test_get_lines.py +10 -10
  26. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/test_insert_block.py +1 -1
  27. cecli_dev-0.100.6rc2/tests/tools/test_read_range_execute.py +554 -0
  28. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/validations.py +206 -0
  29. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.dockerignore +0 -0
  30. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.flake8 +0 -0
  31. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.gitattributes +0 -0
  32. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/ISSUE_TEMPLATE/issue.yml +0 -0
  33. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/check_pypi_version.yml +0 -0
  34. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/docker-build-test.yml +0 -0
  35. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/docker-release.yml +0 -0
  36. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/issues.yml +0 -0
  37. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/pages.yml +0 -0
  38. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/pre-commit.yml +0 -0
  39. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/release.yml +0 -0
  40. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/ubuntu-tests.yml +0 -0
  41. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/windows-tests.yml +0 -0
  42. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.github/workflows/windows_check_pypi_version.yml +0 -0
  43. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.gitignore +0 -0
  44. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/.pre-commit-config.yaml +0 -0
  45. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/CHANGELOG.md +0 -0
  46. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/CNAME +0 -0
  47. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/CONTRIBUTING.md +0 -0
  48. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/HISTORY.md +0 -0
  49. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/LICENSE.txt +0 -0
  50. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/MANIFEST.in +0 -0
  51. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/README.md +0 -0
  52. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/Dockerfile +0 -0
  53. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/README.md +0 -0
  54. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/__init__.py +0 -0
  55. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/benchmark.py +0 -0
  56. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/benchmark_classic.py +0 -0
  57. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/clone-exercism.sh +0 -0
  58. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/cpp-test.sh +0 -0
  59. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/docker.sh +0 -0
  60. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/docker_build.sh +0 -0
  61. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/install-docker-ubuntu.sh +0 -0
  62. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/npm-test.sh +0 -0
  63. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/over_time.py +0 -0
  64. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/plot.sh +0 -0
  65. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/plots.py +0 -0
  66. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/problem_stats.py +0 -0
  67. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/prompts.py +0 -0
  68. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/refactor_tools.py +0 -0
  69. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/rsync.sh +0 -0
  70. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/rungrid.py +0 -0
  71. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/swe-bench-lite.txt +0 -0
  72. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/swe-bench.txt +0 -0
  73. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/swe_bench.py +0 -0
  74. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/test_benchmark.py +0 -0
  75. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/variations.1.sh +0 -0
  76. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/variations.2.sh +0 -0
  77. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/variations.3.sh +0 -0
  78. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/benchmark/variations.4.sh +0 -0
  79. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/__init__.py +0 -0
  80. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/__main__.py +0 -0
  81. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/change_tracker.py +0 -0
  82. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/__init__.py +0 -0
  83. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/architect_coder.py +0 -0
  84. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/ask_coder.py +0 -0
  85. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/chat_chunks.py +0 -0
  86. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/context_coder.py +0 -0
  87. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/copypaste_coder.py +0 -0
  88. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/editblock_coder.py +0 -0
  89. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/editblock_fenced_coder.py +0 -0
  90. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/editblock_func_coder.py +0 -0
  91. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/editor_diff_fenced_coder.py +0 -0
  92. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/editor_editblock_coder.py +0 -0
  93. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/editor_whole_coder.py +0 -0
  94. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/hashline_coder.py +0 -0
  95. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/help_coder.py +0 -0
  96. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/patch_coder.py +0 -0
  97. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/search_replace.py +0 -0
  98. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/shell.py +0 -0
  99. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/single_wholefile_func_coder.py +0 -0
  100. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/sub_agent_coder.py +0 -0
  101. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/udiff_coder.py +0 -0
  102. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/udiff_simple.py +0 -0
  103. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/wholefile_coder.py +0 -0
  104. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/coders/wholefile_func_coder.py +0 -0
  105. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/__init__.py +0 -0
  106. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/add.py +0 -0
  107. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/agent.py +0 -0
  108. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/agent_model.py +0 -0
  109. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/architect.py +0 -0
  110. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/ask.py +0 -0
  111. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/chat_mode.py +0 -0
  112. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/clear.py +0 -0
  113. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/code.py +0 -0
  114. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/command_prefix.py +0 -0
  115. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/commit.py +0 -0
  116. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/compact.py +0 -0
  117. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/context.py +0 -0
  118. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/context_blocks.py +0 -0
  119. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/context_management.py +0 -0
  120. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/copy.py +0 -0
  121. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/copy_context.py +0 -0
  122. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/diff.py +0 -0
  123. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/drop.py +0 -0
  124. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/editor.py +0 -0
  125. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/editor_model.py +0 -0
  126. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/exclude_skill.py +0 -0
  127. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/exit.py +0 -0
  128. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/git.py +0 -0
  129. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/hashline.py +0 -0
  130. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/help.py +0 -0
  131. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/history_search.py +0 -0
  132. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/hooks.py +0 -0
  133. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/include_skill.py +0 -0
  134. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/lint.py +0 -0
  135. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/list_sessions.py +0 -0
  136. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/list_skills.py +0 -0
  137. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/load.py +0 -0
  138. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/load_hook.py +0 -0
  139. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/load_mcp.py +0 -0
  140. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/load_session.py +0 -0
  141. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/load_skill.py +0 -0
  142. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/ls.py +0 -0
  143. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/map.py +0 -0
  144. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/map_refresh.py +0 -0
  145. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/merge.py +0 -0
  146. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/model.py +0 -0
  147. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/models.py +0 -0
  148. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/multiline_mode.py +0 -0
  149. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/paste.py +0 -0
  150. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/quit.py +0 -0
  151. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/read_only.py +0 -0
  152. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/read_only_stub.py +0 -0
  153. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/reap_agent.py +0 -0
  154. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/reasoning_effort.py +0 -0
  155. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/remove_hook.py +0 -0
  156. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/remove_mcp.py +0 -0
  157. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/remove_skill.py +0 -0
  158. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/report.py +0 -0
  159. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/reset.py +0 -0
  160. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/rules.py +0 -0
  161. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/run.py +0 -0
  162. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/save.py +0 -0
  163. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/save_session.py +0 -0
  164. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/settings.py +0 -0
  165. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/spawn_agent.py +0 -0
  166. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/switch_agent.py +0 -0
  167. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/terminal_data/linux.keytab +0 -0
  168. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/terminal_setup.py +0 -0
  169. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/test.py +0 -0
  170. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/think_tokens.py +0 -0
  171. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/tokens.py +0 -0
  172. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/undo.py +0 -0
  173. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/utils/__init__.py +0 -0
  174. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/utils/base_command.py +0 -0
  175. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/utils/helpers.py +0 -0
  176. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/utils/registry.py +0 -0
  177. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/utils/save_load_manager.py +0 -0
  178. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/voice.py +0 -0
  179. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/weak_model.py +0 -0
  180. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/web.py +0 -0
  181. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/commands/workspace.py +0 -0
  182. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/deprecated_args.py +0 -0
  183. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/diffs.py +0 -0
  184. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/dump.py +0 -0
  185. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/editor.py +0 -0
  186. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/exceptions.py +0 -0
  187. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/format_settings.py +0 -0
  188. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/help.py +0 -0
  189. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/help_pats.py +0 -0
  190. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/__init__.py +0 -0
  191. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/agents/__init__.py +0 -0
  192. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/agents/config.py +0 -0
  193. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/agents/service.py +0 -0
  194. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/background_commands.py +0 -0
  195. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/command_parser.py +0 -0
  196. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/conversation/__init__.py +0 -0
  197. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/conversation/base_message.py +0 -0
  198. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/conversation/integration.py +0 -0
  199. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/conversation/manager.py +0 -0
  200. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/conversation/service.py +0 -0
  201. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/conversation/tags.py +0 -0
  202. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/conversation/utils.py +0 -0
  203. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/copypaste.py +0 -0
  204. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/crypto.py +0 -0
  205. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/file_searcher.py +0 -0
  206. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/file_system/__init__.py +0 -0
  207. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/file_system/builders.py +0 -0
  208. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/file_system/ignore.py +0 -0
  209. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/file_system/ngram_index.py +0 -0
  210. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/file_system/service.py +0 -0
  211. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/file_system/trie_index.py +0 -0
  212. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/grep_ast/__init__.py +0 -0
  213. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/grep_ast/dump.py +0 -0
  214. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/grep_ast/grep_ast.py +0 -0
  215. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/grep_ast/main.py +0 -0
  216. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/grep_ast/parsers.py +0 -0
  217. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/grep_ast/tsl.py +0 -0
  218. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/hashpos/__init__.py +0 -0
  219. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/hashpos/hashpos.v1.bak +0 -0
  220. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/io_proxy.py +0 -0
  221. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/leak_detect.py +0 -0
  222. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/model_providers.py +0 -0
  223. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/monorepo/__init__.py +0 -0
  224. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/monorepo/config.py +0 -0
  225. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/monorepo/local_workspace.py +0 -0
  226. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/monorepo/project.py +0 -0
  227. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/monorepo/workspace.py +0 -0
  228. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/monorepo/worktree.py +0 -0
  229. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/nested.py +0 -0
  230. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/observations/__init__.py +0 -0
  231. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/observations/service.py +0 -0
  232. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/plugin_manager.py +0 -0
  233. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/profiler.py +0 -0
  234. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/requests.py +0 -0
  235. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/responses.py +0 -0
  236. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/similarity.py +0 -0
  237. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/helpers/skills.py +0 -0
  238. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/history.py +0 -0
  239. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/hooks/__init__.py +0 -0
  240. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/hooks/base.py +0 -0
  241. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/hooks/integration.py +0 -0
  242. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/hooks/manager.py +0 -0
  243. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/hooks/registry.py +0 -0
  244. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/hooks/service.py +0 -0
  245. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/hooks/types.py +0 -0
  246. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/interruptible_input.py +0 -0
  247. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/llm.py +0 -0
  248. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/main.py +0 -0
  249. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/mcp/__init__.py +0 -0
  250. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/mcp/manager.py +0 -0
  251. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/mcp/oauth.py +0 -0
  252. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/mcp/utils.py +0 -0
  253. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/mdstream.py +0 -0
  254. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/models.py +0 -0
  255. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/onboarding.py +0 -0
  256. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/__init__.py +0 -0
  257. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/architect.yml +0 -0
  258. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/ask.yml +0 -0
  259. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/base.yml +0 -0
  260. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/context.yml +0 -0
  261. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/copypaste.yml +0 -0
  262. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/editblock.yml +0 -0
  263. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/editblock_fenced.yml +0 -0
  264. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/editblock_func.yml +0 -0
  265. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/editor_diff_fenced.yml +0 -0
  266. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/editor_editblock.yml +0 -0
  267. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/editor_whole.yml +0 -0
  268. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/help.yml +0 -0
  269. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/patch.yml +0 -0
  270. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/single_wholefile_func.yml +0 -0
  271. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/subagent.yml +0 -0
  272. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/udiff.yml +0 -0
  273. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/udiff_simple.yml +0 -0
  274. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/utils/__init__.py +0 -0
  275. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/utils/registry.py +0 -0
  276. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/utils/system.py +0 -0
  277. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/wholefile.yml +0 -0
  278. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/prompts/wholefile_func.yml +0 -0
  279. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/README.md +0 -0
  280. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
  281. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/bash-tags.scm +0 -0
  282. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/c-tags.scm +0 -0
  283. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
  284. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/clojure-tags.scm +0 -0
  285. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
  286. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
  287. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
  288. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/d-tags.scm +0 -0
  289. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
  290. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
  291. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
  292. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
  293. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
  294. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/go-tags.scm +0 -0
  295. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/java-tags.scm +0 -0
  296. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
  297. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
  298. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/matlab-tags.scm +0 -0
  299. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/ocaml-tags.scm +0 -0
  300. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/ocaml_interface-tags.scm +0 -0
  301. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
  302. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
  303. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/python-tags.scm +0 -0
  304. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/r-tags.scm +0 -0
  305. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
  306. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
  307. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
  308. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
  309. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
  310. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
  311. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/README.md +0 -0
  312. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/bash-tags.scm +0 -0
  313. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/c-tags.scm +0 -0
  314. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
  315. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/cpp-tags.scm +0 -0
  316. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/dart-tags.scm +0 -0
  317. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/elisp-tags.scm +0 -0
  318. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/elixir-tags.scm +0 -0
  319. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/elm-tags.scm +0 -0
  320. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/fortran-tags.scm +0 -0
  321. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/go-tags.scm +0 -0
  322. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/haskell-tags.scm +0 -0
  323. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/hcl-tags.scm +0 -0
  324. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/java-tags.scm +0 -0
  325. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/javascript-tags.scm +0 -0
  326. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/julia-tags.scm +0 -0
  327. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
  328. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/matlab-tags.scm +0 -0
  329. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
  330. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/ocaml_interface-tags.scm +0 -0
  331. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/php-tags.scm +0 -0
  332. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/python-tags.scm +0 -0
  333. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/ql-tags.scm +0 -0
  334. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/ruby-tags.scm +0 -0
  335. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/rust-tags.scm +0 -0
  336. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/scala-tags.scm +0 -0
  337. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/typescript-tags.scm +0 -0
  338. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/queries/tree-sitter-languages/zig-tags.scm +0 -0
  339. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/reasoning_tags.py +0 -0
  340. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/repo.py +0 -0
  341. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/repomap.py +0 -0
  342. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/report.py +0 -0
  343. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/resources/__init__.py +0 -0
  344. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/resources/model-metadata.json +0 -0
  345. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/resources/model-settings.yml +0 -0
  346. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/resources/providers.json +0 -0
  347. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/run_cmd.py +0 -0
  348. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/scrape.py +0 -0
  349. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/sendchat.py +0 -0
  350. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/sessions.py +0 -0
  351. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/special.py +0 -0
  352. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/__init__.py +0 -0
  353. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/command.py +0 -0
  354. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/command_interactive.py +0 -0
  355. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/context_manager.py +0 -0
  356. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/delegate.py +0 -0
  357. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/explore_code.py +0 -0
  358. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/git_branch.py +0 -0
  359. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/git_diff.py +0 -0
  360. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/git_log.py +0 -0
  361. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/git_remote.py +0 -0
  362. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/git_show.py +0 -0
  363. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/git_status.py +0 -0
  364. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/load_skill.py +0 -0
  365. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/ls.py +0 -0
  366. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/remove_skill.py +0 -0
  367. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/thinking.py +0 -0
  368. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/undo_change.py +0 -0
  369. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/update_todo_list.py +0 -0
  370. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/utils/base_tool.py +0 -0
  371. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/utils/helpers.py +0 -0
  372. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/utils/output.py +0 -0
  373. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/utils/registry.py +0 -0
  374. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tools/validations/__init__.py +0 -0
  375. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/__init__.py +0 -0
  376. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/app.py +0 -0
  377. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/io.py +0 -0
  378. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/styles.tcss +0 -0
  379. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/__init__.py +0 -0
  380. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/completion_bar.py +0 -0
  381. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/file_list.py +0 -0
  382. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/footer.py +0 -0
  383. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/input_area.py +0 -0
  384. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/input_container.py +0 -0
  385. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/key_hints.py +0 -0
  386. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/output.py +0 -0
  387. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/status_bar.py +0 -0
  388. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/widgets/subagent_pills.py +0 -0
  389. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/tui/worker.py +0 -0
  390. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/urls.py +0 -0
  391. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/utils.py +0 -0
  392. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/versioncheck.py +0 -0
  393. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/voice.py +0 -0
  394. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/waiting.py +0 -0
  395. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/watch.py +0 -0
  396. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/watch_prompts.py +0 -0
  397. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/Gemfile +0 -0
  398. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/blame.md +0 -0
  399. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/get-started.md +0 -0
  400. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/help-tip.md +0 -0
  401. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/help.md +0 -0
  402. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/install.md +0 -0
  403. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/keys.md +0 -0
  404. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/model-warnings.md +0 -0
  405. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/multi-line.md +0 -0
  406. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/python-m-aider.md +0 -0
  407. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/recording.css +0 -0
  408. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/recording.md +0 -0
  409. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_includes/works-best.md +0 -0
  410. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_features.scss +0 -0
  411. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_footer.scss +0 -0
  412. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_hero.scss +0 -0
  413. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_info.scss +0 -0
  414. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_layout.scss +0 -0
  415. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_reset.scss +0 -0
  416. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_testimonials.scss +0 -0
  417. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_typography.scss +0 -0
  418. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/_variables.scss +0 -0
  419. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/custom/custom.scss +0 -0
  420. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/_sass/global-overrides.scss +0 -0
  421. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/adv-model-settings.md +0 -0
  422. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/agent-mode.md +0 -0
  423. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/aider_conf.md +0 -0
  424. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/api-keys.md +0 -0
  425. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/custom-commands.md +0 -0
  426. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/custom-system-prompts.md +0 -0
  427. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/dotenv.md +0 -0
  428. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/editor.md +0 -0
  429. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/hooks.md +0 -0
  430. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/mcp.md +0 -0
  431. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/model-aliases.md +0 -0
  432. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/model-configuration.md +0 -0
  433. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/options.md +0 -0
  434. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/reasoning.md +0 -0
  435. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/security.md +0 -0
  436. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/skills.md +0 -0
  437. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/subagents.md +0 -0
  438. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/tui.md +0 -0
  439. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config/workspaces.md +0 -0
  440. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/config.md +0 -0
  441. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/faq.md +0 -0
  442. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/git.md +0 -0
  443. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/index.md +0 -0
  444. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/install/docker.md +0 -0
  445. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/install/optional.md +0 -0
  446. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/install.md +0 -0
  447. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/languages.md +0 -0
  448. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/legal/contributor-agreement.md +0 -0
  449. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/legal/privacy.md +0 -0
  450. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/anthropic.md +0 -0
  451. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/azure.md +0 -0
  452. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/bedrock.md +0 -0
  453. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/cohere.md +0 -0
  454. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/deepseek.md +0 -0
  455. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/gemini.md +0 -0
  456. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/github.md +0 -0
  457. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/groq.md +0 -0
  458. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/lm-studio.md +0 -0
  459. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/ollama.md +0 -0
  460. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/openai-compat.md +0 -0
  461. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/openai.md +0 -0
  462. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/openrouter.md +0 -0
  463. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/other.md +0 -0
  464. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/vertex.md +0 -0
  465. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/warnings.md +0 -0
  466. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms/xai.md +0 -0
  467. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/llms.md +0 -0
  468. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/more/analytics.md +0 -0
  469. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/more/edit-formats.md +0 -0
  470. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/more/infinite-output.md +0 -0
  471. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/more-info.md +0 -0
  472. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/repomap.md +0 -0
  473. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/scripting.md +0 -0
  474. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/troubleshooting/cecli-not-found.md +0 -0
  475. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/troubleshooting/edit-errors.md +0 -0
  476. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/troubleshooting/imports.md +0 -0
  477. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/troubleshooting/models-and-keys.md +0 -0
  478. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/troubleshooting/support.md +0 -0
  479. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/troubleshooting/token-limits.md +0 -0
  480. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/troubleshooting/warnings.md +0 -0
  481. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/troubleshooting.md +0 -0
  482. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/commands.md +0 -0
  483. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/conventions.md +0 -0
  484. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/copypaste.md +0 -0
  485. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/images-urls.md +0 -0
  486. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/lint-test.md +0 -0
  487. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/modes.md +0 -0
  488. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/not-code.md +0 -0
  489. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/notifications.md +0 -0
  490. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/sessions.md +0 -0
  491. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/tips.md +0 -0
  492. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/voice.md +0 -0
  493. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage/watch.md +0 -0
  494. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/docs/usage.md +0 -0
  495. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli/website/share/index.md +0 -0
  496. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli_dev.egg-info/dependency_links.txt +0 -0
  497. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli_dev.egg-info/entry_points.txt +0 -0
  498. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli_dev.egg-info/requires.txt +0 -0
  499. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/cecli_dev.egg-info/top_level.txt +0 -0
  500. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/docker/Dockerfile +0 -0
  501. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/docker/Dockerfile.local.nvidia.cuda.ubuntu +0 -0
  502. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/pyproject.toml +0 -0
  503. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/pytest.ini +0 -0
  504. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/common-constraints.txt +0 -0
  505. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/requirements-dev.in +0 -0
  506. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/requirements-dev.txt +0 -0
  507. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/requirements-help.in +0 -0
  508. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/requirements-help.txt +0 -0
  509. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/requirements-playwright.in +0 -0
  510. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/requirements-playwright.txt +0 -0
  511. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/requirements.in +0 -0
  512. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements/tree-sitter.in +0 -0
  513. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/requirements.txt +0 -0
  514. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/30k-image.py +0 -0
  515. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/Dockerfile.jekyll +0 -0
  516. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/__init__.py +0 -0
  517. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/blame.py +0 -0
  518. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/clean_metadata.py +0 -0
  519. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/cost_analyzer.py +0 -0
  520. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/cost_calculator.py +0 -0
  521. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/dl_icons.py +0 -0
  522. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/filter-chat-mode.js +0 -0
  523. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/generate_providers.py +0 -0
  524. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/get_contributor_list.js +0 -0
  525. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/get_hashline.py +0 -0
  526. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/history_prompts.py +0 -0
  527. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/homepage.py +0 -0
  528. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/issues.py +0 -0
  529. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/jekyll_build.sh +0 -0
  530. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/jekyll_run.sh +0 -0
  531. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/logo_svg.py +0 -0
  532. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/pip-compile.sh +0 -0
  533. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/recording_audio.py +0 -0
  534. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/redact-cast.py +0 -0
  535. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/rename_to_cecli.py +0 -0
  536. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/tmux_record.sh +0 -0
  537. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/tsl_pack_langs.py +0 -0
  538. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/update-blame.sh +0 -0
  539. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/update-docs.sh +0 -0
  540. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/update-history.py +0 -0
  541. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/versionbump.py +0 -0
  542. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/scripts/yank-old-versions.py +0 -0
  543. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/setup.cfg +0 -0
  544. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/shim.pyproject.toml +0 -0
  545. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/__init__.py +0 -0
  546. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/__init__.py +0 -0
  547. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/conftest.py +0 -0
  548. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_aws_credentials.py +0 -0
  549. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_background_commands.py +0 -0
  550. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_coder.py +0 -0
  551. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_commands.py +0 -0
  552. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_custom_commands.py +0 -0
  553. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_deprecated.py +0 -0
  554. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_editblock.py +0 -0
  555. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_editor.py +0 -0
  556. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_exceptions.py +0 -0
  557. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_find_or_blocks.py +0 -0
  558. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_hashline.py +0 -0
  559. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_history.py +0 -0
  560. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_io.py +0 -0
  561. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_linter.py +0 -0
  562. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_main.py +0 -0
  563. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_model_info_manager.py +0 -0
  564. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_model_provider_manager.py +0 -0
  565. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_models.py +0 -0
  566. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_onboarding.py +0 -0
  567. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_plugin_manager.py +0 -0
  568. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_prompts.py +0 -0
  569. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_reasoning.py +0 -0
  570. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_repo.py +0 -0
  571. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_repomap.py +0 -0
  572. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_run_cmd.py +0 -0
  573. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_sanity_check_repo.py +0 -0
  574. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_scripting.py +0 -0
  575. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_sendchat.py +0 -0
  576. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_session_args.py +0 -0
  577. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_session_crypto.py +0 -0
  578. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_sessions.py +0 -0
  579. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_sessions_manager.py +0 -0
  580. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_skills.py +0 -0
  581. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_special.py +0 -0
  582. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_ssl_verification.py +0 -0
  583. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_udiff.py +0 -0
  584. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_urls.py +0 -0
  585. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_voice.py +0 -0
  586. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_watch.py +0 -0
  587. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/basic/test_wholefile.py +0 -0
  588. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/coders/test_coder_switching.py +0 -0
  589. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/coders/test_copypaste_coder.py +0 -0
  590. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/commands/test_compaction.py +0 -0
  591. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/commands/test_switch_agent.py +0 -0
  592. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/conftest.py +0 -0
  593. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/conversations/test_conversation_integration.py +0 -0
  594. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/conversations/test_conversation_system.py +0 -0
  595. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/chat-history-search-replace-gold.txt +0 -0
  596. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/chat-history.md +0 -0
  597. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/arduino/test.ino +0 -0
  598. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/bash/test.sh +0 -0
  599. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/c/test.c +0 -0
  600. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/chatito/test.chatito +0 -0
  601. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/clojure/test.clj +0 -0
  602. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/commonlisp/test.lisp +0 -0
  603. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/cpp/test.cpp +0 -0
  604. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/csharp/test.cs +0 -0
  605. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/d/test.d +0 -0
  606. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/dart/test.dart +0 -0
  607. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/elisp/test.el +0 -0
  608. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/elixir/test.ex +0 -0
  609. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/elm/test.elm +0 -0
  610. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/gleam/test.gleam +0 -0
  611. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/go/test.go +0 -0
  612. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/haskell/test.hs +0 -0
  613. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/hcl/test.tf +0 -0
  614. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/java/test.java +0 -0
  615. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/javascript/test.js +0 -0
  616. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/kotlin/test.kt +0 -0
  617. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/lua/test.lua +0 -0
  618. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/matlab/test.m +0 -0
  619. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/ocaml/test.ml +0 -0
  620. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/ocaml_interface/test.mli +0 -0
  621. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/php/test.php +0 -0
  622. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/pony/test.pony +0 -0
  623. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/properties/test.properties +0 -0
  624. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/python/test.py +0 -0
  625. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/ql/test.ql +0 -0
  626. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/r/test.r +0 -0
  627. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/racket/test.rkt +0 -0
  628. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/ruby/test.rb +0 -0
  629. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/rust/test.rs +0 -0
  630. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/scala/test.scala +0 -0
  631. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/solidity/test.sol +0 -0
  632. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/swift/test.swift +0 -0
  633. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/tsx/test.tsx +0 -0
  634. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/typescript/test.ts +0 -0
  635. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/udev/test.rules +0 -0
  636. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/languages/zig/test.zig +0 -0
  637. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/sample-code-base/sample.js +0 -0
  638. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/sample-code-base/sample.py +0 -0
  639. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/sample-code-base-repo-map.txt +0 -0
  640. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/watch.js +0 -0
  641. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/watch.lisp +0 -0
  642. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/watch.py +0 -0
  643. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/fixtures/watch_question.js +0 -0
  644. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/help/test_help.py +0 -0
  645. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/helpers/monorepo/LOCAL_WORKSPACE.md +0 -0
  646. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/helpers/monorepo/test_config.py +0 -0
  647. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/helpers/monorepo/test_config_active.py +0 -0
  648. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/helpers/monorepo/test_ignore_logic.py +0 -0
  649. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/helpers/monorepo/test_local_workspace.py +0 -0
  650. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/helpers/monorepo/test_repomap_workspace.py +0 -0
  651. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/helpers/monorepo/test_workspace.py +0 -0
  652. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/helpers/observations/test_observation_service.py +0 -0
  653. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/hooks/__init__.py +0 -0
  654. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/hooks/test_base.py +0 -0
  655. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/hooks/test_manager.py +0 -0
  656. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/hooks/test_registry.py +0 -0
  657. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/mcp/__init__.py +0 -0
  658. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/mcp/test_manager.py +0 -0
  659. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/scrape/test_playwright_disable.py +0 -0
  660. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/scrape/test_scrape.py +0 -0
  661. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/__init__.py +0 -0
  662. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/conftest.py +0 -0
  663. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/test_commands.py +0 -0
  664. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/test_config.py +0 -0
  665. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/test_delegate.py +0 -0
  666. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/test_finished.py +0 -0
  667. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/test_io_proxy.py +0 -0
  668. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/test_service.py +0 -0
  669. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/subagents/test_sub_agent_coder.py +0 -0
  670. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/test_extractions.py +0 -0
  671. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/test_git_branch.py +0 -0
  672. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/test_git_diff.py +0 -0
  673. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/test_grep.py +0 -0
  674. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/test_registry.py +0 -0
  675. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/tests/tools/test_tool_arguments.py +0 -0
  676. {cecli_dev-0.100.5 → cecli_dev-0.100.6rc2}/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.5
3
+ Version: 0.100.6rc2
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.5'
22
- __version_tuple__ = version_tuple = (0, 100, 5)
21
+ __version__ = version = '0.100.6rc2'
22
+ __version_tuple__ = version_tuple = (0, 100, 6, 'rc2')
23
23
 
24
- __commit_id__ = commit_id = 'g525f9aba5'
24
+ __commit_id__ = commit_id = 'g2be4b1f66'
@@ -276,7 +276,10 @@ def get_parser(default_config_files, git_root):
276
276
  group.add_argument(
277
277
  "--retries",
278
278
  metavar="RETRIES_JSON",
279
- help="Specify LLM retry configuration as a JSON string",
279
+ help=(
280
+ 'Specify LLM retry configuration as a JSON/YAML string (e.g., \'{"retry_on_empty": '
281
+ "true}')"
282
+ ),
280
283
  default=None,
281
284
  )
282
285
 
@@ -132,6 +132,16 @@ class YamlHelpFormatter(argparse.HelpFormatter):
132
132
  break
133
133
  switch = switch.lstrip("-")
134
134
 
135
+ if switch == "retries":
136
+ parts.append(f"## {action.help}")
137
+ parts.append("#retries:")
138
+ parts.append("# retry-timeout: 60")
139
+ parts.append("# retry-backoff-factor: 2.0")
140
+ parts.append("# retry-on-unavailable: true")
141
+ parts.append("# retry-on-empty: false")
142
+ parts.append("")
143
+ return "\n".join(parts)
144
+
135
145
  if isinstance(action, argparse._StoreTrueAction):
136
146
  default = False
137
147
  elif isinstance(action, argparse._StoreConstAction):
@@ -1115,7 +1115,7 @@ class AgentCoder(Coder):
1115
1115
  context_parts.append("## File Editing Tools Disabled")
1116
1116
  context_parts.append(
1117
1117
  "File editing tools are currently disabled. Use `ReadRange` to determine the"
1118
- " current content hash prefixes needed to perform an edit and activate them when"
1118
+ " current content ID prefixes needed to perform an edit and activate them when"
1119
1119
  " you are ready to edit a file."
1120
1120
  )
1121
1121
 
@@ -46,6 +46,7 @@ from cecli.helpers.file_system import FileSystemService
46
46
  from cecli.helpers.io_proxy import IOProxy
47
47
  from cecli.helpers.observations.service import ObservationService
48
48
  from cecli.helpers.profiler import TokenProfiler
49
+ from cecli.helpers.threading import ThreadSafeEvent
49
50
  from cecli.history import ChatSummary
50
51
  from cecli.hooks import HookIntegration
51
52
  from cecli.io import ConfirmGroup, InputOutput
@@ -91,6 +92,10 @@ class FinishReasonLength(Exception):
91
92
  pass
92
93
 
93
94
 
95
+ class EmptyResponseError(Exception):
96
+ pass
97
+
98
+
94
99
  def wrap_fence(name):
95
100
  return f"<{name}>", f"</{name}>"
96
101
 
@@ -420,7 +425,7 @@ class Coder(metaclass=UsageMeta):
420
425
  # Each contains "included" and "excluded" sets that filter from the global singletons
421
426
  self.registered_tools = {"included": set(), "excluded": set()}
422
427
  self.registered_servers = {"included": set(), "excluded": set()}
423
- self.interrupt_event = asyncio.Event()
428
+ self.interrupt_event = ThreadSafeEvent()
424
429
  self.uuid = str(generate_unique_id())
425
430
 
426
431
  if uuid:
@@ -1643,6 +1648,7 @@ class Coder(metaclass=UsageMeta):
1643
1648
 
1644
1649
  async def generate(self, user_message, preproc):
1645
1650
  await asyncio.sleep(0.1)
1651
+ self.interrupt_event.clear()
1646
1652
 
1647
1653
  try:
1648
1654
  if self.enable_context_compaction:
@@ -2402,6 +2408,39 @@ class Coder(metaclass=UsageMeta):
2402
2408
  async for chunk in self.send(messages, tools=self.get_tool_list()):
2403
2409
  yield chunk
2404
2410
  break
2411
+ except EmptyResponseError:
2412
+ self.io.tool_warning(self.empty_llm_tool_warning())
2413
+
2414
+ retry_on_empty = False
2415
+ retries_config = self.get_active_model().retries
2416
+ if isinstance(retries_config, str):
2417
+ try:
2418
+ retries_config = json.loads(retries_config)
2419
+ except json.JSONDecodeError:
2420
+ self.io.tool_warning(
2421
+ f"Could not parse retries config: {retries_config}"
2422
+ )
2423
+ retries_config = {}
2424
+ if isinstance(retries_config, dict):
2425
+ retry_on_empty = retries_config.get("retry_on_empty", False)
2426
+
2427
+ if not retry_on_empty:
2428
+ break
2429
+
2430
+ retry_delay *= 2
2431
+ if retry_delay > RETRY_TIMEOUT:
2432
+ self.io.tool_error("Retry timeout exceeded on empty response.")
2433
+ break
2434
+
2435
+ self.io.tool_output(f"Retrying in {retry_delay:.1f} seconds...")
2436
+
2437
+ _res, interrupted_sleep = await coroutines.interruptible(
2438
+ asyncio.sleep(retry_delay), self.interrupt_event
2439
+ )
2440
+ if interrupted_sleep:
2441
+ interrupted = True
2442
+ break
2443
+ continue
2405
2444
  except litellm_ex.exceptions_tuple() as err:
2406
2445
  ex_info = litellm_ex.get_ex_info(err)
2407
2446
 
@@ -3252,6 +3291,7 @@ class Coder(metaclass=UsageMeta):
3252
3291
  self.interrupt_event.clear()
3253
3292
  self.got_reasoning_content = False
3254
3293
  self.ended_reasoning_content = False
3294
+ self.empty_response = False
3255
3295
 
3256
3296
  self._streaming_buffer_length = 0
3257
3297
  self.io.reset_streaming_response()
@@ -3302,6 +3342,9 @@ class Coder(metaclass=UsageMeta):
3302
3342
  else:
3303
3343
  await self.show_send_output(completion)
3304
3344
 
3345
+ if self.empty_response:
3346
+ raise EmptyResponseError
3347
+
3305
3348
  response, func_err, content_err = self.consolidate_chunks()
3306
3349
 
3307
3350
  if response:
@@ -3382,7 +3425,8 @@ class Coder(metaclass=UsageMeta):
3382
3425
  and not len(self.partial_response_tool_calls)
3383
3426
  and not len(self.partial_response_reasoning_content)
3384
3427
  ):
3385
- self.io.tool_warning(self.empty_llm_tool_warning())
3428
+ self.empty_response = True
3429
+ return
3386
3430
 
3387
3431
  self.io.assistant_output(show_resp, pretty=self.show_pretty())
3388
3432
 
@@ -3539,7 +3583,8 @@ class Coder(metaclass=UsageMeta):
3539
3583
  return
3540
3584
 
3541
3585
  if not received_content and len(self.partial_response_tool_calls) == 0:
3542
- self.io.tool_warning(self.empty_llm_tool_warning())
3586
+ self.empty_response = True
3587
+ return
3543
3588
 
3544
3589
  def consolidate_chunks(self):
3545
3590
  if self.partial_response_consolidated:
@@ -1,4 +1,3 @@
1
- import asyncio
2
1
  import json
3
2
  import re
4
3
  import sys
@@ -7,6 +6,7 @@ from pathlib import Path
7
6
  from cecli.commands.utils.registry import CommandRegistry
8
7
  from cecli.helpers import nested, plugin_manager
9
8
  from cecli.helpers.file_searcher import handle_core_files
9
+ from cecli.helpers.threading import ThreadSafeEvent
10
10
  from cecli.repo import ANY_GIT_ERROR
11
11
 
12
12
 
@@ -94,7 +94,7 @@ class Commands:
94
94
  self.custom_commands = nested.getter(customizations, "command-paths", [])
95
95
  self._load_custom_commands(self.custom_commands)
96
96
 
97
- self.cmd_running_event = asyncio.Event()
97
+ self.cmd_running_event = ThreadSafeEvent()
98
98
  self.cmd_running_event.set()
99
99
  self.last_command_show_notification = True
100
100
 
@@ -281,14 +281,17 @@ class ConversationFiles:
281
281
  diff_message = {
282
282
  "role": "user",
283
283
  "content": (
284
- f"{rel_fname} has been updated. Here is a git diff of the changes to"
285
- f" review:\n\n{diff}"
284
+ f"{rel_fname} has been updated. Review this git diff of the changes to"
285
+ f" ensure the modifications are intended:\n\n{diff}"
286
286
  ),
287
287
  }
288
288
 
289
289
  assistant_msg = {
290
290
  "role": "assistant",
291
- "content": f"Thank you for sharing this diff of the updates to {rel_fname}.",
291
+ "content": (
292
+ f"Thank you for sharing this diff of the updates to {rel_fname}."
293
+ " I will review their contents next turn."
294
+ ),
292
295
  }
293
296
 
294
297
  ConversationService.get_manager(coder).add_message(
@@ -1,5 +1,7 @@
1
1
  import asyncio
2
2
 
3
+ from cecli.helpers.threading import ThreadSafeEvent
4
+
3
5
 
4
6
  async def interruptible_async_generator(async_generator, interrupt_event):
5
7
  """
@@ -57,7 +59,7 @@ async def interruptible(coroutine, interrupt_event):
57
59
  - If interrupted: (None, True)
58
60
  """
59
61
  if interrupt_event is None:
60
- interrupt_event = asyncio.Event()
62
+ interrupt_event = ThreadSafeEvent()
61
63
 
62
64
  main_task = asyncio.create_task(coroutine)
63
65
  interrupt_task = asyncio.create_task(interrupt_event.wait())
@@ -650,6 +650,20 @@ def _apply_start_stitching(
650
650
  # The replacement line matches the line being replaced
651
651
  # Don't stitch to a line in lines_before_range
652
652
  continue
653
+
654
+ # Require 2 consecutive matching lines to avoid false positives
655
+ # (single boilerplate lines like "import sys" or "def foo():"
656
+ # are too likely to be coincidental)
657
+ if line_idx + 1 < len(replacement_lines) and match_index + 1 < len(
658
+ lines_before_range_normalized
659
+ ):
660
+ next_repl = replacement_lines[line_idx + 1]
661
+ next_repl_stripped = strip_hashline(next_repl)
662
+ if not next_repl_stripped.endswith("\n"):
663
+ next_repl_stripped += "\n"
664
+ if next_repl_stripped != lines_before_range_normalized[match_index + 1]:
665
+ continue # Only 1 line matches — likely coincidental
666
+
653
667
  # Found a line that already exists before the range!
654
668
  # This is a non-contiguous match - we need to "stitch" the replacement
655
669
  # at this exact content match to prevent duplicate code structures
@@ -694,9 +708,9 @@ def _apply_start_stitching(
694
708
  start_idx = new_start_idx
695
709
  replacement_lines = new_replacement_lines
696
710
  else:
697
- # Can't extend backward due to overlap, but we can still truncate
698
- # the replacement text to avoid duplication
699
- replacement_lines = new_replacement_lines
711
+ # Can't extend backward due to overlap with another operation
712
+ # Don't truncate without extending that would silently lose content
713
+ continue # Try next line instead
700
714
 
701
715
  # We've found our stitching point, break out of the loop
702
716
  break
@@ -772,6 +786,15 @@ def _apply_end_stitching(
772
786
  # Check if this line exists anywhere in lines_after_range_normalized
773
787
  try:
774
788
  match_index = lines_after_range_normalized.index(replacement_line_stripped)
789
+
790
+ # Require 2 consecutive matching lines to reduce false positives
791
+ if line_idx - 1 >= 0 and match_index - 1 >= 0:
792
+ prev_repl = replacement_lines[line_idx - 1]
793
+ prev_repl_stripped = strip_hashline(prev_repl)
794
+ if not prev_repl_stripped.endswith("\n"):
795
+ prev_repl_stripped += "\n"
796
+ if prev_repl_stripped != lines_after_range_normalized[match_index - 1]:
797
+ continue # Only 1 line matches — likely coincidental
775
798
  # Found a line that already exists after the range!
776
799
  # This is a non-contiguous match - we need to "stitch" the replacement
777
800
  # at this exact content match to prevent duplicate code structures
@@ -900,109 +923,6 @@ def _apply_range_shifting(hashed_lines, resolved_ops):
900
923
  return resolved_ops
901
924
 
902
925
 
903
- # Regex configuration
904
- RE_CODE_NOISE = r'(#.*|//.*|/\*[\s\S]*?\*/|"(?:\\.|[^"\\])*"|\'(?:\\.|[^\'\\])*\')'
905
-
906
-
907
- def get_brace_balance(lines_to_check: list[str]) -> int:
908
- """
909
- Calculates the net curly brace debt of a list of lines.
910
- Automatically strips hashlines, comments, and string literals.
911
- """
912
- text = "".join(lines_to_check)
913
- clean_code = strip_hashline(text)
914
- clean_code = re.sub(RE_CODE_NOISE, "", clean_code)
915
- return clean_code.count("{") - clean_code.count("}")
916
-
917
-
918
- def _apply_closure_safeguard(hashed_lines, resolved_ops):
919
- """
920
- Enhanced closure safeguard with dynamic bidirectional search.
921
- """
922
- # Tune these to adjust how far the 'healing' logic searches
923
- MAX_LOOK_DOWN = 5
924
- # Note: We'll calculate the actual MAX_LOOK_UP per operation
925
- # to ensure we don't scan past the start_idx.
926
-
927
- for i, resolved in enumerate(resolved_ops):
928
- op = resolved["op"]
929
- if op["operation"] not in {"replace", "delete"}:
930
- continue
931
-
932
- replacement_text = op.get("text", "") or ""
933
- replacement_lines = replacement_text.splitlines(keepends=True)
934
-
935
- # --- PHASE 1: BIDIRECTIONAL STRUCTURAL HEALING ---
936
- if get_brace_balance([replacement_text]) == 0:
937
- start_idx = resolved["start_idx"]
938
- orig_end_idx = resolved["end_idx"]
939
-
940
- if get_brace_balance(hashed_lines[start_idx : orig_end_idx + 1]) != 0:
941
- # Dynamic Search List Generation
942
- # We limit look-up so we don't scan before the start_idx
943
- actual_max_up = orig_end_idx - start_idx
944
- actual_max_down = max(MAX_LOOK_DOWN, orig_end_idx - start_idx)
945
- search_offsets = []
946
-
947
- # Generate alternating offsets: [1, -1, 2, -2, ... N]
948
- for dist in range(1, max(actual_max_down, actual_max_up) + 1):
949
- if dist <= actual_max_down:
950
- search_offsets.append(dist)
951
- if dist <= actual_max_up:
952
- search_offsets.append(-dist)
953
-
954
- for offset in search_offsets:
955
- candidate_end = orig_end_idx + offset
956
-
957
- # Safety: check bounds and avoid overlapping other ops
958
- if candidate_end < start_idx or candidate_end >= len(hashed_lines):
959
- continue
960
-
961
- if any(
962
- j != i and (other["start_idx"] <= candidate_end <= other["end_idx"])
963
- for j, other in enumerate(resolved_ops)
964
- ):
965
- continue
966
-
967
- if get_brace_balance(hashed_lines[start_idx : candidate_end + 1]) == 0:
968
- resolved["end_idx"] = candidate_end
969
- break
970
-
971
- # --- PHASE 2: CONTRACTION (Indentation Guard) ---
972
- # Prevents replacing an outer-scope brace if the replacement text already
973
- # includes its own correctly indented closer.
974
- if not replacement_lines:
975
- continue
976
-
977
- last_repl_line = strip_hashline(replacement_lines[-1])
978
- last_repl_stripped = last_repl_line.strip().rstrip(";,")
979
-
980
- if last_repl_stripped and last_repl_stripped[-1] in "})]":
981
- # Calculate replacement indent
982
- repl_indent = len(last_repl_line) - len(last_repl_line.lstrip(" \t"))
983
-
984
- if resolved["end_idx"] < len(hashed_lines):
985
- end_line = strip_hashline(hashed_lines[resolved["end_idx"]])
986
- check_end = end_line.strip().rstrip(";,")
987
-
988
- if check_end and check_end[-1] in "})]":
989
- # Calculate indent of the existing brace in the file
990
- file_indent = len(end_line) - len(end_line.lstrip(" \t"))
991
-
992
- # If the file's brace is less indented, it belongs to an outer scope
993
- if file_indent < repl_indent and resolved["end_idx"] > resolved["start_idx"]:
994
- new_end_idx = resolved["end_idx"] - 1
995
-
996
- # Safety: don't contract into another operation's territory
997
- if not any(
998
- j != i and (other["start_idx"] <= new_end_idx <= other["end_idx"])
999
- for j, other in enumerate(resolved_ops)
1000
- ):
1001
- resolved["end_idx"] = new_end_idx
1002
-
1003
- return resolved_ops
1004
-
1005
-
1006
926
  def _merge_replace_operations(resolved_ops):
1007
927
  """
1008
928
  Merge contiguous or overlapping replace operations.
@@ -1411,9 +1331,6 @@ def apply_hashline_operations(
1411
1331
  resolved_ops = _merge_replace_operations(resolved_ops)
1412
1332
  # Apply content-aware range expansion/shifting for replace operations
1413
1333
  # resolved_ops = _apply_range_shifting(hashed_lines, resolved_ops)
1414
- # Apply closure safeguard for braces/brackets
1415
- resolved_ops = _apply_closure_safeguard(hashed_lines, resolved_ops)
1416
-
1417
1334
  # Sort by start_idx descending to apply from bottom to top
1418
1335
  # When operations have same start_idx, apply in order: insert, replace, delete
1419
1336
  # This ensures correct behavior when multiple operations target the same line
@@ -52,7 +52,7 @@ class HashPos:
52
52
  def generate_public_id(self, text: str, line_idx: int) -> str:
53
53
  """
54
54
  Generates a 4-char Base64 ID combining modulo buckets and context hash.
55
- Layout: [2-bit b1] [10-bit Hash A] [2-bit b2] [10-bit Hash B]
55
+ Layout: [2-bit b1] [2-bit b2] [10-bit Hash A] [10-bit Hash B]
56
56
  """
57
57
  b1, b2 = self._get_region_bits(line_idx)
58
58
  neighborhood_hash = self._get_neighborhood_hash(line_idx)
@@ -62,8 +62,7 @@ class HashPos:
62
62
  hash_b = neighborhood_hash & 0x3FF
63
63
 
64
64
  # Construct the mixed 24-bit integer
65
- packed = (b1 << 22) | (hash_a << 12) | (b2 << 10) | hash_b
66
-
65
+ packed = (b1 << 22) | (b2 << 20) | (hash_a << 10) | hash_b
67
66
  res = ""
68
67
  for _ in range(4):
69
68
  res += self.B64[packed % 64]
@@ -79,10 +78,9 @@ class HashPos:
79
78
  packed |= self.B64.index(char) << (6 * i)
80
79
 
81
80
  b1 = (packed >> 22) & 3
82
- hash_a = (packed >> 12) & 0x3FF
83
- b2 = (packed >> 10) & 3
81
+ b2 = (packed >> 20) & 3
82
+ hash_a = (packed >> 10) & 0x3FF
84
83
  hash_b = packed & 0x3FF
85
-
86
84
  mod_val = (b1 << 2) | b2
87
85
  neighborhood_hash = (hash_a << 10) | hash_b
88
86
 
@@ -0,0 +1,46 @@
1
+ import asyncio
2
+ import threading
3
+
4
+
5
+ class ThreadSafeEvent:
6
+ def __init__(self):
7
+ self._async_event = asyncio.Event()
8
+ self._thread_event = threading.Event()
9
+
10
+ @staticmethod
11
+ def _get_loop():
12
+ """Dynamically resolve the running event loop (not cached)."""
13
+ try:
14
+ return asyncio.get_running_loop()
15
+ except RuntimeError:
16
+ return None
17
+
18
+ def set(self):
19
+ """Can be called from ANY thread or coroutine safely."""
20
+ # Unblock threads
21
+ self._thread_event.set()
22
+ # Unblock async loop
23
+ if loop := self._get_loop():
24
+ loop.call_soon_threadsafe(self._async_event.set)
25
+ else:
26
+ self._async_event.set()
27
+
28
+ def clear(self):
29
+ """Can be called from ANY thread or coroutine safely."""
30
+ self._thread_event.clear()
31
+ if loop := self._get_loop():
32
+ loop.call_soon_threadsafe(self._async_event.clear)
33
+ else:
34
+ self._async_event.clear()
35
+
36
+ def is_set(self):
37
+ """Thread-safe check."""
38
+ return self._thread_event.is_set()
39
+
40
+ def thread_wait(self, timeout=None):
41
+ """Call this from your background OS Thread."""
42
+ return self._thread_event.wait(timeout=timeout)
43
+
44
+ async def wait(self):
45
+ """Call this (with await) from your Async Coroutines."""
46
+ await self._async_event.wait()
@@ -43,6 +43,7 @@ from rich.text import Text
43
43
 
44
44
  from cecli.commands import SwitchCoderSignal
45
45
  from cecli.helpers import coroutines
46
+ from cecli.helpers.threading import ThreadSafeEvent
46
47
  from cecli.report import update_error_prefix
47
48
 
48
49
  from .dump import dump # noqa: F401
@@ -395,7 +396,7 @@ class InputOutput:
395
396
  self.linear = False
396
397
 
397
398
  # State tracking for confirmation input
398
- self.confirmation_in_progress_event = asyncio.Event()
399
+ self.confirmation_in_progress_event = ThreadSafeEvent()
399
400
  self.confirmation_in_progress_event.set() # Initially set, meaning no confirmation in progress
400
401
  self.confirmation_acknowledgement = False
401
402
  self.confirmation_input_active = False
@@ -12,6 +12,7 @@ import oslex
12
12
  from cecli.dump import dump # noqa: F401
13
13
  from cecli.helpers.grep_ast import TreeContext, filename_to_lang
14
14
  from cecli.helpers.grep_ast.tsl import get_parser # noqa: E402
15
+ from cecli.helpers.threading import ThreadSafeEvent
15
16
  from cecli.run_cmd import run_cmd_async, run_cmd_subprocess # noqa: F401
16
17
 
17
18
  # tree_sitter is throwing a FutureWarning
@@ -22,7 +23,7 @@ class Linter:
22
23
  def __init__(self, encoding="utf-8", root=None, interrupt_event=None):
23
24
  self.encoding = encoding
24
25
  self.root = root
25
- self.interrupt_event = interrupt_event or asyncio.Event()
26
+ self.interrupt_event = interrupt_event or ThreadSafeEvent()
26
27
 
27
28
  self.languages = dict(
28
29
  python=self.py_lint,
@@ -42,6 +42,7 @@ class McpServer:
42
42
  self.io = io
43
43
  self.verbose = verbose
44
44
  self.session = None
45
+ self._connection_loop: asyncio.AbstractEventLoop | None = None
45
46
  self._cleanup_lock: asyncio.Lock = asyncio.Lock()
46
47
  self.exit_stack = AsyncExitStack()
47
48
 
@@ -59,10 +60,17 @@ class McpServer:
59
60
  Returns:
60
61
  ClientSession: The active session if mcp is not disabled
61
62
  """
63
+ current_loop = asyncio.get_running_loop()
62
64
  if self.session is not None:
65
+ # Event loop affinity check: streams from stdio_client() are bound
66
+ # to the loop that created them. Reconnect if the loop changed.
67
+ if self._connection_loop is current_loop:
68
+ if self.verbose and self.io:
69
+ self.io.tool_output(f"Using existing session for MCP server: {self.name}")
70
+ return self.session
63
71
  if self.verbose and self.io:
64
- self.io.tool_output(f"Using existing session for MCP server: {self.name}")
65
- return self.session
72
+ self.io.tool_output(f"Reconnecting MCP server {self.name} (event loop changed)")
73
+ await self.disconnect()
66
74
 
67
75
  if self.verbose and self.io:
68
76
  self.io.tool_output(f"Establishing new connection to MCP server: {self.name}")
@@ -87,6 +95,7 @@ class McpServer:
87
95
  session = await self.exit_stack.enter_async_context(ClientSession(read, write))
88
96
  await session.initialize()
89
97
  self.session = session
98
+ self._connection_loop = current_loop
90
99
  return session
91
100
  except Exception as e:
92
101
  logging.error(f"Error initializing server {self.name}: {e}")
@@ -193,10 +202,15 @@ class HttpBasedMcpServer(McpServer):
193
202
  raise NotImplementedError("Subclasses must implement _create_transport")
194
203
 
195
204
  async def connect(self):
205
+ current_loop = asyncio.get_running_loop()
196
206
  if self.session is not None:
207
+ if self._connection_loop is current_loop:
208
+ if self.verbose and self.io:
209
+ self.io.tool_output(f"Using existing session for {self.name}")
210
+ return self.session
197
211
  if self.verbose and self.io:
198
- self.io.tool_output(f"Using existing session for {self.name}")
199
- return self.session
212
+ self.io.tool_output(f"Reconnecting {self.name} (event loop changed)")
213
+ await self.disconnect()
200
214
 
201
215
  if self.verbose and self.io:
202
216
  self.io.tool_output(f"Establishing new connection to {self.name}")
@@ -224,6 +238,7 @@ class HttpBasedMcpServer(McpServer):
224
238
  session = await self.exit_stack.enter_async_context(ClientSession(read, write))
225
239
  await session.initialize()
226
240
  self.session = session
241
+ self._connection_loop = current_loop
227
242
 
228
243
  if oauth_provider.context.oauth_metadata:
229
244
  token_endpoint = oauth_provider._get_token_endpoint()
@@ -270,9 +285,13 @@ class SseServer(McpServer):
270
285
  """SSE (Server-Sent Events) MCP server using mcp.client.sse_client."""
271
286
 
272
287
  async def connect(self):
288
+ current_loop = asyncio.get_running_loop()
273
289
  if self.session is not None:
274
- logging.info(f"Using existing session for SSE MCP server: {self.name}")
275
- return self.session
290
+ if self._connection_loop is current_loop:
291
+ logging.info(f"Using existing session for SSE MCP server: {self.name}")
292
+ return self.session
293
+ logging.info(f"Reconnecting SSE MCP server {self.name} (event loop changed)")
294
+ await self.disconnect()
276
295
 
277
296
  logging.info(f"Establishing new connection to SSE MCP server: {self.name}")
278
297
  try:
@@ -285,6 +304,7 @@ class SseServer(McpServer):
285
304
  session = await self.exit_stack.enter_async_context(ClientSession(read, write))
286
305
  await session.initialize()
287
306
  self.session = session
307
+ self._connection_loop = current_loop
288
308
  return session
289
309
  except Exception as e:
290
310
  logging.error(f"Error initializing SSE server {self.name}: {e}")
@@ -29,8 +29,8 @@ main_system: |
29
29
 
30
30
  <context name="file_format">
31
31
  ### 1. FILE FORMAT
32
- File contents will be prefixed with identifiers. Each line starts with a case-sensitive content hash followed by `::`. These are used to target where editing tools will perform edits.
33
- They are algorithmically generated, maintained, and subject to change. Do not search for these content hashes. Focus on the lines they identify.
32
+ File contents will be prefixed with identifiers. Each line starts with a case-sensitive content ID followed by `::`. These are used to target where editing tools will perform edits.
33
+ They are algorithmically generated, maintained, and subject to change. Do not search for these content IDs. Focus on the lines they identify.
34
34
 
35
35
  **Example File Format :**
36
36
  il9n::#!/usr/bin/env python3
@@ -6,7 +6,7 @@ main_system: |
6
6
  Act as an expert software developer. Plan carefully, explain your logic briefly, and execute via LOCATE/CONTENTS blocks.
7
7
 
8
8
  ### 1. FILE FORMAT
9
- Files are provided in "hashline" format. Each line starts with a case-sensitive content hash followed by `::`.
9
+ Files are provided in "hashline" format. Each line starts with a case-sensitive content ID followed by `::`.
10
10
  These hashes are used as identifiers for lines when editing.
11
11
 
12
12
  **Example File Format :**
@@ -1,6 +1,7 @@
1
1
  import asyncio
2
2
  import logging
3
3
 
4
+ from cecli.helpers.threading import ThreadSafeEvent
4
5
  from cecli.tools.utils.base_tool import BaseTool
5
6
  from cecli.tools.utils.helpers import ToolError
6
7
  from cecli.tools.utils.output import color_markers, tool_footer, tool_header
@@ -65,7 +66,7 @@ class Tool(BaseTool):
65
66
  # the interrupt event, avoiding nested asyncio.wait() calls.
66
67
  interrupt_event = coder.interrupt_event
67
68
  if interrupt_event is None:
68
- interrupt_event = asyncio.Event()
69
+ interrupt_event = ThreadSafeEvent()
69
70
 
70
71
  interrupt_task = asyncio.create_task(interrupt_event.wait())
71
72
  pending = set(active_tasks) | {interrupt_task}