deepagents-code 0.1.48__tar.gz → 0.1.49__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.48 → deepagents_code-0.1.49}/AGENTS.md +1 -1
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/CHANGELOG.md +15 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/COMMANDS.md +4 -1
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/PKG-INFO +10 -10
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_build_info.py +1 -1
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/app.py +176 -18
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/auto_mode.py +5 -4
- deepagents_code-0.1.49/deepagents_code/client/commands/extras.py +304 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/command_registry.py +18 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/integrations/sandbox_factory.py +1 -1
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/integrations/sandbox_provider.py +2 -2
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/main.py +54 -226
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/model_config.py +79 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/server_graph.py +49 -8
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/message_store.py +23 -1
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/messages.py +360 -34
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/startup_tip.py +2 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/yolo_mode_notice.py +39 -18
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/ui.py +53 -7
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/pyproject.toml +7 -7
- deepagents_code-0.1.49/tests/unit_tests/client/commands/test_extras.py +168 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_agent_friendly.py +8 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_app.py +342 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_auto_mode.py +4 -4
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_extras_info.py +1 -1
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_install_command.py +58 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_model_config.py +95 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_model_switch.py +177 -72
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_sandbox_factory.py +1 -1
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_sandbox_provider.py +2 -2
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_sandbox_registry.py +1 -1
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_server_graph.py +41 -6
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_message_store.py +31 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_messages.py +298 -6
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/uv.lock +18 -18
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/.gitignore +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/ARCHITECTURE.md +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/DEVELOPMENT.md +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/Makefile +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/README.md +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/THREAT_MODEL.md +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_debug_buffer.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_env_vars.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_fake_models.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_paths.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_repository_bounds.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_server_config.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_tool_stream.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/agent.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/approval_mode.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/commands/auth.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/commands/config.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/commands/mcp.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/commands/tools.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/launch/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/launch/server.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/launch/server_manager.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/non_interactive.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/remote_client.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/config.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/config_manifest.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/configurable_model.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/doctor.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/extras_info.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/goal_rubric.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/goal_state_notice.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/goal_tools.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/capabilities.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/engine.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/env.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/legacy.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/loading.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/migration.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/models/adapters.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/models/config.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/models/domain.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/models/transport.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/models/wire.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/projection.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/reducer.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/runner.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/runtime.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/snapshot.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/tools.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/transcript.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/json_types.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/managed_tools.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_auth.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_config.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_tools.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/offload.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/offload_middleware.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/paste_collapse.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/_json.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/adapters/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/adapters/mcp.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/adapters/skills.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/commands_cli.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/discovery.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/manifest.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/marketplace.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/models.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/store.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/substitution.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/reasoning_effort.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/reliable_rubric.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/sessions.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/skills/merge.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/skills/trust.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/system_prompt.md +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/todo_list_prompt.md +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tool_catalog.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/screens/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/textual_adapter.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/_links.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/approval.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/ask_user.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/auth.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/chat_input.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/codex_auth.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/debug_console.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/diff.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/effort_selector.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/goal_review.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/goal_status.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/history.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/install_confirm.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/loading.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/model_selector.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/plugin_reload.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/skill_trust.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/status.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/thread_selector.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/update_available.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/update_confirm.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/welcome.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/update_check.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/hatch_build.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/images/tui.png +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/scripts/install.sh +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/README.md +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/test_auto_approve_remote.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/test_offload_server_side.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/client/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/client/commands/test_auth.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/client/commands/test_mcp.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/client/commands/test_tools.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/conftest.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/hooks/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/hooks/models/test_models.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/hooks/test_configuration.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/hooks/test_engine.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/hooks/test_execution.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/hooks/test_transcript.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/plugins/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/plugins/test_marketplace.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/plugins/test_store.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_merge.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_skill_trust.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/smoke_tests/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/smoke_tests/conftest.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test__tool_stream.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_agent.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_approval_mode.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_args.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_config.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_config_manifest.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_config_recursion_limit.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_cursor_blink.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_cursor_style.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_debug_buffer.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_debug_console.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_doctor.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_goal_criteria_client.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_goal_rubric.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_goal_state_notice.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_goal_state_persistence.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_goal_tools.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_hatch_build.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_install_script.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_json_types.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_main.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_managed_tools.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_config.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_paths.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_reasoning_effort.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_reliable_rubric.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_repository_bounds.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_rubric_cli.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_server.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_startup_blocking.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_threads_resume.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_tool_catalog.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_tracing_replicas.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_transcript_virtualization.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_history.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_links.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_plugin_reload.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_status.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
- {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
|
@@ -32,7 +32,7 @@ IMPORTANT: `Content` requires **Textual's** `Style` (`textual.style.Style`) for
|
|
|
32
32
|
|
|
33
33
|
### `App.notify()` defaults to `markup=True`
|
|
34
34
|
|
|
35
|
-
Textual's `App.notify(message)` parses the message string as Rich markup by default. Any dynamic content (exception messages, file paths, user input, command strings) containing brackets `[]
|
|
35
|
+
Textual's `App.notify(message)` parses the message string as Rich markup by default. Any dynamic content (exception messages, file paths, user input, command strings) containing square brackets is unsafe: tag-shaped text like `[bold]` is silently swallowed, and closing-tag-shaped text like `[/tmp/x]` raises a `MarkupError` crash in Textual's Toast renderer. Always pass `markup=False` when the message contains f-string interpolated variables. Hardcoded string literals are safe with the default.
|
|
36
36
|
|
|
37
37
|
### Rich `console.print()` and number highlighting
|
|
38
38
|
|
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.1.49](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.48...deepagents-code==0.1.49) (2026-07-27)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- Added recognition for LangSmith Gateway credentials. ([#5042](https://github.com/langchain-ai/deepagents/issues/5042))
|
|
10
|
+
- Added slash commands for mode changes and an option to escape to manual mode from the YOLO notice. ([#5092](https://github.com/langchain-ai/deepagents/issues/5092))
|
|
11
|
+
- Added an `install` subcommand. ([#5080](https://github.com/langchain-ai/deepagents/issues/5080))
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
- Kept the post-install restart modal responsive. ([#5086](https://github.com/langchain-ai/deepagents/issues/5086))
|
|
16
|
+
- Moved server graph bootstrap `cwd` calls off the event loop. ([#5081](https://github.com/langchain-ai/deepagents/issues/5081))
|
|
17
|
+
- Improved handling of long transcript user messages with toast notifications and expansion. ([#5073](https://github.com/langchain-ai/deepagents/issues/5073))
|
|
18
|
+
- Show model no-op notices as toasts instead of inline messages. ([#5074](https://github.com/langchain-ai/deepagents/issues/5074))
|
|
19
|
+
|
|
5
20
|
## [0.1.48](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.47...deepagents-code==0.1.48) (2026-07-27)
|
|
6
21
|
|
|
7
22
|
### Features
|
|
@@ -8,12 +8,13 @@ Regenerate this file with `make commands-catalog` after changing command names,
|
|
|
8
8
|
aliases, descriptions, visibility, or hidden-command metadata.
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
## Public (
|
|
11
|
+
## Public (37)
|
|
12
12
|
|
|
13
13
|
| Command | Aliases | Description |
|
|
14
14
|
| --- | --- | --- |
|
|
15
15
|
| `/agents` | | Browse and switch between available agents |
|
|
16
16
|
| `/auth` | `/connect` | Connect and manage provider and service credentials |
|
|
17
|
+
| `/auto` | | Switch to Auto approval mode |
|
|
17
18
|
| `/auto-update` | | Turn automatic updates on or off |
|
|
18
19
|
| `/changelog` | | Open the changelog in a browser |
|
|
19
20
|
| `/clear` | | Clear the chat and start a new thread |
|
|
@@ -26,6 +27,7 @@ aliases, descriptions, visibility, or hidden-command metadata.
|
|
|
26
27
|
| `/goal` | | Set and manage a persistent objective with acceptance criteria |
|
|
27
28
|
| `/help` | | Show help and available commands |
|
|
28
29
|
| `/install` | | Install an optional integration |
|
|
30
|
+
| `/manual` | | Switch to Manual approval mode |
|
|
29
31
|
| `/mcp` | | Manage MCP servers and authentication |
|
|
30
32
|
| `/model` | | Switch models or edit model settings |
|
|
31
33
|
| `/notifications` | | Configure startup warnings |
|
|
@@ -46,6 +48,7 @@ aliases, descriptions, visibility, or hidden-command metadata.
|
|
|
46
48
|
| `/trace` | | Open this thread in LangSmith |
|
|
47
49
|
| `/update` | | Check for and install updates |
|
|
48
50
|
| `/version` | `/about` | Show version information |
|
|
51
|
+
| `/yolo` | | Switch to YOLO approval mode (no review) |
|
|
49
52
|
|
|
50
53
|
## Hidden (2)
|
|
51
54
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.49
|
|
4
4
|
Summary: Terminal coding agent built on the Deep Agents SDK - works with any model, with persistent memory, customizable skills, subagents, and approval controls.
|
|
5
5
|
Project-URL: Homepage, https://docs.langchain.com/oss/python/deepagents/overview
|
|
6
6
|
Project-URL: Documentation, https://reference.langchain.com/python/deepagents/
|
|
@@ -32,10 +32,10 @@ Requires-Dist: deepagents==0.7.0b2
|
|
|
32
32
|
Requires-Dist: filelock<3.30,>=3.29.7
|
|
33
33
|
Requires-Dist: httpx<1.0.0,>=0.28.1
|
|
34
34
|
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.2
|
|
35
|
-
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.
|
|
35
|
+
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.2
|
|
36
36
|
Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.0
|
|
37
37
|
Requires-Dist: langchain-openai<2.0.0,>=1.4.1
|
|
38
|
-
Requires-Dist: langchain-quickjs<0.4.0,>=0.3.
|
|
38
|
+
Requires-Dist: langchain-quickjs<0.4.0,>=0.3.4
|
|
39
39
|
Requires-Dist: langchain<2.0.0,>=1.3.14
|
|
40
40
|
Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
|
|
41
41
|
Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.31
|
|
@@ -46,7 +46,7 @@ Requires-Dist: markdownify<2.0.0,>=1.2.3
|
|
|
46
46
|
Requires-Dist: mcp<2.0.0,>=1.28.1
|
|
47
47
|
Requires-Dist: packaging>=26.2
|
|
48
48
|
Requires-Dist: pillow<13.0.0,>=12.3.0
|
|
49
|
-
Requires-Dist: prompt-toolkit<4.0.0,>=3.0.
|
|
49
|
+
Requires-Dist: prompt-toolkit<4.0.0,>=3.0.53
|
|
50
50
|
Requires-Dist: pydantic<2.14.0a0,>=2.12.5
|
|
51
51
|
Requires-Dist: pyperclip<2.0.0,>=1.11.0
|
|
52
52
|
Requires-Dist: python-dotenv<2.0.0,>=1.2.2
|
|
@@ -65,11 +65,11 @@ Provides-Extra: all-providers
|
|
|
65
65
|
Requires-Dist: aiohttp<3.15.0,>=3.14.3; extra == 'all-providers'
|
|
66
66
|
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.2; extra == 'all-providers'
|
|
67
67
|
Requires-Dist: langchain-aws<2.0.0,>=1.6.3; extra == 'all-providers'
|
|
68
|
-
Requires-Dist: langchain-baseten<1.0.0,>=0.2.
|
|
68
|
+
Requires-Dist: langchain-baseten<1.0.0,>=0.2.3; extra == 'all-providers'
|
|
69
69
|
Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
|
|
70
70
|
Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
71
|
-
Requires-Dist: langchain-fireworks<2.0.0,>=1.5.
|
|
72
|
-
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.
|
|
71
|
+
Requires-Dist: langchain-fireworks<2.0.0,>=1.5.2; extra == 'all-providers'
|
|
72
|
+
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.2; extra == 'all-providers'
|
|
73
73
|
Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.4; extra == 'all-providers'
|
|
74
74
|
Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'all-providers'
|
|
75
75
|
Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'all-providers'
|
|
@@ -93,7 +93,7 @@ Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
|
|
|
93
93
|
Provides-Extra: anthropic
|
|
94
94
|
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.2; extra == 'anthropic'
|
|
95
95
|
Provides-Extra: baseten
|
|
96
|
-
Requires-Dist: langchain-baseten<1.0.0,>=0.2.
|
|
96
|
+
Requires-Dist: langchain-baseten<1.0.0,>=0.2.3; extra == 'baseten'
|
|
97
97
|
Provides-Extra: bedrock
|
|
98
98
|
Requires-Dist: langchain-aws<2.0.0,>=1.6.3; extra == 'bedrock'
|
|
99
99
|
Provides-Extra: cohere
|
|
@@ -103,9 +103,9 @@ Requires-Dist: langchain-daytona>=0.0.7; extra == 'daytona'
|
|
|
103
103
|
Provides-Extra: deepseek
|
|
104
104
|
Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'deepseek'
|
|
105
105
|
Provides-Extra: fireworks
|
|
106
|
-
Requires-Dist: langchain-fireworks<2.0.0,>=1.5.
|
|
106
|
+
Requires-Dist: langchain-fireworks<2.0.0,>=1.5.2; extra == 'fireworks'
|
|
107
107
|
Provides-Extra: google-genai
|
|
108
|
-
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.
|
|
108
|
+
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.2; extra == 'google-genai'
|
|
109
109
|
Provides-Extra: groq
|
|
110
110
|
Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'groq'
|
|
111
111
|
Provides-Extra: huggingface
|
|
@@ -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.49" # 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."""
|
|
@@ -571,7 +571,13 @@ class _ConfigWriteResult:
|
|
|
571
571
|
ScreenResultT = TypeVar("ScreenResultT")
|
|
572
572
|
|
|
573
573
|
if TYPE_CHECKING:
|
|
574
|
-
from collections.abc import
|
|
574
|
+
from collections.abc import (
|
|
575
|
+
AsyncIterator,
|
|
576
|
+
Awaitable,
|
|
577
|
+
Callable,
|
|
578
|
+
Coroutine,
|
|
579
|
+
Mapping,
|
|
580
|
+
)
|
|
575
581
|
|
|
576
582
|
from deepagents.backends import CompositeBackend
|
|
577
583
|
from langchain_core.messages import BaseMessage
|
|
@@ -3161,8 +3167,14 @@ class DeepAgentsApp(App):
|
|
|
3161
3167
|
)
|
|
3162
3168
|
"""Per-turn model params override set via startup or `/model` params."""
|
|
3163
3169
|
|
|
3164
|
-
self.
|
|
3165
|
-
"""Most recent same-model
|
|
3170
|
+
self._last_model_unchanged: tuple[str, float] | None = None
|
|
3171
|
+
"""Most recent same-model toast, as `(text, monotonic timestamp)`.
|
|
3172
|
+
|
|
3173
|
+
Used to suppress duplicates. Suppression only lasts for the toast
|
|
3174
|
+
lifetime (`NOTIFICATION_TIMEOUT`); after expiry, a later identical
|
|
3175
|
+
no-op selection can toast again. Text and timestamp are one field so
|
|
3176
|
+
they cannot drift out of sync.
|
|
3177
|
+
"""
|
|
3166
3178
|
|
|
3167
3179
|
self._model_install_switching = False
|
|
3168
3180
|
"""True while a provider extra install-then-switch flow is active."""
|
|
@@ -6179,9 +6191,14 @@ class DeepAgentsApp(App):
|
|
|
6179
6191
|
# restart. `_offer_restart_after_install` owns all follow-up messaging
|
|
6180
6192
|
# (the prompt's button is the call to action when shown; it mounts a
|
|
6181
6193
|
# `/restart`-or-relaunch hint itself when it can't show the prompt), so
|
|
6182
|
-
# a redundant "Run /restart" line is never appended here.
|
|
6194
|
+
# a redundant "Run /restart" line is never appended here. The offer is
|
|
6195
|
+
# scheduled off the message pump so the modal stays responsive (see
|
|
6196
|
+
# `_schedule_restart_offer`); the interactive offer never affects this
|
|
6197
|
+
# method's return value, so detaching it does not change the contract.
|
|
6183
6198
|
await self._mount_message(AppMessage(f"Installed extra '{extra}'."))
|
|
6184
|
-
|
|
6199
|
+
self._schedule_restart_offer(
|
|
6200
|
+
self._offer_restart_after_install(extra), context=f"extra:{extra}"
|
|
6201
|
+
)
|
|
6185
6202
|
return True
|
|
6186
6203
|
|
|
6187
6204
|
async def _handle_install_package(self, package: str, *, force: bool) -> None:
|
|
@@ -6272,7 +6289,11 @@ class DeepAgentsApp(App):
|
|
|
6272
6289
|
"now, or relaunch dcode.",
|
|
6273
6290
|
),
|
|
6274
6291
|
)
|
|
6275
|
-
|
|
6292
|
+
# Scheduled off the message pump so the restart modal stays responsive
|
|
6293
|
+
# to Enter/Esc (see `_schedule_restart_offer`).
|
|
6294
|
+
self._schedule_restart_offer(
|
|
6295
|
+
self._offer_restart_after_install(package), context=f"package:{package}"
|
|
6296
|
+
)
|
|
6276
6297
|
|
|
6277
6298
|
async def _confirm_install_package(self, package: str) -> bool:
|
|
6278
6299
|
"""Ask the user to confirm installing an arbitrary package.
|
|
@@ -12379,6 +12400,10 @@ class DeepAgentsApp(App):
|
|
|
12379
12400
|
await self._handle_version_command()
|
|
12380
12401
|
elif cmd == "/agents":
|
|
12381
12402
|
await self._show_agent_selector()
|
|
12403
|
+
elif cmd in {"/manual", "/auto", "/yolo"}:
|
|
12404
|
+
from deepagents_code.approval_mode import ApprovalMode
|
|
12405
|
+
|
|
12406
|
+
await self._handle_approval_mode_command(ApprovalMode(cmd.lstrip("/")))
|
|
12382
12407
|
elif cmd == "/goal" or cmd.startswith("/goal "):
|
|
12383
12408
|
await self._handle_goal_command(command)
|
|
12384
12409
|
elif cmd in {"/rubric", "/criteria"} or cmd.startswith(
|
|
@@ -13821,6 +13846,24 @@ class DeepAgentsApp(App):
|
|
|
13821
13846
|
)
|
|
13822
13847
|
await self._mount_message(user_message)
|
|
13823
13848
|
self._active_user_message = user_message
|
|
13849
|
+
# Toast only on submit when the transcript will collapse the body —
|
|
13850
|
+
# the model still receives the full text; the UI is head+tail until
|
|
13851
|
+
# the user expands. Asking the widget (rather than re-deriving from
|
|
13852
|
+
# `message`) keeps this in step with what `render()` actually collapses,
|
|
13853
|
+
# including its mode-prefix handling.
|
|
13854
|
+
if user_message.has_expandable_body:
|
|
13855
|
+
# "Shortened", not "collapsed": a large paste already toasted
|
|
13856
|
+
# "Large paste collapsed" in the composer (see chat_input), and
|
|
13857
|
+
# that means something different (a placeholder chip, not a
|
|
13858
|
+
# head+tail elision in the transcript).
|
|
13859
|
+
self.notify(
|
|
13860
|
+
"Long message shortened in the transcript — click "
|
|
13861
|
+
"'show full message' to expand it. The full text was still "
|
|
13862
|
+
"sent to the model.",
|
|
13863
|
+
severity="information",
|
|
13864
|
+
markup=False,
|
|
13865
|
+
timeout=8,
|
|
13866
|
+
)
|
|
13824
13867
|
await self._send_to_agent(message)
|
|
13825
13868
|
|
|
13826
13869
|
async def _send_to_agent(
|
|
@@ -15723,6 +15766,23 @@ class DeepAgentsApp(App):
|
|
|
15723
15766
|
)
|
|
15724
15767
|
self._schedule_message_height_measurement(event.widget.id)
|
|
15725
15768
|
|
|
15769
|
+
def on_user_message_expansion_changed(
|
|
15770
|
+
self,
|
|
15771
|
+
event: UserMessage.ExpansionChanged,
|
|
15772
|
+
) -> None:
|
|
15773
|
+
"""Keep long-prompt expansion state across transcript virtualization.
|
|
15774
|
+
|
|
15775
|
+
Also re-measures the row: expanding a collapsed prompt can add hundreds
|
|
15776
|
+
of lines, and the spacer math that sizes the scrollbar reads a cached
|
|
15777
|
+
height that `refresh(layout=True)` alone does not update.
|
|
15778
|
+
"""
|
|
15779
|
+
if event.widget.id:
|
|
15780
|
+
self._message_store.update_message(
|
|
15781
|
+
event.widget.id,
|
|
15782
|
+
user_expanded=event.expanded,
|
|
15783
|
+
)
|
|
15784
|
+
self._schedule_message_height_measurement(event.widget.id)
|
|
15785
|
+
|
|
15726
15786
|
async def _clear_messages(self) -> None:
|
|
15727
15787
|
"""Clear the messages area and message store."""
|
|
15728
15788
|
# Drop buffered `!` shell output so it never leaks across a thread
|
|
@@ -16865,8 +16925,8 @@ class DeepAgentsApp(App):
|
|
|
16865
16925
|
text = f"Auto denied [{event.get('category', 'policy')}]: {reason}"
|
|
16866
16926
|
elif kind == "unavailable":
|
|
16867
16927
|
# Reason is a short cause fragment from the server; keep the UI
|
|
16868
|
-
# line outcome-focused so
|
|
16869
|
-
text = f"Auto classifier unavailable: {reason}
|
|
16928
|
+
# line outcome-focused so fail-closed denial is obvious.
|
|
16929
|
+
text = f"Auto classifier unavailable: {reason} — tool not executed"
|
|
16870
16930
|
else:
|
|
16871
16931
|
text = f"Auto warning: {reason}"
|
|
16872
16932
|
await self._mount_message(AppMessage(text))
|
|
@@ -17032,25 +17092,82 @@ class DeepAgentsApp(App):
|
|
|
17032
17092
|
await self._auto_accept_pending_goal_rubric()
|
|
17033
17093
|
return True
|
|
17034
17094
|
|
|
17095
|
+
async def _handle_approval_mode_command(self, target: ApprovalMode) -> None:
|
|
17096
|
+
"""Switch approval mode from a slash command (`/manual`, `/auto`, `/yolo`).
|
|
17097
|
+
|
|
17098
|
+
Mirrors the Shift+Tab switcher: Auto is refused with a sandbox, YOLO
|
|
17099
|
+
honors the `startup.yolo_switcher` policy and prompts the first-run
|
|
17100
|
+
acknowledgement modal before unrestricted mode becomes active. Feedback
|
|
17101
|
+
is delivered via toasts and the status bar, not chat messages, so the
|
|
17102
|
+
command stays quiet like the keybinding.
|
|
17103
|
+
|
|
17104
|
+
Args:
|
|
17105
|
+
target: The approval mode requested by the command.
|
|
17106
|
+
"""
|
|
17107
|
+
from deepagents_code.approval_mode import (
|
|
17108
|
+
ApprovalMode,
|
|
17109
|
+
has_yolo_acknowledgement,
|
|
17110
|
+
)
|
|
17111
|
+
from deepagents_code.config import is_yolo_switcher_enabled
|
|
17112
|
+
|
|
17113
|
+
if self._approval_mode is target:
|
|
17114
|
+
self.notify(
|
|
17115
|
+
f"Already in {target.value.capitalize()} mode.",
|
|
17116
|
+
severity="information",
|
|
17117
|
+
markup=False,
|
|
17118
|
+
)
|
|
17119
|
+
return
|
|
17120
|
+
|
|
17121
|
+
if target is ApprovalMode.AUTO and not self._auto_mode_eligible:
|
|
17122
|
+
self._warn_live_approval_mode_unavailable(
|
|
17123
|
+
"Auto is unavailable with a sandbox."
|
|
17124
|
+
)
|
|
17125
|
+
return
|
|
17126
|
+
|
|
17127
|
+
if target is ApprovalMode.YOLO:
|
|
17128
|
+
if not is_yolo_switcher_enabled():
|
|
17129
|
+
self._warn_live_approval_mode_unavailable(
|
|
17130
|
+
"YOLO is disabled in the approval switcher."
|
|
17131
|
+
)
|
|
17132
|
+
return
|
|
17133
|
+
if not has_yolo_acknowledgement():
|
|
17134
|
+
self._prompt_yolo_switcher_acknowledgement()
|
|
17135
|
+
return
|
|
17136
|
+
|
|
17137
|
+
await self._set_approval_mode(target)
|
|
17138
|
+
|
|
17035
17139
|
def _prompt_yolo_switcher_acknowledgement(self) -> None:
|
|
17036
17140
|
"""Show the first-run YOLO acknowledgement before entering unrestricted mode.
|
|
17037
17141
|
|
|
17038
17142
|
YOLO stays inactive until Enter persists the acknowledgement and the
|
|
17039
|
-
follow-up mode write succeeds. Esc (or a
|
|
17040
|
-
current mode untouched and does not
|
|
17143
|
+
follow-up mode write succeeds. `m` switches to Manual instead. Esc (or a
|
|
17144
|
+
non-acknowledge dismiss) leaves the current mode untouched and does not
|
|
17145
|
+
store the acknowledgement.
|
|
17041
17146
|
"""
|
|
17042
17147
|
from deepagents_code.approval_mode import (
|
|
17043
17148
|
ApprovalMode,
|
|
17044
17149
|
save_yolo_acknowledgement,
|
|
17045
17150
|
)
|
|
17046
|
-
from deepagents_code.tui.widgets.yolo_mode_notice import
|
|
17151
|
+
from deepagents_code.tui.widgets.yolo_mode_notice import (
|
|
17152
|
+
YoloModeNoticeResult,
|
|
17153
|
+
YoloModeNoticeScreen,
|
|
17154
|
+
)
|
|
17047
17155
|
|
|
17048
17156
|
if getattr(self, "_yolo_mode_notice_pending", False):
|
|
17049
17157
|
return
|
|
17050
17158
|
|
|
17051
|
-
def handle_result(
|
|
17159
|
+
def handle_result(result: YoloModeNoticeResult | None) -> None:
|
|
17052
17160
|
self._yolo_mode_notice_pending = False
|
|
17053
|
-
if
|
|
17161
|
+
if result is YoloModeNoticeResult.MANUAL:
|
|
17162
|
+
# Already-Manual is a no-op: skip the live store write so a
|
|
17163
|
+
# failed redundant write cannot flip `_approval_mode_blocked`
|
|
17164
|
+
# and cancel an active run after the user declined YOLO.
|
|
17165
|
+
if self._approval_mode is ApprovalMode.MANUAL:
|
|
17166
|
+
return
|
|
17167
|
+
task = asyncio.create_task(self._set_approval_mode(ApprovalMode.MANUAL))
|
|
17168
|
+
task.add_done_callback(_log_task_exception)
|
|
17169
|
+
return
|
|
17170
|
+
if result is not YoloModeNoticeResult.ACKNOWLEDGE:
|
|
17054
17171
|
self.notify(
|
|
17055
17172
|
"Stayed in the current approval mode.",
|
|
17056
17173
|
severity="information",
|
|
@@ -17139,6 +17256,13 @@ class DeepAgentsApp(App):
|
|
|
17139
17256
|
if child.has_output:
|
|
17140
17257
|
child.toggle_output()
|
|
17141
17258
|
return
|
|
17259
|
+
# Long UserMessages are collapsible. This scan is newest-first and
|
|
17260
|
+
# first-match-wins, so any later tool/skill/group row claims Ctrl+O
|
|
17261
|
+
# and the prompt is then reachable only by click. Assistant rows are
|
|
17262
|
+
# not in the chain, so they do not block it.
|
|
17263
|
+
if isinstance(child, UserMessage) and child.has_expandable_body:
|
|
17264
|
+
child.toggle_expanded()
|
|
17265
|
+
return
|
|
17142
17266
|
|
|
17143
17267
|
# Approval menu action handlers (delegated from App-level bindings)
|
|
17144
17268
|
# NOTE: These only activate when approval widget is pending
|
|
@@ -20759,6 +20883,28 @@ class DeepAgentsApp(App):
|
|
|
20759
20883
|
except ModuleNotFoundError:
|
|
20760
20884
|
logger.warning("Could not preload restart_prompt modal", exc_info=True)
|
|
20761
20885
|
|
|
20886
|
+
def _schedule_restart_offer(
|
|
20887
|
+
self, coro: Coroutine[Any, Any, None], *, context: str
|
|
20888
|
+
) -> None:
|
|
20889
|
+
"""Run a post-install restart offer as a detached background task.
|
|
20890
|
+
|
|
20891
|
+
The `/install` slash command reaches the restart offer through the App's
|
|
20892
|
+
`on_chat_input_submitted` handler, which is awaited inline on the App
|
|
20893
|
+
message pump. Awaiting the restart modal there blocks the pump, so the
|
|
20894
|
+
modal never receives the Enter/Esc key events it needs to resolve and
|
|
20895
|
+
appears frozen. Detaching the offer onto its own task lets the command
|
|
20896
|
+
handler return and frees the pump to route keys to the modal — the same
|
|
20897
|
+
reason the post-`/auth` web-search offer is scheduled rather than
|
|
20898
|
+
awaited (see `_launch_web_search_restart_prompt`).
|
|
20899
|
+
|
|
20900
|
+
Args:
|
|
20901
|
+
coro: The restart-offer coroutine to run off the message pump.
|
|
20902
|
+
context: Short description used if the task is logged on failure.
|
|
20903
|
+
"""
|
|
20904
|
+
task = asyncio.create_task(coro, name=f"restart-offer:{context}")
|
|
20905
|
+
self._track_server_restart_task(task)
|
|
20906
|
+
task.add_done_callback(_log_task_exception)
|
|
20907
|
+
|
|
20762
20908
|
async def _offer_restart_after_install(self, label: str) -> None:
|
|
20763
20909
|
"""Offer a one-keypress restart after a restart-capable install.
|
|
20764
20910
|
|
|
@@ -22263,7 +22409,7 @@ class DeepAgentsApp(App):
|
|
|
22263
22409
|
(e.g., `'anthropic:claude-sonnet-4-5'`) or just the model name
|
|
22264
22410
|
for auto-detection.
|
|
22265
22411
|
extra_kwargs: Extra constructor kwargs from `--model-params`.
|
|
22266
|
-
announce_unchanged: Whether to
|
|
22412
|
+
announce_unchanged: Whether to toast a notice when the requested
|
|
22267
22413
|
model is already active.
|
|
22268
22414
|
persist: Whether to write the model to the user's recent/default
|
|
22269
22415
|
config.
|
|
@@ -22390,9 +22536,21 @@ class DeepAgentsApp(App):
|
|
|
22390
22536
|
params_suffix = _format_model_params(extra_kwargs)
|
|
22391
22537
|
if announce_unchanged:
|
|
22392
22538
|
message = f"Already using {current}{params_suffix}"
|
|
22393
|
-
|
|
22394
|
-
|
|
22395
|
-
|
|
22539
|
+
# Suppress only while the previous identical toast is
|
|
22540
|
+
# presumed still on-screen. Once it expires, a later
|
|
22541
|
+
# intentional no-op selection must be able to toast again.
|
|
22542
|
+
now = _monotonic()
|
|
22543
|
+
last = self._last_model_unchanged
|
|
22544
|
+
if (
|
|
22545
|
+
last is None
|
|
22546
|
+
or last[0] != message
|
|
22547
|
+
or (now - last[1]) >= self.NOTIFICATION_TIMEOUT
|
|
22548
|
+
):
|
|
22549
|
+
# A no-op re-selection is transient feedback, not part
|
|
22550
|
+
# of the conversation, so surface it as a toast rather
|
|
22551
|
+
# than an inline chat message.
|
|
22552
|
+
self.notify(message, markup=False)
|
|
22553
|
+
self._last_model_unchanged = (message, now)
|
|
22396
22554
|
logger.info(
|
|
22397
22555
|
"Model unchanged (%s); model_params=%s",
|
|
22398
22556
|
current,
|
|
@@ -22444,7 +22602,7 @@ class DeepAgentsApp(App):
|
|
|
22444
22602
|
|
|
22445
22603
|
self._sync_status_model()
|
|
22446
22604
|
|
|
22447
|
-
self.
|
|
22605
|
+
self._last_model_unchanged = None
|
|
22448
22606
|
params_suffix = _format_model_params(extra_kwargs)
|
|
22449
22607
|
if not persist:
|
|
22450
22608
|
# Session-only switch (e.g. adopting a resumed thread's model):
|
|
@@ -506,9 +506,10 @@ def classifier_unavailable_reason(exc: BaseException, *, timeout_seconds: float)
|
|
|
506
506
|
|
|
507
507
|
Provider exception text stays out of the reason (it can carry secrets or
|
|
508
508
|
noisy HTML). Only real local deadline expiry
|
|
509
|
-
(`_ClassifierDeadlineExceededError`)
|
|
510
|
-
bare provider `TimeoutError` stays
|
|
511
|
-
deadline fired when the model failed
|
|
509
|
+
(`_ClassifierDeadlineExceededError`) says the classifier did not respond
|
|
510
|
+
within the configured wait budget; a bare provider `TimeoutError` stays
|
|
511
|
+
type-only so we do not claim dcode's deadline fired when the model failed
|
|
512
|
+
first.
|
|
512
513
|
|
|
513
514
|
Args:
|
|
514
515
|
exc: Failure raised while invoking or validating the classifier.
|
|
@@ -518,7 +519,7 @@ def classifier_unavailable_reason(exc: BaseException, *, timeout_seconds: float)
|
|
|
518
519
|
Compact single-line reason for tool messages and TUI events.
|
|
519
520
|
"""
|
|
520
521
|
if isinstance(exc, _ClassifierDeadlineExceededError):
|
|
521
|
-
return f"
|
|
522
|
+
return f"classifier did not respond within {timeout_seconds:g}s"
|
|
522
523
|
return f"failed ({type(exc).__name__})"
|
|
523
524
|
|
|
524
525
|
|