deepagents-code 0.1.22__tar.gz → 0.1.24__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.22 → deepagents_code-0.1.24}/.gitignore +3 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/AGENTS.md +1 -1
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/CHANGELOG.md +31 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/Makefile +1 -1
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/PKG-INFO +3 -3
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/THREAT_MODEL.md +4 -4
- deepagents_code-0.1.24/deepagents_code/_build_info.py +3 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/_cli_context.py +11 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/_env_vars.py +19 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/_server_config.py +75 -3
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/agent.py +40 -4
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/app.py +347 -50
- deepagents_code-0.1.24/deepagents_code/approval_mode.py +131 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/config.py +11 -4
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/config_manifest.py +19 -3
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/configurable_model.py +3 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/doctor.py +36 -2
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/extras_info.py +11 -12
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/main.py +147 -34
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/managed_tools.py +77 -6
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/non_interactive.py +2 -2
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/remote_client.py +52 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/server_manager.py +4 -4
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/textual_adapter.py +107 -6
- deepagents_code-0.1.24/deepagents_code/tools_commands.py +191 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/ui.py +61 -3
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/update_check.py +351 -62
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/_links.py +21 -1
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/auth.py +61 -15
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/launch_init.py +1 -1
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/messages.py +19 -1
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/model_selector.py +2 -0
- deepagents_code-0.1.24/deepagents_code/widgets/subagent_panel.py +969 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/welcome.py +2 -1
- deepagents_code-0.1.24/hatch_build.py +67 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/pyproject.toml +11 -5
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/scripts/install.sh +39 -3
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/conftest.py +18 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_agent.py +153 -4
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_agent_friendly.py +8 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_app.py +820 -21
- deepagents_code-0.1.24/tests/unit_tests/test_approval_mode.py +129 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_auth_widgets.py +162 -8
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_config.py +46 -7
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_configurable_model.py +34 -1
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_doctor.py +58 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_extras_info.py +6 -6
- deepagents_code-0.1.24/tests/unit_tests/test_hatch_build.py +159 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_install_command.py +3 -9
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_install_script.py +92 -2
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_launch_init.py +1 -1
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_links.py +29 -1
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_main.py +43 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_main_args.py +342 -10
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_managed_tools.py +150 -1
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_messages.py +73 -1
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_non_interactive.py +1 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_remote_client.py +75 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_server_config.py +151 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_sessions.py +11 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_startup_fast_paths.py +2 -0
- deepagents_code-0.1.24/tests/unit_tests/test_subagent_panel.py +549 -0
- deepagents_code-0.1.24/tests/unit_tests/test_subagent_stream.py +41 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_textual_adapter.py +227 -2
- deepagents_code-0.1.24/tests/unit_tests/test_tools_commands.py +144 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_update_check.py +604 -13
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_version.py +65 -4
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_welcome.py +5 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/uv.lock +30 -8
- deepagents_code-0.1.22/deepagents_code/filesystem_empty_result.py +0 -99
- deepagents_code-0.1.22/tests/unit_tests/test_filesystem_empty_result.py +0 -160
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/ARCHITECTURE.md +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/COMMANDS.md +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/DEVELOPMENT.md +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/README.md +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/_paths.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/auth_commands.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/command_registry.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/config_commands.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/hooks.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/integrations/sandbox_factory.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/mcp_auth.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/mcp_commands.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/mcp_tools.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/mcp_trust.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/model_config.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/offload.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/server.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/server_graph.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/sessions.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/system_prompt.md +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/__init__.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/_js_eval_display.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/approval.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/ask_user.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/chat_input.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/codex_auth.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/diff.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/history.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/install_confirm.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/loading.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/message_store.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/restart_prompt.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/status.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/thread_selector.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/update_available.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/update_confirm.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/deepagents_code/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/images/tui.png +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/README.md +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_agent_selector.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_approval.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_args.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_ask_user.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_auth_commands.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_autocomplete.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_chat_input.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_config_manifest.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_cursor_blink.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_cwd_switch.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_history.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_install_confirm.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_loading.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_mcp_commands.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_mcp_trust.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_mcp_viewer.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_message_store.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_model_config.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_model_selector.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_notification_center.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_notification_detail.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_offload_dict_messages.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_paths.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_sandbox_registry.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_server.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_status.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_thread_selector.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_tracing_replicas.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_update_available.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_update_confirm.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/test_update_progress.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/widgets/__init__.py +0 -0
- {deepagents_code-0.1.22 → deepagents_code-0.1.24}/tests/unit_tests/widgets/test_diff.py +0 -0
|
@@ -69,7 +69,7 @@ Casts are acceptable when the type violation is the point of the test (for examp
|
|
|
69
69
|
|
|
70
70
|
## SDK dependency pin
|
|
71
71
|
|
|
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
|
|
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 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.
|
|
73
73
|
|
|
74
74
|
For a persistent editable `dcode-dev` install that stays separate from a released install, see [Local dev installs](./DEVELOPMENT.md#local-dev-installs) in the development guide.
|
|
75
75
|
|
|
@@ -2,6 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.1.24](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.23...deepagents-code==0.1.24) (2026-06-25)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* Enable `js_eval` by default ([#4245](https://github.com/langchain-ai/deepagents/issues/4245)) ([2e04ff3](https://github.com/langchain-ai/deepagents/commit/2e04ff397e60389c9a19c4a9b528e15602ad8338))
|
|
10
|
+
* Dynamic subagents UI ([#4221](https://github.com/langchain-ai/deepagents/issues/4221)) ([10bcba2](https://github.com/langchain-ai/deepagents/commit/10bcba25600e51aba135f170b34aa6315c0f53d6))
|
|
11
|
+
* Gate onboarding integrations modal behind opt-in flag ([#4227](https://github.com/langchain-ai/deepagents/issues/4227)) ([6c930c5](https://github.com/langchain-ai/deepagents/commit/6c930c5e4502f572be554acc896c5fb6d061e0e5))
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* Eager managed ripgrep install via `dcode tools install` ([#4199](https://github.com/langchain-ai/deepagents/issues/4199)) ([cf536f3](https://github.com/langchain-ai/deepagents/commit/cf536f339958d6726fa41f896c4a3e42df644c9f))
|
|
16
|
+
* Interrupt remote runs on chat cancellation ([#4234](https://github.com/langchain-ai/deepagents/issues/4234)) ([37c5fa2](https://github.com/langchain-ai/deepagents/commit/37c5fa23e621616836694bc59c1b0c38def81604))
|
|
17
|
+
* Sync approval toggles during active runs ([#4239](https://github.com/langchain-ai/deepagents/issues/4239)) ([4600365](https://github.com/langchain-ai/deepagents/commit/4600365ea0b60c3e9113ecf59b5336be37d03428))
|
|
18
|
+
* Clear stale live approval mode keys ([#4242](https://github.com/langchain-ai/deepagents/issues/4242)) ([f11a769](https://github.com/langchain-ai/deepagents/commit/f11a76962c9d536a38e27ac05b32feca364b2424))
|
|
19
|
+
|
|
20
|
+
## [0.1.23](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.22...deepagents-code==0.1.23) (2026-06-25)
|
|
21
|
+
|
|
22
|
+
### Features
|
|
23
|
+
|
|
24
|
+
* Collect Tavily key during onboarding ([#4233](https://github.com/langchain-ai/deepagents/issues/4233)) ([e321cba](https://github.com/langchain-ai/deepagents/commit/e321cba5701313e974f979069186680f1a39587c))
|
|
25
|
+
* Surface `/auth` in `/trace not-configured` hint ([#4206](https://github.com/langchain-ai/deepagents/issues/4206)) ([392e410](https://github.com/langchain-ai/deepagents/commit/392e410e48639a56fda5e35b6f7f85a5215cce9c))
|
|
26
|
+
* Add Opus 4.8 to recommended models ([#4204](https://github.com/langchain-ai/deepagents/issues/4204)) ([8faf2b0](https://github.com/langchain-ai/deepagents/commit/8faf2b025f8429481a41a3e65544d26614e53589))
|
|
27
|
+
|
|
28
|
+
### Bug Fixes
|
|
29
|
+
|
|
30
|
+
* `--reinstall` on `/install` so upgrades rebuild a clean env ([#4196](https://github.com/langchain-ai/deepagents/issues/4196)) ([5e152ac](https://github.com/langchain-ai/deepagents/commit/5e152ac0256d64376f96b293f8844bc8acc993ec))
|
|
31
|
+
* Suppress auto-update migration notice on fresh installs ([#4224](https://github.com/langchain-ai/deepagents/issues/4224)) ([eb8ff80](https://github.com/langchain-ai/deepagents/commit/eb8ff809a1b3130a261083c66a193e532095c6db))
|
|
32
|
+
* Bake release commit into `dcode doctor` ([#4225](https://github.com/langchain-ai/deepagents/issues/4225)) ([6dc0246](https://github.com/langchain-ai/deepagents/commit/6dc0246f5c6e9170e05191e1c82fad6975ac945c))
|
|
33
|
+
* Drop redundant version from "already up to date" message ([#4223](https://github.com/langchain-ai/deepagents/issues/4223)) ([5d080df](https://github.com/langchain-ai/deepagents/commit/5d080df2776d380214bf20ae31266b9628e4e5b0))
|
|
34
|
+
* Note subscription plans unusable for Anthropic in `/auth` ([#4207](https://github.com/langchain-ai/deepagents/issues/4207)) ([28cd19d](https://github.com/langchain-ai/deepagents/commit/28cd19db08bacf981ab2c91195638e66072816fe))
|
|
35
|
+
|
|
5
36
|
## [0.1.22](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.21...deepagents-code==0.1.22) (2026-06-24)
|
|
6
37
|
|
|
7
38
|
### Features
|
|
@@ -108,7 +108,7 @@ check: lint check_imports test
|
|
|
108
108
|
uv lock --check
|
|
109
109
|
@echo "🔗 Checking SDK pin against workspace SDK (advisory)..."
|
|
110
110
|
@uv run --all-groups python "$(REPO_ROOT)/.github/scripts/check_sdk_pin.py" || \
|
|
111
|
-
{ rc=$$?; [ $$rc -eq 1 ] && echo "⚠️ SDK pin
|
|
111
|
+
{ rc=$$?; [ $$rc -eq 1 ] && echo "⚠️ Stale SDK pin (advisory, non-fatal)." || exit $$rc; }
|
|
112
112
|
@echo "✅ All local CI checks passed!"
|
|
113
113
|
|
|
114
114
|
######################
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.24
|
|
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/
|
|
@@ -27,12 +27,13 @@ Classifier: Topic :: Terminals
|
|
|
27
27
|
Requires-Python: <4.0,>=3.11
|
|
28
28
|
Requires-Dist: aiosqlite<1.0.0,>=0.22.1
|
|
29
29
|
Requires-Dist: deepagents-acp<1.0.0,>=0.0.8
|
|
30
|
-
Requires-Dist: deepagents==0.
|
|
30
|
+
Requires-Dist: deepagents==0.7.0a2
|
|
31
31
|
Requires-Dist: httpx<1.0.0,>=0.28.1
|
|
32
32
|
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.7
|
|
33
33
|
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.5
|
|
34
34
|
Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.0
|
|
35
35
|
Requires-Dist: langchain-openai<2.0.0,>=1.3.3
|
|
36
|
+
Requires-Dist: langchain-quickjs<0.4.0,>=0.3.2
|
|
36
37
|
Requires-Dist: langchain<2.0.0,>=1.3.11
|
|
37
38
|
Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
|
|
38
39
|
Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.30
|
|
@@ -123,7 +124,6 @@ Requires-Dist: langchain-openrouter<2.0.0,>=0.2.4; extra == 'openrouter'
|
|
|
123
124
|
Provides-Extra: perplexity
|
|
124
125
|
Requires-Dist: langchain-perplexity<2.0.0,>=1.4.0; extra == 'perplexity'
|
|
125
126
|
Provides-Extra: quickjs
|
|
126
|
-
Requires-Dist: langchain-quickjs<0.4.0,>=0.3.1; extra == 'quickjs'
|
|
127
127
|
Provides-Extra: runloop
|
|
128
128
|
Requires-Dist: langchain-runloop>=0.0.6; extra == 'runloop'
|
|
129
129
|
Provides-Extra: together
|
|
@@ -411,10 +411,10 @@
|
|
|
411
411
|
|
|
412
412
|
#### T11: Auto-Installed ripgrep Binary from Upstream Release
|
|
413
413
|
|
|
414
|
-
- **Flow**:
|
|
415
|
-
- **Description**:
|
|
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.
|
|
414
|
+
- **Flow**: Download performed by `managed_tools.ensure_ripgrep` when `rg` is not on `PATH` — either on first run, or eagerly at install time via `dcode tools install` (invoked by `scripts/install.sh`).
|
|
415
|
+
- **Description**: 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", ...])`). The same verified path backs the `dcode tools install` verb, so the install script reuses it rather than re-encoding the version + checksum table in bash.
|
|
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, or `DEEPAGENTS_CODE_RIPGREP_INSTALLER=system` to defer to the OS package manager instead of the managed binary. (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. (6) The eager install-script path is non-`sudo` (no system package manager is invoked in the default `managed` mode).
|
|
417
|
+
- **Preconditions**: User has not installed `rg` via their package manager, `DEEPAGENTS_CODE_OFFLINE` is unset, `DEEPAGENTS_CODE_RIPGREP_INSTALLER` is not `system`, 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
418
|
|
|
419
419
|
---
|
|
420
420
|
|
|
@@ -39,6 +39,8 @@ class CLIContextSchema:
|
|
|
39
39
|
|
|
40
40
|
auto_approve: bool = False
|
|
41
41
|
|
|
42
|
+
approval_mode_key: str | None = None
|
|
43
|
+
|
|
42
44
|
|
|
43
45
|
class CLIContext(TypedDict, total=False):
|
|
44
46
|
"""Client-facing builder for the per-run graph context payload.
|
|
@@ -76,3 +78,12 @@ class CLIContext(TypedDict, total=False):
|
|
|
76
78
|
this to suppress interrupts at the source when "approve always" is on,
|
|
77
79
|
avoiding the interrupt-then-auto-resolve round-trip.
|
|
78
80
|
"""
|
|
81
|
+
|
|
82
|
+
approval_mode_key: str | None
|
|
83
|
+
"""Store key for the live approval-mode control record.
|
|
84
|
+
|
|
85
|
+
The TUI updates this record when the user toggles approval mode mid-run.
|
|
86
|
+
The server-side interrupt predicate reads it from the LangGraph Store on
|
|
87
|
+
each gated tool call so auto-to-manual changes can take effect before the
|
|
88
|
+
current stream returns.
|
|
89
|
+
"""
|
|
@@ -158,6 +158,15 @@ and `/api/show`. See `_ollama_discovery_enabled` for accepted truthy/falsy
|
|
|
158
158
|
values.
|
|
159
159
|
"""
|
|
160
160
|
|
|
161
|
+
ONBOARDING_INTEGRATIONS_SCREEN = "DEEPAGENTS_CODE_ONBOARDING_INTEGRATIONS_SCREEN"
|
|
162
|
+
"""Show the "Installed Integrations" summary screen during first-run onboarding.
|
|
163
|
+
|
|
164
|
+
Off by default: onboarding goes straight from the name prompt to the model
|
|
165
|
+
selector, which already surfaces (and installs) uninstalled model providers.
|
|
166
|
+
Set to a truthy value to bring the standalone integrations screen back into the
|
|
167
|
+
flow. Parsed by `is_env_truthy`: accepts `1`, `true`, `yes`, `on` as enabled.
|
|
168
|
+
"""
|
|
169
|
+
|
|
161
170
|
RESTARTED_AFTER_UPDATE = "DEEPAGENTS_CODE_RESTARTED_AFTER_UPDATE"
|
|
162
171
|
"""Internal sentinel recording the target version immediately before the
|
|
163
172
|
startup auto-update re-execs the process.
|
|
@@ -168,6 +177,16 @@ version), skips auto-updating to break out of an otherwise endless
|
|
|
168
177
|
upgrade/restart loop. Set and read internally across `os.execv`.
|
|
169
178
|
"""
|
|
170
179
|
|
|
180
|
+
RIPGREP_INSTALLER = "DEEPAGENTS_CODE_RIPGREP_INSTALLER"
|
|
181
|
+
"""Select how ripgrep is provisioned: `managed` (default) or `system`.
|
|
182
|
+
|
|
183
|
+
`managed` downloads the pinned, SHA-256-verified upstream binary into
|
|
184
|
+
`~/.deepagents/bin` (no sudo). `system` skips that download so power users can
|
|
185
|
+
rely on their distro package / existing toolchain instead; the install script's
|
|
186
|
+
`system` mode keeps the brew/apt/cargo path. A system `rg` already on `PATH` is
|
|
187
|
+
reused under either setting. Unrecognized values fall back to `managed`. See
|
|
188
|
+
`managed_tools.ripgrep_installer`."""
|
|
189
|
+
|
|
171
190
|
SERVER_ENV_PREFIX = "DEEPAGENTS_CODE_SERVER_"
|
|
172
191
|
"""Environment variable prefix used to pass CLI config to the server subprocess."""
|
|
173
192
|
|
|
@@ -101,6 +101,67 @@ def _read_env_optional_bool(suffix: str) -> bool | None:
|
|
|
101
101
|
return raw.lower() == "true"
|
|
102
102
|
|
|
103
103
|
|
|
104
|
+
def _resolve_enable_interpreter(
|
|
105
|
+
enable_interpreter: bool | None, sandbox_type: str | None
|
|
106
|
+
) -> bool:
|
|
107
|
+
"""Resolve the interpreter's tri-state caller option to a concrete boolean.
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
enable_interpreter: Explicit caller preference, or `None` to use the
|
|
111
|
+
sandbox-aware default.
|
|
112
|
+
sandbox_type: Sandbox backend identifier. Any falsy value (`None`, `""`)
|
|
113
|
+
or `"none"` is treated as local execution.
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
The explicit `enable_interpreter` value when not `None`; `False` for
|
|
117
|
+
remote-sandbox defaults; otherwise the configured local default
|
|
118
|
+
(`settings.enable_interpreter`).
|
|
119
|
+
"""
|
|
120
|
+
if enable_interpreter is not None:
|
|
121
|
+
return enable_interpreter
|
|
122
|
+
if sandbox_type and sandbox_type != "none":
|
|
123
|
+
return False
|
|
124
|
+
|
|
125
|
+
from deepagents_code.config import settings
|
|
126
|
+
|
|
127
|
+
return settings.enable_interpreter
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def _interpreter_suppressed_by_sandbox(
|
|
131
|
+
*, enable_interpreter: bool | None, sandbox_type: str | None, local_default: bool
|
|
132
|
+
) -> bool:
|
|
133
|
+
"""Whether a remote sandbox suppressed the otherwise-default interpreter.
|
|
134
|
+
|
|
135
|
+
Used to decide whether to surface an advisory: returns `True` only when the
|
|
136
|
+
user made no explicit choice, a remote sandbox is active, and the local
|
|
137
|
+
default would have enabled it — i.e. the sandbox (not an explicit
|
|
138
|
+
`--no-interpreter` opt-out, nor a disabled `[interpreter]` config) is why
|
|
139
|
+
`js_eval` is unavailable.
|
|
140
|
+
|
|
141
|
+
Takes the *raw* tri-state caller intent rather than the resolved boolean: a
|
|
142
|
+
sandbox-suppressed default and an explicit `--no-interpreter` both resolve to
|
|
143
|
+
`False`, so the resolved value cannot distinguish them. Any explicit choice
|
|
144
|
+
(`not None`) is the user's own decision and is left unannounced.
|
|
145
|
+
|
|
146
|
+
Args:
|
|
147
|
+
enable_interpreter: The raw tri-state caller intent (`--interpreter` →
|
|
148
|
+
`True`, `--no-interpreter` → `False`, unset → `None`).
|
|
149
|
+
sandbox_type: Sandbox backend identifier. Any falsy value (`None`, `""`)
|
|
150
|
+
or `"none"` is treated as local execution.
|
|
151
|
+
local_default: The local-mode default (`settings.enable_interpreter`);
|
|
152
|
+
gating on it keeps the advisory quiet for users who disabled the
|
|
153
|
+
interpreter in config.
|
|
154
|
+
|
|
155
|
+
Returns:
|
|
156
|
+
`True` when the advisory should be shown, otherwise `False`.
|
|
157
|
+
"""
|
|
158
|
+
if enable_interpreter is not None:
|
|
159
|
+
return False
|
|
160
|
+
if not (sandbox_type and sandbox_type != "none"):
|
|
161
|
+
return False
|
|
162
|
+
return local_default
|
|
163
|
+
|
|
164
|
+
|
|
104
165
|
@dataclass(frozen=True)
|
|
105
166
|
class ServerConfig:
|
|
106
167
|
"""Full configuration payload passed from the app to the server subprocess.
|
|
@@ -155,6 +216,13 @@ class ServerConfig:
|
|
|
155
216
|
enable_interpreter: bool = False
|
|
156
217
|
"""Enable `CodeInterpreterMiddleware` (`js_eval` REPL) on the main agent.
|
|
157
218
|
|
|
219
|
+
Always the resolved concrete value: `from_cli_args` collapses the tri-state
|
|
220
|
+
caller option via `_resolve_enable_interpreter` before constructing the
|
|
221
|
+
config, so the `bool | None` "defer to default" sentinel never reaches this
|
|
222
|
+
field. The `False` default here is only the bare-constructor/`from_env`
|
|
223
|
+
fallback; the user-facing default (on in local mode) lives in
|
|
224
|
+
`settings.enable_interpreter`.
|
|
225
|
+
|
|
158
226
|
Local-mode only; the server graph raises if a sandbox is configured and
|
|
159
227
|
this flag is `True`.
|
|
160
228
|
"""
|
|
@@ -341,7 +409,7 @@ class ServerConfig:
|
|
|
341
409
|
sandbox_setup: str | None,
|
|
342
410
|
enable_shell: bool,
|
|
343
411
|
enable_ask_user: bool,
|
|
344
|
-
enable_interpreter: bool =
|
|
412
|
+
enable_interpreter: bool | None = None,
|
|
345
413
|
interpreter_ptc: str | list[str] | None = None,
|
|
346
414
|
interpreter_ptc_acknowledge_unsafe: bool = False,
|
|
347
415
|
mcp_config_path: str | None,
|
|
@@ -373,7 +441,7 @@ class ServerConfig:
|
|
|
373
441
|
enable_shell: Enable shell execution tools.
|
|
374
442
|
enable_ask_user: Enable ask_user tool.
|
|
375
443
|
enable_interpreter: Enable `CodeInterpreterMiddleware` on the main
|
|
376
|
-
agent.
|
|
444
|
+
agent. `None` uses the sandbox-aware default.
|
|
377
445
|
interpreter_ptc: Override for `settings.interpreter_ptc`.
|
|
378
446
|
interpreter_ptc_acknowledge_unsafe: Mirror of
|
|
379
447
|
`settings.interpreter_ptc_acknowledge_unsafe`.
|
|
@@ -387,6 +455,10 @@ class ServerConfig:
|
|
|
387
455
|
"""
|
|
388
456
|
normalized_mcp = _normalize_path(mcp_config_path, project_context, "MCP config")
|
|
389
457
|
|
|
458
|
+
resolved_enable_interpreter = _resolve_enable_interpreter(
|
|
459
|
+
enable_interpreter, sandbox_type
|
|
460
|
+
)
|
|
461
|
+
|
|
390
462
|
return cls(
|
|
391
463
|
model=model_name,
|
|
392
464
|
model_params=model_params,
|
|
@@ -397,7 +469,7 @@ class ServerConfig:
|
|
|
397
469
|
interactive=interactive,
|
|
398
470
|
enable_shell=enable_shell,
|
|
399
471
|
enable_ask_user=enable_ask_user,
|
|
400
|
-
enable_interpreter=
|
|
472
|
+
enable_interpreter=resolved_enable_interpreter,
|
|
401
473
|
interpreter_ptc=interpreter_ptc,
|
|
402
474
|
interpreter_ptc_acknowledge_unsafe=interpreter_ptc_acknowledge_unsafe,
|
|
403
475
|
sandbox_type=sandbox_type,
|
|
@@ -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.24" # 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."""
|
|
@@ -67,7 +67,6 @@ from deepagents_code.config import (
|
|
|
67
67
|
settings,
|
|
68
68
|
)
|
|
69
69
|
from deepagents_code.configurable_model import ConfigurableModelMiddleware
|
|
70
|
-
from deepagents_code.filesystem_empty_result import _FilesystemEmptyResultMiddleware
|
|
71
70
|
from deepagents_code.integrations.sandbox_factory import get_default_working_dir
|
|
72
71
|
from deepagents_code.local_context import (
|
|
73
72
|
LocalContextMiddleware,
|
|
@@ -1031,6 +1030,38 @@ def _is_auto_approve_enabled(value: object) -> bool:
|
|
|
1031
1030
|
return isinstance(value, bool) and value
|
|
1032
1031
|
|
|
1033
1032
|
|
|
1033
|
+
def _read_live_auto_approve(store: object, key: str | None) -> bool | None:
|
|
1034
|
+
"""Return live approval mode from the LangGraph Store when configured.
|
|
1035
|
+
|
|
1036
|
+
Args:
|
|
1037
|
+
store: `request.runtime.store` from the graph server.
|
|
1038
|
+
key: Live approval-mode store key, or `None` when this run has no live
|
|
1039
|
+
control record.
|
|
1040
|
+
|
|
1041
|
+
Returns:
|
|
1042
|
+
`None` when no live key is configured for this run — the caller should
|
|
1043
|
+
fall back to the static `auto_approve` context snapshot.
|
|
1044
|
+
`True` or `False` when a live key is configured: these reflect
|
|
1045
|
+
the stored mode, and `False` is also returned when the key
|
|
1046
|
+
is configured but the store is unreadable (missing item,
|
|
1047
|
+
malformed value, read error), so an unreadable live mode fails
|
|
1048
|
+
closed and interrupts.
|
|
1049
|
+
`None` therefore means "feature not in play," the opposite of the store
|
|
1050
|
+
reader's `None` ("unreadable, be careful").
|
|
1051
|
+
"""
|
|
1052
|
+
if not key:
|
|
1053
|
+
return None
|
|
1054
|
+
from deepagents_code.approval_mode import read_approval_mode_from_store
|
|
1055
|
+
|
|
1056
|
+
value = read_approval_mode_from_store(store, key)
|
|
1057
|
+
if value is None:
|
|
1058
|
+
logger.warning(
|
|
1059
|
+
"Approval-mode store item is unavailable; interrupting for safety"
|
|
1060
|
+
)
|
|
1061
|
+
return False
|
|
1062
|
+
return value
|
|
1063
|
+
|
|
1064
|
+
|
|
1034
1065
|
def _should_interrupt_tool_call(request: ToolCallRequest) -> bool:
|
|
1035
1066
|
"""Decide whether a gated tool call should pause for human approval.
|
|
1036
1067
|
|
|
@@ -1053,9 +1084,16 @@ def _should_interrupt_tool_call(request: ToolCallRequest) -> bool:
|
|
|
1053
1084
|
"""
|
|
1054
1085
|
runtime = getattr(request, "runtime", None)
|
|
1055
1086
|
ctx = getattr(runtime, "context", None)
|
|
1087
|
+
store = getattr(runtime, "store", None)
|
|
1056
1088
|
if isinstance(ctx, CLIContextSchema):
|
|
1089
|
+
if (live := _read_live_auto_approve(store, ctx.approval_mode_key)) is not None:
|
|
1090
|
+
return not live
|
|
1057
1091
|
return not _is_auto_approve_enabled(ctx.auto_approve)
|
|
1058
1092
|
if isinstance(ctx, dict):
|
|
1093
|
+
raw_key = ctx.get("approval_mode_key")
|
|
1094
|
+
key = raw_key if isinstance(raw_key, str) else None
|
|
1095
|
+
if (live := _read_live_auto_approve(store, key)) is not None:
|
|
1096
|
+
return not live
|
|
1059
1097
|
# Type-checked (not truthiness) check: over the JSON/RemoteGraph boundary a
|
|
1060
1098
|
# malformed payload (e.g. "yes", 1) must fail closed and interrupt, not
|
|
1061
1099
|
# silently auto-approve. Only a genuine boolean `True` suppresses.
|
|
@@ -1268,8 +1306,7 @@ def create_cli_agent(
|
|
|
1268
1306
|
list or `interpreter_ptc="all"` with
|
|
1269
1307
|
`interpreter_ptc_acknowledge_unsafe=True`.
|
|
1270
1308
|
|
|
1271
|
-
Requires the `quickjs`
|
|
1272
|
-
(`langchain-quickjs>=0.3.1,<0.4.0`).
|
|
1309
|
+
Requires the core `langchain-quickjs` dependency.
|
|
1273
1310
|
checkpointer: Optional checkpointer for session persistence.
|
|
1274
1311
|
When `None`, the graph is compiled without a checkpointer.
|
|
1275
1312
|
mcp_server_info: MCP server metadata to surface in the system prompt.
|
|
@@ -1420,7 +1457,6 @@ def create_cli_agent(
|
|
|
1420
1457
|
# Build middleware stack based on enabled features
|
|
1421
1458
|
agent_middleware: list[AgentMiddleware[Any, Any]] = [
|
|
1422
1459
|
ConfigurableModelMiddleware(),
|
|
1423
|
-
_FilesystemEmptyResultMiddleware(),
|
|
1424
1460
|
]
|
|
1425
1461
|
|
|
1426
1462
|
# Resume state: declares the `_context_tokens` and `_model_spec` channels
|