deepagents-code 0.1.44__tar.gz → 0.1.45__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.44 → deepagents_code-0.1.45}/AGENTS.md +1 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/CHANGELOG.md +31 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/PKG-INFO +30 -30
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/THREAT_MODEL.md +2 -1
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/_build_info.py +1 -1
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/_constants.py +14 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/_env_vars.py +20 -4
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/_git.py +177 -0
- deepagents_code-0.1.45/deepagents_code/_glm_5p2_profile.py +309 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/_server_config.py +98 -2
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/_textual_patches.py +24 -22
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/agent.py +195 -6
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/app.py +761 -125
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/auto_mode.py +563 -20
- deepagents_code-0.1.45/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +50 -0
- deepagents_code-0.1.45/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +638 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/client/commands/tools.py +7 -5
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/client/launch/server.py +234 -131
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/client/launch/server_manager.py +12 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/client/non_interactive.py +7 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/command_registry.py +1 -1
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/config.py +74 -14
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/config_manifest.py +17 -5
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/goal_rubric.py +13 -1
- deepagents_code-0.1.45/deepagents_code/hooks/__init__.py +24 -0
- deepagents_code-0.1.45/deepagents_code/hooks/engine.py +82 -0
- deepagents_code-0.1.44/deepagents_code/hooks.py → deepagents_code-0.1.45/deepagents_code/hooks/legacy.py +15 -7
- deepagents_code-0.1.45/deepagents_code/hooks/models/__init__.py +1 -0
- deepagents_code-0.1.45/deepagents_code/hooks/models/adapters.py +24 -0
- deepagents_code-0.1.45/deepagents_code/hooks/models/config.py +46 -0
- deepagents_code-0.1.45/deepagents_code/hooks/models/domain.py +359 -0
- deepagents_code-0.1.45/deepagents_code/hooks/models/transport.py +40 -0
- deepagents_code-0.1.45/deepagents_code/hooks/models/wire.py +446 -0
- deepagents_code-0.1.45/deepagents_code/hooks/projection.py +229 -0
- deepagents_code-0.1.45/deepagents_code/hooks/reducer.py +331 -0
- deepagents_code-0.1.45/deepagents_code/hooks/runner.py +239 -0
- deepagents_code-0.1.45/deepagents_code/hooks/snapshot.py +209 -0
- deepagents_code-0.1.45/deepagents_code/hooks/tools.py +116 -0
- deepagents_code-0.1.45/deepagents_code/json_types.py +12 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/local_context.py +124 -58
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/main.py +137 -20
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/mcp_tools.py +146 -61
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/model_config.py +268 -85
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/plugins/models.py +2 -2
- deepagents_code-0.1.45/deepagents_code/reasoning_effort.py +332 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/server_graph.py +1 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/system_prompt.md +1 -7
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tool_catalog.py +52 -1
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/modals/plugin_manager/__init__.py +26 -13
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/modals/plugin_manager/content.py +10 -3
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -1
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/_inline_prompt.py +20 -18
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/_paste_textarea.py +118 -2
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/ask_user.py +2 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/chat_input.py +36 -98
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/debug_console.py +101 -17
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/goal_review.py +4 -3
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/model_selector.py +2 -2
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/welcome.py +31 -2
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/ui.py +4 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/update_check.py +32 -3
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/pyproject.toml +32 -30
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/scripts/install.sh +209 -61
- deepagents_code-0.1.45/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +315 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/client/commands/test_tools.py +32 -1
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/conftest.py +3 -3
- deepagents_code-0.1.45/tests/unit_tests/hooks/__init__.py +1 -0
- deepagents_code-0.1.45/tests/unit_tests/hooks/models/__init__.py +1 -0
- deepagents_code-0.1.45/tests/unit_tests/hooks/models/test_models.py +428 -0
- deepagents_code-0.1.45/tests/unit_tests/hooks/test_engine.py +1067 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/plugins/test_plugins_p0.py +3 -3
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/skills/test_load.py +23 -0
- deepagents_code-0.1.45/tests/unit_tests/skills/test_thread_inspector.py +676 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +2 -3
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_agent.py +755 -7
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_app.py +2056 -229
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_auto_mode.py +715 -1
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_config.py +181 -10
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_configurable_model.py +26 -1
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_debug_console.py +272 -3
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_extras_info.py +1 -1
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_git.py +211 -0
- deepagents_code-0.1.45/tests/unit_tests/test_glm_5p2_profile.py +363 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_goal_rubric.py +233 -2
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_hooks.py +1 -1
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_install_script.py +360 -5
- deepagents_code-0.1.45/tests/unit_tests/test_json_types.py +35 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_local_context.py +205 -5
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_main.py +317 -7
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_main_acp_mode.py +86 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_main_args.py +271 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_mcp_login_service.py +3 -1
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_mcp_tools.py +248 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_model_config.py +648 -19
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_model_switch.py +4 -9
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_non_interactive.py +53 -0
- deepagents_code-0.1.45/tests/unit_tests/test_reasoning_effort.py +1383 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_reload.py +63 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_server.py +224 -5
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_server_graph.py +7 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_server_manager.py +147 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_textual_patches.py +7 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_tool_catalog.py +128 -3
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_update_check.py +40 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +75 -10
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_ask_user.py +17 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_chat_input.py +96 -4
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_goal_review.py +33 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_inline_prompt.py +145 -1
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_status.py +2 -2
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_welcome.py +103 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/uv.lock +1487 -1562
- deepagents_code-0.1.44/deepagents_code/reasoning_effort.py +0 -641
- deepagents_code-0.1.44/tests/unit_tests/test_reasoning_effort.py +0 -833
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/.gitignore +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/ARCHITECTURE.md +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/COMMANDS.md +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/DEVELOPMENT.md +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/Makefile +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/README.md +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/_debug_buffer.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/_fake_models.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/_paths.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/_tool_stream.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/approval_mode.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/client/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/client/commands/auth.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/client/commands/config.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/client/commands/mcp.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/client/launch/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/client/remote_client.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/configurable_model.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/doctor.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/extras_info.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/goal_tools.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/integrations/sandbox_factory.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/managed_tools.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/mcp_auth.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/mcp_config.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/offload.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/offload_middleware.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/paste_collapse.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/plugins/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/plugins/_json.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/plugins/adapters/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/plugins/adapters/mcp.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/plugins/adapters/skills.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/plugins/commands_cli.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/plugins/discovery.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/plugins/manifest.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/plugins/marketplace.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/plugins/store.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/plugins/substitution.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/reliable_rubric.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/sessions.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/skills/merge.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/skills/trust.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/todo_list_prompt.md +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/screens/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/textual_adapter.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/_links.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/approval.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/auth.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/codex_auth.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/diff.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/effort_selector.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/goal_status.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/history.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/install_confirm.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/loading.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/message_store.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/messages.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/plugin_reload.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/skill_trust.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/startup_tip.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/status.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/thread_selector.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/update_available.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/update_confirm.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/hatch_build.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/images/tui.png +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/README.md +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/integration_tests/test_auto_approve_remote.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/integration_tests/test_offload_server_side.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/client/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/client/commands/test_auth.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/client/commands/test_mcp.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/plugins/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/plugins/test_marketplace.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/plugins/test_store.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/skills/test_merge.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/skills/test_skill_trust.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/smoke_tests/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/smoke_tests/conftest.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test__tool_stream.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_approval_mode.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_args.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_config_manifest.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_cursor_blink.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_cursor_style.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_debug_buffer.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_doctor.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_goal_criteria_client.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_goal_tools.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_hatch_build.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_install_command.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_managed_tools.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_mcp_config.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_paths.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_reliable_rubric.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_rubric_cli.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_sandbox_registry.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_startup_blocking.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_threads_resume.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_tracing_replicas.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_transcript_virtualization.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_history.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_links.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_plugin_reload.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
- {deepagents_code-0.1.44 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
|
@@ -62,6 +62,7 @@ Apply these rules to new UI; do not treat them as a mandate to refactor existing
|
|
|
62
62
|
- Co-locate a screen's `.tcss` file with its root component and set `CSS_PATH` relative to that module. Its styles may target sibling and small nested components, but a large nested component should generally own its own stylesheet.
|
|
63
63
|
- Widgets cannot use `CSS_PATH`; put intrinsic, auto-scoped defaults in `DEFAULT_CSS`. The mounting screen owns the widget's sizing and placement.
|
|
64
64
|
- Children must not import parent components. They may import shared utilities and data models; send events up and pass state/data down.
|
|
65
|
+
- A `ModalScreen` root inherits Textual's default translucent backdrop (`background: $background 60%`, which degrades to transparent under ansi themes) so it dims and composites the content underneath. Don't override it with `background: transparent` unless the modal is deliberately a non-dimming popover (as some selector overlays are); doing so by accident removes the dim.
|
|
65
66
|
|
|
66
67
|
### Testing Textual apps
|
|
67
68
|
|
|
@@ -2,6 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.1.45](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.44...deepagents-code==0.1.45) (2026-07-22)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- Added the Hooks v2 execution engine and typed hooks data models ([#4880](https://github.com/langchain-ai/deepagents/issues/4880), [#4870](https://github.com/langchain-ai/deepagents/issues/4870))
|
|
10
|
+
- Added a filesystem tool allowlist for `dcode` with `--allow-fs-tools` ([#4635](https://github.com/langchain-ai/deepagents/issues/4635))
|
|
11
|
+
- Added a GLM-5.2 harness profile ([#4710](https://github.com/langchain-ai/deepagents/issues/4710))
|
|
12
|
+
- Added a built-in thread inspector skill ([#4769](https://github.com/langchain-ai/deepagents/issues/4769))
|
|
13
|
+
- Replaced Gemini 3.5 Flash with Gemini 3.6 Flash in the model switcher ([#4890](https://github.com/langchain-ai/deepagents/issues/4890))
|
|
14
|
+
- Show experimental mode in the splash screen and debug console ([#4863](https://github.com/langchain-ai/deepagents/issues/4863))
|
|
15
|
+
- Gate debug console click-to-copy behind a checkbox ([#4810](https://github.com/langchain-ai/deepagents/issues/4810))
|
|
16
|
+
|
|
17
|
+
### Bug Fixes
|
|
18
|
+
|
|
19
|
+
- Improved scratch-file handling by allowing cleanup of agent-created scratch files and safe OS-temp scratch artifacts ([#4860](https://github.com/langchain-ai/deepagents/issues/4860), [#4869](https://github.com/langchain-ai/deepagents/issues/4869))
|
|
20
|
+
- Skip grading during `/goal` proposals ([#4941](https://github.com/langchain-ai/deepagents/issues/4941))
|
|
21
|
+
- Improved MCP approval handling: Esc now aborts project MCP approval, disabled MCP servers are honored for plugins, remembered approvals are preserved with the env allowlist, and approvals are shared across Git worktrees ([#4888](https://github.com/langchain-ai/deepagents/issues/4888), [#4848](https://github.com/langchain-ai/deepagents/issues/4848), [#4889](https://github.com/langchain-ai/deepagents/issues/4889), [#4939](https://github.com/langchain-ai/deepagents/issues/4939))
|
|
22
|
+
- Hardened installer downloads and paths ([#4871](https://github.com/langchain-ai/deepagents/issues/4871))
|
|
23
|
+
- Fixed forced `dcode update` checks to bust the CDN cache ([#4862](https://github.com/langchain-ai/deepagents/issues/4862))
|
|
24
|
+
- Prevented failed exit setup from stranding the app ([#4913](https://github.com/langchain-ai/deepagents/issues/4913))
|
|
25
|
+
- Fixed routing so `ctrl+x` goes to the focused `ask_user` input ([#4926](https://github.com/langchain-ai/deepagents/issues/4926))
|
|
26
|
+
- Show `-m` prompts as queued immediately on startup ([#4861](https://github.com/langchain-ai/deepagents/issues/4861))
|
|
27
|
+
- Kept harness-profile diagnostics out of terminal output ([#4943](https://github.com/langchain-ai/deepagents/issues/4943))
|
|
28
|
+
- Avoid tracking inline restart callers ([#4894](https://github.com/langchain-ai/deepagents/issues/4894))
|
|
29
|
+
- Fixed debug console thread ID copying on click ([#4945](https://github.com/langchain-ai/deepagents/issues/4945))
|
|
30
|
+
|
|
31
|
+
### Performance Improvements
|
|
32
|
+
|
|
33
|
+
- Reduced exit latency by coordinating async shutdown teardown ([#4831](https://github.com/langchain-ai/deepagents/issues/4831))
|
|
34
|
+
- Sped up local context detection ([#4922](https://github.com/langchain-ai/deepagents/issues/4922))
|
|
35
|
+
|
|
5
36
|
## [0.1.44](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.43...deepagents-code==0.1.44) (2026-07-20)
|
|
6
37
|
|
|
7
38
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.45
|
|
4
4
|
Summary: Terminal coding agent built on the Deep Agents SDK - works with any model, with persistent memory, customizable skills, subagents, and approval controls.
|
|
5
5
|
Project-URL: Homepage, https://docs.langchain.com/oss/python/deepagents/overview
|
|
6
6
|
Project-URL: Documentation, https://reference.langchain.com/python/deepagents/
|
|
@@ -26,26 +26,26 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
26
26
|
Classifier: Topic :: Terminals
|
|
27
27
|
Requires-Python: <4.0,>=3.11
|
|
28
28
|
Requires-Dist: aiosqlite<1.0.0,>=0.22.1
|
|
29
|
-
Requires-Dist: anyio<5.0.0,>=4.
|
|
30
|
-
Requires-Dist: deepagents-acp<1.0.0,>=0.0.
|
|
31
|
-
Requires-Dist: deepagents==0.7.
|
|
32
|
-
Requires-Dist: filelock<3.30,>=3.
|
|
29
|
+
Requires-Dist: anyio<5.0.0,>=4.14.2
|
|
30
|
+
Requires-Dist: deepagents-acp<1.0.0,>=0.0.9
|
|
31
|
+
Requires-Dist: deepagents==0.7.0a8
|
|
32
|
+
Requires-Dist: filelock<3.30,>=3.29.7
|
|
33
33
|
Requires-Dist: httpx<1.0.0,>=0.28.1
|
|
34
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.
|
|
35
|
-
Requires-Dist: langchain-google-genai<5.0.0,>=4.
|
|
34
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.0
|
|
35
|
+
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1
|
|
36
36
|
Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.0
|
|
37
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.
|
|
37
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.4.0
|
|
38
38
|
Requires-Dist: langchain-quickjs<0.4.0,>=0.3.3
|
|
39
|
-
Requires-Dist: langchain<2.0.0,>=1.3.
|
|
39
|
+
Requires-Dist: langchain<2.0.0,>=1.3.14
|
|
40
40
|
Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
|
|
41
|
-
Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.
|
|
42
|
-
Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.31.
|
|
41
|
+
Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.31
|
|
42
|
+
Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.31.1
|
|
43
43
|
Requires-Dist: langgraph-sdk<1.0.0,>=0.4.2
|
|
44
|
-
Requires-Dist: langsmith[sandbox]>=0.9
|
|
45
|
-
Requires-Dist: markdownify<2.0.0,>=1.2.
|
|
44
|
+
Requires-Dist: langsmith[sandbox]>=0.10.9
|
|
45
|
+
Requires-Dist: markdownify<2.0.0,>=1.2.3
|
|
46
46
|
Requires-Dist: mcp<2.0.0,>=1.28.1
|
|
47
47
|
Requires-Dist: packaging>=26.2
|
|
48
|
-
Requires-Dist: pillow<13.0.0,>=12.
|
|
48
|
+
Requires-Dist: pillow<13.0.0,>=12.3.0
|
|
49
49
|
Requires-Dist: prompt-toolkit<4.0.0,>=3.0.52
|
|
50
50
|
Requires-Dist: pydantic<2.14.0a0,>=2.12.5
|
|
51
51
|
Requires-Dist: pyperclip<2.0.0,>=1.11.0
|
|
@@ -56,20 +56,20 @@ Requires-Dist: rich<16.0.0,>=15.0.0
|
|
|
56
56
|
Requires-Dist: tavily-python<1.0.0,>=0.7.26
|
|
57
57
|
Requires-Dist: textual-autocomplete<5.0.0,>=4.0.6
|
|
58
58
|
Requires-Dist: textual-speedups<1.0.0,>=0.2.1
|
|
59
|
-
Requires-Dist: textual<9.0.0,>=8.2.
|
|
59
|
+
Requires-Dist: textual<9.0.0,>=8.2.8
|
|
60
60
|
Requires-Dist: tomli-w<2.0.0,>=1.2.0
|
|
61
|
-
Requires-Dist: uuid-utils<1.0.0,>=0.
|
|
61
|
+
Requires-Dist: uuid-utils<1.0.0,>=0.17.0
|
|
62
62
|
Provides-Extra: agentcore
|
|
63
63
|
Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.5; extra == 'agentcore'
|
|
64
64
|
Provides-Extra: all-providers
|
|
65
|
-
Requires-Dist: aiohttp<3.15.0,>=3.14.
|
|
66
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.
|
|
65
|
+
Requires-Dist: aiohttp<3.15.0,>=3.14.2; extra == 'all-providers'
|
|
66
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.0; extra == 'all-providers'
|
|
67
67
|
Requires-Dist: langchain-aws<2.0.0,>=1.6.2; extra == 'all-providers'
|
|
68
68
|
Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'all-providers'
|
|
69
69
|
Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
|
|
70
70
|
Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
71
|
-
Requires-Dist: langchain-fireworks<2.0.0,>=1.
|
|
72
|
-
Requires-Dist: langchain-google-genai<5.0.0,>=4.
|
|
71
|
+
Requires-Dist: langchain-fireworks<2.0.0,>=1.5.0; extra == 'all-providers'
|
|
72
|
+
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1; extra == 'all-providers'
|
|
73
73
|
Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.4; extra == 'all-providers'
|
|
74
74
|
Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'all-providers'
|
|
75
75
|
Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'all-providers'
|
|
@@ -79,11 +79,11 @@ Requires-Dist: langchain-meta<2.0.0,>=0.5.0; extra == 'all-providers'
|
|
|
79
79
|
Requires-Dist: langchain-mistralai<2.0.0,>=1.1.6; extra == 'all-providers'
|
|
80
80
|
Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'all-providers'
|
|
81
81
|
Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
82
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.
|
|
82
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.4.0; extra == 'all-providers'
|
|
83
83
|
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.6; extra == 'all-providers'
|
|
84
84
|
Requires-Dist: langchain-perplexity<2.0.0,>=1.4.0; extra == 'all-providers'
|
|
85
85
|
Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'all-providers'
|
|
86
|
-
Requires-Dist: langchain-xai<2.0.0,>=1.
|
|
86
|
+
Requires-Dist: langchain-xai<2.0.0,>=1.3.0; extra == 'all-providers'
|
|
87
87
|
Provides-Extra: all-sandboxes
|
|
88
88
|
Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.5; extra == 'all-sandboxes'
|
|
89
89
|
Requires-Dist: langchain-daytona>=0.0.7; extra == 'all-sandboxes'
|
|
@@ -91,7 +91,7 @@ Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
|
|
|
91
91
|
Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
|
|
92
92
|
Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
|
|
93
93
|
Provides-Extra: anthropic
|
|
94
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.
|
|
94
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.0; extra == 'anthropic'
|
|
95
95
|
Provides-Extra: baseten
|
|
96
96
|
Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'baseten'
|
|
97
97
|
Provides-Extra: bedrock
|
|
@@ -103,9 +103,9 @@ Requires-Dist: langchain-daytona>=0.0.7; extra == 'daytona'
|
|
|
103
103
|
Provides-Extra: deepseek
|
|
104
104
|
Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'deepseek'
|
|
105
105
|
Provides-Extra: fireworks
|
|
106
|
-
Requires-Dist: langchain-fireworks<2.0.0,>=1.
|
|
106
|
+
Requires-Dist: langchain-fireworks<2.0.0,>=1.5.0; extra == 'fireworks'
|
|
107
107
|
Provides-Extra: google-genai
|
|
108
|
-
Requires-Dist: langchain-google-genai<5.0.0,>=4.
|
|
108
|
+
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1; extra == 'google-genai'
|
|
109
109
|
Provides-Extra: groq
|
|
110
110
|
Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'groq'
|
|
111
111
|
Provides-Extra: huggingface
|
|
@@ -115,8 +115,8 @@ Requires-Dist: langchain-ibm<2.0.0,>=1.1.0; extra == 'ibm'
|
|
|
115
115
|
Provides-Extra: litellm
|
|
116
116
|
Requires-Dist: langchain-litellm<2.0.0,>=0.7.0; extra == 'litellm'
|
|
117
117
|
Provides-Extra: media
|
|
118
|
-
Requires-Dist: av<18.0.0,>=17.
|
|
119
|
-
Requires-Dist: pillow<13.0.0,>=12.
|
|
118
|
+
Requires-Dist: av<18.0.0,>=17.1.0; extra == 'media'
|
|
119
|
+
Requires-Dist: pillow<13.0.0,>=12.3.0; extra == 'media'
|
|
120
120
|
Provides-Extra: meta
|
|
121
121
|
Requires-Dist: langchain-meta<2.0.0,>=0.5.0; extra == 'meta'
|
|
122
122
|
Provides-Extra: mistralai
|
|
@@ -124,12 +124,12 @@ Requires-Dist: langchain-mistralai<2.0.0,>=1.1.6; extra == 'mistralai'
|
|
|
124
124
|
Provides-Extra: modal
|
|
125
125
|
Requires-Dist: langchain-modal>=0.0.5; extra == 'modal'
|
|
126
126
|
Provides-Extra: nvidia
|
|
127
|
-
Requires-Dist: aiohttp<3.15.0,>=3.14.
|
|
127
|
+
Requires-Dist: aiohttp<3.15.0,>=3.14.2; extra == 'nvidia'
|
|
128
128
|
Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'nvidia'
|
|
129
129
|
Provides-Extra: ollama
|
|
130
130
|
Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'ollama'
|
|
131
131
|
Provides-Extra: openai
|
|
132
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.
|
|
132
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.4.0; extra == 'openai'
|
|
133
133
|
Provides-Extra: openrouter
|
|
134
134
|
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.6; extra == 'openrouter'
|
|
135
135
|
Provides-Extra: perplexity
|
|
@@ -144,7 +144,7 @@ Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'vercel'
|
|
|
144
144
|
Provides-Extra: vertex
|
|
145
145
|
Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.4; extra == 'vertex'
|
|
146
146
|
Provides-Extra: xai
|
|
147
|
-
Requires-Dist: langchain-xai<2.0.0,>=1.
|
|
147
|
+
Requires-Dist: langchain-xai<2.0.0,>=1.3.0; extra == 'xai'
|
|
148
148
|
Description-Content-Type: text/markdown
|
|
149
149
|
|
|
150
150
|
# 🧠🤖 Deep Agents Code
|
|
@@ -231,7 +231,7 @@
|
|
|
231
231
|
|
|
232
232
|
#### TB4: MCP Config → Process / Network
|
|
233
233
|
|
|
234
|
-
- **Inside**: `mcp_tools._validate_server_config` validates JSON structure and field types. Project-level servers (stdio and remote) require approval: an interactive prompt (`main._check_mcp_project_trust`) that offers allow-for-this-session ("y"), remember a chosen subset of servers ("r"), or deny ("N") — unless `--trust-project-mcp` is set, which trusts the whole config for the run. Whole-config trust is never persisted; it exists only as in-memory run state, set by `--trust-project-mcp` or by an interactive allow-once/remember decision. The remembered subset governs only what is persisted for future runs — both allow-once and remember load every prompted server for the current session. Persistent "remember" (a.k.a. "always allow") decisions are stored in `[mcp].enabled_project_server_approvals` with project
|
|
234
|
+
- **Inside**: `mcp_tools._validate_server_config` validates JSON structure and field types. Project-level servers (stdio and remote) require approval: an interactive prompt (`main._check_mcp_project_trust`) that offers allow-for-this-session ("y"), remember a chosen subset of servers ("r"), or deny ("N") — unless `--trust-project-mcp` is set, which trusts the whole config for the run. Whole-config trust is never persisted; it exists only as in-memory run state, set by `--trust-project-mcp` or by an interactive allow-once/remember decision. The remembered subset governs only what is persisted for future runs — both allow-once and remember load every prompted server for the current session. Persistent "remember" (a.k.a. "always allow") decisions are stored in `[mcp].enabled_project_server_approvals` with a local-project identity, server name, and server definition fingerprint. Remote server approvals with fixed URLs are shared by main checkouts and linked worktrees only through validated reciprocal Git common-directory metadata; independent clones remain separate, and non-Git or malformed/forged metadata falls back to the exact resolved root. Remote definitions with interpolated URLs remain exact-worktree scoped because project `.env` files can resolve the same template to different endpoints. Local stdio server approvals always use the exact resolved worktree root because the same command can execute different files in another checkout. A changed command, URL, or transport under the same name requires re-approval. Users can reject individual project server names via `[mcp].disabled_project_servers` (or `DEEPAGENTS_CODE_DISABLED_PROJECT_MCP_SERVERS`). There is also an explicit process-wide escape hatch, `DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS`, that approves matching names globally and intentionally bypasses the project/fingerprint binding. Reject wins over approval and over full trust, with one documented exception: if the user's `config.toml` is unreadable (see below), any deny defined *only* there is lost, so a name that is both TOML-`disabled` and exported in `DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS` survives — an accepted footgun (`load_mcp_server_trust_lists` documents it inline) that requires a self-contradicting config plus the explicit dangerous opt-in, and the read error is surfaced to the user. These policies are read by `model_config.load_mcp_server_trust_lists` only from user-controlled sources — the user-level `~/.deepagents/config.toml`, the global `~/.deepagents/.env`, and shell-exported env — never from `.mcp.json` or any repo-committed file, so a committed config cannot self-approve its own servers. In particular, the env forms (`DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS` / `..._DISABLED_...`) are added to `config._PROJECT_DOTENV_DENIED_ENV_KEYS`, so a committed *project* `.env` cannot inject them into `os.environ` even though it is loaded at bootstrap. The dangerous enable env var and scoped TOML approvals are independent grants: setting the env var, including to an empty value, does not suppress remembered approvals. Disabled *unions* TOML and env so a deny can never be silently emptied by the other source. If the user's `config.toml` exists but cannot be read or parsed, the loader fails closed (project configs are treated as untrusted and the error is surfaced) rather than proceeding with an empty deny list. Only scoped-approved, dangerously env-enabled, or fully trusted names survive into the merged config, so a non-approved remote entry is never preflighted and its interpolated headers are never resolved.
|
|
235
235
|
- **Outside**: Stdio server `command`, `args`, and `env` fields are user-controlled strings passed directly to `StdioConnection`. The `env` dict from MCP config is forwarded without filtering — users can set arbitrary environment variables (including `PATH`, `LD_PRELOAD`, `PYTHONPATH`) for the MCP subprocess.
|
|
236
236
|
- **Crossing mechanism**: `subprocess.Popen` (via `langchain_mcp_adapters`) for stdio; HTTP/SSE for remote servers.
|
|
237
237
|
|
|
@@ -494,3 +494,4 @@ Threats that appear valid in isolation but fall outside project responsibility b
|
|
|
494
494
|
| 2026-06-25 | manual update | Added T12 (project `.env` injects shell interpreter startup hooks) under TB11; extended the TB11 boundary controls and details with the dotenv shell-startup-hook denylist (`BASH_ENV`, `ENV`); clarified the `.env` out-of-scope row to separate ordinary config discovery from the in-scope code-execution implication |
|
|
495
495
|
| 2026-06-25 | manual update | Updated T6 and TB10 to reflect the dev server binding an OS-assigned ephemeral port by default (`server._EPHEMERAL_PORT`) instead of squatting the well-known `langgraph dev` port 2024; noted unpredictable-port-across-runs as added defense-in-depth in the port-discovery dismissal row |
|
|
496
496
|
| 2026-07-08 | manual update | Removed the SHA-256 config fingerprint trust store (`mcp_trust.py`, `~/.deepagents/.state/mcp_trust.json`, DC4). Project MCP trust is now the interactive approval prompt (allow-for-session / always-allow scoped to project root + server-definition fingerprint / deny), the `--trust-project-mcp` run flag, the `[mcp].enabled_project_server_approvals` and `[mcp].disabled_project_servers` lists, and the process-wide `DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS` name-based escape hatch. The legacy flat `[mcp].enabled_project_servers` key is ignored. Persisted approvals bind to a server definition's fingerprint rather than a whole-config fingerprint. Updated C5, TB4, T10, the configuration input-coverage row, and the malicious-MCP-server dismissal accordingly |
|
|
497
|
+
| 2026-07-21 | manual update | Clarified TB4 after process-wide MCP names and scoped remembered approvals changed from replacement semantics to independent grants. An empty process-wide allowlist no longer suppresses remembered approvals; disabled-server precedence is unchanged. |
|
|
@@ -13,6 +13,20 @@ from typing import Final
|
|
|
13
13
|
DEFAULT_AGENT_NAME: Final[str] = "agent"
|
|
14
14
|
"""Default agent / assistant identifier when no `-a` flag is given."""
|
|
15
15
|
|
|
16
|
+
FS_TOOL_NAMES: Final[frozenset[str]] = frozenset(
|
|
17
|
+
{"ls", "read_file", "write_file", "edit_file", "delete", "glob", "grep", "execute"}
|
|
18
|
+
)
|
|
19
|
+
"""Mirror of the SDK's `FsToolName` literal members.
|
|
20
|
+
|
|
21
|
+
Hardcoded here rather than derived from `deepagents.FsToolName` because
|
|
22
|
+
`deepagents` must not be imported on the arg-parsing hot path (see AGENTS.md
|
|
23
|
+
"Startup performance"); this module is dependency-free and safe for `main.py` to
|
|
24
|
+
import. Consumers (`main._parse_allow_fs_tools_flag`,
|
|
25
|
+
`tool_catalog.collect_built_in_tools`) alias this set, and `get_args(FsToolName)`
|
|
26
|
+
drift guards in `test_main_args` and `test_tool_catalog` pin it so a new or
|
|
27
|
+
renamed SDK filesystem tool fails a test instead of silently diverging.
|
|
28
|
+
"""
|
|
29
|
+
|
|
16
30
|
FIREWORKS_PROVIDER_ID_PREFIX: Final[str] = "accounts/fireworks/"
|
|
17
31
|
"""Prefix used to infer Fireworks from fully-qualified IDs."""
|
|
18
32
|
|
|
@@ -67,10 +67,11 @@ file, so it does not weaken the user-level-only trust boundary (a committed
|
|
|
67
67
|
This dangerous contract is name-based: a different project, command change, or
|
|
68
68
|
URL change under the same server name still matches.
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
`[mcp].enabled_project_server_approvals` TOML approvals.
|
|
72
|
-
|
|
73
|
-
|
|
70
|
+
This process-wide allowlist and the scoped
|
|
71
|
+
`[mcp].enabled_project_server_approvals` TOML approvals are independent grants.
|
|
72
|
+
Setting this variable, including to an empty value, does not suppress remembered
|
|
73
|
+
project approvals. (`DISABLED_PROJECT_MCP_SERVERS` instead *unions* with its
|
|
74
|
+
TOML list, so a deny is never silently emptied.)
|
|
74
75
|
"""
|
|
75
76
|
|
|
76
77
|
DEBUG = "DEEPAGENTS_CODE_DEBUG"
|
|
@@ -80,6 +81,21 @@ Parsed by `is_env_truthy`: accepts `1`, `true`, `yes`, `on` (case-insensitive)
|
|
|
80
81
|
as enabled, and `0`, `false`, `no`, `off`, empty string, or unset as disabled.
|
|
81
82
|
"""
|
|
82
83
|
|
|
84
|
+
DEBUG_CONSOLE_CLICK_TO_COPY = "DEEPAGENTS_CODE_DEBUG_CONSOLE_CLICK_TO_COPY"
|
|
85
|
+
r"""Enable click-to-copy in the `Ctrl+\` Debug Console when enabled.
|
|
86
|
+
|
|
87
|
+
Off by default; toggle the "Click to copy" checkbox in the console or set
|
|
88
|
+
`[ui].debug_console_click_to_copy` in config.toml. A recognized value is parsed
|
|
89
|
+
by `classify_env_bool`; an unrecognized value falls through to the config value.
|
|
90
|
+
An empty/whitespace value is ignored before parsing (rather than being treated
|
|
91
|
+
as falsy) and also falls through, so it never masks the saved preference.
|
|
92
|
+
|
|
93
|
+
When set, this env var takes precedence over the persisted
|
|
94
|
+
`[ui].debug_console_click_to_copy` config value on launch, so toggling the
|
|
95
|
+
checkbox will not appear to "stick" across restarts while the env var remains
|
|
96
|
+
set.
|
|
97
|
+
"""
|
|
98
|
+
|
|
83
99
|
DEBUG_FILE = "DEEPAGENTS_CODE_DEBUG_FILE"
|
|
84
100
|
"""Path for the debug log file (default: `DEFAULT_DEBUG_FILE`)."""
|
|
85
101
|
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import logging
|
|
6
|
+
import os
|
|
6
7
|
import re
|
|
7
8
|
from pathlib import Path
|
|
8
9
|
from typing import NamedTuple
|
|
@@ -159,6 +160,182 @@ def find_git_root(path: str | Path) -> Path | None:
|
|
|
159
160
|
return None
|
|
160
161
|
|
|
161
162
|
|
|
163
|
+
def _read_single_git_metadata_line(path: Path) -> str | None:
|
|
164
|
+
"""Read one non-empty line from a regular Git metadata file.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
path: Metadata file to read.
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
The stripped line, or `None` when the file is unsafe or malformed.
|
|
171
|
+
"""
|
|
172
|
+
if path.is_symlink() or not path.is_file():
|
|
173
|
+
return None
|
|
174
|
+
try:
|
|
175
|
+
raw = path.read_text(encoding="utf-8")
|
|
176
|
+
except (OSError, UnicodeError):
|
|
177
|
+
logger.debug("Failed to read Git metadata from %s", path, exc_info=True)
|
|
178
|
+
return None
|
|
179
|
+
|
|
180
|
+
lines = raw.splitlines()
|
|
181
|
+
if len(lines) != 1:
|
|
182
|
+
return None
|
|
183
|
+
value = lines[0].strip()
|
|
184
|
+
if not value or "\x00" in value:
|
|
185
|
+
return None
|
|
186
|
+
return value
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def _resolve_git_metadata_path(path: Path, *, relative_to: Path) -> Path | None:
|
|
190
|
+
"""Resolve a path stored in a single-line Git metadata file.
|
|
191
|
+
|
|
192
|
+
Args:
|
|
193
|
+
path: Metadata file containing the path.
|
|
194
|
+
relative_to: Base directory for a relative stored path.
|
|
195
|
+
|
|
196
|
+
Returns:
|
|
197
|
+
The strictly resolved path, or `None` when it cannot be trusted.
|
|
198
|
+
"""
|
|
199
|
+
value = _read_single_git_metadata_line(path)
|
|
200
|
+
if value is None:
|
|
201
|
+
return None
|
|
202
|
+
candidate = Path(value)
|
|
203
|
+
if not candidate.is_absolute():
|
|
204
|
+
candidate = relative_to / candidate
|
|
205
|
+
try:
|
|
206
|
+
return candidate.resolve(strict=True)
|
|
207
|
+
except (OSError, RuntimeError, ValueError):
|
|
208
|
+
logger.debug("Failed to resolve Git metadata path from %s", path, exc_info=True)
|
|
209
|
+
return None
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def _normalize_git_metadata_path(path: Path, *, relative_to: Path) -> Path | None:
|
|
213
|
+
"""Normalize a stored path without following its target.
|
|
214
|
+
|
|
215
|
+
Args:
|
|
216
|
+
path: Metadata file containing the path.
|
|
217
|
+
relative_to: Base directory for a relative stored path.
|
|
218
|
+
|
|
219
|
+
Returns:
|
|
220
|
+
The absolute lexical path, or `None` when the metadata is malformed.
|
|
221
|
+
"""
|
|
222
|
+
value = _read_single_git_metadata_line(path)
|
|
223
|
+
if value is None:
|
|
224
|
+
return None
|
|
225
|
+
candidate = Path(value)
|
|
226
|
+
if not candidate.is_absolute():
|
|
227
|
+
candidate = relative_to / candidate
|
|
228
|
+
try:
|
|
229
|
+
return Path(os.path.abspath(candidate)) # noqa: PTH100 # do not follow links
|
|
230
|
+
except (OSError, RuntimeError, ValueError):
|
|
231
|
+
logger.debug(
|
|
232
|
+
"Failed to normalize Git metadata path from %s", path, exc_info=True
|
|
233
|
+
)
|
|
234
|
+
return None
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
def _parse_trusted_git_dir_pointer(git_entry: Path) -> Path | None:
|
|
238
|
+
"""Resolve a strict worktree `.git` pointer for a trust decision.
|
|
239
|
+
|
|
240
|
+
Args:
|
|
241
|
+
git_entry: Regular `.git` file to parse.
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
The canonical administration directory, or `None` for an invalid pointer.
|
|
245
|
+
"""
|
|
246
|
+
value = _read_single_git_metadata_line(git_entry)
|
|
247
|
+
if value is None or not value.startswith(_GIT_DIR_POINTER_PREFIX):
|
|
248
|
+
return None
|
|
249
|
+
pointer = value.removeprefix(_GIT_DIR_POINTER_PREFIX).strip()
|
|
250
|
+
if not pointer:
|
|
251
|
+
return None
|
|
252
|
+
candidate = Path(pointer)
|
|
253
|
+
if not candidate.is_absolute():
|
|
254
|
+
candidate = git_entry.parent / candidate
|
|
255
|
+
try:
|
|
256
|
+
git_dir = candidate.resolve(strict=True)
|
|
257
|
+
except (OSError, RuntimeError, ValueError):
|
|
258
|
+
logger.debug(
|
|
259
|
+
"Failed to resolve trusted gitdir pointer %s", git_entry, exc_info=True
|
|
260
|
+
)
|
|
261
|
+
return None
|
|
262
|
+
return git_dir if git_dir.is_dir() else None
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def _is_valid_git_common_dir(path: Path) -> bool:
|
|
266
|
+
"""Return whether `path` has the required shared-repository metadata."""
|
|
267
|
+
return (
|
|
268
|
+
path.is_dir()
|
|
269
|
+
and (path / "HEAD").is_file()
|
|
270
|
+
and (path / "config").is_file()
|
|
271
|
+
and (path / "objects").is_dir()
|
|
272
|
+
and (path / "refs").is_dir()
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def find_git_common_dir(path: str | Path) -> Path | None:
|
|
277
|
+
"""Resolve a validated identity shared by one repository's Git worktrees.
|
|
278
|
+
|
|
279
|
+
A normal checkout uses its in-tree `.git` directory. A linked worktree is
|
|
280
|
+
accepted only when its administration directory lives directly under the
|
|
281
|
+
common repository's `worktrees` directory and its `gitdir` file points back
|
|
282
|
+
to the current worktree's `.git` file, and both the shared common directory
|
|
283
|
+
and the worktree's own administration directory carry valid repository
|
|
284
|
+
metadata (`_is_valid_git_common_dir` plus the worktree's own `HEAD`). These
|
|
285
|
+
checks prevent a forged pointer or directory link from borrowing another
|
|
286
|
+
repository's identity.
|
|
287
|
+
|
|
288
|
+
Args:
|
|
289
|
+
path: Exact working-tree root or persisted common-directory path.
|
|
290
|
+
|
|
291
|
+
Returns:
|
|
292
|
+
The canonical Git common directory, or `None` when the metadata cannot
|
|
293
|
+
be validated confidently.
|
|
294
|
+
"""
|
|
295
|
+
try:
|
|
296
|
+
root = _normalize_lookup_path(path)
|
|
297
|
+
if not root.is_dir():
|
|
298
|
+
return None
|
|
299
|
+
if _is_valid_git_common_dir(root):
|
|
300
|
+
return root
|
|
301
|
+
root = root.resolve(strict=True)
|
|
302
|
+
git_entry = root / ".git"
|
|
303
|
+
if git_entry.is_symlink():
|
|
304
|
+
return None
|
|
305
|
+
|
|
306
|
+
if git_entry.is_dir():
|
|
307
|
+
common_dir = git_entry.resolve(strict=True)
|
|
308
|
+
if common_dir != git_entry or not _is_valid_git_common_dir(common_dir):
|
|
309
|
+
return None
|
|
310
|
+
return common_dir
|
|
311
|
+
if not git_entry.is_file():
|
|
312
|
+
return None
|
|
313
|
+
|
|
314
|
+
git_dir = _parse_trusted_git_dir_pointer(git_entry)
|
|
315
|
+
if git_dir is None:
|
|
316
|
+
return None
|
|
317
|
+
|
|
318
|
+
common_dir = _resolve_git_metadata_path(
|
|
319
|
+
git_dir / "commondir", relative_to=git_dir
|
|
320
|
+
)
|
|
321
|
+
if common_dir is None or git_dir.parent != common_dir / "worktrees":
|
|
322
|
+
return None
|
|
323
|
+
if not _is_valid_git_common_dir(common_dir):
|
|
324
|
+
return None
|
|
325
|
+
if not (git_dir / "HEAD").is_file():
|
|
326
|
+
return None
|
|
327
|
+
|
|
328
|
+
backlink = _normalize_git_metadata_path(git_dir / "gitdir", relative_to=git_dir)
|
|
329
|
+
if backlink is None or backlink != git_entry:
|
|
330
|
+
return None
|
|
331
|
+
except (OSError, RuntimeError, ValueError):
|
|
332
|
+
logger.debug(
|
|
333
|
+
"Failed to validate Git common directory for %s", path, exc_info=True
|
|
334
|
+
)
|
|
335
|
+
return None
|
|
336
|
+
return common_dir
|
|
337
|
+
|
|
338
|
+
|
|
162
339
|
def read_git_branch_from_filesystem(path: str | Path) -> str | None:
|
|
163
340
|
"""Read the current git branch from repository metadata.
|
|
164
341
|
|