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.
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/AGENTS.md +17 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/PKG-INFO +93 -5
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/README.md +89 -1
- ayder_cli-2.4.0/docs/GATE.md +28 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/PROJECT_STRUCTURE.md +2 -1
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/config.toml.example +30 -15
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/pyproject.toml +8 -4
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/scripts/check_exception_handlers.py +1 -1
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/scripts/check_log_arguments.py +8 -8
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/scripts/log_argument_baseline.txt +11 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/agents/config.py +13 -4
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/agents/registry.py +4 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/application/runtime_factory.py +3 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/cli.py +9 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/config.py +46 -20
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/config_migration.py +2 -0
- ayder_cli-2.4.0/src/ayder_cli/core/reasoning.py +66 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/loops/chat_loop.py +63 -2
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/base.py +2 -1
- ayder_cli-2.4.0/src/ayder_cli/providers/evren.py +61 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama.py +35 -4
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/openai.py +11 -9
- ayder_cli-2.4.0/src/ayder_cli/services/messaging_inbox.py +413 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/themes/ayder.py +37 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/themes/claude.py +37 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/filesystem.py +10 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/filesystem_definitions.py +8 -3
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/execution.py +33 -0
- ayder_cli-2.4.0/src/ayder_cli/tools/mcp.py +113 -0
- ayder_cli-2.4.0/src/ayder_cli/tools/mcp_client.py +157 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/plugin_manager.py +4 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/registry.py +10 -1
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/__init__.py +5 -2
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/app.py +107 -1
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/commands.py +144 -2
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/screens.py +38 -3
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/widgets.py +55 -2
- ayder_cli-2.4.0/tests/core/test_default_config_evren.py +44 -0
- ayder_cli-2.4.0/tests/core/test_reasoning_config.py +130 -0
- ayder_cli-2.4.0/tests/loops/test_required_args_aliases.py +75 -0
- ayder_cli-2.4.0/tests/providers/test_evren.py +79 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_ollama_native.py +16 -0
- ayder_cli-2.4.0/tests/providers/test_ollama_parallel_tool_call_ids.py +92 -0
- ayder_cli-2.4.0/tests/providers/test_openai_list_models.py +47 -0
- ayder_cli-2.4.0/tests/providers/test_reasoning_effort.py +139 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/scripts/test_exception_gate.py +22 -5
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/scripts/test_log_argument_gate.py +18 -18
- ayder_cli-2.4.0/tests/services/test_messaging_inbox.py +289 -0
- ayder_cli-2.4.0/tests/tools/test_file_editor_size_limit.py +62 -0
- ayder_cli-2.4.0/tests/tools/test_mcp.py +202 -0
- ayder_cli-2.4.0/tests/tools/test_mcp_client.py +158 -0
- ayder_cli-2.4.0/tests/tools/test_unexpected_args.py +99 -0
- ayder_cli-2.4.0/tests/tui/test_evren_terms.py +230 -0
- ayder_cli-2.4.0/tests/tui/test_peer_message_turn.py +202 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_widgets.py +103 -1
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_confirm_screen.py +2 -0
- ayder_cli-2.4.0/tests/ui/test_tui_commands_effort.py +136 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_commands_provider.py +13 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/uv.lock +5 -7
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/.github/workflows/ci.yml +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/.github/workflows/python-package.yml +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/.gitignore +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/.python-version +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/LICENSE +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/README_AGENT_WORKFLOW.md +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/README_OLLAMA.md +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/cc.png +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/superpowers/plans/2026-06-26-file-editor-improvements.md +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/superpowers/plans/2026-06-26-session-save-resume.md +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/superpowers/specs/2026-06-26-file-editor-improvements-design.md +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/docs/superpowers/specs/2026-06-26-session-save-resume-design.md +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/scripts/check_logging_imports.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/scripts/exception_baseline.txt +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/scripts/find_percent_logging.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/scripts/logging_gates.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/__main__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/agents/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/agents/callbacks.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/agents/run.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/agents/runner.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/agents/tool.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/agents/worktree.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/application/README.md +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/application/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/application/execution_policy.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/application/message_contract.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/application/validation.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/cli_callbacks.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/cli_runner.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/console.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/cache_monitor.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/context.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/context_manager.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/context_manager_factory.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/default_context_manager.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/ollama_context_manager.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/result.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/core/session.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/diagnostics.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/log.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/logging_config.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/loops/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/masking.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/parser.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/process_manager.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/prompts.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/claude.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/deepseek.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/gemini.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/glm.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/_errors.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/base.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/deepseek.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/generic_native.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/generic_xml.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/matrix.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/minimax.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/qwen3.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_drivers/registry.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/ollama_inspector.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/impl/qwen.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/orchestrator.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/providers/retry.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/services/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/services/interactions.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/themes/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/background_process_tool.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/context.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/context_definitions.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/note_tool.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/notes.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/notes_definitions.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/process_manager_definitions.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/search.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/search_definitions.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/shell.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/shell_definitions.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/skill.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/skill_definitions.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/task_definitions.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/task_tool.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/tasks.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/utils_tools.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/utils_tools_definitions.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/web.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/builtins/web_definitions.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/definition.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/hooks.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/normalization.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/plugin_api.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/plugin_github.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/plugin_status.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/schemas.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tools/utils.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/adapter.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/helpers.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/keybindings.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/parser.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/rendering.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/theme_manager.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/tui/types.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/ui.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/src/ayder_cli/version.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/COVERAGE.md +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_agent_consolidated.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_agent_severity.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_agent_tools.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_callbacks.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_config.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_integration.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_queue.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_registry.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_run.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_runner.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_runner_provider_unavailable.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_tool.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_worktree_helpers.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/agents/test_worktree_isolation.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/application/test_execution_result_truthfulness.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/application/test_message_contract.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/application/test_runtime_factory.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/client/test_main.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/conftest.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/convergence/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/convergence/test_execution_policy_parity.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/convergence/test_runtime_wiring.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/convergence/test_validation_path.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_asyncio_bridge.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_cache_monitor.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_config.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_config_coverage.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_config_migration.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_config_provider_logging.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_config_retry.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_config_v2.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_context_manager_factory.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_default_context_manager.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_default_context_manager_should_compact.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_event_emission.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_event_stream.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_exception_guarantee.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_exception_hooks.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_log_facade.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_logging_config_keys.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_logging_sinks.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_loguru_caplog.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_ollama_context_manager.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_ollama_context_manager_cache_monitor.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_ollama_context_manager_max_history.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_parameter_aliasing.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_parser.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_session.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_session_id_threading.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/core/test_sink_masking.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/loops/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/loops/test_base.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/loops/test_chat_loop_hook.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/loops/test_chat_loop_tool_truncation.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/loops/test_loop_severity.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_base.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_deepseek.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_errors.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_fallback.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_generic_native.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_generic_xml.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_matrix.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_minimax.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_provider_integration.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_qwen3.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/ollama_drivers/test_registry.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_glm_async.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_ollama_inspector.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_ollama_xml.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_ollama_xml_autoroute.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_ollama_xml_usage.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_orchestrator_capabilities.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_provider_channel_binding.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_provider_severity.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_qwen_async.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_retry_classifier.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_retry_integration.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/providers/test_retrying_provider.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/scripts/test_logging_policy_gates.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/scripts/test_loguru_private_shape.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/services/test_boundary.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/services/test_interaction_sink.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/test_cli.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/test_cli_callbacks.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/test_context.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/test_env_manager.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/test_logging_config.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/test_notes.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/test_process_manager.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/test_tasks.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_agent_notes.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_background_process_tool.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_bash_tool.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_definition_discovery.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_di_injection.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_file_editor_hardening.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_impl.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_impl_coverage.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_note_tool.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_notes_api.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_path_security.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_plugin_api.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_plugin_github.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_plugin_loading.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_plugin_manager.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_plugin_status.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_registry.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_registry_coverage.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_result.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_schemas.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_search_codebase.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_search_hardening.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_skill_tool.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_task_tool.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_tool_severity.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_utils.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tools/test_web.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/__init__.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_agent_list_screen.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_do_clear_coordination.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_follow_mode.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_help_screen.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_input_box.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_keybindings.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_multi_select_screen.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_multiline_input.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_paste.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_pending_compact_consumer.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_pull_delivery.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_resume.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_status_bar_badges.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_themes.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/tui/test_turn_consumer.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_diff_preview.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_plugin_autoenable.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_provider_switch.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_run_tui_startup.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_assistant_sanitization.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_chat_loop.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_commands_agent.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_commands_logging.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_commands_plugin.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_commands_skill.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_helpers.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_temporal_command.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_tui_widgets.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_ui.py +0 -0
- {ayder_cli-2.3.0 → ayder_cli-2.4.0}/tests/ui/test_ui_coverage.py +0 -0
- {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
|
+
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,
|
|
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,
|
|
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
|
-
#
|
|
52
|
-
#
|
|
53
|
-
#
|
|
54
|
-
#
|
|
55
|
-
#
|
|
56
|
-
#
|
|
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
|
|
73
|
-
#
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
207
|
-
# package-wide shape/count rule rather than
|
|
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 =
|
|
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":
|
|
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":
|
|
222
|
-
"R-id":
|
|
223
|
-
"R-count":
|
|
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":
|
|
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.
|