deepagents-code 0.1.46__tar.gz → 0.1.48__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.46 → deepagents_code-0.1.48}/CHANGELOG.md +20 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/PKG-INFO +4 -4
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_build_info.py +1 -1
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_env_vars.py +11 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/agent.py +43 -25
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/app.py +137 -67
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/approval_mode.py +40 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/auto_mode.py +5 -8
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/config.py +31 -24
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/config_manifest.py +13 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/extras_info.py +82 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/capabilities.py +34 -1
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/env.py +4 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/legacy.py +2 -1
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/loading.py +5 -3
- deepagents_code-0.1.48/deepagents_code/hooks/migration.py +190 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/models/config.py +21 -1
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/models/domain.py +42 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/models/wire.py +31 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/projection.py +33 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/reducer.py +31 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/runner.py +94 -13
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/snapshot.py +5 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/main.py +17 -33
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/offload.py +2 -2
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/store.py +5 -1
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/__init__.py +28 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/agent_selector.py +5 -4
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/model_selector.py +4 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/restart_prompt.py +1 -1
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/startup_tip.py +47 -7
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/welcome.py +4 -4
- deepagents_code-0.1.48/deepagents_code/tui/widgets/yolo_mode_notice.py +161 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/update_check.py +24 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/pyproject.toml +3 -3
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/scripts/install.sh +7 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/hooks/models/test_models.py +17 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/hooks/test_configuration.py +157 -4
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/hooks/test_engine.py +234 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/hooks/test_execution.py +180 -24
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_agent.py +73 -28
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_app.py +337 -1
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_approval_mode.py +33 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_auto_mode.py +19 -29
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_config.py +25 -1
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_config_manifest.py +68 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_extras_info.py +49 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_install_script.py +9 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_model_config.py +20 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_reasoning_effort.py +6 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_reload.py +10 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_server_helpers.py +3 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_update_check.py +46 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +92 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_model_selector.py +16 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_startup_tip.py +47 -6
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_welcome.py +14 -14
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/uv.lock +15 -15
- deepagents_code-0.1.46/deepagents_code/hooks/migration.py +0 -90
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/.gitignore +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/AGENTS.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/ARCHITECTURE.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/COMMANDS.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/DEVELOPMENT.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/Makefile +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/README.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/THREAT_MODEL.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_debug_buffer.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_fake_models.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_paths.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_repository_bounds.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_server_config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_tool_stream.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/commands/auth.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/commands/config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/commands/mcp.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/commands/tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/launch/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/launch/server.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/launch/server_manager.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/non_interactive.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/remote_client.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/command_registry.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/configurable_model.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/doctor.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/goal_rubric.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/goal_state_notice.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/goal_tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/engine.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/models/adapters.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/models/transport.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/runtime.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/transcript.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/integrations/sandbox_factory.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/json_types.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/managed_tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_auth.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/model_config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/offload_middleware.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/paste_collapse.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/_json.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/adapters/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/adapters/mcp.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/adapters/skills.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/commands_cli.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/discovery.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/manifest.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/marketplace.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/models.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/substitution.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/reasoning_effort.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/reliable_rubric.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/server_graph.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/sessions.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/skills/merge.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/skills/trust.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/system_prompt.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/todo_list_prompt.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tool_catalog.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/screens/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/textual_adapter.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/_links.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/approval.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/ask_user.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/auth.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/chat_input.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/codex_auth.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/debug_console.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/diff.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/effort_selector.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/goal_review.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/goal_status.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/history.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/install_confirm.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/loading.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/message_store.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/messages.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/plugin_reload.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/skill_trust.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/status.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/thread_selector.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/update_available.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/update_confirm.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/ui.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/hatch_build.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/images/tui.png +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/README.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/test_auto_approve_remote.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/test_offload_server_side.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/client/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/client/commands/test_auth.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/client/commands/test_mcp.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/client/commands/test_tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/conftest.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/hooks/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/hooks/test_transcript.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/plugins/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/plugins/test_marketplace.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/plugins/test_store.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_merge.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_skill_trust.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/smoke_tests/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/smoke_tests/conftest.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test__tool_stream.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_args.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_config_recursion_limit.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_cursor_blink.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_cursor_style.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_debug_buffer.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_debug_console.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_doctor.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_criteria_client.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_rubric.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_state_notice.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_state_persistence.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_hatch_build.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_install_command.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_json_types.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_main.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_managed_tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_paths.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_reliable_rubric.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_repository_bounds.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_rubric_cli.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_sandbox_registry.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_server.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_startup_blocking.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_threads_resume.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_tool_catalog.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_tracing_replicas.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_transcript_virtualization.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_history.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_links.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_plugin_reload.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_status.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
|
@@ -2,6 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.1.48](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.47...deepagents-code==0.1.48) (2026-07-27)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- Added Fireworks `kimi-k3`, GLM-5.2-Fast, and Kimi-K3 to model selection and recommended models. ([#5082](https://github.com/langchain-ai/deepagents/issues/5082), [#5072](https://github.com/langchain-ai/deepagents/issues/5072))
|
|
10
|
+
- Migrated legacy hooks to v2 events. ([#4971](https://github.com/langchain-ai/deepagents/issues/4971))
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
- Require an `AGENTS.md` marker for `/agent` discovery, resolving unintended discovery behavior. ([#5076](https://github.com/langchain-ai/deepagents/issues/5076), closes [#4991](https://github.com/langchain-ai/deepagents/issues/4991))
|
|
15
|
+
- Removed the redundant `/restart` hint from the restart prompt. ([#5083](https://github.com/langchain-ai/deepagents/issues/5083))
|
|
16
|
+
- Removed the caret flash in plugin type-to-search. ([#5078](https://github.com/langchain-ai/deepagents/issues/5078))
|
|
17
|
+
|
|
18
|
+
## [0.1.47](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.46...deepagents-code==0.1.47) (2026-07-24)
|
|
19
|
+
|
|
20
|
+
### Features
|
|
21
|
+
|
|
22
|
+
- Added `yolo` mode to the `Shift+Tab` approval cycle ([#5035](https://github.com/langchain-ai/deepagents/issues/5035)).
|
|
23
|
+
- Show the changelog link before prompting to update via the install script ([#5034](https://github.com/langchain-ai/deepagents/issues/5034)).
|
|
24
|
+
|
|
5
25
|
## [0.1.46](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.45...deepagents-code==0.1.46) (2026-07-24)
|
|
6
26
|
|
|
7
27
|
### Highlights
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.48
|
|
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/
|
|
@@ -31,7 +31,7 @@ Requires-Dist: deepagents-acp<1.0.0,>=0.0.9
|
|
|
31
31
|
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
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.
|
|
34
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.2
|
|
35
35
|
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1
|
|
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
|
|
@@ -63,7 +63,7 @@ Provides-Extra: agentcore
|
|
|
63
63
|
Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.5; extra == 'agentcore'
|
|
64
64
|
Provides-Extra: all-providers
|
|
65
65
|
Requires-Dist: aiohttp<3.15.0,>=3.14.3; extra == 'all-providers'
|
|
66
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.
|
|
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
68
|
Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'all-providers'
|
|
69
69
|
Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
|
|
@@ -91,7 +91,7 @@ Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
|
|
|
91
91
|
Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
|
|
92
92
|
Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
|
|
93
93
|
Provides-Extra: anthropic
|
|
94
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.
|
|
94
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.2; extra == 'anthropic'
|
|
95
95
|
Provides-Extra: baseten
|
|
96
96
|
Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'baseten'
|
|
97
97
|
Provides-Extra: bedrock
|
|
@@ -401,6 +401,17 @@ THEME = "DEEPAGENTS_CODE_THEME"
|
|
|
401
401
|
USER_ID = "DEEPAGENTS_CODE_USER_ID"
|
|
402
402
|
"""Attach a user identifier to LangSmith trace metadata."""
|
|
403
403
|
|
|
404
|
+
YOLO_SWITCHER = "DEEPAGENTS_CODE_YOLO_SWITCHER"
|
|
405
|
+
"""Include YOLO in the Shift+Tab approval-mode cycle.
|
|
406
|
+
|
|
407
|
+
Enabled by default so an interactive session can cycle Manual → Auto → YOLO
|
|
408
|
+
without restarting with `--yolo`. Set to a falsy value (`0`, `false`, `no`,
|
|
409
|
+
`off`, or empty) to leave Shift+Tab limited to Manual/Auto. Also settable via
|
|
410
|
+
`[startup].yolo_switcher` in config.toml so orgs can distribute the opt-out.
|
|
411
|
+
Parsed by `classify_env_bool` through the config resolver (unrecognized values
|
|
412
|
+
fall through rather than forcing the default).
|
|
413
|
+
"""
|
|
414
|
+
|
|
404
415
|
_TRUTHY_VALUES = frozenset({"1", "true", "yes", "on"})
|
|
405
416
|
_FALSY_VALUES = frozenset({"0", "false", "no", "off", ""})
|
|
406
417
|
|
|
@@ -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.48" # 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."""
|
|
@@ -1107,12 +1107,25 @@ def load_async_subagents(config_path: Path | None = None) -> list[AsyncSubAgent]
|
|
|
1107
1107
|
return agents
|
|
1108
1108
|
|
|
1109
1109
|
|
|
1110
|
+
_AGENT_DIR_MARKER = "AGENTS.md"
|
|
1111
|
+
"""Filename that marks a `~/.deepagents/<name>/` directory as an agent profile.
|
|
1112
|
+
|
|
1113
|
+
Discovery is fail-closed: only directories containing this marker are listed by
|
|
1114
|
+
the `/agent` picker. Real agents always create it (empty on first use when
|
|
1115
|
+
memory is enabled), so empty folders stay out of the picker without being
|
|
1116
|
+
named. Known app-owned directory names are still denylisted so a forced
|
|
1117
|
+
invocation such as `dcode -a plugins` cannot stamp the marker into app state
|
|
1118
|
+
and surface that directory as a selectable agent.
|
|
1119
|
+
"""
|
|
1120
|
+
|
|
1121
|
+
|
|
1110
1122
|
@functools.lru_cache(maxsize=1)
|
|
1111
1123
|
def _reserved_agent_dir_names() -> frozenset[str]:
|
|
1112
1124
|
"""Return non-agent directory names reserved by the app under `~/.deepagents/`.
|
|
1113
1125
|
|
|
1114
1126
|
These directories are created by the app for its own use and must never
|
|
1115
|
-
appear in the agent picker
|
|
1127
|
+
appear in the agent picker — even if they contain an `AGENTS.md` file
|
|
1128
|
+
(e.g. after `dcode -a plugins` stamps the marker via memory setup):
|
|
1116
1129
|
|
|
1117
1130
|
- `bin/` holds the managed `rg` binary (`managed_tools.BIN_DIR`).
|
|
1118
1131
|
- `plugins/` holds installed plugin state (`plugins.store`).
|
|
@@ -1134,28 +1147,38 @@ def _reserved_agent_dir_names() -> frozenset[str]:
|
|
|
1134
1147
|
def _is_agent_dir_entry(entry: Path) -> bool:
|
|
1135
1148
|
"""Return whether a `~/.deepagents/` entry should be listed as an agent.
|
|
1136
1149
|
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1150
|
+
Fail-closed on the `AGENTS.md` marker: a directory is an agent only when
|
|
1151
|
+
that file exists as a regular (non-symlink) file inside it.
|
|
1152
|
+
|
|
1153
|
+
Also rejects:
|
|
1141
1154
|
|
|
1142
|
-
|
|
1143
|
-
|
|
1155
|
+
- Dot-prefixed names (hidden dirs such as `.state/`)
|
|
1156
|
+
- Reserved app-owned names (`bin/`, `plugins/`, `conversation_history/`),
|
|
1157
|
+
even if they contain the marker
|
|
1158
|
+
- Symlinked directories (including dangling links)
|
|
1159
|
+
- Non-directories
|
|
1160
|
+
|
|
1161
|
+
`OSError` from `is_dir`/`is_symlink`/`is_file` propagates so callers can
|
|
1162
|
+
log with the failing entry's name as context.
|
|
1144
1163
|
"""
|
|
1145
1164
|
if entry.name.startswith(".") or entry.name in _reserved_agent_dir_names():
|
|
1146
1165
|
return False
|
|
1147
|
-
|
|
1166
|
+
if entry.is_symlink() or not entry.is_dir():
|
|
1167
|
+
return False
|
|
1168
|
+
marker = entry / _AGENT_DIR_MARKER
|
|
1169
|
+
# `is_file()` is True for a symlink-to-file; reject those so a dangling or
|
|
1170
|
+
# external link cannot mint an agent entry.
|
|
1171
|
+
return marker.is_file() and not marker.is_symlink()
|
|
1148
1172
|
|
|
1149
1173
|
|
|
1150
1174
|
def get_available_agent_names() -> list[str]:
|
|
1151
1175
|
"""Return a sorted list of available agent names from `~/.deepagents/`.
|
|
1152
1176
|
|
|
1153
1177
|
Scans the user's `.deepagents` directory and returns each real
|
|
1154
|
-
subdirectory
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
agent.
|
|
1178
|
+
subdirectory that contains the `AGENTS.md` agent marker and is not an
|
|
1179
|
+
app-reserved name. Fail-closed: bare directories, reserved app state
|
|
1180
|
+
(`bin/`, `plugins/`, `conversation_history/`), symlinks, and hidden
|
|
1181
|
+
entries are not agents.
|
|
1159
1182
|
|
|
1160
1183
|
Filesystem errors (missing parent, permission denied, broken entries) are
|
|
1161
1184
|
logged and surfaced as an empty list rather than raised — the caller shows
|
|
@@ -1222,7 +1245,9 @@ def list_agents(*, output_format: OutputFormat = "text") -> None:
|
|
|
1222
1245
|
{
|
|
1223
1246
|
"name": name,
|
|
1224
1247
|
"path": str(agent_path),
|
|
1225
|
-
|
|
1248
|
+
# Always True for names from `get_available_agent_names`
|
|
1249
|
+
# (fail-closed marker). Kept for JSON schema stability.
|
|
1250
|
+
"has_agents_md": (agent_path / _AGENT_DIR_MARKER).is_file(),
|
|
1226
1251
|
"is_default": name == DEFAULT_AGENT_NAME,
|
|
1227
1252
|
}
|
|
1228
1253
|
)
|
|
@@ -1240,17 +1265,10 @@ def list_agents(*, output_format: OutputFormat = "text") -> None:
|
|
|
1240
1265
|
is_default = name == DEFAULT_AGENT_NAME
|
|
1241
1266
|
default_label = " [dim](default)[/dim]" if is_default else ""
|
|
1242
1267
|
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
)
|
|
1248
|
-
else:
|
|
1249
|
-
console.print(
|
|
1250
|
-
f" {bullet} [bold]{agent_name}[/bold]{default_label}"
|
|
1251
|
-
" [dim](incomplete)[/dim]",
|
|
1252
|
-
style=theme.WARNING,
|
|
1253
|
-
)
|
|
1268
|
+
console.print(
|
|
1269
|
+
f" {bullet} [bold]{agent_name}[/bold]{default_label}",
|
|
1270
|
+
style=theme.PRIMARY,
|
|
1271
|
+
)
|
|
1254
1272
|
console.print(
|
|
1255
1273
|
f" {escape_markup(str(agent_path))}",
|
|
1256
1274
|
style=theme.MUTED,
|
|
@@ -3105,6 +3105,7 @@ class DeepAgentsApp(App):
|
|
|
3105
3105
|
self._auto_approve = False
|
|
3106
3106
|
self._approval_mode_blocked = False
|
|
3107
3107
|
self._auto_mode_notice_pending = False
|
|
3108
|
+
self._yolo_mode_notice_pending = False
|
|
3108
3109
|
|
|
3109
3110
|
if sub_title is None and self._sandbox_type is not None:
|
|
3110
3111
|
display = _SANDBOX_DISPLAY_NAMES.get(
|
|
@@ -5051,37 +5052,20 @@ class DeepAgentsApp(App):
|
|
|
5051
5052
|
and self._server_kwargs is not None
|
|
5052
5053
|
):
|
|
5053
5054
|
missing = self._server_startup_missing_provider_package
|
|
5054
|
-
from deepagents_code.extras_info import
|
|
5055
|
+
from deepagents_code.extras_info import resolve_install_hint
|
|
5055
5056
|
|
|
5056
|
-
|
|
5057
|
-
if extra is not None:
|
|
5057
|
+
hint = resolve_install_hint(missing.package)
|
|
5058
|
+
if hint.extra is not None:
|
|
5058
5059
|
text += (
|
|
5059
|
-
f"\n\nHint: install the package with `/install {extra}`, "
|
|
5060
|
+
f"\n\nHint: install the package with `/install {hint.extra}`, "
|
|
5060
5061
|
f"then run `/model {missing.provider}:<model>` to retry. "
|
|
5061
5062
|
"Or pick a different provider with `/model`."
|
|
5062
5063
|
)
|
|
5063
5064
|
else:
|
|
5064
|
-
|
|
5065
|
-
|
|
5066
|
-
ToolRequirementIntrospectionError,
|
|
5067
|
-
install_package_command,
|
|
5068
|
-
)
|
|
5069
|
-
|
|
5070
|
-
try:
|
|
5071
|
-
install_cmd = install_package_command(missing.package)
|
|
5072
|
-
except (
|
|
5073
|
-
ValueError,
|
|
5074
|
-
ExtrasIntrospectionError,
|
|
5075
|
-
ToolRequirementIntrospectionError,
|
|
5076
|
-
) as exc:
|
|
5077
|
-
logger.debug(
|
|
5078
|
-
"install_package_command failed; falling back to "
|
|
5079
|
-
"manual hint: %s",
|
|
5080
|
-
exc,
|
|
5081
|
-
)
|
|
5082
|
-
install_hint = f"install the `{missing.package}` package manually"
|
|
5065
|
+
if hint.command is not None:
|
|
5066
|
+
install_hint = f"run `{hint.command}`"
|
|
5083
5067
|
else:
|
|
5084
|
-
install_hint = f"
|
|
5068
|
+
install_hint = f"install the `{missing.package}` package manually"
|
|
5085
5069
|
text += (
|
|
5086
5070
|
f"\n\nHint: {install_hint}, then run "
|
|
5087
5071
|
f"`/model {missing.provider}:<model>` "
|
|
@@ -6033,9 +6017,9 @@ class DeepAgentsApp(App):
|
|
|
6033
6017
|
create_update_log_path,
|
|
6034
6018
|
editable_extra_hint,
|
|
6035
6019
|
install_extra_command,
|
|
6036
|
-
install_extra_recovery_command,
|
|
6037
6020
|
is_valid_extra_name,
|
|
6038
6021
|
perform_install_extra,
|
|
6022
|
+
safe_install_extra_recovery_command,
|
|
6039
6023
|
)
|
|
6040
6024
|
except ImportError as exc:
|
|
6041
6025
|
logger.warning("/install command import failed", exc_info=True)
|
|
@@ -6120,19 +6104,9 @@ class DeepAgentsApp(App):
|
|
|
6120
6104
|
# already bound above so the hint is never empty. `manual_cmd` is
|
|
6121
6105
|
# rendered into a Textual `Content` (literal, not Rich markup), so no
|
|
6122
6106
|
# bracket escaping is needed here.
|
|
6123
|
-
|
|
6124
|
-
|
|
6125
|
-
|
|
6126
|
-
)
|
|
6127
|
-
except (
|
|
6128
|
-
ExtrasIntrospectionError,
|
|
6129
|
-
ToolRequirementIntrospectionError,
|
|
6130
|
-
ValueError,
|
|
6131
|
-
):
|
|
6132
|
-
logger.warning(
|
|
6133
|
-
"/install recovery command failed (install raised)",
|
|
6134
|
-
exc_info=True,
|
|
6135
|
-
)
|
|
6107
|
+
manual_cmd = await asyncio.to_thread(
|
|
6108
|
+
safe_install_extra_recovery_command, extra, fallback=manual_cmd
|
|
6109
|
+
)
|
|
6136
6110
|
await self._mount_message(
|
|
6137
6111
|
ErrorMessage(
|
|
6138
6112
|
f"Install failed: {type(exc).__name__}: {exc}\n"
|
|
@@ -6148,19 +6122,9 @@ class DeepAgentsApp(App):
|
|
|
6148
6122
|
detail = f": {output[-200:]}" if output else ""
|
|
6149
6123
|
# See the OSError branch above: best-effort recovery command, falling
|
|
6150
6124
|
# back to the already-bound install-script command on failure.
|
|
6151
|
-
|
|
6152
|
-
|
|
6153
|
-
|
|
6154
|
-
)
|
|
6155
|
-
except (
|
|
6156
|
-
ExtrasIntrospectionError,
|
|
6157
|
-
ToolRequirementIntrospectionError,
|
|
6158
|
-
ValueError,
|
|
6159
|
-
):
|
|
6160
|
-
logger.warning(
|
|
6161
|
-
"/install recovery command failed (install reported failure)",
|
|
6162
|
-
exc_info=True,
|
|
6163
|
-
)
|
|
6125
|
+
manual_cmd = await asyncio.to_thread(
|
|
6126
|
+
safe_install_extra_recovery_command, extra, fallback=manual_cmd
|
|
6127
|
+
)
|
|
6164
6128
|
await self._mount_message(
|
|
6165
6129
|
ErrorMessage(
|
|
6166
6130
|
f"Install failed{detail}\n"
|
|
@@ -16900,7 +16864,9 @@ class DeepAgentsApp(App):
|
|
|
16900
16864
|
elif kind == "denial":
|
|
16901
16865
|
text = f"Auto denied [{event.get('category', 'policy')}]: {reason}"
|
|
16902
16866
|
elif kind == "unavailable":
|
|
16903
|
-
|
|
16867
|
+
# Reason is a short cause fragment from the server; keep the UI
|
|
16868
|
+
# line outcome-focused so the blocked action is obvious.
|
|
16869
|
+
text = f"Auto classifier unavailable: {reason} (action blocked)"
|
|
16904
16870
|
else:
|
|
16905
16871
|
text = f"Auto warning: {reason}"
|
|
16906
16872
|
await self._mount_message(AppMessage(text))
|
|
@@ -16912,10 +16878,12 @@ class DeepAgentsApp(App):
|
|
|
16912
16878
|
panel.toggle()
|
|
16913
16879
|
|
|
16914
16880
|
async def action_toggle_auto_approve(self) -> None:
|
|
16915
|
-
"""
|
|
16881
|
+
"""Cycle Manual → Auto → YOLO (when enabled) after Store acknowledgement.
|
|
16916
16882
|
|
|
16917
|
-
|
|
16918
|
-
|
|
16883
|
+
YOLO is included by default (`startup.yolo_switcher` / env). Auto is
|
|
16884
|
+
skipped when a sandbox makes classifier-backed Auto ineligible. The
|
|
16885
|
+
first Shift+Tab into YOLO prompts for the same install-local
|
|
16886
|
+
acknowledgement used by `--yolo` before unrestricted mode becomes active.
|
|
16919
16887
|
"""
|
|
16920
16888
|
from deepagents_code.tui.modals.plugin_manager import PluginManagerScreen
|
|
16921
16889
|
from deepagents_code.tui.widgets.agent_selector import AgentSelectorScreen
|
|
@@ -16969,17 +16937,47 @@ class DeepAgentsApp(App):
|
|
|
16969
16937
|
if self._pending_ask_user_widget is not None:
|
|
16970
16938
|
self._pending_ask_user_widget.action_previous_question()
|
|
16971
16939
|
return
|
|
16972
|
-
from deepagents_code.approval_mode import
|
|
16940
|
+
from deepagents_code.approval_mode import (
|
|
16941
|
+
ApprovalMode,
|
|
16942
|
+
has_yolo_acknowledgement,
|
|
16943
|
+
next_approval_mode,
|
|
16944
|
+
)
|
|
16945
|
+
from deepagents_code.config import is_yolo_switcher_enabled
|
|
16973
16946
|
|
|
16974
|
-
|
|
16975
|
-
|
|
16976
|
-
|
|
16977
|
-
|
|
16978
|
-
|
|
16979
|
-
|
|
16980
|
-
|
|
16981
|
-
|
|
16982
|
-
|
|
16947
|
+
yolo_switcher_enabled = is_yolo_switcher_enabled()
|
|
16948
|
+
target = next_approval_mode(
|
|
16949
|
+
self._approval_mode,
|
|
16950
|
+
auto_eligible=self._auto_mode_eligible,
|
|
16951
|
+
yolo_switcher_enabled=yolo_switcher_enabled,
|
|
16952
|
+
)
|
|
16953
|
+
if target is None:
|
|
16954
|
+
# `next_approval_mode` returns None only from Manual when neither
|
|
16955
|
+
# Auto (sandbox-ineligible) nor the YOLO switcher entry is available,
|
|
16956
|
+
# so this is the only reachable case.
|
|
16957
|
+
self._warn_live_approval_mode_unavailable(
|
|
16958
|
+
"Auto is unavailable with a sandbox, and YOLO is disabled "
|
|
16959
|
+
"in the approval switcher."
|
|
16960
|
+
)
|
|
16961
|
+
return
|
|
16962
|
+
|
|
16963
|
+
# Gate the first YOLO switcher entry on the same policy acknowledgement
|
|
16964
|
+
# as `--yolo`. Do not activate YOLO until the user continues.
|
|
16965
|
+
if target is ApprovalMode.YOLO and not has_yolo_acknowledgement():
|
|
16966
|
+
self._prompt_yolo_switcher_acknowledgement()
|
|
16967
|
+
return
|
|
16968
|
+
|
|
16969
|
+
await self._set_approval_mode(target)
|
|
16970
|
+
|
|
16971
|
+
async def _set_approval_mode(self, target: ApprovalMode) -> bool:
|
|
16972
|
+
"""Apply an approval-mode change after optional live Store acknowledgement.
|
|
16973
|
+
|
|
16974
|
+
Args:
|
|
16975
|
+
target: Mode to select.
|
|
16976
|
+
|
|
16977
|
+
Returns:
|
|
16978
|
+
`True` when local UI state was updated to `target`.
|
|
16979
|
+
"""
|
|
16980
|
+
from deepagents_code.approval_mode import ApprovalMode
|
|
16983
16981
|
|
|
16984
16982
|
# With no usable agent/session pair there is no running graph to update.
|
|
16985
16983
|
# Stage the selection locally; `execute_task_textual` persists it before
|
|
@@ -16993,7 +16991,12 @@ class DeepAgentsApp(App):
|
|
|
16993
16991
|
self._warn_live_approval_mode_unavailable(
|
|
16994
16992
|
"Auto could not be persisted; remaining in Manual."
|
|
16995
16993
|
)
|
|
16996
|
-
return
|
|
16994
|
+
return False
|
|
16995
|
+
if target is ApprovalMode.YOLO:
|
|
16996
|
+
self._warn_live_approval_mode_unavailable(
|
|
16997
|
+
"YOLO could not be persisted; remaining in the previous mode."
|
|
16998
|
+
)
|
|
16999
|
+
return False
|
|
16997
17000
|
self._approval_mode_blocked = True
|
|
16998
17001
|
self._warn_live_approval_mode_unavailable(
|
|
16999
17002
|
"Manual could not be persisted; active work was cancelled and "
|
|
@@ -17001,7 +17004,7 @@ class DeepAgentsApp(App):
|
|
|
17001
17004
|
)
|
|
17002
17005
|
if self._agent_running:
|
|
17003
17006
|
self._force_interrupt_active_work()
|
|
17004
|
-
return
|
|
17007
|
+
return False
|
|
17005
17008
|
|
|
17006
17009
|
self._approval_mode_blocked = False
|
|
17007
17010
|
self._approval_mode = target
|
|
@@ -17014,6 +17017,73 @@ class DeepAgentsApp(App):
|
|
|
17014
17017
|
self._notify_auto_mode_enabled_once()
|
|
17015
17018
|
if should_persist_live:
|
|
17016
17019
|
await self._auto_accept_pending_goal_rubric()
|
|
17020
|
+
elif target is ApprovalMode.YOLO:
|
|
17021
|
+
# Warn before the await below. State is already committed above, so
|
|
17022
|
+
# if goal-rubric auto-accept raises, YOLO is active and the "no
|
|
17023
|
+
# review" warning must have fired first. AUTO notifies before its
|
|
17024
|
+
# await for the same reason.
|
|
17025
|
+
self.notify(
|
|
17026
|
+
"YOLO is active: gated actions run without review.",
|
|
17027
|
+
severity="warning",
|
|
17028
|
+
timeout=8,
|
|
17029
|
+
markup=False,
|
|
17030
|
+
)
|
|
17031
|
+
if should_persist_live:
|
|
17032
|
+
await self._auto_accept_pending_goal_rubric()
|
|
17033
|
+
return True
|
|
17034
|
+
|
|
17035
|
+
def _prompt_yolo_switcher_acknowledgement(self) -> None:
|
|
17036
|
+
"""Show the first-run YOLO acknowledgement before entering unrestricted mode.
|
|
17037
|
+
|
|
17038
|
+
YOLO stays inactive until Enter persists the acknowledgement and the
|
|
17039
|
+
follow-up mode write succeeds. Esc (or a non-true dismiss) leaves the
|
|
17040
|
+
current mode untouched and does not store the acknowledgement.
|
|
17041
|
+
"""
|
|
17042
|
+
from deepagents_code.approval_mode import (
|
|
17043
|
+
ApprovalMode,
|
|
17044
|
+
save_yolo_acknowledgement,
|
|
17045
|
+
)
|
|
17046
|
+
from deepagents_code.tui.widgets.yolo_mode_notice import YoloModeNoticeScreen
|
|
17047
|
+
|
|
17048
|
+
if getattr(self, "_yolo_mode_notice_pending", False):
|
|
17049
|
+
return
|
|
17050
|
+
|
|
17051
|
+
def handle_result(accepted: bool | None) -> None:
|
|
17052
|
+
self._yolo_mode_notice_pending = False
|
|
17053
|
+
if accepted is not True:
|
|
17054
|
+
self.notify(
|
|
17055
|
+
"Stayed in the current approval mode.",
|
|
17056
|
+
severity="information",
|
|
17057
|
+
markup=False,
|
|
17058
|
+
)
|
|
17059
|
+
return
|
|
17060
|
+
if not save_yolo_acknowledgement():
|
|
17061
|
+
self._warn_live_approval_mode_unavailable(
|
|
17062
|
+
"YOLO acknowledgement could not be saved; staying in the "
|
|
17063
|
+
"current mode."
|
|
17064
|
+
)
|
|
17065
|
+
return
|
|
17066
|
+
task = asyncio.create_task(self._set_approval_mode(ApprovalMode.YOLO))
|
|
17067
|
+
task.add_done_callback(_log_task_exception)
|
|
17068
|
+
|
|
17069
|
+
try:
|
|
17070
|
+
self.push_screen(YoloModeNoticeScreen(), handle_result)
|
|
17071
|
+
except Exception:
|
|
17072
|
+
# This modal *is* the YOLO gate (unlike Auto's post-hoc notice), so
|
|
17073
|
+
# a failed push leaves the mode unchanged. Surface it, or Shift+Tab
|
|
17074
|
+
# looks dead. Leaving `_yolo_mode_notice_pending` unset (it is set
|
|
17075
|
+
# only below, after a successful push) lets a later Shift+Tab retry.
|
|
17076
|
+
logger.warning(
|
|
17077
|
+
"Could not show YOLO switcher acknowledgement", exc_info=True
|
|
17078
|
+
)
|
|
17079
|
+
self._warn_live_approval_mode_unavailable(
|
|
17080
|
+
"Could not open the YOLO confirmation; approval mode unchanged."
|
|
17081
|
+
)
|
|
17082
|
+
return
|
|
17083
|
+
|
|
17084
|
+
# Mark pending only after the push succeeds so a failed push cannot
|
|
17085
|
+
# suppress a later try for the whole session.
|
|
17086
|
+
self._yolo_mode_notice_pending = True
|
|
17017
17087
|
|
|
17018
17088
|
def action_toggle_tool_output(self) -> None:
|
|
17019
17089
|
"""Toggle the most recent collapsible transcript unit."""
|
|
@@ -63,6 +63,46 @@ def coerce_approval_mode(value: object) -> ApprovalMode:
|
|
|
63
63
|
return ApprovalMode.MANUAL
|
|
64
64
|
|
|
65
65
|
|
|
66
|
+
def next_approval_mode(
|
|
67
|
+
current: ApprovalMode | str | object,
|
|
68
|
+
*,
|
|
69
|
+
auto_eligible: bool,
|
|
70
|
+
yolo_switcher_enabled: bool,
|
|
71
|
+
) -> ApprovalMode | None:
|
|
72
|
+
"""Return the next Shift+Tab approval mode for the active session.
|
|
73
|
+
|
|
74
|
+
The cycle is Manual → Auto → YOLO → Manual when both Auto and the YOLO
|
|
75
|
+
switcher entry are available. Auto is omitted when `auto_eligible` is false
|
|
76
|
+
(for example a remote sandbox). YOLO is omitted when orgs/users disable
|
|
77
|
+
`startup.yolo_switcher`. Launching with `--yolo` still leaves unrestricted
|
|
78
|
+
mode when the switcher entry is disabled; Shift+Tab only exits YOLO then.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
current: Active approval mode (mode enum or raw value).
|
|
82
|
+
auto_eligible: Whether classifier-backed Auto can be selected.
|
|
83
|
+
yolo_switcher_enabled: Whether unrestricted YOLO appears in the cycle.
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
The next mode, or `None` when no alternate mode is available.
|
|
87
|
+
"""
|
|
88
|
+
mode = (
|
|
89
|
+
current if isinstance(current, ApprovalMode) else coerce_approval_mode(current)
|
|
90
|
+
)
|
|
91
|
+
if mode is ApprovalMode.MANUAL:
|
|
92
|
+
if auto_eligible:
|
|
93
|
+
return ApprovalMode.AUTO
|
|
94
|
+
if yolo_switcher_enabled:
|
|
95
|
+
return ApprovalMode.YOLO
|
|
96
|
+
return None
|
|
97
|
+
if mode is ApprovalMode.AUTO:
|
|
98
|
+
if yolo_switcher_enabled:
|
|
99
|
+
return ApprovalMode.YOLO
|
|
100
|
+
return ApprovalMode.MANUAL
|
|
101
|
+
# Only genuine YOLO reaches here; unknown/invalid values were normalized to
|
|
102
|
+
# Manual above and took that branch. Exiting YOLO always returns to Manual.
|
|
103
|
+
return ApprovalMode.MANUAL
|
|
104
|
+
|
|
105
|
+
|
|
66
106
|
def approval_mode_key(thread_id: str) -> str:
|
|
67
107
|
"""Return the store key for a thread's live approval mode.
|
|
68
108
|
|
|
@@ -506,9 +506,9 @@ 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
|
-
provider `TimeoutError` stays type-only so we do not claim dcode
|
|
511
|
-
|
|
509
|
+
(`_ClassifierDeadlineExceededError`) includes the configured wait budget; a
|
|
510
|
+
bare provider `TimeoutError` stays type-only so we do not claim dcode's
|
|
511
|
+
deadline fired when the model failed first.
|
|
512
512
|
|
|
513
513
|
Args:
|
|
514
514
|
exc: Failure raised while invoking or validating the classifier.
|
|
@@ -518,11 +518,8 @@ def classifier_unavailable_reason(exc: BaseException, *, timeout_seconds: float)
|
|
|
518
518
|
Compact single-line reason for tool messages and TUI events.
|
|
519
519
|
"""
|
|
520
520
|
if isinstance(exc, _ClassifierDeadlineExceededError):
|
|
521
|
-
return
|
|
522
|
-
|
|
523
|
-
f"{timeout_seconds:g}s timeout (app-imposed, not a provider timeout)."
|
|
524
|
-
)
|
|
525
|
-
return f"The authorization classifier was unavailable ({type(exc).__name__})."
|
|
521
|
+
return f"no decision within Auto's {timeout_seconds:g}s limit"
|
|
522
|
+
return f"failed ({type(exc).__name__})"
|
|
526
523
|
|
|
527
524
|
|
|
528
525
|
def _default_counters(mode: ApprovalMode) -> AutoModeCounters:
|