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.
Files changed (274) hide show
  1. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/CHANGELOG.md +6 -0
  2. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/Makefile +7 -1
  3. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/PKG-INFO +2 -2
  4. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_version.py +1 -1
  5. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/app.py +37 -3
  6. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/pyproject.toml +3 -3
  7. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_model_switch.py +146 -1
  8. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/uv.lock +23 -18
  9. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/.gitignore +0 -0
  10. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/DEV.md +0 -0
  11. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/README.md +0 -0
  12. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/THREAT_MODEL.md +0 -0
  13. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/__init__.py +0 -0
  14. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/__main__.py +0 -0
  15. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_ask_user_types.py +0 -0
  16. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_cli_context.py +0 -0
  17. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_debug.py +0 -0
  18. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_env_vars.py +0 -0
  19. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_git.py +0 -0
  20. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_server_config.py +0 -0
  21. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_session_stats.py +0 -0
  22. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_testing_models.py +0 -0
  23. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/_textual_patches.py +0 -0
  24. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/agent.py +0 -0
  25. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/app.tcss +0 -0
  26. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/ask_user.py +0 -0
  27. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/built_in_skills/__init__.py +0 -0
  28. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/built_in_skills/remember/SKILL.md +0 -0
  29. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/built_in_skills/skill-creator/SKILL.md +0 -0
  30. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  31. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  32. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/clipboard.py +0 -0
  33. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/command_registry.py +0 -0
  34. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/config.py +0 -0
  35. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/configurable_model.py +0 -0
  36. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/default_agent_prompt.md +0 -0
  37. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/__init__.py +0 -0
  38. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/bundler.py +0 -0
  39. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/commands.py +0 -0
  40. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/config.py +0 -0
  41. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/assets/anonymous-B9UzAXQd.js +0 -0
  42. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/assets/clerk-5xHgyQyG.js +0 -0
  43. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/assets/highlighted-body-OFNGDK62-rX-7qT8o.js +0 -0
  44. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/assets/index-DM3gptpu.js +0 -0
  45. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/assets/index-Ddy7F6KI.css +0 -0
  46. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/assets/supabase-S6NACDgm.js +0 -0
  47. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/index.html +0 -0
  48. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/logo-dark.svg +0 -0
  49. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/frontend_dist/logo-light.svg +0 -0
  50. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/deploy/templates.py +0 -0
  51. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/editor.py +0 -0
  52. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/extras_info.py +0 -0
  53. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/file_ops.py +0 -0
  54. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/formatting.py +0 -0
  55. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/hooks.py +0 -0
  56. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/input.py +0 -0
  57. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/integrations/__init__.py +0 -0
  58. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/integrations/sandbox_factory.py +0 -0
  59. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/integrations/sandbox_provider.py +0 -0
  60. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/local_context.py +0 -0
  61. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/main.py +0 -0
  62. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_auth.py +0 -0
  63. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_commands.py +0 -0
  64. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_providers/__init__.py +0 -0
  65. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_providers/_registry.py +0 -0
  66. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_providers/base.py +0 -0
  67. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_providers/github.py +0 -0
  68. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_providers/slack.py +0 -0
  69. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_tools.py +0 -0
  70. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/mcp_trust.py +0 -0
  71. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/media_utils.py +0 -0
  72. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/model_config.py +0 -0
  73. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/non_interactive.py +0 -0
  74. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/notifications.py +0 -0
  75. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/offload.py +0 -0
  76. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/output.py +0 -0
  77. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/project_utils.py +0 -0
  78. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/py.typed +0 -0
  79. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/remote_client.py +0 -0
  80. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/server.py +0 -0
  81. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/server_graph.py +0 -0
  82. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/server_manager.py +0 -0
  83. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/sessions.py +0 -0
  84. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/skills/__init__.py +0 -0
  85. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/skills/commands.py +0 -0
  86. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/skills/invocation.py +0 -0
  87. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/skills/load.py +0 -0
  88. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/subagents.py +0 -0
  89. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/system_prompt.md +0 -0
  90. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/terminal_capabilities.py +0 -0
  91. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/textual_adapter.py +0 -0
  92. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/theme.py +0 -0
  93. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/token_state.py +0 -0
  94. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/tool_display.py +0 -0
  95. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/tools.py +0 -0
  96. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/ui.py +0 -0
  97. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/unicode_security.py +0 -0
  98. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/update_check.py +0 -0
  99. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/__init__.py +0 -0
  100. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/_links.py +0 -0
  101. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/agent_selector.py +0 -0
  102. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/approval.py +0 -0
  103. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/ask_user.py +0 -0
  104. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/autocomplete.py +0 -0
  105. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/chat_input.py +0 -0
  106. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/diff.py +0 -0
  107. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/history.py +0 -0
  108. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/loading.py +0 -0
  109. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/mcp_viewer.py +0 -0
  110. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/message_store.py +0 -0
  111. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/messages.py +0 -0
  112. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/model_selector.py +0 -0
  113. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/notification_center.py +0 -0
  114. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/notification_detail.py +0 -0
  115. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/notification_settings.py +0 -0
  116. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/status.py +0 -0
  117. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/theme_selector.py +0 -0
  118. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/thread_selector.py +0 -0
  119. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/tool_renderers.py +0 -0
  120. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/tool_widgets.py +0 -0
  121. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/update_available.py +0 -0
  122. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/deepagents_cli/widgets/welcome.py +0 -0
  123. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/deploy-content-writer/.env.example +0 -0
  124. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/deploy-content-writer/skills/blog-post/SKILL.md +0 -0
  125. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/deploy-content-writer/skills/social-media/SKILL.md +0 -0
  126. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/deploy-content-writer/user/context.md +0 -0
  127. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/deploy-content-writer/user/preferences.md +0 -0
  128. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/skills/arxiv-search/SKILL.md +0 -0
  129. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  130. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/skills/langgraph-docs/SKILL.md +0 -0
  131. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/skills/skill-creator/SKILL.md +0 -0
  132. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  133. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  134. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/examples/skills/web-research/SKILL.md +0 -0
  135. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/.nvmrc +0 -0
  136. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/index.html +0 -0
  137. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/package-lock.json +0 -0
  138. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/package.json +0 -0
  139. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/postcss.config.js +0 -0
  140. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/public/logo-dark.svg +0 -0
  141. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/public/logo-light.svg +0 -0
  142. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/App.tsx +0 -0
  143. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/ThemeProvider.tsx +0 -0
  144. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/auth/anonymous.tsx +0 -0
  145. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/auth/clerk.tsx +0 -0
  146. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/auth/loader.tsx +0 -0
  147. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/auth/supabase.tsx +0 -0
  148. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/auth/types.ts +0 -0
  149. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/AppHeader.tsx +0 -0
  150. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/FilePanels.tsx +0 -0
  151. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/MessageList.tsx +0 -0
  152. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/SubagentActivity.tsx +0 -0
  153. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/ThreadPicker.tsx +0 -0
  154. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/TodosPanel.tsx +0 -0
  155. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/ToolCallCard.tsx +0 -0
  156. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/toolcalls/FileToolCard.tsx +0 -0
  157. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/toolcalls/SearchCard.tsx +0 -0
  158. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/toolcalls/ThinkCard.tsx +0 -0
  159. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/toolcalls/TodosCard.tsx +0 -0
  160. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/components/toolcalls/index.ts +0 -0
  161. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/constants.ts +0 -0
  162. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/index.css +0 -0
  163. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/main.tsx +0 -0
  164. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/runtimeConfig.ts +0 -0
  165. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/types.ts +0 -0
  166. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/src/vite-env.d.ts +0 -0
  167. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/tsconfig.json +0 -0
  168. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/frontend/vite.config.ts +0 -0
  169. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/images/cli.png +0 -0
  170. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/scripts/check_imports.py +0 -0
  171. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/scripts/debug_server.sh +0 -0
  172. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/scripts/install.sh +0 -0
  173. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/README.md +0 -0
  174. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/__init__.py +0 -0
  175. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/benchmarks/__init__.py +0 -0
  176. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  177. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  178. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/conftest.py +0 -0
  179. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/test_acp_mode.py +0 -0
  180. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/test_compact_resume.py +0 -0
  181. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/test_sandbox_factory.py +0 -0
  182. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/integration_tests/test_sandbox_operations.py +0 -0
  183. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/__init__.py +0 -0
  184. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/conftest.py +0 -0
  185. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/deploy/__init__.py +0 -0
  186. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/deploy/test_bundler.py +0 -0
  187. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/deploy/test_commands.py +0 -0
  188. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/deploy/test_config.py +0 -0
  189. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/deploy/test_frontend_bundle.py +0 -0
  190. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/deploy/test_frontend_config.py +0 -0
  191. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/skills/__init__.py +0 -0
  192. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/skills/test_commands.py +0 -0
  193. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/skills/test_load.py +0 -0
  194. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/skills/test_skills_json.py +0 -0
  195. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_agent.py +0 -0
  196. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_agent_friendly.py +0 -0
  197. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_agent_selector.py +0 -0
  198. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_app.py +0 -0
  199. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_approval.py +0 -0
  200. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_args.py +0 -0
  201. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_ask_user.py +0 -0
  202. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  203. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_autocomplete.py +0 -0
  204. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_charset.py +0 -0
  205. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_chat_input.py +0 -0
  206. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_command_registry.py +0 -0
  207. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_compact_tool.py +0 -0
  208. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_config.py +0 -0
  209. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_configurable_model.py +0 -0
  210. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_debug.py +0 -0
  211. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_editor.py +0 -0
  212. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_end_to_end.py +0 -0
  213. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_env_vars.py +0 -0
  214. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_exception_handling.py +0 -0
  215. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_extras_info.py +0 -0
  216. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_file_ops.py +0 -0
  217. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_formatting.py +0 -0
  218. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_git.py +0 -0
  219. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_history.py +0 -0
  220. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_hooks.py +0 -0
  221. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_imports.py +0 -0
  222. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_input_parsing.py +0 -0
  223. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_links.py +0 -0
  224. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_loading.py +0 -0
  225. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_local_context.py +0 -0
  226. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_main.py +0 -0
  227. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_main_acp_mode.py +0 -0
  228. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_main_args.py +0 -0
  229. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_mcp_auth.py +0 -0
  230. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_mcp_commands.py +0 -0
  231. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_mcp_tools.py +0 -0
  232. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_mcp_trust.py +0 -0
  233. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_mcp_viewer.py +0 -0
  234. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_media_utils.py +0 -0
  235. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_message_store.py +0 -0
  236. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_messages.py +0 -0
  237. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_model_config.py +0 -0
  238. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_model_selector.py +0 -0
  239. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_non_interactive.py +0 -0
  240. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_notification_center.py +0 -0
  241. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_notification_detail.py +0 -0
  242. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_notifications.py +0 -0
  243. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_offload.py +0 -0
  244. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_offload_dict_messages.py +0 -0
  245. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_output.py +0 -0
  246. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_reload.py +0 -0
  247. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_remote_client.py +0 -0
  248. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_sandbox_factory.py +0 -0
  249. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_server.py +0 -0
  250. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_server_config.py +0 -0
  251. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_server_graph.py +0 -0
  252. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_server_helpers.py +0 -0
  253. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_server_manager.py +0 -0
  254. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_session_stats.py +0 -0
  255. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_sessions.py +0 -0
  256. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_shell_allow_list.py +0 -0
  257. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_skill_invocation.py +0 -0
  258. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_status.py +0 -0
  259. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_subagents.py +0 -0
  260. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  261. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_textual_adapter.py +0 -0
  262. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_textual_patches.py +0 -0
  263. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_theme.py +0 -0
  264. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_thread_selector.py +0 -0
  265. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_token_tracker.py +0 -0
  266. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_tool_display.py +0 -0
  267. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_ui.py +0 -0
  268. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_unicode_security.py +0 -0
  269. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_update_available.py +0 -0
  270. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_update_check.py +0 -0
  271. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_version.py +0 -0
  272. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/test_welcome.py +0 -0
  273. {deepagents_cli-0.0.47 → deepagents_cli-0.0.48}/tests/unit_tests/tools/__init__.py +0 -0
  274. {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.47
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.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.47" # x-release-please-version
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
- await self._mount_message(AppMessage(f"Already using {current}"))
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
- await self._mount_message(AppMessage(f"Switched to {display}"))
6748
- logger.info("Model switched to %s (via configurable middleware)", display)
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.47"
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.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.0.0,<5.0.0",
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 DeepAgentsApp, _extract_model_params_flag
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.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.47"
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.0.0,<5.0.0" },
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.3.0"
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/98/ab/eca41967d11c95392829a8b4bfa9220a51cffc4a33ec4653358000356918/pytest_codspeed-4.3.0.tar.gz", hash = "sha256:5230d9d65f39063a313ed1820df775166227ec5c20a1122968f85653d5efee48", size = 124745, upload-time = "2026-02-09T15:23:34.745Z" }
4760
- wheels = [
4761
- { url = "https://files.pythonhosted.org/packages/d9/15/ec0ac1f022173b3134c9638f2a35f21fbb3142c75da066d9e49e5a8bb4bd/pytest_codspeed-4.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dbeff1eb2f2e36df088658b556fa993e6937bf64ffb07406de4db16fd2b26874", size = 347076, upload-time = "2026-02-09T15:23:19.989Z" },
4762
- { url = "https://files.pythonhosted.org/packages/a5/e8/1fe375794ad02b7835f378a7bcfa8fbac9acadefe600a782a7c4a7064db7/pytest_codspeed-4.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:878aad5e4bb7b401ad8d82f3af5186030cd2bd0d0446782e10dabb9db8827466", size = 342215, upload-time = "2026-02-09T15:23:20.954Z" },
4763
- { url = "https://files.pythonhosted.org/packages/09/58/50df94e9a78e1c77818a492c90557eeb1309af025120c9a21e6375950c52/pytest_codspeed-4.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527a3a02eaa3e4d4583adc4ba2327eef79628f3e1c682a4b959439551a72588e", size = 347395, upload-time = "2026-02-09T15:23:21.986Z" },
4764
- { url = "https://files.pythonhosted.org/packages/e4/56/7dfbd3eefd112a14e6fb65f9ff31dacf2e9c381cb94b27332b81d2b13f8d/pytest_codspeed-4.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9858c2a6e1f391d5696757e7b6e9484749a7376c46f8b4dd9aebf093479a9667", size = 342625, upload-time = "2026-02-09T15:23:23.035Z" },
4765
- { url = "https://files.pythonhosted.org/packages/7f/53/7255f6a25bc56ff1745b254b21545dfe0be2268f5b91ce78f7e8a908f0ad/pytest_codspeed-4.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34f2fd8497456eefbd325673f677ea80d93bb1bc08a578c1fa43a09cec3d1879", size = 347325, upload-time = "2026-02-09T15:23:23.998Z" },
4766
- { url = "https://files.pythonhosted.org/packages/2e/f8/82ae570d8b9ad30f33c9d4002a7a1b2740de0e090540c69a28e4f711ebe2/pytest_codspeed-4.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df6a36a2a9da1406bc50428437f657f0bd8c842ae54bee5fb3ad30e01d50c0f5", size = 342558, upload-time = "2026-02-09T15:23:25.656Z" },
4767
- { url = "https://files.pythonhosted.org/packages/b3/e1/55cfe9474f91d174c7a4b04d257b5fc6d4d06f3d3680f2da672ee59ccc10/pytest_codspeed-4.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bec30f4fc9c4973143cd80f0d33fa780e9fa3e01e4dbe8cedf229e72f1212c62", size = 347383, upload-time = "2026-02-09T15:23:26.68Z" },
4768
- { url = "https://files.pythonhosted.org/packages/7f/3b/8fd781d959bbe789b3de8ce4c50d5706a684a0df377147dfb27b200c20c1/pytest_codspeed-4.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e6584e641cadf27d894ae90b87c50377232a97cbfd76ee0c7ecd0c056fa3f7f4", size = 342481, upload-time = "2026-02-09T15:23:27.686Z" },
4769
- { url = "https://files.pythonhosted.org/packages/bb/0c/368045133c6effa2c665b1634b7b8a9c88b307f877fa31f1f8df47885b51/pytest_codspeed-4.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df0d1f6ea594f29b745c634d66d5f5f1caa1c3abd2af82fea49d656038e8fc77", size = 353680, upload-time = "2026-02-09T15:23:28.726Z" },
4770
- { url = "https://files.pythonhosted.org/packages/59/21/e543abcd72244294e25ae88ec3a9311ade24d6913f8c8f42569d671700bc/pytest_codspeed-4.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2f5bb6d8898bea7db45e3c8b916ee48e36905b929477bb511b79c5a3ccacda4", size = 347888, upload-time = "2026-02-09T15:23:30.443Z" },
4771
- { url = "https://files.pythonhosted.org/packages/55/d9/b8a53c20cf5b41042c205bb9d36d37da00418d30fd1a94bf9eb147820720/pytest_codspeed-4.3.0-py3-none-any.whl", hash = "sha256:05baff2a61dc9f3e92b92b9c2ab5fb45d9b802438f5373073f5766a91319ed7a", size = 125224, upload-time = "2026-02-09T15:23:33.774Z" },
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