deepagents-code 0.1.47__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.47 → deepagents_code-0.1.48}/CHANGELOG.md +13 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/PKG-INFO +4 -4
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_build_info.py +1 -1
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/agent.py +43 -25
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/app.py +17 -52
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/auto_mode.py +5 -8
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/config.py +10 -24
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/extras_info.py +82 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/capabilities.py +34 -1
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/env.py +4 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/legacy.py +2 -1
- {deepagents_code-0.1.47 → 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.47 → deepagents_code-0.1.48}/deepagents_code/hooks/models/config.py +21 -1
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/models/domain.py +42 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/models/wire.py +31 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/projection.py +33 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/reducer.py +31 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/runner.py +94 -13
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/snapshot.py +5 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/main.py +17 -33
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/offload.py +2 -2
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/store.py +5 -1
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/__init__.py +28 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/agent_selector.py +5 -4
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/model_selector.py +4 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/restart_prompt.py +1 -1
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/update_check.py +24 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/pyproject.toml +3 -3
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/hooks/models/test_models.py +17 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/hooks/test_configuration.py +157 -4
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/hooks/test_engine.py +234 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/hooks/test_execution.py +180 -24
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_agent.py +73 -28
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_app.py +3 -1
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_auto_mode.py +19 -29
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_config.py +25 -1
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_extras_info.py +49 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_model_config.py +20 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_reasoning_effort.py +6 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_reload.py +10 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_server_helpers.py +3 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_update_check.py +46 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +92 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_model_selector.py +16 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/uv.lock +15 -15
- deepagents_code-0.1.47/deepagents_code/hooks/migration.py +0 -90
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/.gitignore +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/AGENTS.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/ARCHITECTURE.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/COMMANDS.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/DEVELOPMENT.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/Makefile +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/README.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/THREAT_MODEL.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_debug_buffer.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_env_vars.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_fake_models.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_paths.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_repository_bounds.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_server_config.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_tool_stream.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/approval_mode.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/commands/auth.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/commands/config.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/commands/mcp.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/commands/tools.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/launch/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/launch/server.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/launch/server_manager.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/non_interactive.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/remote_client.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/command_registry.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/config_manifest.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/configurable_model.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/doctor.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/goal_rubric.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/goal_state_notice.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/goal_tools.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/engine.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/models/adapters.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/models/transport.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/runtime.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/tools.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/transcript.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/integrations/sandbox_factory.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/json_types.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/managed_tools.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_auth.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_config.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_tools.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/model_config.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/offload_middleware.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/paste_collapse.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/_json.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/adapters/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/adapters/mcp.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/adapters/skills.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/commands_cli.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/discovery.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/manifest.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/marketplace.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/models.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/substitution.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/reasoning_effort.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/reliable_rubric.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/server_graph.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/sessions.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/skills/merge.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/skills/trust.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/system_prompt.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/todo_list_prompt.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tool_catalog.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/screens/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/textual_adapter.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/_links.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/approval.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/ask_user.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/auth.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/chat_input.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/codex_auth.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/debug_console.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/diff.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/effort_selector.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/goal_review.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/goal_status.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/history.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/install_confirm.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/loading.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/message_store.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/messages.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/plugin_reload.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/skill_trust.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/startup_tip.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/status.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/thread_selector.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/update_available.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/update_confirm.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/welcome.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/ui.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/hatch_build.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/images/tui.png +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/scripts/install.sh +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/README.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/test_auto_approve_remote.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/test_offload_server_side.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/client/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/client/commands/test_auth.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/client/commands/test_mcp.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/client/commands/test_tools.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/conftest.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/hooks/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/hooks/test_transcript.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/plugins/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/plugins/test_marketplace.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/plugins/test_store.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_merge.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_skill_trust.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/smoke_tests/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/smoke_tests/conftest.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test__tool_stream.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_approval_mode.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_args.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_config_manifest.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_config_recursion_limit.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_cursor_blink.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_cursor_style.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_debug_buffer.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_debug_console.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_doctor.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_criteria_client.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_rubric.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_state_notice.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_state_persistence.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_tools.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_hatch_build.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_install_command.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_install_script.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_json_types.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_main.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_managed_tools.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_config.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_paths.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_reliable_rubric.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_repository_bounds.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_rubric_cli.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_sandbox_registry.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_server.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_startup_blocking.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_threads_resume.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_tool_catalog.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_tracing_replicas.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_transcript_virtualization.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_history.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_links.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_plugin_reload.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_status.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
- {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
|
@@ -2,6 +2,19 @@
|
|
|
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
|
+
|
|
5
18
|
## [0.1.47](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.46...deepagents-code==0.1.47) (2026-07-24)
|
|
6
19
|
|
|
7
20
|
### Features
|
|
@@ -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
|
|
@@ -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,
|
|
@@ -5052,37 +5052,20 @@ class DeepAgentsApp(App):
|
|
|
5052
5052
|
and self._server_kwargs is not None
|
|
5053
5053
|
):
|
|
5054
5054
|
missing = self._server_startup_missing_provider_package
|
|
5055
|
-
from deepagents_code.extras_info import
|
|
5055
|
+
from deepagents_code.extras_info import resolve_install_hint
|
|
5056
5056
|
|
|
5057
|
-
|
|
5058
|
-
if extra is not None:
|
|
5057
|
+
hint = resolve_install_hint(missing.package)
|
|
5058
|
+
if hint.extra is not None:
|
|
5059
5059
|
text += (
|
|
5060
|
-
f"\n\nHint: install the package with `/install {extra}`, "
|
|
5060
|
+
f"\n\nHint: install the package with `/install {hint.extra}`, "
|
|
5061
5061
|
f"then run `/model {missing.provider}:<model>` to retry. "
|
|
5062
5062
|
"Or pick a different provider with `/model`."
|
|
5063
5063
|
)
|
|
5064
5064
|
else:
|
|
5065
|
-
|
|
5066
|
-
|
|
5067
|
-
ToolRequirementIntrospectionError,
|
|
5068
|
-
install_package_command,
|
|
5069
|
-
)
|
|
5070
|
-
|
|
5071
|
-
try:
|
|
5072
|
-
install_cmd = install_package_command(missing.package)
|
|
5073
|
-
except (
|
|
5074
|
-
ValueError,
|
|
5075
|
-
ExtrasIntrospectionError,
|
|
5076
|
-
ToolRequirementIntrospectionError,
|
|
5077
|
-
) as exc:
|
|
5078
|
-
logger.debug(
|
|
5079
|
-
"install_package_command failed; falling back to "
|
|
5080
|
-
"manual hint: %s",
|
|
5081
|
-
exc,
|
|
5082
|
-
)
|
|
5083
|
-
install_hint = f"install the `{missing.package}` package manually"
|
|
5065
|
+
if hint.command is not None:
|
|
5066
|
+
install_hint = f"run `{hint.command}`"
|
|
5084
5067
|
else:
|
|
5085
|
-
install_hint = f"
|
|
5068
|
+
install_hint = f"install the `{missing.package}` package manually"
|
|
5086
5069
|
text += (
|
|
5087
5070
|
f"\n\nHint: {install_hint}, then run "
|
|
5088
5071
|
f"`/model {missing.provider}:<model>` "
|
|
@@ -6034,9 +6017,9 @@ class DeepAgentsApp(App):
|
|
|
6034
6017
|
create_update_log_path,
|
|
6035
6018
|
editable_extra_hint,
|
|
6036
6019
|
install_extra_command,
|
|
6037
|
-
install_extra_recovery_command,
|
|
6038
6020
|
is_valid_extra_name,
|
|
6039
6021
|
perform_install_extra,
|
|
6022
|
+
safe_install_extra_recovery_command,
|
|
6040
6023
|
)
|
|
6041
6024
|
except ImportError as exc:
|
|
6042
6025
|
logger.warning("/install command import failed", exc_info=True)
|
|
@@ -6121,19 +6104,9 @@ class DeepAgentsApp(App):
|
|
|
6121
6104
|
# already bound above so the hint is never empty. `manual_cmd` is
|
|
6122
6105
|
# rendered into a Textual `Content` (literal, not Rich markup), so no
|
|
6123
6106
|
# bracket escaping is needed here.
|
|
6124
|
-
|
|
6125
|
-
|
|
6126
|
-
|
|
6127
|
-
)
|
|
6128
|
-
except (
|
|
6129
|
-
ExtrasIntrospectionError,
|
|
6130
|
-
ToolRequirementIntrospectionError,
|
|
6131
|
-
ValueError,
|
|
6132
|
-
):
|
|
6133
|
-
logger.warning(
|
|
6134
|
-
"/install recovery command failed (install raised)",
|
|
6135
|
-
exc_info=True,
|
|
6136
|
-
)
|
|
6107
|
+
manual_cmd = await asyncio.to_thread(
|
|
6108
|
+
safe_install_extra_recovery_command, extra, fallback=manual_cmd
|
|
6109
|
+
)
|
|
6137
6110
|
await self._mount_message(
|
|
6138
6111
|
ErrorMessage(
|
|
6139
6112
|
f"Install failed: {type(exc).__name__}: {exc}\n"
|
|
@@ -6149,19 +6122,9 @@ class DeepAgentsApp(App):
|
|
|
6149
6122
|
detail = f": {output[-200:]}" if output else ""
|
|
6150
6123
|
# See the OSError branch above: best-effort recovery command, falling
|
|
6151
6124
|
# back to the already-bound install-script command on failure.
|
|
6152
|
-
|
|
6153
|
-
|
|
6154
|
-
|
|
6155
|
-
)
|
|
6156
|
-
except (
|
|
6157
|
-
ExtrasIntrospectionError,
|
|
6158
|
-
ToolRequirementIntrospectionError,
|
|
6159
|
-
ValueError,
|
|
6160
|
-
):
|
|
6161
|
-
logger.warning(
|
|
6162
|
-
"/install recovery command failed (install reported failure)",
|
|
6163
|
-
exc_info=True,
|
|
6164
|
-
)
|
|
6125
|
+
manual_cmd = await asyncio.to_thread(
|
|
6126
|
+
safe_install_extra_recovery_command, extra, fallback=manual_cmd
|
|
6127
|
+
)
|
|
6165
6128
|
await self._mount_message(
|
|
6166
6129
|
ErrorMessage(
|
|
6167
6130
|
f"Install failed{detail}\n"
|
|
@@ -16901,7 +16864,9 @@ class DeepAgentsApp(App):
|
|
|
16901
16864
|
elif kind == "denial":
|
|
16902
16865
|
text = f"Auto denied [{event.get('category', 'policy')}]: {reason}"
|
|
16903
16866
|
elif kind == "unavailable":
|
|
16904
|
-
|
|
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)"
|
|
16905
16870
|
else:
|
|
16906
16871
|
text = f"Auto warning: {reason}"
|
|
16907
16872
|
await self._mount_message(AppMessage(text))
|
|
@@ -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:
|
|
@@ -112,6 +112,7 @@ _DOTENV_DENIED_ENV_KEYS = frozenset(
|
|
|
112
112
|
"BASH_ENV",
|
|
113
113
|
"BASHOPTS",
|
|
114
114
|
"CDPATH",
|
|
115
|
+
"COMSPEC",
|
|
115
116
|
"DYLD_INSERT_LIBRARIES",
|
|
116
117
|
"DYLD_LIBRARY_PATH",
|
|
117
118
|
"ENV",
|
|
@@ -128,6 +129,8 @@ _DOTENV_DENIED_ENV_KEYS = frozenset(
|
|
|
128
129
|
"PYTHONSTARTUP",
|
|
129
130
|
"SHELLOPTS",
|
|
130
131
|
"SSH_ASKPASS",
|
|
132
|
+
"SYSTEMROOT",
|
|
133
|
+
"WINDIR",
|
|
131
134
|
_INHERITED_PYTHONPATH_ENV,
|
|
132
135
|
}
|
|
133
136
|
)
|
|
@@ -4534,36 +4537,19 @@ def _create_model_via_init(
|
|
|
4534
4537
|
f"import for provider '{provider}': {e}"
|
|
4535
4538
|
)
|
|
4536
4539
|
else:
|
|
4537
|
-
from deepagents_code.extras_info import
|
|
4540
|
+
from deepagents_code.extras_info import resolve_install_hint
|
|
4538
4541
|
|
|
4539
|
-
|
|
4540
|
-
if extra is not None:
|
|
4542
|
+
hint = resolve_install_hint(package)
|
|
4543
|
+
if hint.extra is not None:
|
|
4541
4544
|
msg = (
|
|
4542
4545
|
f"Missing package for provider '{provider}'. "
|
|
4543
|
-
f"Install: /install {extra}"
|
|
4546
|
+
f"Install: /install {hint.extra}"
|
|
4544
4547
|
)
|
|
4545
4548
|
else:
|
|
4546
|
-
|
|
4547
|
-
|
|
4548
|
-
ToolRequirementIntrospectionError,
|
|
4549
|
-
install_package_command,
|
|
4550
|
-
)
|
|
4551
|
-
|
|
4552
|
-
try:
|
|
4553
|
-
install_cmd = install_package_command(package)
|
|
4554
|
-
except (
|
|
4555
|
-
ValueError,
|
|
4556
|
-
ExtrasIntrospectionError,
|
|
4557
|
-
ToolRequirementIntrospectionError,
|
|
4558
|
-
) as exc:
|
|
4559
|
-
logger.debug(
|
|
4560
|
-
"install_package_command failed; falling back to "
|
|
4561
|
-
"manual hint: %s",
|
|
4562
|
-
exc,
|
|
4563
|
-
)
|
|
4564
|
-
install_hint = f"Install the '{package}' package manually"
|
|
4549
|
+
if hint.command is not None:
|
|
4550
|
+
install_hint = f"Install with: {hint.command}"
|
|
4565
4551
|
else:
|
|
4566
|
-
install_hint = f"Install
|
|
4552
|
+
install_hint = f"Install the '{package}' package manually"
|
|
4567
4553
|
msg = (
|
|
4568
4554
|
f"Missing package for provider '{provider}'. "
|
|
4569
4555
|
f"{install_hint}, then retry with `/model`."
|
|
@@ -1129,6 +1129,88 @@ def extra_for_package(
|
|
|
1129
1129
|
return None
|
|
1130
1130
|
|
|
1131
1131
|
|
|
1132
|
+
@dataclass(frozen=True)
|
|
1133
|
+
class InstallHint:
|
|
1134
|
+
"""Resolved recovery action for a missing provider package.
|
|
1135
|
+
|
|
1136
|
+
Exactly one of three outcomes:
|
|
1137
|
+
|
|
1138
|
+
- `extra` set, `command` `None` — prefer installing the extra that declares
|
|
1139
|
+
the package (callers format this for their UI surface).
|
|
1140
|
+
- `command` set, `extra` `None` — no declared extra; use this raw install
|
|
1141
|
+
command.
|
|
1142
|
+
- both `None` — neither could be derived; caller should fall back to
|
|
1143
|
+
"install the package manually" phrasing.
|
|
1144
|
+
|
|
1145
|
+
Attributes:
|
|
1146
|
+
extra: Preferred `deepagents-code` extra name, or `None`.
|
|
1147
|
+
command: Ready-to-run install command for the raw package, or `None`.
|
|
1148
|
+
Never set when `extra` is set.
|
|
1149
|
+
"""
|
|
1150
|
+
|
|
1151
|
+
extra: str | None
|
|
1152
|
+
command: str | None
|
|
1153
|
+
|
|
1154
|
+
def __post_init__(self) -> None:
|
|
1155
|
+
"""Reject impossible dual-action resolutions.
|
|
1156
|
+
|
|
1157
|
+
Raises:
|
|
1158
|
+
ValueError: If both `extra` and `command` are set.
|
|
1159
|
+
"""
|
|
1160
|
+
if self.extra is not None and self.command is not None:
|
|
1161
|
+
msg = "InstallHint cannot set both extra and command"
|
|
1162
|
+
raise ValueError(msg)
|
|
1163
|
+
|
|
1164
|
+
|
|
1165
|
+
def resolve_install_hint(
|
|
1166
|
+
package: str,
|
|
1167
|
+
distribution_name: str = "deepagents-code",
|
|
1168
|
+
) -> InstallHint:
|
|
1169
|
+
"""Resolve how to recover from a missing provider package.
|
|
1170
|
+
|
|
1171
|
+
Centralizes the `extra_for_package` -> `install_package_command` fallback so
|
|
1172
|
+
the TUI startup hint and the model-initialization error path render
|
|
1173
|
+
consistent recovery data without each re-implementing the branching and
|
|
1174
|
+
error handling. Prefers the installable extra; otherwise derives a raw
|
|
1175
|
+
package install command, degrading to a manual hint (both fields `None`)
|
|
1176
|
+
when that cannot be determined.
|
|
1177
|
+
|
|
1178
|
+
Callers own sentence wording and command framing (for example interactive
|
|
1179
|
+
`/install` / `/model` copy). This helper only resolves the recovery action.
|
|
1180
|
+
|
|
1181
|
+
Args:
|
|
1182
|
+
package: Distribution package name that failed to import.
|
|
1183
|
+
distribution_name: Name of the installed distribution to inspect when
|
|
1184
|
+
mapping the package to an extra and when building a raw package
|
|
1185
|
+
install command that preserves already-installed extras.
|
|
1186
|
+
|
|
1187
|
+
Returns:
|
|
1188
|
+
An `InstallHint` describing the recommended recovery action.
|
|
1189
|
+
"""
|
|
1190
|
+
extra = extra_for_package(package, distribution_name)
|
|
1191
|
+
if extra is not None:
|
|
1192
|
+
return InstallHint(extra=extra, command=None)
|
|
1193
|
+
|
|
1194
|
+
from deepagents_code.update_check import (
|
|
1195
|
+
ToolRequirementIntrospectionError,
|
|
1196
|
+
install_package_command,
|
|
1197
|
+
)
|
|
1198
|
+
|
|
1199
|
+
try:
|
|
1200
|
+
command = install_package_command(package, distribution_name=distribution_name)
|
|
1201
|
+
except (
|
|
1202
|
+
ValueError,
|
|
1203
|
+
ExtrasIntrospectionError,
|
|
1204
|
+
ToolRequirementIntrospectionError,
|
|
1205
|
+
) as exc:
|
|
1206
|
+
logger.debug(
|
|
1207
|
+
"install_package_command failed; falling back to manual hint: %s",
|
|
1208
|
+
exc,
|
|
1209
|
+
)
|
|
1210
|
+
return InstallHint(extra=None, command=None)
|
|
1211
|
+
return InstallHint(extra=None, command=command)
|
|
1212
|
+
|
|
1213
|
+
|
|
1132
1214
|
def verify_interpreter_deps() -> None:
|
|
1133
1215
|
"""Check that `langchain-quickjs` is installed for the interpreter.
|
|
1134
1216
|
|
|
@@ -16,6 +16,8 @@ from deepagents_code.hooks.models.domain import (
|
|
|
16
16
|
PermissionRequestEvent,
|
|
17
17
|
PostToolUseDecision,
|
|
18
18
|
PostToolUseEvent,
|
|
19
|
+
PreCompactDecision,
|
|
20
|
+
PreCompactEvent,
|
|
19
21
|
PreToolUseDecision,
|
|
20
22
|
PreToolUseEvent,
|
|
21
23
|
SessionEndDecision,
|
|
@@ -28,6 +30,8 @@ from deepagents_code.hooks.models.domain import (
|
|
|
28
30
|
SubagentStartEvent,
|
|
29
31
|
SubagentStopDecision,
|
|
30
32
|
SubagentStopEvent,
|
|
33
|
+
UserPromptSubmitDecision,
|
|
34
|
+
UserPromptSubmitEvent,
|
|
31
35
|
)
|
|
32
36
|
|
|
33
37
|
if TYPE_CHECKING:
|
|
@@ -52,6 +56,7 @@ class PlainOutputPolicy(StrEnum):
|
|
|
52
56
|
class ExitCodePolicy(StrEnum):
|
|
53
57
|
"""How exit code 2 is interpreted for an event."""
|
|
54
58
|
|
|
59
|
+
BLOCK = "block"
|
|
55
60
|
CONTEXT = "context"
|
|
56
61
|
DENY = "deny"
|
|
57
62
|
FEEDBACK = "feedback"
|
|
@@ -72,7 +77,7 @@ class AggregationPolicy(StrEnum):
|
|
|
72
77
|
|
|
73
78
|
DEFAULT_COMMAND_TIMEOUT_SECONDS = 600.0
|
|
74
79
|
MatcherField: TypeAlias = Literal[
|
|
75
|
-
"cause", "tool_name", "notification_type", "agent_name"
|
|
80
|
+
"cause", "tool_name", "notification_type", "agent_name", "trigger"
|
|
76
81
|
]
|
|
77
82
|
|
|
78
83
|
|
|
@@ -106,6 +111,18 @@ _HOOK_EVENT_SPECS: Final[Mapping[HookEvent, HookEventSpec]] = MappingProxyType(
|
|
|
106
111
|
aggregation_policy=AggregationPolicy.CONTEXT,
|
|
107
112
|
supported_handler_types=frozenset({HandlerType.COMMAND}),
|
|
108
113
|
),
|
|
114
|
+
HookEvent.USER_PROMPT_SUBMIT: HookEventSpec(
|
|
115
|
+
event=HookEvent.USER_PROMPT_SUBMIT,
|
|
116
|
+
owner=HookOwner.CLIENT,
|
|
117
|
+
event_model=UserPromptSubmitEvent,
|
|
118
|
+
decision_model=UserPromptSubmitDecision,
|
|
119
|
+
matcher_field=None,
|
|
120
|
+
default_timeout_seconds=30.0,
|
|
121
|
+
exit_code_policy=ExitCodePolicy.BLOCK,
|
|
122
|
+
plain_output_policy=PlainOutputPolicy.CONTEXT,
|
|
123
|
+
aggregation_policy=AggregationPolicy.CONTEXT,
|
|
124
|
+
supported_handler_types=frozenset({HandlerType.COMMAND}),
|
|
125
|
+
),
|
|
109
126
|
HookEvent.SESSION_END: HookEventSpec(
|
|
110
127
|
event=HookEvent.SESSION_END,
|
|
111
128
|
owner=HookOwner.CLIENT,
|
|
@@ -166,6 +183,18 @@ _HOOK_EVENT_SPECS: Final[Mapping[HookEvent, HookEventSpec]] = MappingProxyType(
|
|
|
166
183
|
aggregation_policy=AggregationPolicy.FEEDBACK_AND_CONTEXT,
|
|
167
184
|
supported_handler_types=frozenset({HandlerType.COMMAND}),
|
|
168
185
|
),
|
|
186
|
+
HookEvent.PRE_COMPACT: HookEventSpec(
|
|
187
|
+
event=HookEvent.PRE_COMPACT,
|
|
188
|
+
owner=HookOwner.CLIENT,
|
|
189
|
+
event_model=PreCompactEvent,
|
|
190
|
+
decision_model=PreCompactDecision,
|
|
191
|
+
matcher_field="trigger",
|
|
192
|
+
default_timeout_seconds=DEFAULT_COMMAND_TIMEOUT_SECONDS,
|
|
193
|
+
exit_code_policy=ExitCodePolicy.BLOCK,
|
|
194
|
+
plain_output_policy=PlainOutputPolicy.IGNORE,
|
|
195
|
+
aggregation_policy=AggregationPolicy.SIDE_EFFECT,
|
|
196
|
+
supported_handler_types=frozenset({HandlerType.COMMAND}),
|
|
197
|
+
),
|
|
169
198
|
HookEvent.STOP: HookEventSpec(
|
|
170
199
|
event=HookEvent.STOP,
|
|
171
200
|
owner=HookOwner.SERVER,
|
|
@@ -218,6 +247,8 @@ def get_event_spec(event: HookEvent) -> HookEventSpec:
|
|
|
218
247
|
match event:
|
|
219
248
|
case HookEvent.SESSION_START:
|
|
220
249
|
return _HOOK_EVENT_SPECS[HookEvent.SESSION_START]
|
|
250
|
+
case HookEvent.USER_PROMPT_SUBMIT:
|
|
251
|
+
return _HOOK_EVENT_SPECS[HookEvent.USER_PROMPT_SUBMIT]
|
|
221
252
|
case HookEvent.SESSION_END:
|
|
222
253
|
return _HOOK_EVENT_SPECS[HookEvent.SESSION_END]
|
|
223
254
|
case HookEvent.PERMISSION_REQUEST:
|
|
@@ -228,6 +259,8 @@ def get_event_spec(event: HookEvent) -> HookEventSpec:
|
|
|
228
259
|
return _HOOK_EVENT_SPECS[HookEvent.PRE_TOOL_USE]
|
|
229
260
|
case HookEvent.POST_TOOL_USE:
|
|
230
261
|
return _HOOK_EVENT_SPECS[HookEvent.POST_TOOL_USE]
|
|
262
|
+
case HookEvent.PRE_COMPACT:
|
|
263
|
+
return _HOOK_EVENT_SPECS[HookEvent.PRE_COMPACT]
|
|
231
264
|
case HookEvent.STOP:
|
|
232
265
|
return _HOOK_EVENT_SPECS[HookEvent.STOP]
|
|
233
266
|
case HookEvent.SUBAGENT_START:
|
|
@@ -10,6 +10,10 @@ from deepagents_code.config_manifest import _is_secret_env
|
|
|
10
10
|
if TYPE_CHECKING:
|
|
11
11
|
from collections.abc import Mapping
|
|
12
12
|
|
|
13
|
+
# Shared bound for legacy hook subprocesses and the migration adapter's nested
|
|
14
|
+
# `subprocess.run`. Keep the legacy dispatcher and Hooks v2 migration aligned.
|
|
15
|
+
HOOK_SUBPROCESS_TIMEOUT = 5.0
|
|
16
|
+
|
|
13
17
|
|
|
14
18
|
def sanitize_hook_environ(
|
|
15
19
|
source: Mapping[str, str] | None = None,
|
|
@@ -82,6 +82,8 @@ import subprocess # ruff:ignore[suspicious-subprocess-import]
|
|
|
82
82
|
from concurrent.futures import ThreadPoolExecutor
|
|
83
83
|
from typing import TYPE_CHECKING, Any
|
|
84
84
|
|
|
85
|
+
from deepagents_code.hooks.env import HOOK_SUBPROCESS_TIMEOUT
|
|
86
|
+
|
|
85
87
|
if TYPE_CHECKING:
|
|
86
88
|
from collections.abc import Mapping
|
|
87
89
|
|
|
@@ -101,7 +103,6 @@ that act on the arguments (e.g. a linter reading a `write_file` `content`) see
|
|
|
101
103
|
the exact value the tool received.
|
|
102
104
|
"""
|
|
103
105
|
|
|
104
|
-
HOOK_SUBPROCESS_TIMEOUT = 5
|
|
105
106
|
"""Seconds a single hook subprocess may run before it is killed.
|
|
106
107
|
|
|
107
108
|
Bounds how long one misbehaving hook can block the dispatch thread. Consumed in
|
|
@@ -172,7 +172,9 @@ def canonical_hooks_bytes(config: HooksConfig) -> bytes:
|
|
|
172
172
|
|
|
173
173
|
|
|
174
174
|
def _canonical_group(group: MatcherGroup) -> dict[str, object]:
|
|
175
|
-
raw = group.model_dump(
|
|
175
|
+
raw = group.model_dump(
|
|
176
|
+
mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
|
|
177
|
+
)
|
|
176
178
|
handlers: list[dict[str, object]] = []
|
|
177
179
|
hooks_raw = raw.get("hooks")
|
|
178
180
|
if isinstance(hooks_raw, list):
|
|
@@ -226,8 +228,8 @@ def _read_hooks_document(
|
|
|
226
228
|
]
|
|
227
229
|
migrated = migrate_legacy_hooks(legacy_entries)
|
|
228
230
|
migration_message = (
|
|
229
|
-
f"Migrated semantically equivalent
|
|
230
|
-
"
|
|
231
|
+
f"Migrated semantically equivalent legacy hooks from {path}; "
|
|
232
|
+
"unsupported legacy events remain unmapped"
|
|
231
233
|
if migrated.hooks
|
|
232
234
|
else (
|
|
233
235
|
f"Legacy hooks at {path} contained no events that are safe to "
|