deepagents-code 0.2.0__tar.gz → 0.2.1__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.2.0 → deepagents_code-0.2.1}/CHANGELOG.md +12 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/PKG-INFO +3 -3
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_build_info.py +1 -1
- deepagents_code-0.2.1/deepagents_code/_session_lock.py +184 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/agent.py +40 -5
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/app.py +1 -1
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/auto_mode.py +12 -7
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/launch/_server_bootstrap.py +6 -1
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/launch/server.py +7 -2
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/config.py +1 -1
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/main.py +82 -21
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_tools.py +11 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/adapters/skills_middleware.py +4 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/update_check.py +30 -5
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/pyproject.toml +3 -3
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_server_owner_lifetime.py +4 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/conftest.py +22 -0
- deepagents_code-0.2.1/tests/unit_tests/skills/test_skill_tools.py +244 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_auto_mode.py +32 -9
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_main.py +81 -6
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_tools.py +36 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_server_pipe.py +31 -2
- deepagents_code-0.2.1/tests/unit_tests/test_session_lock.py +114 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_update_check.py +13 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/uv.lock +14 -14
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/.gitignore +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/AGENTS.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/ARCHITECTURE.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/COMMANDS.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/DEVELOPMENT.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/EXTENSIONS.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/HOOKS.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/LICENSE +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/Makefile +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/PRICING.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/README.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/THREAT_MODEL.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_async.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_content_blocks.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_debug_buffer.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_dep_floor_check.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_env_vars.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_fake_models.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_glm_5p2_profile.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_home_error.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_invocation.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_js_cost.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_markdown.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_paths.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_repository_bounds.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_reserved_names.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_server_config.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_terminal_stderr.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_tool_free.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_tool_stream.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_tracing.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/acp.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/approval_mode.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/btw.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/btw_api.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/btw_cost.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/built_in_skills/deepagents-plugin-discovery/SKILL.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/bundled_prices.README.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/bundled_prices.json +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/commands/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/commands/auth.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/commands/config.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/commands/extras.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/commands/mcp.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/commands/tools.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/headless_resume.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/launch/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/launch/server_manager.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/non_interactive.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/remote_client.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/session_cost.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/cold_cache.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/command_registry.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/config_manifest.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configurable_model.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/interpreter.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/paths.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/provider.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/providers.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/resolver.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/service.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/theme_resolution.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/types.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/writer.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/context_doctor.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/cost_tracking.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/diff_utils.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/doctor.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/api.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/discovery.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/hosting.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/loader.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/registry.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/runtime.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/settings.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/trust.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extras_info.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/goal_rubric.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/goal_state_limits.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/goal_state_notice.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/goal_tools.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/capabilities.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/client.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/client_lifecycle.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/context.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/engine.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/env.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/envelope.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/interrupt.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/legacy.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/loading.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/manager.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/migration.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/models/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/models/adapters.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/models/config.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/models/domain.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/models/transport.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/models/wire.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/permissions.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/presenter.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/projection.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/reducer.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/runner.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/runtime.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/server_middleware.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/snapshot.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/tools.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/transcript.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/trust.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/input.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/integrations/sandbox_factory.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/json_types.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/managed_tools.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_auth.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_config.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_middleware.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_proxy.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/model_api.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/model_catalog.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/model_config.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/model_metadata.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/model_retry.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/offload.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/offload_api.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/offload_middleware.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/output.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/paste_collapse.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/_json.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/adapters/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/adapters/hooks.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/adapters/mcp.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/adapters/skills.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/commands_cli.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/discovery.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/manifest.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/marketplace.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/models.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/store.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/substitution.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/reasoning_effort.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/reliable_rubric.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/resume_policy.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/server_graph.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/sessions.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/skills/load_errors.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/skills/merge.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/skills/trust.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/system_prompt.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/terminal_title.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/thread_ownership.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/thread_titles.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tool_catalog.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/key_hints.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/_cost_breakdown.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/btw.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/btw.tcss +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/cold_cache.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/cost_breakdown.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/mcp_servers.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/mcp_servers.tcss +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/model_switch.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/prompt_clipboard.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/prompt_clipboard.tcss +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/resume_blocked.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/resume_compact.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/session_cost.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/session_cost.tcss +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/thread_name.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/thread_name.tcss +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/screens/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/textual_adapter.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/_condense_path.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/_links.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/agent_selector.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/approval.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/ask_user.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/auth.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/autocomplete.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/chat_input.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/codex_auth.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/context_usage.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/debug_console.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/diff.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/effort_selector.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/goal_review.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/goal_status.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/history.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/install_confirm.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/launch_init.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/loading.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/mcp_login.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/message_store.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/messages.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/model_selector.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/notification_center.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/notification_detail.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/notification_settings.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/prompt_search.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/skill_trust.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/startup_tip.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/status.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/theme_selector.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/thread_selector.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/update_available.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/update_confirm.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/update_progress.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/welcome.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/ui.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/workspace.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/workspace_diagnostics.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/examples/extensions/memory_store.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/hatch_build.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/images/debug-console-cost-breakdown.png +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/images/model-stream-retry.png +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/images/tui.png +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/scripts/check_imports.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/scripts/check_process_cwd.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/scripts/install.sh +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/README.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/benchmarks/test_thread_loading_benchmarks.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_auto_approve_remote.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_headless_resume.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_offload_server_side.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_pending_work_recovery.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/client/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/client/commands/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/client/commands/test_auth.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/client/commands/test_extras.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/client/commands/test_mcp.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/client/commands/test_tools.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/models/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/models/test_models.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_configuration.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_engine.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_execution.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_manager.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_presenter.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_server_lifecycle.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_transcript.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_trust.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/plugins/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/plugins/test_marketplace.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/skills/test_merge.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/skills/test_pinned_skills.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/skills/test_skill_trust.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/smoke_tests/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/smoke_tests/conftest.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/smoke_tests/snapshots/system_prompt_headless_local.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test__tool_stream.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_acp.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_agent.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_agent_mcp_timeout.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_app.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_app_thread_ownership.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_approval_mode.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_args.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_ask_user_types.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_btw.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_btw_api.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_cache_expiry.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_cli_provider.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_cold_cache.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_config.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_config_manifest.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_configuration.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_configuration_resolution.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_configuration_resolver.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_context_doctor.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_cost_breakdown.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_cost_tracking.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_cursor_style.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_debug_buffer.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_debug_console.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_dep_floor_check.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_diff_utils.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_doctor.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extension_api.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extension_cli_trust.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extension_config_manifest.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extension_discovery.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extension_display.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extension_host_runtime.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extension_hosting.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extension_runtime.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extra_skills_dirs.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_fork_goal_notice.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_goal_criteria_client.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_goal_rubric.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_goal_state_limits.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_goal_state_notice.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_goal_state_persistence.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_goal_tools.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_groq_tool_limit.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_hatch_build.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_headless_resume.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_idle_compaction.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_install_command.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_install_script.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_interpreter_workspace_policy.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_invocation.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_js_cost_sync.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_js_cost_tracking.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_json_types.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_managed_tools.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_config.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_lifecycle.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_middleware.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_proxy.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_schema.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_model_catalog.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_model_config.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_model_metadata.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_model_retry.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_offload_api.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_paths.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_process_cwd_check.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_python_migration_bridge.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_reasoning_effort.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_reliable_rubric.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_repository_bounds.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_resume_compaction_recovery.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_resume_workspace_errors.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_rubric_cli.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_sandbox_registry.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_server.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_server_tracing.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_terminal_stderr.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_terminal_title.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_text_encoding.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_thread_naming_app.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_thread_ownership.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_thread_ownership_transitions.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_thread_titles.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_threads_resume.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_tool_catalog.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_tracing.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_tracing_replicas.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_transcript_virtualization.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_uninstall_command.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_workspace.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_workspace_diagnostics.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tools/test_web_search.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/plugin_manager/test_inspection.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/test_cold_cache.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/test_model_switch.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/test_prompt_clipboard.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/test_resume_blocked.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/test_session_cost.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/test_key_hints.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/test_modal_footer_layout.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_condense_path.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_history.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_links.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_prompt_search.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_status.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
- {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.2.1](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.2.0...deepagents-code==0.2.1) (2026-10-23)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- Support skill-scoped MCP tools ([#7010](https://github.com/langchain-ai/deepagents/pull/7010)).
|
|
10
|
+
- Default the Anthropic Auto classifier to Claude Sonnet 5.5 ([#7163](https://github.com/langchain-ai/deepagents/pull/7163)).
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
- Automatically migrate to Python 3.14 when no other session is running ([#7160](https://github.com/langchain-ai/deepagents/pull/7160)).
|
|
15
|
+
- Use native structured output for the Anthropic Auto classifier ([#7162](https://github.com/langchain-ai/deepagents/pull/7162)).
|
|
16
|
+
|
|
5
17
|
## [0.2.0](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.88...deepagents-code==0.2.0) (2026-10-22)
|
|
6
18
|
|
|
7
19
|
### ⚠ BREAKING CHANGES
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.1
|
|
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://www.langchain.com/dcode
|
|
6
6
|
Project-URL: Documentation, https://docs.langchain.com/oss/deepagents/code/overview
|
|
@@ -28,7 +28,7 @@ Requires-Python: <3.15,>=3.14
|
|
|
28
28
|
Requires-Dist: aiosqlite>=0.22.1
|
|
29
29
|
Requires-Dist: anyio>=4.14.2
|
|
30
30
|
Requires-Dist: deepagents-acp<1.0.0,>=0.0.10
|
|
31
|
-
Requires-Dist: deepagents==0.7.
|
|
31
|
+
Requires-Dist: deepagents==0.7.31
|
|
32
32
|
Requires-Dist: fastmcp>=4.0.0b4
|
|
33
33
|
Requires-Dist: filelock<3.30,>=3.29.7
|
|
34
34
|
Requires-Dist: genai-prices<0.2.0,>=0.1.13
|
|
@@ -40,7 +40,7 @@ Requires-Dist: langchain-quickjs<0.4.0,>=0.3.4
|
|
|
40
40
|
Requires-Dist: langchain<2.0.0,>=1.4.7
|
|
41
41
|
Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.2
|
|
42
42
|
Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.37
|
|
43
|
-
Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.36.
|
|
43
|
+
Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.36.5
|
|
44
44
|
Requires-Dist: langgraph-sdk<1.0.0,>=0.4.8
|
|
45
45
|
Requires-Dist: langsmith[sandbox]>=0.14.12
|
|
46
46
|
Requires-Dist: markdownify>=1.2.3
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"""Presence lock telling a launch whether other dcode sessions share its install.
|
|
2
|
+
|
|
3
|
+
A Python migration rebuilds the uv tool environment, which breaks every dcode
|
|
4
|
+
process — and every server it spawned — still running from the old one. Startup
|
|
5
|
+
auto-update may only migrate when no other session uses the installation, and
|
|
6
|
+
it cannot tell that from a process listing: shims, renamed symlinks, and the
|
|
7
|
+
server bootstrap all run under different names.
|
|
8
|
+
|
|
9
|
+
Instead, each dcode process of a non-editable install (editable installs never
|
|
10
|
+
auto-update) holds a shared `flock` on `SESSION_LOCK_FILE` for its lifetime,
|
|
11
|
+
and hands the descriptor to the servers it spawns so they hold
|
|
12
|
+
the same lock. A process asking "am I alone?" tries to take the lock
|
|
13
|
+
exclusively; that succeeds only when no other session's open file holds it.
|
|
14
|
+
The kernel drops a lock when its last descriptor closes, so a crashed session
|
|
15
|
+
can never leave a stale claim behind.
|
|
16
|
+
|
|
17
|
+
The answer is a snapshot. It cannot see sessions of versions from before this
|
|
18
|
+
lock existed, and nothing stops a session that launches while the migration
|
|
19
|
+
runs; both are accepted as rare and recoverable by a relaunch.
|
|
20
|
+
|
|
21
|
+
POSIX only. On Windows, or whenever the lock cannot be taken, a process is
|
|
22
|
+
never reported as alone, so the migration stays deferred to `dcode update`.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
import logging
|
|
28
|
+
import os
|
|
29
|
+
import sys
|
|
30
|
+
from typing import TYPE_CHECKING
|
|
31
|
+
|
|
32
|
+
from deepagents_code._paths import PATHS
|
|
33
|
+
|
|
34
|
+
if sys.platform != "win32":
|
|
35
|
+
import fcntl
|
|
36
|
+
|
|
37
|
+
if TYPE_CHECKING:
|
|
38
|
+
from pathlib import Path
|
|
39
|
+
|
|
40
|
+
logger = logging.getLogger(__name__)
|
|
41
|
+
|
|
42
|
+
SESSION_LOCK_FILE: Path = PATHS.installation.locks_dir / "sessions.lock"
|
|
43
|
+
"""Advisory lock held shared by every registered dcode process of one installation.
|
|
44
|
+
|
|
45
|
+
Lives beside `update.lock`, outside the tool environment, so a migration that
|
|
46
|
+
rebuilds the environment keeps the same file. Carries no data.
|
|
47
|
+
|
|
48
|
+
Installation-scoped only, with no per-profile fallback: a profile-scoped lock
|
|
49
|
+
would hide sessions of other profiles, and over-reporting "alone" is the one
|
|
50
|
+
failure this lock must not have.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
_held_fd: int | None = None
|
|
54
|
+
"""Descriptor holding this process's shared lock, or `None` when not held."""
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def hold_session_lock() -> None:
|
|
58
|
+
"""Register this process as a running session for its lifetime.
|
|
59
|
+
|
|
60
|
+
Idempotent and fail-soft: when the lock cannot be taken, the process runs
|
|
61
|
+
unregistered and `is_sole_session` reports `False`. The descriptor is
|
|
62
|
+
non-inheritable, so the re-exec after an update drops it and the new
|
|
63
|
+
process registers itself again.
|
|
64
|
+
"""
|
|
65
|
+
global _held_fd # noqa: PLW0603 # one registration per process
|
|
66
|
+
if _held_fd is not None or sys.platform == "win32":
|
|
67
|
+
return
|
|
68
|
+
try:
|
|
69
|
+
SESSION_LOCK_FILE.parent.mkdir(mode=0o700, parents=True, exist_ok=True)
|
|
70
|
+
fd = os.open(SESSION_LOCK_FILE, os.O_RDWR | os.O_CREAT, 0o600)
|
|
71
|
+
except OSError:
|
|
72
|
+
logger.warning(
|
|
73
|
+
"Could not open session lock %s", SESSION_LOCK_FILE, exc_info=True
|
|
74
|
+
)
|
|
75
|
+
return
|
|
76
|
+
try:
|
|
77
|
+
# Blocks only while another process is inside `is_sole_session`, the
|
|
78
|
+
# one place the lock is ever held exclusively, and only for an instant.
|
|
79
|
+
# Failing fast instead would leave this session invisible to that check.
|
|
80
|
+
fcntl.flock(fd, fcntl.LOCK_SH)
|
|
81
|
+
except OSError:
|
|
82
|
+
logger.warning(
|
|
83
|
+
"Could not take session lock %s", SESSION_LOCK_FILE, exc_info=True
|
|
84
|
+
)
|
|
85
|
+
os.close(fd)
|
|
86
|
+
return
|
|
87
|
+
_held_fd = fd
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def session_lock_fds() -> tuple[int, ...]:
|
|
91
|
+
"""Return descriptors a spawned server must inherit to count as this session.
|
|
92
|
+
|
|
93
|
+
`flock` locks belong to the open file description, so a child given the
|
|
94
|
+
descriptor holds the same lock: the server keeps the install marked in use
|
|
95
|
+
if it outlives its client, and does not count as a second session.
|
|
96
|
+
"""
|
|
97
|
+
return () if _held_fd is None else (_held_fd,)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def session_lock_unavailable() -> bool:
|
|
101
|
+
"""Return whether this POSIX process failed to register as a session.
|
|
102
|
+
|
|
103
|
+
Lets callers tell "other sessions are running" apart from "presence cannot
|
|
104
|
+
be known", which quitting other sessions would never fix.
|
|
105
|
+
"""
|
|
106
|
+
return sys.platform != "win32" and _held_fd is None
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def is_sole_session() -> bool:
|
|
110
|
+
"""Return whether no other dcode session holds this installation.
|
|
111
|
+
|
|
112
|
+
Converting a `flock` is not atomic: the shared lock is released before the
|
|
113
|
+
exclusive one is tried, so two processes checking at once could each see
|
|
114
|
+
the other as absent. An exclusive lock on `sessions.check.lock` beside
|
|
115
|
+
`SESSION_LOCK_FILE` admits one checker at a time; a process that finds it
|
|
116
|
+
taken is not alone.
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
`True` only when this process holds the session lock and could take
|
|
120
|
+
it exclusively. `False` when another session holds it, or when the
|
|
121
|
+
lock is unavailable and presence cannot be known.
|
|
122
|
+
"""
|
|
123
|
+
if _held_fd is None:
|
|
124
|
+
return False
|
|
125
|
+
check_file = SESSION_LOCK_FILE.with_name("sessions.check.lock")
|
|
126
|
+
try:
|
|
127
|
+
guard = os.open(check_file, os.O_RDWR | os.O_CREAT, 0o600)
|
|
128
|
+
except OSError:
|
|
129
|
+
logger.warning("Could not open %s", check_file, exc_info=True)
|
|
130
|
+
return False
|
|
131
|
+
try:
|
|
132
|
+
fcntl.flock(guard, fcntl.LOCK_EX | fcntl.LOCK_NB)
|
|
133
|
+
except OSError:
|
|
134
|
+
return False
|
|
135
|
+
else:
|
|
136
|
+
return _probe_exclusive(_held_fd)
|
|
137
|
+
finally:
|
|
138
|
+
os.close(guard)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _probe_exclusive(fd: int) -> bool:
|
|
142
|
+
"""Try to take the session lock exclusively, then hold it shared again.
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
Whether the exclusive attempt succeeded and the shared lock is back.
|
|
146
|
+
"""
|
|
147
|
+
try:
|
|
148
|
+
fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
|
|
149
|
+
except BlockingIOError:
|
|
150
|
+
sole = False
|
|
151
|
+
except OSError:
|
|
152
|
+
logger.warning(
|
|
153
|
+
"Could not check session lock %s", SESSION_LOCK_FILE, exc_info=True
|
|
154
|
+
)
|
|
155
|
+
sole = False
|
|
156
|
+
else:
|
|
157
|
+
sole = True
|
|
158
|
+
# Re-take it on both branches: on Linux a failed upgrade attempt has already
|
|
159
|
+
# released the shared lock.
|
|
160
|
+
return _restore_shared(fd) and sole
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _restore_shared(fd: int) -> bool:
|
|
164
|
+
"""Hold the session lock shared again, or unregister on failure.
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
Whether this process is still registered.
|
|
168
|
+
"""
|
|
169
|
+
global _held_fd # noqa: PLW0603 # unregister a lock this process lost
|
|
170
|
+
try:
|
|
171
|
+
# Blocking is safe: the check lock is held, so no other process holds
|
|
172
|
+
# this lock exclusively.
|
|
173
|
+
fcntl.flock(fd, fcntl.LOCK_SH)
|
|
174
|
+
except OSError:
|
|
175
|
+
logger.warning(
|
|
176
|
+
"Could not restore the shared session lock %s; other dcode sessions "
|
|
177
|
+
"will not see this one",
|
|
178
|
+
SESSION_LOCK_FILE,
|
|
179
|
+
exc_info=True,
|
|
180
|
+
)
|
|
181
|
+
_held_fd = None
|
|
182
|
+
os.close(fd)
|
|
183
|
+
return False
|
|
184
|
+
return True
|
|
@@ -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.2.
|
|
5
|
+
__version__ = "0.2.1" # 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."""
|
|
@@ -2772,6 +2772,28 @@ def create_cli_agent(
|
|
|
2772
2772
|
):
|
|
2773
2773
|
extension_registry = None
|
|
2774
2774
|
mcp_tools = tuple(mcp_tools or ())
|
|
2775
|
+
skill_tools = tuple(
|
|
2776
|
+
item
|
|
2777
|
+
for item in mcp_tools
|
|
2778
|
+
if (item.metadata or {}).get("_deepagents_code_skill_only") is True
|
|
2779
|
+
)
|
|
2780
|
+
skill_tool_ids = {id(item) for item in skill_tools}
|
|
2781
|
+
tools = [item for item in tools if id(item) not in skill_tool_ids]
|
|
2782
|
+
if skill_tools and mcp_server_info:
|
|
2783
|
+
skill_tool_names = {item.name for item in skill_tools}
|
|
2784
|
+
mcp_server_info = [
|
|
2785
|
+
replace(
|
|
2786
|
+
server,
|
|
2787
|
+
tools=tuple(
|
|
2788
|
+
item for item in server.tools if item.name not in skill_tool_names
|
|
2789
|
+
),
|
|
2790
|
+
)
|
|
2791
|
+
for server in mcp_server_info
|
|
2792
|
+
]
|
|
2793
|
+
if skill_tools and not enable_skills:
|
|
2794
|
+
logger.warning(
|
|
2795
|
+
"Skill-only MCP tools are unavailable because skills are disabled"
|
|
2796
|
+
)
|
|
2775
2797
|
if auto_mode_enabled and sandbox is not None:
|
|
2776
2798
|
logger.warning(
|
|
2777
2799
|
"Classifier-backed Auto is unavailable with a sandbox; using Manual HITL"
|
|
@@ -2792,6 +2814,12 @@ def create_cli_agent(
|
|
|
2792
2814
|
# Base instructions are loaded fresh from get_system_prompt()
|
|
2793
2815
|
agent_md.touch()
|
|
2794
2816
|
|
|
2817
|
+
skill_sources = (
|
|
2818
|
+
get_skill_sources(assistant_id=assistant_id, project_context=project_context)
|
|
2819
|
+
if enable_skills
|
|
2820
|
+
else []
|
|
2821
|
+
)
|
|
2822
|
+
|
|
2795
2823
|
# Load custom subagents from filesystem
|
|
2796
2824
|
custom_subagents: list[SubAgent | CompiledSubAgent] = []
|
|
2797
2825
|
resolved_shell_allow_list = _resolve_shell_allow_list()
|
|
@@ -2892,6 +2920,16 @@ def create_cli_agent(
|
|
|
2892
2920
|
middleware.append(
|
|
2893
2921
|
ManagedMemoryGuardMiddleware([get_user_agent_md_path(assistant_id)])
|
|
2894
2922
|
)
|
|
2923
|
+
if enable_skills and skill_tools:
|
|
2924
|
+
middleware.insert(
|
|
2925
|
+
0,
|
|
2926
|
+
PluginSkillsMiddleware(
|
|
2927
|
+
backend=FilesystemBackend(virtual_mode=False),
|
|
2928
|
+
sources=skill_sources,
|
|
2929
|
+
path_base=effective_cwd,
|
|
2930
|
+
tools=skill_tools,
|
|
2931
|
+
),
|
|
2932
|
+
)
|
|
2895
2933
|
return middleware
|
|
2896
2934
|
|
|
2897
2935
|
from deepagents_code._cli_context import INHERIT_CLASSIFIER_MODEL
|
|
@@ -3097,14 +3135,11 @@ def create_cli_agent(
|
|
|
3097
3135
|
|
|
3098
3136
|
# Add skills middleware
|
|
3099
3137
|
if enable_skills:
|
|
3100
|
-
sources = get_skill_sources(
|
|
3101
|
-
assistant_id=assistant_id,
|
|
3102
|
-
project_context=project_context,
|
|
3103
|
-
)
|
|
3104
3138
|
skills_middleware = PluginSkillsMiddleware(
|
|
3105
3139
|
backend=FilesystemBackend(virtual_mode=False),
|
|
3106
|
-
sources=
|
|
3140
|
+
sources=skill_sources,
|
|
3107
3141
|
path_base=effective_cwd,
|
|
3142
|
+
tools=skill_tools,
|
|
3108
3143
|
)
|
|
3109
3144
|
agent_middleware.append(skills_middleware)
|
|
3110
3145
|
instruction_middleware.append(skills_middleware)
|
|
@@ -243,7 +243,7 @@ _DEFERRED_START_NOTICE = (
|
|
|
243
243
|
|
|
244
244
|
_AUTO_CLASSIFIER_RECOMMENDED_MODELS = {
|
|
245
245
|
"anthropic:claude-haiku-5-5": "Claude Haiku 5.5",
|
|
246
|
-
"anthropic:claude-sonnet-5": "Claude Sonnet 5",
|
|
246
|
+
"anthropic:claude-sonnet-5-5": "Claude Sonnet 5.5",
|
|
247
247
|
"google_genai:gemini-3.8-flash": "Gemini 3.8 Flash",
|
|
248
248
|
"openai:gpt-6-luna": "GPT-6 Luna",
|
|
249
249
|
}
|
|
@@ -2864,8 +2864,7 @@ class AutoModeHITLMiddleware(HumanInTheLoopMiddleware[AutoModeState, Any, Any]):
|
|
|
2864
2864
|
selected,
|
|
2865
2865
|
# Classifier history never replays thinking blocks,
|
|
2866
2866
|
# so the Anthropic preserved-thinking binding would only
|
|
2867
|
-
#
|
|
2868
|
-
# relies on.
|
|
2867
|
+
# add latency and cost to every review.
|
|
2869
2868
|
bind_preserved_thinking=False,
|
|
2870
2869
|
**retry_kwargs,
|
|
2871
2870
|
)
|
|
@@ -3089,12 +3088,18 @@ class AutoModeHITLMiddleware(HumanInTheLoopMiddleware[AutoModeState, Any, Any]):
|
|
|
3089
3088
|
timeout_cm = asyncio.timeout(self._classifier_timeout_seconds)
|
|
3090
3089
|
try:
|
|
3091
3090
|
async with timeout_cm:
|
|
3092
|
-
|
|
3091
|
+
# Anthropic's native structured output constrains decoding to
|
|
3092
|
+
# the schema. Forced tool calling only suggests it, and Claude
|
|
3093
|
+
# intermittently wraps a valid verdict list in a JSON string or
|
|
3094
|
+
# a placeholder key, which strict validation rejects and the
|
|
3095
|
+
# fail-closed path turns into a denied batch. Models without
|
|
3096
|
+
# native support (Claude 4.1 and earlier) reject the request
|
|
3097
|
+
# outright, so they keep forced tool calling.
|
|
3098
|
+
profile = getattr(model, "profile", None)
|
|
3093
3099
|
if (
|
|
3094
|
-
|
|
3095
|
-
and
|
|
3096
|
-
and
|
|
3097
|
-
and thinking.get("type") in {"adaptive", "enabled"}
|
|
3100
|
+
getattr(model, "_llm_type", None) == "anthropic-chat"
|
|
3101
|
+
and isinstance(profile, dict)
|
|
3102
|
+
and profile.get("structured_output") is True
|
|
3098
3103
|
):
|
|
3099
3104
|
structured = model.with_structured_output(
|
|
3100
3105
|
_ClassifierBatch, method="json_schema"
|
{deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/launch/_server_bootstrap.py
RENAMED
|
@@ -76,7 +76,12 @@ class _ParentGuard:
|
|
|
76
76
|
|
|
77
77
|
|
|
78
78
|
def _main() -> None:
|
|
79
|
-
|
|
79
|
+
reader, *held = (int(fd) for fd in sys.argv[1].split(","))
|
|
80
|
+
for fd in held:
|
|
81
|
+
# Keep the session lock in this process only, so a long-lived
|
|
82
|
+
# grandchild cannot hold the install in use after the server exits.
|
|
83
|
+
os.set_inheritable(fd, False)
|
|
84
|
+
guard = _ParentGuard(reader, float(sys.argv[2]))
|
|
80
85
|
guard.start()
|
|
81
86
|
if not guard.begin_dispatch():
|
|
82
87
|
return
|
|
@@ -1039,17 +1039,22 @@ class ServerProcess:
|
|
|
1039
1039
|
creationflags=_WINDOWS_CREATE_NEW_PROCESS_GROUP,
|
|
1040
1040
|
)
|
|
1041
1041
|
|
|
1042
|
+
from deepagents_code._session_lock import session_lock_fds
|
|
1043
|
+
|
|
1042
1044
|
reader, writer = os.pipe() # Both ends are non-inheritable by default.
|
|
1043
1045
|
self._parent_pipe_writer = writer
|
|
1044
1046
|
# Abandoning the manager must not leak its writer. Explicit teardown
|
|
1045
1047
|
# invokes this same finalizer so a reused descriptor is never closed twice.
|
|
1046
1048
|
self._parent_pipe_finalizer = weakref.finalize(self, os.close, writer)
|
|
1049
|
+
# The session lock keeps the install marked in use while the server
|
|
1050
|
+
# runs, so a migration does not rebuild it underneath.
|
|
1051
|
+
inherited = (reader, *session_lock_fds())
|
|
1047
1052
|
try:
|
|
1048
1053
|
return subprocess.Popen( # noqa: S603 # argv is built internally
|
|
1049
1054
|
[
|
|
1050
1055
|
*cmd[:2],
|
|
1051
1056
|
"deepagents_code.client.launch._server_bootstrap",
|
|
1052
|
-
str
|
|
1057
|
+
",".join(map(str, inherited)),
|
|
1053
1058
|
str(_SHUTDOWN_TIMEOUT),
|
|
1054
1059
|
*cmd[3:],
|
|
1055
1060
|
],
|
|
@@ -1059,7 +1064,7 @@ class ServerProcess:
|
|
|
1059
1064
|
stderr=subprocess.STDOUT,
|
|
1060
1065
|
start_new_session=True,
|
|
1061
1066
|
creationflags=0,
|
|
1062
|
-
pass_fds=
|
|
1067
|
+
pass_fds=inherited,
|
|
1063
1068
|
)
|
|
1064
1069
|
finally:
|
|
1065
1070
|
os.close(reader)
|
|
@@ -4685,7 +4685,7 @@ def resolve_auto_classifier_model_with_problem() -> tuple[str | None, str | None
|
|
|
4685
4685
|
|
|
4686
4686
|
|
|
4687
4687
|
_DEFAULT_AUTO_CLASSIFIER_MODELS = {
|
|
4688
|
-
"anthropic": "anthropic:claude-sonnet-5",
|
|
4688
|
+
"anthropic": "anthropic:claude-sonnet-5-5",
|
|
4689
4689
|
"google_genai": "google_genai:gemini-3.8-flash",
|
|
4690
4690
|
"google_vertexai": "google_vertexai:gemini-3.8-flash",
|
|
4691
4691
|
"openai": "openai:gpt-5.6-luna",
|
|
@@ -52,6 +52,11 @@ _UNPERSISTED_AUTO_UPDATE_FAILURE_NOTE = (
|
|
|
52
52
|
"\n[yellow]Note:[/yellow] this failure could not be recorded, so dcode will "
|
|
53
53
|
"retry this update on the next launch until the state directory becomes writable."
|
|
54
54
|
)
|
|
55
|
+
_UNPERSISTED_AUTO_UPDATE_DEFERRAL_NOTE = (
|
|
56
|
+
"\n[yellow]Note:[/yellow] this deferral could not be recorded, so dcode will "
|
|
57
|
+
"announce this update again on the next launch until the state directory "
|
|
58
|
+
"becomes writable."
|
|
59
|
+
)
|
|
55
60
|
|
|
56
61
|
|
|
57
62
|
class _TrustAction(Enum):
|
|
@@ -457,6 +462,27 @@ def _confirm_update_after_restart(console: Console, version: str) -> None:
|
|
|
457
462
|
console.print(f"[green]Updated to v{version}.[/green]", highlight=False)
|
|
458
463
|
|
|
459
464
|
|
|
465
|
+
def _session_lock_unavailable_note() -> str:
|
|
466
|
+
"""Explain a migration deferral that quitting other sessions cannot fix.
|
|
467
|
+
|
|
468
|
+
Returns:
|
|
469
|
+
A line ending in a newline, or an empty string when the session lock
|
|
470
|
+
works and the deferral notice alone is accurate.
|
|
471
|
+
"""
|
|
472
|
+
from deepagents_code._session_lock import (
|
|
473
|
+
SESSION_LOCK_FILE,
|
|
474
|
+
session_lock_unavailable,
|
|
475
|
+
)
|
|
476
|
+
|
|
477
|
+
if not session_lock_unavailable():
|
|
478
|
+
return ""
|
|
479
|
+
return (
|
|
480
|
+
f"dcode could not lock {SESSION_LOCK_FILE}, so it cannot tell whether "
|
|
481
|
+
"other sessions are running and will not migrate on its own. Run "
|
|
482
|
+
"`dcode update` instead.\n"
|
|
483
|
+
)
|
|
484
|
+
|
|
485
|
+
|
|
460
486
|
def _mark_startup_auto_update_failed_safe(version: str) -> None:
|
|
461
487
|
"""Record the auto-update cooldown for *version*, never raising.
|
|
462
488
|
|
|
@@ -622,10 +648,12 @@ def _run_startup_auto_update(console: Console) -> None:
|
|
|
622
648
|
is_update_check_enabled,
|
|
623
649
|
mark_auto_update_default_acknowledged,
|
|
624
650
|
mark_startup_auto_update_failed,
|
|
651
|
+
migration_deferral_message,
|
|
625
652
|
perform_upgrade,
|
|
626
653
|
release_requires_prereleases,
|
|
627
654
|
should_announce_auto_update_default,
|
|
628
655
|
should_skip_startup_auto_update_after_failure,
|
|
656
|
+
startup_auto_update_was_deferred,
|
|
629
657
|
update_install_lock,
|
|
630
658
|
upgrade_command,
|
|
631
659
|
)
|
|
@@ -687,12 +715,15 @@ def _run_startup_auto_update(console: Console) -> None:
|
|
|
687
715
|
highlight=False,
|
|
688
716
|
)
|
|
689
717
|
return
|
|
718
|
+
# A deferred migration is retried as soon as no other session is
|
|
719
|
+
# running; the install lock section decides between migrating and
|
|
720
|
+
# repeating the deferral.
|
|
721
|
+
retrying_deferral = startup_auto_update_was_deferred(latest)
|
|
690
722
|
if should_skip_startup_auto_update_after_failure(latest):
|
|
691
|
-
# A same-version upgrade failed
|
|
692
|
-
#
|
|
693
|
-
#
|
|
694
|
-
#
|
|
695
|
-
# handles a Python migration that startup deferred.
|
|
723
|
+
# A same-version upgrade failed recently; retrying it here would
|
|
724
|
+
# very likely fail again and re-stall every launch (this runs
|
|
725
|
+
# before the TUI). Skip for the cooldown window and point at
|
|
726
|
+
# `dcode update`.
|
|
696
727
|
from deepagents_code._invocation import invoked_name
|
|
697
728
|
|
|
698
729
|
console.print(
|
|
@@ -751,6 +782,23 @@ def _run_startup_auto_update(console: Console) -> None:
|
|
|
751
782
|
highlight=False,
|
|
752
783
|
)
|
|
753
784
|
return
|
|
785
|
+
# A migration rebuilds the shared tool environment, which would
|
|
786
|
+
# break dcode sessions running in other terminals, so it only runs
|
|
787
|
+
# here when no other session was found at this check.
|
|
788
|
+
from deepagents_code._session_lock import is_sole_session
|
|
789
|
+
|
|
790
|
+
sole_session = is_sole_session()
|
|
791
|
+
if retrying_deferral and not sole_session:
|
|
792
|
+
# Repeat the deferral without re-fetching the release's Python
|
|
793
|
+
# requirement or announcing an update that will not happen.
|
|
794
|
+
console.print(
|
|
795
|
+
f"{migration_deferral_message(latest)}\n"
|
|
796
|
+
f"{_session_lock_unavailable_note()}"
|
|
797
|
+
f"Continuing with v{cli_version}.",
|
|
798
|
+
markup=False,
|
|
799
|
+
highlight=False,
|
|
800
|
+
)
|
|
801
|
+
return
|
|
754
802
|
release_age = format_release_age_parenthetical(latest)
|
|
755
803
|
console.print(
|
|
756
804
|
f"Updating dcode from v{cli_version} to v{latest}{release_age}..."
|
|
@@ -775,15 +823,12 @@ def _run_startup_auto_update(console: Console) -> None:
|
|
|
775
823
|
notices.append(message)
|
|
776
824
|
console.print(message, markup=False, highlight=False)
|
|
777
825
|
|
|
778
|
-
# A Python migration rebuilds the shared tool environment, which
|
|
779
|
-
# would break dcode sessions running in other terminals. Defer it
|
|
780
|
-
# to an explicit `dcode update`.
|
|
781
826
|
success, output, _installed = asyncio.run(
|
|
782
827
|
perform_upgrade(
|
|
783
828
|
on_notice=show_notice,
|
|
784
829
|
log_path=log_path,
|
|
785
830
|
target_version=latest,
|
|
786
|
-
allow_python_migration=
|
|
831
|
+
allow_python_migration=sole_session,
|
|
787
832
|
on_migration_deferred=lambda: deferred.append(True),
|
|
788
833
|
on_unverified_install=lambda: unverified.append(True),
|
|
789
834
|
)
|
|
@@ -841,12 +886,13 @@ def _run_startup_auto_update(console: Console) -> None:
|
|
|
841
886
|
_mark_startup_auto_update_failed_safe(latest)
|
|
842
887
|
_exit_after_unrestartable_update(console, latest)
|
|
843
888
|
return
|
|
844
|
-
persisted = mark_startup_auto_update_failed(latest)
|
|
889
|
+
persisted = mark_startup_auto_update_failed(latest, deferred=bool(deferred))
|
|
845
890
|
if unverified:
|
|
846
891
|
_exit_after_unverified_update(console, persisted=persisted)
|
|
847
892
|
if deferred:
|
|
848
893
|
# Nothing failed: the notice above explains how to migrate.
|
|
849
|
-
|
|
894
|
+
note = escape(_session_lock_unavailable_note())
|
|
895
|
+
message = f"{note}Continuing with v{cli_version}."
|
|
850
896
|
elif notices:
|
|
851
897
|
# The notice above carries its own recovery steps; a generic
|
|
852
898
|
# command here would contradict them.
|
|
@@ -867,14 +913,16 @@ def _run_startup_auto_update(console: Console) -> None:
|
|
|
867
913
|
f"Run manually: [cyan]{cmd}[/cyan]\n"
|
|
868
914
|
f"Continuing with v{cli_version}."
|
|
869
915
|
)
|
|
870
|
-
if not persisted
|
|
871
|
-
# The
|
|
872
|
-
#
|
|
873
|
-
#
|
|
874
|
-
#
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
916
|
+
if not persisted:
|
|
917
|
+
# The marker could not be saved (e.g. a read-only state dir), so
|
|
918
|
+
# this same upgrade would otherwise be retried on every launch.
|
|
919
|
+
# Surface it rather than silently re-stalling, the way the
|
|
920
|
+
# consent-announce path surfaces its un-persisted state.
|
|
921
|
+
message += (
|
|
922
|
+
_UNPERSISTED_AUTO_UPDATE_DEFERRAL_NOTE
|
|
923
|
+
if deferred
|
|
924
|
+
else _UNPERSISTED_AUTO_UPDATE_FAILURE_NOTE
|
|
925
|
+
)
|
|
878
926
|
console.print(message, markup=True, highlight=False)
|
|
879
927
|
except SystemExit:
|
|
880
928
|
# Process replacement (and test doubles that simulate it), plus the
|
|
@@ -2630,7 +2678,7 @@ def parse_args() -> argparse.Namespace:
|
|
|
2630
2678
|
dest="auto_classifier_model",
|
|
2631
2679
|
metavar="MODEL",
|
|
2632
2680
|
help="Model the Auto approval classifier reviews actions with "
|
|
2633
|
-
"(e.g. anthropic:claude-sonnet-5). Local TUI or ACP only. Defaults to "
|
|
2681
|
+
"(e.g. anthropic:claude-sonnet-5-5). Local TUI or ACP only. Defaults to "
|
|
2634
2682
|
"DEEPAGENTS_CODE_AUTO_CLASSIFIER_MODEL, then [models].auto_classifier, "
|
|
2635
2683
|
"then a provider-specific model or the main agent model. A weaker model "
|
|
2636
2684
|
"weakens Auto's review.",
|
|
@@ -5520,10 +5568,23 @@ def cli_main() -> None:
|
|
|
5520
5568
|
# accessor triggers `_ensure_bootstrap()` (dotenv loading), and
|
|
5521
5569
|
# commands dispatched below — notably `auth status` — resolve
|
|
5522
5570
|
# credentials from the environment expecting `.env` to be loaded.
|
|
5523
|
-
from deepagents_code.config import
|
|
5571
|
+
from deepagents_code.config import (
|
|
5572
|
+
_get_credentials,
|
|
5573
|
+
_is_editable_install,
|
|
5574
|
+
console,
|
|
5575
|
+
)
|
|
5524
5576
|
|
|
5525
5577
|
_get_credentials()
|
|
5526
5578
|
|
|
5579
|
+
# Mark this install as in use before anything can migrate it, so a
|
|
5580
|
+
# concurrent launch's auto-update does not rebuild the environment out
|
|
5581
|
+
# from under this process. Editable installs never auto-update, so
|
|
5582
|
+
# nothing reads their registration.
|
|
5583
|
+
if not _is_editable_install():
|
|
5584
|
+
from deepagents_code._session_lock import hold_session_lock
|
|
5585
|
+
|
|
5586
|
+
hold_session_lock()
|
|
5587
|
+
|
|
5527
5588
|
if command is None:
|
|
5528
5589
|
# The health gate already ran above, for every command, so the
|
|
5529
5590
|
# violation check inside cannot fire. Kept as defense in depth: it
|
|
@@ -438,6 +438,12 @@ def _validate_server_config(server_name: str, server_config: dict[str, Any]) ->
|
|
|
438
438
|
error_msg = f"Server '{server_name}' config must be a dictionary"
|
|
439
439
|
raise TypeError(error_msg)
|
|
440
440
|
|
|
441
|
+
if "skillOnly" in server_config and not isinstance(
|
|
442
|
+
server_config["skillOnly"], bool
|
|
443
|
+
):
|
|
444
|
+
error_msg = f"Server '{server_name}' 'skillOnly' must be a boolean"
|
|
445
|
+
raise TypeError(error_msg)
|
|
446
|
+
|
|
441
447
|
server_type = _resolve_server_type(server_config)
|
|
442
448
|
|
|
443
449
|
if server_type in _SUPPORTED_REMOTE_TYPES:
|
|
@@ -2295,6 +2301,11 @@ async def _load_tools_from_config(
|
|
|
2295
2301
|
for tool in server_tools:
|
|
2296
2302
|
original_name = (tool.metadata or {})[_MCP_ORIGINAL_TOOL_NAME_KEY]
|
|
2297
2303
|
tool.name = tool_names[server_name, original_name]
|
|
2304
|
+
if server_config.get("skillOnly"):
|
|
2305
|
+
tool.metadata = {
|
|
2306
|
+
**(tool.metadata or {}),
|
|
2307
|
+
"_deepagents_code_skill_only": True,
|
|
2308
|
+
}
|
|
2298
2309
|
server_tools = _apply_tool_filter(server_tools, server_name, server_config)
|
|
2299
2310
|
|
|
2300
2311
|
# Pair each schema by the server-side name retained in the adapted
|
|
@@ -42,6 +42,7 @@ if TYPE_CHECKING:
|
|
|
42
42
|
|
|
43
43
|
from deepagents.backends.protocol import BackendProtocol
|
|
44
44
|
from langchain_core.runnables import RunnableConfig
|
|
45
|
+
from langchain_core.tools import BaseTool
|
|
45
46
|
from langgraph.runtime import Runtime
|
|
46
47
|
|
|
47
48
|
logger = logging.getLogger(__name__)
|
|
@@ -440,6 +441,7 @@ class PluginSkillsMiddleware(SkillsMiddleware):
|
|
|
440
441
|
sources: Sequence[CodeSkillSource],
|
|
441
442
|
system_prompt: str | None = sdk_skills.SKILLS_SYSTEM_PROMPT,
|
|
442
443
|
path_base: Path | None = None,
|
|
444
|
+
tools: Sequence[BaseTool] = (),
|
|
443
445
|
) -> None:
|
|
444
446
|
"""Initialize the middleware with Code-local plugin source tuples.
|
|
445
447
|
|
|
@@ -451,6 +453,7 @@ class PluginSkillsMiddleware(SkillsMiddleware):
|
|
|
451
453
|
path_base: Directory that relative `skills.extra_allowed_dirs`
|
|
452
454
|
entries resolve against. If `None`, the process working
|
|
453
455
|
directory is used.
|
|
456
|
+
tools: Tools disclosed only after their skill is read or pinned.
|
|
454
457
|
"""
|
|
455
458
|
self._allowed_roots = tuple(Path(source[0]).resolve() for source in sources)
|
|
456
459
|
self._path_base = path_base
|
|
@@ -459,6 +462,7 @@ class PluginSkillsMiddleware(SkillsMiddleware):
|
|
|
459
462
|
backend=backend,
|
|
460
463
|
sources=sdk_sources,
|
|
461
464
|
system_prompt=system_prompt,
|
|
465
|
+
tools=tools,
|
|
462
466
|
)
|
|
463
467
|
self._namespaces = tuple(
|
|
464
468
|
source[2] if len(source) == _PLUGIN_SKILL_SOURCE_LENGTH else None
|