deepagents-code 0.1.76__tar.gz → 0.1.77__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.76 → deepagents_code-0.1.77}/CHANGELOG.md +10 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/PKG-INFO +2 -2
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_build_info.py +1 -1
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_auth.py +16 -1
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_disabled.py +1 -1
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_oauth_ui.py +65 -1
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/model_config.py +9 -4
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/__init__.py +60 -6
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/content.py +23 -10
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/state.py +55 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/prompt_search.py +11 -7
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/startup_tip.py +1 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/workspace_diagnostics.py +25 -9
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/pyproject.toml +2 -2
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_auth.py +50 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_disabled.py +14 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_oauth_ui.py +121 -1
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_model_config.py +57 -1
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_workspace_diagnostics.py +98 -2
- deepagents_code-0.1.77/tests/unit_tests/tui/modals/plugin_manager/test_inspection.py +370 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +1 -1
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_chat_input.py +28 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/uv.lock +2 -2
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/.gitignore +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/AGENTS.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/ARCHITECTURE.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/COMMANDS.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/DEVELOPMENT.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/EXTENSIONS.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/HOOKS.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/LICENSE +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/Makefile +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/PRICING.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/README.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/THREAT_MODEL.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_content_blocks.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_debug_buffer.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_dep_floor_check.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_env_vars.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_fake_models.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_home_error.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_invocation.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_markdown.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_paths.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_repository_bounds.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_reserved_names.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_server_config.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_terminal_stderr.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_tool_stream.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_tracing.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/acp.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/agent.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/app.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/approval_mode.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/auto_mode.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/bundled_prices.README.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/bundled_prices.json +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/commands/auth.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/commands/config.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/commands/extras.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/commands/mcp.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/commands/tools.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/launch/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/launch/server.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/launch/server_manager.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/non_interactive.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/remote_client.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/cold_cache.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/command_registry.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/config.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/config_manifest.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configurable_model.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/interpreter.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/paths.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/provider.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/providers.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/resolver.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/service.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/theme_resolution.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/types.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/writer.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/context_doctor.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/cost_tracking.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/diff_utils.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/doctor.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/api.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/discovery.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/hosting.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/loader.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/registry.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/runtime.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/settings.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/trust.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extras_info.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/goal_rubric.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/goal_state_limits.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/goal_state_notice.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/goal_tools.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/capabilities.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/client.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/client_lifecycle.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/context.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/engine.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/env.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/envelope.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/interrupt.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/legacy.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/loading.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/manager.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/migration.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/models/adapters.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/models/config.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/models/domain.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/models/transport.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/models/wire.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/permissions.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/presenter.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/projection.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/reducer.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/runner.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/runtime.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/server_middleware.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/snapshot.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/tools.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/transcript.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/trust.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/integrations/sandbox_factory.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/json_types.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/main.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/managed_tools.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_config.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_middleware.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_proxy.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_tools.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/model_retry.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/offload.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/offload_api.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/offload_middleware.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/paste_collapse.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/_json.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/adapters/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/adapters/hooks.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/adapters/mcp.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/adapters/skills.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/commands_cli.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/discovery.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/manifest.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/marketplace.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/models.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/store.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/substitution.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/reasoning_effort.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/reliable_rubric.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/server_graph.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/sessions.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/skills/merge.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/skills/trust.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/system_prompt.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tool_catalog.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/key_hints.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/cold_cache.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/cost_breakdown.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/model_switch.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/prompt_clipboard.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/prompt_clipboard.tcss +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/resume_blocked.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/resume_compact.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/session_cost.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/session_cost.tcss +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/screens/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/textual_adapter.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_condense_path.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_links.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/approval.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/ask_user.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/auth.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/chat_input.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/codex_auth.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/context_usage.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/debug_console.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/diff.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/effort_selector.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/goal_review.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/goal_status.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/history.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/install_confirm.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/loading.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/message_store.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/messages.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/model_selector.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/skill_trust.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/status.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/thread_selector.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/update_available.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/update_confirm.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/welcome.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/ui.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/update_check.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/workspace.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/examples/extensions/memory_store.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/hatch_build.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/images/debug-console-cost-breakdown.png +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/images/model-stream-retry.png +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/images/tui.png +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/scripts/check_process_cwd.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/scripts/install.sh +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/README.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/benchmarks/test_thread_loading_benchmarks.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/test_auto_approve_remote.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/test_offload_server_side.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/test_pending_work_recovery.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/client/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/client/commands/test_auth.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/client/commands/test_extras.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/client/commands/test_mcp.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/client/commands/test_tools.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/conftest.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/models/test_models.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_configuration.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_engine.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_execution.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_manager.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_presenter.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_server_lifecycle.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_transcript.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_trust.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/plugins/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/plugins/test_marketplace.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_merge.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_skill_trust.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/smoke_tests/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/smoke_tests/conftest.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/smoke_tests/snapshots/system_prompt_headless_local.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test__tool_stream.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_acp.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_agent.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_app.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_approval_mode.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_args.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_ask_user_types.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_auto_mode.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_cli_provider.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_cold_cache.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_config.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_config_manifest.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_configuration.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_configuration_resolution.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_configuration_resolver.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_context_doctor.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_cost_tracking.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_cursor_style.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_debug_buffer.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_debug_console.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_dep_floor_check.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_diff_utils.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_doctor.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_api.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_cli_trust.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_config_manifest.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_discovery.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_display.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_host_runtime.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_hosting.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_runtime.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extra_skills_dirs.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_criteria_client.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_rubric.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_state_limits.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_state_notice.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_state_persistence.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_tools.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_hatch_build.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_install_command.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_install_script.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_invocation.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_json_types.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_main.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_managed_tools.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_config.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_lifecycle.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_proxy.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_schema.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_model_retry.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_offload_api.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_paths.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_process_cwd_check.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_reasoning_effort.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_reliable_rubric.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_repository_bounds.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_resume_compaction_recovery.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_rubric_cli.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_sandbox_registry.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_server.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_server_tracing.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_terminal_stderr.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_text_encoding.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_threads_resume.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_tool_catalog.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_tracing.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_tracing_replicas.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_transcript_virtualization.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_uninstall_command.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_workspace.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tools/test_web_search.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/test_cold_cache.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/test_model_switch.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/test_prompt_clipboard.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/test_resume_blocked.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/test_session_cost.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/test_key_hints.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/test_modal_footer_layout.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_condense_path.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_history.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_links.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_prompt_search.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_status.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
- {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.1.77](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.76...deepagents-code==0.1.77) (2026-09-24)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
- Preview remote plugin contents before installation.
|
|
10
|
+
- Report mis-encoded `config.toml` files created by older config writers.
|
|
11
|
+
- Show how to cancel MCP browser login and handle Escape.
|
|
12
|
+
- Make workspace configuration warnings actionable.
|
|
13
|
+
- Hide prompt search hints when search is unavailable.
|
|
14
|
+
|
|
5
15
|
## [0.1.76](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.75...deepagents-code==0.1.76) (2026-09-24)
|
|
6
16
|
|
|
7
17
|
### Features
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.77
|
|
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
|
|
@@ -30,7 +30,7 @@ Requires-Python: <4.0,>=3.12
|
|
|
30
30
|
Requires-Dist: aiosqlite<1.0.0,>=0.22.1
|
|
31
31
|
Requires-Dist: anyio<5.0.0,>=4.14.2
|
|
32
32
|
Requires-Dist: deepagents-acp<1.0.0,>=0.0.10
|
|
33
|
-
Requires-Dist: deepagents==0.7.
|
|
33
|
+
Requires-Dist: deepagents==0.7.19
|
|
34
34
|
Requires-Dist: fastmcp<5.0.0,>=4.0.0b4
|
|
35
35
|
Requires-Dist: filelock<3.30,>=3.29.7
|
|
36
36
|
Requires-Dist: genai-prices<0.2.0,>=0.1.8
|
|
@@ -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.77" # 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."""
|
|
@@ -1218,6 +1218,7 @@ def _make_loopback_handlers(
|
|
|
1218
1218
|
extras = dict(extra_auth_params or {})
|
|
1219
1219
|
interaction = ui if ui is not None else _default_ui()
|
|
1220
1220
|
last_authorize_url: str | None = None
|
|
1221
|
+
browser_opened = False
|
|
1221
1222
|
_paste_redirect, paste_callback = _make_paste_back_handlers(
|
|
1222
1223
|
extra_auth_params=extra_auth_params,
|
|
1223
1224
|
ui=interaction,
|
|
@@ -1227,7 +1228,8 @@ def _make_loopback_handlers(
|
|
|
1227
1228
|
import asyncio
|
|
1228
1229
|
import webbrowser
|
|
1229
1230
|
|
|
1230
|
-
nonlocal last_authorize_url
|
|
1231
|
+
nonlocal last_authorize_url, browser_opened
|
|
1232
|
+
browser_opened = False
|
|
1231
1233
|
final_url = _append_query_params(auth_url, extras) if extras else auth_url
|
|
1232
1234
|
last_authorize_url = final_url
|
|
1233
1235
|
|
|
@@ -1268,10 +1270,18 @@ def _make_loopback_handlers(
|
|
|
1268
1270
|
)
|
|
1269
1271
|
await interaction.show_authorize_url(final_url, opened_in_browser=False)
|
|
1270
1272
|
return
|
|
1273
|
+
browser_opened = True
|
|
1271
1274
|
await interaction.show_authorize_url(final_url, opened_in_browser=True)
|
|
1272
1275
|
|
|
1273
1276
|
async def callback() -> AuthorizationCodeResult:
|
|
1277
|
+
from deepagents_code.mcp_oauth_ui import (
|
|
1278
|
+
CliOAuthInteraction,
|
|
1279
|
+
_wait_for_browser_authorization,
|
|
1280
|
+
)
|
|
1281
|
+
|
|
1274
1282
|
try:
|
|
1283
|
+
if browser_opened and isinstance(interaction, CliOAuthInteraction):
|
|
1284
|
+
return await _wait_for_browser_authorization(callback_server.wait)
|
|
1275
1285
|
return await callback_server.wait()
|
|
1276
1286
|
except (
|
|
1277
1287
|
_LoopbackCallbackTimeoutError,
|
|
@@ -1998,6 +2008,7 @@ def format_login_failure(exc: BaseException) -> str:
|
|
|
1998
2008
|
if reauth is not None:
|
|
1999
2009
|
return str(reauth)
|
|
2000
2010
|
|
|
2011
|
+
from deepagents_code.mcp_oauth_ui import MCPLoginAbortedError
|
|
2001
2012
|
from deepagents_code.mcp_tools import MCPConfigError
|
|
2002
2013
|
|
|
2003
2014
|
if isinstance(exc, MCPConfigError):
|
|
@@ -2018,8 +2029,12 @@ def format_login_failure(exc: BaseException) -> str:
|
|
|
2018
2029
|
visited: set[int] = set()
|
|
2019
2030
|
while current is not None and id(current) not in visited:
|
|
2020
2031
|
visited.add(id(current))
|
|
2032
|
+
if isinstance(current, MCPLoginAbortedError):
|
|
2033
|
+
return "MCP login aborted."
|
|
2021
2034
|
parts.append(type(current).__name__)
|
|
2022
2035
|
if isinstance(current, BaseExceptionGroup):
|
|
2036
|
+
if current.subgroup(MCPLoginAbortedError) is not None:
|
|
2037
|
+
return "MCP login aborted."
|
|
2023
2038
|
parts.append(
|
|
2024
2039
|
"[" + ", ".join(type(e).__name__ for e in current.exceptions[:5]) + "]"
|
|
2025
2040
|
)
|
|
@@ -74,7 +74,7 @@ def _load_config(config_path: Path) -> dict[str, Any]:
|
|
|
74
74
|
try:
|
|
75
75
|
with config_path.open("rb") as f:
|
|
76
76
|
return tomllib.load(f)
|
|
77
|
-
except (OSError, tomllib.TOMLDecodeError) as exc:
|
|
77
|
+
except (OSError, UnicodeDecodeError, tomllib.TOMLDecodeError) as exc:
|
|
78
78
|
logger.warning(
|
|
79
79
|
"Could not read MCP disabled config at %s: %s",
|
|
80
80
|
config_path,
|
|
@@ -17,7 +17,71 @@ so leaks come from misuse, not from this interface's shape.
|
|
|
17
17
|
|
|
18
18
|
from __future__ import annotations
|
|
19
19
|
|
|
20
|
-
from typing import Protocol
|
|
20
|
+
from typing import TYPE_CHECKING, Protocol
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from collections.abc import Callable, Coroutine
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class MCPLoginAbortedError(RuntimeError):
|
|
27
|
+
"""The user aborted browser authorization from the terminal."""
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
async def _wait_for_browser_authorization[T](
|
|
31
|
+
wait: Callable[[], Coroutine[object, object, T]],
|
|
32
|
+
) -> T:
|
|
33
|
+
"""Wait for a browser callback with terminal-only Esc cancellation.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
The browser callback result.
|
|
37
|
+
|
|
38
|
+
Raises:
|
|
39
|
+
MCPLoginAbortedError: If the user aborts authorization.
|
|
40
|
+
"""
|
|
41
|
+
import asyncio
|
|
42
|
+
import sys
|
|
43
|
+
|
|
44
|
+
if not (sys.stdin.isatty() and sys.stderr.isatty()):
|
|
45
|
+
return await wait()
|
|
46
|
+
|
|
47
|
+
from prompt_toolkit.application import Application
|
|
48
|
+
from prompt_toolkit.key_binding import KeyBindings, KeyPressEvent
|
|
49
|
+
from prompt_toolkit.layout import Layout, Window
|
|
50
|
+
from prompt_toolkit.layout.controls import FormattedTextControl
|
|
51
|
+
from prompt_toolkit.output.defaults import create_output
|
|
52
|
+
|
|
53
|
+
bindings = KeyBindings()
|
|
54
|
+
|
|
55
|
+
@bindings.add("escape")
|
|
56
|
+
@bindings.add("c-c")
|
|
57
|
+
@bindings.add("c-d")
|
|
58
|
+
def abort(event: KeyPressEvent) -> None:
|
|
59
|
+
event.app.exit(exception=MCPLoginAbortedError())
|
|
60
|
+
|
|
61
|
+
app: Application[None] = Application(
|
|
62
|
+
layout=Layout(Window(FormattedTextControl("esc to abort"), height=1)),
|
|
63
|
+
key_bindings=bindings,
|
|
64
|
+
output=create_output(stdout=sys.stderr),
|
|
65
|
+
full_screen=False,
|
|
66
|
+
erase_when_done=True,
|
|
67
|
+
)
|
|
68
|
+
callback = asyncio.create_task(wait())
|
|
69
|
+
keyboard = asyncio.create_task(app.run_async(handle_sigint=False))
|
|
70
|
+
try:
|
|
71
|
+
done, _ = await asyncio.wait(
|
|
72
|
+
(callback, keyboard), return_when=asyncio.FIRST_COMPLETED
|
|
73
|
+
)
|
|
74
|
+
if callback in done:
|
|
75
|
+
return await callback
|
|
76
|
+
try:
|
|
77
|
+
await keyboard
|
|
78
|
+
except EOFError as exc:
|
|
79
|
+
raise MCPLoginAbortedError from exc
|
|
80
|
+
raise MCPLoginAbortedError
|
|
81
|
+
finally:
|
|
82
|
+
callback.cancel()
|
|
83
|
+
keyboard.cancel()
|
|
84
|
+
await asyncio.gather(callback, keyboard, return_exceptions=True)
|
|
21
85
|
|
|
22
86
|
|
|
23
87
|
class OAuthInteraction(Protocol):
|
|
@@ -4639,6 +4639,11 @@ def suppress_warning_reason(key: str, config_path: Path | None = None) -> str |
|
|
|
4639
4639
|
except tomllib.TOMLDecodeError:
|
|
4640
4640
|
logger.exception("Could not save warning suppression for '%s'", key)
|
|
4641
4641
|
return f"{config_path} is not valid TOML"
|
|
4642
|
+
except UnicodeDecodeError:
|
|
4643
|
+
# `tomllib` decodes the bytes itself, so a file that is not UTF-8
|
|
4644
|
+
# raises `UnicodeDecodeError` rather than `TOMLDecodeError`.
|
|
4645
|
+
logger.exception("Could not save warning suppression for '%s'", key)
|
|
4646
|
+
return f"{config_path} is not UTF-8 encoded"
|
|
4642
4647
|
except OSError:
|
|
4643
4648
|
logger.exception("Could not save warning suppression for '%s'", key)
|
|
4644
4649
|
return f"{config_path} could not be written"
|
|
@@ -4705,7 +4710,7 @@ def unsuppress_warning(key: str, config_path: Path | None = None) -> bool:
|
|
|
4705
4710
|
with contextlib.suppress(OSError):
|
|
4706
4711
|
Path(tmp_path).unlink()
|
|
4707
4712
|
raise
|
|
4708
|
-
except (OSError, tomllib.TOMLDecodeError):
|
|
4713
|
+
except (OSError, UnicodeDecodeError, tomllib.TOMLDecodeError):
|
|
4709
4714
|
logger.exception("Could not remove warning suppression for '%s'", key)
|
|
4710
4715
|
return False
|
|
4711
4716
|
_invalidate_config_caches(config_path)
|
|
@@ -6156,7 +6161,7 @@ def save_thread_columns(
|
|
|
6156
6161
|
with contextlib.suppress(OSError):
|
|
6157
6162
|
Path(tmp_path).unlink()
|
|
6158
6163
|
raise
|
|
6159
|
-
except (OSError, tomllib.TOMLDecodeError):
|
|
6164
|
+
except (OSError, UnicodeDecodeError, tomllib.TOMLDecodeError):
|
|
6160
6165
|
logger.exception("Could not save thread column preferences")
|
|
6161
6166
|
return False
|
|
6162
6167
|
invalidate_thread_config_cache()
|
|
@@ -6220,7 +6225,7 @@ def save_thread_relative_time(enabled: bool, config_path: Path | None = None) ->
|
|
|
6220
6225
|
with contextlib.suppress(OSError):
|
|
6221
6226
|
Path(tmp_path).unlink()
|
|
6222
6227
|
raise
|
|
6223
|
-
except (OSError, tomllib.TOMLDecodeError):
|
|
6228
|
+
except (OSError, UnicodeDecodeError, tomllib.TOMLDecodeError):
|
|
6224
6229
|
logger.exception("Could not save thread relative_time preference")
|
|
6225
6230
|
return False
|
|
6226
6231
|
invalidate_thread_config_cache()
|
|
@@ -6449,7 +6454,7 @@ def save_thread_sort_order(sort_order: str, config_path: Path | None = None) ->
|
|
|
6449
6454
|
with contextlib.suppress(OSError):
|
|
6450
6455
|
Path(tmp_path).unlink()
|
|
6451
6456
|
raise
|
|
6452
|
-
except (OSError, tomllib.TOMLDecodeError):
|
|
6457
|
+
except (OSError, UnicodeDecodeError, tomllib.TOMLDecodeError):
|
|
6453
6458
|
logger.exception("Could not save thread sort_order preference")
|
|
6454
6459
|
return False
|
|
6455
6460
|
invalidate_thread_config_cache()
|
|
@@ -34,6 +34,7 @@ if TYPE_CHECKING:
|
|
|
34
34
|
)
|
|
35
35
|
|
|
36
36
|
from deepagents_code import theme
|
|
37
|
+
from deepagents_code._env_vars import OFFLINE, is_env_truthy
|
|
37
38
|
from deepagents_code.config import get_glyphs, is_ascii_mode
|
|
38
39
|
from deepagents_code.model_config import _save_toml_field
|
|
39
40
|
from deepagents_code.plugins import (
|
|
@@ -44,7 +45,7 @@ from deepagents_code.plugins import (
|
|
|
44
45
|
uninstall_plugin,
|
|
45
46
|
)
|
|
46
47
|
from deepagents_code.plugins.discovery import plugin_auto_update_setting
|
|
47
|
-
from deepagents_code.plugins.marketplace import MarketplaceError
|
|
48
|
+
from deepagents_code.plugins.marketplace import MarketplaceError, redact_urls_in_text
|
|
48
49
|
from deepagents_code.tui.modals.plugin_manager.content import (
|
|
49
50
|
_confirm_marketplace_removal_options,
|
|
50
51
|
_install_details_options,
|
|
@@ -62,7 +63,10 @@ from deepagents_code.tui.modals.plugin_manager.models import (
|
|
|
62
63
|
PluginTab,
|
|
63
64
|
_ManagerState,
|
|
64
65
|
)
|
|
65
|
-
from deepagents_code.tui.modals.plugin_manager.state import
|
|
66
|
+
from deepagents_code.tui.modals.plugin_manager.state import (
|
|
67
|
+
_inspect_plugin,
|
|
68
|
+
_load_manager_state,
|
|
69
|
+
)
|
|
66
70
|
from deepagents_code.tui.modals.plugin_manager.tabs import (
|
|
67
71
|
TAB_LABELS,
|
|
68
72
|
PluginTabLabel,
|
|
@@ -166,6 +170,8 @@ class PluginManagerScreen(ModalScreen[PluginManagerResult]): # noqa: RUF067
|
|
|
166
170
|
self._status: str | None = None
|
|
167
171
|
self._error: str | None = None
|
|
168
172
|
self._selected_plugin: _PluginRow | None = None
|
|
173
|
+
self._previews: dict[str, _PluginRow] = {}
|
|
174
|
+
self._inspecting: set[str] = set()
|
|
169
175
|
self._selected_marketplace: _MarketplaceRow | None = None
|
|
170
176
|
self._adding_marketplace = False
|
|
171
177
|
self._marketplace_spinner = Spinner()
|
|
@@ -454,7 +460,12 @@ class PluginManagerScreen(ModalScreen[PluginManagerResult]): # noqa: RUF067
|
|
|
454
460
|
self._update_tab_labels()
|
|
455
461
|
status_widget = self.query_one("#plugin-manager-status", Static)
|
|
456
462
|
if self._mode == "plugin_details" and self._selected_plugin is not None:
|
|
457
|
-
status_widget.update(
|
|
463
|
+
status_widget.update(
|
|
464
|
+
_plugin_details_content(
|
|
465
|
+
self._selected_plugin,
|
|
466
|
+
inspecting=self._selected_plugin.plugin_id in self._inspecting,
|
|
467
|
+
)
|
|
468
|
+
)
|
|
458
469
|
elif self._mode == "installed_details" and self._selected_plugin is not None:
|
|
459
470
|
status_widget.update(
|
|
460
471
|
_installed_plugin_details_content(self._selected_plugin)
|
|
@@ -583,7 +594,11 @@ class PluginManagerScreen(ModalScreen[PluginManagerResult]): # noqa: RUF067
|
|
|
583
594
|
|
|
584
595
|
def _active_details_options(self) -> list[Option]:
|
|
585
596
|
if self._mode == "plugin_details":
|
|
586
|
-
|
|
597
|
+
row = self._selected_plugin
|
|
598
|
+
return _install_details_options(
|
|
599
|
+
uninspected=row is not None and row.skill_count is None,
|
|
600
|
+
inspecting=row is not None and row.plugin_id in self._inspecting,
|
|
601
|
+
)
|
|
587
602
|
if self._mode == "installed_details" and self._selected_plugin is not None:
|
|
588
603
|
return _installed_details_options(
|
|
589
604
|
self._selected_plugin, divider_width=self._divider_width()
|
|
@@ -688,6 +703,7 @@ class PluginManagerScreen(ModalScreen[PluginManagerResult]): # noqa: RUF067
|
|
|
688
703
|
# must retain the user's active filter.
|
|
689
704
|
if clear_search:
|
|
690
705
|
self._search_query = ""
|
|
706
|
+
self._previews.clear()
|
|
691
707
|
|
|
692
708
|
# Take the snapshot only after acquiring the lock. A settled
|
|
693
709
|
# connection update queued behind the initial load therefore uses
|
|
@@ -1050,6 +1066,8 @@ class PluginManagerScreen(ModalScreen[PluginManagerResult]): # noqa: RUF067
|
|
|
1050
1066
|
self._selected_plugin = row
|
|
1051
1067
|
self._mode = "plugin_details"
|
|
1052
1068
|
self._error = None
|
|
1069
|
+
if row.skill_count is None and not is_env_truthy(OFFLINE):
|
|
1070
|
+
self._start_plugin_inspection(row)
|
|
1053
1071
|
self._refresh_view()
|
|
1054
1072
|
return
|
|
1055
1073
|
if option_id.startswith("installed:"):
|
|
@@ -1066,6 +1084,11 @@ class PluginManagerScreen(ModalScreen[PluginManagerResult]): # noqa: RUF067
|
|
|
1066
1084
|
if option_id == "action:toggle-auto-update":
|
|
1067
1085
|
await self._toggle_auto_update()
|
|
1068
1086
|
return
|
|
1087
|
+
if option_id == "action:inspect":
|
|
1088
|
+
row = self._selected_plugin
|
|
1089
|
+
if row is not None:
|
|
1090
|
+
self._start_plugin_inspection(row)
|
|
1091
|
+
return
|
|
1069
1092
|
if option_id == "action:install":
|
|
1070
1093
|
await self._install_selected_plugin()
|
|
1071
1094
|
return
|
|
@@ -1097,7 +1120,7 @@ class PluginManagerScreen(ModalScreen[PluginManagerResult]): # noqa: RUF067
|
|
|
1097
1120
|
def _find_available_plugin(self, plugin_id: str) -> _PluginRow | None:
|
|
1098
1121
|
return next(
|
|
1099
1122
|
(
|
|
1100
|
-
row
|
|
1123
|
+
self._previews.get(plugin_id, row)
|
|
1101
1124
|
for row in self._state.available_plugins
|
|
1102
1125
|
if row.plugin_id == plugin_id
|
|
1103
1126
|
),
|
|
@@ -1137,9 +1160,40 @@ class PluginManagerScreen(ModalScreen[PluginManagerResult]): # noqa: RUF067
|
|
|
1137
1160
|
if enabled and self._on_auto_update_enabled is not None:
|
|
1138
1161
|
self._on_auto_update_enabled()
|
|
1139
1162
|
|
|
1163
|
+
def _start_plugin_inspection(self, row: _PluginRow) -> None:
|
|
1164
|
+
if row.plugin_id in self._inspecting:
|
|
1165
|
+
return
|
|
1166
|
+
self._inspecting.add(row.plugin_id)
|
|
1167
|
+
self._error = None
|
|
1168
|
+
self._refresh_view()
|
|
1169
|
+
self.call_after_refresh(self._inspect_selected_plugin, row)
|
|
1170
|
+
|
|
1171
|
+
@work(exit_on_error=False)
|
|
1172
|
+
async def _inspect_selected_plugin(self, row: _PluginRow) -> None:
|
|
1173
|
+
error: str | None = None
|
|
1174
|
+
try:
|
|
1175
|
+
self._previews[row.plugin_id] = await asyncio.to_thread(
|
|
1176
|
+
_inspect_plugin, row
|
|
1177
|
+
)
|
|
1178
|
+
except (MarketplaceError, OSError, ValueError, RuntimeError, TypeError) as exc:
|
|
1179
|
+
error = f"Could not inspect contents: {redact_urls_in_text(str(exc))}"
|
|
1180
|
+
logger.debug("%s", error)
|
|
1181
|
+
finally:
|
|
1182
|
+
self._inspecting.discard(row.plugin_id)
|
|
1183
|
+
if (
|
|
1184
|
+
not self._dismissed
|
|
1185
|
+
and self._close_phase == "browsing"
|
|
1186
|
+
and self._mode == "plugin_details"
|
|
1187
|
+
and self._selected_plugin is not None
|
|
1188
|
+
and self._selected_plugin.plugin_id == row.plugin_id
|
|
1189
|
+
):
|
|
1190
|
+
self._selected_plugin = self._previews.get(row.plugin_id, row)
|
|
1191
|
+
self._error = error
|
|
1192
|
+
self._refresh_view()
|
|
1193
|
+
|
|
1140
1194
|
async def _install_selected_plugin(self) -> None:
|
|
1141
1195
|
row = self._selected_plugin
|
|
1142
|
-
if row is None:
|
|
1196
|
+
if row is None or row.plugin_id in self._inspecting:
|
|
1143
1197
|
return
|
|
1144
1198
|
try:
|
|
1145
1199
|
instance = await asyncio.to_thread(install_plugin, row.plugin_id)
|
|
@@ -74,9 +74,22 @@ def _plugin_prompt(row: _PluginRow, *, status: str | None) -> Content:
|
|
|
74
74
|
)
|
|
75
75
|
|
|
76
76
|
|
|
77
|
-
def _install_details_options(
|
|
77
|
+
def _install_details_options(
|
|
78
|
+
*, uninspected: bool = False, inspecting: bool = False
|
|
79
|
+
) -> list[Option]:
|
|
80
|
+
options = (
|
|
81
|
+
[
|
|
82
|
+
Option(
|
|
83
|
+
"Inspect contents (downloads source)",
|
|
84
|
+
id="action:inspect",
|
|
85
|
+
)
|
|
86
|
+
]
|
|
87
|
+
if uninspected and not inspecting
|
|
88
|
+
else []
|
|
89
|
+
)
|
|
78
90
|
return [
|
|
79
|
-
|
|
91
|
+
*options,
|
|
92
|
+
Option("Install", id="action:install", disabled=inspecting),
|
|
80
93
|
Option("Back to plugin list", id="details-back"),
|
|
81
94
|
]
|
|
82
95
|
|
|
@@ -128,12 +141,7 @@ def _will_install_lines(row: _PluginRow) -> list[str]:
|
|
|
128
141
|
_unsupported_summary(row.unsupported_components),
|
|
129
142
|
]
|
|
130
143
|
if row.skill_count is None:
|
|
131
|
-
return [
|
|
132
|
-
(
|
|
133
|
-
"Skills, MCP servers, and hooks if present "
|
|
134
|
-
"(agents/ and commands/ are not loaded)."
|
|
135
|
-
)
|
|
136
|
-
]
|
|
144
|
+
return ["Contents not inspected. Choose Inspect contents to preview."]
|
|
137
145
|
return [
|
|
138
146
|
"No supported components (skills/MCP/hooks).",
|
|
139
147
|
"agents/ and commands/ are not loaded by deepagents-code.",
|
|
@@ -194,7 +202,7 @@ def _status_lines(row: _PluginRow) -> list[Content]:
|
|
|
194
202
|
return lines
|
|
195
203
|
|
|
196
204
|
|
|
197
|
-
def _plugin_details_content(row: _PluginRow) -> Content:
|
|
205
|
+
def _plugin_details_content(row: _PluginRow, *, inspecting: bool = False) -> Content:
|
|
198
206
|
_, _, marketplace = row.plugin_id.partition("@")
|
|
199
207
|
parts: list[Content | str] = [
|
|
200
208
|
Content.styled("Plugin details", "bold"),
|
|
@@ -210,7 +218,12 @@ def _plugin_details_content(row: _PluginRow) -> Content:
|
|
|
210
218
|
if row.author:
|
|
211
219
|
parts.extend(["\n\n", Content.styled(f"By: {row.author}", "dim")])
|
|
212
220
|
parts.extend(["\n\n", Content.styled("Will install:", "bold")])
|
|
213
|
-
|
|
221
|
+
lines = (
|
|
222
|
+
["Downloading and inspecting contents..."]
|
|
223
|
+
if inspecting
|
|
224
|
+
else _will_install_lines(row)
|
|
225
|
+
)
|
|
226
|
+
for line in lines:
|
|
214
227
|
parts.extend(["\n ", Content.styled(line, "dim")])
|
|
215
228
|
parts.extend(
|
|
216
229
|
[
|
{deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/state.py
RENAMED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import json
|
|
5
6
|
import logging
|
|
6
7
|
from pathlib import Path
|
|
7
8
|
from typing import TYPE_CHECKING
|
|
@@ -23,6 +24,7 @@ from deepagents_code.plugins.marketplace import (
|
|
|
23
24
|
materialize_plugin_source,
|
|
24
25
|
redact_marketplace_source,
|
|
25
26
|
redact_urls_in_text,
|
|
27
|
+
unresolved_source_message,
|
|
26
28
|
)
|
|
27
29
|
from deepagents_code.plugins.models import LocalPluginSource, split_plugin_id
|
|
28
30
|
from deepagents_code.plugins.store import (
|
|
@@ -30,6 +32,7 @@ from deepagents_code.plugins.store import (
|
|
|
30
32
|
load_enabled_plugin_ids,
|
|
31
33
|
load_installed_plugins,
|
|
32
34
|
load_marketplace_records,
|
|
35
|
+
plugin_mutation_lock,
|
|
33
36
|
)
|
|
34
37
|
from deepagents_code.tui.modals.plugin_manager.models import (
|
|
35
38
|
_ManagerState,
|
|
@@ -208,6 +211,58 @@ def _preview_local_plugin_instance(
|
|
|
208
211
|
return loaded
|
|
209
212
|
|
|
210
213
|
|
|
214
|
+
@plugin_mutation_lock()
|
|
215
|
+
def _inspect_plugin(row: _PluginRow) -> _PluginRow:
|
|
216
|
+
"""Download and inventory one plugin without installing or executing it.
|
|
217
|
+
|
|
218
|
+
Returns:
|
|
219
|
+
A row with the inspected component names.
|
|
220
|
+
|
|
221
|
+
Raises:
|
|
222
|
+
MarketplaceError: If the source or its inventory cannot be inspected.
|
|
223
|
+
"""
|
|
224
|
+
from deepagents_code.plugins.discovery import (
|
|
225
|
+
_plugin_from_install_path,
|
|
226
|
+
_resolve_marketplace_and_entry,
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
marketplace, entry = _resolve_marketplace_and_entry(row.plugin_id)
|
|
230
|
+
rejections: list[str] = []
|
|
231
|
+
root = materialize_plugin_source(marketplace, entry, rejections=rejections)
|
|
232
|
+
if root is None:
|
|
233
|
+
raise MarketplaceError(
|
|
234
|
+
unresolved_source_message(row.plugin_id, entry, rejections)
|
|
235
|
+
)
|
|
236
|
+
instance, warnings = _plugin_from_install_path(
|
|
237
|
+
plugin_id=row.plugin_id,
|
|
238
|
+
root=root,
|
|
239
|
+
marketplace_name=marketplace.name,
|
|
240
|
+
fallback_name=entry.name,
|
|
241
|
+
)
|
|
242
|
+
if instance is None or warnings:
|
|
243
|
+
msg = "; ".join(warnings) or "Could not inspect plugin contents."
|
|
244
|
+
raise MarketplaceError(msg)
|
|
245
|
+
for path in (*instance.inventory.mcp_files, *instance.inventory.hook_files):
|
|
246
|
+
if path.suffix in {".mcpb", ".dxt"}:
|
|
247
|
+
msg = f"Cannot inspect unsupported MCP bundle: {path.name}"
|
|
248
|
+
raise MarketplaceError(msg)
|
|
249
|
+
document = json.loads(path.read_text(encoding="utf-8"))
|
|
250
|
+
if not isinstance(document, dict):
|
|
251
|
+
msg = f"Cannot inspect {path.name}: expected a JSON object."
|
|
252
|
+
raise MarketplaceError(msg)
|
|
253
|
+
return _row_from_instance(
|
|
254
|
+
plugin_id=row.plugin_id,
|
|
255
|
+
description=row.description,
|
|
256
|
+
author=row.author,
|
|
257
|
+
is_enabled=row.enabled,
|
|
258
|
+
instance=instance,
|
|
259
|
+
mcp_server_info=(),
|
|
260
|
+
mcp_connecting=False,
|
|
261
|
+
loaded_plugin_ids=frozenset(),
|
|
262
|
+
display_name=row.display_name,
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
|
|
211
266
|
def _row_from_instance(
|
|
212
267
|
*,
|
|
213
268
|
plugin_id: str,
|
{deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/prompt_search.py
RENAMED
|
@@ -27,13 +27,16 @@ PROMPT_SEARCH_MAX_ROWS = 5
|
|
|
27
27
|
"""Result rows the inline panel shows before the list scrolls."""
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
def prompt_search_hint() -> str:
|
|
30
|
+
def prompt_search_hint(*, has_matches: bool = True) -> str:
|
|
31
31
|
"""Build the footer line for the current charset mode.
|
|
32
32
|
|
|
33
33
|
The Ctrl+R mention is what makes the modal tier discoverable. The line is
|
|
34
34
|
kept short enough to wrap within `PROMPT_SEARCH_MAX_HINT_ROWS` at the
|
|
35
35
|
narrow widths the composer supports.
|
|
36
36
|
|
|
37
|
+
Args:
|
|
38
|
+
has_matches: Whether navigation and insertion are available.
|
|
39
|
+
|
|
37
40
|
Returns:
|
|
38
41
|
The hint text, using ASCII glyphs on terminals that need them.
|
|
39
42
|
"""
|
|
@@ -41,14 +44,13 @@ def prompt_search_hint() -> str:
|
|
|
41
44
|
|
|
42
45
|
glyphs = get_glyphs()
|
|
43
46
|
sep = f" {glyphs.bullet} "
|
|
44
|
-
|
|
45
|
-
|
|
47
|
+
hints = ["Ctrl+R full view", "Esc cancel"]
|
|
48
|
+
if has_matches:
|
|
49
|
+
hints[:0] = [
|
|
46
50
|
f"{glyphs.arrow_up}/{glyphs.arrow_down} navigate",
|
|
47
51
|
"Tab/Enter insert",
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
)
|
|
51
|
-
)
|
|
52
|
+
]
|
|
53
|
+
return sep.join(hints)
|
|
52
54
|
|
|
53
55
|
|
|
54
56
|
PROMPT_SEARCH_WINDOW = 50
|
|
@@ -382,6 +384,8 @@ class PromptSearchPanel(Vertical):
|
|
|
382
384
|
"""
|
|
383
385
|
if empty is not None:
|
|
384
386
|
titles = []
|
|
387
|
+
if self._hint_static is not None:
|
|
388
|
+
self._hint_static.update(prompt_search_hint(has_matches=bool(titles)))
|
|
385
389
|
self._selected_index = selected_index
|
|
386
390
|
# Copy: the panel keeps this list across frames, so an owner that
|
|
387
391
|
# mutated the list it passed would rewrite the pending window in place.
|
{deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/startup_tip.py
RENAMED
|
@@ -31,6 +31,7 @@ _TIPS: dict[str, int] = {
|
|
|
31
31
|
"Press Ctrl+R to search and reuse submitted prompts": 2,
|
|
32
32
|
"Use /cost to see a breakdown of estimated spend": 1,
|
|
33
33
|
"Use /tools to list the tools available to the agent": 1,
|
|
34
|
+
"Use /plugins to inspect a plugin's contents before installing": 1,
|
|
34
35
|
"Open /mcp and press Enter on a remote server to sign in again": 1,
|
|
35
36
|
"Use /remember to save learnings from this conversation": 1,
|
|
36
37
|
"Use /model to switch models mid-conversation": 2,
|
|
@@ -22,6 +22,8 @@ from typing import TYPE_CHECKING, Any, Literal, cast
|
|
|
22
22
|
|
|
23
23
|
from textual.content import Content
|
|
24
24
|
|
|
25
|
+
from deepagents_code.unicode_security import strip_dangerous_unicode
|
|
26
|
+
|
|
25
27
|
if TYPE_CHECKING:
|
|
26
28
|
from collections.abc import Mapping, Sequence
|
|
27
29
|
|
|
@@ -102,9 +104,9 @@ def build_snapshot(workspace_payload: Mapping[str, Any]) -> dict[str, object]:
|
|
|
102
104
|
|
|
103
105
|
"""
|
|
104
106
|
snapshot: dict[str, object] = {}
|
|
105
|
-
for key in sorted(SAFE_SNAPSHOT_FIELDS):
|
|
106
|
-
value = _safe_value(workspace_payload
|
|
107
|
-
if value is None:
|
|
107
|
+
for key in sorted(SAFE_SNAPSHOT_FIELDS & workspace_payload.keys()):
|
|
108
|
+
value = _safe_value(workspace_payload[key])
|
|
109
|
+
if value is None and workspace_payload[key] is not None:
|
|
108
110
|
continue
|
|
109
111
|
candidate = {**snapshot, key: value}
|
|
110
112
|
serialized = json.dumps(candidate, sort_keys=True, separators=(",", ":"))
|
|
@@ -357,6 +359,11 @@ def diff_snapshots(
|
|
|
357
359
|
name=key,
|
|
358
360
|
bound=bound_fields.get(key),
|
|
359
361
|
current=current_fields.get(key),
|
|
362
|
+
state=(
|
|
363
|
+
"changed"
|
|
364
|
+
if key in bound_fields and key in current_fields
|
|
365
|
+
else "values_unavailable"
|
|
366
|
+
),
|
|
360
367
|
)
|
|
361
368
|
for key in sorted(set(bound_fields) | set(current_fields))
|
|
362
369
|
if bound_fields.get(key) != current_fields.get(key)
|
|
@@ -412,19 +419,28 @@ def format_diagnostics_content(diagnostics: WorkspaceDiagnostics) -> Content:
|
|
|
412
419
|
"""
|
|
413
420
|
lines = [Content.styled(f"Server refusal: {diagnostics.reason}", "bold")]
|
|
414
421
|
if diagnostics.changes:
|
|
415
|
-
lines.append(
|
|
422
|
+
lines.append(
|
|
423
|
+
Content("To resume this thread, restore these settings and relaunch:")
|
|
424
|
+
)
|
|
416
425
|
for change in diagnostics.changes:
|
|
417
426
|
if change.state == "values_unavailable":
|
|
418
427
|
lines.append(
|
|
419
|
-
Content.from_markup(
|
|
428
|
+
Content.from_markup(
|
|
429
|
+
" • Restore $field to its original value (unavailable)",
|
|
430
|
+
field=strip_dangerous_unicode(change.name),
|
|
431
|
+
)
|
|
420
432
|
)
|
|
421
433
|
else:
|
|
422
434
|
lines.append(
|
|
423
435
|
Content.from_markup(
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
436
|
+
(
|
|
437
|
+
" • Unset $field (currently $current)"
|
|
438
|
+
if change.bound is None
|
|
439
|
+
else " • Set $field to $bound (currently $current)"
|
|
440
|
+
),
|
|
441
|
+
field=strip_dangerous_unicode(change.name),
|
|
442
|
+
bound=strip_dangerous_unicode(_display_value(change.bound)),
|
|
443
|
+
current=strip_dangerous_unicode(_display_value(change.current)),
|
|
428
444
|
)
|
|
429
445
|
)
|
|
430
446
|
if diagnostics.snapshot_status == "unavailable":
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "deepagents-code"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.77"
|
|
8
8
|
description = "Terminal coding agent built on the Deep Agents SDK - works with any model, with persistent memory, customizable skills, subagents, and approval controls."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "MIT" }
|
|
@@ -27,7 +27,7 @@ classifiers = [
|
|
|
27
27
|
]
|
|
28
28
|
dependencies = [
|
|
29
29
|
# Framework
|
|
30
|
-
"deepagents==0.7.
|
|
30
|
+
"deepagents==0.7.19",
|
|
31
31
|
"langchain>=1.4.2,<2.0.0",
|
|
32
32
|
"langgraph-checkpoint-sqlite>=3.1.1,<4.0.0",
|
|
33
33
|
|