deepagents-code 0.1.4__tar.gz → 0.1.6__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.4 → deepagents_code-0.1.6}/CHANGELOG.md +21 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/COMMANDS.md +2 -1
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/PKG-INFO +6 -7
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/README.md +1 -1
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/agent.py +3 -3
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/app.py +254 -12
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/command_registry.py +7 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/config.py +21 -4
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/extras_info.py +80 -5
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/integrations/sandbox_factory.py +4 -2
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/main.py +121 -5
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_auth.py +84 -5
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_tools.py +31 -2
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/model_config.py +3 -3
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/offload.py +1 -1
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/remote_client.py +130 -5
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/sessions.py +50 -4
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/skills/load.py +1 -1
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/ui.py +4 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/update_check.py +233 -38
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/auth.py +1 -1
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/launch_init.py +1 -1
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/mcp_reconnect.py +5 -1
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/mcp_viewer.py +60 -24
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/welcome.py +23 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/pyproject.toml +5 -6
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/scripts/install.sh +195 -35
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_app.py +292 -9
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_config.py +30 -1
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_extras_info.py +56 -2
- deepagents_code-0.1.6/tests/unit_tests/test_install_command.py +239 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_main_args.py +197 -3
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_auth.py +143 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_viewer.py +72 -17
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_notification_center.py +3 -1
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_notifications.py +3 -1
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_remote_client.py +208 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_sandbox_factory.py +1 -1
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_sessions.py +45 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_update_available.py +3 -1
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_update_check.py +252 -4
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_update_progress.py +4 -4
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_version.py +2 -2
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_welcome.py +65 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/uv.lock +14 -16
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/.gitignore +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/AGENTS.md +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/DEV.md +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/Makefile +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/THREAT_MODEL.md +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_env_vars.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_server_config.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/configurable_model.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/hooks.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_commands.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_trust.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/non_interactive.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/server.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/server_graph.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/server_manager.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/system_prompt.md +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/textual_adapter.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/token_state.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/__init__.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/_links.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/approval.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/ask_user.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/chat_input.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/diff.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/history.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/loading.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/message_store.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/messages.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/model_selector.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/status.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/thread_selector.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/update_available.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/images/tui.png +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/README.md +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/conftest.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_agent.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_agent_selector.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_approval.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_args.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_ask_user.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_auth_widgets.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_autocomplete.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_chat_input.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_history.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_launch_init.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_links.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_loading.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_main.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_commands.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_trust.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_message_store.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_messages.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_model_config.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_model_selector.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_notification_detail.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_offload_dict_messages.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_server.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_status.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_textual_adapter.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_thread_selector.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_token_tracker.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/tools/test_fetch_url.py +0 -0
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# Deep Agents Code Changelog
|
|
2
2
|
|
|
3
|
+
## [0.1.6](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.5...deepagents-code==0.1.6) (2026-05-27)
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
* `/install` optional extras ([#3606](https://github.com/langchain-ai/deepagents/issues/3606)) ([7ffaa93](https://github.com/langchain-ai/deepagents/commit/7ffaa93dca6910cd454040d416ff7e0e8bcbcea5))
|
|
8
|
+
* Surface deferred MCP reconnect state in `/mcp` ([#3612](https://github.com/langchain-ai/deepagents/issues/3612)) ([d8205c2](https://github.com/langchain-ai/deepagents/commit/d8205c2a39d00e8b6f7f70afe7cc9bb92fee42d8))
|
|
9
|
+
* Surface MCP servers awaiting reconnect on splash banner ([#3615](https://github.com/langchain-ai/deepagents/issues/3615)) ([24c5258](https://github.com/langchain-ai/deepagents/commit/24c5258ae6664bc3d3875d8065038716f7c86161))
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* Cancel server-side runs before re-trying interrupted-state writes ([#3611](https://github.com/langchain-ai/deepagents/issues/3611)) ([7d46357](https://github.com/langchain-ai/deepagents/commit/7d46357c5446bbc6225f972fd66dc52af8dd0547))
|
|
14
|
+
* Editable-install guidance for adding extras ([#3610](https://github.com/langchain-ai/deepagents/issues/3610)) ([771e55f](https://github.com/langchain-ai/deepagents/commit/771e55f171b8087b876ecf767d2f23c86c2a27b9))
|
|
15
|
+
* Reuse persisted DCR loopback port across OAuth launches ([#3613](https://github.com/langchain-ai/deepagents/issues/3613)) ([f2f7471](https://github.com/langchain-ai/deepagents/commit/f2f747104945ac79b68e6524d6da886f7cfeb1b0))
|
|
16
|
+
* Polish MCP auth success UX ([#3614](https://github.com/langchain-ai/deepagents/issues/3614)) ([d225cb4](https://github.com/langchain-ai/deepagents/commit/d225cb41f41a0a9b2876aff2443eaa0ada24bf29))
|
|
17
|
+
|
|
18
|
+
## [0.1.5](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.4...deepagents-code==0.1.5) (2026-05-26)
|
|
19
|
+
|
|
20
|
+
### Bug Fixes
|
|
21
|
+
|
|
22
|
+
* Join aiosqlite worker thread after close ([#3585](https://github.com/langchain-ai/deepagents/issues/3585)) ([152cec0](https://github.com/langchain-ai/deepagents/commit/152cec04affed3508d4bfdffe7cae522b16d45e6))
|
|
23
|
+
|
|
3
24
|
## [0.1.4](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.3...deepagents-code==0.1.4) (2026-05-23)
|
|
4
25
|
|
|
5
26
|
### Features
|
|
@@ -6,7 +6,7 @@ Canonical list of slash commands for `deepagents-code`, derived from
|
|
|
6
6
|
regenerate after editing the registry.
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
## Public (
|
|
9
|
+
## Public (26)
|
|
10
10
|
|
|
11
11
|
| Command | Aliases | Description |
|
|
12
12
|
| --- | --- | --- |
|
|
@@ -21,6 +21,7 @@ regenerate after editing the registry.
|
|
|
21
21
|
| `/feedback` | | Submit a bug report or feature request |
|
|
22
22
|
| `/force-clear` | | Interrupt active work, clear chat, and start new thread |
|
|
23
23
|
| `/help` | | Show help |
|
|
24
|
+
| `/install` | | Install an optional extra (e.g. quickjs, daytona, fireworks) |
|
|
24
25
|
| `/mcp` | | Show MCP servers; `/mcp login <server>` to authenticate, `/mcp reconnect` to load deferred logins, F2 in the viewer to disable/enable a server |
|
|
25
26
|
| `/model` | | Switch or configure model (--model-params, --default) |
|
|
26
27
|
| `/notifications` | | Configure startup warning preferences |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.6
|
|
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/
|
|
@@ -27,18 +27,17 @@ Classifier: Topic :: Terminals
|
|
|
27
27
|
Requires-Python: <4.0,>=3.11
|
|
28
28
|
Requires-Dist: aiosqlite<1.0.0,>=0.19.0
|
|
29
29
|
Requires-Dist: deepagents-acp>=0.0.4
|
|
30
|
-
Requires-Dist: deepagents==0.6.
|
|
30
|
+
Requires-Dist: deepagents==0.6.4
|
|
31
31
|
Requires-Dist: httpx<1.0.0,>=0.28.1
|
|
32
32
|
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.3
|
|
33
33
|
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.2
|
|
34
34
|
Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.2.2
|
|
35
35
|
Requires-Dist: langchain-openai<2.0.0,>=1.2.1
|
|
36
|
-
Requires-Dist: langchain<2.0.0,>=1.3.
|
|
36
|
+
Requires-Dist: langchain<2.0.0,>=1.3.2
|
|
37
37
|
Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
|
|
38
38
|
Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.24
|
|
39
39
|
Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.28.1
|
|
40
40
|
Requires-Dist: langgraph-sdk<1.0.0,>=0.3.13
|
|
41
|
-
Requires-Dist: langgraph<2.0.0,>=1.2.0
|
|
42
41
|
Requires-Dist: langsmith[sandbox]>=0.8.0
|
|
43
42
|
Requires-Dist: markdownify<2.0.0,>=0.13.0
|
|
44
43
|
Requires-Dist: packaging>=23.0
|
|
@@ -127,8 +126,8 @@ Provides-Extra: runloop
|
|
|
127
126
|
Requires-Dist: langchain-runloop>=0.0.4; extra == 'runloop'
|
|
128
127
|
Provides-Extra: together
|
|
129
128
|
Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'together'
|
|
130
|
-
Provides-Extra:
|
|
131
|
-
Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.3; extra == '
|
|
129
|
+
Provides-Extra: vertex
|
|
130
|
+
Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.3; extra == 'vertex'
|
|
132
131
|
Provides-Extra: xai
|
|
133
132
|
Requires-Dist: langchain-xai<2.0.0,>=1.2.2; extra == 'xai'
|
|
134
133
|
Description-Content-Type: text/markdown
|
|
@@ -179,7 +178,7 @@ The fastest way to start using Deep Agents. `deepagents-code` is a pre-built cod
|
|
|
179
178
|
|
|
180
179
|
## 📖 Resources
|
|
181
180
|
|
|
182
|
-
- **[Documentation](https://docs.langchain.com/
|
|
181
|
+
- **[Documentation](https://docs.langchain.com/deepagents-code)**
|
|
183
182
|
- **[Changelog](https://github.com/langchain-ai/deepagents/blob/main/libs/code/CHANGELOG.md)**
|
|
184
183
|
- **[Source code](https://github.com/langchain-ai/deepagents/tree/main/libs/code)**
|
|
185
184
|
- **[Deep Agents SDK](https://github.com/langchain-ai/deepagents)** — underlying agent harness
|
|
@@ -44,7 +44,7 @@ The fastest way to start using Deep Agents. `deepagents-code` is a pre-built cod
|
|
|
44
44
|
|
|
45
45
|
## 📖 Resources
|
|
46
46
|
|
|
47
|
-
- **[Documentation](https://docs.langchain.com/
|
|
47
|
+
- **[Documentation](https://docs.langchain.com/deepagents-code)**
|
|
48
48
|
- **[Changelog](https://github.com/langchain-ai/deepagents/blob/main/libs/code/CHANGELOG.md)**
|
|
49
49
|
- **[Source code](https://github.com/langchain-ai/deepagents/tree/main/libs/code)**
|
|
50
50
|
- **[Deep Agents SDK](https://github.com/langchain-ai/deepagents)** — underlying agent harness
|
|
@@ -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.6" # 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."""
|
|
@@ -1268,7 +1268,7 @@ def create_cli_agent(
|
|
|
1268
1268
|
|
|
1269
1269
|
agent_middleware.append(
|
|
1270
1270
|
MemoryMiddleware(
|
|
1271
|
-
backend=FilesystemBackend(),
|
|
1271
|
+
backend=FilesystemBackend(virtual_mode=False),
|
|
1272
1272
|
sources=memory_sources,
|
|
1273
1273
|
)
|
|
1274
1274
|
)
|
|
@@ -1311,7 +1311,7 @@ def create_cli_agent(
|
|
|
1311
1311
|
|
|
1312
1312
|
agent_middleware.append(
|
|
1313
1313
|
SkillsMiddleware(
|
|
1314
|
-
backend=FilesystemBackend(),
|
|
1314
|
+
backend=FilesystemBackend(virtual_mode=False),
|
|
1315
1315
|
sources=middleware_sources,
|
|
1316
1316
|
)
|
|
1317
1317
|
)
|
|
@@ -1337,7 +1337,7 @@ def create_cli_agent(
|
|
|
1337
1337
|
)
|
|
1338
1338
|
else:
|
|
1339
1339
|
# No shell access - use plain FilesystemBackend
|
|
1340
|
-
backend = FilesystemBackend(root_dir=root_dir)
|
|
1340
|
+
backend = FilesystemBackend(root_dir=root_dir, virtual_mode=False)
|
|
1341
1341
|
else:
|
|
1342
1342
|
# ========== REMOTE SANDBOX MODE ==========
|
|
1343
1343
|
backend = sandbox # Remote sandbox (ModalSandbox, etc.)
|
|
@@ -1302,7 +1302,7 @@ class DeepAgentsApp(App):
|
|
|
1302
1302
|
"""Total tool count across MCP servers, displayed in the status bar."""
|
|
1303
1303
|
|
|
1304
1304
|
self._mcp_unauthenticated = sum(
|
|
1305
|
-
1 for s in (mcp_server_info or []) if s.
|
|
1305
|
+
1 for s in (mcp_server_info or []) if s.needs_attention()
|
|
1306
1306
|
)
|
|
1307
1307
|
"""MCP servers awaiting a `dcode mcp login` run."""
|
|
1308
1308
|
|
|
@@ -1311,6 +1311,15 @@ class DeepAgentsApp(App):
|
|
|
1311
1311
|
)
|
|
1312
1312
|
"""MCP servers that failed to load (config or network error)."""
|
|
1313
1313
|
|
|
1314
|
+
self._mcp_awaiting_reconnect = sum(
|
|
1315
|
+
1 for s in (mcp_server_info or []) if s.status == "awaiting_reconnect"
|
|
1316
|
+
)
|
|
1317
|
+
"""MCP servers that completed OAuth login but are blocked on
|
|
1318
|
+
`/mcp reconnect` before their tools can load.
|
|
1319
|
+
|
|
1320
|
+
See `MCPServerStatus` for the underlying state machine.
|
|
1321
|
+
"""
|
|
1322
|
+
|
|
1314
1323
|
self._active_mcp_viewer: Any = None
|
|
1315
1324
|
"""Handle to the `/mcp` modal so server-ready events can refresh it."""
|
|
1316
1325
|
|
|
@@ -1478,7 +1487,7 @@ class DeepAgentsApp(App):
|
|
|
1478
1487
|
"""The exception itself when startup failed with
|
|
1479
1488
|
`MissingProviderPackageError`; `None` otherwise. Stashing the exception
|
|
1480
1489
|
rather than a tuple gives the hint builder named access to `.provider`
|
|
1481
|
-
and `.package`, and gates the
|
|
1490
|
+
and `.package`, and gates the `/install` / `/model` recovery hint
|
|
1482
1491
|
without string-matching on the formatted error.
|
|
1483
1492
|
"""
|
|
1484
1493
|
|
|
@@ -1734,6 +1743,7 @@ class DeepAgentsApp(App):
|
|
|
1734
1743
|
mcp_tool_count=self._mcp_tool_count,
|
|
1735
1744
|
mcp_unauthenticated=self._mcp_unauthenticated,
|
|
1736
1745
|
mcp_errored=self._mcp_errored,
|
|
1746
|
+
mcp_awaiting_reconnect=self._mcp_awaiting_reconnect,
|
|
1737
1747
|
connecting=self._connecting,
|
|
1738
1748
|
resuming=self._resume_thread_intent is not None,
|
|
1739
1749
|
local_server=self._server_kwargs is not None,
|
|
@@ -2509,11 +2519,14 @@ class DeepAgentsApp(App):
|
|
|
2509
2519
|
task.add_done_callback(_log_task_exception)
|
|
2510
2520
|
self._mcp_tool_count = sum(len(s.tools) for s in (event.mcp_server_info or []))
|
|
2511
2521
|
self._mcp_unauthenticated = sum(
|
|
2512
|
-
1 for s in (event.mcp_server_info or []) if s.
|
|
2522
|
+
1 for s in (event.mcp_server_info or []) if s.needs_attention()
|
|
2513
2523
|
)
|
|
2514
2524
|
self._mcp_errored = sum(
|
|
2515
2525
|
1 for s in (event.mcp_server_info or []) if s.status == "error"
|
|
2516
2526
|
)
|
|
2527
|
+
self._mcp_awaiting_reconnect = sum(
|
|
2528
|
+
1 for s in (event.mcp_server_info or []) if s.status == "awaiting_reconnect"
|
|
2529
|
+
)
|
|
2517
2530
|
|
|
2518
2531
|
# Update welcome banner to show ready state
|
|
2519
2532
|
try:
|
|
@@ -2522,6 +2535,7 @@ class DeepAgentsApp(App):
|
|
|
2522
2535
|
self._mcp_tool_count,
|
|
2523
2536
|
mcp_unauthenticated=self._mcp_unauthenticated,
|
|
2524
2537
|
mcp_errored=self._mcp_errored,
|
|
2538
|
+
mcp_awaiting_reconnect=self._mcp_awaiting_reconnect,
|
|
2525
2539
|
)
|
|
2526
2540
|
except NoMatches:
|
|
2527
2541
|
logger.warning("Welcome banner not found during server ready transition")
|
|
@@ -2653,12 +2667,29 @@ class DeepAgentsApp(App):
|
|
|
2653
2667
|
and self._server_kwargs is not None
|
|
2654
2668
|
):
|
|
2655
2669
|
missing = self._server_startup_missing_provider_package
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2670
|
+
from deepagents_code.extras_info import extra_for_package
|
|
2671
|
+
|
|
2672
|
+
extra = extra_for_package(missing.package)
|
|
2673
|
+
if extra is not None:
|
|
2674
|
+
text += (
|
|
2675
|
+
f"\n\nHint: install the package with `/install {extra}`, "
|
|
2676
|
+
f"then run `/model {missing.provider}:<model>` to retry. "
|
|
2677
|
+
"Or pick a different provider with `/model`."
|
|
2678
|
+
)
|
|
2679
|
+
else:
|
|
2680
|
+
from deepagents_code.update_check import install_package_command
|
|
2681
|
+
|
|
2682
|
+
try:
|
|
2683
|
+
install_cmd = install_package_command(missing.package)
|
|
2684
|
+
except ValueError:
|
|
2685
|
+
install_hint = f"install the `{missing.package}` package manually"
|
|
2686
|
+
else:
|
|
2687
|
+
install_hint = f"run `{install_cmd}`"
|
|
2688
|
+
text += (
|
|
2689
|
+
f"\n\nHint: {install_hint}, then run "
|
|
2690
|
+
f"`/model {missing.provider}:<model>` "
|
|
2691
|
+
"to retry. Or pick a different provider with `/model`."
|
|
2692
|
+
)
|
|
2662
2693
|
|
|
2663
2694
|
async def _mount_failure() -> None:
|
|
2664
2695
|
# Drop any prior failure widget (re-entrant on retry-then-fail).
|
|
@@ -3122,6 +3153,136 @@ class DeepAgentsApp(App):
|
|
|
3122
3153
|
ErrorMessage(f"Update failed: {type(exc).__name__}: {exc}"),
|
|
3123
3154
|
)
|
|
3124
3155
|
|
|
3156
|
+
async def _handle_install_command(self, command: str) -> None:
|
|
3157
|
+
"""Handle the `/install <extra>` slash command.
|
|
3158
|
+
|
|
3159
|
+
Adds an optional extra (e.g. `quickjs`, `daytona`) to the installed
|
|
3160
|
+
dcode tool by re-running `uv tool install -U 'deepagents-code[<extra>]'`.
|
|
3161
|
+
Refuses unknown extras unless the user passes a `--force` token.
|
|
3162
|
+
|
|
3163
|
+
Args:
|
|
3164
|
+
command: The full slash command line (e.g. `'/install quickjs'`
|
|
3165
|
+
or `'/install foo --force'`).
|
|
3166
|
+
"""
|
|
3167
|
+
parts = command.split()
|
|
3168
|
+
force = "--force" in parts[1:]
|
|
3169
|
+
extras = [p for p in parts[1:] if not p.startswith("-")]
|
|
3170
|
+
if not extras:
|
|
3171
|
+
await self._mount_message(
|
|
3172
|
+
AppMessage(
|
|
3173
|
+
"Usage: /install <extra> [--force]\nExample: /install quickjs",
|
|
3174
|
+
),
|
|
3175
|
+
)
|
|
3176
|
+
return
|
|
3177
|
+
if len(extras) > 1:
|
|
3178
|
+
await self._mount_message(
|
|
3179
|
+
AppMessage(
|
|
3180
|
+
"Only one extra may be installed per /install command. "
|
|
3181
|
+
f"Got: {', '.join(extras)}",
|
|
3182
|
+
),
|
|
3183
|
+
)
|
|
3184
|
+
return
|
|
3185
|
+
extra = extras[0].lower()
|
|
3186
|
+
await self._mount_message(UserMessage(command))
|
|
3187
|
+
|
|
3188
|
+
try:
|
|
3189
|
+
from deepagents_code.config import _is_editable_install
|
|
3190
|
+
from deepagents_code.extras_info import (
|
|
3191
|
+
KNOWN_EXTRAS,
|
|
3192
|
+
MODEL_PROVIDER_EXTRAS,
|
|
3193
|
+
SANDBOX_EXTRAS,
|
|
3194
|
+
)
|
|
3195
|
+
from deepagents_code.update_check import (
|
|
3196
|
+
create_update_log_path,
|
|
3197
|
+
editable_extra_hint,
|
|
3198
|
+
install_extra_command,
|
|
3199
|
+
is_valid_extra_name,
|
|
3200
|
+
perform_install_extra,
|
|
3201
|
+
)
|
|
3202
|
+
except ImportError as exc:
|
|
3203
|
+
logger.warning("/install command import failed", exc_info=True)
|
|
3204
|
+
await self._mount_message(
|
|
3205
|
+
ErrorMessage(f"Install failed: {type(exc).__name__}: {exc}"),
|
|
3206
|
+
)
|
|
3207
|
+
return
|
|
3208
|
+
|
|
3209
|
+
if not is_valid_extra_name(extra):
|
|
3210
|
+
await self._mount_message(
|
|
3211
|
+
AppMessage(
|
|
3212
|
+
"Invalid extra name. Extra names must be "
|
|
3213
|
+
"alphanumeric with `-`, `_`, or `.` (PEP 508).",
|
|
3214
|
+
),
|
|
3215
|
+
)
|
|
3216
|
+
return
|
|
3217
|
+
|
|
3218
|
+
if await asyncio.to_thread(_is_editable_install):
|
|
3219
|
+
await self._mount_message(
|
|
3220
|
+
AppMessage(
|
|
3221
|
+
"Editable install detected — cannot install extras.\n"
|
|
3222
|
+
+ editable_extra_hint(extra),
|
|
3223
|
+
),
|
|
3224
|
+
)
|
|
3225
|
+
return
|
|
3226
|
+
|
|
3227
|
+
if extra not in KNOWN_EXTRAS and not force:
|
|
3228
|
+
known = ", ".join(sorted(KNOWN_EXTRAS))
|
|
3229
|
+
await self._mount_message(
|
|
3230
|
+
AppMessage(
|
|
3231
|
+
f"'{extra}' is not a known extra.\n"
|
|
3232
|
+
f"Known extras: {known}\n\n"
|
|
3233
|
+
f"This would run: `{install_extra_command(extra)}`\n"
|
|
3234
|
+
f"Re-run with `--force` to install anyway: "
|
|
3235
|
+
f"`/install {extra} --force`",
|
|
3236
|
+
),
|
|
3237
|
+
)
|
|
3238
|
+
return
|
|
3239
|
+
|
|
3240
|
+
log_path = create_update_log_path()
|
|
3241
|
+
await self._mount_message(
|
|
3242
|
+
AppMessage(f"Installing extra '{extra}'..."),
|
|
3243
|
+
)
|
|
3244
|
+
manual_cmd = install_extra_command(extra)
|
|
3245
|
+
try:
|
|
3246
|
+
success, output = await perform_install_extra(extra, log_path=log_path)
|
|
3247
|
+
except (OSError, asyncio.CancelledError) as exc:
|
|
3248
|
+
logger.warning("/install command failed", exc_info=True)
|
|
3249
|
+
await self._mount_message(
|
|
3250
|
+
ErrorMessage(
|
|
3251
|
+
f"Install failed: {type(exc).__name__}: {exc}\n"
|
|
3252
|
+
f"Log: {log_path}\n"
|
|
3253
|
+
f"Run manually: {manual_cmd}",
|
|
3254
|
+
),
|
|
3255
|
+
)
|
|
3256
|
+
return
|
|
3257
|
+
|
|
3258
|
+
if not success:
|
|
3259
|
+
# Tail the last 200 chars — uv resolver prints the resolved
|
|
3260
|
+
# error at the end, not the beginning.
|
|
3261
|
+
detail = f": {output[-200:]}" if output else ""
|
|
3262
|
+
await self._mount_message(
|
|
3263
|
+
ErrorMessage(
|
|
3264
|
+
f"Install failed{detail}\n"
|
|
3265
|
+
f"Log: {log_path}\n"
|
|
3266
|
+
f"Run manually: {manual_cmd}",
|
|
3267
|
+
),
|
|
3268
|
+
)
|
|
3269
|
+
return
|
|
3270
|
+
|
|
3271
|
+
# Model-provider and sandbox extras are imported by the langgraph
|
|
3272
|
+
# server subprocess; `/restart` respawns that subprocess and picks
|
|
3273
|
+
# them up without exiting the TUI. `quickjs` (and other
|
|
3274
|
+
# STANDALONE_EXTRAS) are wired into the parent process at startup
|
|
3275
|
+
# (`verify_interpreter_deps` gates `--interpreter`), so a full
|
|
3276
|
+
# relaunch is required.
|
|
3277
|
+
if extra in MODEL_PROVIDER_EXTRAS or extra in SANDBOX_EXTRAS:
|
|
3278
|
+
next_step = "Run `/restart` to load it now, or relaunch dcode."
|
|
3279
|
+
else:
|
|
3280
|
+
next_step = "Exit and relaunch dcode to use the new dependencies."
|
|
3281
|
+
|
|
3282
|
+
await self._mount_message(
|
|
3283
|
+
AppMessage(f"Installed extra '{extra}'. {next_step}"),
|
|
3284
|
+
)
|
|
3285
|
+
|
|
3125
3286
|
async def _handle_version_command(self) -> None:
|
|
3126
3287
|
"""Handle the `/version` slash command — show versions and update status.
|
|
3127
3288
|
|
|
@@ -3174,7 +3335,7 @@ class DeepAgentsApp(App):
|
|
|
3174
3335
|
except Exception:
|
|
3175
3336
|
logger.warning(
|
|
3176
3337
|
"Could not resolve upgrade command for /version; "
|
|
3177
|
-
"falling back to generic
|
|
3338
|
+
"falling back to generic upgrade hint",
|
|
3178
3339
|
exc_info=True,
|
|
3179
3340
|
)
|
|
3180
3341
|
from deepagents_code.update_check import FALLBACK_UPGRADE_COMMAND
|
|
@@ -4972,7 +5133,9 @@ class DeepAgentsApp(App):
|
|
|
4972
5133
|
await self._mount_message(
|
|
4973
5134
|
AppMessage(
|
|
4974
5135
|
"The `langsmith` package is not installed. "
|
|
4975
|
-
"Install it with
|
|
5136
|
+
"Install it with "
|
|
5137
|
+
"`uv tool install -U deepagents-code --with langsmith` "
|
|
5138
|
+
"to enable `/trace`.",
|
|
4976
5139
|
),
|
|
4977
5140
|
)
|
|
4978
5141
|
return
|
|
@@ -5070,7 +5233,8 @@ class DeepAgentsApp(App):
|
|
|
5070
5233
|
"/mcp, /model [--model-params JSON] [--default], "
|
|
5071
5234
|
"/notifications, /reload, /skill:<name>, /remember, "
|
|
5072
5235
|
"/skill-creator, /theme, /tokens, /threads, /trace, "
|
|
5073
|
-
"/update, /auto-update, /
|
|
5236
|
+
"/update, /auto-update, /install, /changelog, /docs, "
|
|
5237
|
+
"/feedback, /help\n\n"
|
|
5074
5238
|
"Interactive Features:\n"
|
|
5075
5239
|
" Enter Submit your message\n"
|
|
5076
5240
|
f" {newline_shortcut():<15} Insert newline\n"
|
|
@@ -5180,6 +5344,8 @@ class DeepAgentsApp(App):
|
|
|
5180
5344
|
await self._handle_update_command()
|
|
5181
5345
|
elif cmd == "/auto-update":
|
|
5182
5346
|
await self._handle_auto_update_toggle()
|
|
5347
|
+
elif cmd == "/install" or cmd.startswith("/install "):
|
|
5348
|
+
await self._handle_install_command(command)
|
|
5183
5349
|
elif cmd == "/tokens":
|
|
5184
5350
|
await self._mount_message(UserMessage(command))
|
|
5185
5351
|
if self._context_tokens > 0:
|
|
@@ -7569,6 +7735,7 @@ class DeepAgentsApp(App):
|
|
|
7569
7735
|
self._mcp_tool_count,
|
|
7570
7736
|
mcp_unauthenticated=self._mcp_unauthenticated,
|
|
7571
7737
|
mcp_errored=self._mcp_errored,
|
|
7738
|
+
mcp_awaiting_reconnect=self._mcp_awaiting_reconnect,
|
|
7572
7739
|
)
|
|
7573
7740
|
except NoMatches:
|
|
7574
7741
|
pass
|
|
@@ -8341,6 +8508,34 @@ class DeepAgentsApp(App):
|
|
|
8341
8508
|
self._pending_mcp_disable_reconnect_servers
|
|
8342
8509
|
)
|
|
8343
8510
|
|
|
8511
|
+
def _refresh_welcome_banner_mcp_counts(self) -> None:
|
|
8512
|
+
"""Push current MCP counts into the welcome banner when it is mounted."""
|
|
8513
|
+
try:
|
|
8514
|
+
banner = self.query_one("#welcome-banner", WelcomeBanner)
|
|
8515
|
+
except NoMatches:
|
|
8516
|
+
logger.debug("Welcome banner not mounted during MCP count refresh")
|
|
8517
|
+
return
|
|
8518
|
+
banner.set_connected(
|
|
8519
|
+
self._mcp_tool_count,
|
|
8520
|
+
mcp_unauthenticated=self._mcp_unauthenticated,
|
|
8521
|
+
mcp_errored=self._mcp_errored,
|
|
8522
|
+
mcp_awaiting_reconnect=self._mcp_awaiting_reconnect,
|
|
8523
|
+
)
|
|
8524
|
+
|
|
8525
|
+
def _clear_mcp_login_reconnect_banner_counts(self, server_name: str) -> None:
|
|
8526
|
+
"""Optimistically clear splash login/reconnect prompts before restart.
|
|
8527
|
+
|
|
8528
|
+
Args:
|
|
8529
|
+
server_name: Server whose successful login triggered the reconnect.
|
|
8530
|
+
"""
|
|
8531
|
+
self._mcp_unauthenticated = sum(
|
|
8532
|
+
1
|
|
8533
|
+
for s in self._mcp_server_info or []
|
|
8534
|
+
if s.name != server_name and s.needs_attention()
|
|
8535
|
+
)
|
|
8536
|
+
self._mcp_awaiting_reconnect = 0
|
|
8537
|
+
self._refresh_welcome_banner_mcp_counts()
|
|
8538
|
+
|
|
8344
8539
|
async def _handle_mcp_reconnect_command(self, *, force: bool = False) -> None:
|
|
8345
8540
|
"""Restart the server to pick up any deferred MCP login tokens.
|
|
8346
8541
|
|
|
@@ -8595,6 +8790,50 @@ class DeepAgentsApp(App):
|
|
|
8595
8790
|
)
|
|
8596
8791
|
self._mcp_server_info = updated
|
|
8597
8792
|
|
|
8793
|
+
def _apply_optimistic_mcp_login_pending_state(self, server_name: str) -> None:
|
|
8794
|
+
"""Mark a just-authenticated server as waiting for reconnect.
|
|
8795
|
+
|
|
8796
|
+
OAuth tokens are already persisted at this point, but the running
|
|
8797
|
+
LangGraph server still has the old MCP tool set. This keeps `/mcp`
|
|
8798
|
+
from continuing to label the server as unauthenticated after the
|
|
8799
|
+
user explicitly chose to defer the reconnect.
|
|
8800
|
+
"""
|
|
8801
|
+
from deepagents_code.mcp_tools import MCPServerInfo
|
|
8802
|
+
|
|
8803
|
+
info = self._mcp_server_info
|
|
8804
|
+
if not info:
|
|
8805
|
+
return
|
|
8806
|
+
|
|
8807
|
+
updated: list[MCPServerInfo] = []
|
|
8808
|
+
matched = False
|
|
8809
|
+
for entry in info:
|
|
8810
|
+
if entry.name != server_name:
|
|
8811
|
+
updated.append(entry)
|
|
8812
|
+
continue
|
|
8813
|
+
matched = True
|
|
8814
|
+
updated.append(
|
|
8815
|
+
MCPServerInfo(
|
|
8816
|
+
name=entry.name,
|
|
8817
|
+
transport=entry.transport,
|
|
8818
|
+
status="awaiting_reconnect",
|
|
8819
|
+
error="Authenticated — run `/mcp reconnect` to load tools.",
|
|
8820
|
+
),
|
|
8821
|
+
)
|
|
8822
|
+
self._mcp_server_info = updated
|
|
8823
|
+
self._mcp_unauthenticated = sum(
|
|
8824
|
+
1 for s in self._mcp_server_info if s.needs_attention()
|
|
8825
|
+
)
|
|
8826
|
+
self._mcp_errored = sum(1 for s in self._mcp_server_info if s.status == "error")
|
|
8827
|
+
self._mcp_awaiting_reconnect = sum(
|
|
8828
|
+
1 for s in self._mcp_server_info if s.status == "awaiting_reconnect"
|
|
8829
|
+
)
|
|
8830
|
+
if not matched:
|
|
8831
|
+
logger.warning(
|
|
8832
|
+
"MCP login completed for unknown server %r; pending state unchanged",
|
|
8833
|
+
server_name,
|
|
8834
|
+
)
|
|
8835
|
+
self._refresh_welcome_banner_mcp_counts()
|
|
8836
|
+
|
|
8598
8837
|
def on_worker_state_changed(self, event: Worker.StateChanged) -> None:
|
|
8599
8838
|
"""Surface login worker failures that escaped the inner error handling."""
|
|
8600
8839
|
from textual.worker import WorkerState
|
|
@@ -8811,6 +9050,7 @@ class DeepAgentsApp(App):
|
|
|
8811
9050
|
)
|
|
8812
9051
|
self._pending_mcp_login_reconnect = True
|
|
8813
9052
|
self._sync_pending_mcp_reconnect()
|
|
9053
|
+
self._apply_optimistic_mcp_login_pending_state(server_name)
|
|
8814
9054
|
self.notify(
|
|
8815
9055
|
f"Logged in to {server_name!r} but the reconnect prompt "
|
|
8816
9056
|
"failed. Run `/mcp reconnect` when ready to load the new tools.",
|
|
@@ -8865,6 +9105,7 @@ class DeepAgentsApp(App):
|
|
|
8865
9105
|
self._pending_mcp_login_reconnect = False
|
|
8866
9106
|
self._pending_mcp_disable_reconnect_servers.clear()
|
|
8867
9107
|
self._sync_pending_mcp_reconnect()
|
|
9108
|
+
self._clear_mcp_login_reconnect_banner_counts(server_name)
|
|
8868
9109
|
await self._restart_server_for_mcp_refresh(server_name)
|
|
8869
9110
|
return
|
|
8870
9111
|
|
|
@@ -8876,6 +9117,7 @@ class DeepAgentsApp(App):
|
|
|
8876
9117
|
# an action they didn't take.
|
|
8877
9118
|
self._pending_mcp_login_reconnect = True
|
|
8878
9119
|
self._sync_pending_mcp_reconnect()
|
|
9120
|
+
self._apply_optimistic_mcp_login_pending_state(server_name)
|
|
8879
9121
|
if choice == "later":
|
|
8880
9122
|
self.notify(
|
|
8881
9123
|
f"Logged in to {server_name!r}. Run `/mcp reconnect` when ready "
|
|
@@ -183,6 +183,13 @@ COMMANDS: tuple[SlashCommand, ...] = (
|
|
|
183
183
|
bypass_tier=BypassTier.QUEUED,
|
|
184
184
|
hidden_keywords="upgrade",
|
|
185
185
|
),
|
|
186
|
+
SlashCommand(
|
|
187
|
+
name="/install",
|
|
188
|
+
description="Install an optional extra (e.g. quickjs, daytona, fireworks)",
|
|
189
|
+
bypass_tier=BypassTier.QUEUED,
|
|
190
|
+
hidden_keywords="extra extras add provider sandbox dependency",
|
|
191
|
+
argument_hint="<extra> [--force]",
|
|
192
|
+
),
|
|
186
193
|
SlashCommand(
|
|
187
194
|
name="/auto-update",
|
|
188
195
|
description="Toggle automatic updates on or off",
|
|
@@ -2464,10 +2464,27 @@ def _create_model_via_init(
|
|
|
2464
2464
|
f"import for provider '{provider}': {e}"
|
|
2465
2465
|
)
|
|
2466
2466
|
else:
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
2467
|
+
from deepagents_code.extras_info import extra_for_package
|
|
2468
|
+
|
|
2469
|
+
extra = extra_for_package(package)
|
|
2470
|
+
if extra is not None:
|
|
2471
|
+
msg = (
|
|
2472
|
+
f"Missing package for provider '{provider}'. "
|
|
2473
|
+
f"Install: /install {extra}"
|
|
2474
|
+
)
|
|
2475
|
+
else:
|
|
2476
|
+
from deepagents_code.update_check import install_package_command
|
|
2477
|
+
|
|
2478
|
+
try:
|
|
2479
|
+
install_cmd = install_package_command(package)
|
|
2480
|
+
except ValueError:
|
|
2481
|
+
install_hint = f"Install the '{package}' package manually"
|
|
2482
|
+
else:
|
|
2483
|
+
install_hint = f"Install with: {install_cmd}"
|
|
2484
|
+
msg = (
|
|
2485
|
+
f"Missing package for provider '{provider}'. "
|
|
2486
|
+
f"{install_hint}, then retry with `/model`."
|
|
2487
|
+
)
|
|
2471
2488
|
raise MissingProviderPackageError(
|
|
2472
2489
|
msg, provider=provider, package=package
|
|
2473
2490
|
) from e
|