deepagents-code 0.1.2__tar.gz → 0.1.4__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.2 → deepagents_code-0.1.4}/.gitignore +2 -0
- deepagents_code-0.1.4/AGENTS.md +95 -0
- deepagents_code-0.1.4/CHANGELOG.md +62 -0
- deepagents_code-0.1.4/COMMANDS.md +44 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/Makefile +8 -1
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/PKG-INFO +6 -11
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/README.md +0 -7
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/__init__.py +1 -1
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_server_config.py +55 -0
- deepagents_code-0.1.4/deepagents_code/_startup_error.py +45 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/agent.py +178 -4
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/app.py +1225 -176
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/command_registry.py +15 -6
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/config.py +345 -17
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/extras_info.py +39 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/integrations/sandbox_factory.py +28 -5
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/main.py +126 -8
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/mcp_auth.py +321 -90
- deepagents_code-0.1.4/deepagents_code/mcp_commands.py +246 -0
- deepagents_code-0.1.4/deepagents_code/mcp_disabled.py +182 -0
- deepagents_code-0.1.4/deepagents_code/mcp_login_service.py +281 -0
- deepagents_code-0.1.4/deepagents_code/mcp_oauth_ui.py +199 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/mcp_providers/base.py +20 -2
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/mcp_providers/github.py +14 -3
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/mcp_providers/slack.py +63 -33
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/mcp_tools.py +56 -19
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/model_config.py +24 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/non_interactive.py +16 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/server_graph.py +21 -8
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/server_manager.py +30 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/sessions.py +104 -7
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/textual_adapter.py +52 -80
- deepagents_code-0.1.4/deepagents_code/token_state.py +88 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/tool_display.py +8 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/ui.py +37 -6
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/chat_input.py +80 -59
- deepagents_code-0.1.4/deepagents_code/widgets/mcp_login.py +433 -0
- deepagents_code-0.1.4/deepagents_code/widgets/mcp_reconnect.py +208 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/mcp_viewer.py +463 -45
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/messages.py +7 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/welcome.py +65 -7
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/pyproject.toml +15 -3
- deepagents_code-0.1.4/scripts/generate_commands_catalog.py +133 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/scripts/install.sh +30 -19
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_agent.py +351 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_app.py +1668 -16
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_args.py +194 -11
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_chat_input.py +221 -77
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_command_registry.py +50 -2
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_config.py +76 -2
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_extras_info.py +36 -8
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_mcp_auth.py +500 -36
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_mcp_commands.py +15 -3
- deepagents_code-0.1.4/tests/unit_tests/test_mcp_disabled.py +125 -0
- deepagents_code-0.1.4/tests/unit_tests/test_mcp_login_modal.py +266 -0
- deepagents_code-0.1.4/tests/unit_tests/test_mcp_login_service.py +291 -0
- deepagents_code-0.1.4/tests/unit_tests/test_mcp_oauth_ui.py +422 -0
- deepagents_code-0.1.4/tests/unit_tests/test_mcp_reconnect.py +130 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_mcp_tools.py +112 -3
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_mcp_viewer.py +648 -7
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_non_interactive.py +45 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_offload.py +9 -6
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_sandbox_factory.py +80 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_server_config.py +27 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_server_graph.py +58 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_server_manager.py +1 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_sessions.py +254 -8
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_textual_adapter.py +200 -3
- deepagents_code-0.1.4/tests/unit_tests/test_token_tracker.py +217 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_welcome.py +20 -2
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/uv.lock +83 -13
- deepagents_code-0.1.2/CHANGELOG.md +0 -32
- deepagents_code-0.1.2/deepagents_code/mcp_commands.py +0 -204
- deepagents_code-0.1.2/deepagents_code/token_state.py +0 -31
- deepagents_code-0.1.2/tests/unit_tests/test_token_tracker.py +0 -150
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/DEV.md +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/THREAT_MODEL.md +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_env_vars.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/configurable_model.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/hooks.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/mcp_trust.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/offload.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/remote_client.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/server.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/system_prompt.md +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/update_check.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/__init__.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/_links.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/approval.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/ask_user.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/auth.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/diff.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/history.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/loading.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/message_store.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/model_selector.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/status.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/thread_selector.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/update_available.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/images/tui.png +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/README.md +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/conftest.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_agent_selector.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_approval.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_ask_user.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_auth_widgets.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_autocomplete.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_history.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_launch_init.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_links.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_loading.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_main.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_mcp_trust.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_message_store.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_messages.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_model_config.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_model_selector.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_notification_center.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_notification_detail.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_offload_dict_messages.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_server.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_status.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_thread_selector.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_update_available.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_update_progress.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/tools/test_fetch_url.py +0 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# `libs/code` agent guide
|
|
2
|
+
|
|
3
|
+
`deepagents-code` is the interactive coding agent — the Textual REPL, headless `-x` mode, MCP integration, skills, sandbox bootstrap, and slash-command surface. Forked from `deepagents-cli` at the 0.1.0 split.
|
|
4
|
+
|
|
5
|
+
For monorepo-wide conventions (commit titles, lint, testing, docs, CI, benchmarks), see the root `AGENTS.md`.
|
|
6
|
+
|
|
7
|
+
## Textual (terminal UI framework)
|
|
8
|
+
|
|
9
|
+
`deepagents-code` uses [Textual](https://textual.textualize.io/).
|
|
10
|
+
|
|
11
|
+
**Key Textual resources:**
|
|
12
|
+
|
|
13
|
+
- **Guide:** https://textual.textualize.io/guide/
|
|
14
|
+
- **Widget gallery:** https://textual.textualize.io/widget_gallery/
|
|
15
|
+
- **CSS reference:** https://textual.textualize.io/styles/
|
|
16
|
+
- **API reference:** https://textual.textualize.io/api/
|
|
17
|
+
|
|
18
|
+
### Styled text in widgets
|
|
19
|
+
|
|
20
|
+
Prefer Textual's `Content` (`textual.content`) over Rich's `Text` for widget rendering. `Content` is immutable (like `str`) and integrates natively with Textual's rendering pipeline. Rich `Text` is still correct for code that renders via Rich's `Console.print()` (e.g., `non_interactive.py`, `main.py`).
|
|
21
|
+
|
|
22
|
+
IMPORTANT: `Content` requires **Textual's** `Style` (`textual.style.Style`) for rendering, not Rich's `Style` (`rich.style.Style`). Mixing Rich `Style` objects into `Content` spans will cause `TypeError` during widget rendering. String styles (`"bold cyan"`, `"dim"`) work for non-link styling. For links, use `TStyle(link=url)`.
|
|
23
|
+
|
|
24
|
+
**Never use f-string interpolation in Rich markup** (e.g., `f"[bold]{var}[/bold]"`). If `var` contains square brackets, the markup breaks or throws. Use `Content` methods instead:
|
|
25
|
+
|
|
26
|
+
- `Content.from_markup("[bold]$var[/bold]", var=value)` — for inline markup templates. `$var` substitution auto-escapes dynamic content. **Use when the variable is external/user-controlled** (tool args, file paths, user messages, diff content, error messages from exceptions).
|
|
27
|
+
- `Content.styled(text, "bold")` — single style applied to plain text. No markup parsing. Use for static strings or when the variable is internal/trusted (glyphs, ints, enum-like status values). Avoid `Content.styled(f"..{var}..", style)` when `var` is user-controlled — while `styled` doesn't parse markup, the f-string pattern is fragile and inconsistent with the `from_markup` convention.
|
|
28
|
+
- `Content.assemble("prefix: ", (text, "bold"), " ", other_content)` — for composing pre-built `Content` objects, `(text, style)` tuples, and plain strings. Plain strings are treated as plain text (no markup parsing). Use for structural composition, especially when parts use `TStyle(link=url)`.
|
|
29
|
+
- `content.join(parts)` — like `str.join()` for `Content` objects.
|
|
30
|
+
|
|
31
|
+
**Decision rule:** if the value could ever come from outside the codebase (user input, tool output, API responses, file contents), use `from_markup` with `$var`. If it's a hardcoded string, glyph, or computed int, `styled` is fine.
|
|
32
|
+
|
|
33
|
+
### `App.notify()` defaults to `markup=True`
|
|
34
|
+
|
|
35
|
+
Textual's `App.notify(message)` parses the message string as Rich markup by default. Any dynamic content (exception messages, file paths, user input, command strings) containing brackets `[]`, ANSI escape codes, or `=` will cause a `MarkupError` crash in Textual's Toast renderer. Always pass `markup=False` when the message contains f-string interpolated variables. Hardcoded string literals are safe with the default.
|
|
36
|
+
|
|
37
|
+
### Rich `console.print()` and number highlighting
|
|
38
|
+
|
|
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
|
+
|
|
41
|
+
### Textual patterns used in this codebase
|
|
42
|
+
|
|
43
|
+
- **Workers** (`@work` decorator) for async operations - see [Workers guide](https://textual.textualize.io/guide/workers/)
|
|
44
|
+
- **Message passing** for widget communication - see [Events guide](https://textual.textualize.io/guide/events/)
|
|
45
|
+
- **Reactive attributes** for state management - see [Reactivity guide](https://textual.textualize.io/guide/reactivity/)
|
|
46
|
+
|
|
47
|
+
### Testing Textual apps
|
|
48
|
+
|
|
49
|
+
- Use `textual.pilot` for async UI testing - see [Testing guide](https://textual.textualize.io/guide/testing/)
|
|
50
|
+
- Snapshot testing available for visual regression - see repo `notes/snapshot_testing.md`
|
|
51
|
+
|
|
52
|
+
## SDK dependency pin
|
|
53
|
+
|
|
54
|
+
`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
|
+
|
|
56
|
+
## Startup performance
|
|
57
|
+
|
|
58
|
+
`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`.
|
|
59
|
+
|
|
60
|
+
- Keep top-level imports in `main.py` and other entry-point modules minimal.
|
|
61
|
+
- Defer heavy imports to the point where they are actually needed (inside functions/methods).
|
|
62
|
+
- To read another package's version without importing it, use `importlib.metadata.version("package-name")`.
|
|
63
|
+
- Feature-gate checks on the startup hot path (before background workers fire) must be lightweight — env var lookups, small file reads. Never pull in expensive modules just to decide whether to skip a feature.
|
|
64
|
+
- When adding logic that already exists elsewhere (e.g., editable-install detection), import the existing cached implementation rather than duplicating it.
|
|
65
|
+
- Features that run shell commands silently must be opt-in, never default-enabled. Gate behind an explicit env var or config key.
|
|
66
|
+
- Background workers that spawn subprocesses must set a timeout to avoid blocking indefinitely.
|
|
67
|
+
|
|
68
|
+
## CLI help screen
|
|
69
|
+
|
|
70
|
+
The `deepagents-code --help` screen is hand-maintained in `ui.show_help()`, separate from the argparse definitions in `main.parse_args()`. When adding a new CLI flag, update **both** files. A drift-detection test (`test_args.TestHelpScreenDrift`) fails if a flag is registered in argparse but missing from the help screen.
|
|
71
|
+
|
|
72
|
+
## Splash screen tips
|
|
73
|
+
|
|
74
|
+
When adding a user-facing CLI feature (new slash command, keybinding, workflow), add a corresponding tip to the `_TIPS` list in `deepagents_code/widgets/welcome.py`. Tips are shown randomly on startup to help users discover features. Keep tips short and action-oriented (e.g., `"Press ctrl+x to compose prompts in your external editor"`).
|
|
75
|
+
|
|
76
|
+
## Slash commands
|
|
77
|
+
|
|
78
|
+
Slash commands are defined as `SlashCommand` entries in the `COMMANDS` tuple in `deepagents_code/command_registry.py`. Each entry declares the command name, description, `bypass_tier` (queue-bypass classification), optional `hidden_keywords` for fuzzy matching, and optional `aliases`. Bypass-tier frozensets and the `SLASH_COMMANDS` autocomplete list are derived automatically — no other file should hard-code command metadata.
|
|
79
|
+
|
|
80
|
+
To add a new slash command: (1) add a `SlashCommand` entry to `COMMANDS`, (2) set the appropriate `bypass_tier`, (3) add a handler branch in `_handle_command` in `app.py`, (4) run `make lint && make test` — the drift test will catch any mismatch.
|
|
81
|
+
|
|
82
|
+
## Adding a new model provider
|
|
83
|
+
|
|
84
|
+
`deepagents-code` supports LangChain-based chat model providers as optional dependencies. To add a new provider, update these files (all entries alphabetically sorted):
|
|
85
|
+
|
|
86
|
+
1. `deepagents_code/model_config.py` — add `"provider_name": "ENV_VAR_NAME"` to `PROVIDER_API_KEY_ENV`
|
|
87
|
+
2. `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
|
|
88
|
+
3. `tests/unit_tests/test_model_config.py` — add `assert PROVIDER_API_KEY_ENV["provider_name"] == "ENV_VAR_NAME"` to `TestProviderApiKeyEnv.test_contains_major_providers`
|
|
89
|
+
|
|
90
|
+
**Not required** unless the provider's models have a distinctive name prefix (like `gpt-*`, `claude*`, `gemini*`):
|
|
91
|
+
|
|
92
|
+
- `detect_provider()` in `config.py` — only needed for auto-detection from bare model names
|
|
93
|
+
- `Settings.has_*` property in `config.py` — only needed if referenced by `detect_provider()` fallback logic
|
|
94
|
+
|
|
95
|
+
Model discovery, credential checking, and UI integration are automatic once `PROVIDER_API_KEY_ENV` is populated and the `langchain-*` package is installed.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Deep Agents Code Changelog
|
|
2
|
+
|
|
3
|
+
## [0.1.4](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.3...deepagents-code==0.1.4) (2026-05-23)
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
* Add `--sandbox-snapshot-name` flag ([#3538](https://github.com/langchain-ai/deepagents/issues/3538)) ([b01392e](https://github.com/langchain-ai/deepagents/commit/b01392e7549798434f27f3784fa8c4e734053787))
|
|
8
|
+
* `dcode mcp config` and unify `--mcp-config` flag ([#3541](https://github.com/langchain-ai/deepagents/issues/3541)) ([f037b14](https://github.com/langchain-ai/deepagents/commit/f037b140f90a1ba3725b3ef23ab385b3cafe223b))
|
|
9
|
+
* Interpreter middleware via `langchain-quickjs` ([#3525](https://github.com/langchain-ai/deepagents/issues/3525)) ([f0ca89c](https://github.com/langchain-ai/deepagents/commit/f0ca89c962c22058194121526638bc2d29f546bd))
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* Chat input history navigation and newline scrolling ([#3560](https://github.com/langchain-ai/deepagents/issues/3560)) ([3b51cbd](https://github.com/langchain-ai/deepagents/commit/3b51cbdc8c50d9990477e18a47de6a58e9165bab))
|
|
14
|
+
* Distinguish LangSmith failure modes in `/trace` ([#3558](https://github.com/langchain-ai/deepagents/issues/3558)) ([4d158a0](https://github.com/langchain-ai/deepagents/commit/4d158a031aecad8862e02e332f127573003938ec))
|
|
15
|
+
* Recover initial session prompts from writes table ([#3535](https://github.com/langchain-ai/deepagents/issues/3535)) ([46b6f3f](https://github.com/langchain-ai/deepagents/commit/46b6f3f3e6ce880cd5ec9cf59622bb745d6ac2eb))
|
|
16
|
+
* Install script binary checks reference `dcode` ([#3546](https://github.com/langchain-ai/deepagents/issues/3546)) ([f8977a6](https://github.com/langchain-ai/deepagents/commit/f8977a63769e3f2037619f32596cb9bb7bd1020b))
|
|
17
|
+
* Show tool call previews during batched HITL approvals ([#3530](https://github.com/langchain-ai/deepagents/issues/3530)) ([84daa1a](https://github.com/langchain-ai/deepagents/commit/84daa1a2e27963a6d7694dc9278de83782b4a7b7))
|
|
18
|
+
|
|
19
|
+
## [0.1.3](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.2...deepagents-code==0.1.3) (2026-05-20)
|
|
20
|
+
|
|
21
|
+
### Features
|
|
22
|
+
|
|
23
|
+
* In-TUI MCP OAuth login with auto-refresh ([#3469](https://github.com/langchain-ai/deepagents/issues/3469)) ([20e38b8](https://github.com/langchain-ai/deepagents/commit/20e38b8ebd8d9aa4697334432f7832a0a07aea3a))
|
|
24
|
+
* Float unauthorized MCP servers to top and prompt before reconnect ([#3493](https://github.com/langchain-ai/deepagents/issues/3493)) ([2d66580](https://github.com/langchain-ai/deepagents/commit/2d665804131961dfa7e2849248047deec818e4ef))
|
|
25
|
+
* Disable MCP servers from TUI ([#3501](https://github.com/langchain-ai/deepagents/issues/3501)) ([5725de8](https://github.com/langchain-ai/deepagents/commit/5725de857722dbca768a95bc6d97af5b838a11a9))
|
|
26
|
+
* `/restart` hidden slash command ([#3514](https://github.com/langchain-ai/deepagents/issues/3514)) ([74bdd36](https://github.com/langchain-ai/deepagents/commit/74bdd3688948d8369cdd978590f5a822eabeb12c))
|
|
27
|
+
|
|
28
|
+
### Bug Fixes
|
|
29
|
+
|
|
30
|
+
* Persist `_context_tokens` via `after_model` middleware ([#3496](https://github.com/langchain-ai/deepagents/issues/3496)) ([e2bb284](https://github.com/langchain-ai/deepagents/commit/e2bb284e506e0e49a05169fc6de01bdf42350267))
|
|
31
|
+
* Refresh status bar model after recovering from failed startup ([#3511](https://github.com/langchain-ai/deepagents/issues/3511)) ([c96f822](https://github.com/langchain-ai/deepagents/commit/c96f822de187431404d093b852c4a855d3ab8d30))
|
|
32
|
+
|
|
33
|
+
## [0.1.2](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.1...deepagents-code==0.1.2) (2026-05-19)
|
|
34
|
+
|
|
35
|
+
### Features
|
|
36
|
+
|
|
37
|
+
* `/model` toggle for recommended-only list ([#3453](https://github.com/langchain-ai/deepagents/issues/3453)) ([c326b7e](https://github.com/langchain-ai/deepagents/commit/c326b7ec1b9940861175e0466ab4221f03e2bcba))
|
|
38
|
+
* `--timeout` flag for non-interactive ([#3351](https://github.com/langchain-ai/deepagents/issues/3351)) ([44e86ab](https://github.com/langchain-ai/deepagents/commit/44e86abbb1870f689dace8b1be6ed430d65e74c1))
|
|
39
|
+
* Browser loopback OAuth callback for MCP auth ([#3467](https://github.com/langchain-ai/deepagents/issues/3467)) ([d83aa07](https://github.com/langchain-ai/deepagents/commit/d83aa07c818af35800f81d062a147fa45a47ace7))
|
|
40
|
+
* MCP screen metadata ([#3349](https://github.com/langchain-ai/deepagents/issues/3349)) ([ce2f07e](https://github.com/langchain-ai/deepagents/commit/ce2f07e7211f22b3f44a1a232088b89a469a0a99))
|
|
41
|
+
|
|
42
|
+
### Bug Fixes
|
|
43
|
+
|
|
44
|
+
* Drop sections from `system_prompt.md` already supplied by SDK middleware ([#3448](https://github.com/langchain-ai/deepagents/issues/3448)) ([9dbf2c2](https://github.com/langchain-ai/deepagents/commit/9dbf2c2f19e941e012d0c93418ef09fb56f30d6a))
|
|
45
|
+
* Rename stale usage commands ([#3460](https://github.com/langchain-ai/deepagents/issues/3460)) ([da43b7f](https://github.com/langchain-ai/deepagents/commit/da43b7f9d913e6190ff03c496a269faf08bbf182))
|
|
46
|
+
* Suppress interrupt-cleanup state writes from traces ([#3465](https://github.com/langchain-ai/deepagents/issues/3465)) ([319b24e](https://github.com/langchain-ai/deepagents/commit/319b24e6f179eaf56f105a6db683901c82fe95be))
|
|
47
|
+
|
|
48
|
+
## [0.1.1](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.0...deepagents-code==0.1.1) (2026-05-16)
|
|
49
|
+
|
|
50
|
+
### Bug Fixes
|
|
51
|
+
|
|
52
|
+
* Correct LangSmith sandbox working directory ([#3415](https://github.com/langchain-ai/deepagents/issues/3415)) ([b0e8d83](https://github.com/langchain-ai/deepagents/commit/b0e8d83f97a2a698268173a839000c84e8368324))
|
|
53
|
+
* Guard `fetch_url` against SSRF ([#3411](https://github.com/langchain-ai/deepagents/issues/3411)) ([54d8521](https://github.com/langchain-ai/deepagents/commit/54d8521976940dfe147ead4b56565360241335be))
|
|
54
|
+
|
|
55
|
+
## [0.1.0](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.0.1...deepagents-code==0.1.0) (2026-05-12)
|
|
56
|
+
|
|
57
|
+
Hello world! Ported from `libs/cli`.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
`deepagents-code` was forked from `deepagents-cli` at v0.1.0 (2026-05-12).
|
|
62
|
+
For history prior to the fork, see [the `deepagents-cli` changelog](https://github.com/langchain-ai/deepagents/blob/main/libs/cli/CHANGELOG.md).
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<!-- AUTO-GENERATED by scripts/generate_commands_catalog.py — do not edit manually. -->
|
|
2
|
+
# Slash command catalog
|
|
3
|
+
|
|
4
|
+
Canonical list of slash commands for `deepagents-code`, derived from
|
|
5
|
+
`deepagents_code/command_registry.py`. Run `make commands-catalog` to
|
|
6
|
+
regenerate after editing the registry.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
## Public (25)
|
|
10
|
+
|
|
11
|
+
| Command | Aliases | Description |
|
|
12
|
+
| --- | --- | --- |
|
|
13
|
+
| `/agents` | | Browse and switch between available agents |
|
|
14
|
+
| `/auth` | `/connect` | Manage stored API keys for model providers |
|
|
15
|
+
| `/auto-update` | | Toggle automatic updates on or off |
|
|
16
|
+
| `/changelog` | | Open changelog in browser |
|
|
17
|
+
| `/clear` | | Clear chat and start new thread |
|
|
18
|
+
| `/copy` | | Copy latest assistant message to clipboard |
|
|
19
|
+
| `/docs` | | Open documentation in browser |
|
|
20
|
+
| `/editor` | | Open prompt in external editor ($EDITOR) |
|
|
21
|
+
| `/feedback` | | Submit a bug report or feature request |
|
|
22
|
+
| `/force-clear` | | Interrupt active work, clear chat, and start new thread |
|
|
23
|
+
| `/help` | | Show help |
|
|
24
|
+
| `/mcp` | | Show MCP servers; `/mcp login <server>` to authenticate, `/mcp reconnect` to load deferred logins, F2 in the viewer to disable/enable a server |
|
|
25
|
+
| `/model` | | Switch or configure model (--model-params, --default) |
|
|
26
|
+
| `/notifications` | | Configure startup warning preferences |
|
|
27
|
+
| `/offload` | `/compact` | Free up context window space by offloading older messages |
|
|
28
|
+
| `/quit` | `/q` | Exit app |
|
|
29
|
+
| `/reload` | | Reload config from environment variables and .env |
|
|
30
|
+
| `/remember` | | Update memory and skills from conversation |
|
|
31
|
+
| `/skill-creator` | | Guide for creating effective agent skills |
|
|
32
|
+
| `/theme` | | Switch color theme |
|
|
33
|
+
| `/threads` | | Browse and resume previous threads |
|
|
34
|
+
| `/tokens` | | Token usage |
|
|
35
|
+
| `/trace` | | Open current thread in LangSmith |
|
|
36
|
+
| `/update` | | Check for and install updates |
|
|
37
|
+
| `/version` | `/about` | Show version |
|
|
38
|
+
|
|
39
|
+
## Hidden (2)
|
|
40
|
+
|
|
41
|
+
Hidden commands not exposed in autocomplete or help. See the `HIDDEN_COMMANDS` docstring in the registry for context.
|
|
42
|
+
|
|
43
|
+
- `/debug-error`
|
|
44
|
+
- `/restart`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
.PHONY: format lint type typecheck test tests integration_test integration_tests test_watch benchmark bench bench-memory help run lint_package lint_tests check_imports coverage
|
|
1
|
+
.PHONY: format lint type typecheck test tests integration_test integration_tests test_watch benchmark bench bench-memory help run lint_package lint_tests check_imports coverage commands-catalog commands-catalog-check
|
|
2
2
|
|
|
3
3
|
.DEFAULT_GOAL := help
|
|
4
4
|
|
|
@@ -66,6 +66,7 @@ lint lint_diff lint_package lint_tests:
|
|
|
66
66
|
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check $(PYTHON_FILES)
|
|
67
67
|
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES) --diff
|
|
68
68
|
$(MAKE) type PYTHON_FILES="$(PYTHON_FILES)"
|
|
69
|
+
uv run --all-groups python scripts/generate_commands_catalog.py --check
|
|
69
70
|
|
|
70
71
|
type: ## Run type checker
|
|
71
72
|
type typecheck:
|
|
@@ -80,6 +81,12 @@ check_imports: ## Check imports
|
|
|
80
81
|
check_imports: $(shell find deepagents_code -name '*.py')
|
|
81
82
|
uv run --all-groups python ./scripts/check_imports.py $^
|
|
82
83
|
|
|
84
|
+
commands-catalog: ## Regenerate COMMANDS.md from the slash-command registry
|
|
85
|
+
uv run --all-groups python scripts/generate_commands_catalog.py
|
|
86
|
+
|
|
87
|
+
commands-catalog-check: ## Verify COMMANDS.md matches the slash-command registry
|
|
88
|
+
uv run --all-groups python scripts/generate_commands_catalog.py --check
|
|
89
|
+
|
|
83
90
|
######################
|
|
84
91
|
# HELP
|
|
85
92
|
######################
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.4
|
|
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,7 +27,7 @@ Classifier: Topic :: Terminals
|
|
|
27
27
|
Requires-Python: <4.0,>=3.11
|
|
28
28
|
Requires-Dist: aiosqlite<1.0.0,>=0.19.0
|
|
29
29
|
Requires-Dist: deepagents-acp>=0.0.4
|
|
30
|
-
Requires-Dist: deepagents==0.6.
|
|
30
|
+
Requires-Dist: deepagents==0.6.3
|
|
31
31
|
Requires-Dist: httpx<1.0.0,>=0.28.1
|
|
32
32
|
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.3
|
|
33
33
|
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.2
|
|
@@ -69,7 +69,7 @@ Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.3; extra == 'all-providers'
|
|
|
69
69
|
Requires-Dist: langchain-groq<2.0.0,>=1.1.2; extra == 'all-providers'
|
|
70
70
|
Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'all-providers'
|
|
71
71
|
Requires-Dist: langchain-ibm<2.0.0,>=1.0.7; extra == 'all-providers'
|
|
72
|
-
Requires-Dist: langchain-litellm<2.0.0,>=0.6.
|
|
72
|
+
Requires-Dist: langchain-litellm<2.0.0,>=0.6.6; extra == 'all-providers'
|
|
73
73
|
Requires-Dist: langchain-mistralai<2.0.0,>=1.1.4; extra == 'all-providers'
|
|
74
74
|
Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.2.1; extra == 'all-providers'
|
|
75
75
|
Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
@@ -106,7 +106,7 @@ Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'huggingface'
|
|
|
106
106
|
Provides-Extra: ibm
|
|
107
107
|
Requires-Dist: langchain-ibm<2.0.0,>=1.0.7; extra == 'ibm'
|
|
108
108
|
Provides-Extra: litellm
|
|
109
|
-
Requires-Dist: langchain-litellm<2.0.0,>=0.6.
|
|
109
|
+
Requires-Dist: langchain-litellm<2.0.0,>=0.6.6; extra == 'litellm'
|
|
110
110
|
Provides-Extra: mistralai
|
|
111
111
|
Requires-Dist: langchain-mistralai<2.0.0,>=1.1.4; extra == 'mistralai'
|
|
112
112
|
Provides-Extra: modal
|
|
@@ -121,6 +121,8 @@ Provides-Extra: openrouter
|
|
|
121
121
|
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.3; extra == 'openrouter'
|
|
122
122
|
Provides-Extra: perplexity
|
|
123
123
|
Requires-Dist: langchain-perplexity<2.0.0,>=1.2.0; extra == 'perplexity'
|
|
124
|
+
Provides-Extra: quickjs
|
|
125
|
+
Requires-Dist: langchain-quickjs<0.2.0,>=0.1.2; extra == 'quickjs'
|
|
124
126
|
Provides-Extra: runloop
|
|
125
127
|
Requires-Dist: langchain-runloop>=0.0.4; extra == 'runloop'
|
|
126
128
|
Provides-Extra: together
|
|
@@ -154,13 +156,6 @@ curl -LsSf https://langch.in/dcode | bash
|
|
|
154
156
|
DEEPAGENTS_EXTRAS="nvidia,ollama" curl -LsSf https://langch.in/dcode | bash
|
|
155
157
|
```
|
|
156
158
|
|
|
157
|
-
Or install directly with `uv`:
|
|
158
|
-
|
|
159
|
-
```bash
|
|
160
|
-
# Install with chosen model providers
|
|
161
|
-
uv tool install 'deepagents-code[nvidia,ollama]'
|
|
162
|
-
```
|
|
163
|
-
|
|
164
159
|
Run:
|
|
165
160
|
|
|
166
161
|
```bash
|
|
@@ -21,13 +21,6 @@ curl -LsSf https://langch.in/dcode | bash
|
|
|
21
21
|
DEEPAGENTS_EXTRAS="nvidia,ollama" curl -LsSf https://langch.in/dcode | bash
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
Or install directly with `uv`:
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
# Install with chosen model providers
|
|
28
|
-
uv tool install 'deepagents-code[nvidia,ollama]'
|
|
29
|
-
```
|
|
30
|
-
|
|
31
24
|
Run:
|
|
32
25
|
|
|
33
26
|
```bash
|
|
@@ -152,6 +152,26 @@ class ServerConfig:
|
|
|
152
152
|
enable_skills: bool = True
|
|
153
153
|
"""Enable the skills subsystem (SKILL.md loading and skill tools)."""
|
|
154
154
|
|
|
155
|
+
enable_interpreter: bool = False
|
|
156
|
+
"""Enable `CodeInterpreterMiddleware` (`js_eval` REPL) on the main agent.
|
|
157
|
+
|
|
158
|
+
Local-mode only; the server graph raises if a sandbox is configured and
|
|
159
|
+
this flag is `True`.
|
|
160
|
+
"""
|
|
161
|
+
|
|
162
|
+
interpreter_ptc: str | list[str] | None = None
|
|
163
|
+
"""Override for `settings.interpreter_ptc`.
|
|
164
|
+
|
|
165
|
+
`None` means "fall through to whatever `settings.interpreter_ptc` resolves
|
|
166
|
+
to from `~/.deepagents/config.toml`". A string is one of `"safe"`/`"all"`;
|
|
167
|
+
a list is an explicit allowlist of tool names.
|
|
168
|
+
"""
|
|
169
|
+
|
|
170
|
+
interpreter_ptc_acknowledge_unsafe: bool = False
|
|
171
|
+
"""Mirror of `settings.interpreter_ptc_acknowledge_unsafe` — required when
|
|
172
|
+
`interpreter_ptc="all"` is paired with non-`auto_approve` mode.
|
|
173
|
+
"""
|
|
174
|
+
|
|
155
175
|
sandbox_type: str | None = None
|
|
156
176
|
"""Sandbox backend identifier (e.g. `'daytona'`); `None` runs tools on the
|
|
157
177
|
host. `'none'` is normalized to `None` in `__post_init__`."""
|
|
@@ -159,6 +179,10 @@ class ServerConfig:
|
|
|
159
179
|
sandbox_id: str | None = None
|
|
160
180
|
"""Existing sandbox ID to attach to; `None` creates a fresh sandbox."""
|
|
161
181
|
|
|
182
|
+
sandbox_snapshot_name: str | None = None
|
|
183
|
+
"""Sandbox snapshot name to use or create. LangSmith-only; must be `None`
|
|
184
|
+
when `sandbox_id` is set."""
|
|
185
|
+
|
|
162
186
|
sandbox_setup: str | None = None
|
|
163
187
|
"""Absolute path to a setup script executed inside the sandbox on first attach."""
|
|
164
188
|
|
|
@@ -226,8 +250,18 @@ class ServerConfig:
|
|
|
226
250
|
"ENABLE_ASK_USER": str(self.enable_ask_user).lower(),
|
|
227
251
|
"ENABLE_MEMORY": str(self.enable_memory).lower(),
|
|
228
252
|
"ENABLE_SKILLS": str(self.enable_skills).lower(),
|
|
253
|
+
"ENABLE_INTERPRETER": str(self.enable_interpreter).lower(),
|
|
254
|
+
"INTERPRETER_PTC": (
|
|
255
|
+
json.dumps(self.interpreter_ptc)
|
|
256
|
+
if self.interpreter_ptc is not None
|
|
257
|
+
else None
|
|
258
|
+
),
|
|
259
|
+
"INTERPRETER_PTC_ACKNOWLEDGE_UNSAFE": str(
|
|
260
|
+
self.interpreter_ptc_acknowledge_unsafe
|
|
261
|
+
).lower(),
|
|
229
262
|
"SANDBOX_TYPE": self.sandbox_type,
|
|
230
263
|
"SANDBOX_ID": self.sandbox_id,
|
|
264
|
+
"SANDBOX_SNAPSHOT_NAME": self.sandbox_snapshot_name,
|
|
231
265
|
"SANDBOX_SETUP": self.sandbox_setup,
|
|
232
266
|
"CWD": self.cwd,
|
|
233
267
|
"PROJECT_ROOT": self.project_root,
|
|
@@ -268,8 +302,14 @@ class ServerConfig:
|
|
|
268
302
|
enable_ask_user=_read_env_bool("ENABLE_ASK_USER"),
|
|
269
303
|
enable_memory=_read_env_bool("ENABLE_MEMORY", default=True),
|
|
270
304
|
enable_skills=_read_env_bool("ENABLE_SKILLS", default=True),
|
|
305
|
+
enable_interpreter=_read_env_bool("ENABLE_INTERPRETER"),
|
|
306
|
+
interpreter_ptc=_read_env_json("INTERPRETER_PTC"),
|
|
307
|
+
interpreter_ptc_acknowledge_unsafe=_read_env_bool(
|
|
308
|
+
"INTERPRETER_PTC_ACKNOWLEDGE_UNSAFE"
|
|
309
|
+
),
|
|
271
310
|
sandbox_type=_read_env_str("SANDBOX_TYPE"),
|
|
272
311
|
sandbox_id=_read_env_str("SANDBOX_ID"),
|
|
312
|
+
sandbox_snapshot_name=_read_env_str("SANDBOX_SNAPSHOT_NAME") or None,
|
|
273
313
|
sandbox_setup=_read_env_str("SANDBOX_SETUP"),
|
|
274
314
|
cwd=_read_env_str("CWD"),
|
|
275
315
|
project_root=_read_env_str("PROJECT_ROOT"),
|
|
@@ -295,9 +335,13 @@ class ServerConfig:
|
|
|
295
335
|
shell_allow_list: list[str] | None = None,
|
|
296
336
|
sandbox_type: str = "none",
|
|
297
337
|
sandbox_id: str | None,
|
|
338
|
+
sandbox_snapshot_name: str | None,
|
|
298
339
|
sandbox_setup: str | None,
|
|
299
340
|
enable_shell: bool,
|
|
300
341
|
enable_ask_user: bool,
|
|
342
|
+
enable_interpreter: bool = False,
|
|
343
|
+
interpreter_ptc: str | list[str] | None = None,
|
|
344
|
+
interpreter_ptc_acknowledge_unsafe: bool = False,
|
|
301
345
|
mcp_config_path: str | None,
|
|
302
346
|
no_mcp: bool,
|
|
303
347
|
trust_project_mcp: bool | None,
|
|
@@ -321,9 +365,16 @@ class ServerConfig:
|
|
|
321
365
|
server subprocess for `ShellAllowListMiddleware`.
|
|
322
366
|
sandbox_type: Sandbox type.
|
|
323
367
|
sandbox_id: Existing sandbox ID to reuse.
|
|
368
|
+
sandbox_snapshot_name: Sandbox snapshot name to use or create
|
|
369
|
+
(langsmith only).
|
|
324
370
|
sandbox_setup: Path to setup script for the sandbox.
|
|
325
371
|
enable_shell: Enable shell execution tools.
|
|
326
372
|
enable_ask_user: Enable ask_user tool.
|
|
373
|
+
enable_interpreter: Enable `CodeInterpreterMiddleware` on the main
|
|
374
|
+
agent.
|
|
375
|
+
interpreter_ptc: Override for `settings.interpreter_ptc`.
|
|
376
|
+
interpreter_ptc_acknowledge_unsafe: Mirror of
|
|
377
|
+
`settings.interpreter_ptc_acknowledge_unsafe`.
|
|
327
378
|
mcp_config_path: Path to MCP config.
|
|
328
379
|
no_mcp: Disable MCP.
|
|
329
380
|
trust_project_mcp: Trust project MCP servers.
|
|
@@ -344,8 +395,12 @@ class ServerConfig:
|
|
|
344
395
|
interactive=interactive,
|
|
345
396
|
enable_shell=enable_shell,
|
|
346
397
|
enable_ask_user=enable_ask_user,
|
|
398
|
+
enable_interpreter=enable_interpreter,
|
|
399
|
+
interpreter_ptc=interpreter_ptc,
|
|
400
|
+
interpreter_ptc_acknowledge_unsafe=interpreter_ptc_acknowledge_unsafe,
|
|
347
401
|
sandbox_type=sandbox_type,
|
|
348
402
|
sandbox_id=sandbox_id,
|
|
403
|
+
sandbox_snapshot_name=sandbox_snapshot_name,
|
|
349
404
|
sandbox_setup=_normalize_path(
|
|
350
405
|
sandbox_setup, project_context, "sandbox setup"
|
|
351
406
|
),
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""Stderr marker emission used by the langgraph server graph entry point.
|
|
2
|
+
|
|
3
|
+
Lives in its own module so unit tests can exercise the marker contract
|
|
4
|
+
without triggering `server_graph.make_graph()` at import time.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
import sys
|
|
11
|
+
import traceback
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
STARTUP_ERROR_MARKER = "DEEPAGENTS_STARTUP_ERROR:"
|
|
16
|
+
"""Stderr marker the parent app scans for in `server._extract_startup_error_marker`
|
|
17
|
+
to upgrade an opaque "Server process exited with code N" into a one-line summary.
|
|
18
|
+
Format is `{STARTUP_ERROR_MARKER}{single-line message}`."""
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def emit_startup_failure(exc: BaseException) -> None:
|
|
22
|
+
"""Report a server graph startup failure to the parent app process.
|
|
23
|
+
|
|
24
|
+
Emits two stderr outputs: the full traceback for logs/debugging, then a
|
|
25
|
+
single-line `{STARTUP_ERROR_MARKER}{type}: {summary}` line that
|
|
26
|
+
`server._extract_startup_error_marker` parses to upgrade an opaque
|
|
27
|
+
"Server process exited with code N" into an actionable summary.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
exc: The exception raised during graph initialization.
|
|
31
|
+
"""
|
|
32
|
+
logger.critical("Failed to initialize server graph", exc_info=exc)
|
|
33
|
+
print( # noqa: T201 # stderr fallback — logger may not reach parent process
|
|
34
|
+
f"Failed to initialize server graph: {exc}\n{traceback.format_exc()}",
|
|
35
|
+
file=sys.stderr,
|
|
36
|
+
)
|
|
37
|
+
# Marker contract is single-line; guard against multi-line/empty `str(exc)`
|
|
38
|
+
# and include the type so e.g. `ValueError` and `RuntimeError` are
|
|
39
|
+
# distinguishable in the parent's truncated summary.
|
|
40
|
+
exc_lines = str(exc).splitlines()
|
|
41
|
+
summary = exc_lines[0] if exc_lines else "<no message>"
|
|
42
|
+
print( # noqa: T201
|
|
43
|
+
f"{STARTUP_ERROR_MARKER}{type(exc).__name__}: {summary}",
|
|
44
|
+
file=sys.stderr,
|
|
45
|
+
)
|
|
@@ -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.4" # 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."""
|