deepagents-code 0.1.46__tar.gz → 0.1.47__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.47}/CHANGELOG.md +7 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/PKG-INFO +1 -1
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_build_info.py +1 -1
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_env_vars.py +11 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/app.py +120 -15
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/approval_mode.py +40 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/config.py +21 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/config_manifest.py +13 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/startup_tip.py +47 -7
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/welcome.py +4 -4
- deepagents_code-0.1.47/deepagents_code/tui/widgets/yolo_mode_notice.py +161 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/pyproject.toml +1 -1
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/scripts/install.sh +7 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_app.py +334 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_approval_mode.py +33 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_config_manifest.py +68 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_install_script.py +9 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_startup_tip.py +47 -6
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_welcome.py +14 -14
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/uv.lock +1 -1
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/.gitignore +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/AGENTS.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/ARCHITECTURE.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/COMMANDS.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/DEVELOPMENT.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/Makefile +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/README.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/THREAT_MODEL.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_debug_buffer.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_fake_models.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_paths.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_repository_bounds.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_server_config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_tool_stream.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/agent.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/auto_mode.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/commands/auth.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/commands/config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/commands/mcp.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/commands/tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/launch/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/launch/server.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/launch/server_manager.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/non_interactive.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/remote_client.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/command_registry.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/configurable_model.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/doctor.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/extras_info.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/goal_rubric.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/goal_state_notice.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/goal_tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/capabilities.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/engine.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/env.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/legacy.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/loading.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/migration.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/models/adapters.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/models/config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/models/domain.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/models/transport.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/models/wire.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/projection.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/reducer.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/runner.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/runtime.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/snapshot.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/transcript.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/integrations/sandbox_factory.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/json_types.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/main.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/managed_tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_auth.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/model_config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/offload.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/offload_middleware.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/paste_collapse.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/_json.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/adapters/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/adapters/mcp.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/adapters/skills.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/commands_cli.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/discovery.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/manifest.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/marketplace.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/models.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/store.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/substitution.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/reasoning_effort.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/reliable_rubric.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/server_graph.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/sessions.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/skills/merge.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/skills/trust.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/system_prompt.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/todo_list_prompt.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tool_catalog.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/screens/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/textual_adapter.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/_links.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/approval.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/ask_user.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/auth.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/chat_input.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/codex_auth.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/debug_console.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/diff.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/effort_selector.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/goal_review.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/goal_status.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/history.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/install_confirm.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/loading.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/message_store.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/messages.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/model_selector.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/plugin_reload.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/skill_trust.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/status.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/thread_selector.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/update_available.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/update_confirm.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/ui.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/update_check.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/hatch_build.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/images/tui.png +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/README.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/test_auto_approve_remote.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/test_offload_server_side.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/client/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/client/commands/test_auth.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/client/commands/test_mcp.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/client/commands/test_tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/conftest.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/hooks/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/hooks/models/test_models.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/hooks/test_configuration.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/hooks/test_engine.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/hooks/test_execution.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/hooks/test_transcript.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/plugins/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/plugins/test_marketplace.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/plugins/test_store.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_merge.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_skill_trust.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/smoke_tests/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/smoke_tests/conftest.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test__tool_stream.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_agent.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_args.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_auto_mode.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_config_recursion_limit.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_cursor_blink.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_cursor_style.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_debug_buffer.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_debug_console.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_doctor.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_goal_criteria_client.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_goal_rubric.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_goal_state_notice.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_goal_state_persistence.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_goal_tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_hatch_build.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_install_command.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_json_types.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_main.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_managed_tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_model_config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_paths.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_reasoning_effort.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_reliable_rubric.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_repository_bounds.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_rubric_cli.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_sandbox_registry.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_server.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_startup_blocking.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_threads_resume.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_tool_catalog.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_tracing_replicas.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_transcript_virtualization.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_history.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_links.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_plugin_reload.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_status.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
- {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.1.47](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.46...deepagents-code==0.1.47) (2026-07-24)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- Added `yolo` mode to the `Shift+Tab` approval cycle ([#5035](https://github.com/langchain-ai/deepagents/issues/5035)).
|
|
10
|
+
- Show the changelog link before prompting to update via the install script ([#5034](https://github.com/langchain-ai/deepagents/issues/5034)).
|
|
11
|
+
|
|
5
12
|
## [0.1.46](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.45...deepagents-code==0.1.46) (2026-07-24)
|
|
6
13
|
|
|
7
14
|
### Highlights
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.47
|
|
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/
|
|
@@ -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.47" # 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."""
|
|
@@ -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(
|
|
@@ -16912,10 +16913,12 @@ class DeepAgentsApp(App):
|
|
|
16912
16913
|
panel.toggle()
|
|
16913
16914
|
|
|
16914
16915
|
async def action_toggle_auto_approve(self) -> None:
|
|
16915
|
-
"""
|
|
16916
|
+
"""Cycle Manual → Auto → YOLO (when enabled) after Store acknowledgement.
|
|
16916
16917
|
|
|
16917
|
-
|
|
16918
|
-
|
|
16918
|
+
YOLO is included by default (`startup.yolo_switcher` / env). Auto is
|
|
16919
|
+
skipped when a sandbox makes classifier-backed Auto ineligible. The
|
|
16920
|
+
first Shift+Tab into YOLO prompts for the same install-local
|
|
16921
|
+
acknowledgement used by `--yolo` before unrestricted mode becomes active.
|
|
16919
16922
|
"""
|
|
16920
16923
|
from deepagents_code.tui.modals.plugin_manager import PluginManagerScreen
|
|
16921
16924
|
from deepagents_code.tui.widgets.agent_selector import AgentSelectorScreen
|
|
@@ -16969,17 +16972,47 @@ class DeepAgentsApp(App):
|
|
|
16969
16972
|
if self._pending_ask_user_widget is not None:
|
|
16970
16973
|
self._pending_ask_user_widget.action_previous_question()
|
|
16971
16974
|
return
|
|
16972
|
-
from deepagents_code.approval_mode import
|
|
16975
|
+
from deepagents_code.approval_mode import (
|
|
16976
|
+
ApprovalMode,
|
|
16977
|
+
has_yolo_acknowledgement,
|
|
16978
|
+
next_approval_mode,
|
|
16979
|
+
)
|
|
16980
|
+
from deepagents_code.config import is_yolo_switcher_enabled
|
|
16973
16981
|
|
|
16974
|
-
|
|
16975
|
-
|
|
16976
|
-
|
|
16977
|
-
|
|
16978
|
-
|
|
16979
|
-
|
|
16980
|
-
|
|
16981
|
-
|
|
16982
|
-
|
|
16982
|
+
yolo_switcher_enabled = is_yolo_switcher_enabled()
|
|
16983
|
+
target = next_approval_mode(
|
|
16984
|
+
self._approval_mode,
|
|
16985
|
+
auto_eligible=self._auto_mode_eligible,
|
|
16986
|
+
yolo_switcher_enabled=yolo_switcher_enabled,
|
|
16987
|
+
)
|
|
16988
|
+
if target is None:
|
|
16989
|
+
# `next_approval_mode` returns None only from Manual when neither
|
|
16990
|
+
# Auto (sandbox-ineligible) nor the YOLO switcher entry is available,
|
|
16991
|
+
# so this is the only reachable case.
|
|
16992
|
+
self._warn_live_approval_mode_unavailable(
|
|
16993
|
+
"Auto is unavailable with a sandbox, and YOLO is disabled "
|
|
16994
|
+
"in the approval switcher."
|
|
16995
|
+
)
|
|
16996
|
+
return
|
|
16997
|
+
|
|
16998
|
+
# Gate the first YOLO switcher entry on the same policy acknowledgement
|
|
16999
|
+
# as `--yolo`. Do not activate YOLO until the user continues.
|
|
17000
|
+
if target is ApprovalMode.YOLO and not has_yolo_acknowledgement():
|
|
17001
|
+
self._prompt_yolo_switcher_acknowledgement()
|
|
17002
|
+
return
|
|
17003
|
+
|
|
17004
|
+
await self._set_approval_mode(target)
|
|
17005
|
+
|
|
17006
|
+
async def _set_approval_mode(self, target: ApprovalMode) -> bool:
|
|
17007
|
+
"""Apply an approval-mode change after optional live Store acknowledgement.
|
|
17008
|
+
|
|
17009
|
+
Args:
|
|
17010
|
+
target: Mode to select.
|
|
17011
|
+
|
|
17012
|
+
Returns:
|
|
17013
|
+
`True` when local UI state was updated to `target`.
|
|
17014
|
+
"""
|
|
17015
|
+
from deepagents_code.approval_mode import ApprovalMode
|
|
16983
17016
|
|
|
16984
17017
|
# With no usable agent/session pair there is no running graph to update.
|
|
16985
17018
|
# Stage the selection locally; `execute_task_textual` persists it before
|
|
@@ -16993,7 +17026,12 @@ class DeepAgentsApp(App):
|
|
|
16993
17026
|
self._warn_live_approval_mode_unavailable(
|
|
16994
17027
|
"Auto could not be persisted; remaining in Manual."
|
|
16995
17028
|
)
|
|
16996
|
-
return
|
|
17029
|
+
return False
|
|
17030
|
+
if target is ApprovalMode.YOLO:
|
|
17031
|
+
self._warn_live_approval_mode_unavailable(
|
|
17032
|
+
"YOLO could not be persisted; remaining in the previous mode."
|
|
17033
|
+
)
|
|
17034
|
+
return False
|
|
16997
17035
|
self._approval_mode_blocked = True
|
|
16998
17036
|
self._warn_live_approval_mode_unavailable(
|
|
16999
17037
|
"Manual could not be persisted; active work was cancelled and "
|
|
@@ -17001,7 +17039,7 @@ class DeepAgentsApp(App):
|
|
|
17001
17039
|
)
|
|
17002
17040
|
if self._agent_running:
|
|
17003
17041
|
self._force_interrupt_active_work()
|
|
17004
|
-
return
|
|
17042
|
+
return False
|
|
17005
17043
|
|
|
17006
17044
|
self._approval_mode_blocked = False
|
|
17007
17045
|
self._approval_mode = target
|
|
@@ -17014,6 +17052,73 @@ class DeepAgentsApp(App):
|
|
|
17014
17052
|
self._notify_auto_mode_enabled_once()
|
|
17015
17053
|
if should_persist_live:
|
|
17016
17054
|
await self._auto_accept_pending_goal_rubric()
|
|
17055
|
+
elif target is ApprovalMode.YOLO:
|
|
17056
|
+
# Warn before the await below. State is already committed above, so
|
|
17057
|
+
# if goal-rubric auto-accept raises, YOLO is active and the "no
|
|
17058
|
+
# review" warning must have fired first. AUTO notifies before its
|
|
17059
|
+
# await for the same reason.
|
|
17060
|
+
self.notify(
|
|
17061
|
+
"YOLO is active: gated actions run without review.",
|
|
17062
|
+
severity="warning",
|
|
17063
|
+
timeout=8,
|
|
17064
|
+
markup=False,
|
|
17065
|
+
)
|
|
17066
|
+
if should_persist_live:
|
|
17067
|
+
await self._auto_accept_pending_goal_rubric()
|
|
17068
|
+
return True
|
|
17069
|
+
|
|
17070
|
+
def _prompt_yolo_switcher_acknowledgement(self) -> None:
|
|
17071
|
+
"""Show the first-run YOLO acknowledgement before entering unrestricted mode.
|
|
17072
|
+
|
|
17073
|
+
YOLO stays inactive until Enter persists the acknowledgement and the
|
|
17074
|
+
follow-up mode write succeeds. Esc (or a non-true dismiss) leaves the
|
|
17075
|
+
current mode untouched and does not store the acknowledgement.
|
|
17076
|
+
"""
|
|
17077
|
+
from deepagents_code.approval_mode import (
|
|
17078
|
+
ApprovalMode,
|
|
17079
|
+
save_yolo_acknowledgement,
|
|
17080
|
+
)
|
|
17081
|
+
from deepagents_code.tui.widgets.yolo_mode_notice import YoloModeNoticeScreen
|
|
17082
|
+
|
|
17083
|
+
if getattr(self, "_yolo_mode_notice_pending", False):
|
|
17084
|
+
return
|
|
17085
|
+
|
|
17086
|
+
def handle_result(accepted: bool | None) -> None:
|
|
17087
|
+
self._yolo_mode_notice_pending = False
|
|
17088
|
+
if accepted is not True:
|
|
17089
|
+
self.notify(
|
|
17090
|
+
"Stayed in the current approval mode.",
|
|
17091
|
+
severity="information",
|
|
17092
|
+
markup=False,
|
|
17093
|
+
)
|
|
17094
|
+
return
|
|
17095
|
+
if not save_yolo_acknowledgement():
|
|
17096
|
+
self._warn_live_approval_mode_unavailable(
|
|
17097
|
+
"YOLO acknowledgement could not be saved; staying in the "
|
|
17098
|
+
"current mode."
|
|
17099
|
+
)
|
|
17100
|
+
return
|
|
17101
|
+
task = asyncio.create_task(self._set_approval_mode(ApprovalMode.YOLO))
|
|
17102
|
+
task.add_done_callback(_log_task_exception)
|
|
17103
|
+
|
|
17104
|
+
try:
|
|
17105
|
+
self.push_screen(YoloModeNoticeScreen(), handle_result)
|
|
17106
|
+
except Exception:
|
|
17107
|
+
# This modal *is* the YOLO gate (unlike Auto's post-hoc notice), so
|
|
17108
|
+
# a failed push leaves the mode unchanged. Surface it, or Shift+Tab
|
|
17109
|
+
# looks dead. Leaving `_yolo_mode_notice_pending` unset (it is set
|
|
17110
|
+
# only below, after a successful push) lets a later Shift+Tab retry.
|
|
17111
|
+
logger.warning(
|
|
17112
|
+
"Could not show YOLO switcher acknowledgement", exc_info=True
|
|
17113
|
+
)
|
|
17114
|
+
self._warn_live_approval_mode_unavailable(
|
|
17115
|
+
"Could not open the YOLO confirmation; approval mode unchanged."
|
|
17116
|
+
)
|
|
17117
|
+
return
|
|
17118
|
+
|
|
17119
|
+
# Mark pending only after the push succeeds so a failed push cannot
|
|
17120
|
+
# suppress a later try for the whole session.
|
|
17121
|
+
self._yolo_mode_notice_pending = True
|
|
17017
17122
|
|
|
17018
17123
|
def action_toggle_tool_output(self) -> None:
|
|
17019
17124
|
"""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
|
|
|
@@ -3255,6 +3255,27 @@ def is_memory_auto_save_enabled() -> bool:
|
|
|
3255
3255
|
return bool(value)
|
|
3256
3256
|
|
|
3257
3257
|
|
|
3258
|
+
def is_yolo_switcher_enabled() -> bool:
|
|
3259
|
+
"""Return whether Shift+Tab may enter unrestricted YOLO mode.
|
|
3260
|
+
|
|
3261
|
+
Resolves the `startup.yolo_switcher` option from env/`config.toml`,
|
|
3262
|
+
defaulting to enabled. When disabled, the interactive cycle stays Manual /
|
|
3263
|
+
Auto only (or Manual alone when Auto is ineligible). Sessions already in
|
|
3264
|
+
YOLO (for example via `--yolo`) can still leave it with Shift+Tab.
|
|
3265
|
+
"""
|
|
3266
|
+
from deepagents_code.config_manifest import (
|
|
3267
|
+
get_option,
|
|
3268
|
+
load_config_toml,
|
|
3269
|
+
resolve_scalar,
|
|
3270
|
+
)
|
|
3271
|
+
|
|
3272
|
+
option = get_option("startup.yolo_switcher")
|
|
3273
|
+
if option is None:
|
|
3274
|
+
return True
|
|
3275
|
+
value, _ = resolve_scalar(option, toml_data=load_config_toml())
|
|
3276
|
+
return bool(value)
|
|
3277
|
+
|
|
3278
|
+
|
|
3258
3279
|
def is_openai_prompt_cache_key_enabled() -> bool:
|
|
3259
3280
|
"""Return whether OpenAI model calls should carry a per-thread cache key.
|
|
3260
3281
|
|
|
@@ -1464,6 +1464,19 @@ _STATIC_OPTIONS: tuple[ConfigOption, ...] = (
|
|
|
1464
1464
|
toml_keys=("startup", "mode"),
|
|
1465
1465
|
cli_flag="--auto-approve",
|
|
1466
1466
|
),
|
|
1467
|
+
ConfigOption(
|
|
1468
|
+
key="startup.yolo_switcher",
|
|
1469
|
+
group="Startup",
|
|
1470
|
+
summary=(
|
|
1471
|
+
"Include YOLO in the Shift+Tab approval-mode cycle "
|
|
1472
|
+
"(Manual → Auto → YOLO); disable to keep the cycle Manual/Auto only."
|
|
1473
|
+
),
|
|
1474
|
+
kind=OptionKind.BOOL,
|
|
1475
|
+
default=True,
|
|
1476
|
+
env_var=_env_vars.YOLO_SWITCHER,
|
|
1477
|
+
empty_env_is_false=True,
|
|
1478
|
+
toml_keys=("startup", "yolo_switcher"),
|
|
1479
|
+
),
|
|
1467
1480
|
# --- Debug / Development -------------------------------------------
|
|
1468
1481
|
ConfigOption(
|
|
1469
1482
|
key="debug.enabled",
|
{deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/startup_tip.py
RENAMED
|
@@ -10,6 +10,12 @@ from textual.widgets import Static
|
|
|
10
10
|
|
|
11
11
|
from deepagents_code._env_vars import HIDE_SPLASH_TIPS, is_env_truthy
|
|
12
12
|
|
|
13
|
+
_TIP_SHIFT_TAB_WITH_YOLO = "Press Shift+Tab to cycle Manual, Auto, and YOLO modes"
|
|
14
|
+
"""Tip used when `startup.yolo_switcher` keeps YOLO in the approval cycle."""
|
|
15
|
+
|
|
16
|
+
_TIP_SHIFT_TAB_WITHOUT_YOLO = "Press Shift+Tab to toggle Manual and Auto modes"
|
|
17
|
+
"""Tip used when orgs/users disable YOLO entry via the approval switcher."""
|
|
18
|
+
|
|
13
19
|
_TIPS: dict[str, int] = {
|
|
14
20
|
"Use @ to reference files and / for commands": 3,
|
|
15
21
|
"Try /threads to resume a previous conversation": 2,
|
|
@@ -27,12 +33,16 @@ _TIPS: dict[str, int] = {
|
|
|
27
33
|
"Ask for a workflow to fan work out to subagents in parallel": 3,
|
|
28
34
|
"Use /timestamps to show or hide message timestamp footers": 1,
|
|
29
35
|
"Use /agents to browse and switch between your available agents": 2,
|
|
30
|
-
|
|
36
|
+
_TIP_SHIFT_TAB_WITH_YOLO: 2,
|
|
31
37
|
"Use !! for incognito shell commands that stay out of model context": 1,
|
|
32
38
|
"Deep Agents can explain its own features and look up its docs. Ask it how to use.": 3, # noqa: E501
|
|
33
39
|
}
|
|
34
40
|
"""Tips shown above the chat input. One is chosen at random per launch,
|
|
35
|
-
weighted by these relative selection weights.
|
|
41
|
+
weighted by these relative selection weights.
|
|
42
|
+
|
|
43
|
+
The Shift+Tab tip is varied at pick time via `_active_tips` so disabled-YOLO
|
|
44
|
+
installs do not advertise a switcher path that policy has removed.
|
|
45
|
+
"""
|
|
36
46
|
|
|
37
47
|
# Fail fast at import if the registry is ever emptied or given a non-positive
|
|
38
48
|
# weight: `random.choices` would otherwise raise a cryptic error at widget
|
|
@@ -46,15 +56,45 @@ if any(weight <= 0 for weight in _TIPS.values()):
|
|
|
46
56
|
raise ValueError(msg)
|
|
47
57
|
|
|
48
58
|
|
|
49
|
-
def
|
|
59
|
+
def _active_tips(*, yolo_switcher_enabled: bool | None = None) -> dict[str, int]:
|
|
60
|
+
"""Return the weighted tip registry for the current switcher policy.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
yolo_switcher_enabled: Override for whether YOLO appears in the
|
|
64
|
+
Shift+Tab cycle. When omitted, resolves `startup.yolo_switcher`.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
Weighted tip map appropriate for the active YOLO switcher setting.
|
|
68
|
+
"""
|
|
69
|
+
if yolo_switcher_enabled is None:
|
|
70
|
+
from deepagents_code.config import is_yolo_switcher_enabled
|
|
71
|
+
|
|
72
|
+
yolo_switcher_enabled = is_yolo_switcher_enabled()
|
|
73
|
+
|
|
74
|
+
tips = dict(_TIPS)
|
|
75
|
+
if yolo_switcher_enabled:
|
|
76
|
+
return tips
|
|
77
|
+
|
|
78
|
+
# Replace the YOLO cycle tip with the Manual/Auto-only wording so the
|
|
79
|
+
# splash never claims Shift+Tab can enter unrestricted mode when policy
|
|
80
|
+
# has removed that entry from the switcher.
|
|
81
|
+
weight = tips.pop(_TIP_SHIFT_TAB_WITH_YOLO, None)
|
|
82
|
+
if weight is not None:
|
|
83
|
+
tips[_TIP_SHIFT_TAB_WITHOUT_YOLO] = weight
|
|
84
|
+
return tips
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _pick_tip(*, yolo_switcher_enabled: bool | None = None) -> str:
|
|
50
88
|
"""Pick one startup tip using the configured relative weights.
|
|
51
89
|
|
|
90
|
+
Args:
|
|
91
|
+
yolo_switcher_enabled: Optional override forwarded to `_active_tips`.
|
|
92
|
+
|
|
52
93
|
Returns:
|
|
53
|
-
Tip text selected from
|
|
94
|
+
Tip text selected from the active tip registry.
|
|
54
95
|
"""
|
|
55
|
-
tips =
|
|
56
|
-
weights
|
|
57
|
-
return random.choices(tips, weights=weights, k=1)[0] # noqa: S311
|
|
96
|
+
tips = _active_tips(yolo_switcher_enabled=yolo_switcher_enabled)
|
|
97
|
+
return random.choices(list(tips.keys()), weights=list(tips.values()), k=1)[0] # noqa: S311
|
|
58
98
|
|
|
59
99
|
|
|
60
100
|
def show_startup_tip() -> bool:
|
|
@@ -117,7 +117,7 @@ def _debug_tag_style(*, ansi: bool, colors: theme.ThemeColors) -> str | TStyle:
|
|
|
117
117
|
|
|
118
118
|
|
|
119
119
|
def _experimental_tag_style(*, ansi: bool, colors: theme.ThemeColors) -> str | TStyle:
|
|
120
|
-
"""Build the style for the `(experimental
|
|
120
|
+
"""Build the style for the `(experimental)` tag.
|
|
121
121
|
|
|
122
122
|
Args:
|
|
123
123
|
ansi: Whether the active theme is an ANSI terminal theme.
|
|
@@ -162,7 +162,7 @@ class WelcomeBanner(Static):
|
|
|
162
162
|
|
|
163
163
|
Renders a bordered box with the product title and optional version. A
|
|
164
164
|
`(debug enabled)` tag appears when `DEEPAGENTS_CODE_DEBUG` is enabled
|
|
165
|
-
(truthy), and an `(experimental
|
|
165
|
+
(truthy), and an `(experimental)` tag appears when
|
|
166
166
|
`DEEPAGENTS_CODE_EXPERIMENTAL` is enabled (truthy), both even when the
|
|
167
167
|
version is hidden. A `(local)` tag appears for
|
|
168
168
|
editable installs only when the version is shown. Rows follow that appear
|
|
@@ -372,7 +372,7 @@ class WelcomeBanner(Static):
|
|
|
372
372
|
|
|
373
373
|
Returns:
|
|
374
374
|
Content with the title, optional version, and any applicable header
|
|
375
|
-
tags (`(debug enabled)` when debug is on; `(experimental
|
|
375
|
+
tags (`(debug enabled)` when debug is on; `(experimental)` when
|
|
376
376
|
experimental mode is on; `(local)` for editable
|
|
377
377
|
installs when the version is shown), followed by any applicable rows
|
|
378
378
|
in order: model (when `SPLASH_SHOW_MODEL`), directory (when
|
|
@@ -406,7 +406,7 @@ class WelcomeBanner(Static):
|
|
|
406
406
|
if self._experimental_enabled:
|
|
407
407
|
parts.append(
|
|
408
408
|
(
|
|
409
|
-
" (experimental
|
|
409
|
+
" (experimental)",
|
|
410
410
|
_experimental_tag_style(ansi=ansi, colors=colors),
|
|
411
411
|
)
|
|
412
412
|
)
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"""First-enable confirmation modal before Shift+Tab enters YOLO.
|
|
2
|
+
|
|
3
|
+
Shown when the user cycles into unrestricted YOLO without a persisted
|
|
4
|
+
acknowledgement. Enter acknowledges YOLO and records the policy version; Esc
|
|
5
|
+
keeps the previous approval mode and leaves the acknowledgement unsaved.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from typing import TYPE_CHECKING, ClassVar
|
|
11
|
+
|
|
12
|
+
from textual.binding import Binding, BindingType
|
|
13
|
+
from textual.containers import Vertical
|
|
14
|
+
from textual.screen import ModalScreen
|
|
15
|
+
from textual.widgets import Markdown, Static
|
|
16
|
+
|
|
17
|
+
from deepagents_code.tui.widgets._links import open_checked_url_async
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
from textual.app import ComposeResult
|
|
21
|
+
|
|
22
|
+
YOLO_MODE_DOCS_URL = (
|
|
23
|
+
"https://docs.langchain.com/oss/python/deepagents/code/approval-modes"
|
|
24
|
+
)
|
|
25
|
+
"""Canonical docs page for Manual / Auto / YOLO behavior."""
|
|
26
|
+
|
|
27
|
+
YOLO_MODE_NOTICE_BODY = (
|
|
28
|
+
"You are about to enable **YOLO**. The agent will run **gated actions "
|
|
29
|
+
"without asking first** — shell commands, file edits, network calls, and "
|
|
30
|
+
"other tools on this machine.\n\n"
|
|
31
|
+
"This is **not Auto**. There is **no classifier review** and **no approval "
|
|
32
|
+
"prompt** while YOLO is active. Prefer Auto unless you intend full "
|
|
33
|
+
"unrestricted execution.\n\n"
|
|
34
|
+
"This notice appears **once** on this machine after you continue. You can "
|
|
35
|
+
"leave YOLO any time with **Shift+Tab**.\n\n"
|
|
36
|
+
f"[Learn more about approval modes]({YOLO_MODE_DOCS_URL})"
|
|
37
|
+
)
|
|
38
|
+
"""Default Markdown body shown before the first YOLO switcher enable."""
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class YoloModeNoticeScreen(ModalScreen[bool]):
|
|
42
|
+
"""In-TUI acknowledgement shown before unrestricted YOLO becomes active.
|
|
43
|
+
|
|
44
|
+
Dismisses with `True` on Enter (acknowledge and enable) and `False` on Esc
|
|
45
|
+
(keep the previous mode). Programmatic dismiss may yield `None`; callers
|
|
46
|
+
treat that like cancel so YOLO is never left active without an explicit
|
|
47
|
+
acknowledge.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
BINDINGS: ClassVar[list[BindingType]] = [
|
|
51
|
+
Binding("enter", "confirm", "Enable YOLO", show=False, priority=True),
|
|
52
|
+
Binding("escape", "cancel", "Keep previous", show=False, priority=True),
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
CSS = """
|
|
56
|
+
YoloModeNoticeScreen {
|
|
57
|
+
align: center middle;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
YoloModeNoticeScreen > Vertical {
|
|
61
|
+
width: 72;
|
|
62
|
+
max-width: 90%;
|
|
63
|
+
height: auto;
|
|
64
|
+
background: $surface;
|
|
65
|
+
border: solid $error;
|
|
66
|
+
padding: 1 2;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
YoloModeNoticeScreen .yolo-mode-notice-title {
|
|
70
|
+
text-style: bold;
|
|
71
|
+
color: $error;
|
|
72
|
+
text-align: center;
|
|
73
|
+
margin-bottom: 1;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
YoloModeNoticeScreen .yolo-mode-notice-body {
|
|
77
|
+
height: auto;
|
|
78
|
+
color: $text;
|
|
79
|
+
margin-bottom: 1;
|
|
80
|
+
padding: 0;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
YoloModeNoticeScreen .yolo-mode-notice-body > * {
|
|
84
|
+
margin: 0 0 1 0;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
YoloModeNoticeScreen .yolo-mode-notice-body > *:last-child {
|
|
88
|
+
margin-bottom: 0;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
YoloModeNoticeScreen .yolo-mode-notice-help {
|
|
92
|
+
height: 1;
|
|
93
|
+
color: $text-muted;
|
|
94
|
+
text-style: italic;
|
|
95
|
+
text-align: center;
|
|
96
|
+
margin-top: 1;
|
|
97
|
+
}
|
|
98
|
+
"""
|
|
99
|
+
|
|
100
|
+
# The screen must be the focus target for its own priority Enter binding to
|
|
101
|
+
# fire (see `on_mount`). Esc does not depend on focus: the app owns a global
|
|
102
|
+
# priority `escape` binding that routes to `action_cancel` for active modals.
|
|
103
|
+
can_focus = True
|
|
104
|
+
|
|
105
|
+
def __init__(self, body: str | None = None) -> None:
|
|
106
|
+
"""Initialize the notice.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
body: Optional Markdown body under the title. Defaults to
|
|
110
|
+
`YOLO_MODE_NOTICE_BODY`. Links open in a browser.
|
|
111
|
+
"""
|
|
112
|
+
super().__init__()
|
|
113
|
+
self._body = YOLO_MODE_NOTICE_BODY if body is None else body
|
|
114
|
+
|
|
115
|
+
def on_mount(self) -> None:
|
|
116
|
+
"""Take focus so priority bindings receive Enter/Esc."""
|
|
117
|
+
self.focus()
|
|
118
|
+
|
|
119
|
+
def compose(self) -> ComposeResult:
|
|
120
|
+
"""Compose the YOLO acknowledgement notice.
|
|
121
|
+
|
|
122
|
+
Yields:
|
|
123
|
+
Title, body, and help-row widgets parented inside a `Vertical`.
|
|
124
|
+
"""
|
|
125
|
+
with Vertical():
|
|
126
|
+
yield Static(
|
|
127
|
+
"YOLO mode",
|
|
128
|
+
classes="yolo-mode-notice-title",
|
|
129
|
+
markup=False,
|
|
130
|
+
)
|
|
131
|
+
# open_links=False so we own the click path (toast feedback + shared
|
|
132
|
+
# URL safety). Assistant message widgets use the same pattern.
|
|
133
|
+
yield Markdown(
|
|
134
|
+
self._body,
|
|
135
|
+
classes="yolo-mode-notice-body",
|
|
136
|
+
open_links=False,
|
|
137
|
+
)
|
|
138
|
+
yield Static(
|
|
139
|
+
"Enter to acknowledge and enable YOLO · Esc to keep current mode",
|
|
140
|
+
classes="yolo-mode-notice-help",
|
|
141
|
+
markup=False,
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
async def on_markdown_link_clicked(self, event: Markdown.LinkClicked) -> None:
|
|
145
|
+
"""Open docs (or any body link) with the shared URL helper."""
|
|
146
|
+
event.stop()
|
|
147
|
+
await open_checked_url_async(event.href, app=self.app, notify_on_success=True)
|
|
148
|
+
|
|
149
|
+
def action_confirm(self) -> None:
|
|
150
|
+
"""Acknowledge YOLO and mark the notice dismissed without re-showing."""
|
|
151
|
+
self.dismiss(True)
|
|
152
|
+
|
|
153
|
+
def action_cancel(self) -> None:
|
|
154
|
+
"""Keep the previous approval mode without persisting acknowledgement.
|
|
155
|
+
|
|
156
|
+
The method name must stay `cancel`: the app owns a priority `escape`
|
|
157
|
+
binding that, for an active `ModalScreen`, dispatches to
|
|
158
|
+
`action_cancel` if present and otherwise falls through to
|
|
159
|
+
`dismiss(None)`. Renaming this would silently regress Esc handling.
|
|
160
|
+
"""
|
|
161
|
+
self.dismiss(False)
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "deepagents-code"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.47"
|
|
8
8
|
description = "Terminal coding agent built on the Deep Agents SDK - works with any model, with persistent memory, customizable skills, subagents, and approval controls."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "MIT" }
|
|
@@ -833,6 +833,12 @@ esac
|
|
|
833
833
|
# tell whether an existing install is out of date before upgrading it.
|
|
834
834
|
PYPI_JSON_URL="https://pypi.org/pypi/deepagents-code/json"
|
|
835
835
|
|
|
836
|
+
# Base URL for a version-specific GitHub release, surfaced before the update
|
|
837
|
+
# prompt so users can review what changed before agreeing to upgrade. Release
|
|
838
|
+
# tags are `deepagents-code==X.Y.Z`; the `==` must be percent-encoded (%3D%3D)
|
|
839
|
+
# for the tag URL to resolve.
|
|
840
|
+
RELEASE_TAG_URL_BASE="https://github.com/langchain-ai/deepagents/releases/tag/deepagents-code%3D%3D"
|
|
841
|
+
|
|
836
842
|
# Validate and normalize extras: accept bare CSV, wrap in brackets for pip
|
|
837
843
|
if [[ -n "$EXTRAS" ]]; then
|
|
838
844
|
# Strip brackets if the user passed them anyway
|
|
@@ -1257,6 +1263,7 @@ elif [ -n "$PRE_VERSION" ] && [ -z "$VERSION" ] && [ -z "$PRERELEASE_REQUESTED"
|
|
|
1257
1263
|
elif [ "$ASSUME_YES" = "1" ]; then
|
|
1258
1264
|
log_info "Updating deepagents-code ${PRE_VERSION} → ${LATEST_VERSION}..."
|
|
1259
1265
|
elif can_prompt; then
|
|
1266
|
+
log_info "What's new: ${RELEASE_TAG_URL_BASE}${LATEST_VERSION}"
|
|
1260
1267
|
if prompt_yn "Update deepagents-code ${PRE_VERSION} → ${LATEST_VERSION}?"; then
|
|
1261
1268
|
log_info "Updating deepagents-code ${PRE_VERSION} → ${LATEST_VERSION}..."
|
|
1262
1269
|
else
|