deepagents-code 0.1.39__tar.gz → 0.1.40__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.39 → deepagents_code-0.1.40}/AGENTS.md +23 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/CHANGELOG.md +22 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/COMMANDS.md +2 -1
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/PKG-INFO +1 -1
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/THREAT_MODEL.md +10 -10
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_build_info.py +1 -1
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_env_vars.py +47 -28
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_server_config.py +12 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_testing_models.py +41 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/agent.py +165 -68
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/app.py +1312 -417
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/commands/mcp.py +65 -15
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/commands/tools.py +1 -1
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/launch/server.py +1 -3
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/launch/server_manager.py +6 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/non_interactive.py +22 -4
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/remote_client.py +1 -1
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/command_registry.py +96 -16
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/config.py +2 -2
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/config_manifest.py +19 -4
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/configurable_model.py +16 -2
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/editor.py +34 -7
- deepagents_code-0.1.40/deepagents_code/goal_rubric.py +1572 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/goal_tools.py +11 -9
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/local_context.py +2 -1
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/main.py +667 -110
- deepagents_code-0.1.40/deepagents_code/mcp_login_service.py +555 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_tools.py +349 -119
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/model_config.py +939 -220
- deepagents_code-0.1.40/deepagents_code/offload.py +298 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/offload_middleware.py +2 -2
- deepagents_code-0.1.40/deepagents_code/plugins/__init__.py +28 -0
- deepagents_code-0.1.40/deepagents_code/plugins/_json.py +45 -0
- deepagents_code-0.1.40/deepagents_code/plugins/adapters/__init__.py +1 -0
- deepagents_code-0.1.40/deepagents_code/plugins/adapters/mcp.py +192 -0
- deepagents_code-0.1.40/deepagents_code/plugins/adapters/skills.py +121 -0
- deepagents_code-0.1.40/deepagents_code/plugins/adapters/skills_middleware.py +348 -0
- deepagents_code-0.1.40/deepagents_code/plugins/commands_cli.py +225 -0
- deepagents_code-0.1.40/deepagents_code/plugins/discovery.py +392 -0
- deepagents_code-0.1.40/deepagents_code/plugins/manifest.py +272 -0
- deepagents_code-0.1.40/deepagents_code/plugins/marketplace.py +805 -0
- deepagents_code-0.1.40/deepagents_code/plugins/models.py +227 -0
- deepagents_code-0.1.40/deepagents_code/plugins/store.py +555 -0
- deepagents_code-0.1.40/deepagents_code/plugins/substitution.py +107 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/resume_state.py +49 -13
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/server_graph.py +74 -8
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/sessions.py +28 -17
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/skills/invocation.py +8 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/skills/load.py +37 -18
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/skills/trust.py +6 -7
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/system_prompt.md +17 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tool_catalog.py +7 -0
- deepagents_code-0.1.40/deepagents_code/tui/modals/__init__.py +1 -0
- deepagents_code-0.1.40/deepagents_code/tui/modals/plugin_manager/__init__.py +649 -0
- deepagents_code-0.1.40/deepagents_code/tui/modals/plugin_manager/content.py +193 -0
- deepagents_code-0.1.40/deepagents_code/tui/modals/plugin_manager/models.py +44 -0
- deepagents_code-0.1.40/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +67 -0
- deepagents_code-0.1.40/deepagents_code/tui/modals/plugin_manager/state.py +210 -0
- deepagents_code-0.1.40/deepagents_code/tui/screens/__init__.py +1 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/textual_adapter.py +136 -76
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/_inline_prompt.py +44 -9
- deepagents_code-0.1.40/deepagents_code/tui/widgets/_paste_textarea.py +568 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/ask_user.py +7 -3
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/autocomplete.py +20 -10
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/chat_input.py +39 -220
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/goal_review.py +9 -5
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/message_store.py +13 -1
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/messages.py +26 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/ui.py +24 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/update_check.py +444 -128
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/pyproject.toml +4 -1
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/test_compact_resume.py +7 -2
- deepagents_code-0.1.40/tests/integration_tests/test_goal_criteria_remote.py +117 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/test_offload_server_side.py +5 -2
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/test_sandbox_operations.py +7 -9
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/client/commands/test_mcp.py +205 -26
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/client/commands/test_tools.py +6 -2
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/conftest.py +60 -11
- deepagents_code-0.1.40/tests/unit_tests/plugins/__init__.py +1 -0
- deepagents_code-0.1.40/tests/unit_tests/plugins/test_marketplace.py +351 -0
- deepagents_code-0.1.40/tests/unit_tests/plugins/test_plugins_p0.py +1303 -0
- deepagents_code-0.1.40/tests/unit_tests/plugins/test_store.py +68 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/skills/test_load.py +46 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/skills/test_skill_trust.py +1 -1
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +23 -48
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/smoke_tests/test_system_prompt.py +7 -4
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_agent.py +242 -108
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_app.py +2203 -507
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_args.py +31 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_command_registry.py +50 -74
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_compact_tool.py +5 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_config_manifest.py +2 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_configurable_model.py +43 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_editor.py +13 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_end_to_end.py +14 -3
- deepagents_code-0.1.40/tests/unit_tests/test_goal_criteria_client.py +473 -0
- deepagents_code-0.1.40/tests/unit_tests/test_goal_rubric.py +1770 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_main.py +1502 -126
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_main_acp_mode.py +62 -1
- deepagents_code-0.1.40/tests/unit_tests/test_mcp_login_service.py +784 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_mcp_tools.py +635 -80
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_model_config.py +1095 -32
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_model_switch.py +55 -1
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_non_interactive.py +2 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_offload.py +209 -6
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_reasoning_effort.py +119 -1
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_reload.py +81 -11
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_resume_state.py +6 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_server_config.py +12 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_server_graph.py +171 -11
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_server_manager.py +3 -2
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_sessions.py +51 -3
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_skill_invocation.py +47 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_theme.py +2 -1
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_tool_catalog.py +34 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_update_check.py +638 -71
- deepagents_code-0.1.40/tests/unit_tests/tui/modals/__init__.py +1 -0
- deepagents_code-0.1.40/tests/unit_tests/tui/modals/plugin_manager/__init__.py +1 -0
- deepagents_code-0.1.40/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +59 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/test_textual_adapter.py +330 -6
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_ask_user.py +79 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_autocomplete.py +71 -5
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_chat_input.py +169 -28
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_goal_review.py +85 -0
- deepagents_code-0.1.40/tests/unit_tests/tui/widgets/test_inline_prompt.py +357 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_message_store.py +52 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_messages.py +44 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/uv.lock +1 -1
- deepagents_code-0.1.39/deepagents_code/goal_rubric.py +0 -497
- deepagents_code-0.1.39/deepagents_code/mcp_login_service.py +0 -281
- deepagents_code-0.1.39/deepagents_code/mcp_trust.py +0 -207
- deepagents_code-0.1.39/deepagents_code/offload.py +0 -146
- deepagents_code-0.1.39/tests/unit_tests/test_goal_rubric.py +0 -697
- deepagents_code-0.1.39/tests/unit_tests/test_mcp_login_service.py +0 -291
- deepagents_code-0.1.39/tests/unit_tests/test_mcp_trust.py +0 -158
- deepagents_code-0.1.39/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -43
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/.gitignore +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/ARCHITECTURE.md +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/DEVELOPMENT.md +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/Makefile +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/README.md +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_debug_buffer.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_fake_models.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_paths.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_tool_stream.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/approval_mode.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/commands/auth.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/commands/config.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/launch/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/doctor.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/extras_info.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/hooks.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/integrations/sandbox_factory.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/managed_tools.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_auth.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_config.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/paste_collapse.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/reasoning_effort.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/reliable_rubric.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/todo_list_prompt.md +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/_links.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/approval.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/auth.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/codex_auth.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/debug_console.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/diff.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/effort_selector.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/goal_status.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/history.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/install_confirm.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/loading.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/model_selector.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/skill_trust.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/startup_tip.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/status.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/thread_selector.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/update_available.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/update_confirm.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/welcome.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/hatch_build.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/images/tui.png +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/scripts/install.sh +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/README.md +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/test_auto_approve_remote.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/client/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/client/commands/test_auth.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/smoke_tests/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/smoke_tests/conftest.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test__tool_stream.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_approval_mode.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_config.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_cursor_blink.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_cursor_style.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_debug_buffer.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_debug_console.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_doctor.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_goal_tools.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_hatch_build.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_install_command.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_install_script.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_managed_tools.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_mcp_config.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_paths.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_reliable_rubric.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_rubric_cli.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_sandbox_registry.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_server.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_threads_resume.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_tracing_replicas.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_transcript_virtualization.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_history.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_links.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_status.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
- {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
|
@@ -51,6 +51,18 @@ Charset-dependent characters and animations have **single sources of truth**. Re
|
|
|
51
51
|
- **Message passing** for widget communication - see [Events guide](https://textual.textualize.io/guide/events/)
|
|
52
52
|
- **Reactive attributes** for state management - see [Reactivity guide](https://textual.textualize.io/guide/reactivity/)
|
|
53
53
|
|
|
54
|
+
### UI component organization
|
|
55
|
+
|
|
56
|
+
Apply these rules to new UI; do not treat them as a mandate to refactor existing code.
|
|
57
|
+
|
|
58
|
+
- Put root abstractions under `tui/screens/` and `tui/modals/`, and reusable components under `tui/widgets/`.
|
|
59
|
+
- Give a large component its own `snake_case/` directory. Export its PascalCase root class from `__init__.py` (prefer implementing it there); give large subcomponents nested directories with the same pattern, while small subcomponents stay as sibling modules.
|
|
60
|
+
- Keep single-use constants, helpers, business logic, and UI logic beside the component that owns them. If a helper gains a second caller, consider hoisting it to their nearest shared directory; by the third caller, extract it to a shared utility module.
|
|
61
|
+
- Keep components focused; UI component modules should rarely exceed 200 lines.
|
|
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
|
+
- Widgets cannot use `CSS_PATH`; put intrinsic, auto-scoped defaults in `DEFAULT_CSS`. The mounting screen owns the widget's sizing and placement.
|
|
64
|
+
- Children must not import parent components. They may import shared utilities and data models; send events up and pass state/data down.
|
|
65
|
+
|
|
54
66
|
### Testing Textual apps
|
|
55
67
|
|
|
56
68
|
- Use `textual.pilot` for async UI testing - see [Testing guide](https://textual.textualize.io/guide/testing/)
|
|
@@ -67,6 +79,17 @@ For Textual tests that intentionally replace concrete app methods with `MagicMoc
|
|
|
67
79
|
|
|
68
80
|
Casts are acceptable when the type violation is the point of the test (for example, passing a wrong runtime type to exercise defensive validation) or when a third-party overload is narrower than verified runtime behavior. In those cases, keep the cast narrowly scoped and add a short comment explaining why it is intentional.
|
|
69
81
|
|
|
82
|
+
## Input surface nomenclature
|
|
83
|
+
|
|
84
|
+
The REPL has **many** text-entry surfaces, so "the input" / "the input box" is ambiguous. Use these precise terms in code, comments, commit messages, and when talking to an agent. Each maps to a concrete class so there is a single, greppable referent.
|
|
85
|
+
|
|
86
|
+
- **Chat input** (a.k.a. the composer): the primary prompt field at the bottom of the REPL where the user types messages to the agent. The widget is `ChatInput` (`tui/widgets/chat_input.py`), a container whose bordered box has id `#input-box`. Its editable field is the `ChatTextArea` with id `#chat-input`. When an unqualified "the input box" is used, it means **this** — but prefer "chat input" to stay unambiguous.
|
|
87
|
+
- **Inline prompt**: a multi-line `TextArea` rendered inline in the message flow (not the chat input, not inside a modal). Base class `InlinePromptTextArea` (`tui/widgets/_inline_prompt.py`), subclassed by `AskUserTextArea` (free-text answers to agent `ask_user` questions, `ask_user.py`) and `GoalReviewTextArea` (editing goal text, `goal_review.py`).
|
|
88
|
+
- **Modal field**: a single-line Textual `Input` inside a modal screen. Refer to it by its owner, e.g. the *auth key field* (`auth.py`), *MCP login field* (`#ml-input`, `mcp_login.py`), or the *rejection reason field* (`approval.py`).
|
|
89
|
+
- **Filter input**: the single-line `Input` that filters an `OptionList`/`Select` in a picker — the *model-selector filter* (`model_selector.py`), *thread-selector filter* (`thread_selector.py`), and *MCP viewer filter* (`#mcp-filter`, `mcp_viewer.py`). A specialized modal field; call it a "filter input" when the point is filtering.
|
|
90
|
+
|
|
91
|
+
Rule of thumb: say **chat input** for the main composer and name any other surface by its owner (`<owner> field` / `<owner> filter`). Reserve bare "input box" for the chat input only.
|
|
92
|
+
|
|
70
93
|
## SDK dependency pin
|
|
71
94
|
|
|
72
95
|
`deepagents-code` pins an exact `deepagents==X.Y.Z` version in `pyproject.toml`. When developing features that depend on new SDK functionality, bump this pin as part of the same PR. A CI check verifies the pin is not older than the current SDK version at release time (unless bypassed with `dangerous-skip-sdk-pin-check`); pins ahead of the workspace SDK are allowed for intentional prerelease coordination.
|
|
@@ -2,6 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.1.40](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.39...deepagents-code==0.1.40) (2026-07-16)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- Added plugin marketplace support ([#4554](https://github.com/langchain-ai/deepagents/issues/4554)).
|
|
10
|
+
- Added an “always allow” option to the project MCP approval prompt ([#4562](https://github.com/langchain-ai/deepagents/issues/4562)).
|
|
11
|
+
- Improved `/goal` workflows: criteria generation now runs server-side, YOLO mode auto-accepts criteria, goals complete after satisfied grading, and goal review editing now supports `Ctrl+X` ([#4754](https://github.com/langchain-ai/deepagents/issues/4754), [#4784](https://github.com/langchain-ai/deepagents/issues/4784), [#4781](https://github.com/langchain-ai/deepagents/issues/4781), [#4780](https://github.com/langchain-ai/deepagents/issues/4780)).
|
|
12
|
+
- Reasoning effort now persists across restarts ([#4728](https://github.com/langchain-ai/deepagents/issues/4728)).
|
|
13
|
+
- Added a toast prompting you to re-paste when a chat paste collapses ([#4742](https://github.com/langchain-ai/deepagents/issues/4742)).
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
- Tool calls awaiting approval are now surfaced correctly ([#4739](https://github.com/langchain-ai/deepagents/issues/4739)).
|
|
18
|
+
- Fixed transcript tail hydration when scrolled to the bottom edge ([#4733](https://github.com/langchain-ai/deepagents/issues/4733)).
|
|
19
|
+
- Kept chat input responsive during MCP viewer `Ctrl+R` reconnects ([#4753](https://github.com/langchain-ai/deepagents/issues/4753)).
|
|
20
|
+
- Improved inline free-text prompts by sharing paste handling and matching primary-input `Ctrl+D` behavior ([#4736](https://github.com/langchain-ai/deepagents/issues/4736), [#4729](https://github.com/langchain-ai/deepagents/issues/4729)).
|
|
21
|
+
- Fixed local offloaded tool results to use the real filesystem ([#4740](https://github.com/langchain-ai/deepagents/issues/4740)).
|
|
22
|
+
- Cleaned offloaded history when deleting a thread ([#4751](https://github.com/langchain-ai/deepagents/issues/4751)).
|
|
23
|
+
- Removed duplicated content from the system prompt by overwriting the base prompt ([#4516](https://github.com/langchain-ai/deepagents/issues/4516)).
|
|
24
|
+
- Closed subprocess transport during install teardown ([#4735](https://github.com/langchain-ai/deepagents/issues/4735)).
|
|
25
|
+
- Added targeted `uv` constraints for prerelease dependencies ([#4744](https://github.com/langchain-ai/deepagents/issues/4744)).
|
|
26
|
+
|
|
5
27
|
## [0.1.39](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.38...deepagents-code==0.1.39) (2026-07-14)
|
|
6
28
|
|
|
7
29
|
### Bug fixes
|
|
@@ -8,7 +8,7 @@ Regenerate this file with `make commands-catalog` after changing command names,
|
|
|
8
8
|
aliases, descriptions, visibility, or hidden-command metadata.
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
## Public (
|
|
11
|
+
## Public (34)
|
|
12
12
|
|
|
13
13
|
| Command | Aliases | Description |
|
|
14
14
|
| --- | --- | --- |
|
|
@@ -30,6 +30,7 @@ aliases, descriptions, visibility, or hidden-command metadata.
|
|
|
30
30
|
| `/model` | | Switch models or edit model settings |
|
|
31
31
|
| `/notifications` | | Configure startup warnings |
|
|
32
32
|
| `/offload` | `/compact` | Summarize and offload older messages to free context |
|
|
33
|
+
| `/plugins` | | Manage plugins (experimental) |
|
|
33
34
|
| `/quit` | `/q` | Exit app |
|
|
34
35
|
| `/reload` | | Reload environment and config |
|
|
35
36
|
| `/remember` | | Save useful context to memory or skills |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.40
|
|
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/
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
- Non-interactive pipeline runner (`client/non_interactive.py`)
|
|
17
17
|
- Agent creation (`agent.py`)
|
|
18
18
|
- Built-in tools (`tools.py`: `http_request`, `web_search`, `fetch_url`)
|
|
19
|
-
- MCP config loader and
|
|
19
|
+
- MCP config loader and per-server allow/deny lists (`mcp_tools.py`, `model_config.py`)
|
|
20
20
|
- Hook dispatcher (`hooks.py`)
|
|
21
21
|
- Sandbox integration factory (`integrations/sandbox_factory.py`, `integrations/sandbox_provider.py`)
|
|
22
22
|
- Session persistence (`sessions.py`)
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
| C2 | TUI / Non-interactive | Textual UI for interactive chat; `client/non_interactive.py` for headless pipelines (both use `RemoteAgent`) | framework-controlled | Yes | `app.DeepAgentsApp.run`, `client.non_interactive.run_non_interactive` |
|
|
126
126
|
| C3 | Agent Engine | LangGraph agent graph running inside `langgraph dev` server, assembled by `create_cli_agent` | framework-controlled | Yes | `agent.create_cli_agent`, `agent._add_interrupt_on`, `server_graph.make_graph` |
|
|
127
127
|
| C4 | Built-in Tools | `http_request`, `web_search` (Tavily), `fetch_url` (HTML→markdown) | framework-controlled | Partial¹ | `tools.http_request`, `tools.web_search`, `tools.fetch_url` |
|
|
128
|
-
| C5 | MCP Loader & Trust | Discovers/loads `.mcp.json`, validates server configs,
|
|
128
|
+
| C5 | MCP Loader & Trust | Discovers/loads `.mcp.json`, validates server configs, applies per-server allow/deny lists + interactive approval | framework-controlled | No² | `mcp_tools.resolve_and_load_mcp_tools`, `model_config.load_mcp_server_trust_lists`, `main._check_mcp_project_trust` |
|
|
129
129
|
| C6 | Hook Dispatcher | Fires subprocess commands on agent lifecycle events | framework-controlled | No³ | `hooks.dispatch_hook`, `hooks._run_single_hook` |
|
|
130
130
|
| C7 | Sandbox Integration | Creates/destroys remote sandboxes (Daytona, LangSmith, Modal, Runloop, AgentCore) | framework-controlled | No⁴ | `integrations.sandbox_factory.create_sandbox` |
|
|
131
131
|
| C8 | Session Persistence | SQLite checkpoint store for LangGraph thread state | framework-controlled | Yes | `sessions.get_db_path`, `sessions.generate_thread_id` |
|
|
@@ -156,7 +156,6 @@
|
|
|
156
156
|
| DC1 | API Keys / Credentials | `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `TAVILY_API_KEY`, `LANGSMITH_API_KEY`, `LANGGRAPH_API_KEY` | Critical | Process environment only; never written to disk by CLI code | N/A (in-memory) | Process lifetime | All — breach trigger |
|
|
157
157
|
| DC2 | Conversation Messages | User prompts, LLM responses, tool args/results | High | SQLite (`~/.deepagents/*.db`) via LangGraph checkpointer | No (local file, unencrypted) | Unbounded (session files persist) | GDPR if personal data is discussed |
|
|
158
158
|
| DC3 | System Prompt Content | `DA_SERVER_SYSTEM_PROMPT` env var; custom AGENTS.md contents | Medium | Process environment (transient); `~/.deepagents/{agent}/AGENTS.md` on disk | No | Config lifetime | None direct |
|
|
159
|
-
| DC4 | MCP Trust Fingerprints | `projects.*` in `mcp_trust.json` | Low | `~/.deepagents/.state/mcp_trust.json` | No | Until revoked | None |
|
|
160
159
|
| DC5 | Offloaded Conversation History | Summarized + raw conversation messages written to sandbox backend | High | Sandbox filesystem at `/conversation_history/{thread_id}.md` | Depends on sandbox provider | Sandbox session lifetime | GDPR if personal data is discussed |
|
|
161
160
|
|
|
162
161
|
### Data Classification Details
|
|
@@ -200,7 +199,7 @@
|
|
|
200
199
|
| TB1 | User Input → Agent Engine | Where user-typed prompts enter the agent graph | Prompt routing, session threading, UI rendering | Prompt content — any text accepted |
|
|
201
200
|
| TB2 | LLM Decision → Tool Execution | HITL gate on all side-effecting tool calls | Interrupt map, allow-list check, auto-approve toggle | LLM reasoning; what user approves |
|
|
202
201
|
| TB3 | Tool Result → LLM Context | Tool outputs re-enter the context window | Unicode warnings on URLs in args; markdownify HTML conversion | Content of fetched web pages, MCP responses, search results |
|
|
203
|
-
| TB4 | MCP Config → Process / Network | `.mcp.json` triggers subprocess spawn or network connection | Schema validation
|
|
202
|
+
| TB4 | MCP Config → Process / Network | `.mcp.json` triggers subprocess spawn or network connection | Schema validation; per-server allow/deny lists + interactive approval prompt | What the MCP process does once trusted and running |
|
|
204
203
|
| TB5 | Hooks Config → Subprocess | `hooks.json` commands execute as local subprocesses | JSON structure validation, 5-second timeout | Command content (user-authored); env vars available to child |
|
|
205
204
|
| TB6 | Setup Script → Sandbox Execution | User-supplied script runs inside sandbox at startup | `shlex.quote()` wrapping; `string.Template.safe_substitute` | Script content (user-authored); sandbox network access |
|
|
206
205
|
| TB7 | External LLM API → Agent State | LLM API responses drive tool call decisions | LLM client configuration, model selection, request params | LLM output content; provider-side safety |
|
|
@@ -232,7 +231,7 @@
|
|
|
232
231
|
|
|
233
232
|
#### TB4: MCP Config → Process / Network
|
|
234
233
|
|
|
235
|
-
- **Inside**: `mcp_tools._validate_server_config` validates JSON structure and field types. `
|
|
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 root, server name, and server definition fingerprint, so a different project or changed command/URL 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 replaces TOML approvals when set, while 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.
|
|
236
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.
|
|
237
236
|
- **Crossing mechanism**: `subprocess.Popen` (via `langchain_mcp_adapters`) for stdio; HTTP/SSE for remote servers.
|
|
238
237
|
|
|
@@ -305,7 +304,7 @@
|
|
|
305
304
|
#### DF11: MCP Tool Results → Agent Context
|
|
306
305
|
|
|
307
306
|
- **Data**: Arbitrary strings/objects from MCP tool calls.
|
|
308
|
-
- **Validation**: MCP config
|
|
307
|
+
- **Validation**: MCP config approved at load time (per-server allow-list or interactive prompt). Tool result content not validated after server is trusted.
|
|
309
308
|
- **Trust assumption**: User trusted the MCP server; its outputs are as reliable as the server.
|
|
310
309
|
|
|
311
310
|
#### DF18: DA_SERVER_* Env Vars
|
|
@@ -330,7 +329,7 @@
|
|
|
330
329
|
|
|
331
330
|
- **Data**: Arbitrary key-value pairs from the `"env"` field of stdio server definitions in `.mcp.json`.
|
|
332
331
|
- **Validation**: Type check only — `env` must be a dict (`mcp_tools._validate_server_config`). No filtering of key names or values. Forwarded directly to `StdioConnection` which passes to `subprocess.Popen`.
|
|
333
|
-
- **Trust assumption**: User authored or approved the MCP config. Project-level configs go through
|
|
332
|
+
- **Trust assumption**: User authored or approved the MCP config. Project-level configs go through the approval gate (allow-list or interactive prompt) before loading.
|
|
334
333
|
|
|
335
334
|
---
|
|
336
335
|
|
|
@@ -410,7 +409,7 @@
|
|
|
410
409
|
|
|
411
410
|
- **Flow**: DF24 (MCP config → subprocess environment)
|
|
412
411
|
- **Description**: The `"env"` field in stdio MCP server definitions (`.mcp.json`) accepts an arbitrary key-value dict. `mcp_tools._validate_server_config` only checks that the field is a dict — it does not filter key names or values. The dict is forwarded directly to `StdioConnection(env=...)` which passes it to the subprocess. An attacker who can modify a project-level `.mcp.json` could set `PATH` to redirect command resolution, `LD_PRELOAD` to inject shared libraries, or `PYTHONPATH` to hijack Python imports in the MCP subprocess.
|
|
413
|
-
- **Preconditions**: (1) Attacker has write access to a project-level `.mcp.json`; (2) The project MCP config must be
|
|
412
|
+
- **Preconditions**: (1) Attacker has write access to a project-level `.mcp.json`; (2) The project MCP config must be approved by the user (the interactive prompt, `--trust-project-mcp`, or the server approved via `[mcp].enabled_project_server_approvals` / the `DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS` env var). For user-level `~/.deepagents/.mcp.json`, the attacker already has home directory write access. Note: the `env` dict from MCP config is passed to `StdioConnection` — whether it replaces or merges with `os.environ` depends on the `langchain_mcp_adapters` library implementation.
|
|
414
413
|
|
|
415
414
|
#### T11: Auto-Installed ripgrep Binary from Upstream Release
|
|
416
415
|
|
|
@@ -435,7 +434,7 @@
|
|
|
435
434
|
| LLM output | DF6, DF7 | T1, T2, T3, T4| HITL gate; shell allow-list; Unicode/URL warnings on tool args | Project | LLM-generated tool args not scanned for injection beyond Unicode/URL |
|
|
436
435
|
| Tool/function results | DF9, DF11 | T1 | Unicode warning on URL args; `markdownify` HTML conversion | Shared | Tool *results* pass to context without prompt-injection scan |
|
|
437
436
|
| URL-fetched content | DF8, DF9 | T1 | `check_url_safety` on URL arg; HTML→markdown conversion | Shared | Markup-embedded instructions survive markdownify; no LLM-layer guardrail |
|
|
438
|
-
| Configuration | DF10, DF12, DF15, DF23| T9, T10, T12 | Dotenv shell-env precedence; TOML schema; MCP schema +
|
|
437
|
+
| Configuration | DF10, DF12, DF15, DF23| T9, T10, T12 | Dotenv shell-env precedence; TOML schema; MCP schema + allow/deny lists; JSON structure check; `class_path` format check | User | Project `.env` can set shell startup-hook vars; `class_path` executes module code before type check; MCP env dict unfiltered |
|
|
439
438
|
| Session restore | DF14 | T5 | OS file permissions; SQLite | Project | Unencrypted at rest |
|
|
440
439
|
| Server IPC (env vars) | DF18 | T6 | `ServerConfig` serialization; parent env passed to child | Project | Provider API keys flow to server subprocess; system prompt in env |
|
|
441
440
|
| Host environment | DF19, DF20 | T7 | Static script; exit code check; 30s timeout | Shared | Makefile content injected into system prompt without sanitization |
|
|
@@ -454,7 +453,7 @@ Threats that appear valid in isolation but fall outside project responsibility b
|
|
|
454
453
|
|-------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------|
|
|
455
454
|
| Prompt injection leading to arbitrary code execution (interactive mode) | In interactive mode, every side-effecting tool call requires explicit user approval via the HITL dialog. The user is the final gatekeeper. | Providing HITL for all side-effecting tools (`agent._add_interrupt_on`) and Unicode/URL warnings in the approval dialog. |
|
|
456
455
|
| API key exfiltration via LLM-directed `http_request` | `http_request` requires HITL in interactive mode. Keys it could exfiltrate are user-supplied env vars. In non-interactive mode, user has opted into autonomous operation. | Providing HITL gate for HTTP tools. Users control which env vars are in scope. |
|
|
457
|
-
| Malicious MCP server injecting prompt instructions | Users configure MCP servers and explicitly trust project-level configs. Once trusted, MCP tool outputs are data from a system the user controls. |
|
|
456
|
+
| Malicious MCP server injecting prompt instructions | Users configure MCP servers and explicitly trust project-level configs. Once trusted, MCP tool outputs are data from a system the user controls. | Interactive approval prompt + per-server allow/deny lists for project-level configs (`main._check_mcp_project_trust`, `model_config.load_mcp_server_trust_lists`). |
|
|
458
457
|
| LLM jailbreak / safety bypass | Model selection and safety configuration are user-controlled. The project routes prompts to the configured LLM but cannot guarantee model behavior. | Correctly routing prompts to the configured LLM; applying the system prompt from `agent.get_system_prompt`. |
|
|
459
458
|
| Sandbox provider security vulnerabilities | Daytona, LangSmith, Modal, Runloop, and AgentCore are third-party services. Their internal security is not this project's responsibility. | Correctly initializing sandbox sessions via `integrations.sandbox_factory.create_sandbox`. |
|
|
460
459
|
| Hook commands doing harmful things | Hooks in `~/.deepagents/hooks.json` are 100% user-authored. The payload is data-only (JSON on stdin). | JSON structure validation (`hooks._load_hooks`); 5-second timeout. |
|
|
@@ -494,3 +493,4 @@ Threats that appear valid in isolation but fall outside project responsibility b
|
|
|
494
493
|
| 2026-03-28 | langster-threat-model (automated) | Deep validation pass: added C17 (Model Config Loader with class_path), TB11 (Config→Code Execution); added DC5 (offloaded conversation history); added DF23-DF25 (class_path flow, MCP env dict flow, offload flow); added T9 (class_path arbitrary code execution), T10 (MCP env dict unfiltered); added D3 (SSRF dismissed — HITL is intended control), D4 (offload path injection dismissed — UUID7); **removed Status column and Mitigations/Residual Risk fields from all threats** (open source visibility compliance — mitigation status must not appear in public threat models); updated T6 validation from Likely to Verified (port is deterministic at 2024 default, discoverable via /proc); updated external context (no published advisories found); updated architecture diagram |
|
|
495
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 |
|
|
496
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
|
+
| 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 |
|
|
@@ -51,6 +51,28 @@ Takes precedence over `[ui].cursor_style` in config.toml. Invalid values fall
|
|
|
51
51
|
through to the config file and then the default block cursor.
|
|
52
52
|
"""
|
|
53
53
|
|
|
54
|
+
DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS = (
|
|
55
|
+
"DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS"
|
|
56
|
+
)
|
|
57
|
+
"""Comma-separated project MCP server names to dangerously pre-approve by name.
|
|
58
|
+
|
|
59
|
+
This is an explicit process-wide escape hatch. Servers named here load from an
|
|
60
|
+
otherwise-untrusted project `.mcp.json` without prompting (they are omitted from
|
|
61
|
+
the interactive approval prompt), while non-listed servers still require
|
|
62
|
+
approval (they go through the prompt, and stay dropped only on the
|
|
63
|
+
non-interactive or denied paths). Like
|
|
64
|
+
`DISABLED_PROJECT_MCP_SERVERS`, this is user-controlled process env, not a repo
|
|
65
|
+
file, so it does not weaken the user-level-only trust boundary (a committed
|
|
66
|
+
*project* `.env` cannot set it; see `config._PROJECT_DOTENV_DENIED_ENV_KEYS`).
|
|
67
|
+
This dangerous contract is name-based: a different project, command change, or
|
|
68
|
+
URL change under the same server name still matches.
|
|
69
|
+
|
|
70
|
+
When set, this replaces (takes precedence over) the scoped
|
|
71
|
+
`[mcp].enabled_project_server_approvals` TOML approvals.
|
|
72
|
+
(`DISABLED_PROJECT_MCP_SERVERS` instead *unions* with its TOML list, so a deny
|
|
73
|
+
is never silently emptied.)
|
|
74
|
+
"""
|
|
75
|
+
|
|
54
76
|
DEBUG = "DEEPAGENTS_CODE_DEBUG"
|
|
55
77
|
"""Enable verbose debug logging and preserve the server subprocess log.
|
|
56
78
|
|
|
@@ -106,34 +128,15 @@ DISABLED_PROJECT_MCP_SERVERS = "DEEPAGENTS_CODE_DISABLED_PROJECT_MCP_SERVERS"
|
|
|
106
128
|
A user-level equivalent of `[mcp].disabled_project_servers`.
|
|
107
129
|
|
|
108
130
|
Rejection wins over approval: a name listed here is dropped even when it also
|
|
109
|
-
appears in `
|
|
110
|
-
and even when the project config
|
|
111
|
-
this env var *unions* with
|
|
112
|
-
`[mcp].disabled_project_servers` — denies accumulate
|
|
113
|
-
can silently empty a deny set in the other. This is
|
|
114
|
-
controls, not a repo file, so it does not weaken the
|
|
115
|
-
trust boundary: a committed *project* `.env` is blocked from
|
|
116
|
-
(see `config._PROJECT_DOTENV_DENIED_ENV_KEYS`); only the user's
|
|
117
|
-
launch env, or global `~/.deepagents/.env` can.
|
|
118
|
-
"""
|
|
119
|
-
|
|
120
|
-
ENABLED_PROJECT_MCP_SERVERS = "DEEPAGENTS_CODE_ENABLED_PROJECT_MCP_SERVERS"
|
|
121
|
-
"""Comma-separated project MCP server names to pre-approve by name.
|
|
122
|
-
|
|
123
|
-
A user-level equivalent of `[mcp].enabled_project_servers`.
|
|
124
|
-
|
|
125
|
-
Servers named here load from an otherwise-untrusted project `.mcp.json` without
|
|
126
|
-
prompting (they are omitted from the interactive approval prompt), while
|
|
127
|
-
non-listed servers stay dropped. Like `DISABLED_PROJECT_MCP_SERVERS`, this is
|
|
128
|
-
user-controlled process env, not a repo file, so it does not weaken
|
|
129
|
-
the user-level-only trust boundary (a committed *project* `.env` cannot set it;
|
|
130
|
-
see `config._PROJECT_DOTENV_DENIED_ENV_KEYS`). This contract is name-based:
|
|
131
|
-
a project command or URL change under the same server name still matches.
|
|
132
|
-
|
|
133
|
-
When set, this replaces (takes precedence over) the
|
|
134
|
-
`[mcp].enabled_project_servers` TOML list.
|
|
135
|
-
(`DISABLED_PROJECT_MCP_SERVERS` instead *unions* with its TOML list, so a deny
|
|
136
|
-
is never silently emptied.)
|
|
131
|
+
appears in `DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS` or in a scoped
|
|
132
|
+
`[mcp].enabled_project_server_approvals` entry, and even when the project config
|
|
133
|
+
is otherwise trusted. Unlike the enabled list, this env var *unions* with
|
|
134
|
+
(rather than replaces) `[mcp].disabled_project_servers` — denies accumulate
|
|
135
|
+
across sources, so neither can silently empty a deny set in the other. This is
|
|
136
|
+
process env the user controls, not a repo file, so it does not weaken the
|
|
137
|
+
user-level-only trust boundary: a committed *project* `.env` is blocked from
|
|
138
|
+
setting it (see `config._PROJECT_DOTENV_DENIED_ENV_KEYS`); only the user's
|
|
139
|
+
shell, launch env, or global `~/.deepagents/.env` can.
|
|
137
140
|
"""
|
|
138
141
|
|
|
139
142
|
EXPERIMENTAL = "DEEPAGENTS_CODE_EXPERIMENTAL"
|
|
@@ -200,6 +203,13 @@ The value is comma-separated for forward-compatibility, not because multiple
|
|
|
200
203
|
destinations are written today.
|
|
201
204
|
"""
|
|
202
205
|
|
|
206
|
+
LEGACY_ENABLED_PROJECT_MCP_SERVERS = "DEEPAGENTS_CODE_ENABLED_PROJECT_MCP_SERVERS"
|
|
207
|
+
"""Removed project MCP allowlist env var retained for migration detection only.
|
|
208
|
+
|
|
209
|
+
The app no longer honors this value. It detects the old name so users receive a
|
|
210
|
+
migration notice pointing to `DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS`.
|
|
211
|
+
"""
|
|
212
|
+
|
|
203
213
|
LOG_LEVEL = "DEEPAGENTS_CODE_LOG_LEVEL"
|
|
204
214
|
"""Minimum level for `deepagents_code` runtime logging.
|
|
205
215
|
|
|
@@ -248,6 +258,12 @@ Set to a truthy value to bring the standalone integrations screen back into the
|
|
|
248
258
|
flow. Parsed by `is_env_truthy`: accepts `1`, `true`, `yes`, `on` as enabled.
|
|
249
259
|
"""
|
|
250
260
|
|
|
261
|
+
PLUGIN_CACHE_DIR = "DEEPAGENTS_CODE_PLUGIN_CACHE_DIR"
|
|
262
|
+
"""Override the plugin install/marketplace cache root.
|
|
263
|
+
|
|
264
|
+
When unset, plugins are stored under `DEFAULT_CONFIG_DIR / "plugins"`.
|
|
265
|
+
"""
|
|
266
|
+
|
|
251
267
|
RESTARTED_AFTER_UPDATE = "DEEPAGENTS_CODE_RESTARTED_AFTER_UPDATE"
|
|
252
268
|
"""Internal sentinel recording the target version immediately before the
|
|
253
269
|
startup auto-update re-execs the process.
|
|
@@ -385,3 +401,6 @@ def is_env_truthy(name: str, *, default: bool = False) -> bool:
|
|
|
385
401
|
return default
|
|
386
402
|
classified = classify_env_bool(raw)
|
|
387
403
|
return default if classified is None else classified
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
EXPERIMENTAL_HINT = f"This feature is experimental. Set {EXPERIMENTAL}=1 to enable."
|
|
@@ -195,6 +195,9 @@ class ServerConfig:
|
|
|
195
195
|
"""Extra kwargs forwarded to the chat model constructor (temperature,
|
|
196
196
|
max_tokens, etc.)."""
|
|
197
197
|
|
|
198
|
+
profile_overrides: dict[str, Any] | None = None
|
|
199
|
+
"""Model profile metadata overrides resolved by the client."""
|
|
200
|
+
|
|
198
201
|
assistant_id: str = DEFAULT_ASSISTANT_ID
|
|
199
202
|
"""Identifier of the agent graph to invoke on the server."""
|
|
200
203
|
|
|
@@ -339,6 +342,11 @@ class ServerConfig:
|
|
|
339
342
|
"MODEL_PARAMS": (
|
|
340
343
|
json.dumps(self.model_params) if self.model_params is not None else None
|
|
341
344
|
),
|
|
345
|
+
"PROFILE_OVERRIDES": (
|
|
346
|
+
json.dumps(self.profile_overrides)
|
|
347
|
+
if self.profile_overrides is not None
|
|
348
|
+
else None
|
|
349
|
+
),
|
|
342
350
|
"ASSISTANT_ID": self.assistant_id,
|
|
343
351
|
"SYSTEM_PROMPT": self.system_prompt,
|
|
344
352
|
"AUTO_APPROVE": str(self.auto_approve).lower(),
|
|
@@ -396,6 +404,7 @@ class ServerConfig:
|
|
|
396
404
|
return cls(
|
|
397
405
|
model=_read_env_str("MODEL"),
|
|
398
406
|
model_params=_read_env_json("MODEL_PARAMS"),
|
|
407
|
+
profile_overrides=_read_env_json("PROFILE_OVERRIDES"),
|
|
399
408
|
assistant_id=_read_env_str("ASSISTANT_ID") or DEFAULT_ASSISTANT_ID,
|
|
400
409
|
system_prompt=_read_env_str("SYSTEM_PROMPT"),
|
|
401
410
|
auto_approve=_read_env_bool("AUTO_APPROVE"),
|
|
@@ -440,6 +449,7 @@ class ServerConfig:
|
|
|
440
449
|
project_context: ProjectContext | None,
|
|
441
450
|
model_name: str | None,
|
|
442
451
|
model_params: dict[str, Any] | None,
|
|
452
|
+
profile_overrides: dict[str, Any] | None = None,
|
|
443
453
|
assistant_id: str,
|
|
444
454
|
auto_approve: bool,
|
|
445
455
|
interrupt_shell_only: bool = False,
|
|
@@ -470,6 +480,7 @@ class ServerConfig:
|
|
|
470
480
|
project_context: Explicit user/project path context.
|
|
471
481
|
model_name: Model spec string.
|
|
472
482
|
model_params: Extra model kwargs.
|
|
483
|
+
profile_overrides: Model profile metadata overrides.
|
|
473
484
|
assistant_id: Agent identifier.
|
|
474
485
|
auto_approve: Auto-approve all tools.
|
|
475
486
|
interrupt_shell_only: Validate shell commands via middleware instead
|
|
@@ -508,6 +519,7 @@ class ServerConfig:
|
|
|
508
519
|
return cls(
|
|
509
520
|
model=model_name,
|
|
510
521
|
model_params=model_params,
|
|
522
|
+
profile_overrides=profile_overrides,
|
|
511
523
|
assistant_id=assistant_id,
|
|
512
524
|
auto_approve=auto_approve,
|
|
513
525
|
interrupt_shell_only=interrupt_shell_only,
|
|
@@ -27,6 +27,7 @@ if TYPE_CHECKING:
|
|
|
27
27
|
DCA_TEST_WRITE_FILE_MARKER = "DCA_TEST_WRITE_FILE="
|
|
28
28
|
DCA_TEST_DELEGATE_WRITE_MARKER = "DCA_TEST_DELEGATE_WRITE="
|
|
29
29
|
DCA_SUBAGENT_WRITE_FILE_MARKER = "DCA_SUBAGENT_WRITE_FILE="
|
|
30
|
+
DCA_TEST_GOAL_CRITERIA_MARKER = "DCA_TEST_GOAL_CRITERIA="
|
|
30
31
|
|
|
31
32
|
# Distinct file contents per write path, so a test asserting on file content can
|
|
32
33
|
# prove which branch executed — in particular that subagent mode delegated through
|
|
@@ -303,3 +304,43 @@ class ToolCallingIntegrationChatModel(DeterministicIntegrationChatModel):
|
|
|
303
304
|
),
|
|
304
305
|
),
|
|
305
306
|
)
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
class GoalCriteriaIntegrationChatModel(DeterministicIntegrationChatModel):
|
|
310
|
+
"""Exercise nested criteria generation with a repository read."""
|
|
311
|
+
|
|
312
|
+
disable_streaming: bool = True
|
|
313
|
+
|
|
314
|
+
def _generate(
|
|
315
|
+
self,
|
|
316
|
+
messages: list[BaseMessage],
|
|
317
|
+
stop: list[str] | None = None, # noqa: ARG002
|
|
318
|
+
run_manager: CallbackManagerForLLMRun | None = None, # noqa: ARG002
|
|
319
|
+
**kwargs: Any, # noqa: ARG002
|
|
320
|
+
) -> ChatResult:
|
|
321
|
+
"""Read the marked file, then return a structured goal proposal.
|
|
322
|
+
|
|
323
|
+
Returns:
|
|
324
|
+
A repository tool call followed by a `GoalProposal` tool call.
|
|
325
|
+
"""
|
|
326
|
+
prompt = "\n".join(
|
|
327
|
+
text
|
|
328
|
+
for message in messages
|
|
329
|
+
if (text := self._stringify_message(message)).strip()
|
|
330
|
+
)
|
|
331
|
+
has_tool_result = any(message.type == "tool" for message in messages)
|
|
332
|
+
if DCA_TEST_GOAL_CRITERIA_MARKER in prompt and not has_tool_result:
|
|
333
|
+
path = _extract_marker_path(prompt, DCA_TEST_GOAL_CRITERIA_MARKER)
|
|
334
|
+
return _tool_call_result(
|
|
335
|
+
"read_file",
|
|
336
|
+
{"file_path": path, "limit": 20},
|
|
337
|
+
"call_goal_read",
|
|
338
|
+
)
|
|
339
|
+
return _tool_call_result(
|
|
340
|
+
"GoalProposal",
|
|
341
|
+
{
|
|
342
|
+
"objective": "verify server-side criteria generation",
|
|
343
|
+
"criteria": "- server repository context is available",
|
|
344
|
+
},
|
|
345
|
+
"call_goal_proposal",
|
|
346
|
+
)
|
|
@@ -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.40" # 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."""
|