deepagents-cli 0.0.55__tar.gz → 0.0.57__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 (300) hide show
  1. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/CHANGELOG.md +28 -0
  2. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/PKG-INFO +4 -1
  3. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/_env_vars.py +16 -0
  4. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/_version.py +1 -1
  5. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/agent.py +8 -9
  6. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/app.py +54 -2
  7. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/app.tcss +7 -0
  8. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/config.py +0 -8
  9. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/deploy/bundler.py +1 -0
  10. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/extras_info.py +1 -0
  11. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/main.py +45 -9
  12. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/non_interactive.py +1 -2
  13. deepagents_cli-0.0.57/deepagents_cli/terminal_escape.py +287 -0
  14. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/textual_adapter.py +60 -11
  15. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/approval.py +182 -21
  16. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/chat_input.py +42 -2
  17. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/message_store.py +5 -0
  18. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/messages.py +69 -11
  19. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/theme_selector.py +17 -1
  20. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/welcome.py +2 -2
  21. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/package-lock.json +87 -152
  22. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/pyproject.toml +3 -2
  23. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/deploy/test_bundler.py +1 -2
  24. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_agent.py +4 -17
  25. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_app.py +252 -0
  26. deepagents_cli-0.0.57/tests/unit_tests/test_approval.py +641 -0
  27. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_chat_input.py +99 -0
  28. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_main.py +289 -0
  29. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_message_store.py +17 -0
  30. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_messages.py +160 -25
  31. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_non_interactive.py +3 -6
  32. deepagents_cli-0.0.57/tests/unit_tests/test_terminal_escape.py +377 -0
  33. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_textual_adapter.py +266 -0
  34. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_theme.py +145 -0
  35. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_token_tracker.py +25 -0
  36. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_welcome.py +3 -0
  37. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/uv.lock +29 -6
  38. deepagents_cli-0.0.55/tests/unit_tests/test_approval.py +0 -345
  39. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/.gitignore +0 -0
  40. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/DEV.md +0 -0
  41. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/Makefile +0 -0
  42. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/README.md +0 -0
  43. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/THREAT_MODEL.md +0 -0
  44. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/__init__.py +0 -0
  45. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/__main__.py +0 -0
  46. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/_ask_user_types.py +0 -0
  47. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/_cli_context.py +0 -0
  48. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/_constants.py +0 -0
  49. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/_debug.py +0 -0
  50. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/_git.py +0 -0
  51. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/_server_config.py +0 -0
  52. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/_session_stats.py +0 -0
  53. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/_testing_models.py +0 -0
  54. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/_textual_patches.py +0 -0
  55. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/ask_user.py +0 -0
  56. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/auth_store.py +0 -0
  57. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/built_in_skills/__init__.py +0 -0
  58. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/built_in_skills/remember/SKILL.md +0 -0
  59. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/built_in_skills/skill-creator/SKILL.md +0 -0
  60. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  61. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  62. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/clipboard.py +0 -0
  63. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/command_registry.py +0 -0
  64. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/configurable_model.py +0 -0
  65. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/default_agent_prompt.md +0 -0
  66. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/deploy/__init__.py +0 -0
  67. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/deploy/commands.py +0 -0
  68. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/deploy/config.py +0 -0
  69. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/deploy/context_hub.py +0 -0
  70. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/deploy/frontend_dist/assets/anonymous-B9UzAXQd.js +0 -0
  71. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/deploy/frontend_dist/assets/clerk-5xHgyQyG.js +0 -0
  72. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/deploy/frontend_dist/assets/highlighted-body-OFNGDK62-rX-7qT8o.js +0 -0
  73. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/deploy/frontend_dist/assets/index-DM3gptpu.js +0 -0
  74. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/deploy/frontend_dist/assets/index-Ddy7F6KI.css +0 -0
  75. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/deploy/frontend_dist/assets/supabase-S6NACDgm.js +0 -0
  76. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/deploy/frontend_dist/index.html +0 -0
  77. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/deploy/frontend_dist/logo-dark.svg +0 -0
  78. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/deploy/frontend_dist/logo-light.svg +0 -0
  79. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/deploy/templates.py +0 -0
  80. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/editor.py +0 -0
  81. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/event_bus.py +0 -0
  82. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/file_ops.py +0 -0
  83. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/formatting.py +0 -0
  84. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/hooks.py +0 -0
  85. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/input.py +0 -0
  86. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/integrations/__init__.py +0 -0
  87. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/integrations/sandbox_factory.py +0 -0
  88. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/integrations/sandbox_provider.py +0 -0
  89. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/iterm_cursor_guide.py +0 -0
  90. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/local_context.py +0 -0
  91. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/mcp_auth.py +0 -0
  92. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/mcp_commands.py +0 -0
  93. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/mcp_providers/__init__.py +0 -0
  94. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/mcp_providers/_registry.py +0 -0
  95. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/mcp_providers/base.py +0 -0
  96. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/mcp_providers/github.py +0 -0
  97. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/mcp_providers/slack.py +0 -0
  98. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/mcp_tools.py +0 -0
  99. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/mcp_trust.py +0 -0
  100. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/media_utils.py +0 -0
  101. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/model_config.py +0 -0
  102. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/notifications.py +0 -0
  103. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/offload.py +0 -0
  104. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/onboarding.py +0 -0
  105. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/output.py +0 -0
  106. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/project_utils.py +0 -0
  107. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/py.typed +0 -0
  108. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/remote_client.py +0 -0
  109. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/server.py +0 -0
  110. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/server_graph.py +0 -0
  111. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/server_manager.py +0 -0
  112. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/sessions.py +0 -0
  113. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/skills/__init__.py +0 -0
  114. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/skills/commands.py +0 -0
  115. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/skills/invocation.py +0 -0
  116. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/skills/load.py +0 -0
  117. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/state_migration.py +0 -0
  118. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/subagents.py +0 -0
  119. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/system_prompt.md +0 -0
  120. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/terminal_capabilities.py +0 -0
  121. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/theme.py +0 -0
  122. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/token_state.py +0 -0
  123. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/tool_display.py +0 -0
  124. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/tools.py +0 -0
  125. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/ui.py +0 -0
  126. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/unicode_security.py +0 -0
  127. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/update_check.py +0 -0
  128. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/__init__.py +0 -0
  129. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/_links.py +0 -0
  130. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/agent_selector.py +0 -0
  131. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/ask_user.py +0 -0
  132. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/auth.py +0 -0
  133. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/autocomplete.py +0 -0
  134. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/diff.py +0 -0
  135. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/history.py +0 -0
  136. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/launch_init.py +0 -0
  137. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/loading.py +0 -0
  138. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/mcp_viewer.py +0 -0
  139. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/model_selector.py +0 -0
  140. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/notification_center.py +0 -0
  141. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/notification_detail.py +0 -0
  142. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/notification_settings.py +0 -0
  143. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/status.py +0 -0
  144. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/thread_selector.py +0 -0
  145. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/tool_renderers.py +0 -0
  146. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/tool_widgets.py +0 -0
  147. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/update_available.py +0 -0
  148. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/deepagents_cli/widgets/update_progress.py +0 -0
  149. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/examples/deploy-content-writer/.env.example +0 -0
  150. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/examples/deploy-content-writer/skills/blog-post/SKILL.md +0 -0
  151. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/examples/deploy-content-writer/skills/social-media/SKILL.md +0 -0
  152. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/examples/deploy-content-writer/user/context.md +0 -0
  153. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/examples/deploy-content-writer/user/preferences.md +0 -0
  154. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/examples/skills/arxiv-search/SKILL.md +0 -0
  155. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  156. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/examples/skills/langgraph-docs/SKILL.md +0 -0
  157. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/examples/skills/skill-creator/SKILL.md +0 -0
  158. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  159. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  160. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/examples/skills/web-research/SKILL.md +0 -0
  161. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/.nvmrc +0 -0
  162. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/index.html +0 -0
  163. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/package.json +0 -0
  164. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/postcss.config.js +0 -0
  165. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/public/logo-dark.svg +0 -0
  166. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/public/logo-light.svg +0 -0
  167. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/App.tsx +0 -0
  168. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/ThemeProvider.tsx +0 -0
  169. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/auth/anonymous.tsx +0 -0
  170. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/auth/clerk.tsx +0 -0
  171. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/auth/loader.tsx +0 -0
  172. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/auth/supabase.tsx +0 -0
  173. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/auth/types.ts +0 -0
  174. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/components/AppHeader.tsx +0 -0
  175. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/components/FilePanels.tsx +0 -0
  176. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/components/MessageList.tsx +0 -0
  177. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/components/SubagentActivity.tsx +0 -0
  178. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/components/ThreadPicker.tsx +0 -0
  179. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/components/TodosPanel.tsx +0 -0
  180. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/components/ToolCallCard.tsx +0 -0
  181. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/components/toolcalls/FileToolCard.tsx +0 -0
  182. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/components/toolcalls/SearchCard.tsx +0 -0
  183. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/components/toolcalls/ThinkCard.tsx +0 -0
  184. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/components/toolcalls/TodosCard.tsx +0 -0
  185. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/components/toolcalls/index.ts +0 -0
  186. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/constants.ts +0 -0
  187. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/index.css +0 -0
  188. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/main.tsx +0 -0
  189. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/runtimeConfig.ts +0 -0
  190. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/types.ts +0 -0
  191. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/src/vite-env.d.ts +0 -0
  192. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/tsconfig.json +0 -0
  193. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/frontend/vite.config.ts +0 -0
  194. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/images/cli.png +0 -0
  195. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/scripts/check_imports.py +0 -0
  196. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/scripts/debug_server.sh +0 -0
  197. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/scripts/install.sh +0 -0
  198. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/README.md +0 -0
  199. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/integration_tests/__init__.py +0 -0
  200. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/integration_tests/benchmarks/__init__.py +0 -0
  201. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  202. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  203. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/integration_tests/conftest.py +0 -0
  204. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/integration_tests/test_acp_mode.py +0 -0
  205. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/integration_tests/test_compact_resume.py +0 -0
  206. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/integration_tests/test_context_hub.py +0 -0
  207. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/integration_tests/test_deploy_hub.py +0 -0
  208. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/integration_tests/test_sandbox_factory.py +0 -0
  209. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/integration_tests/test_sandbox_operations.py +0 -0
  210. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/__init__.py +0 -0
  211. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/conftest.py +0 -0
  212. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/deploy/__init__.py +0 -0
  213. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/deploy/test_commands.py +0 -0
  214. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/deploy/test_config.py +0 -0
  215. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/deploy/test_context_hub.py +0 -0
  216. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/deploy/test_frontend_bundle.py +0 -0
  217. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/deploy/test_frontend_config.py +0 -0
  218. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/skills/__init__.py +0 -0
  219. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/skills/test_commands.py +0 -0
  220. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/skills/test_load.py +0 -0
  221. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/skills/test_skills_json.py +0 -0
  222. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_agent_friendly.py +0 -0
  223. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_agent_selector.py +0 -0
  224. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_args.py +0 -0
  225. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_ask_user.py +0 -0
  226. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  227. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_auth_store.py +0 -0
  228. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_auth_widgets.py +0 -0
  229. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_autocomplete.py +0 -0
  230. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_charset.py +0 -0
  231. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_clipboard.py +0 -0
  232. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_command_registry.py +0 -0
  233. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_compact_tool.py +0 -0
  234. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_config.py +0 -0
  235. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_configurable_model.py +0 -0
  236. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_debug.py +0 -0
  237. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_editor.py +0 -0
  238. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_end_to_end.py +0 -0
  239. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_env_vars.py +0 -0
  240. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_event_bus.py +0 -0
  241. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_exception_handling.py +0 -0
  242. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_extras_info.py +0 -0
  243. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_file_ops.py +0 -0
  244. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_formatting.py +0 -0
  245. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_git.py +0 -0
  246. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_history.py +0 -0
  247. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_hooks.py +0 -0
  248. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_imports.py +0 -0
  249. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_input_parsing.py +0 -0
  250. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  251. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_launch_init.py +0 -0
  252. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_links.py +0 -0
  253. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_loading.py +0 -0
  254. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_local_context.py +0 -0
  255. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_main_acp_mode.py +0 -0
  256. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_main_args.py +0 -0
  257. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_mcp_auth.py +0 -0
  258. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_mcp_commands.py +0 -0
  259. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_mcp_tools.py +0 -0
  260. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_mcp_trust.py +0 -0
  261. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_mcp_viewer.py +0 -0
  262. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_media_utils.py +0 -0
  263. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_model_config.py +0 -0
  264. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_model_selector.py +0 -0
  265. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_model_switch.py +0 -0
  266. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_notification_center.py +0 -0
  267. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_notification_detail.py +0 -0
  268. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_notifications.py +0 -0
  269. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_offload.py +0 -0
  270. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_offload_dict_messages.py +0 -0
  271. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_onboarding.py +0 -0
  272. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_output.py +0 -0
  273. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_reload.py +0 -0
  274. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_remote_client.py +0 -0
  275. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_sandbox_factory.py +0 -0
  276. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_server.py +0 -0
  277. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_server_config.py +0 -0
  278. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_server_graph.py +0 -0
  279. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_server_helpers.py +0 -0
  280. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_server_manager.py +0 -0
  281. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_session_stats.py +0 -0
  282. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_sessions.py +0 -0
  283. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_shell_allow_list.py +0 -0
  284. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_skill_invocation.py +0 -0
  285. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  286. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_state_migration.py +0 -0
  287. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_status.py +0 -0
  288. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_subagents.py +0 -0
  289. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  290. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_textual_patches.py +0 -0
  291. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_thread_selector.py +0 -0
  292. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_tool_display.py +0 -0
  293. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_ui.py +0 -0
  294. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_unicode_security.py +0 -0
  295. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_update_available.py +0 -0
  296. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_update_check.py +0 -0
  297. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_update_progress.py +0 -0
  298. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/test_version.py +0 -0
  299. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/tools/__init__.py +0 -0
  300. {deepagents_cli-0.0.55 → deepagents_cli-0.0.57}/tests/unit_tests/tools/test_fetch_url.py +0 -0
@@ -1,5 +1,33 @@
1
1
  # Deep Agents CLI Changelog
2
2
 
3
+ ## [0.0.57](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.56...deepagents-cli==0.0.57) (2026-05-12)
4
+
5
+ ### Features
6
+
7
+ * OSC 9;4 progress & escape helper ([#3347](https://github.com/langchain-ai/deepagents/issues/3347)) ([75d60cd](https://github.com/langchain-ai/deepagents/commit/75d60cd82f559b2944b78a348d16b0a10a00d663))
8
+
9
+ ### Bug Fixes
10
+
11
+ * Suppress LangSmith trace for `_context_tokens` state writes ([#3317](https://github.com/langchain-ai/deepagents/issues/3317)) ([63db13e](https://github.com/langchain-ai/deepagents/commit/63db13ee262d19a1a87fbe4df1271a2e958deed6))
12
+
13
+ ## [0.0.56](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.55...deepagents-cli==0.0.56) (2026-05-11)
14
+
15
+ ### Features
16
+
17
+ * Free-text reject reason on HITL approval prompt ([#3344](https://github.com/langchain-ai/deepagents/issues/3344)) ([dcc48f4](https://github.com/langchain-ai/deepagents/commit/dcc48f48d20757f17011e65b61363dd0347af164))
18
+ * Add docs link to project MCP approval prompt ([#3341](https://github.com/langchain-ai/deepagents/issues/3341)) ([b5c1228](https://github.com/langchain-ai/deepagents/commit/b5c12280e47bc37938290a4219317f47c1abfa8a))
19
+
20
+ ### Bug Fixes
21
+
22
+ * Dedupe MCP servers in project trust approval prompt ([#3342](https://github.com/langchain-ai/deepagents/issues/3342)) ([73484ea](https://github.com/langchain-ai/deepagents/commit/73484ea551189985190f52cb26b299819d3fc37d))
23
+ * Remove legacy shell tool aliases and harden HITL widget cleanup ([#3340](https://github.com/langchain-ai/deepagents/issues/3340)) ([398f7f4](https://github.com/langchain-ai/deepagents/commit/398f7f4512182a8e51cbdfbfb9dc211c77014e2b))
24
+ * Truncate multi-line shell commands in HITL approval ([#3314](https://github.com/langchain-ai/deepagents/issues/3314)) ([7ab6e14](https://github.com/langchain-ai/deepagents/commit/7ab6e14565d6dd9d9c9e76d9d6677e5568a727f7))
25
+ * (Deploy) Add `together` provider to bundler deps and optional extras ([#2670](https://github.com/langchain-ai/deepagents/issues/2670)) ([4290953](https://github.com/langchain-ai/deepagents/commit/4290953e44570ec02399e4d423ab4ffd24e97609))
26
+
27
+ ### Performance Improvements
28
+
29
+ * Gate dropped-path detection on multi-character insert size ([#3343](https://github.com/langchain-ai/deepagents/issues/3343)) ([06a21e8](https://github.com/langchain-ai/deepagents/commit/06a21e8a69738b7ba055d2f13dae4cd9fab353cd))
30
+
3
31
  ## [0.0.55](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.54...deepagents-cli==0.0.55) (2026-05-11)
4
32
 
5
33
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents-cli
3
- Version: 0.0.55
3
+ Version: 0.0.57
4
4
  Summary: Terminal interface for Deep Agents - interactive AI agent with file operations, shell access, and sub-agent capabilities.
5
5
  Project-URL: Homepage, https://docs.langchain.com/oss/python/deepagents/overview
6
6
  Project-URL: Documentation, https://reference.langchain.com/python/deepagents/
@@ -76,6 +76,7 @@ Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
76
76
  Requires-Dist: langchain-openai<2.0.0,>=1.2.1; extra == 'all-providers'
77
77
  Requires-Dist: langchain-openrouter<2.0.0,>=0.2.3; extra == 'all-providers'
78
78
  Requires-Dist: langchain-perplexity<2.0.0,>=1.2.0; extra == 'all-providers'
79
+ Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'all-providers'
79
80
  Requires-Dist: langchain-xai<2.0.0,>=1.2.2; extra == 'all-providers'
80
81
  Provides-Extra: all-sandboxes
81
82
  Requires-Dist: langchain-agentcore-codeinterpreter>=0.0.2; extra == 'all-sandboxes'
@@ -122,6 +123,8 @@ Provides-Extra: perplexity
122
123
  Requires-Dist: langchain-perplexity<2.0.0,>=1.2.0; extra == 'perplexity'
123
124
  Provides-Extra: runloop
124
125
  Requires-Dist: langchain-runloop>=0.0.4; extra == 'runloop'
126
+ Provides-Extra: together
127
+ Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'together'
125
128
  Provides-Extra: vertexai
126
129
  Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.3; extra == 'vertexai'
127
130
  Provides-Extra: xai
@@ -47,6 +47,19 @@ as enabled, and `0`, `false`, `no`, `off`, empty string, or unset as disabled.""
47
47
  DEBUG_FILE = "DEEPAGENTS_CLI_DEBUG_FILE"
48
48
  """Path for the debug log file (default: `/tmp/deepagents_debug.log`)."""
49
49
 
50
+ DEBUG_MCP_PROJECT_TRUST = "DEEPAGENTS_CLI_DEBUG_MCP_PROJECT_TRUST"
51
+ """Force the project MCP approval prompt for manual UI testing.
52
+
53
+ Set to a truthy value when launching the interactive CLI to render the
54
+ project-level MCP trust prompt without relying on an untrusted config state. If
55
+ project MCP servers are discovered, the prompt shows those real servers;
56
+ otherwise it shows a sample server. The CLI exits after the prompt response so
57
+ the debug run does not continue into TUI or server startup, and it does not
58
+ persist trust decisions.
59
+
60
+ Parsed by `is_env_truthy`: accepts `1`, `true`, `yes`, `on` as enabled.
61
+ """
62
+
50
63
  DEBUG_NOTIFICATIONS = "DEEPAGENTS_CLI_DEBUG_NOTIFICATIONS"
51
64
  """Inject sample missing-dependency notifications at launch so the notification
52
65
  center UI can be exercised without waiting for real conditions. Does not
@@ -97,6 +110,9 @@ KITTY_KEYBOARD = "DEEPAGENTS_CLI_KITTY_KEYBOARD"
97
110
  LANGSMITH_PROJECT = "DEEPAGENTS_CLI_LANGSMITH_PROJECT"
98
111
  """Override LangSmith project name for agent traces."""
99
112
 
113
+ NO_TERMINAL_ESCAPE = "DEEPAGENTS_CLI_NO_TERMINAL_ESCAPE"
114
+ """Disable all terminal escape/control sequence output when enabled."""
115
+
100
116
  NO_UPDATE_CHECK = "DEEPAGENTS_CLI_NO_UPDATE_CHECK"
101
117
  """Disable automatic update checking when set."""
102
118
 
@@ -1,6 +1,6 @@
1
1
  """Version information and lightweight constants for `deepagents-cli`."""
2
2
 
3
- __version__ = "0.0.55" # x-release-please-version
3
+ __version__ = "0.0.57" # x-release-please-version
4
4
 
5
5
  DOCS_URL = "https://docs.langchain.com/oss/python/deepagents/cli"
6
6
  """URL for `deepagents-cli` documentation."""
@@ -88,11 +88,11 @@ REQUIRE_COMPACT_TOOL_APPROVAL: bool = True
88
88
  class ShellAllowListMiddleware(AgentMiddleware):
89
89
  """Validate shell commands against an allow-list without HITL interrupts.
90
90
 
91
- When the agent invokes a shell tool (any tool in `SHELL_TOOL_NAMES`),
92
- this middleware checks the command against the configured allow-list
93
- **before execution**. Rejected commands are returned as error `ToolMessage`
94
- objects — the graph never pauses, so LangSmith traces stay as a single
95
- continuous run.
91
+ When the agent invokes the `execute` shell tool, this middleware checks
92
+ the command against the configured allow-list **before execution**.
93
+ Rejected commands are returned as error `ToolMessage` objects — the
94
+ graph never pauses, so LangSmith traces stay as a single continuous
95
+ run.
96
96
 
97
97
  Use this middleware in non-interactive mode to avoid the
98
98
  interrupt/resume cycle that fragments traces.
@@ -135,10 +135,9 @@ class ShellAllowListMiddleware(AgentMiddleware):
135
135
  """
136
136
  from langchain_core.messages import ToolMessage as LCToolMessage
137
137
 
138
- from deepagents_cli.config import SHELL_TOOL_NAMES, is_shell_command_allowed
138
+ from deepagents_cli.config import is_shell_command_allowed
139
139
 
140
- tool_name = request.tool_call["name"]
141
- if tool_name not in SHELL_TOOL_NAMES:
140
+ if request.tool_call["name"] != "execute":
142
141
  return None
143
142
 
144
143
  args = request.tool_call.get("args") or {}
@@ -155,7 +154,7 @@ class ShellAllowListMiddleware(AgentMiddleware):
155
154
  f"Allowed commands: {allowed_str}. "
156
155
  f"Please use an allowed command or try another approach."
157
156
  ),
158
- name=tool_name,
157
+ name="execute",
159
158
  tool_call_id=request.tool_call["id"],
160
159
  status="error",
161
160
  )
@@ -1151,6 +1151,7 @@ class DeepAgentsApp(App):
1151
1151
  Loaded from the user's saved preference (or the default) so the app
1152
1152
  boots with consistent colors before `/theme` runs.
1153
1153
  """
1154
+ self.sync_terminal_background()
1154
1155
 
1155
1156
  # Injected session config
1156
1157
  self._agent = agent
@@ -3290,19 +3291,61 @@ class DeepAgentsApp(App):
3290
3291
 
3291
3292
  return children[-1] == self._loading_widget
3292
3293
 
3294
+ def sync_terminal_background(self) -> None:
3295
+ """Best-effort sync of terminal default background to the active theme.
3296
+
3297
+ Custom themes use their stored registry colors; built-in Textual themes
3298
+ resolve colors from the active app theme. Terminal write failures are
3299
+ logged and swallowed because the OSC background sync is cosmetic.
3300
+ """
3301
+ from deepagents_cli.terminal_escape import set_terminal_background
3302
+
3303
+ entry = theme.get_registry().get(self.theme)
3304
+ colors = (
3305
+ entry.colors
3306
+ if entry is not None and entry.custom
3307
+ else theme.get_theme_colors(self)
3308
+ )
3309
+ try:
3310
+ set_terminal_background(colors.background)
3311
+ except Exception:
3312
+ # Cosmetic only: must never break app startup or theme changes.
3313
+ logger.warning("set_terminal_background raised unexpectedly", exc_info=True)
3314
+
3293
3315
  async def _set_spinner(self, status: SpinnerStatus) -> None:
3294
3316
  """Show, update, or hide the loading spinner.
3295
3317
 
3318
+ Also drives the terminal's `OSC 9;4` progress indicator, when
3319
+ supported, so taskbar / dock / tab badges reflect agent activity while
3320
+ the user is in another window.
3321
+
3296
3322
  Args:
3297
3323
  status: The spinner status to display, or `None` to hide.
3298
3324
  """
3325
+ from deepagents_cli.terminal_escape import (
3326
+ TerminalProgressState,
3327
+ clear_terminal_progress,
3328
+ set_terminal_progress,
3329
+ )
3330
+
3299
3331
  if status is None:
3300
3332
  # Hide
3301
3333
  if self._loading_widget:
3302
3334
  await self._loading_widget.remove()
3303
3335
  self._loading_widget = None
3336
+ try:
3337
+ clear_terminal_progress()
3338
+ except Exception:
3339
+ # Cosmetic only — must never break spinner lifecycle.
3340
+ logger.exception("clear_terminal_progress raised unexpectedly")
3304
3341
  return
3305
3342
 
3343
+ try:
3344
+ set_terminal_progress(state=TerminalProgressState.INDETERMINATE)
3345
+ except Exception:
3346
+ # Cosmetic only — must never break spinner lifecycle.
3347
+ logger.exception("set_terminal_progress raised unexpectedly")
3348
+
3306
3349
  try:
3307
3350
  messages = self.query_one("#messages", Container)
3308
3351
  except NoMatches:
@@ -3378,7 +3421,6 @@ class DeepAgentsApp(App):
3378
3421
  A Future that resolves to the user's decision.
3379
3422
  """
3380
3423
  from deepagents_cli.config import (
3381
- SHELL_TOOL_NAMES,
3382
3424
  is_shell_command_allowed,
3383
3425
  settings,
3384
3426
  )
@@ -3392,7 +3434,7 @@ class DeepAgentsApp(App):
3392
3434
  approved_commands = []
3393
3435
 
3394
3436
  for req in action_requests:
3395
- if req.get("name") in SHELL_TOOL_NAMES:
3437
+ if req.get("name") == "execute":
3396
3438
  command = req.get("args", {}).get("command", "")
3397
3439
  if is_shell_command_allowed(command, settings.shell_allow_list):
3398
3440
  approved_commands.append(command)
@@ -6583,6 +6625,15 @@ class DeepAgentsApp(App):
6583
6625
  ).encode()
6584
6626
  _dispatch_hook_sync("session.end", payload, hooks)
6585
6627
 
6628
+ from deepagents_cli.terminal_escape import reset_terminal_background
6629
+
6630
+ try:
6631
+ reset_terminal_background()
6632
+ except Exception:
6633
+ # Cosmetic only: must never raise during shutdown.
6634
+ logger.warning(
6635
+ "reset_terminal_background raised unexpectedly", exc_info=True
6636
+ )
6586
6637
  restore_iterm_cursor_guide()
6587
6638
  super().exit(result=result, return_code=return_code, message=message)
6588
6639
 
@@ -6987,6 +7038,7 @@ class DeepAgentsApp(App):
6987
7038
  """Handle the theme selector result."""
6988
7039
  if result is not None:
6989
7040
  self.theme = result
7041
+ self.sync_terminal_background()
6990
7042
  self.refresh_css(animate=False)
6991
7043
 
6992
7044
  async def _persist() -> None:
@@ -224,6 +224,13 @@ ToolCallMessage.-ascii:hover {
224
224
  margin-top: 0;
225
225
  }
226
226
 
227
+ /* Free-text reject reason input (Tab on Reject) */
228
+ .approval-menu .approval-reason-input {
229
+ margin: 1 0 0 0;
230
+ border: solid $warning;
231
+ background: $surface;
232
+ }
233
+
227
234
  /* Ask user widget */
228
235
  .ask-user-menu {
229
236
  height: auto;
@@ -1464,14 +1464,6 @@ class SessionState:
1464
1464
  return self.auto_approve
1465
1465
 
1466
1466
 
1467
- SHELL_TOOL_NAMES: frozenset[str] = frozenset({"bash", "shell", "execute"})
1468
- """Tool names recognized as shell/command-execution tools.
1469
-
1470
- Only `'execute'` is registered by the SDK and CLI backends in practice.
1471
- `'bash'` and `'shell'` are legacy names carried over and kept as
1472
- backwards-compatible aliases.
1473
- """
1474
-
1475
1467
  DANGEROUS_SHELL_PATTERNS = (
1476
1468
  "$(", # Command substitution
1477
1469
  "`", # Backtick command substitution
@@ -68,6 +68,7 @@ _MODEL_PROVIDER_DEPS: dict[str, str] = {
68
68
  "openai": "langchain-openai",
69
69
  "openrouter": "langchain-openrouter",
70
70
  "perplexity": "langchain-perplexity",
71
+ "together": "langchain-together",
71
72
  "xai": "langchain-xai",
72
73
  }
73
74
  """Dependencies inferred from a provider: prefix on the model string."""
@@ -49,6 +49,7 @@ MODEL_PROVIDER_EXTRAS: frozenset[str] = frozenset(
49
49
  "openai",
50
50
  "openrouter",
51
51
  "perplexity",
52
+ "together",
52
53
  "vertexai",
53
54
  "xai",
54
55
  }
@@ -1432,6 +1432,13 @@ def _print_session_stats(stats: Any, console: Any) -> None: # noqa: ANN401
1432
1432
  print_usage_table(stats, stats.wall_time_seconds, console)
1433
1433
 
1434
1434
 
1435
+ def _debug_mcp_project_trust_enabled() -> bool:
1436
+ """Return whether the project MCP approval prompt debug path is enabled."""
1437
+ from deepagents_cli._env_vars import DEBUG_MCP_PROJECT_TRUST, is_env_truthy
1438
+
1439
+ return is_env_truthy(DEBUG_MCP_PROJECT_TRUST)
1440
+
1441
+
1435
1442
  def _check_mcp_project_trust(*, trust_flag: bool = False) -> bool | None:
1436
1443
  """Check whether project-level MCP servers should be trusted.
1437
1444
 
@@ -1457,9 +1464,12 @@ def _check_mcp_project_trust(*, trust_flag: bool = False) -> bool | None:
1457
1464
  discover_mcp_configs,
1458
1465
  extract_project_server_summaries,
1459
1466
  load_mcp_config_lenient,
1467
+ merge_mcp_configs,
1460
1468
  )
1461
1469
  from deepagents_cli.project_utils import ProjectContext
1462
1470
 
1471
+ debug_prompt = _debug_mcp_project_trust_enabled()
1472
+
1463
1473
  try:
1464
1474
  project_context = ProjectContext.from_user_cwd(Path.cwd())
1465
1475
  config_paths = discover_mcp_configs(project_context=project_context)
@@ -1467,15 +1477,29 @@ def _check_mcp_project_trust(*, trust_flag: bool = False) -> bool | None:
1467
1477
  return None
1468
1478
 
1469
1479
  _, project_configs = classify_discovered_configs(config_paths)
1470
- if not project_configs:
1480
+ if not project_configs and not debug_prompt:
1471
1481
  return None
1472
1482
 
1473
- # Collect all servers (stdio + remote) across project configs
1474
- all_servers: list[tuple[str, str, str]] = []
1475
- for path in project_configs:
1476
- cfg = load_mcp_config_lenient(path)
1477
- if cfg is not None:
1478
- all_servers.extend(extract_project_server_summaries(cfg))
1483
+ # Merge configs by server name (last wins, matching the loader) so that
1484
+ # a server defined in multiple project configs (for example,
1485
+ # `.deepagents/.mcp.json` and higher-precedence `.mcp.json`) only shows
1486
+ # up once in the prompt.
1487
+ loaded_configs = [
1488
+ cfg
1489
+ for cfg in (load_mcp_config_lenient(path) for path in project_configs)
1490
+ if cfg is not None
1491
+ ]
1492
+ merged_config = merge_mcp_configs(loaded_configs)
1493
+ all_servers = extract_project_server_summaries(merged_config)
1494
+
1495
+ if not all_servers and debug_prompt:
1496
+ all_servers = [
1497
+ (
1498
+ "debug-project-mcp",
1499
+ "stdio",
1500
+ "uvx deepagents-debug-mcp --sample-project-server",
1501
+ )
1502
+ ]
1479
1503
 
1480
1504
  if not all_servers:
1481
1505
  return None
@@ -1495,12 +1519,16 @@ def _check_mcp_project_trust(*, trust_flag: bool = False) -> bool | None:
1495
1519
  )
1496
1520
  fingerprint = compute_config_fingerprint(project_configs)
1497
1521
 
1498
- if is_project_mcp_trusted(project_root, fingerprint):
1522
+ if not debug_prompt and is_project_mcp_trusted(project_root, fingerprint):
1499
1523
  return True
1500
1524
 
1501
1525
  # Interactive prompt
1502
1526
  from rich.console import Console as _Console
1503
1527
 
1528
+ docs_url = (
1529
+ "https://docs.langchain.com/oss/python/deepagents/cli/"
1530
+ "mcp-tools#project-level-trust"
1531
+ )
1504
1532
  prompt_console = _Console(stderr=True)
1505
1533
  prompt_console.print()
1506
1534
  prompt_console.print(
@@ -1509,6 +1537,11 @@ def _check_mcp_project_trust(*, trust_flag: bool = False) -> bool | None:
1509
1537
  for name, kind, summary in all_servers:
1510
1538
  prompt_console.print(f' [bold]"{name}"[/bold] ({kind}): {summary}')
1511
1539
  prompt_console.print()
1540
+ prompt_console.print(
1541
+ f"[dim]Learn more: [link={docs_url}]{docs_url}[/link][/dim]",
1542
+ highlight=False,
1543
+ )
1544
+ prompt_console.print()
1512
1545
 
1513
1546
  try:
1514
1547
  answer = input("Allow? [y/N]: ").strip().lower()
@@ -1516,7 +1549,8 @@ def _check_mcp_project_trust(*, trust_flag: bool = False) -> bool | None:
1516
1549
  answer = ""
1517
1550
 
1518
1551
  if answer == "y":
1519
- trust_project_mcp(project_root, fingerprint)
1552
+ if not debug_prompt:
1553
+ trust_project_mcp(project_root, fingerprint)
1520
1554
  return True
1521
1555
  return False
1522
1556
 
@@ -2109,6 +2143,8 @@ def cli_main() -> None:
2109
2143
  mcp_trust_decision = _check_mcp_project_trust(
2110
2144
  trust_flag=getattr(args, "trust_project_mcp", False),
2111
2145
  )
2146
+ if _debug_mcp_project_trust_enabled():
2147
+ sys.exit(0)
2112
2148
 
2113
2149
  # Run Textual CLI
2114
2150
  return_code = 0
@@ -41,7 +41,6 @@ from deepagents_cli._version import __version__
41
41
  from deepagents_cli.agent import DEFAULT_AGENT_NAME
42
42
  from deepagents_cli.config import (
43
43
  SHELL_ALLOW_ALL,
44
- SHELL_TOOL_NAMES,
45
44
  build_langsmith_thread_url,
46
45
  create_model,
47
46
  is_shell_command_allowed,
@@ -470,7 +469,7 @@ def _make_hitl_decision(
470
469
 
471
470
  action_name = action_request.get("name", "")
472
471
 
473
- if action_name in SHELL_TOOL_NAMES:
472
+ if action_name == "execute":
474
473
  if not settings.shell_allow_list:
475
474
  command = action_request.get("args", {}).get("command", "")
476
475
  console.print(