ayder-cli 2.3.0__tar.gz → 2.4.0__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 (323) hide show
  1. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/AGENTS.md +17 -0
  2. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/PKG-INFO +93 -5
  3. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/README.md +89 -1
  4. ayder_cli-2.4.0/docs/GATE.md +28 -0
  5. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/PROJECT_STRUCTURE.md +2 -1
  6. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/config.toml.example +30 -15
  7. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/pyproject.toml +8 -4
  8. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/scripts/check_exception_handlers.py +1 -1
  9. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/scripts/check_log_arguments.py +8 -8
  10. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/scripts/log_argument_baseline.txt +11 -0
  11. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/agents/config.py +13 -4
  12. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/agents/registry.py +4 -0
  13. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/application/runtime_factory.py +3 -0
  14. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/cli.py +9 -0
  15. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/config.py +46 -20
  16. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/config_migration.py +2 -0
  17. ayder_cli-2.4.0/src/ayder_cli/core/reasoning.py +66 -0
  18. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/loops/chat_loop.py +63 -2
  19. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/base.py +2 -1
  20. ayder_cli-2.4.0/src/ayder_cli/providers/evren.py +61 -0
  21. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama.py +35 -4
  22. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/openai.py +11 -9
  23. ayder_cli-2.4.0/src/ayder_cli/services/messaging_inbox.py +413 -0
  24. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/themes/ayder.py +37 -0
  25. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/themes/claude.py +37 -0
  26. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/filesystem.py +10 -0
  27. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/filesystem_definitions.py +8 -3
  28. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/execution.py +33 -0
  29. ayder_cli-2.4.0/src/ayder_cli/tools/mcp.py +113 -0
  30. ayder_cli-2.4.0/src/ayder_cli/tools/mcp_client.py +157 -0
  31. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/plugin_manager.py +4 -0
  32. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/registry.py +10 -1
  33. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/__init__.py +5 -2
  34. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/app.py +107 -1
  35. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/commands.py +144 -2
  36. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/screens.py +38 -3
  37. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/widgets.py +55 -2
  38. ayder_cli-2.4.0/tests/core/test_default_config_evren.py +44 -0
  39. ayder_cli-2.4.0/tests/core/test_reasoning_config.py +130 -0
  40. ayder_cli-2.4.0/tests/loops/test_required_args_aliases.py +75 -0
  41. ayder_cli-2.4.0/tests/providers/test_evren.py +79 -0
  42. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_ollama_native.py +16 -0
  43. ayder_cli-2.4.0/tests/providers/test_ollama_parallel_tool_call_ids.py +92 -0
  44. ayder_cli-2.4.0/tests/providers/test_openai_list_models.py +47 -0
  45. ayder_cli-2.4.0/tests/providers/test_reasoning_effort.py +139 -0
  46. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/scripts/test_exception_gate.py +22 -5
  47. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/scripts/test_log_argument_gate.py +18 -18
  48. ayder_cli-2.4.0/tests/services/test_messaging_inbox.py +289 -0
  49. ayder_cli-2.4.0/tests/tools/test_file_editor_size_limit.py +62 -0
  50. ayder_cli-2.4.0/tests/tools/test_mcp.py +202 -0
  51. ayder_cli-2.4.0/tests/tools/test_mcp_client.py +158 -0
  52. ayder_cli-2.4.0/tests/tools/test_unexpected_args.py +99 -0
  53. ayder_cli-2.4.0/tests/tui/test_evren_terms.py +230 -0
  54. ayder_cli-2.4.0/tests/tui/test_peer_message_turn.py +202 -0
  55. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_widgets.py +103 -1
  56. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_confirm_screen.py +2 -0
  57. ayder_cli-2.4.0/tests/ui/test_tui_commands_effort.py +136 -0
  58. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_commands_provider.py +13 -0
  59. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/uv.lock +5 -7
  60. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/.github/workflows/ci.yml +0 -0
  61. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/.github/workflows/python-package.yml +0 -0
  62. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/.gitignore +0 -0
  63. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/.python-version +0 -0
  64. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/LICENSE +0 -0
  65. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/README_AGENT_WORKFLOW.md +0 -0
  66. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/README_OLLAMA.md +0 -0
  67. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/cc.png +0 -0
  68. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/superpowers/plans/2026-06-26-file-editor-improvements.md +0 -0
  69. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/superpowers/plans/2026-06-26-session-save-resume.md +0 -0
  70. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/superpowers/specs/2026-06-26-file-editor-improvements-design.md +0 -0
  71. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/superpowers/specs/2026-06-26-session-save-resume-design.md +0 -0
  72. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/scripts/check_logging_imports.py +0 -0
  73. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/scripts/exception_baseline.txt +0 -0
  74. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/scripts/find_percent_logging.py +0 -0
  75. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/scripts/logging_gates.py +0 -0
  76. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/__init__.py +0 -0
  77. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/__main__.py +0 -0
  78. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/agents/__init__.py +0 -0
  79. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/agents/callbacks.py +0 -0
  80. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/agents/run.py +0 -0
  81. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/agents/runner.py +0 -0
  82. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/agents/tool.py +0 -0
  83. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/agents/worktree.py +0 -0
  84. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/application/README.md +0 -0
  85. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/application/__init__.py +0 -0
  86. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/application/execution_policy.py +0 -0
  87. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/application/message_contract.py +0 -0
  88. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/application/validation.py +0 -0
  89. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/cli_callbacks.py +0 -0
  90. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/cli_runner.py +0 -0
  91. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/console.py +0 -0
  92. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/cache_monitor.py +0 -0
  93. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/context.py +0 -0
  94. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/context_manager.py +0 -0
  95. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/context_manager_factory.py +0 -0
  96. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/default_context_manager.py +0 -0
  97. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/ollama_context_manager.py +0 -0
  98. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/result.py +0 -0
  99. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/session.py +0 -0
  100. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/diagnostics.py +0 -0
  101. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/log.py +0 -0
  102. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/logging_config.py +0 -0
  103. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/loops/__init__.py +0 -0
  104. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/masking.py +0 -0
  105. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/parser.py +0 -0
  106. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/process_manager.py +0 -0
  107. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/prompts.py +0 -0
  108. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/__init__.py +0 -0
  109. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/claude.py +0 -0
  110. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/deepseek.py +0 -0
  111. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/gemini.py +0 -0
  112. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/glm.py +0 -0
  113. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/__init__.py +0 -0
  114. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/_errors.py +0 -0
  115. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/base.py +0 -0
  116. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/deepseek.py +0 -0
  117. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/generic_native.py +0 -0
  118. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/generic_xml.py +0 -0
  119. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/matrix.py +0 -0
  120. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/minimax.py +0 -0
  121. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/qwen3.py +0 -0
  122. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/registry.py +0 -0
  123. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_inspector.py +0 -0
  124. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/qwen.py +0 -0
  125. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/orchestrator.py +0 -0
  126. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/retry.py +0 -0
  127. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/services/__init__.py +0 -0
  128. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/services/interactions.py +0 -0
  129. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/themes/__init__.py +0 -0
  130. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/__init__.py +0 -0
  131. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/__init__.py +0 -0
  132. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/background_process_tool.py +0 -0
  133. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/context.py +0 -0
  134. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/context_definitions.py +0 -0
  135. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/note_tool.py +0 -0
  136. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/notes.py +0 -0
  137. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/notes_definitions.py +0 -0
  138. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/process_manager_definitions.py +0 -0
  139. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/search.py +0 -0
  140. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/search_definitions.py +0 -0
  141. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/shell.py +0 -0
  142. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/shell_definitions.py +0 -0
  143. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/skill.py +0 -0
  144. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/skill_definitions.py +0 -0
  145. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/task_definitions.py +0 -0
  146. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/task_tool.py +0 -0
  147. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/tasks.py +0 -0
  148. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/utils_tools.py +0 -0
  149. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/utils_tools_definitions.py +0 -0
  150. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/web.py +0 -0
  151. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/web_definitions.py +0 -0
  152. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/definition.py +0 -0
  153. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/hooks.py +0 -0
  154. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/normalization.py +0 -0
  155. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/plugin_api.py +0 -0
  156. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/plugin_github.py +0 -0
  157. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/plugin_status.py +0 -0
  158. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/schemas.py +0 -0
  159. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/utils.py +0 -0
  160. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/adapter.py +0 -0
  161. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/helpers.py +0 -0
  162. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/keybindings.py +0 -0
  163. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/parser.py +0 -0
  164. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/rendering.py +0 -0
  165. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/theme_manager.py +0 -0
  166. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/types.py +0 -0
  167. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/ui.py +0 -0
  168. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/version.py +0 -0
  169. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/COVERAGE.md +0 -0
  170. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/__init__.py +0 -0
  171. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/__init__.py +0 -0
  172. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_agent_consolidated.py +0 -0
  173. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_agent_severity.py +0 -0
  174. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_agent_tools.py +0 -0
  175. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_callbacks.py +0 -0
  176. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_config.py +0 -0
  177. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_integration.py +0 -0
  178. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_queue.py +0 -0
  179. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_registry.py +0 -0
  180. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_run.py +0 -0
  181. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_runner.py +0 -0
  182. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_runner_provider_unavailable.py +0 -0
  183. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_tool.py +0 -0
  184. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_worktree_helpers.py +0 -0
  185. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_worktree_isolation.py +0 -0
  186. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/application/test_execution_result_truthfulness.py +0 -0
  187. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/application/test_message_contract.py +0 -0
  188. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/application/test_runtime_factory.py +0 -0
  189. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/client/test_main.py +0 -0
  190. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/conftest.py +0 -0
  191. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/convergence/__init__.py +0 -0
  192. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/convergence/test_execution_policy_parity.py +0 -0
  193. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/convergence/test_runtime_wiring.py +0 -0
  194. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/convergence/test_validation_path.py +0 -0
  195. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_asyncio_bridge.py +0 -0
  196. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_cache_monitor.py +0 -0
  197. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_config.py +0 -0
  198. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_config_coverage.py +0 -0
  199. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_config_migration.py +0 -0
  200. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_config_provider_logging.py +0 -0
  201. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_config_retry.py +0 -0
  202. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_config_v2.py +0 -0
  203. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_context_manager_factory.py +0 -0
  204. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_default_context_manager.py +0 -0
  205. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_default_context_manager_should_compact.py +0 -0
  206. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_event_emission.py +0 -0
  207. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_event_stream.py +0 -0
  208. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_exception_guarantee.py +0 -0
  209. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_exception_hooks.py +0 -0
  210. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_log_facade.py +0 -0
  211. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_logging_config_keys.py +0 -0
  212. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_logging_sinks.py +0 -0
  213. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_loguru_caplog.py +0 -0
  214. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_ollama_context_manager.py +0 -0
  215. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_ollama_context_manager_cache_monitor.py +0 -0
  216. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_ollama_context_manager_max_history.py +0 -0
  217. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_parameter_aliasing.py +0 -0
  218. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_parser.py +0 -0
  219. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_session.py +0 -0
  220. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_session_id_threading.py +0 -0
  221. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_sink_masking.py +0 -0
  222. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/loops/__init__.py +0 -0
  223. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/loops/test_base.py +0 -0
  224. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/loops/test_chat_loop_hook.py +0 -0
  225. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/loops/test_chat_loop_tool_truncation.py +0 -0
  226. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/loops/test_loop_severity.py +0 -0
  227. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/__init__.py +0 -0
  228. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/__init__.py +0 -0
  229. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_base.py +0 -0
  230. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_deepseek.py +0 -0
  231. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_errors.py +0 -0
  232. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_fallback.py +0 -0
  233. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_generic_native.py +0 -0
  234. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_generic_xml.py +0 -0
  235. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_matrix.py +0 -0
  236. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_minimax.py +0 -0
  237. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_provider_integration.py +0 -0
  238. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_qwen3.py +0 -0
  239. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_registry.py +0 -0
  240. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_glm_async.py +0 -0
  241. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_ollama_inspector.py +0 -0
  242. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_ollama_xml.py +0 -0
  243. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_ollama_xml_autoroute.py +0 -0
  244. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_ollama_xml_usage.py +0 -0
  245. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_orchestrator_capabilities.py +0 -0
  246. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_provider_channel_binding.py +0 -0
  247. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_provider_severity.py +0 -0
  248. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_qwen_async.py +0 -0
  249. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_retry_classifier.py +0 -0
  250. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_retry_integration.py +0 -0
  251. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_retrying_provider.py +0 -0
  252. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/scripts/test_logging_policy_gates.py +0 -0
  253. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/scripts/test_loguru_private_shape.py +0 -0
  254. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/services/test_boundary.py +0 -0
  255. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/services/test_interaction_sink.py +0 -0
  256. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/test_cli.py +0 -0
  257. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/test_cli_callbacks.py +0 -0
  258. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/test_context.py +0 -0
  259. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/test_env_manager.py +0 -0
  260. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/test_logging_config.py +0 -0
  261. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/test_notes.py +0 -0
  262. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/test_process_manager.py +0 -0
  263. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/test_tasks.py +0 -0
  264. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/__init__.py +0 -0
  265. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_agent_notes.py +0 -0
  266. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_background_process_tool.py +0 -0
  267. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_bash_tool.py +0 -0
  268. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_definition_discovery.py +0 -0
  269. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_di_injection.py +0 -0
  270. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_file_editor_hardening.py +0 -0
  271. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_impl.py +0 -0
  272. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_impl_coverage.py +0 -0
  273. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_note_tool.py +0 -0
  274. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_notes_api.py +0 -0
  275. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_path_security.py +0 -0
  276. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_plugin_api.py +0 -0
  277. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_plugin_github.py +0 -0
  278. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_plugin_loading.py +0 -0
  279. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_plugin_manager.py +0 -0
  280. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_plugin_status.py +0 -0
  281. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_registry.py +0 -0
  282. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_registry_coverage.py +0 -0
  283. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_result.py +0 -0
  284. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_schemas.py +0 -0
  285. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_search_codebase.py +0 -0
  286. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_search_hardening.py +0 -0
  287. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_skill_tool.py +0 -0
  288. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_task_tool.py +0 -0
  289. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_tool_severity.py +0 -0
  290. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_utils.py +0 -0
  291. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_web.py +0 -0
  292. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/__init__.py +0 -0
  293. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_agent_list_screen.py +0 -0
  294. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_do_clear_coordination.py +0 -0
  295. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_follow_mode.py +0 -0
  296. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_help_screen.py +0 -0
  297. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_input_box.py +0 -0
  298. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_keybindings.py +0 -0
  299. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_multi_select_screen.py +0 -0
  300. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_multiline_input.py +0 -0
  301. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_paste.py +0 -0
  302. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_pending_compact_consumer.py +0 -0
  303. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_pull_delivery.py +0 -0
  304. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_resume.py +0 -0
  305. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_status_bar_badges.py +0 -0
  306. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_themes.py +0 -0
  307. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_turn_consumer.py +0 -0
  308. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_diff_preview.py +0 -0
  309. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_plugin_autoenable.py +0 -0
  310. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_provider_switch.py +0 -0
  311. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_run_tui_startup.py +0 -0
  312. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_assistant_sanitization.py +0 -0
  313. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_chat_loop.py +0 -0
  314. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_commands_agent.py +0 -0
  315. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_commands_logging.py +0 -0
  316. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_commands_plugin.py +0 -0
  317. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_commands_skill.py +0 -0
  318. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_helpers.py +0 -0
  319. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_temporal_command.py +0 -0
  320. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_widgets.py +0 -0
  321. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_ui.py +0 -0
  322. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_ui_coverage.py +0 -0
  323. {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_ui_verbose.py +0 -0
@@ -87,6 +87,7 @@ ayder-cli/
87
87
  │ ├── providers/ # LLM provider implementations
88
88
  │ │ ├── base.py # AIProvider protocol, NormalizedStreamChunk
89
89
  │ │ ├── orchestrator.py # Factory: create(config) → provider
90
+ │ │ ├── evren.py # evren gateway terms-of-use acceptance (/model)
90
91
  │ │ └── impl/ # Individual provider drivers
91
92
  │ │ ├── openai.py # OpenAIProvider (base for most drivers)
92
93
  │ │ ├── ollama.py # OllamaProvider (native + XML fallback)
@@ -385,6 +386,22 @@ uv run poe test-cov # With coverage report
385
386
  - **Coverage**: Maintain existing coverage levels
386
387
  - **Timeout**: Use `--timeout=30` to prevent hanging tests
387
388
 
389
+ ### Test Definitions
390
+
391
+ Plans and reviews use these values.
392
+
393
+ - **Kinds**
394
+ - `baseline regression` — fails on the parent commit for a named reason, passes on the fix.
395
+ - `new interface` — fails at its assertion once a minimal callable version exists (never on an `ImportError`).
396
+ - `preservation` — passes before and after the change; its assertion depends on the behaviour it preserves.
397
+ - **Layers**
398
+ - `unit` — a function or class, without a Textual app.
399
+ - `tui` — a Textual app driven under `App.run_test()`.
400
+ - **Environment**
401
+ - `local-faked` — the only one. No network: HTTP is faked with `httpx.MockTransport` passed to the SDK client; other I/O uses `unittest.mock`. No test reaches a real provider.
402
+
403
+ The gate procedure lives in [docs/GATE.md](docs/GATE.md).
404
+
388
405
  ### Writing Tests
389
406
 
390
407
  ```python
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ayder-cli
3
- Version: 2.3.0
3
+ Version: 2.4.0
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
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3
16
16
  Requires-Python: >=3.12
17
17
  Requires-Dist: httpx
18
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
@@ -155,6 +155,8 @@ in the core install.
155
155
 
156
156
  ayder-cli uses a flexible profile-based configuration system. On the first run, it creates a config file at `~/.ayder/config.toml`.
157
157
 
158
+ The generated file includes an `[llm.evren]` profile for the evren gateway (`https://evren-llmapi.ssyz.org.tr/v1`) with an empty `api_key`. Fill in your key and switch to it with `/provider evren`.
159
+
158
160
  **Key Concepts:**
159
161
  - **Profile Name:** A custom named section (e.g., `[llm.my_ollama]`). You can define as many profiles as you want.
160
162
  - **Driver:** The underlying native SDK or adapter used by the profile (`ollama`, `openai`, `anthropic`, `google`, `deepseek`, `qwen`, or `glm`). Each driver guarantees full support for native tool calling and streaming.
@@ -266,6 +268,50 @@ num_ctx = 1000000
266
268
 
267
269
  Please adjust `num_ctx` context size window according to your local computer RAM. If Ollama crashes, decrease the value.
268
270
 
271
+ ### Reasoning Effort (`/effort`)
272
+
273
+ Use `/effort` to open a picker, or `/effort high` to change the active session.
274
+ Changes apply between turns and are inherited by future agents that use the
275
+ session's profile; explicit agent settings take precedence. They do not change
276
+ `config.toml`. `/effort default` restores the provider's default behavior
277
+ (omits OpenAI effort and Ollama's `think` parameter).
278
+
279
+ | Driver | Runtime values |
280
+ |--------|----------------|
281
+ | `openai` | `default`, `none`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max` |
282
+ | `ollama` | `default`, `on`, `off`, `low`, `medium`, `high` (`true`/`false` and `none` are also accepted) |
283
+
284
+ Support varies by model. OpenAI values follow its
285
+ [Chat Completions API](https://developers.openai.com/api/reference/resources/chat/subresources/completions/methods/create).
286
+ Ollama uses the installed Python SDK's boolean and three-level `think` options;
287
+ its SDK does not yet accept the server API's newer `max` value. GPT-OSS expects
288
+ `low`, `medium`, or `high`, and cannot disable thinking. See
289
+ [Ollama thinking](https://docs.ollama.com/capabilities/thinking).
290
+
291
+ Set persistent defaults per LLM profile and agent:
292
+
293
+ ```toml
294
+ [llm.openai]
295
+ driver = "openai"
296
+ reasoning_effort = "medium"
297
+
298
+ [llm.ollama]
299
+ driver = "ollama"
300
+ reasoning_effort = "high"
301
+
302
+ [agents.reviewer]
303
+ provider = "openai"
304
+ reasoning_effort = "high"
305
+ system_prompt = "Review code and report findings."
306
+ ```
307
+
308
+ Omit an agent's `reasoning_effort` to inherit its profile, or set it to
309
+ `"default"` to clear an inherited effort. On Ollama, `"none"` maps to
310
+ `think = false`; an explicit effort overrides the legacy `think` setting.
311
+ Existing `think = true/false/"low"/"medium"/"high"` profile and agent settings
312
+ remain supported. OpenAI omits reasoning effort by default, preserving
313
+ compatibility with models and endpoints that do not support it.
314
+
269
315
  ### Changing Models on the Fly (`/model`)
270
316
 
271
317
  You do **not** need a separate profile for every model. The profile defines the *connection* (driver, base URL, API key).
@@ -275,6 +321,10 @@ Once a profile is active, use `/model` in the TUI to swap models on the fly:
275
321
  - **Interactive Picker:** `/model` with no arguments queries the active driver for available models and opens a picker.
276
322
  - **Direct Switch:** `/model <model-name>` immediately switches to that model.
277
323
 
324
+ If the provider rejects the listing request, `/model` shows the server's error.
325
+
326
+ For the evren gateway (`evren-llmapi.ssyz.org.tr`), if your account has not accepted the current terms of use, `/model` shows them and asks you to Approve or Deny; Approve accepts them on the server.
327
+
278
328
  Changes made with `/model` apply to the current session only. To make a model the permanent default, update `model = "..."` in your `config.toml`.
279
329
 
280
330
  ## Usage
@@ -392,6 +442,7 @@ You can also manually manage context with the `context` tool and its slash-comma
392
442
  | `/help` | Show available commands and keyboard shortcuts |
393
443
  | `/provider` | Switch LLM provider (interactive selector or direct name) |
394
444
  | `/model` | List available models or switch model (e.g., `/model qwen3-coder`) |
445
+ | `/effort` | Pick reasoning effort or set it directly (e.g., `/effort high`) |
395
446
  | `/plugin` | Toggle tool plugins by tag (e.g., venv, http, background, python, dbs) |
396
447
  | `/tools` | List currently enabled tools and descriptions |
397
448
  | `/permission` | Toggle permission levels (r/w/x/http) interactively |
@@ -670,9 +721,46 @@ RECOMMENDATIONS: Parameterize all DB queries; add Pydantic validators to all end
670
721
 
671
722
  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.
672
723
 
724
+ ## MCP servers
725
+
726
+ MCP support is built in and installed with Ayder. Add `.ayder/mcp.json` in your
727
+ project root, then start Ayder:
728
+
729
+ ```json
730
+ {
731
+ "mcpServers": {
732
+ "local-tools": {
733
+ "command": "python",
734
+ "args": ["server.py"],
735
+ "env": {"EXAMPLE_SETTING": "value"}
736
+ },
737
+ "remote-tools": {
738
+ "url": "http://localhost:8000/mcp"
739
+ }
740
+ }
741
+ }
742
+ ```
743
+
744
+ Local servers use stdio and run from the project root; remote servers use
745
+ Streamable HTTP. Their tools automatically join the standard `core` toolset in
746
+ the CLI, TUI, and delegated agents. No plugin installation or `/plugin` toggle
747
+ is needed. Tool calls retain the usual permissions: `x` for stdio servers and
748
+ `http` for HTTP servers. Configure only servers you intend Ayder to connect to:
749
+ local server commands start during runtime initialization to discover tools.
750
+
751
+ Tools keep their server-provided names unless they conflict with an existing
752
+ tool; conflicting names receive a `server__` prefix (and a numeric suffix if
753
+ needed). Unreachable servers are skipped so other tools remain available.
754
+ Connections are shared by agents in the same project and closed on process
755
+ exit. Restart Ayder after changing `mcp.json`.
756
+
757
+ Existing `mcp-tool` plugin installations are automatically skipped in favor of
758
+ built-in support; your existing `.ayder/mcp.json` continues to work. The legacy
759
+ `ayder-cli[mcp]` installation extra is still accepted.
760
+
673
761
  ## Plugins
674
762
 
675
- 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:
763
+ 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:
676
764
 
677
765
  ```bash
678
766
  ayder install-plugin https://github.com/ayder/ayder-plugins/tree/main/venv-tools
@@ -112,6 +112,8 @@ in the core install.
112
112
 
113
113
  ayder-cli uses a flexible profile-based configuration system. On the first run, it creates a config file at `~/.ayder/config.toml`.
114
114
 
115
+ The generated file includes an `[llm.evren]` profile for the evren gateway (`https://evren-llmapi.ssyz.org.tr/v1`) with an empty `api_key`. Fill in your key and switch to it with `/provider evren`.
116
+
115
117
  **Key Concepts:**
116
118
  - **Profile Name:** A custom named section (e.g., `[llm.my_ollama]`). You can define as many profiles as you want.
117
119
  - **Driver:** The underlying native SDK or adapter used by the profile (`ollama`, `openai`, `anthropic`, `google`, `deepseek`, `qwen`, or `glm`). Each driver guarantees full support for native tool calling and streaming.
@@ -223,6 +225,50 @@ num_ctx = 1000000
223
225
 
224
226
  Please adjust `num_ctx` context size window according to your local computer RAM. If Ollama crashes, decrease the value.
225
227
 
228
+ ### Reasoning Effort (`/effort`)
229
+
230
+ Use `/effort` to open a picker, or `/effort high` to change the active session.
231
+ Changes apply between turns and are inherited by future agents that use the
232
+ session's profile; explicit agent settings take precedence. They do not change
233
+ `config.toml`. `/effort default` restores the provider's default behavior
234
+ (omits OpenAI effort and Ollama's `think` parameter).
235
+
236
+ | Driver | Runtime values |
237
+ |--------|----------------|
238
+ | `openai` | `default`, `none`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max` |
239
+ | `ollama` | `default`, `on`, `off`, `low`, `medium`, `high` (`true`/`false` and `none` are also accepted) |
240
+
241
+ Support varies by model. OpenAI values follow its
242
+ [Chat Completions API](https://developers.openai.com/api/reference/resources/chat/subresources/completions/methods/create).
243
+ Ollama uses the installed Python SDK's boolean and three-level `think` options;
244
+ its SDK does not yet accept the server API's newer `max` value. GPT-OSS expects
245
+ `low`, `medium`, or `high`, and cannot disable thinking. See
246
+ [Ollama thinking](https://docs.ollama.com/capabilities/thinking).
247
+
248
+ Set persistent defaults per LLM profile and agent:
249
+
250
+ ```toml
251
+ [llm.openai]
252
+ driver = "openai"
253
+ reasoning_effort = "medium"
254
+
255
+ [llm.ollama]
256
+ driver = "ollama"
257
+ reasoning_effort = "high"
258
+
259
+ [agents.reviewer]
260
+ provider = "openai"
261
+ reasoning_effort = "high"
262
+ system_prompt = "Review code and report findings."
263
+ ```
264
+
265
+ Omit an agent's `reasoning_effort` to inherit its profile, or set it to
266
+ `"default"` to clear an inherited effort. On Ollama, `"none"` maps to
267
+ `think = false`; an explicit effort overrides the legacy `think` setting.
268
+ Existing `think = true/false/"low"/"medium"/"high"` profile and agent settings
269
+ remain supported. OpenAI omits reasoning effort by default, preserving
270
+ compatibility with models and endpoints that do not support it.
271
+
226
272
  ### Changing Models on the Fly (`/model`)
227
273
 
228
274
  You do **not** need a separate profile for every model. The profile defines the *connection* (driver, base URL, API key).
@@ -232,6 +278,10 @@ Once a profile is active, use `/model` in the TUI to swap models on the fly:
232
278
  - **Interactive Picker:** `/model` with no arguments queries the active driver for available models and opens a picker.
233
279
  - **Direct Switch:** `/model <model-name>` immediately switches to that model.
234
280
 
281
+ If the provider rejects the listing request, `/model` shows the server's error.
282
+
283
+ For the evren gateway (`evren-llmapi.ssyz.org.tr`), if your account has not accepted the current terms of use, `/model` shows them and asks you to Approve or Deny; Approve accepts them on the server.
284
+
235
285
  Changes made with `/model` apply to the current session only. To make a model the permanent default, update `model = "..."` in your `config.toml`.
236
286
 
237
287
  ## Usage
@@ -349,6 +399,7 @@ You can also manually manage context with the `context` tool and its slash-comma
349
399
  | `/help` | Show available commands and keyboard shortcuts |
350
400
  | `/provider` | Switch LLM provider (interactive selector or direct name) |
351
401
  | `/model` | List available models or switch model (e.g., `/model qwen3-coder`) |
402
+ | `/effort` | Pick reasoning effort or set it directly (e.g., `/effort high`) |
352
403
  | `/plugin` | Toggle tool plugins by tag (e.g., venv, http, background, python, dbs) |
353
404
  | `/tools` | List currently enabled tools and descriptions |
354
405
  | `/permission` | Toggle permission levels (r/w/x/http) interactively |
@@ -627,9 +678,46 @@ RECOMMENDATIONS: Parameterize all DB queries; add Pydantic validators to all end
627
678
 
628
679
  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.
629
680
 
681
+ ## MCP servers
682
+
683
+ MCP support is built in and installed with Ayder. Add `.ayder/mcp.json` in your
684
+ project root, then start Ayder:
685
+
686
+ ```json
687
+ {
688
+ "mcpServers": {
689
+ "local-tools": {
690
+ "command": "python",
691
+ "args": ["server.py"],
692
+ "env": {"EXAMPLE_SETTING": "value"}
693
+ },
694
+ "remote-tools": {
695
+ "url": "http://localhost:8000/mcp"
696
+ }
697
+ }
698
+ }
699
+ ```
700
+
701
+ Local servers use stdio and run from the project root; remote servers use
702
+ Streamable HTTP. Their tools automatically join the standard `core` toolset in
703
+ the CLI, TUI, and delegated agents. No plugin installation or `/plugin` toggle
704
+ is needed. Tool calls retain the usual permissions: `x` for stdio servers and
705
+ `http` for HTTP servers. Configure only servers you intend Ayder to connect to:
706
+ local server commands start during runtime initialization to discover tools.
707
+
708
+ Tools keep their server-provided names unless they conflict with an existing
709
+ tool; conflicting names receive a `server__` prefix (and a numeric suffix if
710
+ needed). Unreachable servers are skipped so other tools remain available.
711
+ Connections are shared by agents in the same project and closed on process
712
+ exit. Restart Ayder after changing `mcp.json`.
713
+
714
+ Existing `mcp-tool` plugin installations are automatically skipped in favor of
715
+ built-in support; your existing `.ayder/mcp.json` continues to work. The legacy
716
+ `ayder-cli[mcp]` installation extra is still accepted.
717
+
630
718
  ## Plugins
631
719
 
632
- 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:
720
+ 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:
633
721
 
634
722
  ```bash
635
723
  ayder install-plugin https://github.com/ayder/ayder-plugins/tree/main/venv-tools
@@ -0,0 +1,28 @@
1
+ # Gate
2
+
3
+ The procedure an agent follows to gate a candidate commit. Follow the steps in order and do
4
+ not interpret the results. Never edit a file, fix a failure, skip a step or create a worktree.
5
+ Test definitions live in [AGENTS.md](../AGENTS.md#test-definitions).
6
+
7
+ Input: the candidate SHA.
8
+
9
+ 1. `git rev-parse HEAD` → expected: exactly the candidate SHA.
10
+ 2. `git status --porcelain` → expected: empty output.
11
+ 3. `uv run poe check-all` → expected: exit code 0. This runs lint, typecheck, the logging
12
+ gates and the test suite, and stops at the first failing task.
13
+ 4. Copy the final pytest summary line (`=== N passed, M skipped in …s ===`) verbatim.
14
+
15
+ Last measured: `2494 passed, 2 skipped` on `feat/evren-terms` with the evren default profile (2026-09-29).
16
+
17
+ ## Report format
18
+
19
+ ```text
20
+ SHA: <candidate SHA>
21
+ 1 git rev-parse HEAD: <output> (match|MISMATCH)
22
+ 2 git status --porcelain: <empty|output>
23
+ 3 uv run poe check-all: exit <code>
24
+ 4 summary: <pytest summary line verbatim>
25
+ GATE COMPLETE | GATE FAILED at step <n>
26
+ ```
27
+
28
+ `GATE COMPLETE` only when steps 1–3 meet their expected results.
@@ -220,7 +220,7 @@ cli.py:main()
220
220
  | `tui/adapter.py` | Adapter glue between `AyderApp` and `ChatLoop` | callback wiring helpers |
221
221
  | `tui/commands.py` | Slash command handlers | `COMMAND_MAP`, `handle_*()` |
222
222
  | `tui/widgets.py` | Custom widgets | `ChatView`, `ToolPanel`, `CLIInputBar`, `StatusBar`, `AutoCompleteInput` |
223
- | `tui/screens.py` | Modal screens | `AgentListScreen`, `CLIConfirmScreen`, `CLIHelpScreen`, `CLIMultiSelectScreen`, `CLIPermissionScreen`, `CLISafeModeScreen`, `CLISelectScreen`, `TaskEditScreen` |
223
+ | `tui/screens.py` | Modal screens | `AgentListScreen`, `CLIConfirmScreen`, `CLIHelpScreen`, `CLIMultiSelectScreen`, `CLIPermissionScreen`, `CLISafeModeScreen`, `CLISelectScreen`, `EvrenTermsScreen`, `TaskEditScreen` |
224
224
  | `tui/parser.py` | TUI-specific parsing | `content_processor()` |
225
225
  | `tui/helpers.py` | UI helpers | `create_tui_banner()` |
226
226
  | `tui/keybindings.py` | Keybinding declarations | `BINDINGS` |
@@ -242,6 +242,7 @@ All LLM provider implementations live here. Previously some sat under `services/
242
242
  | `providers/__init__.py` | Re-exports | `AIProvider`, `NormalizedStreamChunk`, `ToolCallDef`, `provider_orchestrator` |
243
243
  | `providers/base.py` | Provider protocol + shared DTOs | `AIProvider`, `NormalizedStreamChunk`, `ToolCallDef`, `_ToolCall`, `_FunctionCall` |
244
244
  | `providers/orchestrator.py` | Driver-keyed provider factory | `ProviderOrchestrator`, `provider_orchestrator` |
245
+ | `providers/evren.py` | evren gateway terms-of-use acceptance (used by `/model`) | `EVREN_HOST`, `EvrenTerms`, `is_evren_terms_error`, `fetch_terms`, `accept_terms` |
245
246
  | `providers/impl/ollama.py` | Native Ollama provider (ollama SDK) | `OllamaProvider` |
246
247
  | `providers/impl/ollama_inspector.py` | Ollama model introspection | `OllamaInspector`, `ModelInfo`, `RuntimeState` |
247
248
  | `providers/impl/openai.py` | OpenAI / OpenAI-compatible backend | `OpenAIProvider` |
@@ -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"
@@ -167,6 +170,7 @@ driver = "ollama"
167
170
  base_url = "http://localhost:11434" # route :cloud models through the LOCAL daemon (auth via ~/.ollama/id_ed25519, one-time `ollama signin`)
168
171
  model = "deepseek-v4-pro:cloud" # orchestrator default; per-agent `model` overrides this
169
172
  num_ctx = 131072
173
+ reasoning_effort = "default"
170
174
  think = true # default; set false for known non-thinking models
171
175
  # To hit ollama.com directly instead, swap the line above for:
172
176
  # base_url = "https://ollama.com" # no /v1; then `export OLLAMA_API_KEY=<key>` (the api_key field is inert on this path)
@@ -176,6 +180,7 @@ driver = "ollama"
176
180
  base_url = "http://localhost:11434"
177
181
  model = "qwen3.6:35b-a3b-coding-nvfp4"
178
182
  num_ctx = 32768 # keep modest: local VRAM is the constraint
183
+ reasoning_effort = "default"
179
184
  think = true # default; set false if the selected model rejects thinking
180
185
 
181
186
  # Budget/throughput alternative — swap any cloud agent's `provider` to this, or
@@ -198,7 +203,17 @@ think = true # default; set false if the selected model r
198
203
  # num_ctx = 65536 # sizes the context-manager budget (default 65536); NOT sent to the API
199
204
  # max_output_tokens = 8192 # -> max_tokens / max_completion_tokens (default 4096); keep WELL below num_ctx
200
205
  # stop_sequences = [] # -> stop (default [])
201
- # # 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.
208
+
209
+ # evren gateway (OpenAI-compatible). A fresh config.toml ships this profile with
210
+ # an empty api_key. The first `/model` asks you to accept evren's terms of use.
211
+ # [llm.evren]
212
+ # driver = "openai"
213
+ # base_url = "https://evren-llmapi.ssyz.org.tr/v1"
214
+ # api_key = "" # your evren key
215
+ # model = "deepseek-v4-flash"
216
+ # num_ctx = 131072
202
217
 
203
218
  # =============================================================================
204
219
  # Agents
@@ -211,7 +226,7 @@ provider = "ollama_cloud"
211
226
  model = "glm-5.2:cloud"
212
227
  temperature = 0.4
213
228
  max_output_tokens = 8192
214
- think = "high"
229
+ reasoning_effort = "high"
215
230
  system_prompt = """
216
231
  You are Project Manager #1 — the requirements analyst and spec author.
217
232
 
@@ -239,7 +254,7 @@ provider = "ollama_cloud"
239
254
  model = "deepseek-v4-pro:cloud"
240
255
  temperature = 0.2
241
256
  max_output_tokens = 4096
242
- think = "high"
257
+ reasoning_effort = "high"
243
258
  system_prompt = """
244
259
  You are Project Manager #2 — the independent spec reviewer.
245
260
 
@@ -268,7 +283,7 @@ provider = "ollama_cloud"
268
283
  model = "deepseek-v4-pro:cloud"
269
284
  temperature = 0.3
270
285
  max_output_tokens = 8192
271
- think = "high"
286
+ reasoning_effort = "high"
272
287
  num_ctx = 262144 # long window: hold the whole spec while splitting it into tasks (delays compaction)
273
288
  system_prompt = """
274
289
  You are the Architect — you turn an APPROVED spec into an implementation plan.
@@ -296,7 +311,7 @@ provider = "ollama_cloud"
296
311
  model = "kimi-k2.7-code:cloud"
297
312
  temperature = 0.2
298
313
  max_output_tokens = 8192
299
- think = "high"
314
+ reasoning_effort = "high"
300
315
  system_prompt = """
301
316
  You are the Architecture Reviewer — independent of the Architect.
302
317
 
@@ -398,7 +413,7 @@ provider = "ollama_cloud"
398
413
  model = "kimi-k2.7-code:cloud"
399
414
  temperature = 0.1
400
415
  max_output_tokens = 4096
401
- think = "high"
416
+ reasoning_effort = "high"
402
417
  system_prompt = """
403
418
  You are the Code Reviewer. You review a diff for correctness and quality.
404
419
 
@@ -424,7 +439,7 @@ provider = "ollama_cloud"
424
439
  model = "minimax-m3:cloud"
425
440
  temperature = 0.1
426
441
  max_output_tokens = 4096
427
- think = "high"
442
+ reasoning_effort = "high"
428
443
  num_ctx = 262144 # long window: holds spec + all criteria + diff + test output at once
429
444
  system_prompt = """
430
445
  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.3.0"
7
+ version = "2.4.0"
8
8
  description = "AI agent for any LLMs"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -26,6 +26,7 @@ dependencies = [
26
26
  # Message / StreamSink shapes (§F5-R6), guarded by `_shape_guard()`.
27
27
  "loguru>=0.7,<0.8",
28
28
  "httpx",
29
+ "mcp>=1.19,<2",
29
30
  "rich>=13.0.0",
30
31
  # Pinned exactly to match the runtime: 8.2.5+ replaced the single
31
32
  # "textual-ansi" builtin with per-theme `ansi` flags and ansi-dark/
@@ -39,9 +40,12 @@ dependencies = [
39
40
  anthropic = ["anthropic"]
40
41
  google = ["google-genai"]
41
42
  qwen = ["dashscope"]
42
- 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"]
43
46
  all = ["ayder-cli[anthropic,google,qwen,glm]"]
44
- mcp = ["mcp"]
47
+ # Compatibility extra: MCP is now included in every installation.
48
+ mcp = []
45
49
  # Optional: required only by plugins that do CST-based code transforms.
46
50
  libcst = ["libcst>=1.0.0"]
47
51
 
@@ -71,7 +75,7 @@ dev = [
71
75
  "anthropic",
72
76
  "google-genai",
73
77
  "dashscope",
74
- "zhipuai",
78
+ "zhipuai>=2",
75
79
  ]
76
80
 
77
81
  [tool.poe.tasks]
@@ -24,7 +24,7 @@ DEFAULT_BASELINE = REPO / "scripts" / "exception_baseline.txt"
24
24
 
25
25
  # Frozen census (§C10). A different number means the gate is looking at the
26
26
  # wrong tree, or the census moved without the plan being updated.
27
- EXPECTED_BROAD = 131
27
+ EXPECTED_BROAD = 137
28
28
  BRANCHING = (ast.If, ast.Try, ast.For, ast.While, ast.With, ast.Match)
29
29
  TERMINAL = (ast.Return, ast.Break, ast.Continue, ast.Pass)
30
30
 
@@ -203,13 +203,13 @@ FROZEN_CHAIN_SITES: dict[tuple[str, str, str, str], tuple[str, int]] = {
203
203
  ("log.py", "emit_event", "bind", "**"): ("Name(id='fields', ctx=Load())", 1),
204
204
  }
205
205
 
206
- # The 93 `exception=True` inputs are homogeneous, so they are governed as one
207
- # package-wide shape/count rule rather than 93 site identities - their per-site
206
+ # The 101 `exception=True` inputs are homogeneous, so they are governed as one
207
+ # package-wide shape/count rule rather than 101 site identities - their per-site
208
208
  # discipline is C10's.
209
- FROZEN_EXCEPTION_TRUE = 93
209
+ FROZEN_EXCEPTION_TRUE = 101
210
210
 
211
211
  # Live chain inputs, counted per method. Printed on every run.
212
- CHAIN_TALLY: dict[str, int] = {"bind": 6, "opt": 97, "patch": 0}
212
+ CHAIN_TALLY: dict[str, int] = {"bind": 6, "opt": 105, "patch": 0}
213
213
 
214
214
  # The reviewed composition of THE COMMITTED baseline, frozen by the Phase 5
215
215
  # census: 252 retained non-path + 22 paths + 2 deferred interpolated rows, plus
@@ -218,12 +218,12 @@ CHAIN_TALLY: dict[str, int] = {"bind": 6, "opt": 97, "patch": 0}
218
218
  # unchanged - so the composition is gated too. Caller-supplied baselines (the
219
219
  # gate's own synthetic fixtures) are exempt: this is a fact about one file.
220
220
  FROZEN_TALLY: dict[str, int] = {
221
- "R-name": 93,
222
- "R-id": 36,
223
- "R-count": 88,
221
+ "R-name": 96,
222
+ "R-id": 40,
223
+ "R-count": 90,
224
224
  "R-status": 27,
225
225
  "R-class": 10,
226
- "R-path": 22,
226
+ "R-path": 24,
227
227
  # Both 5-04 deferrals are closed: the two asyncio rows now interpolate the
228
228
  # B2-prime normalized value, and the bridge's dynamic message is masked by
229
229
  # the prose sinks it reaches.