deepagents-cli 0.0.55__tar.gz → 0.0.56__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_cli-0.0.55 → deepagents_cli-0.0.56}/CHANGELOG.md +18 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/PKG-INFO +4 -1
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/_env_vars.py +13 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/_version.py +1 -1
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/agent.py +8 -9
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/app.py +1 -2
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/app.tcss +7 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/config.py +0 -8
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/deploy/bundler.py +1 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/extras_info.py +1 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/main.py +45 -9
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/non_interactive.py +1 -2
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/textual_adapter.py +50 -10
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/approval.py +182 -21
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/chat_input.py +42 -2
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/message_store.py +5 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/messages.py +69 -11
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/welcome.py +2 -2
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/package-lock.json +87 -152
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/pyproject.toml +3 -2
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/deploy/test_bundler.py +1 -2
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_agent.py +4 -17
- deepagents_cli-0.0.56/tests/unit_tests/test_approval.py +641 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_chat_input.py +99 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_main.py +289 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_message_store.py +17 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_messages.py +160 -25
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_non_interactive.py +3 -6
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_textual_adapter.py +266 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_welcome.py +3 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/uv.lock +29 -6
- deepagents_cli-0.0.55/tests/unit_tests/test_approval.py +0 -345
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/.gitignore +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/DEV.md +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/Makefile +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/README.md +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/THREAT_MODEL.md +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/__init__.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/__main__.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/_ask_user_types.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/_cli_context.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/_constants.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/_debug.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/_git.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/_server_config.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/_session_stats.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/_testing_models.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/_textual_patches.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/ask_user.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/auth_store.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/built_in_skills/__init__.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/clipboard.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/command_registry.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/configurable_model.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/default_agent_prompt.md +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/deploy/__init__.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/deploy/commands.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/deploy/config.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/deploy/context_hub.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/deploy/frontend_dist/assets/anonymous-B9UzAXQd.js +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/deploy/frontend_dist/assets/clerk-5xHgyQyG.js +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/deploy/frontend_dist/assets/highlighted-body-OFNGDK62-rX-7qT8o.js +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/deploy/frontend_dist/assets/index-DM3gptpu.js +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/deploy/frontend_dist/assets/index-Ddy7F6KI.css +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/deploy/frontend_dist/assets/supabase-S6NACDgm.js +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/deploy/frontend_dist/index.html +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/deploy/frontend_dist/logo-dark.svg +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/deploy/frontend_dist/logo-light.svg +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/deploy/templates.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/editor.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/event_bus.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/file_ops.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/formatting.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/hooks.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/input.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/integrations/__init__.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/integrations/sandbox_factory.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/integrations/sandbox_provider.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/iterm_cursor_guide.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/local_context.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/mcp_auth.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/mcp_commands.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/mcp_providers/__init__.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/mcp_providers/_registry.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/mcp_providers/base.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/mcp_providers/github.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/mcp_providers/slack.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/mcp_tools.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/mcp_trust.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/media_utils.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/model_config.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/notifications.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/offload.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/onboarding.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/output.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/project_utils.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/py.typed +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/remote_client.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/server.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/server_graph.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/server_manager.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/sessions.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/skills/__init__.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/skills/commands.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/skills/invocation.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/skills/load.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/state_migration.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/subagents.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/system_prompt.md +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/terminal_capabilities.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/theme.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/token_state.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/tool_display.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/tools.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/ui.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/unicode_security.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/update_check.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/__init__.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/_links.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/agent_selector.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/ask_user.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/auth.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/autocomplete.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/diff.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/history.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/launch_init.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/loading.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/mcp_viewer.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/model_selector.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/notification_center.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/notification_detail.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/notification_settings.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/status.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/theme_selector.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/thread_selector.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/tool_renderers.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/tool_widgets.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/update_available.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/deepagents_cli/widgets/update_progress.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/examples/deploy-content-writer/.env.example +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/examples/deploy-content-writer/skills/blog-post/SKILL.md +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/examples/deploy-content-writer/skills/social-media/SKILL.md +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/examples/deploy-content-writer/user/context.md +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/examples/deploy-content-writer/user/preferences.md +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/.nvmrc +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/index.html +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/package.json +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/postcss.config.js +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/public/logo-dark.svg +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/public/logo-light.svg +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/App.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/ThemeProvider.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/auth/anonymous.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/auth/clerk.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/auth/loader.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/auth/supabase.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/auth/types.ts +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/components/AppHeader.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/components/FilePanels.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/components/MessageList.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/components/SubagentActivity.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/components/ThreadPicker.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/components/TodosPanel.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/components/ToolCallCard.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/components/toolcalls/FileToolCard.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/components/toolcalls/SearchCard.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/components/toolcalls/ThinkCard.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/components/toolcalls/TodosCard.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/components/toolcalls/index.ts +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/constants.ts +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/index.css +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/main.tsx +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/runtimeConfig.ts +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/types.ts +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/src/vite-env.d.ts +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/tsconfig.json +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/frontend/vite.config.ts +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/images/cli.png +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/scripts/check_imports.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/scripts/debug_server.sh +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/scripts/install.sh +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/README.md +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/integration_tests/__init__.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/integration_tests/conftest.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/integration_tests/test_context_hub.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/integration_tests/test_deploy_hub.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/__init__.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/conftest.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/deploy/__init__.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/deploy/test_commands.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/deploy/test_config.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/deploy/test_context_hub.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/deploy/test_frontend_bundle.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/deploy/test_frontend_config.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_agent_selector.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_app.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_args.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_ask_user.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_auth_widgets.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_autocomplete.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_config.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_git.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_history.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_launch_init.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_links.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_loading.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_mcp_commands.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_mcp_trust.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_mcp_viewer.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_model_config.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_model_selector.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_notification_center.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_notification_detail.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_offload_dict_messages.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_output.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_server.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_status.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_thread_selector.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_token_tracker.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_update_available.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_update_progress.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/test_version.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_cli-0.0.55 → deepagents_cli-0.0.56}/tests/unit_tests/tools/test_fetch_url.py +0 -0
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Deep Agents CLI Changelog
|
|
2
2
|
|
|
3
|
+
## [0.0.56](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.55...deepagents-cli==0.0.56) (2026-05-11)
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
* Free-text reject reason on HITL approval prompt ([#3344](https://github.com/langchain-ai/deepagents/issues/3344)) ([dcc48f4](https://github.com/langchain-ai/deepagents/commit/dcc48f48d20757f17011e65b61363dd0347af164))
|
|
8
|
+
* Add docs link to project MCP approval prompt ([#3341](https://github.com/langchain-ai/deepagents/issues/3341)) ([b5c1228](https://github.com/langchain-ai/deepagents/commit/b5c12280e47bc37938290a4219317f47c1abfa8a))
|
|
9
|
+
|
|
10
|
+
### Bug Fixes
|
|
11
|
+
|
|
12
|
+
* Dedupe MCP servers in project trust approval prompt ([#3342](https://github.com/langchain-ai/deepagents/issues/3342)) ([73484ea](https://github.com/langchain-ai/deepagents/commit/73484ea551189985190f52cb26b299819d3fc37d))
|
|
13
|
+
* Remove legacy shell tool aliases and harden HITL widget cleanup ([#3340](https://github.com/langchain-ai/deepagents/issues/3340)) ([398f7f4](https://github.com/langchain-ai/deepagents/commit/398f7f4512182a8e51cbdfbfb9dc211c77014e2b))
|
|
14
|
+
* Truncate multi-line shell commands in HITL approval ([#3314](https://github.com/langchain-ai/deepagents/issues/3314)) ([7ab6e14](https://github.com/langchain-ai/deepagents/commit/7ab6e14565d6dd9d9c9e76d9d6677e5568a727f7))
|
|
15
|
+
* (Deploy) Add `together` provider to bundler deps and optional extras ([#2670](https://github.com/langchain-ai/deepagents/issues/2670)) ([4290953](https://github.com/langchain-ai/deepagents/commit/4290953e44570ec02399e4d423ab4ffd24e97609))
|
|
16
|
+
|
|
17
|
+
### Performance Improvements
|
|
18
|
+
|
|
19
|
+
* Gate dropped-path detection on multi-character insert size ([#3343](https://github.com/langchain-ai/deepagents/issues/3343)) ([06a21e8](https://github.com/langchain-ai/deepagents/commit/06a21e8a69738b7ba055d2f13dae4cd9fab353cd))
|
|
20
|
+
|
|
3
21
|
## [0.0.55](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.54...deepagents-cli==0.0.55) (2026-05-11)
|
|
4
22
|
|
|
5
23
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-cli
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.56
|
|
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/
|
|
@@ -76,6 +76,7 @@ Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
|
76
76
|
Requires-Dist: langchain-openai<2.0.0,>=1.2.1; extra == 'all-providers'
|
|
77
77
|
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.3; extra == 'all-providers'
|
|
78
78
|
Requires-Dist: langchain-perplexity<2.0.0,>=1.2.0; extra == 'all-providers'
|
|
79
|
+
Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'all-providers'
|
|
79
80
|
Requires-Dist: langchain-xai<2.0.0,>=1.2.2; extra == 'all-providers'
|
|
80
81
|
Provides-Extra: all-sandboxes
|
|
81
82
|
Requires-Dist: langchain-agentcore-codeinterpreter>=0.0.2; extra == 'all-sandboxes'
|
|
@@ -122,6 +123,8 @@ Provides-Extra: perplexity
|
|
|
122
123
|
Requires-Dist: langchain-perplexity<2.0.0,>=1.2.0; extra == 'perplexity'
|
|
123
124
|
Provides-Extra: runloop
|
|
124
125
|
Requires-Dist: langchain-runloop>=0.0.4; extra == 'runloop'
|
|
126
|
+
Provides-Extra: together
|
|
127
|
+
Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'together'
|
|
125
128
|
Provides-Extra: vertexai
|
|
126
129
|
Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.3; extra == 'vertexai'
|
|
127
130
|
Provides-Extra: xai
|
|
@@ -47,6 +47,19 @@ as enabled, and `0`, `false`, `no`, `off`, empty string, or unset as disabled.""
|
|
|
47
47
|
DEBUG_FILE = "DEEPAGENTS_CLI_DEBUG_FILE"
|
|
48
48
|
"""Path for the debug log file (default: `/tmp/deepagents_debug.log`)."""
|
|
49
49
|
|
|
50
|
+
DEBUG_MCP_PROJECT_TRUST = "DEEPAGENTS_CLI_DEBUG_MCP_PROJECT_TRUST"
|
|
51
|
+
"""Force the project MCP approval prompt for manual UI testing.
|
|
52
|
+
|
|
53
|
+
Set to a truthy value when launching the interactive CLI to render the
|
|
54
|
+
project-level MCP trust prompt without relying on an untrusted config state. If
|
|
55
|
+
project MCP servers are discovered, the prompt shows those real servers;
|
|
56
|
+
otherwise it shows a sample server. The CLI exits after the prompt response so
|
|
57
|
+
the debug run does not continue into TUI or server startup, and it does not
|
|
58
|
+
persist trust decisions.
|
|
59
|
+
|
|
60
|
+
Parsed by `is_env_truthy`: accepts `1`, `true`, `yes`, `on` as enabled.
|
|
61
|
+
"""
|
|
62
|
+
|
|
50
63
|
DEBUG_NOTIFICATIONS = "DEEPAGENTS_CLI_DEBUG_NOTIFICATIONS"
|
|
51
64
|
"""Inject sample missing-dependency notifications at launch so the notification
|
|
52
65
|
center UI can be exercised without waiting for real conditions. Does not
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Version information and lightweight constants for `deepagents-cli`."""
|
|
2
2
|
|
|
3
|
-
__version__ = "0.0.
|
|
3
|
+
__version__ = "0.0.56" # x-release-please-version
|
|
4
4
|
|
|
5
5
|
DOCS_URL = "https://docs.langchain.com/oss/python/deepagents/cli"
|
|
6
6
|
"""URL for `deepagents-cli` documentation."""
|
|
@@ -88,11 +88,11 @@ REQUIRE_COMPACT_TOOL_APPROVAL: bool = True
|
|
|
88
88
|
class ShellAllowListMiddleware(AgentMiddleware):
|
|
89
89
|
"""Validate shell commands against an allow-list without HITL interrupts.
|
|
90
90
|
|
|
91
|
-
When the agent invokes
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
91
|
+
When the agent invokes the `execute` shell tool, this middleware checks
|
|
92
|
+
the command against the configured allow-list **before execution**.
|
|
93
|
+
Rejected commands are returned as error `ToolMessage` objects — the
|
|
94
|
+
graph never pauses, so LangSmith traces stay as a single continuous
|
|
95
|
+
run.
|
|
96
96
|
|
|
97
97
|
Use this middleware in non-interactive mode to avoid the
|
|
98
98
|
interrupt/resume cycle that fragments traces.
|
|
@@ -135,10 +135,9 @@ class ShellAllowListMiddleware(AgentMiddleware):
|
|
|
135
135
|
"""
|
|
136
136
|
from langchain_core.messages import ToolMessage as LCToolMessage
|
|
137
137
|
|
|
138
|
-
from deepagents_cli.config import
|
|
138
|
+
from deepagents_cli.config import is_shell_command_allowed
|
|
139
139
|
|
|
140
|
-
|
|
141
|
-
if tool_name not in SHELL_TOOL_NAMES:
|
|
140
|
+
if request.tool_call["name"] != "execute":
|
|
142
141
|
return None
|
|
143
142
|
|
|
144
143
|
args = request.tool_call.get("args") or {}
|
|
@@ -155,7 +154,7 @@ class ShellAllowListMiddleware(AgentMiddleware):
|
|
|
155
154
|
f"Allowed commands: {allowed_str}. "
|
|
156
155
|
f"Please use an allowed command or try another approach."
|
|
157
156
|
),
|
|
158
|
-
name=
|
|
157
|
+
name="execute",
|
|
159
158
|
tool_call_id=request.tool_call["id"],
|
|
160
159
|
status="error",
|
|
161
160
|
)
|
|
@@ -3378,7 +3378,6 @@ class DeepAgentsApp(App):
|
|
|
3378
3378
|
A Future that resolves to the user's decision.
|
|
3379
3379
|
"""
|
|
3380
3380
|
from deepagents_cli.config import (
|
|
3381
|
-
SHELL_TOOL_NAMES,
|
|
3382
3381
|
is_shell_command_allowed,
|
|
3383
3382
|
settings,
|
|
3384
3383
|
)
|
|
@@ -3392,7 +3391,7 @@ class DeepAgentsApp(App):
|
|
|
3392
3391
|
approved_commands = []
|
|
3393
3392
|
|
|
3394
3393
|
for req in action_requests:
|
|
3395
|
-
if req.get("name")
|
|
3394
|
+
if req.get("name") == "execute":
|
|
3396
3395
|
command = req.get("args", {}).get("command", "")
|
|
3397
3396
|
if is_shell_command_allowed(command, settings.shell_allow_list):
|
|
3398
3397
|
approved_commands.append(command)
|
|
@@ -224,6 +224,13 @@ ToolCallMessage.-ascii:hover {
|
|
|
224
224
|
margin-top: 0;
|
|
225
225
|
}
|
|
226
226
|
|
|
227
|
+
/* Free-text reject reason input (Tab on Reject) */
|
|
228
|
+
.approval-menu .approval-reason-input {
|
|
229
|
+
margin: 1 0 0 0;
|
|
230
|
+
border: solid $warning;
|
|
231
|
+
background: $surface;
|
|
232
|
+
}
|
|
233
|
+
|
|
227
234
|
/* Ask user widget */
|
|
228
235
|
.ask-user-menu {
|
|
229
236
|
height: auto;
|
|
@@ -1464,14 +1464,6 @@ class SessionState:
|
|
|
1464
1464
|
return self.auto_approve
|
|
1465
1465
|
|
|
1466
1466
|
|
|
1467
|
-
SHELL_TOOL_NAMES: frozenset[str] = frozenset({"bash", "shell", "execute"})
|
|
1468
|
-
"""Tool names recognized as shell/command-execution tools.
|
|
1469
|
-
|
|
1470
|
-
Only `'execute'` is registered by the SDK and CLI backends in practice.
|
|
1471
|
-
`'bash'` and `'shell'` are legacy names carried over and kept as
|
|
1472
|
-
backwards-compatible aliases.
|
|
1473
|
-
"""
|
|
1474
|
-
|
|
1475
1467
|
DANGEROUS_SHELL_PATTERNS = (
|
|
1476
1468
|
"$(", # Command substitution
|
|
1477
1469
|
"`", # Backtick command substitution
|
|
@@ -68,6 +68,7 @@ _MODEL_PROVIDER_DEPS: dict[str, str] = {
|
|
|
68
68
|
"openai": "langchain-openai",
|
|
69
69
|
"openrouter": "langchain-openrouter",
|
|
70
70
|
"perplexity": "langchain-perplexity",
|
|
71
|
+
"together": "langchain-together",
|
|
71
72
|
"xai": "langchain-xai",
|
|
72
73
|
}
|
|
73
74
|
"""Dependencies inferred from a provider: prefix on the model string."""
|
|
@@ -1432,6 +1432,13 @@ def _print_session_stats(stats: Any, console: Any) -> None: # noqa: ANN401
|
|
|
1432
1432
|
print_usage_table(stats, stats.wall_time_seconds, console)
|
|
1433
1433
|
|
|
1434
1434
|
|
|
1435
|
+
def _debug_mcp_project_trust_enabled() -> bool:
|
|
1436
|
+
"""Return whether the project MCP approval prompt debug path is enabled."""
|
|
1437
|
+
from deepagents_cli._env_vars import DEBUG_MCP_PROJECT_TRUST, is_env_truthy
|
|
1438
|
+
|
|
1439
|
+
return is_env_truthy(DEBUG_MCP_PROJECT_TRUST)
|
|
1440
|
+
|
|
1441
|
+
|
|
1435
1442
|
def _check_mcp_project_trust(*, trust_flag: bool = False) -> bool | None:
|
|
1436
1443
|
"""Check whether project-level MCP servers should be trusted.
|
|
1437
1444
|
|
|
@@ -1457,9 +1464,12 @@ def _check_mcp_project_trust(*, trust_flag: bool = False) -> bool | None:
|
|
|
1457
1464
|
discover_mcp_configs,
|
|
1458
1465
|
extract_project_server_summaries,
|
|
1459
1466
|
load_mcp_config_lenient,
|
|
1467
|
+
merge_mcp_configs,
|
|
1460
1468
|
)
|
|
1461
1469
|
from deepagents_cli.project_utils import ProjectContext
|
|
1462
1470
|
|
|
1471
|
+
debug_prompt = _debug_mcp_project_trust_enabled()
|
|
1472
|
+
|
|
1463
1473
|
try:
|
|
1464
1474
|
project_context = ProjectContext.from_user_cwd(Path.cwd())
|
|
1465
1475
|
config_paths = discover_mcp_configs(project_context=project_context)
|
|
@@ -1467,15 +1477,29 @@ def _check_mcp_project_trust(*, trust_flag: bool = False) -> bool | None:
|
|
|
1467
1477
|
return None
|
|
1468
1478
|
|
|
1469
1479
|
_, project_configs = classify_discovered_configs(config_paths)
|
|
1470
|
-
if not project_configs:
|
|
1480
|
+
if not project_configs and not debug_prompt:
|
|
1471
1481
|
return None
|
|
1472
1482
|
|
|
1473
|
-
#
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1483
|
+
# Merge configs by server name (last wins, matching the loader) so that
|
|
1484
|
+
# a server defined in multiple project configs (for example,
|
|
1485
|
+
# `.deepagents/.mcp.json` and higher-precedence `.mcp.json`) only shows
|
|
1486
|
+
# up once in the prompt.
|
|
1487
|
+
loaded_configs = [
|
|
1488
|
+
cfg
|
|
1489
|
+
for cfg in (load_mcp_config_lenient(path) for path in project_configs)
|
|
1490
|
+
if cfg is not None
|
|
1491
|
+
]
|
|
1492
|
+
merged_config = merge_mcp_configs(loaded_configs)
|
|
1493
|
+
all_servers = extract_project_server_summaries(merged_config)
|
|
1494
|
+
|
|
1495
|
+
if not all_servers and debug_prompt:
|
|
1496
|
+
all_servers = [
|
|
1497
|
+
(
|
|
1498
|
+
"debug-project-mcp",
|
|
1499
|
+
"stdio",
|
|
1500
|
+
"uvx deepagents-debug-mcp --sample-project-server",
|
|
1501
|
+
)
|
|
1502
|
+
]
|
|
1479
1503
|
|
|
1480
1504
|
if not all_servers:
|
|
1481
1505
|
return None
|
|
@@ -1495,12 +1519,16 @@ def _check_mcp_project_trust(*, trust_flag: bool = False) -> bool | None:
|
|
|
1495
1519
|
)
|
|
1496
1520
|
fingerprint = compute_config_fingerprint(project_configs)
|
|
1497
1521
|
|
|
1498
|
-
if is_project_mcp_trusted(project_root, fingerprint):
|
|
1522
|
+
if not debug_prompt and is_project_mcp_trusted(project_root, fingerprint):
|
|
1499
1523
|
return True
|
|
1500
1524
|
|
|
1501
1525
|
# Interactive prompt
|
|
1502
1526
|
from rich.console import Console as _Console
|
|
1503
1527
|
|
|
1528
|
+
docs_url = (
|
|
1529
|
+
"https://docs.langchain.com/oss/python/deepagents/cli/"
|
|
1530
|
+
"mcp-tools#project-level-trust"
|
|
1531
|
+
)
|
|
1504
1532
|
prompt_console = _Console(stderr=True)
|
|
1505
1533
|
prompt_console.print()
|
|
1506
1534
|
prompt_console.print(
|
|
@@ -1509,6 +1537,11 @@ def _check_mcp_project_trust(*, trust_flag: bool = False) -> bool | None:
|
|
|
1509
1537
|
for name, kind, summary in all_servers:
|
|
1510
1538
|
prompt_console.print(f' [bold]"{name}"[/bold] ({kind}): {summary}')
|
|
1511
1539
|
prompt_console.print()
|
|
1540
|
+
prompt_console.print(
|
|
1541
|
+
f"[dim]Learn more: [link={docs_url}]{docs_url}[/link][/dim]",
|
|
1542
|
+
highlight=False,
|
|
1543
|
+
)
|
|
1544
|
+
prompt_console.print()
|
|
1512
1545
|
|
|
1513
1546
|
try:
|
|
1514
1547
|
answer = input("Allow? [y/N]: ").strip().lower()
|
|
@@ -1516,7 +1549,8 @@ def _check_mcp_project_trust(*, trust_flag: bool = False) -> bool | None:
|
|
|
1516
1549
|
answer = ""
|
|
1517
1550
|
|
|
1518
1551
|
if answer == "y":
|
|
1519
|
-
|
|
1552
|
+
if not debug_prompt:
|
|
1553
|
+
trust_project_mcp(project_root, fingerprint)
|
|
1520
1554
|
return True
|
|
1521
1555
|
return False
|
|
1522
1556
|
|
|
@@ -2109,6 +2143,8 @@ def cli_main() -> None:
|
|
|
2109
2143
|
mcp_trust_decision = _check_mcp_project_trust(
|
|
2110
2144
|
trust_flag=getattr(args, "trust_project_mcp", False),
|
|
2111
2145
|
)
|
|
2146
|
+
if _debug_mcp_project_trust_enabled():
|
|
2147
|
+
sys.exit(0)
|
|
2112
2148
|
|
|
2113
2149
|
# Run Textual CLI
|
|
2114
2150
|
return_code = 0
|
|
@@ -41,7 +41,6 @@ from deepagents_cli._version import __version__
|
|
|
41
41
|
from deepagents_cli.agent import DEFAULT_AGENT_NAME
|
|
42
42
|
from deepagents_cli.config import (
|
|
43
43
|
SHELL_ALLOW_ALL,
|
|
44
|
-
SHELL_TOOL_NAMES,
|
|
45
44
|
build_langsmith_thread_url,
|
|
46
45
|
create_model,
|
|
47
46
|
is_shell_command_allowed,
|
|
@@ -470,7 +469,7 @@ def _make_hitl_decision(
|
|
|
470
469
|
|
|
471
470
|
action_name = action_request.get("name", "")
|
|
472
471
|
|
|
473
|
-
if action_name
|
|
472
|
+
if action_name == "execute":
|
|
474
473
|
if not settings.shell_allow_list:
|
|
475
474
|
command = action_request.get("args", {}).get("command", "")
|
|
476
475
|
console.print(
|
|
@@ -1150,10 +1150,32 @@ async def execute_task_textual(
|
|
|
1150
1150
|
]
|
|
1151
1151
|
},
|
|
1152
1152
|
)
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1153
|
+
# Hide shell tool widgets while the approval renders the
|
|
1154
|
+
# same command; restore before processing the decision
|
|
1155
|
+
# so subsequent status updates render on the visible
|
|
1156
|
+
# widget.
|
|
1157
|
+
suppressed_tool_msgs = [
|
|
1158
|
+
tool_msg
|
|
1159
|
+
for tool_msg in adapter._current_tool_messages.values()
|
|
1160
|
+
if tool_msg.tool_name == "execute"
|
|
1161
|
+
]
|
|
1162
|
+
for tool_msg in suppressed_tool_msgs:
|
|
1163
|
+
tool_msg.set_awaiting_approval()
|
|
1164
|
+
try:
|
|
1165
|
+
future = await adapter._request_approval(
|
|
1166
|
+
action_requests, assistant_id
|
|
1167
|
+
)
|
|
1168
|
+
decision = await future
|
|
1169
|
+
finally:
|
|
1170
|
+
for tool_msg in suppressed_tool_msgs:
|
|
1171
|
+
try:
|
|
1172
|
+
tool_msg.clear_awaiting_approval()
|
|
1173
|
+
except Exception:
|
|
1174
|
+
logger.exception(
|
|
1175
|
+
"Failed to clear awaiting-approval "
|
|
1176
|
+
"state on tool widget %s",
|
|
1177
|
+
tool_msg.tool_name,
|
|
1178
|
+
)
|
|
1157
1179
|
|
|
1158
1180
|
if isinstance(decision, dict):
|
|
1159
1181
|
decision_type = decision.get("type")
|
|
@@ -1206,17 +1228,35 @@ async def execute_task_textual(
|
|
|
1206
1228
|
)
|
|
1207
1229
|
|
|
1208
1230
|
elif decision_type == "reject":
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1231
|
+
reject_message = decision.get("message")
|
|
1232
|
+
reject_message = (
|
|
1233
|
+
reject_message
|
|
1234
|
+
if isinstance(reject_message, str)
|
|
1235
|
+
and reject_message.strip()
|
|
1236
|
+
else None
|
|
1237
|
+
)
|
|
1238
|
+
reject_decision: RejectDecision = (
|
|
1239
|
+
RejectDecision(
|
|
1240
|
+
type="reject", message=reject_message
|
|
1241
|
+
)
|
|
1242
|
+
if reject_message
|
|
1243
|
+
else RejectDecision(type="reject")
|
|
1244
|
+
)
|
|
1245
|
+
decisions = [reject_decision for _ in action_requests]
|
|
1213
1246
|
tool_msgs = list(
|
|
1214
1247
|
adapter._current_tool_messages.values()
|
|
1215
1248
|
)
|
|
1216
1249
|
for tool_msg in tool_msgs:
|
|
1217
|
-
tool_msg.set_rejected()
|
|
1250
|
+
tool_msg.set_rejected(reason=reject_message)
|
|
1218
1251
|
adapter._current_tool_messages.clear()
|
|
1219
|
-
|
|
1252
|
+
# Bare reject aborts the turn and shows the
|
|
1253
|
+
# canned "Command rejected" banner so the user
|
|
1254
|
+
# can redirect. When a reason is supplied, the
|
|
1255
|
+
# reason itself serves as feedback for the
|
|
1256
|
+
# agent: keep `any_rejected=False` so the
|
|
1257
|
+
# stream resumes and the banner is suppressed.
|
|
1258
|
+
if reject_message is None:
|
|
1259
|
+
any_rejected = True
|
|
1220
1260
|
else:
|
|
1221
1261
|
logger.warning(
|
|
1222
1262
|
"Unexpected HITL decision type: %s",
|