ayder-cli 1.7.3__tar.gz → 1.8.3__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-1.7.3 → ayder_cli-1.8.3}/PKG-INFO +31 -66
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/README.md +29 -64
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/docs/PROJECT_STRUCTURE.md +3 -3
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/pyproject.toml +2 -2
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/application/runtime_factory.py +17 -7
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/parser.py +8 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/prompts.py +13 -63
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/ollama_drivers/matrix.py +22 -2
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/ollama_drivers/minimax.py +9 -5
- ayder_cli-1.8.3/src/ayder_cli/tools/builtins/context.py +344 -0
- ayder_cli-1.8.3/src/ayder_cli/tools/builtins/context_definitions.py +54 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/execution.py +9 -1
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/registry.py +21 -3
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tui/app.py +76 -8
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tui/commands.py +90 -58
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/application/test_message_contract.py +1 -2
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/core/test_parser.py +41 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/ollama_drivers/test_matrix.py +2 -1
- ayder_cli-1.8.3/tests/providers/ollama_drivers/test_minimax.py +76 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/test_ollama_xml_autoroute.py +1 -1
- ayder_cli-1.8.3/tests/test_context.py +453 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tools/test_definition_discovery.py +2 -4
- ayder_cli-1.8.3/tests/tools/test_di_injection.py +50 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tools/test_schemas.py +2 -2
- ayder_cli-1.8.3/tests/tui/__init__.py +1 -0
- ayder_cli-1.8.3/tests/tui/test_do_clear_coordination.py +93 -0
- ayder_cli-1.8.3/tests/tui/test_pending_compact_consumer.py +148 -0
- ayder_cli-1.8.3/tests/ui/test_tui_widgets.py +28 -0
- ayder_cli-1.7.3/src/ayder_cli/tools/builtins/memory.py +0 -155
- ayder_cli-1.7.3/src/ayder_cli/tools/builtins/memory_definitions.py +0 -105
- ayder_cli-1.7.3/tests/providers/ollama_drivers/test_minimax.py +0 -49
- ayder_cli-1.7.3/tests/test_memory.py +0 -123
- ayder_cli-1.7.3/tests/ui/test_tui_widgets.py +0 -28
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/.github/workflows/ci.yml +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/.github/workflows/python-package.yml +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/.gitignore +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/.python-version +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/AGENTS.md +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/LICENSE +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/docs/README_OLLAMA.md +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/docs/cc.png +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/docs/config.toml.example +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/__main__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/agents/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/agents/callbacks.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/agents/config.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/agents/registry.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/agents/runner.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/agents/summary.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/agents/tool.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/application/README.md +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/application/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/application/execution_policy.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/application/message_contract.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/application/validation.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/cli.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/cli_callbacks.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/cli_runner.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/console.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/core/cache_monitor.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/core/config.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/core/config_migration.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/core/context.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/core/context_manager.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/core/context_manager_factory.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/core/default_context_manager.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/core/ollama_context_manager.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/core/result.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/logging_config.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/loops/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/loops/chat_loop.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/process_manager.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/base.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/claude.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/deepseek.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/gemini.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/glm.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/ollama.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/ollama_drivers/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/ollama_drivers/_errors.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/ollama_drivers/base.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/ollama_drivers/deepseek.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/ollama_drivers/generic_native.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/ollama_drivers/generic_xml.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/ollama_drivers/qwen3.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/ollama_drivers/registry.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/ollama_inspector.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/openai.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/impl/qwen.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/orchestrator.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/providers/retry.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/services/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/services/interactions.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/themes/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/themes/claude.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/themes/original.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/builtins/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/builtins/filesystem.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/builtins/filesystem_definitions.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/builtins/notes.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/builtins/notes_definitions.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/builtins/process_manager_definitions.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/builtins/search.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/builtins/search_definitions.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/builtins/shell.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/builtins/shell_definitions.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/builtins/tasks.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/builtins/tasks_definitions.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/builtins/utils_tools.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/builtins/utils_tools_definitions.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/builtins/web.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/builtins/web_definitions.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/definition.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/hooks.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/normalization.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/plugin_api.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/plugin_github.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/plugin_manager.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/schemas.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tools/utils.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tui/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tui/adapter.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tui/helpers.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tui/keybindings.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tui/parser.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tui/screens.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tui/theme_manager.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tui/types.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/tui/widgets.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/ui.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/src/ayder_cli/version.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/COVERAGE.md +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/agents/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/agents/test_callbacks.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/agents/test_config.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/agents/test_integration.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/agents/test_registry.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/agents/test_runner.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/agents/test_summary.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/agents/test_tool.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/application/test_runtime_factory.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/client/test_main.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/convergence/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/convergence/test_execution_policy_parity.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/convergence/test_runtime_wiring.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/convergence/test_validation_path.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/core/test_cache_monitor.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/core/test_config.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/core/test_config_coverage.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/core/test_config_migration.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/core/test_config_retry.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/core/test_config_v2.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/core/test_context_manager_factory.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/core/test_default_context_manager.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/core/test_default_context_manager_should_compact.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/core/test_ollama_context_manager.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/core/test_ollama_context_manager_cache_monitor.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/core/test_ollama_context_manager_max_history.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/core/test_parameter_aliasing.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/loops/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/loops/test_base.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/loops/test_chat_loop_hook.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/loops/test_chat_loop_tool_truncation.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/manual_test_verbose.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/ollama_drivers/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/ollama_drivers/test_base.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/ollama_drivers/test_deepseek.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/ollama_drivers/test_errors.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/ollama_drivers/test_fallback.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/ollama_drivers/test_generic_native.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/ollama_drivers/test_generic_xml.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/ollama_drivers/test_provider_integration.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/ollama_drivers/test_qwen3.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/ollama_drivers/test_registry.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/test_glm_async.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/test_ollama_inspector.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/test_ollama_native.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/test_ollama_xml.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/test_ollama_xml_usage.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/test_qwen_async.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/test_retry_classifier.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/test_retry_integration.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/providers/test_retrying_provider.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/services/test_boundary.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/services/test_interaction_sink.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/test_cli.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/test_cli_callbacks.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/test_env_manager.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/test_logging_config.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/test_notes.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/test_process_manager.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/test_tasks.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tools/__init__.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tools/test_impl.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tools/test_impl_coverage.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tools/test_path_security.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tools/test_plugin_api.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tools/test_plugin_github.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tools/test_plugin_loading.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tools/test_plugin_manager.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tools/test_registry.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tools/test_registry_coverage.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tools/test_result.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tools/test_search_codebase.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tools/test_utils.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tools/test_web.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tui/test_agent_list_screen.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tui/test_follow_mode.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tui/test_help_screen.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tui/test_keybindings.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tui/test_multi_select_screen.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tui/test_multiline_input.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tui/test_paste.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/tui/test_widgets.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/ui/test_confirm_screen.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/ui/test_diff_preview.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/ui/test_tui_assistant_sanitization.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/ui/test_tui_chat_loop.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/ui/test_tui_commands_agent.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/ui/test_tui_commands_logging.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/ui/test_tui_commands_provider.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/ui/test_tui_helpers.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/ui/test_tui_temporal_command.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/ui/test_ui.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/ui/test_ui_coverage.py +0 -0
- {ayder_cli-1.7.3 → ayder_cli-1.8.3}/tests/ui/test_ui_verbose.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ayder-cli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.8.3
|
|
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
|
|
@@ -19,7 +19,7 @@ Requires-Dist: google-genai
|
|
|
19
19
|
Requires-Dist: httpx
|
|
20
20
|
Requires-Dist: libcst>=1.0.0
|
|
21
21
|
Requires-Dist: loguru
|
|
22
|
-
Requires-Dist: ollama>=0.6.
|
|
22
|
+
Requires-Dist: ollama>=0.6.2
|
|
23
23
|
Requires-Dist: openai
|
|
24
24
|
Requires-Dist: python-dotenv>=1.0.0
|
|
25
25
|
Requires-Dist: rich>=13.0.0
|
|
@@ -54,39 +54,11 @@ Most AI coding assistants require cloud APIs, subscriptions, or heavy IDE plugin
|
|
|
54
54
|
- **Agentic workflow** -- the LLM reads files, edits code, runs shell commands, and iterates autonomously with configurable iteration limits per message.
|
|
55
55
|
- **Multi-agent** -- define specialized sub-agents in `config.toml`. Each agent runs independently with its own LLM, model, and context. Results are injected back into the main conversation when complete.
|
|
56
56
|
- **Textual TUI** -- an inline terminal interface with chat view, tool panel, thinking block toggle, slash command auto-completion, permission toggles, and tool confirmation modals with diff previews.
|
|
57
|
-
- **
|
|
58
|
-
|
|
59
|
-
### Tested Providers with Models
|
|
60
|
-
|
|
61
|
-
| Provider | Location | Model |
|
|
62
|
-
| -------- | -------- | ----- |
|
|
63
|
-
| ollama | Cloud | deepseek-v3.2:cloud |
|
|
64
|
-
| ollama | Cloud | gemini-3-pro-preview:latest |
|
|
65
|
-
| ollama | Local | glm-4.7-flash:latest |
|
|
66
|
-
| ollama | Cloud | glm-4.7:cloud |
|
|
67
|
-
| ollama | Cloud | glm-5:cloud |
|
|
68
|
-
| ollama | Local | glm-ocr:latest |
|
|
69
|
-
| ollama | Cloud | gpt-oss:120b-cloud |
|
|
70
|
-
| ollama | Cloud | kimi-k2.5:cloud |
|
|
71
|
-
| ollama | Cloud | minimax-m2.5:cloud |
|
|
72
|
-
| ollama | Local | ministral-3:14b |
|
|
73
|
-
| ollama | Cloud | qwen3-coder-next:cloud |
|
|
74
|
-
| ollama | Cloud | qwen3-coder:480b-cloud |
|
|
75
|
-
| ollama | Local | qwen3-coder:latest |
|
|
76
|
-
| anthropic | Cloud | claude-opus-4-6 |
|
|
77
|
-
| anthropic | Cloud | claude-sonnet-4-5-20250929 |
|
|
78
|
-
| anthropic | Cloud | claude-haiku-4-5-20251001 |
|
|
79
|
-
| openai | Cloud | GPT-5.3-Codex |
|
|
80
|
-
| openai | Cloud | GPT-5.3-Codex-Spark |
|
|
81
|
-
| openai | Cloud | GPT-5.2 |
|
|
82
|
-
| openai | Cloud | GPT-5 |
|
|
83
|
-
| gemini | Cloud | gemini-3-deep-think |
|
|
84
|
-
| gemini | Cloud | gemini-3-pro |
|
|
85
|
-
| gemini | Cloud | gemini-3-flash |
|
|
57
|
+
- **Batteries included** -- the OpenAI, Anthropic, Google, and Ollama SDKs all ship with ayder-cli, so every provider works out of the box. The terminal UI is built on Rich and Textual.
|
|
86
58
|
|
|
87
59
|
### Tools
|
|
88
60
|
|
|
89
|
-
LLMs on their own can only generate text. To be a useful coding assistant, the model needs to *act* on your codebase. ayder-cli
|
|
61
|
+
LLMs on their own can only generate text. To be a useful coding assistant, the model needs to *act* on your codebase. ayder-cli ships 16 built-in tools that the model can call, plus optional plugin toolsets (see [Plugins](#plugins)):
|
|
90
62
|
|
|
91
63
|
Each tool has an OpenAI-compatible JSON schema so models that support function calling can use them natively. For models that don't, ayder-cli also parses a custom XML-like syntax (`<function=name><parameter=key>value</parameter></function>`) as a fallback.
|
|
92
64
|
|
|
@@ -134,26 +106,16 @@ export OLLAMA_FLASH_ATTENTION=true
|
|
|
134
106
|
export OLLAMA_MAX_LOADED_MODELS=1
|
|
135
107
|
```
|
|
136
108
|
|
|
137
|
-
### Anthropic
|
|
109
|
+
### Cloud providers (Anthropic, OpenAI, Gemini)
|
|
138
110
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
# Set your API key in ~/.ayder/config.toml (see Configuration below)
|
|
144
|
-
# Then switch provider:
|
|
145
|
-
# /provider anthropic
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
### Gemini setup (optional)
|
|
111
|
+
The Anthropic, OpenAI, and Google SDKs ship with ayder-cli — no extra installs.
|
|
112
|
+
Just add an API key to a profile in `~/.ayder/config.toml` (see Configuration
|
|
113
|
+
below) and switch provider in the TUI:
|
|
149
114
|
|
|
150
115
|
```bash
|
|
151
|
-
#
|
|
152
|
-
pip install google-generativeai
|
|
116
|
+
/provider anthropic # or: openai, gemini
|
|
153
117
|
```
|
|
154
118
|
|
|
155
|
-
Set your API key in `~/.ayder/config.toml`, then switch provider: `/provider gemini`
|
|
156
|
-
|
|
157
119
|
### Configuration: Profiles and Drivers
|
|
158
120
|
|
|
159
121
|
ayder-cli uses a flexible profile-based configuration system. On the first run, it creates a config file at `~/.ayder/config.toml`.
|
|
@@ -218,7 +180,7 @@ rotation = "10 MB"
|
|
|
218
180
|
retention = "7 days"
|
|
219
181
|
|
|
220
182
|
[context_manager]
|
|
221
|
-
enabled =
|
|
183
|
+
enabled = true
|
|
222
184
|
max_context_tokens = 8192
|
|
223
185
|
|
|
224
186
|
[temporal]
|
|
@@ -316,12 +278,14 @@ ayder --implement-all
|
|
|
316
278
|
|
|
317
279
|
By default, every tool call requires user confirmation. Use permission flags to auto-approve tool categories:
|
|
318
280
|
|
|
319
|
-
| Flag | Category |
|
|
320
|
-
| ---- | -------- |
|
|
321
|
-
| `-r` | Read | `file_explorer`, `read_file`, `search_codebase`, `get_project_structure`, `
|
|
322
|
-
| `-w` | Write | `file_editor`, `
|
|
323
|
-
| `-x` | Execute | `run_shell_command`, `run_background_process`, `kill_background_process
|
|
324
|
-
| `--http` | Web/Network | `fetch_web
|
|
281
|
+
| Flag | Category | Built-in tools |
|
|
282
|
+
| ---- | -------- | -------------- |
|
|
283
|
+
| `-r` | Read | `file_explorer`, `read_file`, `search_codebase`, `get_project_structure`, `get_background_output`, `list_background_processes`, `list_tasks`, `show_task` |
|
|
284
|
+
| `-w` | Write | `file_editor`, `context`, `create_note`, `manage_environment_vars` |
|
|
285
|
+
| `-x` | Execute | `run_shell_command`, `run_background_process`, `kill_background_process` |
|
|
286
|
+
| `--http` | Web/Network | `fetch_web` |
|
|
287
|
+
|
|
288
|
+
Installed plugins extend these categories (e.g. `python_editor` → write, virtualenv tools → execute, `dbs_tool` → web).
|
|
325
289
|
|
|
326
290
|
```bash
|
|
327
291
|
# Auto-approve read-only tools
|
|
@@ -370,7 +334,7 @@ The context manager is configured under `[context_manager]` in `config.toml`:
|
|
|
370
334
|
| `max_tool_result_length` | `2048` | Maximum character length for a compressed tool result. |
|
|
371
335
|
| `compress_tool_results` | `true` | Enable automatic tool result compression. |
|
|
372
336
|
|
|
373
|
-
You can also manually manage context with `/save-
|
|
337
|
+
You can also manually manage context with the `context` tool and its slash-command shortcuts: `/save-context`, `/load-context`, `/list-contexts`, `/context-stats`, and `/compact`.
|
|
374
338
|
|
|
375
339
|
### Slash Commands
|
|
376
340
|
|
|
@@ -390,9 +354,11 @@ You can also manually manage context with `/save-memory`, `/load-memory`, and `/
|
|
|
390
354
|
| `/skill` | Activate a domain skill from `.ayder/skills/` |
|
|
391
355
|
| `/verbose` | Toggle verbose mode |
|
|
392
356
|
| `/logging` | Set log level for current session (NONE, ERROR, WARNING, INFO, DEBUG) |
|
|
393
|
-
| `/compact` | Summarize conversation, save
|
|
394
|
-
| `/save-
|
|
395
|
-
| `/load-
|
|
357
|
+
| `/compact` | Summarize conversation, save a context snapshot, clear, and reload |
|
|
358
|
+
| `/save-context` | Summarize conversation and save it to a named context slot (no clear) |
|
|
359
|
+
| `/load-context` | Load a saved context slot and restore it |
|
|
360
|
+
| `/list-contexts` | List saved context slots |
|
|
361
|
+
| `/context-stats` | Show current token and KV-cache usage |
|
|
396
362
|
| `/archive-completed-tasks` | Move completed tasks to `.ayder/task_archive/` |
|
|
397
363
|
| `/temporal` | Start/status Temporal queue worker |
|
|
398
364
|
| `/agent list` | List configured agents and their current status |
|
|
@@ -436,7 +402,7 @@ The standard mode for general coding and chat. Uses the system prompt.
|
|
|
436
402
|
> create a fibonacci function
|
|
437
403
|
```
|
|
438
404
|
|
|
439
|
-
Available tools:
|
|
405
|
+
Available tools: file read/write, shell commands, search, context, notes, tasks.
|
|
440
406
|
|
|
441
407
|
### Planning Mode (`/plan`)
|
|
442
408
|
|
|
@@ -486,24 +452,23 @@ The tool system:
|
|
|
486
452
|
- Supports tag-based filtering for dynamic enable/disable
|
|
487
453
|
- Injects tool-specific system prompts when enabled
|
|
488
454
|
|
|
489
|
-
**
|
|
455
|
+
**Built-in tools (16):**
|
|
490
456
|
|
|
491
457
|
| Category | Tools |
|
|
492
458
|
|----------|-------|
|
|
493
459
|
| **Filesystem** | `file_explorer`, `read_file`, `file_editor` |
|
|
494
460
|
| **Search** | `search_codebase`, `get_project_structure` |
|
|
495
461
|
| **Shell** | `run_shell_command` |
|
|
496
|
-
| **
|
|
497
|
-
| **Memory** | `save_memory`, `load_memory` |
|
|
462
|
+
| **Context** | `context` (save / load / list / stats / clear session context slots) |
|
|
498
463
|
| **Notes** | `create_note` |
|
|
499
464
|
| **Background Processes** | `run_background_process`, `get_background_output`, `kill_background_process`, `list_background_processes` |
|
|
500
465
|
| **Tasks** | `list_tasks`, `show_task` |
|
|
501
466
|
| **Environment** | `manage_environment_vars` |
|
|
502
|
-
| **Virtual Environments** | `create_virtualenv`, `install_requirements`, `list_virtualenvs`, `activate_virtualenv`, `remove_virtualenv` |
|
|
503
467
|
| **Web** | `fetch_web` |
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
468
|
+
|
|
469
|
+
When agents are configured, the `call_agent` tool is also registered so the main LLM can dispatch them (see [Multi-Agent System](#multi-agent-system)).
|
|
470
|
+
|
|
471
|
+
**Plugin tools** — `python_editor`, `dbs_tool`, `temporal_workflow`, virtualenv tools, and MCP integrations ship as optional plugins in the [ayder/ayder-plugins](https://github.com/ayder/ayder-plugins) repo (see [Plugins](#plugins)). Once installed they are auto-discovered exactly like built-ins.
|
|
507
472
|
|
|
508
473
|
## Multi-Agent System
|
|
509
474
|
|
|
@@ -25,39 +25,11 @@ Most AI coding assistants require cloud APIs, subscriptions, or heavy IDE plugin
|
|
|
25
25
|
- **Agentic workflow** -- the LLM reads files, edits code, runs shell commands, and iterates autonomously with configurable iteration limits per message.
|
|
26
26
|
- **Multi-agent** -- define specialized sub-agents in `config.toml`. Each agent runs independently with its own LLM, model, and context. Results are injected back into the main conversation when complete.
|
|
27
27
|
- **Textual TUI** -- an inline terminal interface with chat view, tool panel, thinking block toggle, slash command auto-completion, permission toggles, and tool confirmation modals with diff previews.
|
|
28
|
-
- **
|
|
29
|
-
|
|
30
|
-
### Tested Providers with Models
|
|
31
|
-
|
|
32
|
-
| Provider | Location | Model |
|
|
33
|
-
| -------- | -------- | ----- |
|
|
34
|
-
| ollama | Cloud | deepseek-v3.2:cloud |
|
|
35
|
-
| ollama | Cloud | gemini-3-pro-preview:latest |
|
|
36
|
-
| ollama | Local | glm-4.7-flash:latest |
|
|
37
|
-
| ollama | Cloud | glm-4.7:cloud |
|
|
38
|
-
| ollama | Cloud | glm-5:cloud |
|
|
39
|
-
| ollama | Local | glm-ocr:latest |
|
|
40
|
-
| ollama | Cloud | gpt-oss:120b-cloud |
|
|
41
|
-
| ollama | Cloud | kimi-k2.5:cloud |
|
|
42
|
-
| ollama | Cloud | minimax-m2.5:cloud |
|
|
43
|
-
| ollama | Local | ministral-3:14b |
|
|
44
|
-
| ollama | Cloud | qwen3-coder-next:cloud |
|
|
45
|
-
| ollama | Cloud | qwen3-coder:480b-cloud |
|
|
46
|
-
| ollama | Local | qwen3-coder:latest |
|
|
47
|
-
| anthropic | Cloud | claude-opus-4-6 |
|
|
48
|
-
| anthropic | Cloud | claude-sonnet-4-5-20250929 |
|
|
49
|
-
| anthropic | Cloud | claude-haiku-4-5-20251001 |
|
|
50
|
-
| openai | Cloud | GPT-5.3-Codex |
|
|
51
|
-
| openai | Cloud | GPT-5.3-Codex-Spark |
|
|
52
|
-
| openai | Cloud | GPT-5.2 |
|
|
53
|
-
| openai | Cloud | GPT-5 |
|
|
54
|
-
| gemini | Cloud | gemini-3-deep-think |
|
|
55
|
-
| gemini | Cloud | gemini-3-pro |
|
|
56
|
-
| gemini | Cloud | gemini-3-flash |
|
|
28
|
+
- **Batteries included** -- the OpenAI, Anthropic, Google, and Ollama SDKs all ship with ayder-cli, so every provider works out of the box. The terminal UI is built on Rich and Textual.
|
|
57
29
|
|
|
58
30
|
### Tools
|
|
59
31
|
|
|
60
|
-
LLMs on their own can only generate text. To be a useful coding assistant, the model needs to *act* on your codebase. ayder-cli
|
|
32
|
+
LLMs on their own can only generate text. To be a useful coding assistant, the model needs to *act* on your codebase. ayder-cli ships 16 built-in tools that the model can call, plus optional plugin toolsets (see [Plugins](#plugins)):
|
|
61
33
|
|
|
62
34
|
Each tool has an OpenAI-compatible JSON schema so models that support function calling can use them natively. For models that don't, ayder-cli also parses a custom XML-like syntax (`<function=name><parameter=key>value</parameter></function>`) as a fallback.
|
|
63
35
|
|
|
@@ -105,26 +77,16 @@ export OLLAMA_FLASH_ATTENTION=true
|
|
|
105
77
|
export OLLAMA_MAX_LOADED_MODELS=1
|
|
106
78
|
```
|
|
107
79
|
|
|
108
|
-
### Anthropic
|
|
80
|
+
### Cloud providers (Anthropic, OpenAI, Gemini)
|
|
109
81
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
# Set your API key in ~/.ayder/config.toml (see Configuration below)
|
|
115
|
-
# Then switch provider:
|
|
116
|
-
# /provider anthropic
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### Gemini setup (optional)
|
|
82
|
+
The Anthropic, OpenAI, and Google SDKs ship with ayder-cli — no extra installs.
|
|
83
|
+
Just add an API key to a profile in `~/.ayder/config.toml` (see Configuration
|
|
84
|
+
below) and switch provider in the TUI:
|
|
120
85
|
|
|
121
86
|
```bash
|
|
122
|
-
#
|
|
123
|
-
pip install google-generativeai
|
|
87
|
+
/provider anthropic # or: openai, gemini
|
|
124
88
|
```
|
|
125
89
|
|
|
126
|
-
Set your API key in `~/.ayder/config.toml`, then switch provider: `/provider gemini`
|
|
127
|
-
|
|
128
90
|
### Configuration: Profiles and Drivers
|
|
129
91
|
|
|
130
92
|
ayder-cli uses a flexible profile-based configuration system. On the first run, it creates a config file at `~/.ayder/config.toml`.
|
|
@@ -189,7 +151,7 @@ rotation = "10 MB"
|
|
|
189
151
|
retention = "7 days"
|
|
190
152
|
|
|
191
153
|
[context_manager]
|
|
192
|
-
enabled =
|
|
154
|
+
enabled = true
|
|
193
155
|
max_context_tokens = 8192
|
|
194
156
|
|
|
195
157
|
[temporal]
|
|
@@ -287,12 +249,14 @@ ayder --implement-all
|
|
|
287
249
|
|
|
288
250
|
By default, every tool call requires user confirmation. Use permission flags to auto-approve tool categories:
|
|
289
251
|
|
|
290
|
-
| Flag | Category |
|
|
291
|
-
| ---- | -------- |
|
|
292
|
-
| `-r` | Read | `file_explorer`, `read_file`, `search_codebase`, `get_project_structure`, `
|
|
293
|
-
| `-w` | Write | `file_editor`, `
|
|
294
|
-
| `-x` | Execute | `run_shell_command`, `run_background_process`, `kill_background_process
|
|
295
|
-
| `--http` | Web/Network | `fetch_web
|
|
252
|
+
| Flag | Category | Built-in tools |
|
|
253
|
+
| ---- | -------- | -------------- |
|
|
254
|
+
| `-r` | Read | `file_explorer`, `read_file`, `search_codebase`, `get_project_structure`, `get_background_output`, `list_background_processes`, `list_tasks`, `show_task` |
|
|
255
|
+
| `-w` | Write | `file_editor`, `context`, `create_note`, `manage_environment_vars` |
|
|
256
|
+
| `-x` | Execute | `run_shell_command`, `run_background_process`, `kill_background_process` |
|
|
257
|
+
| `--http` | Web/Network | `fetch_web` |
|
|
258
|
+
|
|
259
|
+
Installed plugins extend these categories (e.g. `python_editor` → write, virtualenv tools → execute, `dbs_tool` → web).
|
|
296
260
|
|
|
297
261
|
```bash
|
|
298
262
|
# Auto-approve read-only tools
|
|
@@ -341,7 +305,7 @@ The context manager is configured under `[context_manager]` in `config.toml`:
|
|
|
341
305
|
| `max_tool_result_length` | `2048` | Maximum character length for a compressed tool result. |
|
|
342
306
|
| `compress_tool_results` | `true` | Enable automatic tool result compression. |
|
|
343
307
|
|
|
344
|
-
You can also manually manage context with `/save-
|
|
308
|
+
You can also manually manage context with the `context` tool and its slash-command shortcuts: `/save-context`, `/load-context`, `/list-contexts`, `/context-stats`, and `/compact`.
|
|
345
309
|
|
|
346
310
|
### Slash Commands
|
|
347
311
|
|
|
@@ -361,9 +325,11 @@ You can also manually manage context with `/save-memory`, `/load-memory`, and `/
|
|
|
361
325
|
| `/skill` | Activate a domain skill from `.ayder/skills/` |
|
|
362
326
|
| `/verbose` | Toggle verbose mode |
|
|
363
327
|
| `/logging` | Set log level for current session (NONE, ERROR, WARNING, INFO, DEBUG) |
|
|
364
|
-
| `/compact` | Summarize conversation, save
|
|
365
|
-
| `/save-
|
|
366
|
-
| `/load-
|
|
328
|
+
| `/compact` | Summarize conversation, save a context snapshot, clear, and reload |
|
|
329
|
+
| `/save-context` | Summarize conversation and save it to a named context slot (no clear) |
|
|
330
|
+
| `/load-context` | Load a saved context slot and restore it |
|
|
331
|
+
| `/list-contexts` | List saved context slots |
|
|
332
|
+
| `/context-stats` | Show current token and KV-cache usage |
|
|
367
333
|
| `/archive-completed-tasks` | Move completed tasks to `.ayder/task_archive/` |
|
|
368
334
|
| `/temporal` | Start/status Temporal queue worker |
|
|
369
335
|
| `/agent list` | List configured agents and their current status |
|
|
@@ -407,7 +373,7 @@ The standard mode for general coding and chat. Uses the system prompt.
|
|
|
407
373
|
> create a fibonacci function
|
|
408
374
|
```
|
|
409
375
|
|
|
410
|
-
Available tools:
|
|
376
|
+
Available tools: file read/write, shell commands, search, context, notes, tasks.
|
|
411
377
|
|
|
412
378
|
### Planning Mode (`/plan`)
|
|
413
379
|
|
|
@@ -457,24 +423,23 @@ The tool system:
|
|
|
457
423
|
- Supports tag-based filtering for dynamic enable/disable
|
|
458
424
|
- Injects tool-specific system prompts when enabled
|
|
459
425
|
|
|
460
|
-
**
|
|
426
|
+
**Built-in tools (16):**
|
|
461
427
|
|
|
462
428
|
| Category | Tools |
|
|
463
429
|
|----------|-------|
|
|
464
430
|
| **Filesystem** | `file_explorer`, `read_file`, `file_editor` |
|
|
465
431
|
| **Search** | `search_codebase`, `get_project_structure` |
|
|
466
432
|
| **Shell** | `run_shell_command` |
|
|
467
|
-
| **
|
|
468
|
-
| **Memory** | `save_memory`, `load_memory` |
|
|
433
|
+
| **Context** | `context` (save / load / list / stats / clear session context slots) |
|
|
469
434
|
| **Notes** | `create_note` |
|
|
470
435
|
| **Background Processes** | `run_background_process`, `get_background_output`, `kill_background_process`, `list_background_processes` |
|
|
471
436
|
| **Tasks** | `list_tasks`, `show_task` |
|
|
472
437
|
| **Environment** | `manage_environment_vars` |
|
|
473
|
-
| **Virtual Environments** | `create_virtualenv`, `install_requirements`, `list_virtualenvs`, `activate_virtualenv`, `remove_virtualenv` |
|
|
474
438
|
| **Web** | `fetch_web` |
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
439
|
+
|
|
440
|
+
When agents are configured, the `call_agent` tool is also registered so the main LLM can dispatch them (see [Multi-Agent System](#multi-agent-system)).
|
|
441
|
+
|
|
442
|
+
**Plugin tools** — `python_editor`, `dbs_tool`, `temporal_workflow`, virtualenv tools, and MCP integrations ship as optional plugins in the [ayder/ayder-plugins](https://github.com/ayder/ayder-plugins) repo (see [Plugins](#plugins)). Once installed they are auto-discovered exactly like built-ins.
|
|
478
443
|
|
|
479
444
|
## Multi-Agent System
|
|
480
445
|
|
|
@@ -289,7 +289,7 @@ the design rationale.
|
|
|
289
289
|
| `tools/builtins/filesystem.py` | File system tool impls | `file_explorer()`, `read_file()`, `file_editor()` |
|
|
290
290
|
| `tools/builtins/search.py` | Search tool impls | `search_codebase()`, `get_project_structure()` |
|
|
291
291
|
| `tools/builtins/shell.py` | Shell execution impl | `run_shell_command()` |
|
|
292
|
-
| `tools/builtins/
|
|
292
|
+
| `tools/builtins/context.py` | Session context snapshots | `context` |
|
|
293
293
|
| `tools/builtins/notes.py` | Note-taking tool | `create_note()` |
|
|
294
294
|
| `tools/builtins/tasks.py` | Task-management tools | `list_tasks()`, `show_task()` |
|
|
295
295
|
| `tools/builtins/web.py` | HTTP fetch tool | `fetch_web()` |
|
|
@@ -642,11 +642,11 @@ Schema-driven tool definitions with auto-discovery:
|
|
|
642
642
|
- **Schema generation**: `to_openai_schema()` returns the OpenAI function-calling dict
|
|
643
643
|
- **Plugin loading**: `tools/plugin_manager.py` can augment `TOOL_DEFINITIONS` at runtime from local or GitHub-sourced plugins
|
|
644
644
|
|
|
645
|
-
|
|
645
|
+
16 built-in tools across 9 definition files:
|
|
646
646
|
- Filesystem (3): `file_explorer`, `read_file`, `file_editor`
|
|
647
647
|
- Search (2): `search_codebase`, `get_project_structure`
|
|
648
648
|
- Shell (1): `run_shell_command`
|
|
649
|
-
-
|
|
649
|
+
- Context (1): `context`
|
|
650
650
|
- Notes (1): `create_note`
|
|
651
651
|
- Background Processes (4): `run_background_process`, `get_background_output`, `kill_background_process`, `list_background_processes`
|
|
652
652
|
- Tasks (2): `list_tasks`, `show_task`
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ayder-cli"
|
|
7
|
-
version = "1.
|
|
7
|
+
version = "1.8.3"
|
|
8
8
|
description = "AI agent for any LLMs"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12"
|
|
@@ -23,7 +23,7 @@ dependencies = [
|
|
|
23
23
|
"openai",
|
|
24
24
|
"anthropic",
|
|
25
25
|
"google-genai",
|
|
26
|
-
"ollama>=0.6.
|
|
26
|
+
"ollama>=0.6.2",
|
|
27
27
|
"loguru",
|
|
28
28
|
"httpx",
|
|
29
29
|
"rich>=13.0.0",
|
|
@@ -62,7 +62,14 @@ def create_runtime(
|
|
|
62
62
|
llm_provider: AIProvider = provider_orchestrator.create(cfg)
|
|
63
63
|
project_ctx = ProjectContext(project_root)
|
|
64
64
|
process_manager = ProcessManager(max_processes=cfg.max_background_processes)
|
|
65
|
-
|
|
65
|
+
|
|
66
|
+
# Create context manager before registry so tools can receive it via DI.
|
|
67
|
+
context_mgr = context_manager_factory.create(cfg)
|
|
68
|
+
tool_registry = create_default_registry(
|
|
69
|
+
project_ctx,
|
|
70
|
+
process_manager=process_manager,
|
|
71
|
+
context_manager=context_mgr,
|
|
72
|
+
)
|
|
66
73
|
|
|
67
74
|
try:
|
|
68
75
|
structure = tool_registry.execute("get_project_structure", {"max_depth": 3})
|
|
@@ -76,8 +83,7 @@ def create_runtime(
|
|
|
76
83
|
tool_prompts = tool_registry.get_system_prompts(tags=tool_tags)
|
|
77
84
|
system_prompt = base_prompt + tool_prompts + macro
|
|
78
85
|
|
|
79
|
-
#
|
|
80
|
-
context_mgr = context_manager_factory.create(cfg)
|
|
86
|
+
# Freeze system prompt after tool schemas are known.
|
|
81
87
|
tool_schemas = tool_registry.get_schemas(tags=tool_tags)
|
|
82
88
|
context_mgr.freeze_system_prompt(system_prompt, tool_schemas)
|
|
83
89
|
|
|
@@ -161,8 +167,13 @@ def create_agent_runtime(
|
|
|
161
167
|
# 3. Create isolated AIProvider
|
|
162
168
|
llm_provider = provider_orchestrator.create(cfg)
|
|
163
169
|
|
|
164
|
-
# 4. Create isolated ToolRegistry (shared PM
|
|
165
|
-
|
|
170
|
+
# 4. Create isolated context manager and ToolRegistry (shared PM/ProjectContext)
|
|
171
|
+
context_mgr = context_manager_factory.create(cfg)
|
|
172
|
+
tool_registry = create_default_registry(
|
|
173
|
+
project_ctx,
|
|
174
|
+
process_manager=process_manager,
|
|
175
|
+
context_manager=context_mgr,
|
|
176
|
+
)
|
|
166
177
|
|
|
167
178
|
# 5. Build agent system prompt
|
|
168
179
|
identity_prefix = (
|
|
@@ -182,8 +193,7 @@ def create_agent_runtime(
|
|
|
182
193
|
tool_prompts = tool_registry.get_system_prompts(tags=tool_tags)
|
|
183
194
|
system_prompt = identity_prefix + agent_config.system_prompt + tool_prompts + summary_suffix
|
|
184
195
|
|
|
185
|
-
#
|
|
186
|
-
context_mgr = context_manager_factory.create(cfg)
|
|
196
|
+
# Freeze agent system prompt after tool schemas are known.
|
|
187
197
|
tool_schemas = tool_registry.get_schemas(tags=tool_tags)
|
|
188
198
|
context_mgr.freeze_system_prompt(system_prompt, tool_schemas)
|
|
189
199
|
|
|
@@ -95,6 +95,13 @@ class ContentProcessor:
|
|
|
95
95
|
_RE_ORPHAN_PARAMETER = re.compile(
|
|
96
96
|
r"</?\uff5c?\uff24?\uff33?\uff2d?\uff2c?\uff5c?parameter[^>]*>"
|
|
97
97
|
)
|
|
98
|
+
# MiniMax models use special structural tokens that can leak into
|
|
99
|
+
# msg.content when an IN_CONTENT driver is used on a multi-turn request
|
|
100
|
+
# (observed empirically on minimax-m3:cloud as ]<]minimax[>[ ). Older M2
|
|
101
|
+
# builds documented the ]~b]<role> / [e~[ role markers. Strip all variants.
|
|
102
|
+
_RE_ORPHAN_MINIMAX_MARKER = re.compile(
|
|
103
|
+
r"\]<\]minimax\[>\[|\]~b\](?:system|user|ai|tool)?|\[e~\["
|
|
104
|
+
)
|
|
98
105
|
|
|
99
106
|
# -- JSON tool arrays (for stripping and parsing) ------------------------
|
|
100
107
|
_RE_JSON_TOOL_ARRAY = re.compile(r'\[\s*\{[^}]*"function"\s*:.*?\}\s*\]', re.DOTALL)
|
|
@@ -427,6 +434,7 @@ class ContentProcessor:
|
|
|
427
434
|
text = self._RE_ORPHAN_FUNCTION_CALLS.sub("", text)
|
|
428
435
|
text = self._RE_ORPHAN_INVOKE.sub("", text)
|
|
429
436
|
text = self._RE_ORPHAN_PARAMETER.sub("", text)
|
|
437
|
+
text = self._RE_ORPHAN_MINIMAX_MARKER.sub("", text)
|
|
430
438
|
return text
|
|
431
439
|
|
|
432
440
|
def _strip_json_tool_arrays(self, text: str) -> str:
|
|
@@ -174,44 +174,9 @@ If you encounter errors, fix them and continue. Only stop when all tasks are mar
|
|
|
174
174
|
|
|
175
175
|
|
|
176
176
|
# =============================================================================
|
|
177
|
-
#
|
|
177
|
+
# CONVERSATION MANAGEMENT PROMPTS
|
|
178
178
|
# =============================================================================
|
|
179
|
-
# Used by: commands
|
|
180
|
-
# REASON: After clearing conversation history, confirm the LLM understands
|
|
181
|
-
# the context is fresh and ready for new work.
|
|
182
|
-
|
|
183
|
-
CLEAR_COMMAND_RESET_PROMPT = """The conversation has been cleared. Please acknowledge this reset and confirm you're ready to start fresh."""
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
# Used by: commands/system.py::SummaryCommand.execute()
|
|
187
|
-
# REASON: Extract key decisions and context from a long conversation and
|
|
188
|
-
# persist it to a memory file for future reference or session restoration.
|
|
189
|
-
|
|
190
|
-
SUMMARY_COMMAND_PROMPT_TEMPLATE = """Please summarize the following conversation and save it to `.ayder/current_memory.md`.
|
|
191
|
-
|
|
192
|
-
The summary should:
|
|
193
|
-
- Capture key decisions, context, and progress
|
|
194
|
-
- Be concise but comprehensive
|
|
195
|
-
- Help future me understand what we've done so far
|
|
196
|
-
|
|
197
|
-
Conversation:
|
|
198
|
-
{conversation_text}
|
|
199
|
-
|
|
200
|
-
Use the write_file tool to save the summary to `.ayder/current_memory.md`."""
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
# Used by: commands/system.py::LoadCommand.execute()
|
|
204
|
-
# REASON: Restore context from a previously saved memory file so the LLM
|
|
205
|
-
# can continue work from where it left off in a previous session.
|
|
206
|
-
|
|
207
|
-
LOAD_MEMORY_COMMAND_PROMPT_TEMPLATE = """I've loaded the previous conversation memory from `.ayder/current_memory.md`.
|
|
208
|
-
Please acknowledge this context and continue from where we left off.
|
|
209
|
-
|
|
210
|
-
[Memory from previous conversation]:
|
|
211
|
-
{memory_content}"""
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
# Used by: commands/system.py::CompactCommand.execute()
|
|
179
|
+
# Used by: tui/commands.py::handle_compact()
|
|
215
180
|
# REASON: Combine summary, save, clear, and reload into a single operation
|
|
216
181
|
# to prevent context window overflow while maintaining continuity.
|
|
217
182
|
|
|
@@ -227,24 +192,21 @@ Provide a brief summary, save it, confirm reset, and acknowledge the context."""
|
|
|
227
192
|
|
|
228
193
|
|
|
229
194
|
# =============================================================================
|
|
230
|
-
# SAVE
|
|
195
|
+
# SAVE CONTEXT COMMAND (tui/commands.py)
|
|
231
196
|
# =============================================================================
|
|
232
|
-
# Used by: tui/commands.py::
|
|
233
|
-
# REASON: Prompt LLM to create and save a memory summary without clearing
|
|
234
|
-
# the conversation history.
|
|
235
|
-
|
|
236
|
-
SAVE_MEMORY_COMMAND_PROMPT_TEMPLATE = """Please create a memory summary of our conversation:
|
|
237
|
-
|
|
238
|
-
{conversation_text}
|
|
197
|
+
# Used by: tui/commands.py::handle_save_context()
|
|
239
198
|
|
|
240
|
-
|
|
199
|
+
SAVE_CONTEXT_COMMAND_PROMPT_TEMPLATE = """Summarize the following conversation in 200-400 words, focusing on:
|
|
200
|
+
- Goals and decisions made
|
|
201
|
+
- Code changes attempted or completed
|
|
202
|
+
- Open questions or next steps
|
|
241
203
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
- Be concise but comprehensive
|
|
245
|
-
- Help future sessions understand what we've done so far
|
|
204
|
+
Then call the context tool exactly once to save it:
|
|
205
|
+
context(action="save", name="{name}", content="<your summary>")
|
|
246
206
|
|
|
247
|
-
|
|
207
|
+
Conversation:
|
|
208
|
+
{conversation_text}
|
|
209
|
+
"""
|
|
248
210
|
|
|
249
211
|
|
|
250
212
|
# =============================================================================
|
|
@@ -267,15 +229,3 @@ the skill content to determine when to apply it.
|
|
|
267
229
|
### END SKILL
|
|
268
230
|
"""
|
|
269
231
|
|
|
270
|
-
|
|
271
|
-
# Used by: tui/commands.py::handle_load_memory()
|
|
272
|
-
# REASON: Prompt LLM to load and acknowledge memory from file.
|
|
273
|
-
|
|
274
|
-
LOAD_MEMORY_COMMAND_PROMPT_TEMPLATE = """Please load the previous memory from `.ayder/memory/current_memory.md` and acknowledge the context.
|
|
275
|
-
|
|
276
|
-
Previous context:
|
|
277
|
-
```
|
|
278
|
-
{memory_content}
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
Please acknowledge this context and continue from where we left off."""
|
|
@@ -76,10 +76,30 @@ RESOLUTION_MATRIX: tuple[ResolutionRule, ...] = (
|
|
|
76
76
|
driver="generic_native",
|
|
77
77
|
note="Native works on current Ollama; verified for deepseek-v4-pro:cloud",
|
|
78
78
|
),
|
|
79
|
+
# minimax: native tool extraction verified working on current Ollama
|
|
80
|
+
# (probed minimax-m3:cloud — returns clean msg.tool_calls, empty content,
|
|
81
|
+
# both single- and multi-turn). The IN_CONTENT MiniMaxDriver leaks the
|
|
82
|
+
# model's native tool-call special token (]<]minimax[>[) on multi-turn
|
|
83
|
+
# requests: _convert_messages feeds prior tool_calls/results back, Ollama's
|
|
84
|
+
# template renders them with native tokens, the model mimics them, and the
|
|
85
|
+
# text parser neither parses nor strips them — garbling the call. Trusting
|
|
86
|
+
# native; reactive fallback engages on #14834. If a specific minimax variant
|
|
87
|
+
# regresses, prefer a model-name-specific driver (priority < 50) over
|
|
88
|
+
# re-engaging the family-wide IN_CONTENT path.
|
|
79
89
|
ResolutionRule(
|
|
80
90
|
family_substring="minimax",
|
|
81
|
-
driver="
|
|
82
|
-
note="
|
|
91
|
+
driver="generic_native",
|
|
92
|
+
note="Native works on current Ollama; verified for minimax-m3:cloud",
|
|
93
|
+
),
|
|
94
|
+
# kimi: native tool extraction verified working on current Ollama (probed
|
|
95
|
+
# kimi-k2.6:cloud — clean msg.tool_calls, empty content, single- and
|
|
96
|
+
# multi-turn). NOT affected by ollama#14360 (Kimi K2.5 leaked its native
|
|
97
|
+
# <|tool_calls_section_begin|> tokens as raw text where the template was
|
|
98
|
+
# missing a ToolCalls block); the k2.6 cloud build parses them correctly.
|
|
99
|
+
ResolutionRule(
|
|
100
|
+
family_substring="kimi",
|
|
101
|
+
driver="generic_native",
|
|
102
|
+
note="Native works on current Ollama; verified for kimi-k2.6:cloud",
|
|
83
103
|
),
|
|
84
104
|
ResolutionRule(family_substring="llama", driver="generic_native"),
|
|
85
105
|
ResolutionRule(family_substring="mistral", driver="generic_native"),
|
|
@@ -19,11 +19,11 @@ Available tools:
|
|
|
19
19
|
</tools>
|
|
20
20
|
|
|
21
21
|
To call a tool, wrap the call in <minimax:tool_call> tags using the
|
|
22
|
-
|
|
22
|
+
invoke/parameter format:
|
|
23
23
|
<minimax:tool_call>
|
|
24
|
-
<
|
|
25
|
-
<parameter=key>value</parameter>
|
|
26
|
-
</
|
|
24
|
+
<invoke name="tool_name">
|
|
25
|
+
<parameter name="key">value</parameter>
|
|
26
|
+
</invoke>
|
|
27
27
|
</minimax:tool_call>
|
|
28
28
|
"""
|
|
29
29
|
|
|
@@ -33,7 +33,11 @@ class MiniMaxDriver(ChatDriver):
|
|
|
33
33
|
mode = DriverMode.IN_CONTENT
|
|
34
34
|
priority = 50
|
|
35
35
|
fallback_driver = "generic_xml"
|
|
36
|
-
|
|
36
|
+
# Dormant by default: the resolution matrix routes the minimax family to
|
|
37
|
+
# generic_native (Ollama parses tool calls natively). This IN_CONTENT driver
|
|
38
|
+
# stays available via explicit override / reactive fallback only, mirroring
|
|
39
|
+
# the dormant qwen3 and deepseek drivers.
|
|
40
|
+
supports_families = ()
|
|
37
41
|
|
|
38
42
|
def render_tools_into_messages(
|
|
39
43
|
self, messages: list[dict[str, Any]], tools: list[dict[str, Any]]
|