deepagents-cli 0.0.47__tar.gz → 0.0.48__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.47 → deepagents_cli-0.0.48}/CHANGELOG.md +6 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/Makefile +7 -1
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/PKG-INFO +2 -2
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_version.py +1 -1
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/app.py +37 -3
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/pyproject.toml +3 -3
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_model_switch.py +146 -1
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/uv.lock +23 -18
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/.gitignore +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/DEV.md +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/README.md +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/THREAT_MODEL.md +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/__init__.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/__main__.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_ask_user_types.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_cli_context.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_debug.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_env_vars.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_git.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_server_config.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_session_stats.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_testing_models.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_textual_patches.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/agent.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/app.tcss +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/ask_user.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/built_in_skills/__init__.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/clipboard.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/command_registry.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/config.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/configurable_model.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/default_agent_prompt.md +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/__init__.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/bundler.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/commands.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/config.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/assets/anonymous-B9UzAXQd.js +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/assets/clerk-5xHgyQyG.js +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/assets/highlighted-body-OFNGDK62-rX-7qT8o.js +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/assets/index-DM3gptpu.js +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/assets/index-Ddy7F6KI.css +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/assets/supabase-S6NACDgm.js +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/index.html +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/logo-dark.svg +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/logo-light.svg +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/templates.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/editor.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/extras_info.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/file_ops.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/formatting.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/hooks.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/input.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/integrations/__init__.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/integrations/sandbox_factory.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/integrations/sandbox_provider.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/local_context.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/main.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_auth.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_commands.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_providers/__init__.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_providers/_registry.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_providers/base.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_providers/github.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_providers/slack.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_tools.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_trust.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/media_utils.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/model_config.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/non_interactive.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/notifications.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/offload.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/output.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/project_utils.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/py.typed +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/remote_client.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/server.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/server_graph.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/server_manager.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/sessions.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/skills/__init__.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/skills/commands.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/skills/invocation.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/skills/load.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/subagents.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/system_prompt.md +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/terminal_capabilities.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/textual_adapter.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/theme.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/token_state.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/tool_display.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/tools.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/ui.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/unicode_security.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/update_check.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/__init__.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/_links.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/agent_selector.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/approval.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/ask_user.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/autocomplete.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/chat_input.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/diff.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/history.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/loading.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/mcp_viewer.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/message_store.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/messages.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/model_selector.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/notification_center.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/notification_detail.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/notification_settings.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/status.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/theme_selector.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/thread_selector.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/tool_renderers.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/tool_widgets.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/update_available.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/welcome.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/deploy-content-writer/.env.example +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/deploy-content-writer/skills/blog-post/SKILL.md +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/deploy-content-writer/skills/social-media/SKILL.md +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/deploy-content-writer/user/context.md +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/deploy-content-writer/user/preferences.md +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/.nvmrc +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/index.html +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/package-lock.json +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/package.json +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/postcss.config.js +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/public/logo-dark.svg +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/public/logo-light.svg +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/App.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/ThemeProvider.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/auth/anonymous.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/auth/clerk.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/auth/loader.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/auth/supabase.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/auth/types.ts +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/AppHeader.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/FilePanels.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/MessageList.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/SubagentActivity.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/ThreadPicker.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/TodosPanel.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/ToolCallCard.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/toolcalls/FileToolCard.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/toolcalls/SearchCard.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/toolcalls/ThinkCard.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/toolcalls/TodosCard.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/toolcalls/index.ts +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/constants.ts +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/index.css +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/main.tsx +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/runtimeConfig.ts +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/types.ts +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/vite-env.d.ts +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/tsconfig.json +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/vite.config.ts +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/images/cli.png +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/scripts/check_imports.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/scripts/debug_server.sh +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/scripts/install.sh +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/README.md +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/__init__.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/conftest.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/__init__.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/conftest.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/deploy/__init__.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/deploy/test_bundler.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/deploy/test_commands.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/deploy/test_config.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/deploy/test_frontend_bundle.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/deploy/test_frontend_config.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_agent.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_agent_selector.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_app.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_approval.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_args.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_ask_user.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_autocomplete.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_chat_input.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_config.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_git.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_history.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_links.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_loading.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_main.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_mcp_commands.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_mcp_trust.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_mcp_viewer.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_message_store.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_messages.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_model_config.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_model_selector.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_notification_center.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_notification_detail.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_offload_dict_messages.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_output.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_server.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_status.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_textual_adapter.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_thread_selector.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_token_tracker.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_update_available.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_version.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_welcome.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/tools/test_fetch_url.py +0 -0
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.0.48](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.47...deepagents-cli==0.0.48) (2026-05-01)
|
|
4
|
+
|
|
5
|
+
### Bug Fixes
|
|
6
|
+
|
|
7
|
+
* Apply `--model-params` on `/model` re-select ([#3072](https://github.com/langchain-ai/deepagents/issues/3072)) ([50546dd](https://github.com/langchain-ai/deepagents/commit/50546dd3d368af297084929ee3aa91ccf8496fca))
|
|
8
|
+
|
|
3
9
|
## [0.0.47](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.46...deepagents-cli==0.0.47) (2026-05-01)
|
|
4
10
|
|
|
5
11
|
### Features
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
.PHONY: format lint type typecheck test tests integration_test integration_tests test_watch benchmark 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
|
|
2
2
|
|
|
3
3
|
.DEFAULT_GOAL := help
|
|
4
4
|
|
|
@@ -38,6 +38,12 @@ test_watch: ## Run tests in watch mode
|
|
|
38
38
|
benchmark: ## Run benchmark tests
|
|
39
39
|
uv run --group test pytest ./tests -m benchmark
|
|
40
40
|
|
|
41
|
+
bench: ## Run benchmarks under CodSpeed instrumentation
|
|
42
|
+
uv run --group test pytest ./tests -m benchmark --codspeed
|
|
43
|
+
|
|
44
|
+
bench-memory: ## Run memory benchmarks under CodSpeed instrumentation
|
|
45
|
+
uv run --group test pytest ./tests -m memory_benchmark --codspeed
|
|
46
|
+
|
|
41
47
|
run: ## Reinstall and run package
|
|
42
48
|
uvx --no-cache --reinstall .
|
|
43
49
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-cli
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.48
|
|
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.5.
|
|
30
|
+
Requires-Dist: deepagents==0.5.6
|
|
31
31
|
Requires-Dist: httpx<1.0.0,>=0.28.1
|
|
32
32
|
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.2
|
|
33
33
|
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.2
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Version information and lightweight constants for `deepagents-cli`."""
|
|
2
2
|
|
|
3
|
-
__version__ = "0.0.
|
|
3
|
+
__version__ = "0.0.48" # 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."""
|
|
@@ -347,6 +347,21 @@ def _extract_model_params_flag(raw_arg: str) -> tuple[str, dict[str, Any] | None
|
|
|
347
347
|
return remaining, params
|
|
348
348
|
|
|
349
349
|
|
|
350
|
+
def _format_model_params(extra_kwargs: dict[str, Any] | None) -> str:
|
|
351
|
+
"""Render `--model-params` as a stable, key-sorted JSON suffix.
|
|
352
|
+
|
|
353
|
+
Args:
|
|
354
|
+
extra_kwargs: The parsed `--model-params` payload, or `None`.
|
|
355
|
+
|
|
356
|
+
Returns:
|
|
357
|
+
` with model params {json}` when `extra_kwargs` is non-empty;
|
|
358
|
+
otherwise an empty string so callers can unconditionally concatenate.
|
|
359
|
+
"""
|
|
360
|
+
if not extra_kwargs:
|
|
361
|
+
return ""
|
|
362
|
+
return f" with model params {json.dumps(extra_kwargs, sort_keys=True)}"
|
|
363
|
+
|
|
364
|
+
|
|
350
365
|
InputMode = Literal["normal", "shell", "command"]
|
|
351
366
|
|
|
352
367
|
_TYPING_IDLE_THRESHOLD_SECONDS: float = 2.0
|
|
@@ -6703,7 +6718,19 @@ class DeepAgentsApp(App):
|
|
|
6703
6718
|
not provider or provider == settings.model_provider
|
|
6704
6719
|
):
|
|
6705
6720
|
current = f"{settings.model_provider}:{settings.model_name}"
|
|
6706
|
-
|
|
6721
|
+
# Mirror the regular-switch path so `--model-params` semantics
|
|
6722
|
+
# are consistent across same-model and different-model cases:
|
|
6723
|
+
# passing params applies them, omitting params clears any
|
|
6724
|
+
# prior per-session override.
|
|
6725
|
+
self._model_override = current
|
|
6726
|
+
self._model_params_override = extra_kwargs
|
|
6727
|
+
params_suffix = _format_model_params(extra_kwargs)
|
|
6728
|
+
await self._mount_message(
|
|
6729
|
+
AppMessage(f"Already using {current}{params_suffix}")
|
|
6730
|
+
)
|
|
6731
|
+
logger.info(
|
|
6732
|
+
"Model unchanged (%s); model_params=%s", current, extra_kwargs
|
|
6733
|
+
)
|
|
6707
6734
|
return
|
|
6708
6735
|
|
|
6709
6736
|
# Build the provider:model spec for the configurable middleware.
|
|
@@ -6744,8 +6771,15 @@ class DeepAgentsApp(App):
|
|
|
6744
6771
|
)
|
|
6745
6772
|
)
|
|
6746
6773
|
else:
|
|
6747
|
-
|
|
6748
|
-
|
|
6774
|
+
params_suffix = _format_model_params(extra_kwargs)
|
|
6775
|
+
await self._mount_message(
|
|
6776
|
+
AppMessage(f"Switched to {display}{params_suffix}")
|
|
6777
|
+
)
|
|
6778
|
+
logger.info(
|
|
6779
|
+
"Model switched to %s (via configurable middleware); model_params=%s",
|
|
6780
|
+
display,
|
|
6781
|
+
extra_kwargs,
|
|
6782
|
+
)
|
|
6749
6783
|
|
|
6750
6784
|
# Anchor to bottom so the confirmation message is visible
|
|
6751
6785
|
with suppress(NoMatches, ScreenStackError):
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "deepagents-cli"
|
|
7
|
-
version = "0.0.
|
|
7
|
+
version = "0.0.48"
|
|
8
8
|
description = "Terminal interface for Deep Agents - interactive AI agent with file operations, shell access, and sub-agent capabilities."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "MIT" }
|
|
@@ -26,7 +26,7 @@ classifiers = [
|
|
|
26
26
|
]
|
|
27
27
|
dependencies = [
|
|
28
28
|
# Framework
|
|
29
|
-
"deepagents==0.5.
|
|
29
|
+
"deepagents==0.5.6",
|
|
30
30
|
"langchain>=1.2.15,<2.0.0",
|
|
31
31
|
"langgraph>=1.1.6,<2.0.0",
|
|
32
32
|
"langgraph-checkpoint-sqlite>=3.0.0,<4.0.0",
|
|
@@ -138,7 +138,7 @@ test = [
|
|
|
138
138
|
"pytest>=8.3.4,<10.0.0",
|
|
139
139
|
"pytest-asyncio>=0.25.3,<2.0.0",
|
|
140
140
|
"pytest-benchmark>=5.1.0,<6.0.0",
|
|
141
|
-
"pytest-codspeed>=4.
|
|
141
|
+
"pytest-codspeed>=4.4.0,<5.0.0",
|
|
142
142
|
"pytest-cov>=6.0.0,<8.0.0",
|
|
143
143
|
"pytest-mock>=3.14.0,<4.0.0",
|
|
144
144
|
"pytest-socket>=0.7.0,<1.0.0",
|
|
@@ -7,7 +7,11 @@ from unittest.mock import AsyncMock, Mock, patch
|
|
|
7
7
|
import pytest
|
|
8
8
|
|
|
9
9
|
from deepagents_cli import model_config
|
|
10
|
-
from deepagents_cli.app import
|
|
10
|
+
from deepagents_cli.app import (
|
|
11
|
+
DeepAgentsApp,
|
|
12
|
+
_extract_model_params_flag,
|
|
13
|
+
_format_model_params,
|
|
14
|
+
)
|
|
11
15
|
from deepagents_cli.config import settings
|
|
12
16
|
from deepagents_cli.model_config import ModelSpec, clear_caches
|
|
13
17
|
from deepagents_cli.remote_client import RemoteAgent
|
|
@@ -97,6 +101,41 @@ def mock_create_model() -> Iterator[Mock]:
|
|
|
97
101
|
yield mock
|
|
98
102
|
|
|
99
103
|
|
|
104
|
+
class TestFormatModelParams:
|
|
105
|
+
"""Tests for the `_format_model_params` rendering helper."""
|
|
106
|
+
|
|
107
|
+
def test_none_returns_empty_string(self) -> None:
|
|
108
|
+
"""`None` produces no suffix so callers can concatenate unconditionally."""
|
|
109
|
+
assert _format_model_params(None) == ""
|
|
110
|
+
|
|
111
|
+
def test_empty_dict_returns_empty_string(self) -> None:
|
|
112
|
+
"""An empty dict has no params worth echoing — collapse to empty."""
|
|
113
|
+
assert _format_model_params({}) == ""
|
|
114
|
+
|
|
115
|
+
def test_single_key_renders_with_leading_space(self) -> None:
|
|
116
|
+
"""Single key renders as a space-prefixed suffix that callers append."""
|
|
117
|
+
assert _format_model_params({"num_ctx": 16384}) == (
|
|
118
|
+
' with model params {"num_ctx": 16384}'
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
def test_keys_are_sorted_regardless_of_insertion_order(self) -> None:
|
|
122
|
+
"""`sort_keys=True` must produce stable output across call sites and dicts.
|
|
123
|
+
|
|
124
|
+
Insertion-reversed keys would render in insertion order without
|
|
125
|
+
`sort_keys=True`, so this test would fail if the flag were dropped.
|
|
126
|
+
"""
|
|
127
|
+
params = {"temperature": 0.2, "num_ctx": 16384}
|
|
128
|
+
assert _format_model_params(params) == (
|
|
129
|
+
' with model params {"num_ctx": 16384, "temperature": 0.2}'
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
def test_string_values_are_json_escaped(self) -> None:
|
|
133
|
+
"""Values containing quotes must be JSON-escaped, not interpolated raw."""
|
|
134
|
+
assert _format_model_params({"stop": '"end"'}) == (
|
|
135
|
+
' with model params {"stop": "\\"end\\""}'
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
|
|
100
139
|
class TestModelSwitchNoOp:
|
|
101
140
|
"""Tests for no-op when switching to the same model."""
|
|
102
141
|
|
|
@@ -141,6 +180,77 @@ class TestModelSwitchNoOp:
|
|
|
141
180
|
assert "Switched to" not in captured_messages[0]
|
|
142
181
|
assert app._model_switching is False
|
|
143
182
|
|
|
183
|
+
async def test_same_model_with_new_params_applies_overrides(self) -> None:
|
|
184
|
+
"""`/model <current> --model-params {...}` should apply params per-session.
|
|
185
|
+
|
|
186
|
+
Regression test for the bug where the early return on the
|
|
187
|
+
already-active-model branch silently dropped `--model-params`,
|
|
188
|
+
leaving `_model_params_override` unset.
|
|
189
|
+
"""
|
|
190
|
+
app = DeepAgentsApp()
|
|
191
|
+
app._mount_message = AsyncMock() # type: ignore[method-assign]
|
|
192
|
+
app._agent = _make_remote_agent()
|
|
193
|
+
|
|
194
|
+
settings.model_name = "claude-opus-4-5"
|
|
195
|
+
settings.model_provider = "anthropic"
|
|
196
|
+
|
|
197
|
+
captured_messages: list[str] = []
|
|
198
|
+
original_init = AppMessage.__init__
|
|
199
|
+
|
|
200
|
+
def capture_init(self: AppMessage, message: str, **kwargs: Any) -> None:
|
|
201
|
+
captured_messages.append(message)
|
|
202
|
+
original_init(self, message, **kwargs)
|
|
203
|
+
|
|
204
|
+
with (
|
|
205
|
+
patch(
|
|
206
|
+
"deepagents_cli.model_config.has_provider_credentials",
|
|
207
|
+
return_value=True,
|
|
208
|
+
),
|
|
209
|
+
patch.object(AppMessage, "__init__", capture_init),
|
|
210
|
+
):
|
|
211
|
+
await app._switch_model(
|
|
212
|
+
"anthropic:claude-opus-4-5",
|
|
213
|
+
extra_kwargs={"num_ctx": 16384, "temperature": 0.2},
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
assert app._model_override == "anthropic:claude-opus-4-5"
|
|
217
|
+
assert app._model_params_override == {
|
|
218
|
+
"num_ctx": 16384,
|
|
219
|
+
"temperature": 0.2,
|
|
220
|
+
}
|
|
221
|
+
assert len(captured_messages) == 1
|
|
222
|
+
message = captured_messages[0]
|
|
223
|
+
assert message.startswith("Already using anthropic:claude-opus-4-5")
|
|
224
|
+
# Stable, key-sorted JSON in the echoed suffix.
|
|
225
|
+
assert 'with model params {"num_ctx": 16384, "temperature": 0.2}' in message
|
|
226
|
+
|
|
227
|
+
async def test_same_model_without_params_clears_prior_override(self) -> None:
|
|
228
|
+
"""Re-selecting the same model with no params must clear stale params.
|
|
229
|
+
|
|
230
|
+
Regression test for the asymmetry where the regular-switch path always
|
|
231
|
+
wrote `_model_params_override = extra_kwargs` (clearing on `None`) but
|
|
232
|
+
the already-active branch left previously-set params in place.
|
|
233
|
+
"""
|
|
234
|
+
app = DeepAgentsApp()
|
|
235
|
+
app._mount_message = AsyncMock() # type: ignore[method-assign]
|
|
236
|
+
app._agent = _make_remote_agent()
|
|
237
|
+
|
|
238
|
+
settings.model_name = "claude-opus-4-5"
|
|
239
|
+
settings.model_provider = "anthropic"
|
|
240
|
+
|
|
241
|
+
# Simulate a prior `/model <current> --model-params {...}` call.
|
|
242
|
+
app._model_override = "anthropic:claude-opus-4-5"
|
|
243
|
+
app._model_params_override = {"num_ctx": 16384}
|
|
244
|
+
|
|
245
|
+
with patch(
|
|
246
|
+
"deepagents_cli.model_config.has_provider_credentials",
|
|
247
|
+
return_value=True,
|
|
248
|
+
):
|
|
249
|
+
await app._switch_model("anthropic:claude-opus-4-5")
|
|
250
|
+
|
|
251
|
+
assert app._model_override == "anthropic:claude-opus-4-5"
|
|
252
|
+
assert app._model_params_override is None
|
|
253
|
+
|
|
144
254
|
|
|
145
255
|
class TestModelSwitchErrorHandling:
|
|
146
256
|
"""Tests for error handling in _switch_model."""
|
|
@@ -320,6 +430,41 @@ class TestModelSwitchErrorHandling:
|
|
|
320
430
|
"max_tokens": 1024,
|
|
321
431
|
}
|
|
322
432
|
|
|
433
|
+
async def test_switched_to_message_echoes_params(self) -> None:
|
|
434
|
+
"""The 'Switched to' confirmation should echo `--model-params`."""
|
|
435
|
+
app = DeepAgentsApp()
|
|
436
|
+
app._mount_message = AsyncMock() # type: ignore[method-assign]
|
|
437
|
+
app._agent = _make_remote_agent()
|
|
438
|
+
|
|
439
|
+
settings.model_name = "gpt-4o"
|
|
440
|
+
settings.model_provider = "openai"
|
|
441
|
+
|
|
442
|
+
captured_messages: list[str] = []
|
|
443
|
+
original_init = AppMessage.__init__
|
|
444
|
+
|
|
445
|
+
def capture_init(self: AppMessage, message: str, **kwargs: Any) -> None:
|
|
446
|
+
captured_messages.append(message)
|
|
447
|
+
original_init(self, message, **kwargs)
|
|
448
|
+
|
|
449
|
+
with (
|
|
450
|
+
patch(
|
|
451
|
+
"deepagents_cli.model_config.has_provider_credentials",
|
|
452
|
+
return_value=True,
|
|
453
|
+
),
|
|
454
|
+
patch("deepagents_cli.model_config.save_recent_model", return_value=True),
|
|
455
|
+
patch.object(AppMessage, "__init__", capture_init),
|
|
456
|
+
):
|
|
457
|
+
await app._switch_model(
|
|
458
|
+
"anthropic:claude-sonnet-4-5",
|
|
459
|
+
extra_kwargs={"temperature": 0.7, "num_ctx": 16384},
|
|
460
|
+
)
|
|
461
|
+
|
|
462
|
+
assert any(
|
|
463
|
+
m == "Switched to anthropic:claude-sonnet-4-5 with model params "
|
|
464
|
+
'{"num_ctx": 16384, "temperature": 0.7}'
|
|
465
|
+
for m in captured_messages
|
|
466
|
+
)
|
|
467
|
+
|
|
323
468
|
|
|
324
469
|
class TestModelSwitchConcurrencyGuard:
|
|
325
470
|
"""Tests for _model_switching concurrency guard."""
|
|
@@ -967,7 +967,7 @@ wheels = [
|
|
|
967
967
|
|
|
968
968
|
[[package]]
|
|
969
969
|
name = "deepagents"
|
|
970
|
-
version = "0.5.
|
|
970
|
+
version = "0.5.6"
|
|
971
971
|
source = { editable = "../deepagents" }
|
|
972
972
|
dependencies = [
|
|
973
973
|
{ name = "langchain" },
|
|
@@ -996,7 +996,7 @@ test = [
|
|
|
996
996
|
{ name = "pytest" },
|
|
997
997
|
{ name = "pytest-asyncio", specifier = ">=1.3.0" },
|
|
998
998
|
{ name = "pytest-benchmark" },
|
|
999
|
-
{ name = "pytest-codspeed" },
|
|
999
|
+
{ name = "pytest-codspeed", specifier = ">=4.4.0,<5.0.0" },
|
|
1000
1000
|
{ name = "pytest-cov" },
|
|
1001
1001
|
{ name = "pytest-socket" },
|
|
1002
1002
|
{ name = "pytest-timeout", specifier = ">=2.3.1,<3.0.0" },
|
|
@@ -1023,7 +1023,7 @@ wheels = [
|
|
|
1023
1023
|
|
|
1024
1024
|
[[package]]
|
|
1025
1025
|
name = "deepagents-cli"
|
|
1026
|
-
version = "0.0.
|
|
1026
|
+
version = "0.0.48"
|
|
1027
1027
|
source = { editable = "." }
|
|
1028
1028
|
dependencies = [
|
|
1029
1029
|
{ name = "aiosqlite" },
|
|
@@ -1240,7 +1240,7 @@ test = [
|
|
|
1240
1240
|
{ name = "pytest", specifier = ">=8.3.4,<10.0.0" },
|
|
1241
1241
|
{ name = "pytest-asyncio", specifier = ">=0.25.3,<2.0.0" },
|
|
1242
1242
|
{ name = "pytest-benchmark", specifier = ">=5.1.0,<6.0.0" },
|
|
1243
|
-
{ name = "pytest-codspeed", specifier = ">=4.
|
|
1243
|
+
{ name = "pytest-codspeed", specifier = ">=4.4.0,<5.0.0" },
|
|
1244
1244
|
{ name = "pytest-cov", specifier = ">=6.0.0,<8.0.0" },
|
|
1245
1245
|
{ name = "pytest-mock", specifier = ">=3.14.0,<4.0.0" },
|
|
1246
1246
|
{ name = "pytest-socket", specifier = ">=0.7.0,<1.0.0" },
|
|
@@ -4749,26 +4749,31 @@ wheels = [
|
|
|
4749
4749
|
|
|
4750
4750
|
[[package]]
|
|
4751
4751
|
name = "pytest-codspeed"
|
|
4752
|
-
version = "4.
|
|
4752
|
+
version = "4.5.0"
|
|
4753
4753
|
source = { registry = "https://pypi.org/simple" }
|
|
4754
4754
|
dependencies = [
|
|
4755
4755
|
{ name = "cffi" },
|
|
4756
4756
|
{ name = "pytest" },
|
|
4757
4757
|
{ name = "rich" },
|
|
4758
4758
|
]
|
|
4759
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
4760
|
-
wheels = [
|
|
4761
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
4762
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
4763
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
4764
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
4765
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
4766
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
4767
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
4768
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
4769
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
4770
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
4771
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
4759
|
+
sdist = { url = "https://files.pythonhosted.org/packages/9e/1e/213eb4d263140fb907e9fcc5813fdcadb864d6832bf8e2d3f7fd88ca0096/pytest_codspeed-4.5.0.tar.gz", hash = "sha256:deb6ab9c9b07eba56fcb7b97206c7e48aaff697b6f73a013d8dbe4f62e76afd3", size = 209664, upload-time = "2026-04-28T13:12:17.726Z" }
|
|
4760
|
+
wheels = [
|
|
4761
|
+
{ url = "https://files.pythonhosted.org/packages/60/f9/be1fa43649c9f71cc06d9f2330fb1cac3beddf6357effc9a1817f4831728/pytest_codspeed-4.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6da6f26435512110736dd258021bbf7859caf4d2a21c7ed06a86b67a999fac7", size = 222523, upload-time = "2026-04-28T13:11:54.638Z" },
|
|
4762
|
+
{ url = "https://files.pythonhosted.org/packages/b3/89/9237a2d569b60f84183f6ae6193c6a4a135e5644ee08fed44bcf03d26545/pytest_codspeed-4.5.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be191120b1cb0252b443ef37887c94772bab4ca0c42cad7c15bcbcfcbb656ac4", size = 822696, upload-time = "2026-04-28T13:11:55.811Z" },
|
|
4763
|
+
{ url = "https://files.pythonhosted.org/packages/c7/15/7dd0a37fb85e19d8b2b7366f9615c4e17335f23060275dcfa792ce8b482f/pytest_codspeed-4.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:474730e996d424b17f7301d4b846261cca92d195b9fcb7de38599be9d68ee9ac", size = 823671, upload-time = "2026-04-28T13:11:57.147Z" },
|
|
4764
|
+
{ url = "https://files.pythonhosted.org/packages/6e/3d/bf21b10c6d497378785b47e9cefcfc4a43e543443e120c03469940f14a61/pytest_codspeed-4.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db706a7a4200e8e236c31c77935fedcc0edbf44959ab8c156297909d9e8cfd33", size = 222601, upload-time = "2026-04-28T13:11:58.24Z" },
|
|
4765
|
+
{ url = "https://files.pythonhosted.org/packages/bc/65/97823f28ae60921bf353773490906f9095e9d208a6d4bec2e7913695a5e6/pytest_codspeed-4.5.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac844078bd8760e7fc66debe1e90b4593dfce15f60f26b334e1137d4902df3a9", size = 822916, upload-time = "2026-04-28T13:11:59.648Z" },
|
|
4766
|
+
{ url = "https://files.pythonhosted.org/packages/95/10/4763d26e8255f243c96e39543d398afb2c64900d3785b8af1898b23a6ce0/pytest_codspeed-4.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:66ecd52a277a5e5f0013e29084b49f9c5f60026d0585f58b86463cb188df5029", size = 823963, upload-time = "2026-04-28T13:12:00.976Z" },
|
|
4767
|
+
{ url = "https://files.pythonhosted.org/packages/5b/7b/8108a06fcad6160759efc0a1d44e359414a4d23e52bb7079ca95be24058e/pytest_codspeed-4.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fcc3309d046082a6e0dbd1d9f2bc5c83b0446c93ff011e3880b47c69bf8042cf", size = 222602, upload-time = "2026-04-28T13:12:01.974Z" },
|
|
4768
|
+
{ url = "https://files.pythonhosted.org/packages/28/b4/4a43ce824cabe2ab8a727e31f90aa403dd2cd580576057024065a3ea74a3/pytest_codspeed-4.5.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:12b49954268ed6828ce5a8d87aff13888946c254bff4ef9472bb4d5ae5272667", size = 822868, upload-time = "2026-04-28T13:12:02.988Z" },
|
|
4769
|
+
{ url = "https://files.pythonhosted.org/packages/54/f0/a319da002c800915b9f6a63b2da1e6cdd3230cafb9dea255cec4033e85f8/pytest_codspeed-4.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cbeeb76d98335037670068c0d30319415f896e9c37eca510249b74684b460925", size = 823928, upload-time = "2026-04-28T13:12:04.467Z" },
|
|
4770
|
+
{ url = "https://files.pythonhosted.org/packages/da/5b/d46caecce8aa7519477df75351e312203a20836bec2fcc15256ec34c001b/pytest_codspeed-4.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1b73f71e7cb5c83cf5d765d5ca39d08bb1090a9d2d2268496a22ca24b1776e3a", size = 222618, upload-time = "2026-04-28T13:12:05.482Z" },
|
|
4771
|
+
{ url = "https://files.pythonhosted.org/packages/81/1d/8f34de29cfc3516df25a4553a6d7912735fbde9a276d448b1e00eb35a345/pytest_codspeed-4.5.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:399e146240a52458aa4b5fc861a88551bc52eb9e2d30c8f8b328ddebc084e4f6", size = 822814, upload-time = "2026-04-28T13:12:06.425Z" },
|
|
4772
|
+
{ url = "https://files.pythonhosted.org/packages/75/3d/089614f7bd75fee1388885b886c3f6c1a332ffdce28a4b6b77d3aac7014f/pytest_codspeed-4.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2d4b43f59d1c31e7c193567369f767647e466f95126671c90be084c58633544f", size = 823857, upload-time = "2026-04-28T13:12:08.081Z" },
|
|
4773
|
+
{ url = "https://files.pythonhosted.org/packages/df/69/5f4a032df6508e8c59049b2fcfce568b79e40b82878df12a2e401a034336/pytest_codspeed-4.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4ef8651294386c032d86070893f8349929280162cf22210dbd488697ce26de21", size = 222781, upload-time = "2026-04-28T13:12:09.448Z" },
|
|
4774
|
+
{ url = "https://files.pythonhosted.org/packages/63/42/86a1efde2968bfc83e4fcd60ef1a1094be7f83460799296a12d563522a67/pytest_codspeed-4.5.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ca31f5d0e783823a78442d5434382eb32f3885153d1833eb645c92d0c499470b", size = 828703, upload-time = "2026-04-28T13:12:10.502Z" },
|
|
4775
|
+
{ url = "https://files.pythonhosted.org/packages/58/4e/eae070c50cb82e44f831dd5b24c854cb641906732bdf74f6314e71c1f266/pytest_codspeed-4.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:16ddd1a9f2dc0615479b2ba3f445a2e3587ce1316296fc79224700e73db06408", size = 829278, upload-time = "2026-04-28T13:12:11.879Z" },
|
|
4776
|
+
{ url = "https://files.pythonhosted.org/packages/a3/2d/8dd5e44a5518ba3cd1d63d1f2e631e318330d28cfbe15e548e89d429e289/pytest_codspeed-4.5.0-py3-none-any.whl", hash = "sha256:b19bfb734dcbd47b78022285a6eb9f2bf6331ef1bb8c15c2775058945d5f4ce3", size = 214090, upload-time = "2026-04-28T13:12:16.755Z" },
|
|
4772
4777
|
]
|
|
4773
4778
|
|
|
4774
4779
|
[[package]]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/built_in_skills/remember/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/index.html
RENAMED
|
File without changes
|
{deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/logo-dark.svg
RENAMED
|
File without changes
|
{deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/logo-light.svg
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/integrations/sandbox_factory.py
RENAMED
|
File without changes
|
{deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/integrations/sandbox_provider.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|