cecli-dev 0.100.12rc2__tar.gz → 0.100.12rc5__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 (701) hide show
  1. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/PKG-INFO +1 -1
  2. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/_version.py +3 -3
  3. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/args.py +9 -0
  4. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/agent_coder.py +1 -0
  5. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/clear.py +2 -3
  6. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/reset.py +1 -1
  7. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/hashline.py +15 -1
  8. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/model_providers.py +16 -0
  9. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/skills.py +1 -1
  10. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/hooks/__init__.py +2 -0
  11. cecli_dev-0.100.12rc5/cecli/hooks/helpers.py +188 -0
  12. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/llm.py +5 -1
  13. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/main.py +25 -0
  14. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/mcp/manager.py +30 -0
  15. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/mcp/server.py +143 -4
  16. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/edit_file.py +53 -29
  17. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/read_file.py +2 -1
  18. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/agent-mode.md +2 -0
  19. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/hooks.md +89 -4
  20. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/mcp.md +18 -0
  21. cecli_dev-0.100.12rc5/cecli/website/docs/config/model-providers.md +180 -0
  22. cecli_dev-0.100.12rc2/cecli/website/docs/config.md → cecli_dev-0.100.12rc5/cecli/website/docs/config/retries.md +5 -42
  23. cecli_dev-0.100.12rc5/cecli/website/docs/config.md +78 -0
  24. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli_dev.egg-info/PKG-INFO +1 -1
  25. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli_dev.egg-info/SOURCES.txt +11 -0
  26. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli_dev.egg-info/scm_file_list.json +11 -0
  27. cecli_dev-0.100.12rc5/cecli_dev.egg-info/scm_version.json +8 -0
  28. cecli_dev-0.100.12rc5/tests/mcp/conftest.py +138 -0
  29. cecli_dev-0.100.12rc5/tests/mcp/mock_server.py +132 -0
  30. cecli_dev-0.100.12rc5/tests/mcp/test_keepalive_concurrency.py +136 -0
  31. cecli_dev-0.100.12rc5/tests/mcp/test_keepalive_config.py +143 -0
  32. cecli_dev-0.100.12rc5/tests/mcp/test_keepalive_integration.py +144 -0
  33. cecli_dev-0.100.12rc5/tests/mcp/test_keepalive_logging.py +82 -0
  34. cecli_dev-0.100.12rc5/tests/mcp/test_keepalive_resilience.py +132 -0
  35. cecli_dev-0.100.12rc5/tests/mcp/test_keepalive_unit.py +151 -0
  36. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/tools/test_insert_block.py +1 -1
  37. cecli_dev-0.100.12rc2/cecli_dev.egg-info/scm_version.json +0 -8
  38. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/.dockerignore +0 -0
  39. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/.flake8 +0 -0
  40. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/.gitattributes +0 -0
  41. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/.github/ISSUE_TEMPLATE/issue.yml +0 -0
  42. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/.github/workflows/check_pypi_version.yml +0 -0
  43. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/.github/workflows/docker-build-test.yml +0 -0
  44. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/.github/workflows/docker-release.yml +0 -0
  45. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/.github/workflows/issues.yml +0 -0
  46. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/.github/workflows/pages.yml +0 -0
  47. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/.github/workflows/pre-commit.yml +0 -0
  48. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/.github/workflows/release.yml +0 -0
  49. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/.github/workflows/ubuntu-tests.yml +0 -0
  50. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/.github/workflows/windows-tests.yml +0 -0
  51. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/.github/workflows/windows_check_pypi_version.yml +0 -0
  52. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/.gitignore +0 -0
  53. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/.pre-commit-config.yaml +0 -0
  54. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/CHANGELOG.md +0 -0
  55. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/CNAME +0 -0
  56. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/CONTRIBUTING.md +0 -0
  57. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/HISTORY.md +0 -0
  58. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/LICENSE.txt +0 -0
  59. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/MANIFEST.in +0 -0
  60. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/README.md +0 -0
  61. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/Dockerfile +0 -0
  62. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/README.md +0 -0
  63. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/__init__.py +0 -0
  64. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/benchmark.py +0 -0
  65. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/benchmark_classic.py +0 -0
  66. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/clone-exercism.sh +0 -0
  67. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/cpp-test.sh +0 -0
  68. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/docker.sh +0 -0
  69. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/docker_build.sh +0 -0
  70. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/install-docker-ubuntu.sh +0 -0
  71. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/npm-test.sh +0 -0
  72. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/over_time.py +0 -0
  73. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/plot.sh +0 -0
  74. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/plots.py +0 -0
  75. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/problem_stats.py +0 -0
  76. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/prompts.py +0 -0
  77. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/refactor_tools.py +0 -0
  78. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/rsync.sh +0 -0
  79. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/rungrid.py +0 -0
  80. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/swe-bench-lite.txt +0 -0
  81. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/swe-bench.txt +0 -0
  82. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/swe_bench.py +0 -0
  83. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/test_benchmark.py +0 -0
  84. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/variations.1.sh +0 -0
  85. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/variations.2.sh +0 -0
  86. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/variations.3.sh +0 -0
  87. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/benchmark/variations.4.sh +0 -0
  88. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/__init__.py +0 -0
  89. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/__main__.py +0 -0
  90. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/args_formatter.py +0 -0
  91. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/change_tracker.py +0 -0
  92. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/__init__.py +0 -0
  93. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/architect_coder.py +0 -0
  94. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/ask_coder.py +0 -0
  95. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/base_coder.py +0 -0
  96. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/chat_chunks.py +0 -0
  97. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/context_coder.py +0 -0
  98. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/copypaste_coder.py +0 -0
  99. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/editblock_coder.py +0 -0
  100. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/editblock_fenced_coder.py +0 -0
  101. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/editblock_func_coder.py +0 -0
  102. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/editor_diff_fenced_coder.py +0 -0
  103. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/editor_editblock_coder.py +0 -0
  104. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/editor_whole_coder.py +0 -0
  105. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/hashline_coder.py +0 -0
  106. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/help_coder.py +0 -0
  107. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/patch_coder.py +0 -0
  108. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/search_replace.py +0 -0
  109. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/shell.py +0 -0
  110. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/single_wholefile_func_coder.py +0 -0
  111. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/sub_agent_coder.py +0 -0
  112. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/udiff_coder.py +0 -0
  113. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/udiff_simple.py +0 -0
  114. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/wholefile_coder.py +0 -0
  115. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/coders/wholefile_func_coder.py +0 -0
  116. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/__init__.py +0 -0
  117. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/add.py +0 -0
  118. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/agent.py +0 -0
  119. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/agent_model.py +0 -0
  120. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/architect.py +0 -0
  121. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/ask.py +0 -0
  122. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/chat_mode.py +0 -0
  123. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/code.py +0 -0
  124. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/command_prefix.py +0 -0
  125. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/commit.py +0 -0
  126. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/compact.py +0 -0
  127. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/context.py +0 -0
  128. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/context_blocks.py +0 -0
  129. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/context_management.py +0 -0
  130. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/copy.py +0 -0
  131. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/copy_context.py +0 -0
  132. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/core.py +0 -0
  133. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/diff.py +0 -0
  134. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/drop.py +0 -0
  135. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/editor.py +0 -0
  136. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/editor_model.py +0 -0
  137. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/exclude_skill.py +0 -0
  138. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/exit.py +0 -0
  139. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/git.py +0 -0
  140. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/hashline.py +0 -0
  141. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/help.py +0 -0
  142. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/history_search.py +0 -0
  143. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/hooks.py +0 -0
  144. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/hot_reload.py +0 -0
  145. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/include_skill.py +0 -0
  146. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/lint.py +0 -0
  147. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/list_mcp.py +0 -0
  148. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/list_sessions.py +0 -0
  149. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/list_skills.py +0 -0
  150. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/load.py +0 -0
  151. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/load_hook.py +0 -0
  152. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/load_mcp.py +0 -0
  153. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/load_session.py +0 -0
  154. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/load_skill.py +0 -0
  155. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/ls.py +0 -0
  156. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/map.py +0 -0
  157. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/map_refresh.py +0 -0
  158. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/merge.py +0 -0
  159. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/model.py +0 -0
  160. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/models.py +0 -0
  161. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/multiline_mode.py +0 -0
  162. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/paste.py +0 -0
  163. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/quit.py +0 -0
  164. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/read_only.py +0 -0
  165. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/read_only_stub.py +0 -0
  166. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/reap_agent.py +0 -0
  167. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/reasoning_effort.py +0 -0
  168. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/remove_hook.py +0 -0
  169. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/remove_mcp.py +0 -0
  170. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/remove_skill.py +0 -0
  171. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/report.py +0 -0
  172. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/rules.py +0 -0
  173. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/run.py +0 -0
  174. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/save.py +0 -0
  175. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/save_session.py +0 -0
  176. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/settings.py +0 -0
  177. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/spawn_agent.py +0 -0
  178. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/switch_agent.py +0 -0
  179. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/terminal_data/linux.keytab +0 -0
  180. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/terminal_setup.py +0 -0
  181. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/test.py +0 -0
  182. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/think_tokens.py +0 -0
  183. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/tokens.py +0 -0
  184. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/undo.py +0 -0
  185. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/utils/__init__.py +0 -0
  186. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/utils/base_command.py +0 -0
  187. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/utils/helpers.py +0 -0
  188. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/utils/registry.py +0 -0
  189. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/utils/save_load_manager.py +0 -0
  190. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/voice.py +0 -0
  191. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/weak_model.py +0 -0
  192. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/web.py +0 -0
  193. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/commands/workspace.py +0 -0
  194. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/deprecated_args.py +0 -0
  195. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/diffs.py +0 -0
  196. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/dump.py +0 -0
  197. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/editor.py +0 -0
  198. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/exceptions.py +0 -0
  199. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/format_settings.py +0 -0
  200. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/help.py +0 -0
  201. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/help_pats.py +0 -0
  202. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/__init__.py +0 -0
  203. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/agents/__init__.py +0 -0
  204. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/agents/config.py +0 -0
  205. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/agents/service.py +0 -0
  206. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/background_commands.py +0 -0
  207. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/command_parser.py +0 -0
  208. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/conversation/__init__.py +0 -0
  209. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/conversation/base_message.py +0 -0
  210. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/conversation/files.py +0 -0
  211. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/conversation/integration.py +0 -0
  212. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/conversation/manager.py +0 -0
  213. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/conversation/service.py +0 -0
  214. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/conversation/tags.py +0 -0
  215. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/conversation/utils.py +0 -0
  216. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/copypaste.py +0 -0
  217. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/coroutines.py +0 -0
  218. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/crypto.py +0 -0
  219. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/file_searcher.py +0 -0
  220. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/file_system/__init__.py +0 -0
  221. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/file_system/builders.py +0 -0
  222. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/file_system/ignore.py +0 -0
  223. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/file_system/ngram_index.py +0 -0
  224. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/file_system/service.py +0 -0
  225. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/file_system/trie_index.py +0 -0
  226. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/grep_ast/__init__.py +0 -0
  227. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/grep_ast/dump.py +0 -0
  228. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/grep_ast/grep_ast.py +0 -0
  229. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/grep_ast/main.py +0 -0
  230. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/grep_ast/parsers.py +0 -0
  231. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/grep_ast/tsl.py +0 -0
  232. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/hashpos/__init__.py +0 -0
  233. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/hashpos/hashpos.py +0 -0
  234. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/hashpos/hashpos.v1.bak +0 -0
  235. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/io_proxy.py +0 -0
  236. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/leak_detect.py +0 -0
  237. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/monorepo/__init__.py +0 -0
  238. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/monorepo/config.py +0 -0
  239. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/monorepo/local_workspace.py +0 -0
  240. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/monorepo/project.py +0 -0
  241. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/monorepo/workspace.py +0 -0
  242. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/monorepo/worktree.py +0 -0
  243. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/nested.py +0 -0
  244. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/observations/__init__.py +0 -0
  245. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/observations/service.py +0 -0
  246. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/plugin_manager.py +0 -0
  247. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/profiler.py +0 -0
  248. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/requests.py +0 -0
  249. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/responses.py +0 -0
  250. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/similarity.py +0 -0
  251. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/helpers/threading.py +0 -0
  252. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/history.py +0 -0
  253. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/hooks/base.py +0 -0
  254. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/hooks/integration.py +0 -0
  255. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/hooks/manager.py +0 -0
  256. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/hooks/registry.py +0 -0
  257. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/hooks/service.py +0 -0
  258. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/hooks/types.py +0 -0
  259. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/interruptible_input.py +0 -0
  260. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/io.py +0 -0
  261. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/linter.py +0 -0
  262. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/mcp/__init__.py +0 -0
  263. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/mcp/oauth.py +0 -0
  264. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/mcp/utils.py +0 -0
  265. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/mdstream.py +0 -0
  266. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/models.py +0 -0
  267. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/onboarding.py +0 -0
  268. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/__init__.py +0 -0
  269. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/agent.yml +0 -0
  270. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/architect.yml +0 -0
  271. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/ask.yml +0 -0
  272. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/base.yml +0 -0
  273. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/context.yml +0 -0
  274. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/copypaste.yml +0 -0
  275. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/editblock.yml +0 -0
  276. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/editblock_fenced.yml +0 -0
  277. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/editblock_func.yml +0 -0
  278. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/editor_diff_fenced.yml +0 -0
  279. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/editor_editblock.yml +0 -0
  280. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/editor_whole.yml +0 -0
  281. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/hashline.yml +0 -0
  282. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/help.yml +0 -0
  283. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/patch.yml +0 -0
  284. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/single_wholefile_func.yml +0 -0
  285. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/subagent.yml +0 -0
  286. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/udiff.yml +0 -0
  287. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/udiff_simple.yml +0 -0
  288. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/utils/__init__.py +0 -0
  289. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/utils/registry.py +0 -0
  290. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/utils/system.py +0 -0
  291. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/wholefile.yml +0 -0
  292. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/prompts/wholefile_func.yml +0 -0
  293. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/README.md +0 -0
  294. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
  295. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/bash-tags.scm +0 -0
  296. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/c-tags.scm +0 -0
  297. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
  298. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/clojure-tags.scm +0 -0
  299. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
  300. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
  301. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
  302. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/d-tags.scm +0 -0
  303. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
  304. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
  305. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
  306. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
  307. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
  308. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/go-tags.scm +0 -0
  309. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/java-tags.scm +0 -0
  310. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
  311. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
  312. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/matlab-tags.scm +0 -0
  313. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/ocaml-tags.scm +0 -0
  314. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/ocaml_interface-tags.scm +0 -0
  315. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
  316. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
  317. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/python-tags.scm +0 -0
  318. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/r-tags.scm +0 -0
  319. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
  320. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
  321. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
  322. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
  323. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
  324. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
  325. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/README.md +0 -0
  326. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/bash-tags.scm +0 -0
  327. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/c-tags.scm +0 -0
  328. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
  329. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/cpp-tags.scm +0 -0
  330. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/dart-tags.scm +0 -0
  331. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/elisp-tags.scm +0 -0
  332. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/elixir-tags.scm +0 -0
  333. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/elm-tags.scm +0 -0
  334. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/fortran-tags.scm +0 -0
  335. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/go-tags.scm +0 -0
  336. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/haskell-tags.scm +0 -0
  337. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/hcl-tags.scm +0 -0
  338. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/java-tags.scm +0 -0
  339. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/javascript-tags.scm +0 -0
  340. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/julia-tags.scm +0 -0
  341. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
  342. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/matlab-tags.scm +0 -0
  343. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
  344. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/ocaml_interface-tags.scm +0 -0
  345. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/php-tags.scm +0 -0
  346. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/python-tags.scm +0 -0
  347. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/ql-tags.scm +0 -0
  348. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/ruby-tags.scm +0 -0
  349. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/rust-tags.scm +0 -0
  350. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/scala-tags.scm +0 -0
  351. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/typescript-tags.scm +0 -0
  352. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/queries/tree-sitter-languages/zig-tags.scm +0 -0
  353. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/reasoning_tags.py +0 -0
  354. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/repo.py +0 -0
  355. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/repomap.py +0 -0
  356. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/report.py +0 -0
  357. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/resources/__init__.py +0 -0
  358. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/resources/model-metadata.json +0 -0
  359. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/resources/model-settings.yml +0 -0
  360. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/resources/providers.json +0 -0
  361. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/run_cmd.py +0 -0
  362. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/scrape.py +0 -0
  363. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/sendchat.py +0 -0
  364. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/sessions.py +0 -0
  365. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/special.py +0 -0
  366. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/__init__.py +0 -0
  367. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/_yield.py +0 -0
  368. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/command.py +0 -0
  369. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/command_interactive.py +0 -0
  370. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/delegate.py +0 -0
  371. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/explore_code.py +0 -0
  372. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/git_branch.py +0 -0
  373. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/git_diff.py +0 -0
  374. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/git_log.py +0 -0
  375. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/git_remote.py +0 -0
  376. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/git_show.py +0 -0
  377. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/git_status.py +0 -0
  378. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/grep.py +0 -0
  379. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/ls.py +0 -0
  380. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/resource_manager.py +0 -0
  381. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/thinking.py +0 -0
  382. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/undo_change.py +0 -0
  383. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/update_todo_list.py +0 -0
  384. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/utils/__init__.py +0 -0
  385. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/utils/base_tool.py +0 -0
  386. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/utils/helpers.py +0 -0
  387. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/utils/output.py +0 -0
  388. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/utils/registry.py +0 -0
  389. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/validations/__init__.py +0 -0
  390. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tools/validations/validations.py +0 -0
  391. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tui/__init__.py +0 -0
  392. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tui/app.py +0 -0
  393. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tui/io.py +0 -0
  394. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tui/styles.tcss +0 -0
  395. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tui/widgets/__init__.py +0 -0
  396. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tui/widgets/completion_bar.py +0 -0
  397. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tui/widgets/file_list.py +0 -0
  398. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tui/widgets/footer.py +0 -0
  399. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tui/widgets/input_area.py +0 -0
  400. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tui/widgets/input_container.py +0 -0
  401. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tui/widgets/key_hints.py +0 -0
  402. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tui/widgets/output.py +0 -0
  403. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tui/widgets/status_bar.py +0 -0
  404. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tui/widgets/subagent_pills.py +0 -0
  405. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/tui/worker.py +0 -0
  406. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/urls.py +0 -0
  407. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/utils.py +0 -0
  408. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/versioncheck.py +0 -0
  409. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/voice.py +0 -0
  410. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/waiting.py +0 -0
  411. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/watch.py +0 -0
  412. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/watch_prompts.py +0 -0
  413. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/Gemfile +0 -0
  414. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_includes/blame.md +0 -0
  415. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_includes/get-started.md +0 -0
  416. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_includes/help-tip.md +0 -0
  417. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_includes/help.md +0 -0
  418. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_includes/install.md +0 -0
  419. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_includes/keys.md +0 -0
  420. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_includes/model-warnings.md +0 -0
  421. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_includes/multi-line.md +0 -0
  422. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_includes/python-m-aider.md +0 -0
  423. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_includes/recording.css +0 -0
  424. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_includes/recording.md +0 -0
  425. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_includes/works-best.md +0 -0
  426. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_sass/_features.scss +0 -0
  427. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_sass/_footer.scss +0 -0
  428. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_sass/_hero.scss +0 -0
  429. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_sass/_info.scss +0 -0
  430. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_sass/_layout.scss +0 -0
  431. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_sass/_reset.scss +0 -0
  432. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_sass/_testimonials.scss +0 -0
  433. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_sass/_typography.scss +0 -0
  434. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_sass/_variables.scss +0 -0
  435. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_sass/custom/custom.scss +0 -0
  436. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/_sass/global-overrides.scss +0 -0
  437. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/adv-model-settings.md +0 -0
  438. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/api-keys.md +0 -0
  439. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/conf.md +0 -0
  440. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/custom-commands.md +0 -0
  441. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/custom-system-prompts.md +0 -0
  442. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/dotenv.md +0 -0
  443. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/editor.md +0 -0
  444. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/model-aliases.md +0 -0
  445. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/model-configuration.md +0 -0
  446. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/options.md +0 -0
  447. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/reasoning.md +0 -0
  448. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/security.md +0 -0
  449. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/skills.md +0 -0
  450. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/subagents.md +0 -0
  451. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/tui.md +0 -0
  452. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/config/workspaces.md +0 -0
  453. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/git.md +0 -0
  454. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/index.md +0 -0
  455. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/install/docker.md +0 -0
  456. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/install.md +0 -0
  457. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/languages.md +0 -0
  458. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/legal/contributor-agreement.md +0 -0
  459. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/legal/privacy.md +0 -0
  460. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms/anthropic.md +0 -0
  461. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms/azure.md +0 -0
  462. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms/bedrock.md +0 -0
  463. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms/cohere.md +0 -0
  464. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms/deepseek.md +0 -0
  465. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms/gemini.md +0 -0
  466. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms/github.md +0 -0
  467. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms/groq.md +0 -0
  468. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms/lm-studio.md +0 -0
  469. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms/ollama.md +0 -0
  470. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms/openai-compat.md +0 -0
  471. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms/openai.md +0 -0
  472. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms/openrouter.md +0 -0
  473. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms/other.md +0 -0
  474. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms/vertex.md +0 -0
  475. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms/warnings.md +0 -0
  476. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms/xai.md +0 -0
  477. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/llms.md +0 -0
  478. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/more/analytics.md +0 -0
  479. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/more/edit-formats.md +0 -0
  480. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/more/infinite-output.md +0 -0
  481. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/more-info.md +0 -0
  482. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/repomap.md +0 -0
  483. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/scripting.md +0 -0
  484. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/troubleshooting/cecli-not-found.md +0 -0
  485. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/troubleshooting/edit-errors.md +0 -0
  486. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/troubleshooting/imports.md +0 -0
  487. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/troubleshooting/models-and-keys.md +0 -0
  488. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/troubleshooting/support.md +0 -0
  489. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/troubleshooting/token-limits.md +0 -0
  490. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/troubleshooting/warnings.md +0 -0
  491. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/troubleshooting.md +0 -0
  492. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/usage/commands.md +0 -0
  493. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/usage/conventions.md +0 -0
  494. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/usage/copypaste.md +0 -0
  495. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/usage/images-urls.md +0 -0
  496. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/usage/lint-test.md +0 -0
  497. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/usage/modes.md +0 -0
  498. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/usage/not-code.md +0 -0
  499. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/usage/notifications.md +0 -0
  500. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/usage/optional.md +0 -0
  501. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/usage/sessions.md +0 -0
  502. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/usage/tips.md +0 -0
  503. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/usage/voice.md +0 -0
  504. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/usage/watch.md +0 -0
  505. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/docs/usage.md +0 -0
  506. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli/website/share/index.md +0 -0
  507. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli_dev.egg-info/dependency_links.txt +0 -0
  508. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli_dev.egg-info/entry_points.txt +0 -0
  509. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli_dev.egg-info/requires.txt +0 -0
  510. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/cecli_dev.egg-info/top_level.txt +0 -0
  511. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/docker/Dockerfile +0 -0
  512. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/docker/Dockerfile.local.nvidia.cuda.ubuntu +0 -0
  513. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/pyproject.toml +0 -0
  514. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/pytest.ini +0 -0
  515. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/requirements/common-constraints.txt +0 -0
  516. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/requirements/requirements-dev.in +0 -0
  517. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/requirements/requirements-dev.txt +0 -0
  518. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/requirements/requirements-help.in +0 -0
  519. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/requirements/requirements-help.txt +0 -0
  520. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/requirements/requirements-playwright.in +0 -0
  521. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/requirements/requirements-playwright.txt +0 -0
  522. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/requirements/requirements.in +0 -0
  523. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/requirements/tree-sitter.in +0 -0
  524. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/requirements.txt +0 -0
  525. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/30k-image.py +0 -0
  526. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/Dockerfile.jekyll +0 -0
  527. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/__init__.py +0 -0
  528. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/blame.py +0 -0
  529. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/clean_metadata.py +0 -0
  530. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/compare-message-history.py +0 -0
  531. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/cost_analyzer.py +0 -0
  532. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/cost_calculator.py +0 -0
  533. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/dl_icons.py +0 -0
  534. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/filter-chat-mode.js +0 -0
  535. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/generate_providers.py +0 -0
  536. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/get_contributor_list.js +0 -0
  537. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/get_hashline.py +0 -0
  538. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/history_prompts.py +0 -0
  539. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/homepage.py +0 -0
  540. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/issues.py +0 -0
  541. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/jekyll_build.sh +0 -0
  542. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/jekyll_run.sh +0 -0
  543. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/logo_svg.py +0 -0
  544. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/pip-compile.sh +0 -0
  545. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/recording_audio.py +0 -0
  546. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/redact-cast.py +0 -0
  547. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/rename_to_cecli.py +0 -0
  548. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/tmux_record.sh +0 -0
  549. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/tsl_pack_langs.py +0 -0
  550. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/update-blame.sh +0 -0
  551. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/update-docs.sh +0 -0
  552. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/update-history.py +0 -0
  553. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/versionbump.py +0 -0
  554. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/scripts/yank-old-versions.py +0 -0
  555. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/setup.cfg +0 -0
  556. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/shim.pyproject.toml +0 -0
  557. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/__init__.py +0 -0
  558. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/__init__.py +0 -0
  559. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/conftest.py +0 -0
  560. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_aws_credentials.py +0 -0
  561. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_background_commands.py +0 -0
  562. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_coder.py +0 -0
  563. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_commands.py +0 -0
  564. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_custom_commands.py +0 -0
  565. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_deprecated.py +0 -0
  566. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_editblock.py +0 -0
  567. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_editor.py +0 -0
  568. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_exceptions.py +0 -0
  569. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_find_or_blocks.py +0 -0
  570. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_hashline.py +0 -0
  571. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_hashline_closure.py +0 -0
  572. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_history.py +0 -0
  573. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_io.py +0 -0
  574. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_linter.py +0 -0
  575. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_main.py +0 -0
  576. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_model_info_manager.py +0 -0
  577. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_model_provider_manager.py +0 -0
  578. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_models.py +0 -0
  579. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_onboarding.py +0 -0
  580. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_plugin_manager.py +0 -0
  581. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_prompts.py +0 -0
  582. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_reasoning.py +0 -0
  583. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_repo.py +0 -0
  584. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_repomap.py +0 -0
  585. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_run_cmd.py +0 -0
  586. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_sanity_check_repo.py +0 -0
  587. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_scripting.py +0 -0
  588. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_sendchat.py +0 -0
  589. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_session_args.py +0 -0
  590. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_session_crypto.py +0 -0
  591. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_sessions.py +0 -0
  592. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_sessions_manager.py +0 -0
  593. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_skills.py +0 -0
  594. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_special.py +0 -0
  595. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_ssl_verification.py +0 -0
  596. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_udiff.py +0 -0
  597. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_urls.py +0 -0
  598. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_voice.py +0 -0
  599. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_watch.py +0 -0
  600. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/basic/test_wholefile.py +0 -0
  601. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/coders/test_coder_switching.py +0 -0
  602. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/coders/test_copypaste_coder.py +0 -0
  603. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/commands/test_compaction.py +0 -0
  604. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/commands/test_switch_agent.py +0 -0
  605. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/conftest.py +0 -0
  606. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/conversations/test_conversation_integration.py +0 -0
  607. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/conversations/test_conversation_system.py +0 -0
  608. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/chat-history-search-replace-gold.txt +0 -0
  609. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/chat-history.md +0 -0
  610. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/arduino/test.ino +0 -0
  611. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/bash/test.sh +0 -0
  612. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/c/test.c +0 -0
  613. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/chatito/test.chatito +0 -0
  614. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/clojure/test.clj +0 -0
  615. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/commonlisp/test.lisp +0 -0
  616. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/cpp/test.cpp +0 -0
  617. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/csharp/test.cs +0 -0
  618. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/d/test.d +0 -0
  619. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/dart/test.dart +0 -0
  620. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/elisp/test.el +0 -0
  621. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/elixir/test.ex +0 -0
  622. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/elm/test.elm +0 -0
  623. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/gleam/test.gleam +0 -0
  624. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/go/test.go +0 -0
  625. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/haskell/test.hs +0 -0
  626. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/hcl/test.tf +0 -0
  627. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/java/test.java +0 -0
  628. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/javascript/test.js +0 -0
  629. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/kotlin/test.kt +0 -0
  630. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/lua/test.lua +0 -0
  631. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/matlab/test.m +0 -0
  632. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/ocaml/test.ml +0 -0
  633. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/ocaml_interface/test.mli +0 -0
  634. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/php/test.php +0 -0
  635. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/pony/test.pony +0 -0
  636. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/properties/test.properties +0 -0
  637. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/python/test.py +0 -0
  638. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/ql/test.ql +0 -0
  639. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/r/test.r +0 -0
  640. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/racket/test.rkt +0 -0
  641. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/ruby/test.rb +0 -0
  642. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/rust/test.rs +0 -0
  643. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/scala/test.scala +0 -0
  644. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/solidity/test.sol +0 -0
  645. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/swift/test.swift +0 -0
  646. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/tsx/test.tsx +0 -0
  647. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/typescript/test.ts +0 -0
  648. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/udev/test.rules +0 -0
  649. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/languages/zig/test.zig +0 -0
  650. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/sample-code-base/sample.js +0 -0
  651. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/sample-code-base/sample.py +0 -0
  652. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/sample-code-base-repo-map.txt +0 -0
  653. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/watch.js +0 -0
  654. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/watch.lisp +0 -0
  655. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/watch.py +0 -0
  656. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/fixtures/watch_question.js +0 -0
  657. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/help/test_help.py +0 -0
  658. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/helpers/monorepo/LOCAL_WORKSPACE.md +0 -0
  659. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/helpers/monorepo/test_config.py +0 -0
  660. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/helpers/monorepo/test_config_active.py +0 -0
  661. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/helpers/monorepo/test_ignore_logic.py +0 -0
  662. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/helpers/monorepo/test_local_workspace.py +0 -0
  663. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/helpers/monorepo/test_repomap_workspace.py +0 -0
  664. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/helpers/monorepo/test_workspace.py +0 -0
  665. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/helpers/observations/test_observation_service.py +0 -0
  666. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/hooks/__init__.py +0 -0
  667. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/hooks/test_base.py +0 -0
  668. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/hooks/test_manager.py +0 -0
  669. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/hooks/test_registry.py +0 -0
  670. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/integration/test_agent_mcp_management.py +0 -0
  671. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/integration/test_mcp_management.py +0 -0
  672. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/mcp/__init__.py +0 -0
  673. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/mcp/test_manager.py +0 -0
  674. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/scrape/test_playwright_disable.py +0 -0
  675. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/scrape/test_scrape.py +0 -0
  676. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/subagents/__init__.py +0 -0
  677. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/subagents/conftest.py +0 -0
  678. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/subagents/test_commands.py +0 -0
  679. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/subagents/test_config.py +0 -0
  680. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/subagents/test_delegate.py +0 -0
  681. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/subagents/test_finished.py +0 -0
  682. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/subagents/test_io_proxy.py +0 -0
  683. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/subagents/test_service.py +0 -0
  684. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/subagents/test_sub_agent_coder.py +0 -0
  685. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/test_requests.py +0 -0
  686. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/tools/test_extractions.py +0 -0
  687. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/tools/test_get_lines.py +0 -0
  688. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/tools/test_git_branch.py +0 -0
  689. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/tools/test_git_diff.py +0 -0
  690. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/tools/test_grep.py +0 -0
  691. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/tools/test_read_range_execute.py +0 -0
  692. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/tools/test_registry.py +0 -0
  693. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/tools/test_remove_mcp_tool.py +0 -0
  694. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/tools/test_tool_arguments.py +0 -0
  695. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/tools/test_tools_load_mcp_tool.py +0 -0
  696. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/tools/validations.py +0 -0
  697. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/tui/test_app.py +0 -0
  698. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/unit/test_load_mcp.py +0 -0
  699. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/unit/test_remove_mcp.py +0 -0
  700. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/unit/test_unit_load_mcp_tool.py +0 -0
  701. {cecli_dev-0.100.12rc2 → cecli_dev-0.100.12rc5}/tests/unit/test_unit_remove_mcp_tool.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cecli-dev
3
- Version: 0.100.12rc2
3
+ Version: 0.100.12rc5
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.12rc2'
22
- __version_tuple__ = version_tuple = (0, 100, 12, 'rc2')
21
+ __version__ = version = '0.100.12rc5'
22
+ __version_tuple__ = version_tuple = (0, 100, 12, 'rc5')
23
23
 
24
- __commit_id__ = commit_id = 'g221e9f433'
24
+ __commit_id__ = commit_id = 'g7a6568913'
@@ -132,6 +132,15 @@ def get_parser(default_config_files, git_root):
132
132
  "Specify a file with model tag overrides (e.g., gpt-4o:high -> reasoning_effort: high)"
133
133
  ),
134
134
  ).complete = shtab.FILE
135
+ group.add_argument(
136
+ "--model-providers",
137
+ metavar="MODEL_PROVIDERS_JSON",
138
+ help=(
139
+ "Specify custom OpenAI-compatible model providers as a JSON/YAML string (e.g.,"
140
+ ' \'{"my-provider": {"api_base": "https://...", "api_key_env": ["MY_KEY"]}}\')'
141
+ ),
142
+ default=None,
143
+ )
135
144
  group.add_argument(
136
145
  "--reasoning-effort",
137
146
  type=str,
@@ -165,6 +165,7 @@ class AgentCoder(Coder):
165
165
  config["command_timeout"] = nested.getter(config, "command_timeout", 30)
166
166
  config["allowed_commands"] = nested.getter(config, "allowed_commands", [])
167
167
  config["hot_reload"] = nested.getter(config, "hot_reload", False)
168
+ config["diff_colors"] = nested.getter(config, "diff_colors", True)
168
169
  config["allow_nested_delegation"] = nested.getter(config, "allow_nested_delegation", False)
169
170
 
170
171
  config["tools_paths"] = nested.getter(config, ["tools_paths", "tool_paths"], [])
@@ -25,10 +25,9 @@ class ClearCommand(BaseCommand):
25
25
 
26
26
  # Clear TUI output if available
27
27
  if coder.tui and coder.tui():
28
- coder.tui().action_clear_output()
28
+ coder.tui().call_later(coder.tui().action_clear_output)
29
29
 
30
- io.tool_output("All chat history cleared.")
31
- return format_command_result(io, "clear", "Cleared chat history")
30
+ return format_command_result(io, "clear", "All chat history cleared.")
32
31
 
33
32
  @classmethod
34
33
  def get_completions(cls, io, coder, args) -> List[str]:
@@ -29,7 +29,7 @@ class ResetCommand(BaseCommand):
29
29
 
30
30
  # Clear TUI output if available
31
31
  if coder.tui and coder.tui():
32
- coder.tui().action_clear_output()
32
+ coder.tui().call_later(coder.tui().action_clear_output)
33
33
  else:
34
34
  io.tool_output("All files dropped and chat history cleared.")
35
35
 
@@ -409,6 +409,7 @@ def get_hashline_diff(
409
409
  end_line_hash,
410
410
  operation,
411
411
  text=None,
412
+ pretty=False,
412
413
  ):
413
414
  """
414
415
  Generate a diff for a hashline operation in the format used by the original format_output.
@@ -420,6 +421,8 @@ def get_hashline_diff(
420
421
  end_line_hash: Hashline format for end line: "{4 char hash}" (without the braces)
421
422
  operation: One of "replace", "insert", or "delete"
422
423
  text: Text to insert or replace with (required for replace/insert operations)
424
+ pretty: When True, color removed lines in magenta (\x1b[95m) and added lines
425
+ in light green (\033[32m). When False, all diff lines use \033[92m.
423
426
 
424
427
  Returns:
425
428
  str: A formatted diff snippet showing changes, or empty string if no changes
@@ -523,7 +526,18 @@ def get_hashline_diff(
523
526
  diff_lines = list(diff)[2:]
524
527
 
525
528
  if diff_lines:
526
- return "\n".join([line for line in diff_lines])
529
+ if pretty:
530
+ colored_lines = []
531
+ for line in diff_lines:
532
+ if line.startswith("-"):
533
+ colored_lines.append(f"\033[38;5;96m{line}\x1b[0m")
534
+ elif line.startswith("+"):
535
+ colored_lines.append(f"\033[32m{line}\x1b[0m")
536
+ else:
537
+ colored_lines.append(line)
538
+ return "\n".join(colored_lines)
539
+ else:
540
+ return "\n".join([line for line in diff_lines])
527
541
  else:
528
542
  return ""
529
543
 
@@ -289,6 +289,16 @@ class ModelProviderManager:
289
289
  def set_verify_ssl(self, verify_ssl: bool) -> None:
290
290
  self.verify_ssl = verify_ssl
291
291
 
292
+ def merge_provider_configs(self, user_configs: Dict[str, Dict]) -> None:
293
+ """Merge user-defined provider configs into the existing provider configs."""
294
+ for slug, cfg in user_configs.items():
295
+ if slug in self.provider_configs:
296
+ self.provider_configs[slug] = _deep_merge(self.provider_configs[slug], cfg)
297
+ else:
298
+ self.provider_configs[slug] = deepcopy(cfg)
299
+ self._provider_cache[slug] = None
300
+ self._cache_loaded[slug] = False
301
+
292
302
  def supports_provider(self, provider: Optional[str]) -> bool:
293
303
  return bool(provider and provider in self.provider_configs)
294
304
 
@@ -571,6 +581,12 @@ class ModelProviderManager:
571
581
  return None
572
582
 
573
583
 
584
+ def register_user_providers_with_litellm(user_configs: Dict[str, Dict]) -> None:
585
+ """Register user-defined providers with LiteLLM for custom handler support."""
586
+ for slug, cfg in user_configs.items():
587
+ _register_provider_with_litellm(slug, cfg)
588
+
589
+
574
590
  def ensure_litellm_providers_registered() -> None:
575
591
  """One-time registration guard for LiteLLM provider metadata."""
576
592
  global _PROVIDERS_REGISTERED
@@ -69,7 +69,7 @@ class SkillsManager:
69
69
  # Always include the default skills directory in the user's home
70
70
  default_skill_dir = str(Path.home() / ".cecli" / "skills")
71
71
  if default_skill_dir not in directory_paths:
72
- directory_paths = list(directory_paths) + [default_skill_dir]
72
+ directory_paths = [default_skill_dir] + list(directory_paths)
73
73
 
74
74
  self.directory_paths = [Path(p).expanduser().resolve() for p in directory_paths]
75
75
  self.include_list = set(include_list) if include_list else None
@@ -1,6 +1,7 @@
1
1
  """Hooks module for extending cecli functionality."""
2
2
 
3
3
  from .base import BaseHook, CommandHook
4
+ from .helpers import HookHelpers
4
5
  from .integration import HookIntegration
5
6
  from .manager import HookManager
6
7
  from .registry import HookRegistry
@@ -10,6 +11,7 @@ from .types import METADATA_TEMPLATES, HookType
10
11
  __all__ = [
11
12
  "BaseHook",
12
13
  "CommandHook",
14
+ "HookHelpers",
13
15
  "HookIntegration",
14
16
  "HookManager",
15
17
  "HookRegistry",
@@ -0,0 +1,188 @@
1
+ """Helpers for writing Python hooks.
2
+
3
+ Provides a higher-level API for accessing conversation history, making model
4
+ calls, and working with sub-agents from within hook implementations.
5
+
6
+ Typical usage::
7
+
8
+ from cecli.hooks import HookHelpers
9
+
10
+ class MyHook(BaseHook):
11
+ type = HookType.POST_TOOL
12
+
13
+ async def execute(self, coder, metadata):
14
+ recent = HookHelpers.get_messages(coder, last_n=5)
15
+ reply = await HookHelpers.call(coder, prompt="Summarize the above.")
16
+ HookHelpers.append_message(coder, {"role": "assistant", "content": reply})
17
+ summary = await HookHelpers.call_subagent(
18
+ coder, "reviewer", "Review these changes"
19
+ )
20
+ return True
21
+ """
22
+
23
+ from typing import Any, Dict, List, Optional
24
+
25
+
26
+ class HookHelpers:
27
+ """Collection of static helper methods for Python hooks.
28
+
29
+ All methods receive the ``coder`` instance as their first argument
30
+ so they can access conversation history, make model calls, and
31
+ invoke sub-agents on behalf of the agent running the hook.
32
+ """
33
+
34
+ @staticmethod
35
+ def get_messages(
36
+ coder: Any,
37
+ last_n: Optional[int] = None,
38
+ tag: Optional[str] = None,
39
+ reload: bool = False,
40
+ ) -> List[Dict[str, Any]]:
41
+ """Retrieve conversation messages for the given coder.
42
+
43
+ This is a convenience wrapper around
44
+ ``ConversationService.get_manager(coder).get_messages_dict()``.
45
+
46
+ Args:
47
+ coder: The coder instance (passed to hook's ``execute()``).
48
+ last_n: If set, return only the *last_n* messages (most recent first).
49
+ tag: Optional tag to filter by (e.g. ``"cur"``, ``"done"``).
50
+ If ``None``, returns all messages.
51
+ reload: If ``True``, bypass the internal cache.
52
+
53
+ Returns:
54
+ A list of message dicts sorted by priority then timestamp,
55
+ each with keys ``role``, ``content``, etc.
56
+ """
57
+ from cecli.helpers.conversation.service import ConversationService
58
+
59
+ manager = ConversationService.get_manager(coder)
60
+ messages = manager.get_messages_dict(tag=tag, reload=reload)
61
+
62
+ if last_n is not None and last_n > 0:
63
+ messages = messages[-last_n:]
64
+
65
+ return messages
66
+
67
+ @staticmethod
68
+ def append_message(
69
+ coder: Any,
70
+ message_dict: Dict[str, Any],
71
+ tag: str = "cur",
72
+ **kwargs: Any,
73
+ ) -> Any:
74
+ """Append a message to the coder's conversation history.
75
+
76
+ This is a convenience wrapper around
77
+ ``ConversationService.get_manager(coder).add_message()``.
78
+
79
+ Args:
80
+ coder: The coder instance (passed to hook's ``execute()``).
81
+ message_dict: The message content dict (e.g.
82
+ ``{"role": "user", "content": "..."}``).
83
+ tag: Message tag to use (default ``"cur"``).
84
+ **kwargs: Additional keyword arguments forwarded to
85
+ ``add_message()``, such as ``hash_key``, ``force``,
86
+ ``priority``, ``promotion``, etc.
87
+
88
+ Returns:
89
+ The ``BaseMessage`` instance that was created or updated.
90
+ """
91
+ from cecli.helpers.conversation.service import ConversationService
92
+
93
+ return ConversationService.get_manager(coder).add_message(
94
+ message_dict=message_dict,
95
+ tag=tag,
96
+ **kwargs,
97
+ )
98
+
99
+ @staticmethod
100
+ async def call(
101
+ coder: Any,
102
+ messages: Optional[List[Dict[str, Any]]] = None,
103
+ prompt: Optional[str] = None,
104
+ system: Optional[str] = None,
105
+ model_name: Optional[str] = None,
106
+ max_tokens: Optional[int] = None,
107
+ **kwargs: Any,
108
+ ) -> Optional[str]:
109
+ """Make a language model generation call.
110
+
111
+ You can provide ``messages`` directly (a list of message dicts), or
112
+ use ``prompt`` (with an optional ``system`` message) to build a
113
+ simple user/assistant exchange.
114
+
115
+ Args:
116
+ coder: The coder instance (passed to hook's ``execute()``).
117
+ messages: A list of message dicts (``{"role": ..., "content": ...}``).
118
+ If provided, ``prompt`` and ``system`` are ignored.
119
+ prompt: A simple user prompt string. Ignored if ``messages`` is set.
120
+ system: An optional system prompt. Only used when ``prompt`` is set
121
+ and ``messages`` is ``None``.
122
+ model_name: Override the model to use (e.g. ``"gpt-4o"``).
123
+ If ``None``, uses ``coder.main_model``.
124
+ max_tokens: Maximum tokens for the response.
125
+ **kwargs: Additional keyword arguments forwarded to
126
+ ``Model.simple_send_with_retries()``.
127
+
128
+ Returns:
129
+ The generated text content, or ``None`` on failure.
130
+ """
131
+ from cecli.models import Model
132
+
133
+ if messages is None:
134
+ msgs: List[Dict[str, Any]] = []
135
+ if system:
136
+ msgs.append({"role": "system", "content": system})
137
+ if prompt:
138
+ msgs.append({"role": "user", "content": prompt})
139
+ messages = msgs
140
+
141
+ if not messages:
142
+ return None
143
+
144
+ if model_name:
145
+ model = Model(
146
+ model_name,
147
+ from_model=coder.main_model,
148
+ )
149
+ else:
150
+ model = coder.main_model
151
+
152
+ return await model.simple_send_with_retries(
153
+ messages=messages,
154
+ max_tokens=max_tokens,
155
+ coder=coder,
156
+ override_kwargs=kwargs,
157
+ )
158
+
159
+ @staticmethod
160
+ async def call_subagent(
161
+ coder: Any,
162
+ name: str,
163
+ prompt: str,
164
+ **kwargs: Any,
165
+ ) -> Optional[str]:
166
+ """Invoke a sub-agent by name with the given prompt (blocking).
167
+
168
+ This is a convenience wrapper around
169
+ ``AgentService.get_instance(coder).invoke()``.
170
+
171
+ Args:
172
+ coder: The coder instance (passed to hook's ``execute()``).
173
+ name: The registered name of the sub-agent (e.g.
174
+ ``"reviewer"``, ``"tester"``).
175
+ prompt: The user message to pass to the sub-agent.
176
+ **kwargs: Additional keyword arguments forwarded to
177
+ ``AgentService.invoke()``, such as ``blocking``,
178
+ ``parent``, ``auto_reap``.
179
+
180
+ Returns:
181
+ The sub-agent's summary string, or ``None`` if it failed or
182
+ was invoked non-blocking.
183
+ """
184
+ from cecli.helpers.agents.service import AgentService
185
+
186
+ agent_service = AgentService.get_instance(coder)
187
+
188
+ return await agent_service.invoke(name, prompt, **kwargs)
@@ -53,7 +53,11 @@ class LazyLiteLLM:
53
53
  self._lazy_module.suppress_debug_info = True
54
54
  self._lazy_module.set_verbose = False
55
55
  self._lazy_module.drop_params = True
56
- self._lazy_module._logging._disable_debugging()
56
+ try:
57
+ self._lazy_module._logging._disable_debugging()
58
+ except AttributeError:
59
+ # litellm >= 1.62.0 removed the _logging module
60
+ pass
57
61
 
58
62
  # Make sure JSON-based OpenAI-compatible providers are registered
59
63
  ensure_litellm_providers_registered()
@@ -311,6 +311,12 @@ def load_dotenv_files(git_root, dotenv_fname, encoding="utf-8"):
311
311
  if oauth_keys_file.exists():
312
312
  dotenv_files.insert(0, str(oauth_keys_file.resolve()))
313
313
  dotenv_files = list(dict.fromkeys(dotenv_files))
314
+
315
+ # Also check ~/.cecli/.env as a default dotenv file (lowest priority)
316
+ cecli_env_file = Path.home() / ".cecli" / ".env"
317
+ if cecli_env_file.exists():
318
+ dotenv_files.insert(0, str(cecli_env_file.resolve()))
319
+ dotenv_files = list(dict.fromkeys(dotenv_files))
314
320
  loaded = []
315
321
  for fname in dotenv_files:
316
322
  try:
@@ -623,6 +629,8 @@ async def main_async(
623
629
  args.hooks = convert_yaml_to_json_string(args.hooks)
624
630
  if hasattr(args, "workspaces") and args.workspaces is not None:
625
631
  args.workspaces = convert_yaml_to_json_string(args.workspaces)
632
+ if hasattr(args, "model_providers") and args.model_providers is not None:
633
+ args.model_providers = convert_yaml_to_json_string(args.model_providers)
626
634
 
627
635
  # Interpolate environment variables in all string arguments
628
636
  for key, value in vars(args).items():
@@ -856,6 +864,23 @@ async def main_async(
856
864
  await check_and_load_imports(io, is_first_run, verbose=args.verbose)
857
865
  register_models(git_root, args.model_settings_file, io, verbose=args.verbose)
858
866
  register_litellm_models(git_root, args.model_metadata_file, io, verbose=args.verbose)
867
+ if args.model_providers:
868
+ try:
869
+ user_providers = json.loads(args.model_providers)
870
+ if isinstance(user_providers, dict):
871
+ models.model_info_manager.provider_manager.merge_provider_configs(user_providers)
872
+ from cecli.helpers.model_providers import (
873
+ register_user_providers_with_litellm,
874
+ )
875
+
876
+ register_user_providers_with_litellm(user_providers)
877
+ if args.verbose:
878
+ io.tool_output(f"Loaded {len(user_providers)} custom model provider(s):")
879
+ for slug in user_providers:
880
+ io.tool_output(f" - {slug}")
881
+ except json.JSONDecodeError as e:
882
+ io.tool_error(f"Failed to parse --model-providers JSON: {e}")
883
+
859
884
  if args.list_models:
860
885
  models.print_matching_models(io, args.list_models)
861
886
  return await graceful_exit(None)
@@ -48,6 +48,36 @@ class McpServerManager:
48
48
  if self.io:
49
49
  self.io.tool_warning(message)
50
50
 
51
+ @staticmethod
52
+ def _validate_server_config(config: dict) -> dict:
53
+ """
54
+ Validate keepalive_interval in the server configuration.
55
+
56
+ Args:
57
+ config: Server configuration dictionary
58
+
59
+ Returns:
60
+ The validated configuration dictionary
61
+
62
+ Raises:
63
+ ValueError: If keepalive_interval is invalid
64
+ """
65
+ keepalive_interval = config.get("keepalive_interval")
66
+
67
+ if keepalive_interval is not None:
68
+ if not isinstance(keepalive_interval, int) or isinstance(keepalive_interval, bool):
69
+ raise ValueError(
70
+ f"keepalive_interval must be an integer, got {type(keepalive_interval).__name__}"
71
+ )
72
+
73
+ if keepalive_interval < 5:
74
+ raise ValueError(f"keepalive_interval {keepalive_interval} is below minimum of 5")
75
+
76
+ if keepalive_interval > 300:
77
+ raise ValueError(f"keepalive_interval {keepalive_interval} is above maximum of 300")
78
+
79
+ return config
80
+
51
81
  @property
52
82
  def servers(self) -> list["McpServer"]:
53
83
  """Get the list of managed MCP servers."""
@@ -1,8 +1,10 @@
1
1
  import asyncio
2
2
  import logging
3
3
  import os
4
+ import random
4
5
  import webbrowser
5
6
  from contextlib import AsyncExitStack
7
+ from enum import Enum, auto
6
8
  from urllib.parse import urlparse
7
9
 
8
10
  import httpx
@@ -20,6 +22,18 @@ from .oauth import (
20
22
  save_mcp_oauth_token,
21
23
  )
22
24
 
25
+ MIN_KEEPALIVE_INTERVAL = 5
26
+ MAX_KEEPALIVE_INTERVAL = 300
27
+ FAILED_PING_THRESHOLD = 3
28
+
29
+ logger = logging.getLogger(__name__)
30
+
31
+
32
+ class ConnectionState(Enum):
33
+ CONNECTED = auto()
34
+ UNHEALTHY = auto()
35
+ DISCONNECTED = auto()
36
+
23
37
 
24
38
  class McpServer:
25
39
  """
@@ -120,6 +134,13 @@ class McpServer:
120
134
  class HttpBasedMcpServer(McpServer):
121
135
  """Base class for HTTP-based MCP servers (HTTP streaming and SSE)."""
122
136
 
137
+ def __init__(self, server_config, io=None, verbose=False):
138
+ super().__init__(server_config, io, verbose)
139
+ self._state: ConnectionState = ConnectionState.CONNECTED
140
+ self._failed_pings: int = 0
141
+ self._keepalive_task: asyncio.Task | None = None
142
+ self._http_client: httpx.AsyncClient | None = None
143
+
123
144
  async def _create_oauth_provider(self):
124
145
  """Create an OAuthClientProvider using the MCP SDK."""
125
146
  parsed = urlparse(self.config.get("url"))
@@ -228,6 +249,7 @@ class HttpBasedMcpServer(McpServer):
228
249
  timeout=30,
229
250
  )
230
251
  )
252
+ self._http_client = http_client
231
253
 
232
254
  transport = await self.exit_stack.enter_async_context(
233
255
  self._create_transport(url, http_client=http_client)
@@ -238,9 +260,10 @@ class HttpBasedMcpServer(McpServer):
238
260
  session = await self.exit_stack.enter_async_context(ClientSession(read, write))
239
261
  await session.initialize()
240
262
  self.session = session
263
+ await self.start_keepalive()
241
264
  self._connection_loop = current_loop
242
265
 
243
- if oauth_provider.context.oauth_metadata:
266
+ if oauth_provider is not None and oauth_provider.context.oauth_metadata:
244
267
  token_endpoint = oauth_provider._get_token_endpoint()
245
268
  server_info = get_mcp_oauth_token(self.name)
246
269
  if "client_info" not in server_info:
@@ -249,17 +272,132 @@ class HttpBasedMcpServer(McpServer):
249
272
  server_info["client_info"]["token_endpoint"] = token_endpoint
250
273
 
251
274
  save_mcp_oauth_token(self.name, server_info)
252
-
253
- return session
254
275
  except Exception as e:
255
276
  logging.error(f"Error initializing {self.name}: {e}")
256
277
  await self.disconnect()
257
278
  raise
258
279
 
259
- async def disconnect(self):
280
+ async def start_keepalive(self):
281
+ """Start the background keepalive loop if configured."""
282
+ interval = self.config.get("keepalive_interval")
283
+ if interval is None:
284
+ return
285
+
286
+ try:
287
+ interval = int(interval)
288
+ if not (MIN_KEEPALIVE_INTERVAL <= interval <= MAX_KEEPALIVE_INTERVAL):
289
+ if self.verbose and self.io:
290
+ self.io.tool_warning(
291
+ f"Keepalive interval {interval} out of range ({MIN_KEEPALIVE_INTERVAL}-"
292
+ f"{MAX_KEEPALIVE_INTERVAL}). Ignoring."
293
+ )
294
+ return
295
+ except (ValueError, TypeError):
296
+ if self.verbose and self.io:
297
+ self.io.tool_warning(f"Invalid keepalive interval {interval}. Must be an integer.")
298
+ return
299
+
300
+ if self._keepalive_task and not self._keepalive_task.done():
301
+ self._keepalive_task.cancel()
302
+
303
+ self._keepalive_task = asyncio.create_task(self._keepalive_loop(interval))
304
+ logger.info(f"Keepalive task started for {self.name} (interval: {interval}s)")
305
+ if self.verbose and self.io:
306
+ self.io.tool_output(f"Started keepalive loop for {self.name} (interval: {interval}s)")
307
+
308
+ async def _keepalive_loop(self, interval: int):
309
+ """Background loop that sends periodic heartbeats to the MCP server."""
310
+ try:
311
+ while True:
312
+ # Jitter: ±10% to prevent timing analysis
313
+ jitter = interval * 0.1 * (2 * random.random() - 1)
314
+ await asyncio.sleep(interval + jitter)
315
+
316
+ if not self._http_client:
317
+ continue
318
+
319
+ try:
320
+ url = self.config.get("url")
321
+ headers = self.config.get("headers", {})
322
+
323
+ # Use OPTIONS request as a lightweight heartbeat
324
+ response = await self._http_client.options(url, headers=headers)
325
+ if response.status_code == 200:
326
+ self._state = ConnectionState.CONNECTED
327
+ self._failed_pings = 0
328
+ else:
329
+ raise httpx.HTTPStatusError(
330
+ f"Unexpected status {response.status_code}",
331
+ request=response.request,
332
+ response=response,
333
+ )
334
+ except Exception:
335
+ self._failed_pings += 1
336
+ if self._failed_pings >= FAILED_PING_THRESHOLD:
337
+ self._state = ConnectionState.DISCONNECTED
338
+ if self.verbose and self.io:
339
+ self.io.tool_warning(
340
+ f"MCP server {self.name} disconnected after {self._failed_pings} failed"
341
+ " pings. Attempting reconnect..."
342
+ )
343
+ await self.reconnect()
344
+ else:
345
+ self._state = ConnectionState.UNHEALTHY
346
+ if self.verbose and self.io:
347
+ self.io.tool_output(
348
+ f"MCP server {self.name} unhealthy (ping {self._failed_pings}/{FAILED_PING_THRESHOLD})"
349
+ )
350
+ except asyncio.CancelledError:
351
+ pass
352
+ except Exception as e:
353
+ logging.error(f"Keepalive loop for {self.name} crashed: {e}")
354
+
355
+ async def reconnect(self):
356
+ """Attempt to reconnect to the server using exponential backoff."""
357
+ initial_delay = 1
358
+ multiplier = 2
359
+ max_delay = 300
360
+
361
+ attempt = 0
362
+ while self._state == ConnectionState.DISCONNECTED:
363
+ delay = min(initial_delay * (multiplier**attempt), max_delay)
364
+ # Jitter: ±20%
365
+ jitter = delay * 0.2 * (2 * random.random() - 1)
366
+ await asyncio.sleep(delay + jitter)
367
+
368
+ try:
369
+ if self.verbose and self.io:
370
+ self.io.tool_output(
371
+ f"Attempting to reconnect to {self.name} (attempt {attempt + 1})..."
372
+ )
373
+
374
+ # Clean up old session/client without cancelling the keepalive task
375
+ await self.disconnect(cancel_keepalive=False)
376
+ await self.connect()
377
+
378
+ self._state = ConnectionState.CONNECTED
379
+ self._failed_pings = 0
380
+ if self.verbose and self.io:
381
+ self.io.tool_output(f"Successfully reconnected to {self.name}")
382
+ break
383
+ except Exception as e:
384
+ attempt += 1
385
+ if self.verbose and self.io:
386
+ self.io.tool_warning(
387
+ f"Reconnection attempt {attempt} failed for {self.name}: {e}"
388
+ )
389
+
390
+ async def disconnect(self, cancel_keepalive: bool = True):
260
391
  """Disconnect from the MCP server and clean up resources."""
261
392
  async with self._cleanup_lock:
262
393
  try:
394
+ if cancel_keepalive and self._keepalive_task:
395
+ self._keepalive_task.cancel()
396
+ try:
397
+ await asyncio.wait_for(self._keepalive_task, timeout=15)
398
+ except asyncio.CancelledError:
399
+ pass
400
+ logger.info(f"Keepalive task stopped for {self.name}")
263
401
  if hasattr(self, "_oauth_shutdown"):
264
402
  self._oauth_shutdown()
265
403
  await self.exit_stack.aclose()
@@ -271,6 +409,7 @@ class HttpBasedMcpServer(McpServer):
271
409
  logging.error(f"Error during cleanup of server {self.name}: {e}")
272
410
  finally:
273
411
  self.session = None
412
+ self._http_client = None
274
413
 
275
414
 
276
415
  class HttpStreamingServer(HttpBasedMcpServer):