deepagents-code 0.1.35__tar.gz → 0.1.36__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.
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/CHANGELOG.md +11 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/PKG-INFO +16 -16
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_build_info.py +1 -1
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/app.py +10 -5
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/model_config.py +3 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/reasoning_effort.py +75 -10
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/model_selector.py +7 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/pyproject.toml +10 -10
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_app.py +22 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_model_config.py +7 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_reasoning_effort.py +65 -1
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_model_selector.py +15 -3
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/uv.lock +45 -45
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/.gitignore +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/AGENTS.md +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/ARCHITECTURE.md +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/COMMANDS.md +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/DEVELOPMENT.md +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/Makefile +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/README.md +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/THREAT_MODEL.md +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_env_vars.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_fake_models.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_paths.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_server_config.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_tool_stream.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/agent.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/approval_mode.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/commands/auth.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/commands/config.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/commands/mcp.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/commands/tools.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/launch/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/launch/server.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/launch/server_manager.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/non_interactive.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/remote_client.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/command_registry.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/config.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/config_manifest.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/configurable_model.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/doctor.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/extras_info.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/goal_rubric.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/goal_tools.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/hooks.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/integrations/sandbox_factory.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/main.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/managed_tools.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_auth.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_tools.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_trust.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/offload.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/paste_collapse.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/server_graph.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/sessions.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/skills/trust.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/system_prompt.md +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tool_catalog.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/textual_adapter.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/_links.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/approval.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/ask_user.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/auth.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/chat_input.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/codex_auth.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/diff.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/effort_selector.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/goal_review.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/history.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/install_confirm.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/loading.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/message_store.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/messages.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/skill_trust.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/startup_tip.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/status.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/thread_selector.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/update_available.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/update_confirm.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/welcome.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/ui.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/update_check.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/hatch_build.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/images/tui.png +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/scripts/install.sh +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/README.md +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/test_auto_approve_remote.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/client/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/client/commands/test_auth.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/client/commands/test_mcp.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/client/commands/test_tools.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/conftest.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/skills/test_skill_trust.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/smoke_tests/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/smoke_tests/conftest.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test__tool_stream.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_agent.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_approval_mode.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_args.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_config.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_config_manifest.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_cursor_blink.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_doctor.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_goal_rubric.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_goal_tools.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_hatch_build.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_install_command.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_install_script.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_main.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_managed_tools.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_mcp_trust.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_offload_dict_messages.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_paths.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_rubric_cli.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_sandbox_registry.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_server.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_tool_catalog.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_tracing_replicas.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_history.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_links.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_status.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
- {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.1.36](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.35...deepagents-code==0.1.36) (2026-07-09)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* Add `GPT-5.6` model family ([#4600](https://github.com/langchain-ai/deepagents/issues/4600)) ([4a806bc](https://github.com/langchain-ai/deepagents/commit/4a806bc703b69334cccd05bcd27d411602e82318))
|
|
10
|
+
* Add Grok 4.5 model ([#4596](https://github.com/langchain-ai/deepagents/issues/4596)) ([b0a209d](https://github.com/langchain-ai/deepagents/commit/b0a209da3a8c9f80e2e3d5e199340736c854c567))
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
* Strip input before Ctrl+C copy-input fallback ([#4590](https://github.com/langchain-ai/deepagents/issues/4590)) ([505d55a](https://github.com/langchain-ai/deepagents/commit/505d55ad83e8569213175911ee6c8c39fbbf340c))
|
|
15
|
+
|
|
5
16
|
## [0.1.35](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.34...deepagents-code==0.1.35) (2026-07-09)
|
|
6
17
|
|
|
7
18
|
### Features
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.36
|
|
4
4
|
Summary: Terminal interface for Deep Agents - interactive AI agent with file operations, shell access, and sub-agent capabilities.
|
|
5
5
|
Project-URL: Homepage, https://docs.langchain.com/oss/python/deepagents/overview
|
|
6
6
|
Project-URL: Documentation, https://reference.langchain.com/python/deepagents/
|
|
@@ -30,12 +30,12 @@ Requires-Dist: deepagents-acp<1.0.0,>=0.0.8
|
|
|
30
30
|
Requires-Dist: deepagents==0.7.0a6
|
|
31
31
|
Requires-Dist: filelock<4.0.0,>=3.12
|
|
32
32
|
Requires-Dist: httpx<1.0.0,>=0.28.1
|
|
33
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.
|
|
33
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.8
|
|
34
34
|
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.7
|
|
35
35
|
Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.0
|
|
36
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.3.
|
|
36
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.3.4
|
|
37
37
|
Requires-Dist: langchain-quickjs<0.4.0,>=0.3.2
|
|
38
|
-
Requires-Dist: langchain<2.0.0,>=1.3.
|
|
38
|
+
Requires-Dist: langchain<2.0.0,>=1.3.12
|
|
39
39
|
Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
|
|
40
40
|
Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.30
|
|
41
41
|
Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.30.0
|
|
@@ -62,23 +62,23 @@ Provides-Extra: agentcore
|
|
|
62
62
|
Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.5; extra == 'agentcore'
|
|
63
63
|
Provides-Extra: all-providers
|
|
64
64
|
Requires-Dist: aiohttp<3.15.0,>=3.14.1; extra == 'all-providers'
|
|
65
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.
|
|
66
|
-
Requires-Dist: langchain-aws<2.0.0,>=1.6.
|
|
65
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.8; extra == 'all-providers'
|
|
66
|
+
Requires-Dist: langchain-aws<2.0.0,>=1.6.2; extra == 'all-providers'
|
|
67
67
|
Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'all-providers'
|
|
68
68
|
Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
|
|
69
69
|
Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
70
|
-
Requires-Dist: langchain-fireworks<2.0.0,>=1.4.
|
|
70
|
+
Requires-Dist: langchain-fireworks<2.0.0,>=1.4.4; extra == 'all-providers'
|
|
71
71
|
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.7; extra == 'all-providers'
|
|
72
72
|
Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.4; extra == 'all-providers'
|
|
73
73
|
Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'all-providers'
|
|
74
74
|
Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'all-providers'
|
|
75
75
|
Requires-Dist: langchain-ibm<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
76
76
|
Requires-Dist: langchain-litellm<2.0.0,>=0.7.0; extra == 'all-providers'
|
|
77
|
-
Requires-Dist: langchain-mistralai<2.0.0,>=1.1.
|
|
77
|
+
Requires-Dist: langchain-mistralai<2.0.0,>=1.1.6; extra == 'all-providers'
|
|
78
78
|
Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'all-providers'
|
|
79
79
|
Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
80
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.3.
|
|
81
|
-
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.
|
|
80
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.3.4; extra == 'all-providers'
|
|
81
|
+
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.6; extra == 'all-providers'
|
|
82
82
|
Requires-Dist: langchain-perplexity<2.0.0,>=1.4.0; extra == 'all-providers'
|
|
83
83
|
Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'all-providers'
|
|
84
84
|
Requires-Dist: langchain-xai<2.0.0,>=1.2.2; extra == 'all-providers'
|
|
@@ -89,11 +89,11 @@ Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
|
|
|
89
89
|
Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
|
|
90
90
|
Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
|
|
91
91
|
Provides-Extra: anthropic
|
|
92
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.
|
|
92
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.8; extra == 'anthropic'
|
|
93
93
|
Provides-Extra: baseten
|
|
94
94
|
Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'baseten'
|
|
95
95
|
Provides-Extra: bedrock
|
|
96
|
-
Requires-Dist: langchain-aws<2.0.0,>=1.6.
|
|
96
|
+
Requires-Dist: langchain-aws<2.0.0,>=1.6.2; extra == 'bedrock'
|
|
97
97
|
Provides-Extra: cohere
|
|
98
98
|
Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'cohere'
|
|
99
99
|
Provides-Extra: daytona
|
|
@@ -101,7 +101,7 @@ Requires-Dist: langchain-daytona>=0.0.7; extra == 'daytona'
|
|
|
101
101
|
Provides-Extra: deepseek
|
|
102
102
|
Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'deepseek'
|
|
103
103
|
Provides-Extra: fireworks
|
|
104
|
-
Requires-Dist: langchain-fireworks<2.0.0,>=1.4.
|
|
104
|
+
Requires-Dist: langchain-fireworks<2.0.0,>=1.4.4; extra == 'fireworks'
|
|
105
105
|
Provides-Extra: google-genai
|
|
106
106
|
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.7; extra == 'google-genai'
|
|
107
107
|
Provides-Extra: groq
|
|
@@ -116,7 +116,7 @@ Provides-Extra: media
|
|
|
116
116
|
Requires-Dist: av<18.0.0,>=17.0.0; extra == 'media'
|
|
117
117
|
Requires-Dist: pillow<13.0.0,>=12.2.0; extra == 'media'
|
|
118
118
|
Provides-Extra: mistralai
|
|
119
|
-
Requires-Dist: langchain-mistralai<2.0.0,>=1.1.
|
|
119
|
+
Requires-Dist: langchain-mistralai<2.0.0,>=1.1.6; extra == 'mistralai'
|
|
120
120
|
Provides-Extra: modal
|
|
121
121
|
Requires-Dist: langchain-modal>=0.0.5; extra == 'modal'
|
|
122
122
|
Provides-Extra: nvidia
|
|
@@ -125,9 +125,9 @@ Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'nvidia'
|
|
|
125
125
|
Provides-Extra: ollama
|
|
126
126
|
Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'ollama'
|
|
127
127
|
Provides-Extra: openai
|
|
128
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.3.
|
|
128
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.3.4; extra == 'openai'
|
|
129
129
|
Provides-Extra: openrouter
|
|
130
|
-
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.
|
|
130
|
+
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.6; extra == 'openrouter'
|
|
131
131
|
Provides-Extra: perplexity
|
|
132
132
|
Requires-Dist: langchain-perplexity<2.0.0,>=1.4.0; extra == 'perplexity'
|
|
133
133
|
Provides-Extra: quickjs
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# Keep the `x-release-please-version` annotation — release-please uses it to
|
|
4
4
|
# bump `__version__` in sync with `pyproject.toml` on every release PR.
|
|
5
|
-
__version__ = "0.1.
|
|
5
|
+
__version__ = "0.1.36" # x-release-please-version
|
|
6
6
|
|
|
7
7
|
DOCS_URL = "https://docs.langchain.com/oss/python/deepagents/code"
|
|
8
8
|
"""URL for `deepagents-code` documentation."""
|
|
@@ -12259,7 +12259,8 @@ class DeepAgentsApp(App):
|
|
|
12259
12259
|
4. If ask_user menu is active, cancel it
|
|
12260
12260
|
5. If agent is running, interrupt it (preserve input)
|
|
12261
12261
|
6. If double press (quit_pending), quit
|
|
12262
|
-
7. If a focused input has text, copy the whole draft
|
|
12262
|
+
7. If a focused input has non-whitespace text, copy the whole draft
|
|
12263
|
+
(no selection)
|
|
12263
12264
|
8. Otherwise show quit hint
|
|
12264
12265
|
|
|
12265
12266
|
Rapid escape hatch: the clipboard-copy branches (1 and 7) are skipped
|
|
@@ -12370,13 +12371,14 @@ class DeepAgentsApp(App):
|
|
|
12370
12371
|
return copy_text_with_feedback(self, selected_text, failure_noun="selection")
|
|
12371
12372
|
|
|
12372
12373
|
def _copy_focused_input_text(self) -> bool:
|
|
12373
|
-
"""Copy the focused input's full text to the clipboard, if
|
|
12374
|
+
"""Copy the focused input's full text to the clipboard, if meaningful.
|
|
12374
12375
|
|
|
12375
12376
|
Ctrl+C fallback used when there is no active selection, so the whole
|
|
12376
|
-
draft is copied instead of arming quit.
|
|
12377
|
+
draft is copied instead of arming quit. A whitespace-only draft is
|
|
12378
|
+
treated as empty and left to fall through to quit handling.
|
|
12377
12379
|
|
|
12378
12380
|
Returns:
|
|
12379
|
-
`True` when non-
|
|
12381
|
+
`True` when non-whitespace text was handled by a clipboard attempt.
|
|
12380
12382
|
"""
|
|
12381
12383
|
from textual.widgets import Input, TextArea
|
|
12382
12384
|
|
|
@@ -12387,7 +12389,10 @@ class DeepAgentsApp(App):
|
|
|
12387
12389
|
return False
|
|
12388
12390
|
|
|
12389
12391
|
text = widget.text if isinstance(widget, TextArea) else widget.value
|
|
12390
|
-
|
|
12392
|
+
# Strip before deciding whether there is anything to copy: a
|
|
12393
|
+
# whitespace-only draft carries no meaningful content, so Ctrl+C should
|
|
12394
|
+
# fall through to arming quit rather than copying blank space.
|
|
12395
|
+
if not text.strip():
|
|
12391
12396
|
return False
|
|
12392
12397
|
|
|
12393
12398
|
from deepagents_code.clipboard import copy_text_with_feedback
|
|
@@ -27,7 +27,7 @@ type-checked against this alias, so update them in lockstep when it changes.
|
|
|
27
27
|
"""
|
|
28
28
|
|
|
29
29
|
ReasoningProvider: TypeAlias = Literal[
|
|
30
|
-
"anthropic", "fireworks", "google_genai", "openai", "openai_codex"
|
|
30
|
+
"anthropic", "fireworks", "google_genai", "openai", "openai_codex", "xai"
|
|
31
31
|
]
|
|
32
32
|
"""Provider identifiers that support model-specific reasoning effort controls.
|
|
33
33
|
|
|
@@ -53,11 +53,14 @@ class ReasoningProviderConfig(NamedTuple):
|
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
OPENAI_EFFORTS: tuple[EffortLabel, ...] = ("none", "low", "medium", "high", "xhigh")
|
|
56
|
-
"""OpenAI GPT-5 effort labels for `reasoning.effort`.
|
|
56
|
+
"""OpenAI GPT-5 effort labels before GPT-5.6 for `reasoning.effort`.
|
|
57
57
|
|
|
58
58
|
See https://platform.openai.com/docs/guides/reasoning.
|
|
59
59
|
"""
|
|
60
60
|
|
|
61
|
+
OPENAI_56_EFFORTS: tuple[EffortLabel, ...] = (*OPENAI_EFFORTS, "max")
|
|
62
|
+
"""OpenAI GPT-5.6 effort labels for `reasoning.effort`."""
|
|
63
|
+
|
|
61
64
|
ANTHROPIC_EFFORTS: tuple[EffortLabel, ...] = ("low", "medium", "high", "xhigh", "max")
|
|
62
65
|
"""Anthropic `output_config.effort` labels for Opus 4.7+ and Sonnet 5.
|
|
63
66
|
|
|
@@ -112,9 +115,16 @@ FIREWORKS_GLM_EFFORTS: tuple[EffortLabel, ...] = ("none", "high", "max")
|
|
|
112
115
|
See https://docs.fireworks.ai/guides/reasoning.
|
|
113
116
|
"""
|
|
114
117
|
|
|
118
|
+
XAI_EFFORTS: tuple[EffortLabel, ...] = ("low", "medium", "high")
|
|
119
|
+
"""xAI `reasoning_effort` labels for Grok 4.5.
|
|
120
|
+
|
|
121
|
+
See https://docs.x.ai/developers/model-capabilities/text/reasoning.
|
|
122
|
+
"""
|
|
123
|
+
|
|
115
124
|
_REASONING_KEYS: frozenset[str] = frozenset(
|
|
116
125
|
{
|
|
117
126
|
"effort",
|
|
127
|
+
"extra_body",
|
|
118
128
|
"output_config",
|
|
119
129
|
"reasoning",
|
|
120
130
|
"reasoning_effort",
|
|
@@ -125,17 +135,16 @@ _REASONING_KEYS: frozenset[str] = frozenset(
|
|
|
125
135
|
"""Runtime config keys that may already carry provider reasoning settings."""
|
|
126
136
|
|
|
127
137
|
|
|
128
|
-
def _openai_supported_efforts(
|
|
138
|
+
def _openai_supported_efforts(model: str) -> tuple[EffortLabel, ...]:
|
|
129
139
|
"""Return OpenAI reasoning effort levels."""
|
|
130
|
-
return OPENAI_EFFORTS
|
|
140
|
+
return OPENAI_56_EFFORTS if _has_version(model, "gpt-5.6") else OPENAI_EFFORTS
|
|
131
141
|
|
|
132
142
|
|
|
133
143
|
def _openai_default_effort(model: str) -> EffortLabel | None:
|
|
134
144
|
"""Return the OpenAI default reasoning effort when known."""
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
return "medium" if model.startswith("gpt-5.5") else None
|
|
145
|
+
if _has_version(model, "gpt-5.5") or _has_version(model, "gpt-5.6"):
|
|
146
|
+
return "medium"
|
|
147
|
+
return None
|
|
139
148
|
|
|
140
149
|
|
|
141
150
|
def _openai_model_params(effort: str) -> dict[str, Any]:
|
|
@@ -341,6 +350,44 @@ def _fireworks_current_effort(model_params: dict[str, Any]) -> str | None:
|
|
|
341
350
|
return None
|
|
342
351
|
|
|
343
352
|
|
|
353
|
+
def _is_xai_grok_45(model: str) -> bool:
|
|
354
|
+
"""Return whether `model` is Grok 4.5 or a documented alias."""
|
|
355
|
+
return model in {"grok-4.5", "grok-4.5-latest", "grok-build-latest"}
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
def _xai_supported_efforts(model: str) -> tuple[EffortLabel, ...]:
|
|
359
|
+
"""Return xAI reasoning effort levels for a model."""
|
|
360
|
+
return XAI_EFFORTS if _is_xai_grok_45(model) else ()
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
def _xai_default_effort(model: str) -> EffortLabel | None:
|
|
364
|
+
"""Return the xAI default reasoning effort when known."""
|
|
365
|
+
return "high" if _is_xai_grok_45(model) else None
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
def _xai_model_params(effort: str) -> dict[str, Any]:
|
|
369
|
+
"""Return xAI reasoning params for an effort label."""
|
|
370
|
+
return {"extra_body": {"reasoning_effort": effort}}
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
def _xai_current_effort(model_params: dict[str, Any]) -> str | None:
|
|
374
|
+
"""Read the xAI reasoning effort from model params.
|
|
375
|
+
|
|
376
|
+
Returns:
|
|
377
|
+
The configured effort label, or `None` when unset.
|
|
378
|
+
"""
|
|
379
|
+
extra = model_params.get("extra_body")
|
|
380
|
+
if isinstance(extra, dict):
|
|
381
|
+
value = extra.get("reasoning_effort")
|
|
382
|
+
if value is not None and not isinstance(value, str):
|
|
383
|
+
logger.warning(
|
|
384
|
+
"Ignoring non-str xAI extra_body.reasoning_effort of type %s",
|
|
385
|
+
type(value).__name__,
|
|
386
|
+
)
|
|
387
|
+
return value if isinstance(value, str) else None
|
|
388
|
+
return None
|
|
389
|
+
|
|
390
|
+
|
|
344
391
|
_OPENAI_CONFIG = ReasoningProviderConfig(
|
|
345
392
|
supported_efforts=_openai_supported_efforts,
|
|
346
393
|
default_effort=_openai_default_effort,
|
|
@@ -374,6 +421,12 @@ _PROVIDER_CONFIGS: dict[ReasoningProvider, ReasoningProviderConfig] = {
|
|
|
374
421
|
model_params=_fireworks_model_params,
|
|
375
422
|
current_effort=_fireworks_current_effort,
|
|
376
423
|
),
|
|
424
|
+
"xai": ReasoningProviderConfig(
|
|
425
|
+
supported_efforts=_xai_supported_efforts,
|
|
426
|
+
default_effort=_xai_default_effort,
|
|
427
|
+
model_params=_xai_model_params,
|
|
428
|
+
current_effort=_xai_current_effort,
|
|
429
|
+
),
|
|
377
430
|
}
|
|
378
431
|
"""Provider-specific reasoning effort behavior keyed by `ModelSpec` provider."""
|
|
379
432
|
|
|
@@ -405,6 +458,8 @@ def _classify_reasoning_provider(provider: str, model: str) -> ReasoningProvider
|
|
|
405
458
|
return "google_genai"
|
|
406
459
|
if provider == "fireworks" and model_lower.startswith("accounts/fireworks/models/"):
|
|
407
460
|
return "fireworks"
|
|
461
|
+
if provider == "xai" and _is_xai_grok_45(model_lower):
|
|
462
|
+
return "xai"
|
|
408
463
|
return None
|
|
409
464
|
|
|
410
465
|
|
|
@@ -526,7 +581,9 @@ def merge_effort_model_params(
|
|
|
526
581
|
"""
|
|
527
582
|
merged = dict(existing) if existing else {}
|
|
528
583
|
for key, value in effort_params.items():
|
|
529
|
-
if key in {"model_kwargs", "output_config"} and isinstance(
|
|
584
|
+
if key in {"extra_body", "model_kwargs", "output_config"} and isinstance(
|
|
585
|
+
value, dict
|
|
586
|
+
):
|
|
530
587
|
current = merged.get(key)
|
|
531
588
|
base = dict(current) if isinstance(current, dict) else {}
|
|
532
589
|
base.update(value)
|
|
@@ -556,7 +613,8 @@ def without_effort_model_params(
|
|
|
556
613
|
cleaned = {
|
|
557
614
|
key: (dict(value) if isinstance(value, dict) else value)
|
|
558
615
|
for key, value in existing.items()
|
|
559
|
-
if key not in _REASONING_KEYS
|
|
616
|
+
if key not in _REASONING_KEYS
|
|
617
|
+
and key not in {"extra_body", "model_kwargs", "output_config"}
|
|
560
618
|
}
|
|
561
619
|
kwargs = existing.get("model_kwargs")
|
|
562
620
|
if isinstance(kwargs, dict):
|
|
@@ -572,4 +630,11 @@ def without_effort_model_params(
|
|
|
572
630
|
cleaned["output_config"] = output_config_params
|
|
573
631
|
elif output_config is not None:
|
|
574
632
|
cleaned["output_config"] = output_config
|
|
633
|
+
extra = existing.get("extra_body")
|
|
634
|
+
if isinstance(extra, dict):
|
|
635
|
+
extra_params = {k: v for k, v in extra.items() if k != "reasoning_effort"}
|
|
636
|
+
if extra_params:
|
|
637
|
+
cleaned["extra_body"] = extra_params
|
|
638
|
+
elif extra is not None:
|
|
639
|
+
cleaned["extra_body"] = extra
|
|
575
640
|
return cleaned or None
|
{deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/model_selector.py
RENAMED
|
@@ -89,11 +89,17 @@ _RECOMMENDED_MODELS: dict[str, str] = {
|
|
|
89
89
|
"openai:gpt-5.4-pro": "GPT-5.4 Pro",
|
|
90
90
|
"openai:gpt-5.5": "GPT-5.5",
|
|
91
91
|
"openai:gpt-5.5-pro": "GPT-5.5 Pro",
|
|
92
|
+
"openai:gpt-5.6-luna": "GPT-5.6 Luna",
|
|
93
|
+
"openai:gpt-5.6-sol": "GPT-5.6 Sol",
|
|
94
|
+
"openai:gpt-5.6-terra": "GPT-5.6 Terra",
|
|
92
95
|
"openai_codex:gpt-5.2": "GPT-5.2",
|
|
93
96
|
"openai_codex:gpt-5.3-codex": "GPT-5.3 Codex",
|
|
94
97
|
"openai_codex:gpt-5.4": "GPT-5.4",
|
|
95
98
|
"openai_codex:gpt-5.4-mini": "GPT-5.4 mini",
|
|
96
99
|
"openai_codex:gpt-5.5": "GPT-5.5",
|
|
100
|
+
"openai_codex:gpt-5.6-luna": "GPT-5.6 Luna",
|
|
101
|
+
"openai_codex:gpt-5.6-sol": "GPT-5.6 Sol",
|
|
102
|
+
"openai_codex:gpt-5.6-terra": "GPT-5.6 Terra",
|
|
97
103
|
"openrouter:anthropic/claude-opus-4.6": "Claude Opus 4.6",
|
|
98
104
|
"openrouter:anthropic/claude-opus-4.7": "Claude Opus 4.7",
|
|
99
105
|
"openrouter:anthropic/claude-opus-4.7-fast": "Claude Opus 4.7 Fast",
|
|
@@ -114,6 +120,7 @@ _RECOMMENDED_MODELS: dict[str, str] = {
|
|
|
114
120
|
"openrouter:openrouter/fusion": "OpenRouter Fusion",
|
|
115
121
|
"openrouter:qwen/qwen3.7-plus": "Qwen 3.7 Plus",
|
|
116
122
|
"openrouter:z-ai/glm-5.2": "GLM 5.2",
|
|
123
|
+
"xai:grok-4.5": "Grok 4.5",
|
|
117
124
|
}
|
|
118
125
|
"""Hand-curated frontier-tier models promoted across the UI, mapped to a
|
|
119
126
|
human-readable display name.
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "deepagents-code"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.36"
|
|
8
8
|
description = "Terminal interface for Deep Agents - interactive AI agent with file operations, shell access, and sub-agent capabilities."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "MIT" }
|
|
@@ -27,7 +27,7 @@ classifiers = [
|
|
|
27
27
|
dependencies = [
|
|
28
28
|
# Framework
|
|
29
29
|
"deepagents==0.7.0a6",
|
|
30
|
-
"langchain>=1.3.
|
|
30
|
+
"langchain>=1.3.12,<2.0.0",
|
|
31
31
|
"langgraph-checkpoint-sqlite>=3.1.0,<4.0.0",
|
|
32
32
|
|
|
33
33
|
# Client-server architecture
|
|
@@ -37,9 +37,9 @@ dependencies = [
|
|
|
37
37
|
"httpx>=0.28.1,<1.0.0",
|
|
38
38
|
|
|
39
39
|
# Core model providers - others are added as optional
|
|
40
|
-
"langchain-anthropic>=1.4.
|
|
40
|
+
"langchain-anthropic>=1.4.8,<2.0.0",
|
|
41
41
|
"langchain-google-genai>=4.2.7,<5.0.0",
|
|
42
|
-
"langchain-openai>=1.3.
|
|
42
|
+
"langchain-openai>=1.3.4,<2.0.0",
|
|
43
43
|
"pydantic>=2.12.5,<2.14.0a0",
|
|
44
44
|
|
|
45
45
|
# UI/Terminal
|
|
@@ -87,25 +87,25 @@ dependencies = [
|
|
|
87
87
|
|
|
88
88
|
[project.optional-dependencies]
|
|
89
89
|
# Model providers
|
|
90
|
-
anthropic = ["langchain-anthropic>=1.4.
|
|
90
|
+
anthropic = ["langchain-anthropic>=1.4.8,<2.0.0"]
|
|
91
91
|
baseten = ["langchain-baseten>=0.2.1,<1.0.0"]
|
|
92
|
-
bedrock = ["langchain-aws>=1.6.
|
|
92
|
+
bedrock = ["langchain-aws>=1.6.2,<2.0.0"]
|
|
93
93
|
cohere = ["langchain-cohere>=0.6.0,<1.0.0"]
|
|
94
94
|
deepseek = ["langchain-deepseek>=1.1.0,<2.0.0"]
|
|
95
|
-
fireworks = ["langchain-fireworks>=1.4.
|
|
95
|
+
fireworks = ["langchain-fireworks>=1.4.4,<2.0.0"]
|
|
96
96
|
google-genai = ["langchain-google-genai>=4.2.7,<5.0.0"]
|
|
97
97
|
groq = ["langchain-groq>=1.1.3,<2.0.0"]
|
|
98
98
|
huggingface = ["langchain-huggingface>=1.2.2,<2.0.0"]
|
|
99
99
|
ibm = ["langchain-ibm>=1.1.0,<2.0.0"]
|
|
100
100
|
litellm = ["langchain-litellm>=0.7.0,<2.0.0"]
|
|
101
|
-
mistralai = ["langchain-mistralai>=1.1.
|
|
101
|
+
mistralai = ["langchain-mistralai>=1.1.6,<2.0.0"]
|
|
102
102
|
nvidia = [
|
|
103
103
|
"aiohttp>=3.14.1,<3.15.0",
|
|
104
104
|
"langchain-nvidia-ai-endpoints>=1.4.3,<2.0.0",
|
|
105
105
|
]
|
|
106
106
|
ollama = ["langchain-ollama>=1.1.0,<2.0.0"]
|
|
107
|
-
openai = ["langchain-openai>=1.3.
|
|
108
|
-
openrouter = ["langchain-openrouter>=0.2.
|
|
107
|
+
openai = ["langchain-openai>=1.3.4,<2.0.0"]
|
|
108
|
+
openrouter = ["langchain-openrouter>=0.2.6,<2.0.0"]
|
|
109
109
|
perplexity = ["langchain-perplexity>=1.4.0,<2.0.0"]
|
|
110
110
|
together = ["langchain-together>=0.4.0,<2.0.0"]
|
|
111
111
|
vertex = ["langchain-google-vertexai>=3.2.4,<4.0.0"]
|
|
@@ -23027,6 +23027,28 @@ class TestCopyFocusedInputText:
|
|
|
23027
23027
|
assert app._copy_focused_input_text() is False
|
|
23028
23028
|
assert copied == []
|
|
23029
23029
|
|
|
23030
|
+
def test_no_copy_when_input_whitespace_only(self, monkeypatch) -> None:
|
|
23031
|
+
"""A whitespace-only draft is treated as empty and not copied."""
|
|
23032
|
+
from textual.widgets import TextArea
|
|
23033
|
+
|
|
23034
|
+
import deepagents_code.clipboard as clipboard_module
|
|
23035
|
+
|
|
23036
|
+
copied: list[str] = []
|
|
23037
|
+
|
|
23038
|
+
def fake_copy(_app: object, text: str) -> tuple[bool, str | None]:
|
|
23039
|
+
copied.append(text)
|
|
23040
|
+
return True, None
|
|
23041
|
+
|
|
23042
|
+
monkeypatch.setattr(clipboard_module, "copy_text_to_clipboard", fake_copy)
|
|
23043
|
+
|
|
23044
|
+
app = self._make_app()
|
|
23045
|
+
text_area = TextArea()
|
|
23046
|
+
text_area.text = " \n\t "
|
|
23047
|
+
monkeypatch.setattr(type(app), "focused", property(lambda _self: text_area))
|
|
23048
|
+
|
|
23049
|
+
assert app._copy_focused_input_text() is False
|
|
23050
|
+
assert copied == []
|
|
23051
|
+
|
|
23030
23052
|
def test_no_copy_when_nothing_focused(self, monkeypatch) -> None:
|
|
23031
23053
|
"""When the focused widget is not an input, nothing is copied."""
|
|
23032
23054
|
app = self._make_app()
|
|
@@ -5815,6 +5815,13 @@ class TestCodexProviderMirror:
|
|
|
5815
5815
|
`openai_codex`; other openai models are not mirrored.
|
|
5816
5816
|
"""
|
|
5817
5817
|
|
|
5818
|
+
def test_gpt_56_models_are_allowlisted(self) -> None:
|
|
5819
|
+
assert {
|
|
5820
|
+
"gpt-5.6-luna",
|
|
5821
|
+
"gpt-5.6-sol",
|
|
5822
|
+
"gpt-5.6-terra",
|
|
5823
|
+
} <= model_config.CODEX_MODELS
|
|
5824
|
+
|
|
5818
5825
|
def test_available_models_mirror_codex_allowlist(self) -> None:
|
|
5819
5826
|
model_config.clear_caches()
|
|
5820
5827
|
available = model_config.get_available_models()
|
|
@@ -39,8 +39,25 @@ def _restore_settings() -> Iterator[None]:
|
|
|
39
39
|
[
|
|
40
40
|
("openai:gpt-5.5", ("none", "low", "medium", "high", "xhigh")),
|
|
41
41
|
("openai_codex:gpt-5.5", ("none", "low", "medium", "high", "xhigh")),
|
|
42
|
+
(
|
|
43
|
+
"openai:gpt-5.6-sol",
|
|
44
|
+
("none", "low", "medium", "high", "xhigh", "max"),
|
|
45
|
+
),
|
|
46
|
+
(
|
|
47
|
+
"openai:gpt-5.6-terra",
|
|
48
|
+
("none", "low", "medium", "high", "xhigh", "max"),
|
|
49
|
+
),
|
|
50
|
+
(
|
|
51
|
+
"openai:gpt-5.6-luna",
|
|
52
|
+
("none", "low", "medium", "high", "xhigh", "max"),
|
|
53
|
+
),
|
|
54
|
+
(
|
|
55
|
+
"openai_codex:gpt-5.6-sol",
|
|
56
|
+
("none", "low", "medium", "high", "xhigh", "max"),
|
|
57
|
+
),
|
|
42
58
|
# A generic (non-5.5) gpt-5 still gets the full OpenAI range.
|
|
43
59
|
("openai:gpt-5.4", ("none", "low", "medium", "high", "xhigh")),
|
|
60
|
+
("openai:gpt-5.60-sol", ("none", "low", "medium", "high", "xhigh")),
|
|
44
61
|
("anthropic:claude-opus-4-8", ("low", "medium", "high", "xhigh", "max")),
|
|
45
62
|
# Opus 4.7 is the first version documented for the full range; assert the
|
|
46
63
|
# named boundary directly rather than relying on 4.8 to exercise it.
|
|
@@ -65,6 +82,9 @@ def _restore_settings() -> Iterator[None]:
|
|
|
65
82
|
("anthropic:claude-opus-4-16", ("low", "medium", "high", "xhigh", "max")),
|
|
66
83
|
("google_genai:gemini-3.5-flash", ("low", "medium", "high")),
|
|
67
84
|
("google_genai:gemini-3.1-pro-preview", ("low", "medium", "high")),
|
|
85
|
+
("xai:grok-4.5", ("low", "medium", "high")),
|
|
86
|
+
("xai:grok-4.5-latest", ("low", "medium", "high")),
|
|
87
|
+
("xai:grok-build-latest", ("low", "medium", "high")),
|
|
68
88
|
(
|
|
69
89
|
"fireworks:accounts/fireworks/models/deepseek-v4-pro",
|
|
70
90
|
("none", "low", "medium", "high", "xhigh", "max"),
|
|
@@ -81,6 +101,7 @@ def _restore_settings() -> Iterator[None]:
|
|
|
81
101
|
("openai_codex:gpt-4o", ()),
|
|
82
102
|
("anthropic:claude-3-5-haiku-latest", ()),
|
|
83
103
|
("google_genai:gemini-2.5-flash", ()),
|
|
104
|
+
("xai:grok-4", ()),
|
|
84
105
|
("fireworks:accounts/fireworks/models/llama-v3p1-70b-instruct", ()),
|
|
85
106
|
],
|
|
86
107
|
)
|
|
@@ -93,8 +114,12 @@ def test_supported_efforts_for_model(model_spec: str, efforts: tuple[str, ...])
|
|
|
93
114
|
[
|
|
94
115
|
("openai:gpt-5.5", "medium"),
|
|
95
116
|
("openai_codex:gpt-5.5", "medium"),
|
|
96
|
-
|
|
117
|
+
("openai:gpt-5.6-sol", "medium"),
|
|
118
|
+
("openai:gpt-5.6-terra", "medium"),
|
|
119
|
+
("openai:gpt-5.6-luna", "medium"),
|
|
120
|
+
("openai_codex:gpt-5.6-sol", "medium"),
|
|
97
121
|
("openai:gpt-5.4", None),
|
|
122
|
+
("openai:gpt-5.60-sol", None),
|
|
98
123
|
("anthropic:claude-opus-4-8", "high"),
|
|
99
124
|
("anthropic:claude-opus-4-7", "high"),
|
|
100
125
|
("anthropic:claude-sonnet-4-6", "high"),
|
|
@@ -104,6 +129,7 @@ def test_supported_efforts_for_model(model_spec: str, efforts: tuple[str, ...])
|
|
|
104
129
|
("google_genai:gemini-3.1-pro-preview", "high"),
|
|
105
130
|
("google_genai:gemini-3-pro", "high"),
|
|
106
131
|
("google_genai:gemini-3-flash", "high"),
|
|
132
|
+
("xai:grok-4.5", "high"),
|
|
107
133
|
("fireworks:accounts/fireworks/models/deepseek-v4-pro", "high"),
|
|
108
134
|
("fireworks:accounts/fireworks/models/glm-5p2", "max"),
|
|
109
135
|
("fireworks:accounts/fireworks/models/kimi-k2p7-code", None),
|
|
@@ -118,6 +144,9 @@ def test_model_params_for_effort_maps_provider_kwargs() -> None:
|
|
|
118
144
|
assert model_params_for_effort("openai:gpt-5.5", "high") == {
|
|
119
145
|
"reasoning": {"effort": "high", "summary": "auto"}
|
|
120
146
|
}
|
|
147
|
+
assert model_params_for_effort("openai:gpt-5.6-sol", "max") == {
|
|
148
|
+
"reasoning": {"effort": "max", "summary": "auto"}
|
|
149
|
+
}
|
|
121
150
|
assert model_params_for_effort("anthropic:claude-opus-4-8", "xhigh") == {
|
|
122
151
|
"thinking": {"type": "adaptive", "display": "summarized"},
|
|
123
152
|
"output_config": {"effort": "xhigh"},
|
|
@@ -128,6 +157,9 @@ def test_model_params_for_effort_maps_provider_kwargs() -> None:
|
|
|
128
157
|
assert model_params_for_effort(
|
|
129
158
|
"fireworks:accounts/fireworks/models/deepseek-v4-pro", "max"
|
|
130
159
|
) == {"model_kwargs": {"reasoning_effort": "max"}}
|
|
160
|
+
assert model_params_for_effort("xai:grok-4.5", "medium") == {
|
|
161
|
+
"extra_body": {"reasoning_effort": "medium"}
|
|
162
|
+
}
|
|
131
163
|
|
|
132
164
|
|
|
133
165
|
def test_current_effort_reads_anthropic_output_config() -> None:
|
|
@@ -139,6 +171,15 @@ def test_current_effort_reads_anthropic_output_config() -> None:
|
|
|
139
171
|
)
|
|
140
172
|
|
|
141
173
|
|
|
174
|
+
def test_current_effort_reads_xai_extra_body() -> None:
|
|
175
|
+
assert (
|
|
176
|
+
current_effort_from_model_params(
|
|
177
|
+
"xai:grok-4.5", {"extra_body": {"reasoning_effort": "high"}}
|
|
178
|
+
)
|
|
179
|
+
== "high"
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
|
|
142
183
|
def test_model_params_for_effort_rejects_unsupported_effort() -> None:
|
|
143
184
|
assert (
|
|
144
185
|
model_params_for_effort(
|
|
@@ -171,6 +212,21 @@ def test_merge_and_clear_effort_model_params_preserves_unrelated_params() -> Non
|
|
|
171
212
|
}
|
|
172
213
|
|
|
173
214
|
|
|
215
|
+
def test_merge_and_clear_xai_effort_preserves_extra_body_params() -> None:
|
|
216
|
+
merged = merge_effort_model_params(
|
|
217
|
+
{"extra_body": {"prompt_cache_key": "thread-1"}},
|
|
218
|
+
{"extra_body": {"reasoning_effort": "high"}},
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
assert merged == {
|
|
222
|
+
"extra_body": {"prompt_cache_key": "thread-1", "reasoning_effort": "high"}
|
|
223
|
+
}
|
|
224
|
+
assert current_effort_from_model_params("xai:grok-4.5", merged) == "high"
|
|
225
|
+
assert without_effort_model_params(merged) == {
|
|
226
|
+
"extra_body": {"prompt_cache_key": "thread-1"}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
|
|
174
230
|
@pytest.mark.parametrize(
|
|
175
231
|
("model_spec", "model_params"),
|
|
176
232
|
[
|
|
@@ -185,6 +241,7 @@ def test_merge_and_clear_effort_model_params_preserves_unrelated_params() -> Non
|
|
|
185
241
|
"fireworks:accounts/fireworks/models/deepseek-v4-pro",
|
|
186
242
|
{"model_kwargs": {"reasoning_effort": 5}},
|
|
187
243
|
),
|
|
244
|
+
("xai:grok-4.5", {"extra_body": {"reasoning_effort": 5}}),
|
|
188
245
|
],
|
|
189
246
|
)
|
|
190
247
|
def test_current_effort_warns_on_malformed_params(
|
|
@@ -215,6 +272,13 @@ def test_current_effort_non_dict_model_kwargs_is_silent() -> None:
|
|
|
215
272
|
)
|
|
216
273
|
|
|
217
274
|
|
|
275
|
+
def test_current_effort_non_dict_extra_body_is_silent() -> None:
|
|
276
|
+
"""A non-dict `extra_body` is a legit shape and must not warn."""
|
|
277
|
+
assert (
|
|
278
|
+
current_effort_from_model_params("xai:grok-4.5", {"extra_body": "raw"}) is None
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
|
|
218
282
|
def test_effort_argument_hint_covers_effort_vocabulary() -> None:
|
|
219
283
|
"""The `/effort` argument hint must list every `EffortLabel` plus a reset.
|
|
220
284
|
|
|
@@ -2251,15 +2251,27 @@ class TestGetModelDisplayName:
|
|
|
2251
2251
|
== "claude-sonnet-4-5"
|
|
2252
2252
|
)
|
|
2253
2253
|
|
|
2254
|
-
|
|
2254
|
+
@pytest.mark.parametrize(
|
|
2255
|
+
("spec", "name"),
|
|
2256
|
+
[
|
|
2257
|
+
("fireworks:accounts/fireworks/models/kimi-k2p7-code", "Kimi K2.7 Code"),
|
|
2258
|
+
("openai:gpt-5.6-luna", "GPT-5.6 Luna"),
|
|
2259
|
+
("openai:gpt-5.6-sol", "GPT-5.6 Sol"),
|
|
2260
|
+
("openai:gpt-5.6-terra", "GPT-5.6 Terra"),
|
|
2261
|
+
("openai_codex:gpt-5.6-luna", "GPT-5.6 Luna"),
|
|
2262
|
+
("openai_codex:gpt-5.6-sol", "GPT-5.6 Sol"),
|
|
2263
|
+
("openai_codex:gpt-5.6-terra", "GPT-5.6 Terra"),
|
|
2264
|
+
("xai:grok-4.5", "Grok 4.5"),
|
|
2265
|
+
],
|
|
2266
|
+
)
|
|
2267
|
+
def test_uses_recommended_name_when_no_profile(self, spec: str, name: str) -> None:
|
|
2255
2268
|
"""Uninstalled recommendations use the hardcoded name, not the raw id."""
|
|
2256
2269
|
from deepagents_code.tui.widgets import model_selector
|
|
2257
2270
|
|
|
2258
2271
|
screen = ModelSelectorScreen.__new__(ModelSelectorScreen)
|
|
2259
2272
|
screen._profiles = {}
|
|
2260
|
-
spec = "fireworks:accounts/fireworks/models/kimi-k2p7-code"
|
|
2261
2273
|
assert spec in model_selector._RECOMMENDED_MODELS
|
|
2262
|
-
assert screen._get_model_display_name(spec) ==
|
|
2274
|
+
assert screen._get_model_display_name(spec) == name
|
|
2263
2275
|
|
|
2264
2276
|
def test_profile_name_wins_over_recommended_name(self) -> None:
|
|
2265
2277
|
"""A loaded profile's `name` takes precedence over the hardcoded one."""
|