deepagents-code 0.1.11__tar.gz → 0.1.13__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.11 → deepagents_code-0.1.13}/.gitignore +15 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/AGENTS.md +55 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/CHANGELOG.md +53 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/COMMANDS.md +3 -3
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/PKG-INFO +20 -20
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/THREAT_MODEL.md +7 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_debug.py +29 -9
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_env_vars.py +37 -7
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_server_config.py +3 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_session_stats.py +1 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_textual_patches.py +137 -4
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/agent.py +124 -30
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/app.py +1473 -123
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/command_registry.py +8 -6
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/config.py +579 -206
- deepagents_code-0.1.13/deepagents_code/config_commands.py +487 -0
- deepagents_code-0.1.13/deepagents_code/config_manifest.py +1055 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/configurable_model.py +1 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/filesystem_empty_result.py +11 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/input.py +2 -2
- deepagents_code-0.1.13/deepagents_code/integrations/sandbox_config.py +198 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/integrations/sandbox_factory.py +74 -71
- deepagents_code-0.1.13/deepagents_code/integrations/sandbox_provider.py +137 -0
- deepagents_code-0.1.13/deepagents_code/integrations/sandbox_registry.py +341 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/local_context.py +129 -7
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/main.py +248 -24
- deepagents_code-0.1.13/deepagents_code/managed_tools.py +470 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_auth.py +8 -2
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_commands.py +4 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_tools.py +46 -11
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/media_utils.py +2 -2
- deepagents_code-0.1.13/deepagents_code/memory_guard.py +406 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/model_config.py +104 -6
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/offload.py +1 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/onboarding.py +35 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/remote_client.py +29 -4
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/server.py +51 -4
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/server_graph.py +2 -2
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/sessions.py +27 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/system_prompt.md +2 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/textual_adapter.py +45 -6
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/theme.py +3 -3
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/tools.py +25 -2
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/ui.py +60 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/update_check.py +17 -5
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/ask_user.py +5 -2
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/autocomplete.py +53 -4
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/chat_input.py +177 -15
- deepagents_code-0.1.13/deepagents_code/widgets/cwd_switch.py +157 -0
- deepagents_code-0.1.13/deepagents_code/widgets/install_confirm.py +120 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/messages.py +174 -88
- deepagents_code-0.1.13/deepagents_code/widgets/restart_prompt.py +135 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/status.py +110 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/theme_selector.py +60 -6
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/thread_selector.py +63 -24
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/welcome.py +24 -175
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/examples/skills/arxiv-search/arxiv_search.py +1 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/pyproject.toml +30 -37
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/test_compact_resume.py +2 -2
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/test_sandbox_factory.py +5 -6
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/conftest.py +15 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_agent.py +331 -13
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_agent_friendly.py +1 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_app.py +3132 -361
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_approval.py +9 -9
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_args.py +73 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_auth_display.py +6 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_autocomplete.py +194 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_charset.py +18 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_chat_input.py +248 -6
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_command_registry.py +15 -3
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_config.py +481 -3
- deepagents_code-0.1.13/tests/unit_tests/test_config_manifest.py +999 -0
- deepagents_code-0.1.13/tests/unit_tests/test_cwd_switch.py +85 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_debug.py +72 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_event_bus.py +1 -1
- deepagents_code-0.1.13/tests/unit_tests/test_install_command.py +784 -0
- deepagents_code-0.1.13/tests/unit_tests/test_install_confirm.py +88 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_launch_init.py +2 -2
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_links.py +2 -2
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_loading.py +4 -7
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_local_context.py +250 -15
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_main.py +120 -3
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_main_acp_mode.py +6 -2
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_main_args.py +365 -18
- deepagents_code-0.1.13/tests/unit_tests/test_managed_tools.py +690 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_auth.py +1 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_commands.py +1 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_login_modal.py +11 -11
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_tools.py +106 -34
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_viewer.py +5 -5
- deepagents_code-0.1.13/tests/unit_tests/test_memory_guard.py +411 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_message_store.py +1 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_messages.py +275 -34
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_model_config.py +113 -4
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_model_switch.py +44 -44
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_non_interactive.py +2 -2
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_notifications.py +1 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_offload.py +13 -13
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_onboarding.py +53 -2
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_reload.py +160 -26
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_remote_client.py +39 -4
- deepagents_code-0.1.13/tests/unit_tests/test_restart_prompt.py +88 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_resume_state.py +14 -14
- deepagents_code-0.1.13/tests/unit_tests/test_sandbox_config.py +140 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_sandbox_factory.py +95 -10
- deepagents_code-0.1.13/tests/unit_tests/test_sandbox_provider.py +50 -0
- deepagents_code-0.1.13/tests/unit_tests/test_sandbox_registry.py +305 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_server.py +41 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_server_graph.py +3 -1
- deepagents_code-0.1.13/tests/unit_tests/test_server_helpers.py +169 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_sessions.py +50 -3
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_skill_invocation.py +11 -10
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_startup_fast_paths.py +2 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_status.py +207 -5
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_terminal_escape.py +11 -2
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_textual_adapter.py +63 -25
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_textual_patches.py +115 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_theme.py +461 -5
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_thread_selector.py +472 -83
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_tool_display.py +3 -3
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_ui.py +34 -1
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_update_check.py +31 -5
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_update_progress.py +5 -2
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_welcome.py +47 -143
- deepagents_code-0.1.13/tests/unit_tests/tools/test_current_thread.py +27 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/uv.lock +174 -171
- deepagents_code-0.1.11/deepagents_code/integrations/sandbox_provider.py +0 -71
- deepagents_code-0.1.11/tests/unit_tests/test_install_command.py +0 -357
- deepagents_code-0.1.11/tests/unit_tests/test_server_helpers.py +0 -95
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/DEV.md +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/Makefile +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/README.md +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/extras_info.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/hooks.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_trust.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/non_interactive.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/server_manager.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/__init__.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/_links.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/approval.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/auth.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/diff.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/history.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/loading.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/message_store.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/model_selector.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/update_available.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/images/tui.png +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/scripts/install.sh +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/README.md +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_agent_selector.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_ask_user.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_auth_widgets.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_cursor_blink.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_filesystem_empty_result.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_history.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_trust.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_model_selector.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_notification_center.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_notification_detail.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_offload_dict_messages.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_update_available.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/tools/test_fetch_url.py +0 -0
|
@@ -137,6 +137,7 @@ celerybeat.pid
|
|
|
137
137
|
|
|
138
138
|
# Environments
|
|
139
139
|
.env
|
|
140
|
+
.env.*
|
|
140
141
|
.envrc
|
|
141
142
|
env.local
|
|
142
143
|
*.env.local
|
|
@@ -147,6 +148,20 @@ ENV/
|
|
|
147
148
|
env.bak/
|
|
148
149
|
venv.bak/
|
|
149
150
|
|
|
151
|
+
# Local credentials and secrets
|
|
152
|
+
*.pem
|
|
153
|
+
*.key
|
|
154
|
+
*.crt
|
|
155
|
+
*.p12
|
|
156
|
+
*.pfx
|
|
157
|
+
*.jks
|
|
158
|
+
credentials.json
|
|
159
|
+
token.json
|
|
160
|
+
Cookies
|
|
161
|
+
Cookies.db
|
|
162
|
+
cookies.sqlite
|
|
163
|
+
cookies.txt
|
|
164
|
+
|
|
150
165
|
# Spyder project settings
|
|
151
166
|
.spyderproject
|
|
152
167
|
.spyproject
|
|
@@ -38,6 +38,13 @@ Textual's `App.notify(message)` parses the message string as Rich markup by defa
|
|
|
38
38
|
|
|
39
39
|
`console.print()` defaults to `highlight=True`, which runs `ReprHighlighter` and auto-applies bold + cyan to any detected numbers. This visually overrides subtle styles like `dim` (bold cancels dim in most terminals). Pass `highlight=False` on any `console.print()` call where the content contains numbers and consistent dim/subtle styling matters.
|
|
40
40
|
|
|
41
|
+
### Glyphs and spinners — reuse, don't redefine
|
|
42
|
+
|
|
43
|
+
Charset-dependent characters and animations have **single sources of truth**. Reuse them instead of hand-rolling new ones — copies drift, and (more subtly) a hardcoded Unicode literal won't degrade to ASCII on terminals that need it.
|
|
44
|
+
|
|
45
|
+
- **Glyphs** (checkmarks, arrows, ellipsis, cursor, box-drawing, branch icon, etc.): pull from `get_glyphs()` (`config.Glyphs`). Each glyph has a Unicode and an ASCII variant; `get_glyphs()` returns the right set for the active terminal. Never inline `"✓"`, `"…"`, `"›"`, and friends.
|
|
46
|
+
- **Animated spinners**: reuse the `Spinner` class in `widgets/loading.py`, which wraps `get_glyphs().spinner_frames` (braille on Unicode, `(-) (\) (|) (/)` on ASCII) and exposes `next_frame()`/`current_frame()`. Do **not** define your own frame tuples or interval constants for a spinner — drive a `Spinner` on a `set_interval`. The status-bar reconnect indicator (`widgets/status.py`) is the reference example; it ticks at the same 0.1s cadence as `LoadingWidget`. All connection/queue progress lives in the status bar — the welcome banner deliberately stays out of it, so there are currently no bespoke spinners to carve an exception for.
|
|
47
|
+
|
|
41
48
|
### Textual patterns used in this codebase
|
|
42
49
|
|
|
43
50
|
- **Workers** (`@work` decorator) for async operations - see [Workers guide](https://textual.textualize.io/guide/workers/)
|
|
@@ -48,11 +55,57 @@ Textual's `App.notify(message)` parses the message string as Rich markup by defa
|
|
|
48
55
|
|
|
49
56
|
- Use `textual.pilot` for async UI testing - see [Testing guide](https://textual.textualize.io/guide/testing/)
|
|
50
57
|
- Snapshot testing available for visual regression - see repo `notes/snapshot_testing.md`
|
|
58
|
+
- For modal flows, test the real interaction path with keypresses when possible. Unit tests that call action methods or resume handlers directly can miss focus and modal-stack bugs.
|
|
59
|
+
- Do not open another modal or refocus the base chat input directly inside a modal dismiss callback. Preserve the non-blocking `push_screen(..., callback)` flow and schedule follow-up UI work with `call_after_refresh` so the dismissing modal fully unwinds first.
|
|
60
|
+
- Be cautious replacing `push_screen(..., callback)` with an awaited modal result inside slash-command handlers; awaiting can block the Textual message pump and break keyboard navigation in the active modal.
|
|
61
|
+
|
|
62
|
+
### Typing and test doubles
|
|
63
|
+
|
|
64
|
+
When fixing `ty` diagnostics, do not mechanically replace `# type: ignore[...]` with `cast(...)`. First try to improve the actual type shape: narrower annotations, typed futures/callbacks, covariant read-only types such as `Mapping`/`Sequence`, local mock variables, or `monkeypatch.setattr(...)`. Treat `cast("Any", ...)` as a last resort.
|
|
65
|
+
|
|
66
|
+
For Textual tests that intentionally replace concrete app methods with `MagicMock` or `AsyncMock`, prefer `monkeypatch.setattr(...)` or one small documented dynamic helper over repeated `cast("Any", app)` expressions. Assert on local mock variables instead of re-reading mocked methods from the concrete object when possible.
|
|
67
|
+
|
|
68
|
+
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.
|
|
51
69
|
|
|
52
70
|
## SDK dependency pin
|
|
53
71
|
|
|
54
72
|
`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 matches the current SDK version at release time (unless bypassed with `dangerous-skip-sdk-pin-check`).
|
|
55
73
|
|
|
74
|
+
## Local dev installs
|
|
75
|
+
|
|
76
|
+
Keep the released CLI and editable development CLI separate:
|
|
77
|
+
|
|
78
|
+
- `dcode` / `deepagents-code` should point at the normal installed tool, typically managed by `uv tool install deepagents-code`.
|
|
79
|
+
- `dcode-dev` should point at a dedicated editable venv under `~/.local/share/dcode-dev`, with a symlink in `~/.local/bin/dcode-dev`.
|
|
80
|
+
|
|
81
|
+
This uses a manual `uv venv` + `uv pip install -e` rather than `uv sync` or `uv tool install --editable` on purpose: it builds an isolated venv outside the workspace's locked environment, so the dev binary can be re-resolved on demand without disturbing the released tool or the repo's `uv.lock`. `uv pip`/`uv venv` are first-class `uv` subcommands here, not bare `pip`.
|
|
82
|
+
|
|
83
|
+
`~/.local/bin` must be on your `PATH` for the `dcode-dev` symlink to resolve (`uv tool install` adds its own shim directory automatically, but a hand-rolled symlink does not).
|
|
84
|
+
|
|
85
|
+
Example setup. The `--python` value is illustrative — any interpreter satisfying the package's `requires-python` (currently `>=3.11`) works; omit the flag to let `uv` pick. Replace `<repo>` with your local checkout path.
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
uv venv ~/.local/share/dcode-dev --python 3.13
|
|
89
|
+
uv pip install --python ~/.local/share/dcode-dev/bin/python -e <repo>/libs/code
|
|
90
|
+
ln -sf ~/.local/share/dcode-dev/bin/dcode ~/.local/bin/dcode-dev
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
When dependency constraints change in `libs/code/pyproject.toml`, update the dev venv explicitly:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
uv pip install --python ~/.local/share/dcode-dev/bin/python -e <repo>/libs/code --upgrade
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Verify command resolution and editable imports (the `dcode` checks assume the released tool is installed separately, per above):
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
which dcode
|
|
103
|
+
which dcode-dev
|
|
104
|
+
dcode --version
|
|
105
|
+
dcode-dev --version
|
|
106
|
+
~/.local/share/dcode-dev/bin/python -c 'import deepagents_code; print(deepagents_code.__file__)'
|
|
107
|
+
```
|
|
108
|
+
|
|
56
109
|
## Startup performance
|
|
57
110
|
|
|
58
111
|
`deepagents-code` must stay fast to launch. Never import heavy packages (e.g., `deepagents`, LangChain, LangGraph) at module level or in the argument-parsing path. These imports pull in large dependency trees and add seconds to every invocation, including trivial commands like `deepagents-code -v`.
|
|
@@ -94,7 +147,8 @@ To add a new slash command: (1) add a `SlashCommand` entry to `COMMANDS`, (2) se
|
|
|
94
147
|
1. `deepagents_code/model_config.py` — add `"provider_name": "ENV_VAR_NAME"` to `PROVIDER_API_KEY_ENV`
|
|
95
148
|
2. `deepagents_code/model_config.py` — if the provider reads a *dedicated* endpoint env var, add `"provider_name": ("CANONICAL_BASE_URL", "ALTERNATE", ...)` to `PROVIDER_BASE_URL_ENV` (see guidelines below); omit the provider entirely when it has no provider-specific endpoint variable
|
|
96
149
|
3. `pyproject.toml` — add `provider = ["langchain-provider>=X.Y.Z,<N.0.0"]` to `[project.optional-dependencies]` and include it in the `all-providers` composite extra
|
|
97
|
-
4. `
|
|
150
|
+
4. `deepagents_code/model_config.py` — add `"provider_name"` to `RETRY_PARAM_BY_PROVIDER` if the provider's chat model accepts `max_retries`
|
|
151
|
+
5. `tests/unit_tests/test_model_config.py` — add `assert PROVIDER_API_KEY_ENV["provider_name"] == "ENV_VAR_NAME"` to `TestProviderApiKeyEnv.test_contains_major_providers`, and pin any `PROVIDER_BASE_URL_ENV` entry with a matching assertion
|
|
98
152
|
|
|
99
153
|
### `PROVIDER_BASE_URL_ENV` guidelines
|
|
100
154
|
|
|
@@ -2,6 +2,59 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.1.13](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.12...deepagents-code==0.1.13) (2026-06-11)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* Pluggable third-party sandbox backends ([#3842](https://github.com/langchain-ai/deepagents/issues/3842)) ([2b635a7](https://github.com/langchain-ai/deepagents/commit/2b635a7e6e6b50ca8ce783c2ac96ed8643ae0224))
|
|
10
|
+
* Auto-install ripgrep on first run ([#3348](https://github.com/langchain-ai/deepagents/issues/3348)) ([fecf22b](https://github.com/langchain-ai/deepagents/commit/fecf22b0909e79ff7bdf180baf20abf5fdf1f390))
|
|
11
|
+
* `config` command and canonical config manifest ([#3763](https://github.com/langchain-ai/deepagents/issues/3763)) ([79899a3](https://github.com/langchain-ai/deepagents/commit/79899a306d01de6217a1dfcc013ae92c808a47a0))
|
|
12
|
+
* Confirm modal for `/install --package` ([#3840](https://github.com/langchain-ai/deepagents/issues/3840)) ([3d75026](https://github.com/langchain-ai/deepagents/commit/3d75026e2f241648fae78d9e1de2cbb4985f58ff))
|
|
13
|
+
* Copy focused input selection on `Ctrl+C` ([#3841](https://github.com/langchain-ai/deepagents/issues/3841)) ([99f782c](https://github.com/langchain-ai/deepagents/commit/99f782cf08336c200d02a24ae4edaa650af67ed2))
|
|
14
|
+
* `[retries]` config ([#3772](https://github.com/langchain-ai/deepagents/issues/3772)) ([9334d91](https://github.com/langchain-ai/deepagents/commit/9334d91ef94997e46d5373daca9c146fa9498763))
|
|
15
|
+
* Show connection state in the status bar ([#3710](https://github.com/langchain-ai/deepagents/issues/3710)) ([3e3e8fe](https://github.com/langchain-ai/deepagents/commit/3e3e8feb0e6e1b77be75a7756fbf32e5c9497c28))
|
|
16
|
+
* Surface LangSmith tracing projects in `LocalContextMiddleware` ([#3836](https://github.com/langchain-ai/deepagents/issues/3836)) ([676abec](https://github.com/langchain-ai/deepagents/commit/676abecf892ff537fcb1425ba5929cace3c5d503))
|
|
17
|
+
|
|
18
|
+
### Bug Fixes
|
|
19
|
+
|
|
20
|
+
* Add debug-log guidance for truncated startup errors ([#3849](https://github.com/langchain-ai/deepagents/issues/3849)) ([cd1ef30](https://github.com/langchain-ai/deepagents/commit/cd1ef303cf5d0e9d746c787eb09a4a89437e965a))
|
|
21
|
+
* Drop lock-key events so Caps Lock in iTerm2 doesn't type ([#3855](https://github.com/langchain-ai/deepagents/issues/3855)) ([110f1a7](https://github.com/langchain-ai/deepagents/commit/110f1a7a975743efda12e181cb3afc8404202254))
|
|
22
|
+
* Hand pointer over splash tracing project link ([#3858](https://github.com/langchain-ai/deepagents/issues/3858)) ([ea7dae5](https://github.com/langchain-ai/deepagents/commit/ea7dae58a37cfb1d2b96544eb7c941aad331b280))
|
|
23
|
+
* Keep terminal-default theme on Esc in `/theme` selector ([#3854](https://github.com/langchain-ai/deepagents/issues/3854)) ([c3bc67b](https://github.com/langchain-ai/deepagents/commit/c3bc67b0cdeda6f4dbcc6360ddd72b455aec4fe7))
|
|
24
|
+
* Preserve inherited `PYTHONPATH` for server subprocess ([#3833](https://github.com/langchain-ai/deepagents/issues/3833)) ([4689569](https://github.com/langchain-ai/deepagents/commit/4689569f94138987319cd9cbb45ce66a1f496934))
|
|
25
|
+
* Resolve interpreter PTC allowlist against the runtime tool registry ([#3845](https://github.com/langchain-ai/deepagents/issues/3845)) ([c59a27e](https://github.com/langchain-ai/deepagents/commit/c59a27ef2405b8e04c4351ce7ffa53d8d16d519c))
|
|
26
|
+
* Treat multi-line key-event pastes as one input ([#3856](https://github.com/langchain-ai/deepagents/issues/3856)) ([6bb15d4](https://github.com/langchain-ai/deepagents/commit/6bb15d4bd97bd16f47504f937c8458d1b53d9cc4))
|
|
27
|
+
|
|
28
|
+
## [0.1.12](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.11...deepagents-code==0.1.12) (2026-06-10)
|
|
29
|
+
|
|
30
|
+
### Features
|
|
31
|
+
|
|
32
|
+
* Add `get_current_thread_id` tool ([#3820](https://github.com/langchain-ai/deepagents/issues/3820)) ([18ce094](https://github.com/langchain-ai/deepagents/commit/18ce094b7036796c7e23ce1338f4da56dc2ef126))
|
|
33
|
+
* Guard managed onboarding-name memory block from edits ([#3822](https://github.com/langchain-ai/deepagents/issues/3822)) ([dc0a51f](https://github.com/langchain-ai/deepagents/commit/dc0a51fc81d01b62dc8043148a9fd87099fc9123))
|
|
34
|
+
* Offer restart after restart-capable install ([#3821](https://github.com/langchain-ai/deepagents/issues/3821)) ([e356efe](https://github.com/langchain-ai/deepagents/commit/e356efeff1c8bfb894119cebbb7d3c0853d327a2))
|
|
35
|
+
* Persist `/threads` directory-scope preference ([#3824](https://github.com/langchain-ai/deepagents/issues/3824)) ([51a29f4](https://github.com/langchain-ai/deepagents/commit/51a29f4a0c28c122acae296a0df03bee20474455))
|
|
36
|
+
* Surface gateway key mismatch on `PermissionDeniedError` ([#3813](https://github.com/langchain-ai/deepagents/issues/3813)) ([5bd1ef8](https://github.com/langchain-ai/deepagents/commit/5bd1ef8cb29db781ccbb37755db44ce0ab1d7bd2))
|
|
37
|
+
|
|
38
|
+
### Bug Fixes
|
|
39
|
+
|
|
40
|
+
* Surface cached MCP errors as failed tool messages ([#3829](https://github.com/langchain-ai/deepagents/issues/3829)) ([d83b428](https://github.com/langchain-ai/deepagents/commit/d83b428f7f97bc40b9219c02846c2d8b4ccac434))
|
|
41
|
+
* Handle MCP tool errors locally ([#3830](https://github.com/langchain-ai/deepagents/issues/3830)) ([97a7052](https://github.com/langchain-ai/deepagents/commit/97a7052b3eef7ec80bc90a4c3b606deeaf13cb9b))
|
|
42
|
+
* Make non-incognito `!` shell output visible to the model ([#3825](https://github.com/langchain-ai/deepagents/issues/3825)) ([2407bca](https://github.com/langchain-ai/deepagents/commit/2407bca66bac5d199a923a0e58872c813eb006bc))
|
|
43
|
+
* Expose `/restart` slash command ([#3809](https://github.com/langchain-ai/deepagents/issues/3809)) ([64505b8](https://github.com/langchain-ai/deepagents/commit/64505b848868b80213b6da87113cd63890c3d520))
|
|
44
|
+
* Agent retries `gh search` with invalid `mergedAt` field ([#3802](https://github.com/langchain-ai/deepagents/issues/3802)) ([0b683a9](https://github.com/langchain-ai/deepagents/commit/0b683a9435b95bce79d10451868eae54c6a3e88c))
|
|
45
|
+
* Clarify `/restart` message during server startup ([#3823](https://github.com/langchain-ai/deepagents/issues/3823)) ([49ded9e](https://github.com/langchain-ai/deepagents/commit/49ded9ef448dcd263bee07ac15f4904dd342bfa2))
|
|
46
|
+
* Cursor at end when popping queued message to input ([#3832](https://github.com/langchain-ai/deepagents/issues/3832)) ([aa522c9](https://github.com/langchain-ai/deepagents/commit/aa522c94fffb93dc578addb39b4879f779ac5899))
|
|
47
|
+
* Coalesce streamed markdown writes to keep input responsive ([#3819](https://github.com/langchain-ai/deepagents/issues/3819)) ([b45eeeb](https://github.com/langchain-ai/deepagents/commit/b45eeebaf7e6ae6e07b8f9ca521525c66fe14f63))
|
|
48
|
+
* Don't show `"No threads found"` while threads load ([#3815](https://github.com/langchain-ai/deepagents/issues/3815)) ([68e6426](https://github.com/langchain-ai/deepagents/commit/68e64263f590b3244b689664715f354fb3a389cd))
|
|
49
|
+
* Ignore stale cwd warmers in file autocomplete cache ([#3835](https://github.com/langchain-ai/deepagents/issues/3835)) ([9c8c2b2](https://github.com/langchain-ai/deepagents/commit/9c8c2b24853b7b3a7610cbcfc368a6464c0711e0))
|
|
50
|
+
* Offer cwd switch on resume ([#3810](https://github.com/langchain-ai/deepagents/issues/3810)) ([d417f53](https://github.com/langchain-ai/deepagents/commit/d417f530aafa8c77523487393dc3039cc822dc09))
|
|
51
|
+
* Recover from tool errors instead of aborting run ([#3804](https://github.com/langchain-ai/deepagents/issues/3804)) ([45691c5](https://github.com/langchain-ai/deepagents/commit/45691c556105e171c7210c7c10388dc73202a025))
|
|
52
|
+
* Show `/restart` feedback ([#3808](https://github.com/langchain-ai/deepagents/issues/3808)) ([c40bef9](https://github.com/langchain-ai/deepagents/commit/c40bef9b2aaace3909593503b28e8b548bc20014))
|
|
53
|
+
* Standardize search previews and restart status ([#3806](https://github.com/langchain-ai/deepagents/issues/3806)) ([71a6d50](https://github.com/langchain-ai/deepagents/commit/71a6d508b21b275c0c7c6bd2e0752adfba496ea9))
|
|
54
|
+
* Suppress stale update notices ([#3801](https://github.com/langchain-ai/deepagents/issues/3801)) ([db25241](https://github.com/langchain-ai/deepagents/commit/db252411d8ca945aca86429acb644540ec970bdb))
|
|
55
|
+
* Unblock `/remember` in server mode ([#3812](https://github.com/langchain-ai/deepagents/issues/3812)) ([12e00e1](https://github.com/langchain-ai/deepagents/commit/12e00e1a78e2d6be106147a0aa95a518be66849f))
|
|
56
|
+
* Unblock TUI input during `/restart` ([#3826](https://github.com/langchain-ai/deepagents/issues/3826)) ([366cd81](https://github.com/langchain-ai/deepagents/commit/366cd81269e2d3891a477848b774cf51af0cefc0))
|
|
57
|
+
|
|
5
58
|
## [0.1.11](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.10...deepagents-code==0.1.11) (2026-06-07)
|
|
6
59
|
|
|
7
60
|
### Bug Fixes
|
|
@@ -6,7 +6,7 @@ Canonical list of slash commands for `deepagents-code`, derived from
|
|
|
6
6
|
regenerate after editing the registry.
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
## Public (
|
|
9
|
+
## Public (28)
|
|
10
10
|
|
|
11
11
|
| Command | Aliases | Description |
|
|
12
12
|
| --- | --- | --- |
|
|
@@ -29,6 +29,7 @@ regenerate after editing the registry.
|
|
|
29
29
|
| `/quit` | `/q` | Exit app |
|
|
30
30
|
| `/reload` | | Reload config from environment variables and .env |
|
|
31
31
|
| `/remember` | | Update memory and skills from conversation |
|
|
32
|
+
| `/restart` | | Restart the app-owned LangGraph server |
|
|
32
33
|
| `/skill-creator` | | Guide for creating effective agent skills |
|
|
33
34
|
| `/theme` | | Switch color theme |
|
|
34
35
|
| `/threads` | | Browse and resume previous threads |
|
|
@@ -38,9 +39,8 @@ regenerate after editing the registry.
|
|
|
38
39
|
| `/update` | | Check for and install updates |
|
|
39
40
|
| `/version` | `/about` | Show version |
|
|
40
41
|
|
|
41
|
-
## Hidden (
|
|
42
|
+
## Hidden (1)
|
|
42
43
|
|
|
43
44
|
Hidden commands not exposed in autocomplete or help. See the `HIDDEN_COMMANDS` docstring in the registry for context.
|
|
44
45
|
|
|
45
46
|
- `/debug-error`
|
|
46
|
-
- `/restart`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.13
|
|
4
4
|
Summary: Terminal interface for Deep Agents - interactive AI agent with file operations, shell access, and sub-agent capabilities.
|
|
5
5
|
Project-URL: Homepage, https://docs.langchain.com/oss/python/deepagents/overview
|
|
6
6
|
Project-URL: Documentation, https://reference.langchain.com/python/deepagents/
|
|
@@ -31,23 +31,23 @@ Requires-Dist: deepagents==0.6.8
|
|
|
31
31
|
Requires-Dist: httpx<1.0.0,>=0.28.1
|
|
32
32
|
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.4
|
|
33
33
|
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.4
|
|
34
|
-
Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.
|
|
34
|
+
Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.0
|
|
35
35
|
Requires-Dist: langchain-openai<2.0.0,>=1.2.2
|
|
36
36
|
Requires-Dist: langchain<2.0.0,>=1.3.4
|
|
37
37
|
Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
|
|
38
38
|
Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.27
|
|
39
39
|
Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.29.0
|
|
40
40
|
Requires-Dist: langgraph-sdk<1.0.0,>=0.4.2
|
|
41
|
-
Requires-Dist: langsmith[sandbox]>=0.8.
|
|
41
|
+
Requires-Dist: langsmith[sandbox]>=0.8.11
|
|
42
42
|
Requires-Dist: markdownify<2.0.0,>=1.2.2
|
|
43
43
|
Requires-Dist: packaging>=26.2
|
|
44
44
|
Requires-Dist: pillow<13.0.0,>=12.2.0
|
|
45
45
|
Requires-Dist: prompt-toolkit<4.0.0,>=3.0.52
|
|
46
46
|
Requires-Dist: pyperclip<2.0.0,>=1.11.0
|
|
47
47
|
Requires-Dist: python-dotenv<2.0.0,>=1.2.2
|
|
48
|
-
Requires-Dist: pyyaml>=6.0.
|
|
48
|
+
Requires-Dist: pyyaml>=6.0.3
|
|
49
49
|
Requires-Dist: requests<3.0.0,>=2.34.2
|
|
50
|
-
Requires-Dist: rich<16.0.0,>=
|
|
50
|
+
Requires-Dist: rich<16.0.0,>=15.0.0
|
|
51
51
|
Requires-Dist: tavily-python<1.0.0,>=0.7.25
|
|
52
52
|
Requires-Dist: textual-autocomplete<5.0.0,>=4.0.6
|
|
53
53
|
Requires-Dist: textual-speedups<1.0.0,>=0.2.1
|
|
@@ -55,13 +55,13 @@ Requires-Dist: textual<9.0.0,>=8.2.7
|
|
|
55
55
|
Requires-Dist: tomli-w<2.0.0,>=1.2.0
|
|
56
56
|
Requires-Dist: uuid-utils<1.0.0,>=0.16.0
|
|
57
57
|
Provides-Extra: agentcore
|
|
58
|
-
Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.
|
|
58
|
+
Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.4; extra == 'agentcore'
|
|
59
59
|
Provides-Extra: all-providers
|
|
60
60
|
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.4; extra == 'all-providers'
|
|
61
|
-
Requires-Dist: langchain-aws<2.0.0,>=1.5.
|
|
61
|
+
Requires-Dist: langchain-aws<2.0.0,>=1.5.1; extra == 'all-providers'
|
|
62
62
|
Requires-Dist: langchain-baseten<1.0.0,>=0.2.0; extra == 'all-providers'
|
|
63
63
|
Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
|
|
64
|
-
Requires-Dist: langchain-deepseek<2.0.0,>=1.0
|
|
64
|
+
Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
65
65
|
Requires-Dist: langchain-fireworks<2.0.0,>=1.4.2; extra == 'all-providers'
|
|
66
66
|
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.4; extra == 'all-providers'
|
|
67
67
|
Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.3; extra == 'all-providers'
|
|
@@ -70,30 +70,30 @@ Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'all-providers'
|
|
|
70
70
|
Requires-Dist: langchain-ibm<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
71
71
|
Requires-Dist: langchain-litellm<2.0.0,>=0.6.6; extra == 'all-providers'
|
|
72
72
|
Requires-Dist: langchain-mistralai<2.0.0,>=1.1.4; extra == 'all-providers'
|
|
73
|
-
Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.
|
|
73
|
+
Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.1; extra == 'all-providers'
|
|
74
74
|
Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
75
75
|
Requires-Dist: langchain-openai<2.0.0,>=1.2.2; extra == 'all-providers'
|
|
76
76
|
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.3; extra == 'all-providers'
|
|
77
|
-
Requires-Dist: langchain-perplexity<2.0.0,>=1.3.
|
|
77
|
+
Requires-Dist: langchain-perplexity<2.0.0,>=1.3.2; extra == 'all-providers'
|
|
78
78
|
Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'all-providers'
|
|
79
79
|
Requires-Dist: langchain-xai<2.0.0,>=1.2.2; extra == 'all-providers'
|
|
80
80
|
Provides-Extra: all-sandboxes
|
|
81
|
-
Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.
|
|
82
|
-
Requires-Dist: langchain-daytona>=0.0.
|
|
83
|
-
Requires-Dist: langchain-modal>=0.0.
|
|
81
|
+
Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.4; extra == 'all-sandboxes'
|
|
82
|
+
Requires-Dist: langchain-daytona>=0.0.7; extra == 'all-sandboxes'
|
|
83
|
+
Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
|
|
84
84
|
Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
|
|
85
85
|
Provides-Extra: anthropic
|
|
86
86
|
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.4; extra == 'anthropic'
|
|
87
87
|
Provides-Extra: baseten
|
|
88
88
|
Requires-Dist: langchain-baseten<1.0.0,>=0.2.0; extra == 'baseten'
|
|
89
89
|
Provides-Extra: bedrock
|
|
90
|
-
Requires-Dist: langchain-aws<2.0.0,>=1.5.
|
|
90
|
+
Requires-Dist: langchain-aws<2.0.0,>=1.5.1; extra == 'bedrock'
|
|
91
91
|
Provides-Extra: cohere
|
|
92
92
|
Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'cohere'
|
|
93
93
|
Provides-Extra: daytona
|
|
94
|
-
Requires-Dist: langchain-daytona>=0.0.
|
|
94
|
+
Requires-Dist: langchain-daytona>=0.0.7; extra == 'daytona'
|
|
95
95
|
Provides-Extra: deepseek
|
|
96
|
-
Requires-Dist: langchain-deepseek<2.0.0,>=1.0
|
|
96
|
+
Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'deepseek'
|
|
97
97
|
Provides-Extra: fireworks
|
|
98
98
|
Requires-Dist: langchain-fireworks<2.0.0,>=1.4.2; extra == 'fireworks'
|
|
99
99
|
Provides-Extra: google-genai
|
|
@@ -109,9 +109,9 @@ Requires-Dist: langchain-litellm<2.0.0,>=0.6.6; extra == 'litellm'
|
|
|
109
109
|
Provides-Extra: mistralai
|
|
110
110
|
Requires-Dist: langchain-mistralai<2.0.0,>=1.1.4; extra == 'mistralai'
|
|
111
111
|
Provides-Extra: modal
|
|
112
|
-
Requires-Dist: langchain-modal>=0.0.
|
|
112
|
+
Requires-Dist: langchain-modal>=0.0.5; extra == 'modal'
|
|
113
113
|
Provides-Extra: nvidia
|
|
114
|
-
Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.
|
|
114
|
+
Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.1; extra == 'nvidia'
|
|
115
115
|
Provides-Extra: ollama
|
|
116
116
|
Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'ollama'
|
|
117
117
|
Provides-Extra: openai
|
|
@@ -119,9 +119,9 @@ Requires-Dist: langchain-openai<2.0.0,>=1.2.2; extra == 'openai'
|
|
|
119
119
|
Provides-Extra: openrouter
|
|
120
120
|
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.3; extra == 'openrouter'
|
|
121
121
|
Provides-Extra: perplexity
|
|
122
|
-
Requires-Dist: langchain-perplexity<2.0.0,>=1.3.
|
|
122
|
+
Requires-Dist: langchain-perplexity<2.0.0,>=1.3.2; extra == 'perplexity'
|
|
123
123
|
Provides-Extra: quickjs
|
|
124
|
-
Requires-Dist: langchain-quickjs<0.2.0,>=0.1.
|
|
124
|
+
Requires-Dist: langchain-quickjs<0.2.0,>=0.1.4; extra == 'quickjs'
|
|
125
125
|
Provides-Extra: runloop
|
|
126
126
|
Requires-Dist: langchain-runloop>=0.0.6; extra == 'runloop'
|
|
127
127
|
Provides-Extra: together
|
|
@@ -409,6 +409,13 @@
|
|
|
409
409
|
- **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.
|
|
410
410
|
- **Preconditions**: (1) Attacker has write access to a project-level `.mcp.json`; (2) The project MCP config must be trusted by the user (fingerprint approval gate via `mcp_trust`). 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.
|
|
411
411
|
|
|
412
|
+
#### T11: Auto-Installed ripgrep Binary from Upstream Release
|
|
413
|
+
|
|
414
|
+
- **Flow**: First-run download performed by `managed_tools.ensure_ripgrep` when `rg` is not on `PATH`.
|
|
415
|
+
- **Description**: On first invocation without a system `rg`, Deep Agents Code fetches the pinned ripgrep release tarball from `github.com/BurntSushi/ripgrep/releases/...`, verifies it against an in-tree SHA-256 (`RIPGREP_ASSETS`), extracts it under a `TemporaryDirectory`, and atomically moves the binary into `~/.deepagents/bin/rg`. The binary then runs unsandboxed, inheriting the same trust as a user-installed `rg` (the SDK invokes it via `subprocess.run(["rg", ...])`).
|
|
416
|
+
- **Mitigations**: (1) SHA-256 verified against the pinned hash table before move — a mismatch aborts the install and leaves `BIN_DIR` clean. (2) Network egress is limited to `github.com`. (3) Opt-out via `DEEPAGENTS_CODE_OFFLINE` for air-gapped environments. (4) Pinned version + checksums are bumped in-tree, so a compromised upstream release is detected on the next Deep Agents Code release rather than silently propagating. (5) Atomic move-into-place avoids partial installs when concurrent CLI invocations race.
|
|
417
|
+
- **Preconditions**: User has not installed `rg` via their package manager, `DEEPAGENTS_CODE_OFFLINE` is unset, and the host can reach `github.com`. The pinned SHA-256 in `RIPGREP_ASSETS` would need to be incorrect (a supply-chain compromise of the deepagents-code release) for a tampered binary to be installed.
|
|
418
|
+
|
|
412
419
|
---
|
|
413
420
|
|
|
414
421
|
## Input Source Coverage
|
|
@@ -13,7 +13,12 @@ import os
|
|
|
13
13
|
import sys
|
|
14
14
|
from pathlib import Path
|
|
15
15
|
|
|
16
|
-
from deepagents_code._env_vars import
|
|
16
|
+
from deepagents_code._env_vars import (
|
|
17
|
+
DEBUG,
|
|
18
|
+
DEBUG_FILE,
|
|
19
|
+
DEFAULT_DEBUG_FILE,
|
|
20
|
+
is_env_truthy,
|
|
21
|
+
)
|
|
17
22
|
|
|
18
23
|
_DEBUG_HANDLER_ATTR = "_deepagents_code_debug_handler"
|
|
19
24
|
|
|
@@ -25,8 +30,8 @@ def configure_debug_logging(target: logging.Logger) -> None:
|
|
|
25
30
|
module loggers reach the same file via propagation, so individual modules do
|
|
26
31
|
not configure logging themselves.
|
|
27
32
|
|
|
28
|
-
The log file defaults to `
|
|
29
|
-
|
|
33
|
+
The log file defaults to `DEFAULT_DEBUG_FILE` but can be overridden with
|
|
34
|
+
`DEEPAGENTS_CODE_DEBUG_FILE`. The handler appends (`mode='a'`) so logs
|
|
30
35
|
are preserved across separate process runs. Calling this again with the same
|
|
31
36
|
resolved path is a no-op: the existing tagged handler is reused rather than
|
|
32
37
|
stacking duplicates. If the resolved path changes, the stale handler is
|
|
@@ -40,12 +45,7 @@ def configure_debug_logging(target: logging.Logger) -> None:
|
|
|
40
45
|
if not is_env_truthy(DEBUG):
|
|
41
46
|
return
|
|
42
47
|
|
|
43
|
-
debug_path = Path(
|
|
44
|
-
os.environ.get(
|
|
45
|
-
DEBUG_FILE,
|
|
46
|
-
"/tmp/deepagents_debug.log", # noqa: S108
|
|
47
|
-
)
|
|
48
|
-
)
|
|
48
|
+
debug_path = Path(os.environ.get(DEBUG_FILE, DEFAULT_DEBUG_FILE))
|
|
49
49
|
for existing in list(target.handlers):
|
|
50
50
|
if not (
|
|
51
51
|
isinstance(existing, logging.FileHandler)
|
|
@@ -74,3 +74,23 @@ def configure_debug_logging(target: logging.Logger) -> None:
|
|
|
74
74
|
handler.setFormatter(logging.Formatter("%(asctime)s %(name)s %(message)s"))
|
|
75
75
|
target.addHandler(handler)
|
|
76
76
|
target.setLevel(logging.DEBUG)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def installed_debug_log_path() -> Path | None:
|
|
80
|
+
"""Return the path of the active debug log file, or `None` if not logging.
|
|
81
|
+
|
|
82
|
+
Reflects the file handler actually attached by `configure_debug_logging`,
|
|
83
|
+
not the current `DEEPAGENTS_CODE_DEBUG` env value. The two diverge when the
|
|
84
|
+
variable is set after import — e.g. via a project/global `.env` loaded during
|
|
85
|
+
settings bootstrap — in which case the variable reads truthy but no handler
|
|
86
|
+
was installed and no log file exists. Callers that surface "full error in
|
|
87
|
+
<path>" hints must use this rather than the env var to avoid pointing users
|
|
88
|
+
at a file that was never created.
|
|
89
|
+
"""
|
|
90
|
+
package_logger = logging.getLogger(__package__ or "deepagents_code")
|
|
91
|
+
for handler in package_logger.handlers:
|
|
92
|
+
if isinstance(handler, logging.FileHandler) and getattr(
|
|
93
|
+
handler, _DEBUG_HANDLER_ATTR, False
|
|
94
|
+
):
|
|
95
|
+
return Path(handler.baseFilename)
|
|
96
|
+
return None
|
|
@@ -46,7 +46,10 @@ as enabled, and `0`, `false`, `no`, `off`, empty string, or unset as disabled.
|
|
|
46
46
|
"""
|
|
47
47
|
|
|
48
48
|
DEBUG_FILE = "DEEPAGENTS_CODE_DEBUG_FILE"
|
|
49
|
-
"""Path for the debug log file (default:
|
|
49
|
+
"""Path for the debug log file (default: `DEFAULT_DEBUG_FILE`)."""
|
|
50
|
+
|
|
51
|
+
DEFAULT_DEBUG_FILE = "/tmp/deepagents_debug.log" # noqa: S108 # opt-in debug log
|
|
52
|
+
"""Default path for the debug log when `DEBUG_FILE` is unset."""
|
|
50
53
|
|
|
51
54
|
DEBUG_MCP_PROJECT_TRUST = "DEEPAGENTS_CODE_DEBUG_MCP_PROJECT_TRUST"
|
|
52
55
|
"""Force the project MCP approval prompt for manual UI testing.
|
|
@@ -124,6 +127,14 @@ NO_TERMINAL_ESCAPE = "DEEPAGENTS_CODE_NO_TERMINAL_ESCAPE"
|
|
|
124
127
|
NO_UPDATE_CHECK = "DEEPAGENTS_CODE_NO_UPDATE_CHECK"
|
|
125
128
|
"""Disable automatic update checking when set."""
|
|
126
129
|
|
|
130
|
+
OFFLINE = "DEEPAGENTS_CODE_OFFLINE"
|
|
131
|
+
"""Disable network downloads of managed binaries (e.g. ripgrep).
|
|
132
|
+
|
|
133
|
+
Parsed by `is_env_truthy`: accepts `1`, `true`, `yes`, `on` as enabled. When
|
|
134
|
+
truthy, `managed_tools.ensure_ripgrep` will not attempt to download a binary
|
|
135
|
+
and falls back to the existing missing-tool notification + slow Python regex
|
|
136
|
+
path."""
|
|
137
|
+
|
|
127
138
|
OLLAMA_DISCOVERY = "DEEPAGENTS_CODE_OLLAMA_DISCOVERY"
|
|
128
139
|
"""Toggle Ollama model and profile discovery probes.
|
|
129
140
|
|
|
@@ -164,6 +175,29 @@ _TRUTHY_VALUES = frozenset({"1", "true", "yes", "on"})
|
|
|
164
175
|
_FALSY_VALUES = frozenset({"0", "false", "no", "off", ""})
|
|
165
176
|
|
|
166
177
|
|
|
178
|
+
def classify_env_bool(raw: str) -> bool | None:
|
|
179
|
+
"""Classify a raw env-var string as a truthy, falsy, or unrecognized token.
|
|
180
|
+
|
|
181
|
+
The single source of truth for which strings count as boolean on/off
|
|
182
|
+
values; `is_env_truthy` and the config resolver both build on it so they
|
|
183
|
+
agree on what "recognizably boolean" means.
|
|
184
|
+
|
|
185
|
+
Args:
|
|
186
|
+
raw: The raw (unstripped) environment-variable value.
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
`True` for `1`/`true`/`yes`/`on`, `False` for `0`/`false`/`no`/`off`/
|
|
190
|
+
empty string (case-insensitive), or `None` when the value
|
|
191
|
+
is neither.
|
|
192
|
+
"""
|
|
193
|
+
lowered = raw.strip().lower()
|
|
194
|
+
if lowered in _TRUTHY_VALUES:
|
|
195
|
+
return True
|
|
196
|
+
if lowered in _FALSY_VALUES:
|
|
197
|
+
return False
|
|
198
|
+
return None
|
|
199
|
+
|
|
200
|
+
|
|
167
201
|
def is_env_truthy(name: str, *, default: bool = False) -> bool:
|
|
168
202
|
"""Return whether env var *name* is set to a recognizably truthy value.
|
|
169
203
|
|
|
@@ -184,9 +218,5 @@ def is_env_truthy(name: str, *, default: bool = False) -> bool:
|
|
|
184
218
|
raw = os.environ.get(name)
|
|
185
219
|
if raw is None:
|
|
186
220
|
return default
|
|
187
|
-
|
|
188
|
-
if
|
|
189
|
-
return True
|
|
190
|
-
if lowered in _FALSY_VALUES:
|
|
191
|
-
return False
|
|
192
|
-
return default
|
|
221
|
+
classified = classify_env_bool(raw)
|
|
222
|
+
return default if classified is None else classified
|
|
@@ -164,7 +164,9 @@ class ServerConfig:
|
|
|
164
164
|
|
|
165
165
|
`None` means "fall through to whatever `settings.interpreter_ptc` resolves
|
|
166
166
|
to from `~/.deepagents/config.toml`". A string is one of `"safe"`/`"all"`;
|
|
167
|
-
a list is an explicit allowlist of tool names
|
|
167
|
+
a list is an explicit allowlist of tool names that may also include the
|
|
168
|
+
`"safe"` preset (expanded at agent-build time); `"all"` is rejected inside
|
|
169
|
+
a list.
|
|
168
170
|
"""
|
|
169
171
|
|
|
170
172
|
interpreter_ptc_acknowledge_unsafe: bool = False
|
|
@@ -11,7 +11,7 @@ from __future__ import annotations
|
|
|
11
11
|
from dataclasses import dataclass, field
|
|
12
12
|
from typing import Literal
|
|
13
13
|
|
|
14
|
-
SpinnerStatus = Literal["Thinking", "Offloading"] | None
|
|
14
|
+
SpinnerStatus = Literal["Thinking", "Offloading", "Loading thread"] | None
|
|
15
15
|
"""Valid spinner display states, or `None` to hide."""
|
|
16
16
|
|
|
17
17
|
|