deepagents-code 0.1.4__tar.gz → 0.1.6__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 (251) hide show
  1. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/CHANGELOG.md +21 -0
  2. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/COMMANDS.md +2 -1
  3. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/PKG-INFO +6 -7
  4. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/README.md +1 -1
  5. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_version.py +1 -1
  6. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/agent.py +3 -3
  7. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/app.py +254 -12
  8. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/command_registry.py +7 -0
  9. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/config.py +21 -4
  10. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/extras_info.py +80 -5
  11. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/integrations/sandbox_factory.py +4 -2
  12. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/main.py +121 -5
  13. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_auth.py +84 -5
  14. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_tools.py +31 -2
  15. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/model_config.py +3 -3
  16. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/offload.py +1 -1
  17. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/remote_client.py +130 -5
  18. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/sessions.py +50 -4
  19. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/skills/load.py +1 -1
  20. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/ui.py +4 -0
  21. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/update_check.py +233 -38
  22. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/auth.py +1 -1
  23. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/launch_init.py +1 -1
  24. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/mcp_reconnect.py +5 -1
  25. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/mcp_viewer.py +60 -24
  26. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/welcome.py +23 -0
  27. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/pyproject.toml +5 -6
  28. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/scripts/install.sh +195 -35
  29. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_app.py +292 -9
  30. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_config.py +30 -1
  31. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_extras_info.py +56 -2
  32. deepagents_code-0.1.6/tests/unit_tests/test_install_command.py +239 -0
  33. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_main_args.py +197 -3
  34. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_auth.py +143 -0
  35. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_viewer.py +72 -17
  36. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_notification_center.py +3 -1
  37. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_notifications.py +3 -1
  38. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_remote_client.py +208 -0
  39. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_sandbox_factory.py +1 -1
  40. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_sessions.py +45 -0
  41. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_update_available.py +3 -1
  42. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_update_check.py +252 -4
  43. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_update_progress.py +4 -4
  44. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_version.py +2 -2
  45. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_welcome.py +65 -0
  46. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/uv.lock +14 -16
  47. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/.gitignore +0 -0
  48. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/AGENTS.md +0 -0
  49. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/DEV.md +0 -0
  50. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/Makefile +0 -0
  51. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/THREAT_MODEL.md +0 -0
  52. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/__init__.py +0 -0
  53. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/__main__.py +0 -0
  54. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_ask_user_types.py +0 -0
  55. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_cli_context.py +0 -0
  56. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_constants.py +0 -0
  57. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_debug.py +0 -0
  58. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_env_vars.py +0 -0
  59. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_git.py +0 -0
  60. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_server_config.py +0 -0
  61. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_session_stats.py +0 -0
  62. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_startup_error.py +0 -0
  63. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_testing_models.py +0 -0
  64. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/_textual_patches.py +0 -0
  65. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/app.tcss +0 -0
  66. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/ask_user.py +0 -0
  67. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/auth_store.py +0 -0
  68. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/built_in_skills/__init__.py +0 -0
  69. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  70. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  71. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  72. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  73. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/clipboard.py +0 -0
  74. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/configurable_model.py +0 -0
  75. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/default_agent_prompt.md +0 -0
  76. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/editor.py +0 -0
  77. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/event_bus.py +0 -0
  78. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/file_ops.py +0 -0
  79. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/formatting.py +0 -0
  80. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/hooks.py +0 -0
  81. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/input.py +0 -0
  82. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/integrations/__init__.py +0 -0
  83. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/integrations/sandbox_provider.py +0 -0
  84. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/iterm_cursor_guide.py +0 -0
  85. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/local_context.py +0 -0
  86. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_commands.py +0 -0
  87. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_disabled.py +0 -0
  88. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_login_service.py +0 -0
  89. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_oauth_ui.py +0 -0
  90. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_providers/__init__.py +0 -0
  91. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_providers/_registry.py +0 -0
  92. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_providers/base.py +0 -0
  93. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_providers/github.py +0 -0
  94. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_providers/slack.py +0 -0
  95. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/mcp_trust.py +0 -0
  96. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/media_utils.py +0 -0
  97. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/non_interactive.py +0 -0
  98. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/notifications.py +0 -0
  99. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/onboarding.py +0 -0
  100. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/output.py +0 -0
  101. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/project_utils.py +0 -0
  102. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/py.typed +0 -0
  103. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/server.py +0 -0
  104. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/server_graph.py +0 -0
  105. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/server_manager.py +0 -0
  106. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/skills/__init__.py +0 -0
  107. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/skills/commands.py +0 -0
  108. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/skills/invocation.py +0 -0
  109. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/state_migration.py +0 -0
  110. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/subagents.py +0 -0
  111. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/system_prompt.md +0 -0
  112. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/terminal_capabilities.py +0 -0
  113. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/terminal_escape.py +0 -0
  114. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/textual_adapter.py +0 -0
  115. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/theme.py +0 -0
  116. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/token_state.py +0 -0
  117. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/tool_display.py +0 -0
  118. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/tools.py +0 -0
  119. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/unicode_security.py +0 -0
  120. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/__init__.py +0 -0
  121. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/_links.py +0 -0
  122. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/agent_selector.py +0 -0
  123. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/approval.py +0 -0
  124. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/ask_user.py +0 -0
  125. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/autocomplete.py +0 -0
  126. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/chat_input.py +0 -0
  127. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/diff.py +0 -0
  128. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/history.py +0 -0
  129. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/loading.py +0 -0
  130. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/mcp_login.py +0 -0
  131. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/message_store.py +0 -0
  132. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/messages.py +0 -0
  133. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/model_selector.py +0 -0
  134. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/notification_center.py +0 -0
  135. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/notification_detail.py +0 -0
  136. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/notification_settings.py +0 -0
  137. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/status.py +0 -0
  138. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/theme_selector.py +0 -0
  139. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/thread_selector.py +0 -0
  140. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/tool_renderers.py +0 -0
  141. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/tool_widgets.py +0 -0
  142. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/update_available.py +0 -0
  143. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/deepagents_code/widgets/update_progress.py +0 -0
  144. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/examples/skills/arxiv-search/SKILL.md +0 -0
  145. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  146. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/examples/skills/langgraph-docs/SKILL.md +0 -0
  147. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/examples/skills/skill-creator/SKILL.md +0 -0
  148. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  149. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  150. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/examples/skills/web-research/SKILL.md +0 -0
  151. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/images/tui.png +0 -0
  152. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/scripts/check_imports.py +0 -0
  153. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/scripts/debug_server.sh +0 -0
  154. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/scripts/generate_commands_catalog.py +0 -0
  155. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/README.md +0 -0
  156. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/__init__.py +0 -0
  157. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/benchmarks/__init__.py +0 -0
  158. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  159. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  160. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/conftest.py +0 -0
  161. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/test_acp_mode.py +0 -0
  162. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/test_compact_resume.py +0 -0
  163. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/test_sandbox_factory.py +0 -0
  164. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/integration_tests/test_sandbox_operations.py +0 -0
  165. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/__init__.py +0 -0
  166. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/conftest.py +0 -0
  167. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/skills/__init__.py +0 -0
  168. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/skills/test_commands.py +0 -0
  169. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/skills/test_load.py +0 -0
  170. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/skills/test_skills_json.py +0 -0
  171. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_agent.py +0 -0
  172. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_agent_friendly.py +0 -0
  173. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_agent_selector.py +0 -0
  174. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_approval.py +0 -0
  175. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_args.py +0 -0
  176. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_ask_user.py +0 -0
  177. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  178. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_auth_store.py +0 -0
  179. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_auth_widgets.py +0 -0
  180. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_autocomplete.py +0 -0
  181. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_charset.py +0 -0
  182. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_chat_input.py +0 -0
  183. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_clipboard.py +0 -0
  184. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_command_registry.py +0 -0
  185. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_compact_tool.py +0 -0
  186. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_configurable_model.py +0 -0
  187. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_debug.py +0 -0
  188. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_editor.py +0 -0
  189. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_end_to_end.py +0 -0
  190. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_env_vars.py +0 -0
  191. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_event_bus.py +0 -0
  192. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_exception_handling.py +0 -0
  193. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_file_ops.py +0 -0
  194. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_formatting.py +0 -0
  195. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_git.py +0 -0
  196. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_history.py +0 -0
  197. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_hooks.py +0 -0
  198. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_imports.py +0 -0
  199. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_input_parsing.py +0 -0
  200. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  201. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_launch_init.py +0 -0
  202. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_links.py +0 -0
  203. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_loading.py +0 -0
  204. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_local_context.py +0 -0
  205. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_main.py +0 -0
  206. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_main_acp_mode.py +0 -0
  207. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_commands.py +0 -0
  208. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_disabled.py +0 -0
  209. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_login_modal.py +0 -0
  210. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_login_service.py +0 -0
  211. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  212. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_reconnect.py +0 -0
  213. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_tools.py +0 -0
  214. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_mcp_trust.py +0 -0
  215. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_media_utils.py +0 -0
  216. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_message_store.py +0 -0
  217. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_messages.py +0 -0
  218. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_model_config.py +0 -0
  219. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_model_selector.py +0 -0
  220. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_model_switch.py +0 -0
  221. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_non_interactive.py +0 -0
  222. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_notification_detail.py +0 -0
  223. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_offload.py +0 -0
  224. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_offload_dict_messages.py +0 -0
  225. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_onboarding.py +0 -0
  226. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_output.py +0 -0
  227. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_reload.py +0 -0
  228. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_server.py +0 -0
  229. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_server_config.py +0 -0
  230. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_server_graph.py +0 -0
  231. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_server_helpers.py +0 -0
  232. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_server_manager.py +0 -0
  233. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_session_stats.py +0 -0
  234. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_shell_allow_list.py +0 -0
  235. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_skill_invocation.py +0 -0
  236. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  237. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_state_migration.py +0 -0
  238. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_status.py +0 -0
  239. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_subagents.py +0 -0
  240. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  241. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_terminal_escape.py +0 -0
  242. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_textual_adapter.py +0 -0
  243. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_textual_patches.py +0 -0
  244. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_theme.py +0 -0
  245. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_thread_selector.py +0 -0
  246. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_token_tracker.py +0 -0
  247. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_tool_display.py +0 -0
  248. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_ui.py +0 -0
  249. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/test_unicode_security.py +0 -0
  250. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/tools/__init__.py +0 -0
  251. {deepagents_code-0.1.4 → deepagents_code-0.1.6}/tests/unit_tests/tools/test_fetch_url.py +0 -0
@@ -1,5 +1,26 @@
1
1
  # Deep Agents Code Changelog
2
2
 
3
+ ## [0.1.6](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.5...deepagents-code==0.1.6) (2026-05-27)
4
+
5
+ ### Features
6
+
7
+ * `/install` optional extras ([#3606](https://github.com/langchain-ai/deepagents/issues/3606)) ([7ffaa93](https://github.com/langchain-ai/deepagents/commit/7ffaa93dca6910cd454040d416ff7e0e8bcbcea5))
8
+ * Surface deferred MCP reconnect state in `/mcp` ([#3612](https://github.com/langchain-ai/deepagents/issues/3612)) ([d8205c2](https://github.com/langchain-ai/deepagents/commit/d8205c2a39d00e8b6f7f70afe7cc9bb92fee42d8))
9
+ * Surface MCP servers awaiting reconnect on splash banner ([#3615](https://github.com/langchain-ai/deepagents/issues/3615)) ([24c5258](https://github.com/langchain-ai/deepagents/commit/24c5258ae6664bc3d3875d8065038716f7c86161))
10
+
11
+ ### Bug Fixes
12
+
13
+ * Cancel server-side runs before re-trying interrupted-state writes ([#3611](https://github.com/langchain-ai/deepagents/issues/3611)) ([7d46357](https://github.com/langchain-ai/deepagents/commit/7d46357c5446bbc6225f972fd66dc52af8dd0547))
14
+ * Editable-install guidance for adding extras ([#3610](https://github.com/langchain-ai/deepagents/issues/3610)) ([771e55f](https://github.com/langchain-ai/deepagents/commit/771e55f171b8087b876ecf767d2f23c86c2a27b9))
15
+ * Reuse persisted DCR loopback port across OAuth launches ([#3613](https://github.com/langchain-ai/deepagents/issues/3613)) ([f2f7471](https://github.com/langchain-ai/deepagents/commit/f2f747104945ac79b68e6524d6da886f7cfeb1b0))
16
+ * Polish MCP auth success UX ([#3614](https://github.com/langchain-ai/deepagents/issues/3614)) ([d225cb4](https://github.com/langchain-ai/deepagents/commit/d225cb41f41a0a9b2876aff2443eaa0ada24bf29))
17
+
18
+ ## [0.1.5](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.4...deepagents-code==0.1.5) (2026-05-26)
19
+
20
+ ### Bug Fixes
21
+
22
+ * Join aiosqlite worker thread after close ([#3585](https://github.com/langchain-ai/deepagents/issues/3585)) ([152cec0](https://github.com/langchain-ai/deepagents/commit/152cec04affed3508d4bfdffe7cae522b16d45e6))
23
+
3
24
  ## [0.1.4](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.3...deepagents-code==0.1.4) (2026-05-23)
4
25
 
5
26
  ### Features
@@ -6,7 +6,7 @@ Canonical list of slash commands for `deepagents-code`, derived from
6
6
  regenerate after editing the registry.
7
7
 
8
8
 
9
- ## Public (25)
9
+ ## Public (26)
10
10
 
11
11
  | Command | Aliases | Description |
12
12
  | --- | --- | --- |
@@ -21,6 +21,7 @@ regenerate after editing the registry.
21
21
  | `/feedback` | | Submit a bug report or feature request |
22
22
  | `/force-clear` | | Interrupt active work, clear chat, and start new thread |
23
23
  | `/help` | | Show help |
24
+ | `/install` | | Install an optional extra (e.g. quickjs, daytona, fireworks) |
24
25
  | `/mcp` | | Show MCP servers; `/mcp login <server>` to authenticate, `/mcp reconnect` to load deferred logins, F2 in the viewer to disable/enable a server |
25
26
  | `/model` | | Switch or configure model (--model-params, --default) |
26
27
  | `/notifications` | | Configure startup warning preferences |
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents-code
3
- Version: 0.1.4
3
+ Version: 0.1.6
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,18 +27,17 @@ Classifier: Topic :: Terminals
27
27
  Requires-Python: <4.0,>=3.11
28
28
  Requires-Dist: aiosqlite<1.0.0,>=0.19.0
29
29
  Requires-Dist: deepagents-acp>=0.0.4
30
- Requires-Dist: deepagents==0.6.3
30
+ Requires-Dist: deepagents==0.6.4
31
31
  Requires-Dist: httpx<1.0.0,>=0.28.1
32
32
  Requires-Dist: langchain-anthropic<2.0.0,>=1.4.3
33
33
  Requires-Dist: langchain-google-genai<5.0.0,>=4.2.2
34
34
  Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.2.2
35
35
  Requires-Dist: langchain-openai<2.0.0,>=1.2.1
36
- Requires-Dist: langchain<2.0.0,>=1.3.1
36
+ Requires-Dist: langchain<2.0.0,>=1.3.2
37
37
  Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
38
38
  Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.24
39
39
  Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.28.1
40
40
  Requires-Dist: langgraph-sdk<1.0.0,>=0.3.13
41
- Requires-Dist: langgraph<2.0.0,>=1.2.0
42
41
  Requires-Dist: langsmith[sandbox]>=0.8.0
43
42
  Requires-Dist: markdownify<2.0.0,>=0.13.0
44
43
  Requires-Dist: packaging>=23.0
@@ -127,8 +126,8 @@ Provides-Extra: runloop
127
126
  Requires-Dist: langchain-runloop>=0.0.4; extra == 'runloop'
128
127
  Provides-Extra: together
129
128
  Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'together'
130
- Provides-Extra: vertexai
131
- Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.3; extra == 'vertexai'
129
+ Provides-Extra: vertex
130
+ Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.3; extra == 'vertex'
132
131
  Provides-Extra: xai
133
132
  Requires-Dist: langchain-xai<2.0.0,>=1.2.2; extra == 'xai'
134
133
  Description-Content-Type: text/markdown
@@ -179,7 +178,7 @@ The fastest way to start using Deep Agents. `deepagents-code` is a pre-built cod
179
178
 
180
179
  ## 📖 Resources
181
180
 
182
- - **[Documentation](https://docs.langchain.com/oss/python/deepagents/code/overview)**
181
+ - **[Documentation](https://docs.langchain.com/deepagents-code)**
183
182
  - **[Changelog](https://github.com/langchain-ai/deepagents/blob/main/libs/code/CHANGELOG.md)**
184
183
  - **[Source code](https://github.com/langchain-ai/deepagents/tree/main/libs/code)**
185
184
  - **[Deep Agents SDK](https://github.com/langchain-ai/deepagents)** — underlying agent harness
@@ -44,7 +44,7 @@ The fastest way to start using Deep Agents. `deepagents-code` is a pre-built cod
44
44
 
45
45
  ## 📖 Resources
46
46
 
47
- - **[Documentation](https://docs.langchain.com/oss/python/deepagents/code/overview)**
47
+ - **[Documentation](https://docs.langchain.com/deepagents-code)**
48
48
  - **[Changelog](https://github.com/langchain-ai/deepagents/blob/main/libs/code/CHANGELOG.md)**
49
49
  - **[Source code](https://github.com/langchain-ai/deepagents/tree/main/libs/code)**
50
50
  - **[Deep Agents SDK](https://github.com/langchain-ai/deepagents)** — underlying agent harness
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Keep the `x-release-please-version` annotation — release-please uses it to
4
4
  # bump `__version__` in sync with `pyproject.toml` on every release PR.
5
- __version__ = "0.1.4" # x-release-please-version
5
+ __version__ = "0.1.6" # x-release-please-version
6
6
 
7
7
  DOCS_URL = "https://docs.langchain.com/oss/python/deepagents/code"
8
8
  """URL for `deepagents-code` documentation."""
@@ -1268,7 +1268,7 @@ def create_cli_agent(
1268
1268
 
1269
1269
  agent_middleware.append(
1270
1270
  MemoryMiddleware(
1271
- backend=FilesystemBackend(),
1271
+ backend=FilesystemBackend(virtual_mode=False),
1272
1272
  sources=memory_sources,
1273
1273
  )
1274
1274
  )
@@ -1311,7 +1311,7 @@ def create_cli_agent(
1311
1311
 
1312
1312
  agent_middleware.append(
1313
1313
  SkillsMiddleware(
1314
- backend=FilesystemBackend(),
1314
+ backend=FilesystemBackend(virtual_mode=False),
1315
1315
  sources=middleware_sources,
1316
1316
  )
1317
1317
  )
@@ -1337,7 +1337,7 @@ def create_cli_agent(
1337
1337
  )
1338
1338
  else:
1339
1339
  # No shell access - use plain FilesystemBackend
1340
- backend = FilesystemBackend(root_dir=root_dir)
1340
+ backend = FilesystemBackend(root_dir=root_dir, virtual_mode=False)
1341
1341
  else:
1342
1342
  # ========== REMOTE SANDBOX MODE ==========
1343
1343
  backend = sandbox # Remote sandbox (ModalSandbox, etc.)
@@ -1302,7 +1302,7 @@ class DeepAgentsApp(App):
1302
1302
  """Total tool count across MCP servers, displayed in the status bar."""
1303
1303
 
1304
1304
  self._mcp_unauthenticated = sum(
1305
- 1 for s in (mcp_server_info or []) if s.status == "unauthenticated"
1305
+ 1 for s in (mcp_server_info or []) if s.needs_attention()
1306
1306
  )
1307
1307
  """MCP servers awaiting a `dcode mcp login` run."""
1308
1308
 
@@ -1311,6 +1311,15 @@ class DeepAgentsApp(App):
1311
1311
  )
1312
1312
  """MCP servers that failed to load (config or network error)."""
1313
1313
 
1314
+ self._mcp_awaiting_reconnect = sum(
1315
+ 1 for s in (mcp_server_info or []) if s.status == "awaiting_reconnect"
1316
+ )
1317
+ """MCP servers that completed OAuth login but are blocked on
1318
+ `/mcp reconnect` before their tools can load.
1319
+
1320
+ See `MCPServerStatus` for the underlying state machine.
1321
+ """
1322
+
1314
1323
  self._active_mcp_viewer: Any = None
1315
1324
  """Handle to the `/mcp` modal so server-ready events can refresh it."""
1316
1325
 
@@ -1478,7 +1487,7 @@ class DeepAgentsApp(App):
1478
1487
  """The exception itself when startup failed with
1479
1488
  `MissingProviderPackageError`; `None` otherwise. Stashing the exception
1480
1489
  rather than a tuple gives the hint builder named access to `.provider`
1481
- and `.package`, and gates the `pip install` / `/model` recovery hint
1490
+ and `.package`, and gates the `/install` / `/model` recovery hint
1482
1491
  without string-matching on the formatted error.
1483
1492
  """
1484
1493
 
@@ -1734,6 +1743,7 @@ class DeepAgentsApp(App):
1734
1743
  mcp_tool_count=self._mcp_tool_count,
1735
1744
  mcp_unauthenticated=self._mcp_unauthenticated,
1736
1745
  mcp_errored=self._mcp_errored,
1746
+ mcp_awaiting_reconnect=self._mcp_awaiting_reconnect,
1737
1747
  connecting=self._connecting,
1738
1748
  resuming=self._resume_thread_intent is not None,
1739
1749
  local_server=self._server_kwargs is not None,
@@ -2509,11 +2519,14 @@ class DeepAgentsApp(App):
2509
2519
  task.add_done_callback(_log_task_exception)
2510
2520
  self._mcp_tool_count = sum(len(s.tools) for s in (event.mcp_server_info or []))
2511
2521
  self._mcp_unauthenticated = sum(
2512
- 1 for s in (event.mcp_server_info or []) if s.status == "unauthenticated"
2522
+ 1 for s in (event.mcp_server_info or []) if s.needs_attention()
2513
2523
  )
2514
2524
  self._mcp_errored = sum(
2515
2525
  1 for s in (event.mcp_server_info or []) if s.status == "error"
2516
2526
  )
2527
+ self._mcp_awaiting_reconnect = sum(
2528
+ 1 for s in (event.mcp_server_info or []) if s.status == "awaiting_reconnect"
2529
+ )
2517
2530
 
2518
2531
  # Update welcome banner to show ready state
2519
2532
  try:
@@ -2522,6 +2535,7 @@ class DeepAgentsApp(App):
2522
2535
  self._mcp_tool_count,
2523
2536
  mcp_unauthenticated=self._mcp_unauthenticated,
2524
2537
  mcp_errored=self._mcp_errored,
2538
+ mcp_awaiting_reconnect=self._mcp_awaiting_reconnect,
2525
2539
  )
2526
2540
  except NoMatches:
2527
2541
  logger.warning("Welcome banner not found during server ready transition")
@@ -2653,12 +2667,29 @@ class DeepAgentsApp(App):
2653
2667
  and self._server_kwargs is not None
2654
2668
  ):
2655
2669
  missing = self._server_startup_missing_provider_package
2656
- text += (
2657
- f"\n\nHint: install the package with "
2658
- f"`pip install {missing.package}`, then run "
2659
- f"`/model {missing.provider}:<model>` to retry. "
2660
- f"Or pick a different provider with `/model`."
2661
- )
2670
+ from deepagents_code.extras_info import extra_for_package
2671
+
2672
+ extra = extra_for_package(missing.package)
2673
+ if extra is not None:
2674
+ text += (
2675
+ f"\n\nHint: install the package with `/install {extra}`, "
2676
+ f"then run `/model {missing.provider}:<model>` to retry. "
2677
+ "Or pick a different provider with `/model`."
2678
+ )
2679
+ else:
2680
+ from deepagents_code.update_check import install_package_command
2681
+
2682
+ try:
2683
+ install_cmd = install_package_command(missing.package)
2684
+ except ValueError:
2685
+ install_hint = f"install the `{missing.package}` package manually"
2686
+ else:
2687
+ install_hint = f"run `{install_cmd}`"
2688
+ text += (
2689
+ f"\n\nHint: {install_hint}, then run "
2690
+ f"`/model {missing.provider}:<model>` "
2691
+ "to retry. Or pick a different provider with `/model`."
2692
+ )
2662
2693
 
2663
2694
  async def _mount_failure() -> None:
2664
2695
  # Drop any prior failure widget (re-entrant on retry-then-fail).
@@ -3122,6 +3153,136 @@ class DeepAgentsApp(App):
3122
3153
  ErrorMessage(f"Update failed: {type(exc).__name__}: {exc}"),
3123
3154
  )
3124
3155
 
3156
+ async def _handle_install_command(self, command: str) -> None:
3157
+ """Handle the `/install <extra>` slash command.
3158
+
3159
+ Adds an optional extra (e.g. `quickjs`, `daytona`) to the installed
3160
+ dcode tool by re-running `uv tool install -U 'deepagents-code[<extra>]'`.
3161
+ Refuses unknown extras unless the user passes a `--force` token.
3162
+
3163
+ Args:
3164
+ command: The full slash command line (e.g. `'/install quickjs'`
3165
+ or `'/install foo --force'`).
3166
+ """
3167
+ parts = command.split()
3168
+ force = "--force" in parts[1:]
3169
+ extras = [p for p in parts[1:] if not p.startswith("-")]
3170
+ if not extras:
3171
+ await self._mount_message(
3172
+ AppMessage(
3173
+ "Usage: /install <extra> [--force]\nExample: /install quickjs",
3174
+ ),
3175
+ )
3176
+ return
3177
+ if len(extras) > 1:
3178
+ await self._mount_message(
3179
+ AppMessage(
3180
+ "Only one extra may be installed per /install command. "
3181
+ f"Got: {', '.join(extras)}",
3182
+ ),
3183
+ )
3184
+ return
3185
+ extra = extras[0].lower()
3186
+ await self._mount_message(UserMessage(command))
3187
+
3188
+ try:
3189
+ from deepagents_code.config import _is_editable_install
3190
+ from deepagents_code.extras_info import (
3191
+ KNOWN_EXTRAS,
3192
+ MODEL_PROVIDER_EXTRAS,
3193
+ SANDBOX_EXTRAS,
3194
+ )
3195
+ from deepagents_code.update_check import (
3196
+ create_update_log_path,
3197
+ editable_extra_hint,
3198
+ install_extra_command,
3199
+ is_valid_extra_name,
3200
+ perform_install_extra,
3201
+ )
3202
+ except ImportError as exc:
3203
+ logger.warning("/install command import failed", exc_info=True)
3204
+ await self._mount_message(
3205
+ ErrorMessage(f"Install failed: {type(exc).__name__}: {exc}"),
3206
+ )
3207
+ return
3208
+
3209
+ if not is_valid_extra_name(extra):
3210
+ await self._mount_message(
3211
+ AppMessage(
3212
+ "Invalid extra name. Extra names must be "
3213
+ "alphanumeric with `-`, `_`, or `.` (PEP 508).",
3214
+ ),
3215
+ )
3216
+ return
3217
+
3218
+ if await asyncio.to_thread(_is_editable_install):
3219
+ await self._mount_message(
3220
+ AppMessage(
3221
+ "Editable install detected — cannot install extras.\n"
3222
+ + editable_extra_hint(extra),
3223
+ ),
3224
+ )
3225
+ return
3226
+
3227
+ if extra not in KNOWN_EXTRAS and not force:
3228
+ known = ", ".join(sorted(KNOWN_EXTRAS))
3229
+ await self._mount_message(
3230
+ AppMessage(
3231
+ f"'{extra}' is not a known extra.\n"
3232
+ f"Known extras: {known}\n\n"
3233
+ f"This would run: `{install_extra_command(extra)}`\n"
3234
+ f"Re-run with `--force` to install anyway: "
3235
+ f"`/install {extra} --force`",
3236
+ ),
3237
+ )
3238
+ return
3239
+
3240
+ log_path = create_update_log_path()
3241
+ await self._mount_message(
3242
+ AppMessage(f"Installing extra '{extra}'..."),
3243
+ )
3244
+ manual_cmd = install_extra_command(extra)
3245
+ try:
3246
+ success, output = await perform_install_extra(extra, log_path=log_path)
3247
+ except (OSError, asyncio.CancelledError) as exc:
3248
+ logger.warning("/install command failed", exc_info=True)
3249
+ await self._mount_message(
3250
+ ErrorMessage(
3251
+ f"Install failed: {type(exc).__name__}: {exc}\n"
3252
+ f"Log: {log_path}\n"
3253
+ f"Run manually: {manual_cmd}",
3254
+ ),
3255
+ )
3256
+ return
3257
+
3258
+ if not success:
3259
+ # Tail the last 200 chars — uv resolver prints the resolved
3260
+ # error at the end, not the beginning.
3261
+ detail = f": {output[-200:]}" if output else ""
3262
+ await self._mount_message(
3263
+ ErrorMessage(
3264
+ f"Install failed{detail}\n"
3265
+ f"Log: {log_path}\n"
3266
+ f"Run manually: {manual_cmd}",
3267
+ ),
3268
+ )
3269
+ return
3270
+
3271
+ # Model-provider and sandbox extras are imported by the langgraph
3272
+ # server subprocess; `/restart` respawns that subprocess and picks
3273
+ # them up without exiting the TUI. `quickjs` (and other
3274
+ # STANDALONE_EXTRAS) are wired into the parent process at startup
3275
+ # (`verify_interpreter_deps` gates `--interpreter`), so a full
3276
+ # relaunch is required.
3277
+ if extra in MODEL_PROVIDER_EXTRAS or extra in SANDBOX_EXTRAS:
3278
+ next_step = "Run `/restart` to load it now, or relaunch dcode."
3279
+ else:
3280
+ next_step = "Exit and relaunch dcode to use the new dependencies."
3281
+
3282
+ await self._mount_message(
3283
+ AppMessage(f"Installed extra '{extra}'. {next_step}"),
3284
+ )
3285
+
3125
3286
  async def _handle_version_command(self) -> None:
3126
3287
  """Handle the `/version` slash command — show versions and update status.
3127
3288
 
@@ -3174,7 +3335,7 @@ class DeepAgentsApp(App):
3174
3335
  except Exception:
3175
3336
  logger.warning(
3176
3337
  "Could not resolve upgrade command for /version; "
3177
- "falling back to generic pip hint",
3338
+ "falling back to generic upgrade hint",
3178
3339
  exc_info=True,
3179
3340
  )
3180
3341
  from deepagents_code.update_check import FALLBACK_UPGRADE_COMMAND
@@ -4972,7 +5133,9 @@ class DeepAgentsApp(App):
4972
5133
  await self._mount_message(
4973
5134
  AppMessage(
4974
5135
  "The `langsmith` package is not installed. "
4975
- "Install it with `pip install langsmith` to enable `/trace`.",
5136
+ "Install it with "
5137
+ "`uv tool install -U deepagents-code --with langsmith` "
5138
+ "to enable `/trace`.",
4976
5139
  ),
4977
5140
  )
4978
5141
  return
@@ -5070,7 +5233,8 @@ class DeepAgentsApp(App):
5070
5233
  "/mcp, /model [--model-params JSON] [--default], "
5071
5234
  "/notifications, /reload, /skill:<name>, /remember, "
5072
5235
  "/skill-creator, /theme, /tokens, /threads, /trace, "
5073
- "/update, /auto-update, /changelog, /docs, /feedback, /help\n\n"
5236
+ "/update, /auto-update, /install, /changelog, /docs, "
5237
+ "/feedback, /help\n\n"
5074
5238
  "Interactive Features:\n"
5075
5239
  " Enter Submit your message\n"
5076
5240
  f" {newline_shortcut():<15} Insert newline\n"
@@ -5180,6 +5344,8 @@ class DeepAgentsApp(App):
5180
5344
  await self._handle_update_command()
5181
5345
  elif cmd == "/auto-update":
5182
5346
  await self._handle_auto_update_toggle()
5347
+ elif cmd == "/install" or cmd.startswith("/install "):
5348
+ await self._handle_install_command(command)
5183
5349
  elif cmd == "/tokens":
5184
5350
  await self._mount_message(UserMessage(command))
5185
5351
  if self._context_tokens > 0:
@@ -7569,6 +7735,7 @@ class DeepAgentsApp(App):
7569
7735
  self._mcp_tool_count,
7570
7736
  mcp_unauthenticated=self._mcp_unauthenticated,
7571
7737
  mcp_errored=self._mcp_errored,
7738
+ mcp_awaiting_reconnect=self._mcp_awaiting_reconnect,
7572
7739
  )
7573
7740
  except NoMatches:
7574
7741
  pass
@@ -8341,6 +8508,34 @@ class DeepAgentsApp(App):
8341
8508
  self._pending_mcp_disable_reconnect_servers
8342
8509
  )
8343
8510
 
8511
+ def _refresh_welcome_banner_mcp_counts(self) -> None:
8512
+ """Push current MCP counts into the welcome banner when it is mounted."""
8513
+ try:
8514
+ banner = self.query_one("#welcome-banner", WelcomeBanner)
8515
+ except NoMatches:
8516
+ logger.debug("Welcome banner not mounted during MCP count refresh")
8517
+ return
8518
+ banner.set_connected(
8519
+ self._mcp_tool_count,
8520
+ mcp_unauthenticated=self._mcp_unauthenticated,
8521
+ mcp_errored=self._mcp_errored,
8522
+ mcp_awaiting_reconnect=self._mcp_awaiting_reconnect,
8523
+ )
8524
+
8525
+ def _clear_mcp_login_reconnect_banner_counts(self, server_name: str) -> None:
8526
+ """Optimistically clear splash login/reconnect prompts before restart.
8527
+
8528
+ Args:
8529
+ server_name: Server whose successful login triggered the reconnect.
8530
+ """
8531
+ self._mcp_unauthenticated = sum(
8532
+ 1
8533
+ for s in self._mcp_server_info or []
8534
+ if s.name != server_name and s.needs_attention()
8535
+ )
8536
+ self._mcp_awaiting_reconnect = 0
8537
+ self._refresh_welcome_banner_mcp_counts()
8538
+
8344
8539
  async def _handle_mcp_reconnect_command(self, *, force: bool = False) -> None:
8345
8540
  """Restart the server to pick up any deferred MCP login tokens.
8346
8541
 
@@ -8595,6 +8790,50 @@ class DeepAgentsApp(App):
8595
8790
  )
8596
8791
  self._mcp_server_info = updated
8597
8792
 
8793
+ def _apply_optimistic_mcp_login_pending_state(self, server_name: str) -> None:
8794
+ """Mark a just-authenticated server as waiting for reconnect.
8795
+
8796
+ OAuth tokens are already persisted at this point, but the running
8797
+ LangGraph server still has the old MCP tool set. This keeps `/mcp`
8798
+ from continuing to label the server as unauthenticated after the
8799
+ user explicitly chose to defer the reconnect.
8800
+ """
8801
+ from deepagents_code.mcp_tools import MCPServerInfo
8802
+
8803
+ info = self._mcp_server_info
8804
+ if not info:
8805
+ return
8806
+
8807
+ updated: list[MCPServerInfo] = []
8808
+ matched = False
8809
+ for entry in info:
8810
+ if entry.name != server_name:
8811
+ updated.append(entry)
8812
+ continue
8813
+ matched = True
8814
+ updated.append(
8815
+ MCPServerInfo(
8816
+ name=entry.name,
8817
+ transport=entry.transport,
8818
+ status="awaiting_reconnect",
8819
+ error="Authenticated — run `/mcp reconnect` to load tools.",
8820
+ ),
8821
+ )
8822
+ self._mcp_server_info = updated
8823
+ self._mcp_unauthenticated = sum(
8824
+ 1 for s in self._mcp_server_info if s.needs_attention()
8825
+ )
8826
+ self._mcp_errored = sum(1 for s in self._mcp_server_info if s.status == "error")
8827
+ self._mcp_awaiting_reconnect = sum(
8828
+ 1 for s in self._mcp_server_info if s.status == "awaiting_reconnect"
8829
+ )
8830
+ if not matched:
8831
+ logger.warning(
8832
+ "MCP login completed for unknown server %r; pending state unchanged",
8833
+ server_name,
8834
+ )
8835
+ self._refresh_welcome_banner_mcp_counts()
8836
+
8598
8837
  def on_worker_state_changed(self, event: Worker.StateChanged) -> None:
8599
8838
  """Surface login worker failures that escaped the inner error handling."""
8600
8839
  from textual.worker import WorkerState
@@ -8811,6 +9050,7 @@ class DeepAgentsApp(App):
8811
9050
  )
8812
9051
  self._pending_mcp_login_reconnect = True
8813
9052
  self._sync_pending_mcp_reconnect()
9053
+ self._apply_optimistic_mcp_login_pending_state(server_name)
8814
9054
  self.notify(
8815
9055
  f"Logged in to {server_name!r} but the reconnect prompt "
8816
9056
  "failed. Run `/mcp reconnect` when ready to load the new tools.",
@@ -8865,6 +9105,7 @@ class DeepAgentsApp(App):
8865
9105
  self._pending_mcp_login_reconnect = False
8866
9106
  self._pending_mcp_disable_reconnect_servers.clear()
8867
9107
  self._sync_pending_mcp_reconnect()
9108
+ self._clear_mcp_login_reconnect_banner_counts(server_name)
8868
9109
  await self._restart_server_for_mcp_refresh(server_name)
8869
9110
  return
8870
9111
 
@@ -8876,6 +9117,7 @@ class DeepAgentsApp(App):
8876
9117
  # an action they didn't take.
8877
9118
  self._pending_mcp_login_reconnect = True
8878
9119
  self._sync_pending_mcp_reconnect()
9120
+ self._apply_optimistic_mcp_login_pending_state(server_name)
8879
9121
  if choice == "later":
8880
9122
  self.notify(
8881
9123
  f"Logged in to {server_name!r}. Run `/mcp reconnect` when ready "
@@ -183,6 +183,13 @@ COMMANDS: tuple[SlashCommand, ...] = (
183
183
  bypass_tier=BypassTier.QUEUED,
184
184
  hidden_keywords="upgrade",
185
185
  ),
186
+ SlashCommand(
187
+ name="/install",
188
+ description="Install an optional extra (e.g. quickjs, daytona, fireworks)",
189
+ bypass_tier=BypassTier.QUEUED,
190
+ hidden_keywords="extra extras add provider sandbox dependency",
191
+ argument_hint="<extra> [--force]",
192
+ ),
186
193
  SlashCommand(
187
194
  name="/auto-update",
188
195
  description="Toggle automatic updates on or off",
@@ -2464,10 +2464,27 @@ def _create_model_via_init(
2464
2464
  f"import for provider '{provider}': {e}"
2465
2465
  )
2466
2466
  else:
2467
- msg = (
2468
- f"Missing package for provider '{provider}'. "
2469
- f"Install: pip install {package}"
2470
- )
2467
+ from deepagents_code.extras_info import extra_for_package
2468
+
2469
+ extra = extra_for_package(package)
2470
+ if extra is not None:
2471
+ msg = (
2472
+ f"Missing package for provider '{provider}'. "
2473
+ f"Install: /install {extra}"
2474
+ )
2475
+ else:
2476
+ from deepagents_code.update_check import install_package_command
2477
+
2478
+ try:
2479
+ install_cmd = install_package_command(package)
2480
+ except ValueError:
2481
+ install_hint = f"Install the '{package}' package manually"
2482
+ else:
2483
+ install_hint = f"Install with: {install_cmd}"
2484
+ msg = (
2485
+ f"Missing package for provider '{provider}'. "
2486
+ f"{install_hint}, then retry with `/model`."
2487
+ )
2471
2488
  raise MissingProviderPackageError(
2472
2489
  msg, provider=provider, package=package
2473
2490
  ) from e