ayder-cli 2.2.9__tar.gz → 2.3.1__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 (322) hide show
  1. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/.gitignore +0 -1
  2. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/PKG-INFO +120 -14
  3. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/README.md +114 -8
  4. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/docs/PROJECT_STRUCTURE.md +2 -1
  5. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/docs/config.toml.example +38 -19
  6. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/pyproject.toml +29 -6
  7. ayder_cli-2.3.1/scripts/check_exception_handlers.py +269 -0
  8. ayder_cli-2.3.1/scripts/check_log_arguments.py +1518 -0
  9. ayder_cli-2.3.1/scripts/check_logging_imports.py +111 -0
  10. ayder_cli-2.3.1/scripts/find_percent_logging.py +108 -0
  11. ayder_cli-2.3.1/scripts/log_argument_baseline.txt +290 -0
  12. ayder_cli-2.3.1/scripts/logging_gates.py +510 -0
  13. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/agents/callbacks.py +9 -9
  14. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/agents/config.py +13 -4
  15. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/agents/registry.py +28 -11
  16. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/agents/runner.py +21 -16
  17. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/agents/tool.py +0 -3
  18. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/agents/worktree.py +7 -4
  19. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/application/execution_policy.py +5 -1
  20. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/application/runtime_factory.py +10 -1
  21. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/cli.py +84 -21
  22. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/cli_runner.py +24 -8
  23. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/core/cache_monitor.py +8 -4
  24. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/core/config.py +94 -38
  25. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/core/config_migration.py +25 -2
  26. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/core/default_context_manager.py +58 -7
  27. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/core/ollama_context_manager.py +48 -19
  28. ayder_cli-2.3.1/src/ayder_cli/core/reasoning.py +66 -0
  29. ayder_cli-2.3.1/src/ayder_cli/diagnostics.py +197 -0
  30. ayder_cli-2.3.1/src/ayder_cli/log.py +44 -0
  31. ayder_cli-2.3.1/src/ayder_cli/logging_config.py +596 -0
  32. ayder_cli-2.3.1/src/ayder_cli/loops/chat_loop.py +888 -0
  33. ayder_cli-2.3.1/src/ayder_cli/masking.py +85 -0
  34. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/process_manager.py +9 -3
  35. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/prompts.py +3 -3
  36. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/impl/claude.py +9 -7
  37. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/impl/gemini.py +10 -7
  38. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/impl/ollama.py +61 -19
  39. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/impl/ollama_drivers/generic_xml.py +5 -4
  40. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/impl/ollama_drivers/registry.py +11 -9
  41. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/impl/ollama_inspector.py +4 -0
  42. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/impl/openai.py +23 -11
  43. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/impl/qwen.py +44 -20
  44. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/retry.py +19 -14
  45. ayder_cli-2.3.1/src/ayder_cli/services/messaging_inbox.py +413 -0
  46. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/context.py +9 -6
  47. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/filesystem.py +20 -7
  48. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/filesystem_definitions.py +8 -3
  49. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/notes.py +7 -5
  50. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/search.py +6 -6
  51. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/shell.py +4 -1
  52. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/skill.py +7 -4
  53. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/task_tool.py +4 -1
  54. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/tasks.py +15 -9
  55. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/utils_tools.py +7 -5
  56. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/web.py +4 -1
  57. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/definition.py +15 -11
  58. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/execution.py +41 -4
  59. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/hooks.py +12 -9
  60. ayder_cli-2.3.1/src/ayder_cli/tools/mcp.py +113 -0
  61. ayder_cli-2.3.1/src/ayder_cli/tools/mcp_client.py +157 -0
  62. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/plugin_github.py +5 -4
  63. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/plugin_manager.py +22 -14
  64. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/registry.py +15 -6
  65. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/utils.py +12 -11
  66. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tui/__init__.py +14 -2
  67. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tui/app.py +223 -31
  68. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tui/commands.py +154 -22
  69. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tui/screens.py +29 -4
  70. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tui/widgets.py +79 -9
  71. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/ui.py +15 -3
  72. ayder_cli-2.3.1/tests/agents/test_agent_severity.py +106 -0
  73. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/agents/test_runner.py +61 -3
  74. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/agents/test_worktree_helpers.py +29 -0
  75. ayder_cli-2.3.1/tests/application/test_execution_result_truthfulness.py +124 -0
  76. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/application/test_runtime_factory.py +27 -0
  77. ayder_cli-2.3.1/tests/client/test_main.py +132 -0
  78. ayder_cli-2.3.1/tests/conftest.py +103 -0
  79. ayder_cli-2.3.1/tests/core/test_asyncio_bridge.py +597 -0
  80. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/core/test_config_coverage.py +4 -4
  81. ayder_cli-2.3.1/tests/core/test_config_provider_logging.py +54 -0
  82. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/core/test_default_context_manager.py +107 -13
  83. ayder_cli-2.3.1/tests/core/test_event_emission.py +492 -0
  84. ayder_cli-2.3.1/tests/core/test_event_stream.py +62 -0
  85. ayder_cli-2.3.1/tests/core/test_exception_guarantee.py +26 -0
  86. ayder_cli-2.3.1/tests/core/test_exception_hooks.py +470 -0
  87. ayder_cli-2.3.1/tests/core/test_log_facade.py +63 -0
  88. ayder_cli-2.3.1/tests/core/test_logging_config_keys.py +70 -0
  89. ayder_cli-2.3.1/tests/core/test_logging_sinks.py +189 -0
  90. ayder_cli-2.3.1/tests/core/test_loguru_caplog.py +92 -0
  91. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/core/test_ollama_context_manager.py +5 -7
  92. ayder_cli-2.3.1/tests/core/test_reasoning_config.py +130 -0
  93. ayder_cli-2.3.1/tests/core/test_session_id_threading.py +300 -0
  94. ayder_cli-2.3.1/tests/core/test_sink_masking.py +821 -0
  95. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/loops/test_chat_loop_tool_truncation.py +112 -3
  96. ayder_cli-2.3.1/tests/loops/test_loop_severity.py +130 -0
  97. ayder_cli-2.3.1/tests/loops/test_required_args_aliases.py +75 -0
  98. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/ollama_drivers/test_fallback.py +16 -2
  99. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/test_ollama_native.py +24 -0
  100. ayder_cli-2.3.1/tests/providers/test_ollama_parallel_tool_call_ids.py +92 -0
  101. ayder_cli-2.3.1/tests/providers/test_provider_channel_binding.py +42 -0
  102. ayder_cli-2.3.1/tests/providers/test_provider_severity.py +101 -0
  103. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/test_qwen_async.py +57 -0
  104. ayder_cli-2.3.1/tests/providers/test_reasoning_effort.py +139 -0
  105. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/test_retrying_provider.py +31 -4
  106. ayder_cli-2.3.1/tests/scripts/test_exception_gate.py +353 -0
  107. ayder_cli-2.3.1/tests/scripts/test_log_argument_gate.py +1747 -0
  108. ayder_cli-2.3.1/tests/scripts/test_logging_policy_gates.py +276 -0
  109. ayder_cli-2.3.1/tests/scripts/test_loguru_private_shape.py +304 -0
  110. ayder_cli-2.3.1/tests/services/test_messaging_inbox.py +289 -0
  111. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/test_cli.py +262 -15
  112. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/test_context.py +49 -2
  113. ayder_cli-2.3.1/tests/test_logging_config.py +88 -0
  114. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/test_tasks.py +37 -0
  115. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_bash_tool.py +10 -6
  116. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_definition_discovery.py +14 -3
  117. ayder_cli-2.3.1/tests/tools/test_file_editor_size_limit.py +62 -0
  118. ayder_cli-2.3.1/tests/tools/test_mcp.py +202 -0
  119. ayder_cli-2.3.1/tests/tools/test_mcp_client.py +158 -0
  120. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_plugin_manager.py +37 -6
  121. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_search_codebase.py +21 -0
  122. ayder_cli-2.3.1/tests/tools/test_tool_severity.py +109 -0
  123. ayder_cli-2.3.1/tests/tools/test_unexpected_args.py +99 -0
  124. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_utils.py +56 -3
  125. ayder_cli-2.3.1/tests/tui/__init__.py +1 -0
  126. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tui/test_input_box.py +4 -1
  127. ayder_cli-2.3.1/tests/tui/test_peer_message_turn.py +202 -0
  128. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tui/test_widgets.py +103 -1
  129. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_confirm_screen.py +4 -0
  130. ayder_cli-2.3.1/tests/ui/test_tui_commands_effort.py +136 -0
  131. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_tui_commands_logging.py +37 -3
  132. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_tui_commands_provider.py +13 -0
  133. ayder_cli-2.3.1/uv.lock +2441 -0
  134. ayder_cli-2.2.9/src/ayder_cli/logging_config.py +0 -115
  135. ayder_cli-2.2.9/src/ayder_cli/loops/chat_loop.py +0 -740
  136. ayder_cli-2.2.9/tests/client/test_main.py +0 -56
  137. ayder_cli-2.2.9/tests/core/test_config_provider_logging.py +0 -46
  138. ayder_cli-2.2.9/tests/test_logging_config.py +0 -82
  139. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/.github/workflows/ci.yml +0 -0
  140. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/.github/workflows/python-package.yml +0 -0
  141. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/.python-version +0 -0
  142. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/AGENTS.md +0 -0
  143. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/LICENSE +0 -0
  144. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/docs/README_AGENT_WORKFLOW.md +0 -0
  145. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/docs/README_OLLAMA.md +0 -0
  146. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/docs/cc.png +0 -0
  147. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/docs/superpowers/plans/2026-06-26-file-editor-improvements.md +0 -0
  148. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/docs/superpowers/plans/2026-06-26-session-save-resume.md +0 -0
  149. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/docs/superpowers/specs/2026-06-26-file-editor-improvements-design.md +0 -0
  150. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/docs/superpowers/specs/2026-06-26-session-save-resume-design.md +0 -0
  151. /ayder_cli-2.2.9/src/ayder_cli/providers/impl/ollama_drivers/__init__.py → /ayder_cli-2.3.1/scripts/exception_baseline.txt +0 -0
  152. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/__init__.py +0 -0
  153. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/__main__.py +0 -0
  154. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/agents/__init__.py +0 -0
  155. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/agents/run.py +0 -0
  156. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/application/README.md +0 -0
  157. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/application/__init__.py +0 -0
  158. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/application/message_contract.py +0 -0
  159. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/application/validation.py +0 -0
  160. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/cli_callbacks.py +0 -0
  161. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/console.py +0 -0
  162. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/core/context.py +0 -0
  163. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/core/context_manager.py +0 -0
  164. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/core/context_manager_factory.py +0 -0
  165. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/core/result.py +0 -0
  166. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/core/session.py +0 -0
  167. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/loops/__init__.py +0 -0
  168. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/parser.py +0 -0
  169. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/__init__.py +0 -0
  170. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/base.py +0 -0
  171. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/impl/deepseek.py +0 -0
  172. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/impl/glm.py +0 -0
  173. {ayder_cli-2.2.9/tests/providers → ayder_cli-2.3.1/src/ayder_cli/providers/impl}/ollama_drivers/__init__.py +0 -0
  174. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/impl/ollama_drivers/_errors.py +0 -0
  175. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/impl/ollama_drivers/base.py +0 -0
  176. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/impl/ollama_drivers/deepseek.py +0 -0
  177. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/impl/ollama_drivers/generic_native.py +0 -0
  178. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/impl/ollama_drivers/matrix.py +0 -0
  179. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/impl/ollama_drivers/minimax.py +0 -0
  180. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/impl/ollama_drivers/qwen3.py +0 -0
  181. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/providers/orchestrator.py +0 -0
  182. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/services/__init__.py +0 -0
  183. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/services/interactions.py +0 -0
  184. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/themes/__init__.py +0 -0
  185. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/themes/ayder.py +0 -0
  186. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/themes/claude.py +0 -0
  187. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/__init__.py +0 -0
  188. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/__init__.py +0 -0
  189. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/background_process_tool.py +0 -0
  190. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/context_definitions.py +0 -0
  191. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/note_tool.py +0 -0
  192. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/notes_definitions.py +0 -0
  193. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/process_manager_definitions.py +0 -0
  194. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/search_definitions.py +0 -0
  195. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/shell_definitions.py +0 -0
  196. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/skill_definitions.py +0 -0
  197. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/task_definitions.py +0 -0
  198. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/utils_tools_definitions.py +0 -0
  199. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/builtins/web_definitions.py +0 -0
  200. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/normalization.py +0 -0
  201. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/plugin_api.py +0 -0
  202. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/plugin_status.py +0 -0
  203. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tools/schemas.py +0 -0
  204. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tui/adapter.py +0 -0
  205. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tui/helpers.py +0 -0
  206. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tui/keybindings.py +0 -0
  207. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tui/parser.py +0 -0
  208. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tui/rendering.py +0 -0
  209. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tui/theme_manager.py +0 -0
  210. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/tui/types.py +0 -0
  211. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/src/ayder_cli/version.py +0 -0
  212. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/COVERAGE.md +0 -0
  213. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/__init__.py +0 -0
  214. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/agents/__init__.py +0 -0
  215. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/agents/test_agent_consolidated.py +0 -0
  216. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/agents/test_agent_tools.py +0 -0
  217. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/agents/test_callbacks.py +0 -0
  218. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/agents/test_config.py +0 -0
  219. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/agents/test_integration.py +0 -0
  220. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/agents/test_queue.py +0 -0
  221. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/agents/test_registry.py +0 -0
  222. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/agents/test_run.py +0 -0
  223. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/agents/test_runner_provider_unavailable.py +0 -0
  224. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/agents/test_tool.py +0 -0
  225. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/agents/test_worktree_isolation.py +0 -0
  226. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/application/test_message_contract.py +0 -0
  227. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/convergence/__init__.py +0 -0
  228. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/convergence/test_execution_policy_parity.py +0 -0
  229. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/convergence/test_runtime_wiring.py +0 -0
  230. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/convergence/test_validation_path.py +0 -0
  231. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/core/test_cache_monitor.py +0 -0
  232. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/core/test_config.py +0 -0
  233. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/core/test_config_migration.py +0 -0
  234. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/core/test_config_retry.py +0 -0
  235. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/core/test_config_v2.py +0 -0
  236. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/core/test_context_manager_factory.py +0 -0
  237. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/core/test_default_context_manager_should_compact.py +0 -0
  238. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/core/test_ollama_context_manager_cache_monitor.py +0 -0
  239. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/core/test_ollama_context_manager_max_history.py +0 -0
  240. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/core/test_parameter_aliasing.py +0 -0
  241. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/core/test_parser.py +0 -0
  242. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/core/test_session.py +0 -0
  243. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/loops/__init__.py +0 -0
  244. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/loops/test_base.py +0 -0
  245. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/loops/test_chat_loop_hook.py +0 -0
  246. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/__init__.py +0 -0
  247. {ayder_cli-2.2.9/tests/tui → ayder_cli-2.3.1/tests/providers/ollama_drivers}/__init__.py +0 -0
  248. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/ollama_drivers/test_base.py +0 -0
  249. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/ollama_drivers/test_deepseek.py +0 -0
  250. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/ollama_drivers/test_errors.py +0 -0
  251. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/ollama_drivers/test_generic_native.py +0 -0
  252. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/ollama_drivers/test_generic_xml.py +0 -0
  253. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/ollama_drivers/test_matrix.py +0 -0
  254. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/ollama_drivers/test_minimax.py +0 -0
  255. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/ollama_drivers/test_provider_integration.py +0 -0
  256. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/ollama_drivers/test_qwen3.py +0 -0
  257. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/ollama_drivers/test_registry.py +0 -0
  258. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/test_glm_async.py +0 -0
  259. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/test_ollama_inspector.py +0 -0
  260. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/test_ollama_xml.py +0 -0
  261. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/test_ollama_xml_autoroute.py +0 -0
  262. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/test_ollama_xml_usage.py +0 -0
  263. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/test_orchestrator_capabilities.py +0 -0
  264. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/test_retry_classifier.py +0 -0
  265. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/providers/test_retry_integration.py +0 -0
  266. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/services/test_boundary.py +0 -0
  267. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/services/test_interaction_sink.py +0 -0
  268. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/test_cli_callbacks.py +0 -0
  269. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/test_env_manager.py +0 -0
  270. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/test_notes.py +0 -0
  271. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/test_process_manager.py +0 -0
  272. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/__init__.py +0 -0
  273. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_agent_notes.py +0 -0
  274. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_background_process_tool.py +0 -0
  275. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_di_injection.py +0 -0
  276. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_file_editor_hardening.py +0 -0
  277. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_impl.py +0 -0
  278. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_impl_coverage.py +0 -0
  279. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_note_tool.py +0 -0
  280. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_notes_api.py +0 -0
  281. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_path_security.py +0 -0
  282. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_plugin_api.py +0 -0
  283. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_plugin_github.py +0 -0
  284. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_plugin_loading.py +0 -0
  285. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_plugin_status.py +0 -0
  286. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_registry.py +0 -0
  287. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_registry_coverage.py +0 -0
  288. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_result.py +0 -0
  289. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_schemas.py +0 -0
  290. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_search_hardening.py +0 -0
  291. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_skill_tool.py +0 -0
  292. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_task_tool.py +0 -0
  293. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tools/test_web.py +0 -0
  294. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tui/test_agent_list_screen.py +0 -0
  295. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tui/test_do_clear_coordination.py +0 -0
  296. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tui/test_follow_mode.py +0 -0
  297. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tui/test_help_screen.py +0 -0
  298. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tui/test_keybindings.py +0 -0
  299. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tui/test_multi_select_screen.py +0 -0
  300. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tui/test_multiline_input.py +0 -0
  301. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tui/test_paste.py +0 -0
  302. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tui/test_pending_compact_consumer.py +0 -0
  303. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tui/test_pull_delivery.py +0 -0
  304. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tui/test_resume.py +0 -0
  305. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tui/test_status_bar_badges.py +0 -0
  306. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tui/test_themes.py +0 -0
  307. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/tui/test_turn_consumer.py +0 -0
  308. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_diff_preview.py +0 -0
  309. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_plugin_autoenable.py +0 -0
  310. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_provider_switch.py +0 -0
  311. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_run_tui_startup.py +0 -0
  312. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_tui_assistant_sanitization.py +0 -0
  313. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_tui_chat_loop.py +0 -0
  314. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_tui_commands_agent.py +0 -0
  315. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_tui_commands_plugin.py +0 -0
  316. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_tui_commands_skill.py +0 -0
  317. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_tui_helpers.py +0 -0
  318. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_tui_temporal_command.py +0 -0
  319. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_tui_widgets.py +0 -0
  320. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_ui.py +0 -0
  321. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_ui_coverage.py +0 -0
  322. {ayder_cli-2.2.9 → ayder_cli-2.3.1}/tests/ui/test_ui_verbose.py +0 -0
@@ -24,7 +24,6 @@ htmlcov/
24
24
  .venv
25
25
  TODO
26
26
  .env
27
- uv.lock
28
27
 
29
28
  # Project Spesific
30
29
  .ayder
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: ayder-cli
3
- Version: 2.2.9
3
+ Version: 2.3.1
4
4
  Summary: AI agent for any LLMs
5
5
  Project-URL: Homepage, https://github.com/ayder/ayder-cli
6
6
  Project-URL: Repository, https://github.com/ayder/ayder-cli.git
@@ -15,7 +15,8 @@ Classifier: License :: OSI Approved :: MIT License
15
15
  Classifier: Programming Language :: Python :: 3
16
16
  Requires-Python: >=3.12
17
17
  Requires-Dist: httpx
18
- Requires-Dist: loguru
18
+ Requires-Dist: loguru<0.8,>=0.7
19
+ Requires-Dist: mcp<2,>=1.19
19
20
  Requires-Dist: ollama>=0.6.2
20
21
  Requires-Dist: openai
21
22
  Requires-Dist: python-dotenv>=1.0.0
@@ -26,17 +27,16 @@ Provides-Extra: all
26
27
  Requires-Dist: anthropic; extra == 'all'
27
28
  Requires-Dist: dashscope; extra == 'all'
28
29
  Requires-Dist: google-genai; extra == 'all'
29
- Requires-Dist: zhipuai; extra == 'all'
30
+ Requires-Dist: zhipuai>=2; extra == 'all'
30
31
  Provides-Extra: anthropic
31
32
  Requires-Dist: anthropic; extra == 'anthropic'
32
33
  Provides-Extra: glm
33
- Requires-Dist: zhipuai; extra == 'glm'
34
+ Requires-Dist: zhipuai>=2; extra == 'glm'
34
35
  Provides-Extra: google
35
36
  Requires-Dist: google-genai; extra == 'google'
36
37
  Provides-Extra: libcst
37
38
  Requires-Dist: libcst>=1.0.0; extra == 'libcst'
38
39
  Provides-Extra: mcp
39
- Requires-Dist: mcp; extra == 'mcp'
40
40
  Provides-Extra: qwen
41
41
  Requires-Dist: dashscope; extra == 'qwen'
42
42
  Description-Content-Type: text/markdown
@@ -209,10 +209,23 @@ tool_tags = ["core", "metadata"] # Enabled tool tags (see /plugin)
209
209
  agent_timeout = 300 # Seconds before a background agent is cancelled
210
210
 
211
211
  [logging]
212
- file_enabled = true
213
- file_path = ".ayder/log/ayder.log"
214
- rotation = "10 MB"
215
- retention = "7 days"
212
+ file_enabled = true # master switch for ALL file logging
213
+ file_path = ".ayder/log/ayder.log"
214
+ error_path = ".ayder/log/errors.log" # always written unless file_enabled = false
215
+ trace_enabled = false
216
+ trace_path = ".ayder/log/trace.jsonl"
217
+ rotation = "10 MB"
218
+ retention = "7 days"
219
+ # level = "INFO" # optional; omitted entirely when unset, which means NONE.
220
+ # NONE, ERROR, WARNING, INFO, DEBUG, TRACE
221
+
222
+ [logging.channels]
223
+ # Per-channel level overrides. Unlisted channels inherit the global level.
224
+ # Channels: llm, tool, agent, context, plugin, ui, core, external
225
+ # llm = "TRACE" # verbose LLM traffic
226
+ # plugin = "WARNING" # quiet plugin discovery
227
+ # external = "ERROR" # throttle third-party libraries
228
+ # ui = "NONE" # disable this channel entirely
216
229
 
217
230
  [context_manager]
218
231
  enabled = true
@@ -253,6 +266,50 @@ num_ctx = 1000000
253
266
 
254
267
  Please adjust `num_ctx` context size window according to your local computer RAM. If Ollama crashes, decrease the value.
255
268
 
269
+ ### Reasoning Effort (`/effort`)
270
+
271
+ Use `/effort` to open a picker, or `/effort high` to change the active session.
272
+ Changes apply between turns and are inherited by future agents that use the
273
+ session's profile; explicit agent settings take precedence. They do not change
274
+ `config.toml`. `/effort default` restores the provider's default behavior
275
+ (omits OpenAI effort and Ollama's `think` parameter).
276
+
277
+ | Driver | Runtime values |
278
+ |--------|----------------|
279
+ | `openai` | `default`, `none`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max` |
280
+ | `ollama` | `default`, `on`, `off`, `low`, `medium`, `high` (`true`/`false` and `none` are also accepted) |
281
+
282
+ Support varies by model. OpenAI values follow its
283
+ [Chat Completions API](https://developers.openai.com/api/reference/resources/chat/subresources/completions/methods/create).
284
+ Ollama uses the installed Python SDK's boolean and three-level `think` options;
285
+ its SDK does not yet accept the server API's newer `max` value. GPT-OSS expects
286
+ `low`, `medium`, or `high`, and cannot disable thinking. See
287
+ [Ollama thinking](https://docs.ollama.com/capabilities/thinking).
288
+
289
+ Set persistent defaults per LLM profile and agent:
290
+
291
+ ```toml
292
+ [llm.openai]
293
+ driver = "openai"
294
+ reasoning_effort = "medium"
295
+
296
+ [llm.ollama]
297
+ driver = "ollama"
298
+ reasoning_effort = "high"
299
+
300
+ [agents.reviewer]
301
+ provider = "openai"
302
+ reasoning_effort = "high"
303
+ system_prompt = "Review code and report findings."
304
+ ```
305
+
306
+ Omit an agent's `reasoning_effort` to inherit its profile, or set it to
307
+ `"default"` to clear an inherited effort. On Ollama, `"none"` maps to
308
+ `think = false`; an explicit effort overrides the legacy `think` setting.
309
+ Existing `think = true/false/"low"/"medium"/"high"` profile and agent settings
310
+ remain supported. OpenAI omits reasoning effort by default, preserving
311
+ compatibility with models and endpoints that do not support it.
312
+
256
313
  ### Changing Models on the Fly (`/model`)
257
314
 
258
315
  You do **not** need a separate profile for every model. The profile defines the *connection* (driver, base URL, API key).
@@ -379,6 +436,7 @@ You can also manually manage context with the `context` tool and its slash-comma
379
436
  | `/help` | Show available commands and keyboard shortcuts |
380
437
  | `/provider` | Switch LLM provider (interactive selector or direct name) |
381
438
  | `/model` | List available models or switch model (e.g., `/model qwen3-coder`) |
439
+ | `/effort` | Pick reasoning effort or set it directly (e.g., `/effort high`) |
382
440
  | `/plugin` | Toggle tool plugins by tag (e.g., venv, http, background, python, dbs) |
383
441
  | `/tools` | List currently enabled tools and descriptions |
384
442
  | `/permission` | Toggle permission levels (r/w/x/http) interactively |
@@ -389,7 +447,7 @@ You can also manually manage context with the `context` tool and its slash-comma
389
447
  | `/notes` | Browse and edit markdown notes |
390
448
  | `/skill` | Activate a domain skill from `.ayder/skills/` via the shared `skill` tool backend |
391
449
  | `/verbose` | Toggle verbose mode |
392
- | `/logging` | Set log level for current session (NONE, ERROR, WARNING, INFO, DEBUG) |
450
+ | `/logging` | Set log level for current session (NONE, ERROR, WARNING, INFO, DEBUG, TRACE) |
393
451
  | `/compact` | Summarize conversation, save a context snapshot, clear, and reload |
394
452
  | `/save-context` | Summarize conversation and save it to a named context slot (no clear) |
395
453
  | `/load-context` | Load a saved context slot and restore it |
@@ -406,9 +464,20 @@ You can also manually manage context with the `context` tool and its slash-comma
406
464
  The LLM can also call `skill(action="list" | "load" | "unload")`
407
465
  automatically when a request clearly matches an available project skill.
408
466
 
409
- - Default: when logging is enabled, logs go to `.ayder/log/ayder.log` (not shown on screen).
467
+ - Errors are always captured to `.ayder/log/errors.log`, even when
468
+ `logging_level` is `NONE`. Set `file_enabled = false` under `[logging]` to
469
+ turn off all file logging including errors.
470
+ - Unhandled exceptions, SIGTERM and SIGINT are captured to
471
+ `.ayder/log/errors.log`. Records in flight are lost on `SIGKILL` (`kill -9`),
472
+ which no process can intercept.
473
+ - Narrative logs go to `.ayder/log/ayder.log` when a level is set.
474
+ - `--trace` writes structured events to `.ayder/log/trace.jsonl`. It is not a
475
+ log level.
476
+ - `--log-channel llm,tool` limits console and narrative output to those
477
+ subsystems. It never filters the error log.
410
478
  - TUI `/logging` changes are session-only and do not modify `config.toml`.
411
- - CLI `--verbose [LEVEL]` enables stdout logging for that run.
479
+ - CLI `--verbose` enables stdout logging for that run; it does not narrow
480
+ channels.
412
481
 
413
482
  ### Keyboard Shortcuts
414
483
 
@@ -646,9 +715,46 @@ RECOMMENDATIONS: Parameterize all DB queries; add Pydantic validators to all end
646
715
 
647
716
  This summary is injected into the main LLM's context as a system message so the main agent can act on it, summarize it for you, or chain it to further work.
648
717
 
718
+ ## MCP servers
719
+
720
+ MCP support is built in and installed with Ayder. Add `.ayder/mcp.json` in your
721
+ project root, then start Ayder:
722
+
723
+ ```json
724
+ {
725
+ "mcpServers": {
726
+ "local-tools": {
727
+ "command": "python",
728
+ "args": ["server.py"],
729
+ "env": {"EXAMPLE_SETTING": "value"}
730
+ },
731
+ "remote-tools": {
732
+ "url": "http://localhost:8000/mcp"
733
+ }
734
+ }
735
+ }
736
+ ```
737
+
738
+ Local servers use stdio and run from the project root; remote servers use
739
+ Streamable HTTP. Their tools automatically join the standard `core` toolset in
740
+ the CLI, TUI, and delegated agents. No plugin installation or `/plugin` toggle
741
+ is needed. Tool calls retain the usual permissions: `x` for stdio servers and
742
+ `http` for HTTP servers. Configure only servers you intend Ayder to connect to:
743
+ local server commands start during runtime initialization to discover tools.
744
+
745
+ Tools keep their server-provided names unless they conflict with an existing
746
+ tool; conflicting names receive a `server__` prefix (and a numeric suffix if
747
+ needed). Unreachable servers are skipped so other tools remain available.
748
+ Connections are shared by agents in the same project and closed on process
749
+ exit. Restart Ayder after changing `mcp.json`.
750
+
751
+ Existing `mcp-tool` plugin installations are automatically skipped in favor of
752
+ built-in support; your existing `.ayder/mcp.json` continues to work. The legacy
753
+ `ayder-cli[mcp]` installation extra is still accepted.
754
+
649
755
  ## Plugins
650
756
 
651
- Official plugins (venv, python, dbs, mcp, temporal) are maintained in the **[ayder/ayder-plugins](https://github.com/ayder/ayder-plugins)** repository. Install any plugin directly from GitHub:
757
+ Official plugins (venv, python, dbs, temporal) are maintained in the **[ayder/ayder-plugins](https://github.com/ayder/ayder-plugins)** repository. Install any plugin directly from GitHub:
652
758
 
653
759
  ```bash
654
760
  ayder install-plugin https://github.com/ayder/ayder-plugins/tree/main/venv-tools
@@ -166,10 +166,23 @@ tool_tags = ["core", "metadata"] # Enabled tool tags (see /plugin)
166
166
  agent_timeout = 300 # Seconds before a background agent is cancelled
167
167
 
168
168
  [logging]
169
- file_enabled = true
170
- file_path = ".ayder/log/ayder.log"
171
- rotation = "10 MB"
172
- retention = "7 days"
169
+ file_enabled = true # master switch for ALL file logging
170
+ file_path = ".ayder/log/ayder.log"
171
+ error_path = ".ayder/log/errors.log" # always written unless file_enabled = false
172
+ trace_enabled = false
173
+ trace_path = ".ayder/log/trace.jsonl"
174
+ rotation = "10 MB"
175
+ retention = "7 days"
176
+ # level = "INFO" # optional; omitted entirely when unset, which means NONE.
177
+ # NONE, ERROR, WARNING, INFO, DEBUG, TRACE
178
+
179
+ [logging.channels]
180
+ # Per-channel level overrides. Unlisted channels inherit the global level.
181
+ # Channels: llm, tool, agent, context, plugin, ui, core, external
182
+ # llm = "TRACE" # verbose LLM traffic
183
+ # plugin = "WARNING" # quiet plugin discovery
184
+ # external = "ERROR" # throttle third-party libraries
185
+ # ui = "NONE" # disable this channel entirely
173
186
 
174
187
  [context_manager]
175
188
  enabled = true
@@ -210,6 +223,50 @@ num_ctx = 1000000
210
223
 
211
224
  Please adjust `num_ctx` context size window according to your local computer RAM. If Ollama crashes, decrease the value.
212
225
 
226
+ ### Reasoning Effort (`/effort`)
227
+
228
+ Use `/effort` to open a picker, or `/effort high` to change the active session.
229
+ Changes apply between turns and are inherited by future agents that use the
230
+ session's profile; explicit agent settings take precedence. They do not change
231
+ `config.toml`. `/effort default` restores the provider's default behavior
232
+ (omits OpenAI effort and Ollama's `think` parameter).
233
+
234
+ | Driver | Runtime values |
235
+ |--------|----------------|
236
+ | `openai` | `default`, `none`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max` |
237
+ | `ollama` | `default`, `on`, `off`, `low`, `medium`, `high` (`true`/`false` and `none` are also accepted) |
238
+
239
+ Support varies by model. OpenAI values follow its
240
+ [Chat Completions API](https://developers.openai.com/api/reference/resources/chat/subresources/completions/methods/create).
241
+ Ollama uses the installed Python SDK's boolean and three-level `think` options;
242
+ its SDK does not yet accept the server API's newer `max` value. GPT-OSS expects
243
+ `low`, `medium`, or `high`, and cannot disable thinking. See
244
+ [Ollama thinking](https://docs.ollama.com/capabilities/thinking).
245
+
246
+ Set persistent defaults per LLM profile and agent:
247
+
248
+ ```toml
249
+ [llm.openai]
250
+ driver = "openai"
251
+ reasoning_effort = "medium"
252
+
253
+ [llm.ollama]
254
+ driver = "ollama"
255
+ reasoning_effort = "high"
256
+
257
+ [agents.reviewer]
258
+ provider = "openai"
259
+ reasoning_effort = "high"
260
+ system_prompt = "Review code and report findings."
261
+ ```
262
+
263
+ Omit an agent's `reasoning_effort` to inherit its profile, or set it to
264
+ `"default"` to clear an inherited effort. On Ollama, `"none"` maps to
265
+ `think = false`; an explicit effort overrides the legacy `think` setting.
266
+ Existing `think = true/false/"low"/"medium"/"high"` profile and agent settings
267
+ remain supported. OpenAI omits reasoning effort by default, preserving
268
+ compatibility with models and endpoints that do not support it.
269
+
213
270
  ### Changing Models on the Fly (`/model`)
214
271
 
215
272
  You do **not** need a separate profile for every model. The profile defines the *connection* (driver, base URL, API key).
@@ -336,6 +393,7 @@ You can also manually manage context with the `context` tool and its slash-comma
336
393
  | `/help` | Show available commands and keyboard shortcuts |
337
394
  | `/provider` | Switch LLM provider (interactive selector or direct name) |
338
395
  | `/model` | List available models or switch model (e.g., `/model qwen3-coder`) |
396
+ | `/effort` | Pick reasoning effort or set it directly (e.g., `/effort high`) |
339
397
  | `/plugin` | Toggle tool plugins by tag (e.g., venv, http, background, python, dbs) |
340
398
  | `/tools` | List currently enabled tools and descriptions |
341
399
  | `/permission` | Toggle permission levels (r/w/x/http) interactively |
@@ -346,7 +404,7 @@ You can also manually manage context with the `context` tool and its slash-comma
346
404
  | `/notes` | Browse and edit markdown notes |
347
405
  | `/skill` | Activate a domain skill from `.ayder/skills/` via the shared `skill` tool backend |
348
406
  | `/verbose` | Toggle verbose mode |
349
- | `/logging` | Set log level for current session (NONE, ERROR, WARNING, INFO, DEBUG) |
407
+ | `/logging` | Set log level for current session (NONE, ERROR, WARNING, INFO, DEBUG, TRACE) |
350
408
  | `/compact` | Summarize conversation, save a context snapshot, clear, and reload |
351
409
  | `/save-context` | Summarize conversation and save it to a named context slot (no clear) |
352
410
  | `/load-context` | Load a saved context slot and restore it |
@@ -363,9 +421,20 @@ You can also manually manage context with the `context` tool and its slash-comma
363
421
  The LLM can also call `skill(action="list" | "load" | "unload")`
364
422
  automatically when a request clearly matches an available project skill.
365
423
 
366
- - Default: when logging is enabled, logs go to `.ayder/log/ayder.log` (not shown on screen).
424
+ - Errors are always captured to `.ayder/log/errors.log`, even when
425
+ `logging_level` is `NONE`. Set `file_enabled = false` under `[logging]` to
426
+ turn off all file logging including errors.
427
+ - Unhandled exceptions, SIGTERM and SIGINT are captured to
428
+ `.ayder/log/errors.log`. Records in flight are lost on `SIGKILL` (`kill -9`),
429
+ which no process can intercept.
430
+ - Narrative logs go to `.ayder/log/ayder.log` when a level is set.
431
+ - `--trace` writes structured events to `.ayder/log/trace.jsonl`. It is not a
432
+ log level.
433
+ - `--log-channel llm,tool` limits console and narrative output to those
434
+ subsystems. It never filters the error log.
367
435
  - TUI `/logging` changes are session-only and do not modify `config.toml`.
368
- - CLI `--verbose [LEVEL]` enables stdout logging for that run.
436
+ - CLI `--verbose` enables stdout logging for that run; it does not narrow
437
+ channels.
369
438
 
370
439
  ### Keyboard Shortcuts
371
440
 
@@ -603,9 +672,46 @@ RECOMMENDATIONS: Parameterize all DB queries; add Pydantic validators to all end
603
672
 
604
673
  This summary is injected into the main LLM's context as a system message so the main agent can act on it, summarize it for you, or chain it to further work.
605
674
 
675
+ ## MCP servers
676
+
677
+ MCP support is built in and installed with Ayder. Add `.ayder/mcp.json` in your
678
+ project root, then start Ayder:
679
+
680
+ ```json
681
+ {
682
+ "mcpServers": {
683
+ "local-tools": {
684
+ "command": "python",
685
+ "args": ["server.py"],
686
+ "env": {"EXAMPLE_SETTING": "value"}
687
+ },
688
+ "remote-tools": {
689
+ "url": "http://localhost:8000/mcp"
690
+ }
691
+ }
692
+ }
693
+ ```
694
+
695
+ Local servers use stdio and run from the project root; remote servers use
696
+ Streamable HTTP. Their tools automatically join the standard `core` toolset in
697
+ the CLI, TUI, and delegated agents. No plugin installation or `/plugin` toggle
698
+ is needed. Tool calls retain the usual permissions: `x` for stdio servers and
699
+ `http` for HTTP servers. Configure only servers you intend Ayder to connect to:
700
+ local server commands start during runtime initialization to discover tools.
701
+
702
+ Tools keep their server-provided names unless they conflict with an existing
703
+ tool; conflicting names receive a `server__` prefix (and a numeric suffix if
704
+ needed). Unreachable servers are skipped so other tools remain available.
705
+ Connections are shared by agents in the same project and closed on process
706
+ exit. Restart Ayder after changing `mcp.json`.
707
+
708
+ Existing `mcp-tool` plugin installations are automatically skipped in favor of
709
+ built-in support; your existing `.ayder/mcp.json` continues to work. The legacy
710
+ `ayder-cli[mcp]` installation extra is still accepted.
711
+
606
712
  ## Plugins
607
713
 
608
- Official plugins (venv, python, dbs, mcp, temporal) are maintained in the **[ayder/ayder-plugins](https://github.com/ayder/ayder-plugins)** repository. Install any plugin directly from GitHub:
714
+ Official plugins (venv, python, dbs, temporal) are maintained in the **[ayder/ayder-plugins](https://github.com/ayder/ayder-plugins)** repository. Install any plugin directly from GitHub:
609
715
 
610
716
  ```bash
611
717
  ayder install-plugin https://github.com/ayder/ayder-plugins/tree/main/venv-tools
@@ -160,7 +160,8 @@ cli.py:main()
160
160
  | `core/context_manager_factory.py` | Registry-based factory (OCP) | `ContextManagerFactory`, `context_manager_factory` |
161
161
  | `core/cache_monitor.py` | Timing-based KV-cache hit detection | `CacheMonitor`, `CacheStatus`, `CacheSample` |
162
162
  | `console.py` | Rich console singleton | `console` |
163
- | `logging_config.py` | Logger setup (loguru + stdlib bridge) | `setup_logging()` |
163
+ | `log.py` | Channel-scoped loguru facade; leaf module so `logging_config.py` and `core/config.py` can both depend on it | `get_logger()`, `LOG_LEVELS`, `CHANNELS`, `level_no()`, `flush()` |
164
+ | `logging_config.py` | Logger setup (loguru + stdlib bridge) | `setup_logging()`, `LoggingSettings` |
164
165
  | `version.py` | Package version constant | `__version__` |
165
166
 
166
167
  ### Root-Level Application Modules
@@ -48,12 +48,15 @@
48
48
  # `export OLLAMA_API_KEY="<key>"`. The api_key config field is INERT on the
49
49
  # native path, so a missing env var ⇒ 401 Unauthorized.
50
50
  #
51
- # NOTE on `think`: on the native `ollama` driver, ayder defaults thinking ON
52
- # (think = true) and forwards either a boolean or Ollama's "low",
53
- # "medium", "high" levels. If a selected model rejects thinking mode,
54
- # ayder retries that request once with think=false. Set `think = false`
55
- # in an [llm.*] profile for known non-thinking models. The `openai`
56
- # driver sends no reasoning-effort parameter at all.
51
+ # Reasoning defaults can be set in [llm.*] and overridden in [agents.*].
52
+ # reasoning_effort = "default" uses existing think behavior on Ollama and omits
53
+ # the effort parameter on OpenAI. Explicit effort overrides legacy `think`.
54
+ # OpenAI: none, minimal, low, medium, high, xhigh, max (model-dependent).
55
+ # Ollama SDK: none (= think=false), low, medium, high. To enable/disable
56
+ # boolean thinking explicitly, the legacy think = true/false still works.
57
+ # Use /effort in the TUI for a session-only override or interactive picker.
58
+ # Explicit unsupported efforts report a server error; only legacy `think`
59
+ # retains the automatic retry with think=false for non-thinking models.
57
60
  #
58
61
  # NOTE on tuning knobs — which actually take effect depends on the DRIVER. These
59
62
  # agents run on the native `ollama` driver, which ignores most of them:
@@ -69,8 +72,8 @@
69
72
  # path it sizes the context-manager budget.
70
73
  # Default 65536.
71
74
  # The per-agent temperature / max_output_tokens values below are largely
72
- # INERT on this Ollama pipeline; per-agent `think` is applied when the
73
- # agent uses the native ollama driver.
75
+ # INERT on this Ollama pipeline; per-agent reasoning_effort takes
76
+ # precedence over the selected profile.
74
77
  # =============================================================================
75
78
 
76
79
  config_version = "2.0"
@@ -117,10 +120,23 @@ theme = "ayder"
117
120
  palette = "auto"
118
121
 
119
122
  [logging]
120
- file_enabled = true
121
- file_path = ".ayder/log/ayder.log"
122
- rotation = "10 MB"
123
- retention = "7 days"
123
+ file_enabled = true # master switch for ALL file logging
124
+ file_path = ".ayder/log/ayder.log"
125
+ error_path = ".ayder/log/errors.log" # always written unless file_enabled = false
126
+ trace_enabled = false
127
+ trace_path = ".ayder/log/trace.jsonl"
128
+ rotation = "10 MB"
129
+ retention = "7 days"
130
+ # level = "INFO" # optional; omitted entirely when unset, which means NONE.
131
+ # NONE, ERROR, WARNING, INFO, DEBUG, TRACE
132
+
133
+ [logging.channels]
134
+ # Per-channel level overrides. Unlisted channels inherit the global level.
135
+ # Channels: llm, tool, agent, context, plugin, ui, core, external
136
+ # llm = "TRACE" # verbose LLM traffic
137
+ # plugin = "WARNING" # quiet plugin discovery
138
+ # external = "ERROR" # throttle third-party libraries
139
+ # ui = "NONE" # disable this channel entirely
124
140
 
125
141
  [context_manager]
126
142
  enabled = true
@@ -154,6 +170,7 @@ driver = "ollama"
154
170
  base_url = "http://localhost:11434" # route :cloud models through the LOCAL daemon (auth via ~/.ollama/id_ed25519, one-time `ollama signin`)
155
171
  model = "deepseek-v4-pro:cloud" # orchestrator default; per-agent `model` overrides this
156
172
  num_ctx = 131072
173
+ reasoning_effort = "default"
157
174
  think = true # default; set false for known non-thinking models
158
175
  # To hit ollama.com directly instead, swap the line above for:
159
176
  # base_url = "https://ollama.com" # no /v1; then `export OLLAMA_API_KEY=<key>` (the api_key field is inert on this path)
@@ -163,6 +180,7 @@ driver = "ollama"
163
180
  base_url = "http://localhost:11434"
164
181
  model = "qwen3.6:35b-a3b-coding-nvfp4"
165
182
  num_ctx = 32768 # keep modest: local VRAM is the constraint
183
+ reasoning_effort = "default"
166
184
  think = true # default; set false if the selected model rejects thinking
167
185
 
168
186
  # Budget/throughput alternative — swap any cloud agent's `provider` to this, or
@@ -185,7 +203,8 @@ think = true # default; set false if the selected model r
185
203
  # num_ctx = 65536 # sizes the context-manager budget (default 65536); NOT sent to the API
186
204
  # max_output_tokens = 8192 # -> max_tokens / max_completion_tokens (default 4096); keep WELL below num_ctx
187
205
  # stop_sequences = [] # -> stop (default [])
188
- # # temperature / think are NOT applied by the openai driver today (no-ops) — omitted on purpose.
206
+ # reasoning_effort = "medium" # choose a value supported by the selected model
207
+ # # temperature / think are NOT applied by the openai driver.
189
208
 
190
209
  # =============================================================================
191
210
  # Agents
@@ -198,7 +217,7 @@ provider = "ollama_cloud"
198
217
  model = "glm-5.2:cloud"
199
218
  temperature = 0.4
200
219
  max_output_tokens = 8192
201
- think = "high"
220
+ reasoning_effort = "high"
202
221
  system_prompt = """
203
222
  You are Project Manager #1 — the requirements analyst and spec author.
204
223
 
@@ -226,7 +245,7 @@ provider = "ollama_cloud"
226
245
  model = "deepseek-v4-pro:cloud"
227
246
  temperature = 0.2
228
247
  max_output_tokens = 4096
229
- think = "high"
248
+ reasoning_effort = "high"
230
249
  system_prompt = """
231
250
  You are Project Manager #2 — the independent spec reviewer.
232
251
 
@@ -255,7 +274,7 @@ provider = "ollama_cloud"
255
274
  model = "deepseek-v4-pro:cloud"
256
275
  temperature = 0.3
257
276
  max_output_tokens = 8192
258
- think = "high"
277
+ reasoning_effort = "high"
259
278
  num_ctx = 262144 # long window: hold the whole spec while splitting it into tasks (delays compaction)
260
279
  system_prompt = """
261
280
  You are the Architect — you turn an APPROVED spec into an implementation plan.
@@ -283,7 +302,7 @@ provider = "ollama_cloud"
283
302
  model = "kimi-k2.7-code:cloud"
284
303
  temperature = 0.2
285
304
  max_output_tokens = 8192
286
- think = "high"
305
+ reasoning_effort = "high"
287
306
  system_prompt = """
288
307
  You are the Architecture Reviewer — independent of the Architect.
289
308
 
@@ -385,7 +404,7 @@ provider = "ollama_cloud"
385
404
  model = "kimi-k2.7-code:cloud"
386
405
  temperature = 0.1
387
406
  max_output_tokens = 4096
388
- think = "high"
407
+ reasoning_effort = "high"
389
408
  system_prompt = """
390
409
  You are the Code Reviewer. You review a diff for correctness and quality.
391
410
 
@@ -411,7 +430,7 @@ provider = "ollama_cloud"
411
430
  model = "minimax-m3:cloud"
412
431
  temperature = 0.1
413
432
  max_output_tokens = 4096
414
- think = "high"
433
+ reasoning_effort = "high"
415
434
  num_ctx = 262144 # long window: holds spec + all criteria + diff + test output at once
416
435
  system_prompt = """
417
436
  You are the Acceptance Gate — the final, independent check before "done".
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ayder-cli"
7
- version = "2.2.9"
7
+ version = "2.3.1"
8
8
  description = "AI agent for any LLMs"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -22,8 +22,11 @@ classifiers = [
22
22
  dependencies = [
23
23
  "openai",
24
24
  "ollama>=0.6.2",
25
- "loguru",
25
+ # Bounded deliberately: the masking sinks wrap Loguru's private FileSink /
26
+ # Message / StreamSink shapes (§F5-R6), guarded by `_shape_guard()`.
27
+ "loguru>=0.7,<0.8",
26
28
  "httpx",
29
+ "mcp>=1.19,<2",
27
30
  "rich>=13.0.0",
28
31
  # Pinned exactly to match the runtime: 8.2.5+ replaced the single
29
32
  # "textual-ansi" builtin with per-theme `ansi` flags and ansi-dark/
@@ -37,9 +40,12 @@ dependencies = [
37
40
  anthropic = ["anthropic"]
38
41
  google = ["google-genai"]
39
42
  qwen = ["dashscope"]
40
- glm = ["zhipuai"]
43
+ # The provider uses the v2 client; do not let MCP's shared PyJWT dependency
44
+ # make the resolver select the incompatible v1 SDK.
45
+ glm = ["zhipuai>=2"]
41
46
  all = ["ayder-cli[anthropic,google,qwen,glm]"]
42
- mcp = ["mcp"]
47
+ # Compatibility extra: MCP is now included in every installation.
48
+ mcp = []
43
49
  # Optional: required only by plugins that do CST-based code transforms.
44
50
  libcst = ["libcst>=1.0.0"]
45
51
 
@@ -69,7 +75,7 @@ dev = [
69
75
  "anthropic",
70
76
  "google-genai",
71
77
  "dashscope",
72
- "zhipuai",
78
+ "zhipuai>=2",
73
79
  ]
74
80
 
75
81
  [tool.poe.tasks]
@@ -85,7 +91,16 @@ lint = "ruff check src/"
85
91
  lint-fix = "ruff check src/ --fix"
86
92
  typecheck = "mypy src/"
87
93
  format = "ruff format src/"
88
- check-all = ["lint", "typecheck", "test"]
94
+ check-all = ["lint", "typecheck", "gates", "test"]
95
+
96
+ [tool.poe.tasks.gates]
97
+ help = "Run the logging AST gates"
98
+ sequence = [
99
+ { cmd = "python scripts/find_percent_logging.py" },
100
+ { cmd = "python scripts/check_logging_imports.py" },
101
+ { cmd = "python scripts/check_exception_handlers.py" },
102
+ { cmd = "python scripts/check_log_arguments.py" },
103
+ ]
89
104
 
90
105
  [tool.poe.tasks.clean]
91
106
  help = "Deep clean cache and build artifacts"
@@ -113,3 +128,11 @@ ignore_missing_imports = false
113
128
  [[tool.mypy.overrides]]
114
129
  module = ["zhipuai", "dashscope"]
115
130
  ignore_missing_imports = true
131
+
132
+ [tool.ruff.lint]
133
+ # Explicit rule set: ruff 0.16 widened its defaults from 59 to 413 rules,
134
+ # so an implicit default + extend-select drifts with the installed version.
135
+ select = ["E4", "E7", "E9", "F", "TRY400", "TRY401", "BLE001", "LOG", "G"]
136
+
137
+ [tool.ruff.lint.per-file-ignores]
138
+ "tests/**/*.py" = ["BLE001", "G004"]