deepagents-code 0.1.75__tar.gz → 0.1.76__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 (563) hide show
  1. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/CHANGELOG.md +11 -0
  2. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/PKG-INFO +8 -8
  3. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_build_info.py +1 -1
  4. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_version.py +1 -1
  5. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/mcp_login_service.py +40 -11
  6. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/mcp_viewer.py +15 -31
  7. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/pyproject.toml +6 -6
  8. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_mcp_login_service.py +149 -2
  9. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +69 -11
  10. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/uv.lock +17 -17
  11. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/.gitignore +0 -0
  12. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/AGENTS.md +0 -0
  13. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/ARCHITECTURE.md +0 -0
  14. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/COMMANDS.md +0 -0
  15. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/DEVELOPMENT.md +0 -0
  16. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/EXTENSIONS.md +0 -0
  17. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/HOOKS.md +0 -0
  18. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/LICENSE +0 -0
  19. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/Makefile +0 -0
  20. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/PRICING.md +0 -0
  21. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/README.md +0 -0
  22. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/THREAT_MODEL.md +0 -0
  23. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/__init__.py +0 -0
  24. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/__main__.py +0 -0
  25. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_ask_user_types.py +0 -0
  26. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_cli_context.py +0 -0
  27. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_constants.py +0 -0
  28. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_content_blocks.py +0 -0
  29. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_debug.py +0 -0
  30. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_debug_buffer.py +0 -0
  31. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_dep_floor_check.py +0 -0
  32. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_env_vars.py +0 -0
  33. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_fake_models.py +0 -0
  34. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_git.py +0 -0
  35. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_glm_5p2_profile.py +0 -0
  36. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_home_error.py +0 -0
  37. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_invocation.py +0 -0
  38. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_markdown.py +0 -0
  39. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_paths.py +0 -0
  40. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_repository_bounds.py +0 -0
  41. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_reserved_names.py +0 -0
  42. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_server_config.py +0 -0
  43. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_session_stats.py +0 -0
  44. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_startup_error.py +0 -0
  45. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_terminal_stderr.py +0 -0
  46. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_testing_models.py +0 -0
  47. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_textual_patches.py +0 -0
  48. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_tool_stream.py +0 -0
  49. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/_tracing.py +0 -0
  50. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/acp.py +0 -0
  51. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/agent.py +0 -0
  52. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/app.py +0 -0
  53. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/app.tcss +0 -0
  54. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/approval_mode.py +0 -0
  55. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/ask_user.py +0 -0
  56. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/auth_display.py +0 -0
  57. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/auth_store.py +0 -0
  58. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/auto_mode.py +0 -0
  59. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/built_in_skills/__init__.py +0 -0
  60. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
  61. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
  62. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  63. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  64. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  65. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  66. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/bundled_prices.README.md +0 -0
  67. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/bundled_prices.json +0 -0
  68. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/client/__init__.py +0 -0
  69. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/client/commands/__init__.py +0 -0
  70. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/client/commands/auth.py +0 -0
  71. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/client/commands/config.py +0 -0
  72. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/client/commands/extras.py +0 -0
  73. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/client/commands/mcp.py +0 -0
  74. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/client/commands/tools.py +0 -0
  75. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/client/launch/__init__.py +0 -0
  76. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/client/launch/server.py +0 -0
  77. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/client/launch/server_manager.py +0 -0
  78. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/client/non_interactive.py +0 -0
  79. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/client/remote_client.py +0 -0
  80. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/clipboard.py +0 -0
  81. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/cold_cache.py +0 -0
  82. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/command_registry.py +0 -0
  83. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/config.py +0 -0
  84. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/config_manifest.py +0 -0
  85. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/configurable_model.py +0 -0
  86. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/configuration/__init__.py +0 -0
  87. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/configuration/interpreter.py +0 -0
  88. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/configuration/paths.py +0 -0
  89. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/configuration/provider.py +0 -0
  90. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/configuration/providers.py +0 -0
  91. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/configuration/resolver.py +0 -0
  92. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/configuration/service.py +0 -0
  93. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/configuration/theme_resolution.py +0 -0
  94. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/configuration/types.py +0 -0
  95. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/configuration/writer.py +0 -0
  96. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/context_doctor.py +0 -0
  97. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/cost_tracking.py +0 -0
  98. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/default_agent_prompt.md +0 -0
  99. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/diff_utils.py +0 -0
  100. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/doctor.py +0 -0
  101. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/editor.py +0 -0
  102. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/event_bus.py +0 -0
  103. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/extensions/__init__.py +0 -0
  104. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/extensions/api.py +0 -0
  105. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/extensions/discovery.py +0 -0
  106. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/extensions/hosting.py +0 -0
  107. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/extensions/loader.py +0 -0
  108. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/extensions/registry.py +0 -0
  109. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/extensions/runtime.py +0 -0
  110. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/extensions/settings.py +0 -0
  111. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/extensions/trust.py +0 -0
  112. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/extras_info.py +0 -0
  113. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/file_ops.py +0 -0
  114. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/formatting.py +0 -0
  115. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/goal_rubric.py +0 -0
  116. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/goal_state_limits.py +0 -0
  117. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/goal_state_notice.py +0 -0
  118. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/goal_tools.py +0 -0
  119. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/__init__.py +0 -0
  120. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/capabilities.py +0 -0
  121. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/client.py +0 -0
  122. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/client_lifecycle.py +0 -0
  123. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/context.py +0 -0
  124. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/engine.py +0 -0
  125. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/env.py +0 -0
  126. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/envelope.py +0 -0
  127. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/interrupt.py +0 -0
  128. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/legacy.py +0 -0
  129. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/loading.py +0 -0
  130. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/manager.py +0 -0
  131. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/migration.py +0 -0
  132. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/models/__init__.py +0 -0
  133. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/models/adapters.py +0 -0
  134. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/models/config.py +0 -0
  135. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/models/domain.py +0 -0
  136. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/models/transport.py +0 -0
  137. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/models/wire.py +0 -0
  138. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/permissions.py +0 -0
  139. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/presenter.py +0 -0
  140. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/projection.py +0 -0
  141. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/reducer.py +0 -0
  142. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/runner.py +0 -0
  143. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/runtime.py +0 -0
  144. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/server_middleware.py +0 -0
  145. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/snapshot.py +0 -0
  146. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/tools.py +0 -0
  147. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/transcript.py +0 -0
  148. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/trust.py +0 -0
  149. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
  150. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/input.py +0 -0
  151. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/integrations/__init__.py +0 -0
  152. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/integrations/openai_codex.py +0 -0
  153. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/integrations/sandbox_config.py +0 -0
  154. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/integrations/sandbox_factory.py +0 -0
  155. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/integrations/sandbox_provider.py +0 -0
  156. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/integrations/sandbox_registry.py +0 -0
  157. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/iterm_cursor_guide.py +0 -0
  158. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/json_types.py +0 -0
  159. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/local_context.py +0 -0
  160. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/main.py +0 -0
  161. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/managed_tools.py +0 -0
  162. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/mcp_auth.py +0 -0
  163. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/mcp_config.py +0 -0
  164. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/mcp_disabled.py +0 -0
  165. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/mcp_middleware.py +0 -0
  166. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/mcp_oauth_ui.py +0 -0
  167. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/mcp_providers/__init__.py +0 -0
  168. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/mcp_providers/_registry.py +0 -0
  169. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/mcp_providers/base.py +0 -0
  170. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/mcp_providers/github.py +0 -0
  171. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/mcp_providers/slack.py +0 -0
  172. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/mcp_proxy.py +0 -0
  173. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/mcp_tools.py +0 -0
  174. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/media_utils.py +0 -0
  175. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/memory_guard.py +0 -0
  176. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/model_config.py +0 -0
  177. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/model_retry.py +0 -0
  178. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/notifications.py +0 -0
  179. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/offload.py +0 -0
  180. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/offload_api.py +0 -0
  181. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/offload_middleware.py +0 -0
  182. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/onboarding.py +0 -0
  183. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/output.py +0 -0
  184. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/paste_collapse.py +0 -0
  185. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/plugins/__init__.py +0 -0
  186. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/plugins/_json.py +0 -0
  187. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/plugins/adapters/__init__.py +0 -0
  188. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/plugins/adapters/hooks.py +0 -0
  189. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/plugins/adapters/mcp.py +0 -0
  190. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/plugins/adapters/skills.py +0 -0
  191. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
  192. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/plugins/commands_cli.py +0 -0
  193. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/plugins/discovery.py +0 -0
  194. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/plugins/manifest.py +0 -0
  195. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/plugins/marketplace.py +0 -0
  196. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/plugins/models.py +0 -0
  197. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/plugins/store.py +0 -0
  198. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/plugins/substitution.py +0 -0
  199. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/project_utils.py +0 -0
  200. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/py.typed +0 -0
  201. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/reasoning_effort.py +0 -0
  202. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/reliable_rubric.py +0 -0
  203. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/resume_state.py +0 -0
  204. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/server_graph.py +0 -0
  205. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/sessions.py +0 -0
  206. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/skills/__init__.py +0 -0
  207. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/skills/commands.py +0 -0
  208. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/skills/invocation.py +0 -0
  209. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/skills/load.py +0 -0
  210. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/skills/merge.py +0 -0
  211. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/skills/trust.py +0 -0
  212. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/state_migration.py +0 -0
  213. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/subagents.py +0 -0
  214. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/system_prompt.md +0 -0
  215. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/terminal_capabilities.py +0 -0
  216. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/terminal_escape.py +0 -0
  217. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/theme.py +0 -0
  218. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tool_catalog.py +0 -0
  219. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tool_display.py +0 -0
  220. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tools.py +0 -0
  221. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/__init__.py +0 -0
  222. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/key_hints.py +0 -0
  223. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/modals/__init__.py +0 -0
  224. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/modals/cold_cache.py +0 -0
  225. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/modals/cost_breakdown.py +0 -0
  226. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/modals/model_switch.py +0 -0
  227. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
  228. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
  229. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
  230. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
  231. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
  232. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
  233. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/modals/prompt_clipboard.py +0 -0
  234. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/modals/prompt_clipboard.tcss +0 -0
  235. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/modals/resume_blocked.py +0 -0
  236. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/modals/resume_compact.py +0 -0
  237. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/modals/session_cost.py +0 -0
  238. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/modals/session_cost.tcss +0 -0
  239. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/screens/__init__.py +0 -0
  240. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/textual_adapter.py +0 -0
  241. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/__init__.py +0 -0
  242. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/_condense_path.py +0 -0
  243. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
  244. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
  245. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  246. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/_links.py +0 -0
  247. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
  248. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/agent_selector.py +0 -0
  249. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/approval.py +0 -0
  250. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/ask_user.py +0 -0
  251. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/auth.py +0 -0
  252. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
  253. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/autocomplete.py +0 -0
  254. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/chat_input.py +0 -0
  255. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  256. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/context_usage.py +0 -0
  257. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  258. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/debug_console.py +0 -0
  259. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/diff.py +0 -0
  260. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  261. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/goal_review.py +0 -0
  262. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/goal_status.py +0 -0
  263. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/history.py +0 -0
  264. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  265. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/launch_init.py +0 -0
  266. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/loading.py +0 -0
  267. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  268. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  269. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/message_store.py +0 -0
  270. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/messages.py +0 -0
  271. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/model_selector.py +0 -0
  272. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/notification_center.py +0 -0
  273. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  274. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  275. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/prompt_search.py +0 -0
  276. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
  277. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  278. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/startup_tip.py +0 -0
  279. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/status.py +0 -0
  280. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  281. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  282. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
  283. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/thread_selector.py +0 -0
  284. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  285. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  286. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/update_available.py +0 -0
  287. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  288. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/update_progress.py +0 -0
  289. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/welcome.py +0 -0
  290. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
  291. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/ui.py +0 -0
  292. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/unicode_security.py +0 -0
  293. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/update_check.py +0 -0
  294. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/workspace.py +0 -0
  295. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/deepagents_code/workspace_diagnostics.py +0 -0
  296. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/examples/extensions/memory_store.py +0 -0
  297. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/examples/skills/arxiv-search/SKILL.md +0 -0
  298. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  299. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/examples/skills/langgraph-docs/SKILL.md +0 -0
  300. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/examples/skills/skill-creator/SKILL.md +0 -0
  301. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  302. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  303. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/examples/skills/web-research/SKILL.md +0 -0
  304. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/hatch_build.py +0 -0
  305. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/images/debug-console-cost-breakdown.png +0 -0
  306. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/images/model-stream-retry.png +0 -0
  307. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/images/tui.png +0 -0
  308. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/scripts/check_imports.py +0 -0
  309. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/scripts/check_process_cwd.py +0 -0
  310. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/scripts/debug_server.sh +0 -0
  311. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/scripts/generate_commands_catalog.py +0 -0
  312. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/scripts/install.sh +0 -0
  313. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/README.md +0 -0
  314. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/integration_tests/__init__.py +0 -0
  315. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/integration_tests/benchmarks/__init__.py +0 -0
  316. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  317. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
  318. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  319. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/integration_tests/benchmarks/test_thread_loading_benchmarks.py +0 -0
  320. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/integration_tests/conftest.py +0 -0
  321. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/integration_tests/test_acp_mode.py +0 -0
  322. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  323. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/integration_tests/test_compact_resume.py +0 -0
  324. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/integration_tests/test_offload_server_side.py +0 -0
  325. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/integration_tests/test_pending_work_recovery.py +0 -0
  326. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/integration_tests/test_sandbox_factory.py +0 -0
  327. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/integration_tests/test_sandbox_operations.py +0 -0
  328. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/__init__.py +0 -0
  329. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/client/__init__.py +0 -0
  330. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/client/commands/__init__.py +0 -0
  331. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/client/commands/test_auth.py +0 -0
  332. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/client/commands/test_extras.py +0 -0
  333. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/client/commands/test_mcp.py +0 -0
  334. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/client/commands/test_tools.py +0 -0
  335. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/conftest.py +0 -0
  336. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  337. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/hooks/__init__.py +0 -0
  338. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/hooks/models/__init__.py +0 -0
  339. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/hooks/models/test_models.py +0 -0
  340. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
  341. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/hooks/test_configuration.py +0 -0
  342. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/hooks/test_engine.py +0 -0
  343. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/hooks/test_execution.py +0 -0
  344. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/hooks/test_manager.py +0 -0
  345. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/hooks/test_presenter.py +0 -0
  346. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/hooks/test_server_lifecycle.py +0 -0
  347. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/hooks/test_transcript.py +0 -0
  348. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/hooks/test_trust.py +0 -0
  349. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/plugins/__init__.py +0 -0
  350. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/plugins/test_marketplace.py +0 -0
  351. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
  352. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
  353. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/skills/__init__.py +0 -0
  354. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/skills/test_commands.py +0 -0
  355. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/skills/test_load.py +0 -0
  356. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/skills/test_merge.py +0 -0
  357. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  358. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/skills/test_skills_json.py +0 -0
  359. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
  360. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  361. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  362. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/smoke_tests/snapshots/system_prompt_headless_local.md +0 -0
  363. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
  364. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
  365. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test__tool_stream.py +0 -0
  366. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_acp.py +0 -0
  367. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_agent.py +0 -0
  368. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_agent_friendly.py +0 -0
  369. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_app.py +0 -0
  370. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_approval_mode.py +0 -0
  371. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_args.py +0 -0
  372. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  373. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_ask_user_types.py +0 -0
  374. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_auth_display.py +0 -0
  375. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_auth_store.py +0 -0
  376. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  377. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_auto_mode.py +0 -0
  378. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_charset.py +0 -0
  379. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_cli_provider.py +0 -0
  380. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_clipboard.py +0 -0
  381. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  382. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_cold_cache.py +0 -0
  383. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_command_registry.py +0 -0
  384. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_compact_tool.py +0 -0
  385. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_config.py +0 -0
  386. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_config_manifest.py +0 -0
  387. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_configurable_model.py +0 -0
  388. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_configuration.py +0 -0
  389. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_configuration_resolution.py +0 -0
  390. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_configuration_resolver.py +0 -0
  391. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_context_doctor.py +0 -0
  392. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_cost_tracking.py +0 -0
  393. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_cursor_style.py +0 -0
  394. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_debug.py +0 -0
  395. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_debug_buffer.py +0 -0
  396. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_debug_console.py +0 -0
  397. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_dep_floor_check.py +0 -0
  398. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_diff_utils.py +0 -0
  399. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_doctor.py +0 -0
  400. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_editor.py +0 -0
  401. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_end_to_end.py +0 -0
  402. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_env_vars.py +0 -0
  403. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_event_bus.py +0 -0
  404. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_exception_handling.py +0 -0
  405. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_extension_api.py +0 -0
  406. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_extension_cli_trust.py +0 -0
  407. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_extension_config_manifest.py +0 -0
  408. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_extension_discovery.py +0 -0
  409. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_extension_display.py +0 -0
  410. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_extension_host_runtime.py +0 -0
  411. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_extension_hosting.py +0 -0
  412. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_extension_runtime.py +0 -0
  413. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_extra_skills_dirs.py +0 -0
  414. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_extras_info.py +0 -0
  415. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_file_ops.py +0 -0
  416. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_formatting.py +0 -0
  417. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_git.py +0 -0
  418. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
  419. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_goal_criteria_client.py +0 -0
  420. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_goal_rubric.py +0 -0
  421. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_goal_state_limits.py +0 -0
  422. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_goal_state_notice.py +0 -0
  423. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_goal_state_persistence.py +0 -0
  424. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_goal_tools.py +0 -0
  425. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_hatch_build.py +0 -0
  426. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_hooks.py +0 -0
  427. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_imports.py +0 -0
  428. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_input_parsing.py +0 -0
  429. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_install_command.py +0 -0
  430. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_install_script.py +0 -0
  431. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_invocation.py +0 -0
  432. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  433. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_json_types.py +0 -0
  434. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_local_context.py +0 -0
  435. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_main.py +0 -0
  436. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_main_acp_mode.py +0 -0
  437. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_main_args.py +0 -0
  438. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_managed_tools.py +0 -0
  439. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_mcp_auth.py +0 -0
  440. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_mcp_config.py +0 -0
  441. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_mcp_disabled.py +0 -0
  442. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_mcp_lifecycle.py +0 -0
  443. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  444. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_mcp_proxy.py +0 -0
  445. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_mcp_schema.py +0 -0
  446. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_mcp_tools.py +0 -0
  447. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_media_utils.py +0 -0
  448. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_memory_guard.py +0 -0
  449. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_model_config.py +0 -0
  450. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_model_retry.py +0 -0
  451. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_model_switch.py +0 -0
  452. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_non_interactive.py +0 -0
  453. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_notifications.py +0 -0
  454. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_offload.py +0 -0
  455. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_offload_api.py +0 -0
  456. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_onboarding.py +0 -0
  457. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  458. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_output.py +0 -0
  459. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_paths.py +0 -0
  460. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_process_cwd_check.py +0 -0
  461. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_reasoning_effort.py +0 -0
  462. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_reliable_rubric.py +0 -0
  463. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_reload.py +0 -0
  464. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_remote_client.py +0 -0
  465. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_repository_bounds.py +0 -0
  466. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_resume_compaction_recovery.py +0 -0
  467. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_resume_state.py +0 -0
  468. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_rubric_cli.py +0 -0
  469. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_sandbox_config.py +0 -0
  470. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_sandbox_factory.py +0 -0
  471. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_sandbox_provider.py +0 -0
  472. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_sandbox_registry.py +0 -0
  473. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_server.py +0 -0
  474. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_server_config.py +0 -0
  475. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_server_graph.py +0 -0
  476. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_server_helpers.py +0 -0
  477. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_server_manager.py +0 -0
  478. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_server_tracing.py +0 -0
  479. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_session_stats.py +0 -0
  480. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_sessions.py +0 -0
  481. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_shell_allow_list.py +0 -0
  482. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_skill_invocation.py +0 -0
  483. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  484. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_state_migration.py +0 -0
  485. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_subagents.py +0 -0
  486. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  487. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_terminal_escape.py +0 -0
  488. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  489. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_terminal_stderr.py +0 -0
  490. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_text_encoding.py +0 -0
  491. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_textual_patches.py +0 -0
  492. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_theme.py +0 -0
  493. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_threads_resume.py +0 -0
  494. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_tool_catalog.py +0 -0
  495. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_tool_display.py +0 -0
  496. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_tracing.py +0 -0
  497. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_tracing_replicas.py +0 -0
  498. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  499. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_ui.py +0 -0
  500. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_unicode_security.py +0 -0
  501. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_uninstall_command.py +0 -0
  502. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_update_check.py +0 -0
  503. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_version.py +0 -0
  504. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_workspace.py +0 -0
  505. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/test_workspace_diagnostics.py +0 -0
  506. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tools/__init__.py +0 -0
  507. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tools/test_current_thread.py +0 -0
  508. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  509. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
  510. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tools/test_web_search.py +0 -0
  511. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/__init__.py +0 -0
  512. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/modals/__init__.py +0 -0
  513. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
  514. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
  515. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/modals/test_cold_cache.py +0 -0
  516. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/modals/test_model_switch.py +0 -0
  517. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/modals/test_prompt_clipboard.py +0 -0
  518. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/modals/test_resume_blocked.py +0 -0
  519. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/modals/test_session_cost.py +0 -0
  520. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/test_key_hints.py +0 -0
  521. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/test_modal_footer_layout.py +0 -0
  522. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  523. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
  524. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  525. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  526. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  527. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
  528. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
  529. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
  530. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
  531. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
  532. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_condense_path.py +0 -0
  533. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
  534. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  535. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  536. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
  537. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  538. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
  539. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  540. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  541. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  542. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  543. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  544. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  545. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
  546. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
  547. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
  548. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  549. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  550. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
  551. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_prompt_search.py +0 -0
  552. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  553. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  554. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
  555. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_status.py +0 -0
  556. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  557. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
  558. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
  559. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  560. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  561. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  562. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
  563. {deepagents_code-0.1.75 → deepagents_code-0.1.76}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
@@ -2,6 +2,17 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.76](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.75...deepagents-code==0.1.76) (2026-09-24)
6
+
7
+ ### Features
8
+
9
+ - Label plugin servers in the MCP viewer ([#6539](https://github.com/langchain-ai/deepagents/pull/6539)).
10
+
11
+ ### Bug Fixes
12
+
13
+ - Resolve plugin MCP servers during login ([#6524](https://github.com/langchain-ai/deepagents/pull/6524)).
14
+ - Keep empty MCP servers searchable and include descriptions in search results ([#6540](https://github.com/langchain-ai/deepagents/pull/6540)).
15
+
5
16
  ## [0.1.75](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.74...deepagents-code==0.1.75) (2026-09-23)
6
17
 
7
18
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: deepagents-code
3
- Version: 0.1.75
3
+ Version: 0.1.76
4
4
  Summary: Terminal coding agent built on the Deep Agents SDK - works with any model, with persistent memory, customizable skills, subagents, and approval controls.
5
5
  Project-URL: Homepage, https://www.langchain.com/dcode
6
6
  Project-URL: Documentation, https://docs.langchain.com/oss/deepagents/code/overview
@@ -35,13 +35,13 @@ Requires-Dist: fastmcp<5.0.0,>=4.0.0b4
35
35
  Requires-Dist: filelock<3.30,>=3.29.7
36
36
  Requires-Dist: genai-prices<0.2.0,>=0.1.8
37
37
  Requires-Dist: httpx<1.0.0,>=0.28.1
38
- Requires-Dist: langchain-anthropic<2.0.0,>=1.7.3
38
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.7.4
39
39
  Requires-Dist: langchain-google-genai<5.0.0,>=4.4.0
40
- Requires-Dist: langchain-openai<2.0.0,>=1.6.4
40
+ Requires-Dist: langchain-openai<2.0.0,>=1.6.5
41
41
  Requires-Dist: langchain-quickjs<0.4.0,>=0.3.4
42
42
  Requires-Dist: langchain<2.0.0,>=1.4.2
43
43
  Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.1
44
- Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.31
44
+ Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.32
45
45
  Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.34.1
46
46
  Requires-Dist: langgraph-sdk<1.0.0,>=0.4.5
47
47
  Requires-Dist: langsmith[sandbox]>=0.14.0
@@ -66,7 +66,7 @@ Provides-Extra: agentcore
66
66
  Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.5; extra == 'agentcore'
67
67
  Provides-Extra: all-providers
68
68
  Requires-Dist: aiohttp<3.15.0,>=3.14.3; extra == 'all-providers'
69
- Requires-Dist: langchain-anthropic<2.0.0,>=1.7.3; extra == 'all-providers'
69
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.7.4; extra == 'all-providers'
70
70
  Requires-Dist: langchain-aws<2.0.0,>=1.7.9; extra == 'all-providers'
71
71
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.4; extra == 'all-providers'
72
72
  Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
@@ -82,7 +82,7 @@ Requires-Dist: langchain-meta<2.0.0,>=0.5.0; extra == 'all-providers'
82
82
  Requires-Dist: langchain-mistralai<2.0.0,>=1.1.6; extra == 'all-providers'
83
83
  Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'all-providers'
84
84
  Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
85
- Requires-Dist: langchain-openai<2.0.0,>=1.6.4; extra == 'all-providers'
85
+ Requires-Dist: langchain-openai<2.0.0,>=1.6.5; extra == 'all-providers'
86
86
  Requires-Dist: langchain-openrouter<2.0.0,>=0.2.9; extra == 'all-providers'
87
87
  Requires-Dist: langchain-perplexity<2.0.0,>=1.4.1; extra == 'all-providers'
88
88
  Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'all-providers'
@@ -94,7 +94,7 @@ Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
94
94
  Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
95
95
  Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
96
96
  Provides-Extra: anthropic
97
- Requires-Dist: langchain-anthropic<2.0.0,>=1.7.3; extra == 'anthropic'
97
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.7.4; extra == 'anthropic'
98
98
  Provides-Extra: baseten
99
99
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.4; extra == 'baseten'
100
100
  Provides-Extra: bedrock
@@ -132,7 +132,7 @@ Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'nvidia'
132
132
  Provides-Extra: ollama
133
133
  Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'ollama'
134
134
  Provides-Extra: openai
135
- Requires-Dist: langchain-openai<2.0.0,>=1.6.4; extra == 'openai'
135
+ Requires-Dist: langchain-openai<2.0.0,>=1.6.5; extra == 'openai'
136
136
  Provides-Extra: openrouter
137
137
  Requires-Dist: langchain-openrouter<2.0.0,>=0.2.9; extra == 'openrouter'
138
138
  Provides-Extra: perplexity
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "c526854"
3
+ BUILD_COMMIT = "e801fa1"
@@ -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.75" # x-release-please-version
5
+ __version__ = "0.1.76" # 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."""
@@ -15,7 +15,7 @@ functions that need them.
15
15
 
16
16
  from __future__ import annotations
17
17
 
18
- from dataclasses import dataclass
18
+ from dataclasses import dataclass, field
19
19
  from enum import StrEnum
20
20
  from pathlib import Path
21
21
  from typing import TYPE_CHECKING, Any
@@ -148,20 +148,26 @@ class ConfigResolution:
148
148
  the reason is already embedded in `message`, so the field lives only here.
149
149
  See `format_load_errors_notice`."""
150
150
 
151
+ includes_plugins: bool = field(default=False, kw_only=True)
152
+ """Whether enabled plugins contributed to the merged configuration."""
153
+
151
154
  def __post_init__(self) -> None:
152
- """Enforce the non-empty `used_paths` invariant.
155
+ """Require at least one file or plugin configuration source.
153
156
 
154
157
  Raises:
155
- ValueError: If `used_paths` is empty.
158
+ ValueError: If neither files nor plugins contributed configuration.
156
159
  """
157
- if not self.used_paths:
158
- msg = "ConfigResolution must have at least one used path"
160
+ if not self.used_paths and not self.includes_plugins:
161
+ msg = "ConfigResolution must have at least one file or plugin source"
159
162
  raise ValueError(msg)
160
163
 
161
164
  @property
162
165
  def search_label(self) -> str:
163
- """Human-readable join of the paths backing this resolution."""
164
- return ", ".join(str(path) for path in self.used_paths)
166
+ """Human-readable join of the sources backing this resolution."""
167
+ labels = [str(path) for path in self.used_paths]
168
+ if self.includes_plugins:
169
+ labels.append("enabled plugins")
170
+ return ", ".join(labels)
165
171
 
166
172
 
167
173
  @dataclass(frozen=True)
@@ -209,6 +215,7 @@ def resolve_mcp_config(
209
215
  _drop_invalid_mcp_config_servers,
210
216
  _load_mcp_config_top_level_with_error,
211
217
  _merge_mcp_configs_with_sources,
218
+ _resolve_project_config_base,
212
219
  discover_mcp_config_sources,
213
220
  filter_trusted_project_servers,
214
221
  load_mcp_config,
@@ -229,8 +236,12 @@ def resolve_mcp_config(
229
236
  used_paths=(Path(config_path),),
230
237
  )
231
238
 
239
+ from deepagents_code.plugins.adapters.mcp import discover_plugin_mcp_configs
240
+
232
241
  found = discover_mcp_config_sources()
233
- if not found:
242
+ plugin_project_root = _resolve_project_config_base(None)
243
+ plugin_configs = discover_plugin_mcp_configs(project_dir=plugin_project_root)
244
+ if not found and not plugin_configs:
234
245
  return ConfigResolutionError(
235
246
  kind=ConfigErrorKind.NO_CONFIG_FOUND,
236
247
  message=(
@@ -264,7 +275,8 @@ def resolve_mcp_config(
264
275
  elif error is not None:
265
276
  load_errors.append((path, error))
266
277
 
267
- if project_paths:
278
+ includes_plugins = False
279
+ if plugin_configs or project_paths:
268
280
  from deepagents_code.model_config import load_mcp_server_trust_lists
269
281
 
270
282
  trust_lists = load_mcp_server_trust_lists()
@@ -277,6 +289,20 @@ def resolve_mcp_config(
277
289
  # trust-list loader has already discarded scoped approvals while
278
290
  # retaining names explicitly enabled through the readable env var.
279
291
  policy_error = trust_lists.read_error
292
+ for plugin_config in plugin_configs:
293
+ plugin_servers = plugin_config.get("mcpServers")
294
+ if not isinstance(plugin_servers, dict):
295
+ continue
296
+ plugin_kept = filter_trusted_project_servers(
297
+ plugin_servers,
298
+ trust_lists,
299
+ project_root=plugin_project_root,
300
+ config_trusted=not trust_lists.load_failed,
301
+ )
302
+ if plugin_kept:
303
+ configs.append({**plugin_config, "mcpServers": plugin_kept})
304
+ includes_plugins = True
305
+
280
306
  config_trusted = trust_project_mcp is True and not trust_lists.load_failed
281
307
  loaded_projects: list[tuple[Path, dict[str, Any]]] = []
282
308
  for path in project_paths:
@@ -334,8 +360,10 @@ def resolve_mcp_config(
334
360
  detail = "; ".join(f"{path}: {error}" for path, error in load_errors)
335
361
  message = f"No usable MCP config found (load errors: {detail})"
336
362
  else:
337
- found_paths = ", ".join(str(source.path) for source in found)
338
- message = f"No usable MCP config found in: {found_paths}"
363
+ found_labels = [str(source.path) for source in found]
364
+ if plugin_configs:
365
+ found_labels.append("enabled plugins")
366
+ message = f"No usable MCP config found in: {', '.join(found_labels)}"
339
367
  return ConfigResolutionError(
340
368
  kind=ConfigErrorKind.NO_USABLE_CONFIG,
341
369
  message=message,
@@ -349,6 +377,7 @@ def resolve_mcp_config(
349
377
  return ConfigResolution(
350
378
  config=merge_mcp_configs(configs),
351
379
  used_paths=tuple(used_paths),
380
+ includes_plugins=includes_plugins,
352
381
  untrusted_project_paths=untrusted,
353
382
  legacy_ignored=legacy_ignored,
354
383
  policy_error=policy_error,
@@ -188,35 +188,21 @@ def _can_start_login(server: MCPServerInfo) -> bool:
188
188
  def _visible_tools_for(
189
189
  server: MCPServerInfo, tokens: list[str]
190
190
  ) -> tuple[MCPToolInfo, ...] | None:
191
- """Return the tools to render for `server` under the active filter.
192
-
193
- Filter matches tool and server *names* only — descriptions, parameter
194
- names, and the transport are deliberately not in the haystack so long
195
- MCP docstrings don't produce spurious matches. A server with zero tools
196
- that matches by name returns `None` so the caller can skip rendering a
197
- stub header followed by the global "No matching tools" empty-state.
198
-
199
- Args:
200
- server: The server whose tools are candidates for display.
201
- tokens: Lower-cased filter tokens — empty means "no filter".
191
+ """Match server names or tool names/descriptions, preserving empty servers.
202
192
 
203
193
  Returns:
204
- - `server.tools` when the filter is empty or matches the server name
205
- and the server actually has tools.
206
- - A subset tuple when individual tool names match.
207
- - `None` when nothing matches, including the server-name-match case
208
- on a server with zero tools — caller skips the header entirely.
194
+ Matching tools (possibly empty), or `None` to hide the server.
209
195
  """
210
196
  if not tokens:
211
197
  return server.tools
212
198
 
213
199
  if all(token in server.name.lower() for token in tokens):
214
- return server.tools or None
200
+ return server.tools
215
201
 
216
202
  matching = tuple(
217
203
  tool
218
204
  for tool in server.tools
219
- if all(token in tool.name.lower() for token in tokens)
205
+ if all(token in f"{tool.name} {tool.description}".lower() for token in tokens)
220
206
  )
221
207
  return matching or None
222
208
 
@@ -466,26 +452,30 @@ def _render_server_header(
466
452
  Styled `Content` ready to mount inside a `Static`.
467
453
  """
468
454
  dim_style = "" if selected else "dim"
455
+ name = Content.assemble(
456
+ (server.name, "bold"),
457
+ (" (plugin)", dim_style) if server.name.startswith("plugin__") else "",
458
+ )
469
459
  tool_count = len(visible_tools)
470
460
  t_label = "tool" if tool_count == 1 else "tools"
471
461
  if server.status == "ok":
472
462
  summary = f" {server.transport} {glyphs.bullet} {tool_count} {t_label}"
473
463
  return Content.assemble(
474
464
  (f"{indicator_glyph} ", indicator_color),
475
- (server.name, "bold"),
465
+ name,
476
466
  (summary, dim_style),
477
467
  )
478
468
  if server.status == "unauthenticated":
479
469
  return Content.assemble(
480
470
  (f"{indicator_glyph} ", indicator_color),
481
- (server.name, "bold"),
471
+ name,
482
472
  (f" {server.transport}", dim_style),
483
473
  (f" {glyphs.bullet} {server.status}", indicator_color),
484
474
  )
485
475
  if server.status == "awaiting_reconnect":
486
476
  return Content.assemble(
487
477
  (f"{indicator_glyph} ", indicator_color),
488
- (server.name, "bold"),
478
+ name,
489
479
  (f" {server.transport}", dim_style),
490
480
  (f" {glyphs.bullet} ready to load", indicator_color),
491
481
  (f" — {MCP_RECONNECT_KEY_LABEL} to load tools", dim_style),
@@ -493,7 +483,7 @@ def _render_server_header(
493
483
  if server.status == "error":
494
484
  return Content.assemble(
495
485
  (f"{indicator_glyph} ", indicator_color),
496
- (server.name, "bold"),
486
+ name,
497
487
  (f" {server.transport}", dim_style),
498
488
  (f" {glyphs.bullet} {server.status}", indicator_color),
499
489
  )
@@ -503,7 +493,7 @@ def _render_server_header(
503
493
  )
504
494
  return Content.assemble(
505
495
  (f"{indicator_glyph} ", indicator_color),
506
- (server.name, "bold"),
496
+ name,
507
497
  (f" {server.transport}", dim_style),
508
498
  (f" {glyphs.bullet} {server.status}", indicator_color),
509
499
  (f" — {error_text}", dim_style) if error_text else "",
@@ -1217,7 +1207,7 @@ class MCPViewerScreen(ModalScreen[str | None]):
1217
1207
  container.mount(
1218
1208
  Input(
1219
1209
  id="mcp-filter",
1220
- placeholder="Filter tools...",
1210
+ placeholder="Filter servers and tools...",
1221
1211
  value=self._query,
1222
1212
  )
1223
1213
  )
@@ -1318,13 +1308,7 @@ class MCPViewerScreen(ModalScreen[str | None]):
1318
1308
  help_static.update(self._build_help_text(get_glyphs()))
1319
1309
 
1320
1310
  def _populate_scroll(self, scroll: VerticalScroll, query: str) -> None:
1321
- """Mount filtered server headers + tool items into `scroll`.
1322
-
1323
- Empty `query` shows everything; otherwise multi-token AND matching
1324
- on server names and tool names only — descriptions, parameter
1325
- names, and transport are not in the haystack (see
1326
- `_visible_tools_for`).
1327
- """
1311
+ """Mount server headers and tools matching names or tool descriptions."""
1328
1312
  glyphs = get_glyphs()
1329
1313
 
1330
1314
  if not self._server_info:
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "deepagents-code"
7
- version = "0.1.75"
7
+ version = "0.1.76"
8
8
  description = "Terminal coding agent built on the Deep Agents SDK - works with any model, with persistent memory, customizable skills, subagents, and approval controls."
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -33,14 +33,14 @@ dependencies = [
33
33
 
34
34
  # Client-server architecture
35
35
  "langgraph-sdk>=0.4.5,<1.0.0",
36
- "langgraph-cli[inmem]>=0.4.31,<1.0.0",
36
+ "langgraph-cli[inmem]>=0.4.32,<1.0.0",
37
37
  "langgraph-runtime-inmem>=0.34.1,<1.0.0",
38
38
  "httpx>=0.28.1,<1.0.0",
39
39
 
40
40
  # Core model providers - others are added as optional
41
- "langchain-anthropic>=1.7.3,<2.0.0",
41
+ "langchain-anthropic>=1.7.4,<2.0.0",
42
42
  "langchain-google-genai>=4.4.0,<5.0.0",
43
- "langchain-openai>=1.6.4,<2.0.0",
43
+ "langchain-openai>=1.6.5,<2.0.0",
44
44
  "pydantic>=2.12.5,<2.14.0a0",
45
45
 
46
46
  # UI/Terminal
@@ -107,7 +107,7 @@ dependencies = [
107
107
 
108
108
  [project.optional-dependencies]
109
109
  # Model providers
110
- anthropic = ["langchain-anthropic>=1.7.3,<2.0.0"]
110
+ anthropic = ["langchain-anthropic>=1.7.4,<2.0.0"]
111
111
  baseten = ["langchain-baseten>=0.2.4,<1.0.0"]
112
112
  bedrock = ["langchain-aws>=1.7.9,<2.0.0"]
113
113
  cohere = ["langchain-cohere>=0.6.0,<1.0.0"]
@@ -125,7 +125,7 @@ nvidia = [
125
125
  "langchain-nvidia-ai-endpoints>=1.4.3,<2.0.0",
126
126
  ]
127
127
  ollama = ["langchain-ollama>=1.1.0,<2.0.0"]
128
- openai = ["langchain-openai>=1.6.4,<2.0.0"]
128
+ openai = ["langchain-openai>=1.6.5,<2.0.0"]
129
129
  openrouter = ["langchain-openrouter>=0.2.9,<2.0.0"]
130
130
  perplexity = ["langchain-perplexity>=1.4.1,<2.0.0"]
131
131
  together = ["langchain-together>=0.4.0,<2.0.0"]
@@ -2,10 +2,13 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import json
5
6
  from pathlib import Path
6
7
  from typing import TYPE_CHECKING
7
8
  from unittest.mock import patch
8
9
 
10
+ import pytest
11
+
9
12
  from deepagents_code.mcp_login_service import (
10
13
  ConfigErrorKind,
11
14
  ConfigResolution,
@@ -19,8 +22,6 @@ from deepagents_code.mcp_login_service import (
19
22
  from deepagents_code.mcp_tools import DiscoveredMCPConfig, MCPConfigScope
20
23
 
21
24
  if TYPE_CHECKING:
22
- import pytest
23
-
24
25
  from deepagents_code.json_types import JsonValue
25
26
 
26
27
 
@@ -72,6 +73,152 @@ def _isolate_project_mcp_trust_lists(
72
73
  return user_config
73
74
 
74
75
 
76
+ @pytest.fixture
77
+ def plugin_server(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> str:
78
+ """Install an enabled HTTP plugin in isolated local state."""
79
+ from deepagents_code.plugins.adapters.mcp import scoped_mcp_server_name
80
+
81
+ plugin_id = "sentry@claude-plugins-official"
82
+ plugin = tmp_path / "plugins" / "sentry"
83
+ state = tmp_path / "state"
84
+ for path, data in (
85
+ (state / "plugin_state.json", {"enabledPlugins": {plugin_id: True}}),
86
+ (
87
+ state / "installed_plugins.json",
88
+ {
89
+ "plugins": {
90
+ plugin_id: [{"installPath": str(plugin), "version": "1.4.0"}]
91
+ }
92
+ },
93
+ ),
94
+ (
95
+ plugin / ".claude-plugin" / "plugin.json",
96
+ {
97
+ "name": "sentry",
98
+ "version": "1.4.0",
99
+ "mcpServers": {
100
+ "sentry": {
101
+ "type": "http",
102
+ "url": "https://example.invalid/mcp",
103
+ "headers": {"X-Project": "${CLAUDE_PROJECT_DIR}"},
104
+ }
105
+ },
106
+ },
107
+ ),
108
+ ):
109
+ path.parent.mkdir(parents=True, exist_ok=True)
110
+ path.write_text(json.dumps(data), encoding="utf-8")
111
+ monkeypatch.setattr("deepagents_code.model_config.DEFAULT_STATE_DIR", state)
112
+ monkeypatch.setenv("DEEPAGENTS_CODE_PLUGIN_CACHE_DIR", str(tmp_path / "plugins"))
113
+ monkeypatch.setattr(
114
+ "deepagents_code.mcp_tools._resolve_project_config_base", lambda _: tmp_path
115
+ )
116
+ monkeypatch.setattr("deepagents_code.mcp_tools.discover_mcp_config_sources", list)
117
+ _isolate_project_mcp_trust_lists(monkeypatch, tmp_path)
118
+ return scoped_mcp_server_name(plugin_id, "sentry")
119
+
120
+
121
+ class TestResolveMcpConfigPlugins:
122
+ """Login discovers the same enabled plugin servers as startup."""
123
+
124
+ @pytest.mark.parametrize("with_user_config", [False, True])
125
+ def test_resolves_plugin_server(
126
+ self,
127
+ plugin_server: str,
128
+ tmp_path: Path,
129
+ monkeypatch: pytest.MonkeyPatch,
130
+ *,
131
+ with_user_config: bool,
132
+ ) -> None:
133
+ """Plugin login works with or without an ordinary MCP config file."""
134
+ user_cfg = tmp_path / "user.json"
135
+ user_cfg.write_text(
136
+ '{"mcpServers":{"docs":{"url":"https://docs.invalid/mcp"}}}'
137
+ )
138
+ if with_user_config:
139
+ monkeypatch.setattr(
140
+ "deepagents_code.mcp_tools.discover_mcp_config_sources",
141
+ lambda: [_user_source(user_cfg)],
142
+ )
143
+ result = resolve_mcp_config(None)
144
+ assert isinstance(result, ConfigResolution)
145
+ selection = select_server(result, plugin_server)
146
+ assert isinstance(selection, ServerSelection)
147
+ assert selection.server_name == plugin_server
148
+ assert selection.server_config["url"] == "https://example.invalid/mcp"
149
+ assert selection.server_config["headers"] == {"X-Project": str(tmp_path)}
150
+ assert result.used_paths == ((user_cfg,) if with_user_config else ())
151
+ assert "enabled plugins" in result.search_label
152
+ assert ("docs" in result.config["mcpServers"]) is with_user_config
153
+
154
+ @pytest.mark.parametrize("policy", ["disabled", "unreadable"])
155
+ def test_plugin_trust_fails_closed(
156
+ self,
157
+ plugin_server: str,
158
+ tmp_path: Path,
159
+ monkeypatch: pytest.MonkeyPatch,
160
+ policy: str,
161
+ ) -> None:
162
+ """Plugin installation never overrides a deny or an unreadable policy."""
163
+ config_text = (
164
+ f'[mcp]\ndisabled_project_servers = ["{plugin_server}"]\n'
165
+ if policy == "disabled"
166
+ else "[mcp]\ndisabled_project_servers = 123\n"
167
+ )
168
+ _isolate_project_mcp_trust_lists(monkeypatch, tmp_path, config_text)
169
+ result = resolve_mcp_config(None, trust_project_mcp=True)
170
+ assert isinstance(result, ConfigResolutionError)
171
+ assert result.kind is ConfigErrorKind.NO_USABLE_CONFIG
172
+ assert (result.policy_error is not None) is (policy == "unreadable")
173
+
174
+ @pytest.mark.parametrize("trusted_project", [False, True])
175
+ def test_plugin_merge_precedence(
176
+ self,
177
+ plugin_server: str,
178
+ tmp_path: Path,
179
+ monkeypatch: pytest.MonkeyPatch,
180
+ *,
181
+ trusted_project: bool,
182
+ ) -> None:
183
+ """Plugins override user entries but trusted project entries win."""
184
+ paths = [tmp_path / "user.json", tmp_path / "project.json"]
185
+ for path in paths:
186
+ path.write_text(
187
+ json.dumps(
188
+ {
189
+ "mcpServers": {
190
+ plugin_server: {"url": f"https://{path.stem}.invalid/mcp"}
191
+ }
192
+ }
193
+ )
194
+ )
195
+ monkeypatch.setattr(
196
+ "deepagents_code.mcp_tools.discover_mcp_config_sources",
197
+ lambda: [_user_source(paths[0]), _project_source(paths[1])],
198
+ )
199
+ result = resolve_mcp_config(None, trust_project_mcp=trusted_project)
200
+ assert isinstance(result, ConfigResolution)
201
+ selection = select_server(result, plugin_server)
202
+ assert isinstance(selection, ServerSelection)
203
+ host = "project" if trusted_project else "example"
204
+ assert selection.server_config["url"] == f"https://{host}.invalid/mcp"
205
+
206
+ def test_explicit_config_does_not_include_plugins(
207
+ self,
208
+ plugin_server: str,
209
+ tmp_path: Path,
210
+ ) -> None:
211
+ """An explicit file remains an isolated login configuration."""
212
+ cfg = tmp_path / "explicit.json"
213
+ cfg.write_text('{"mcpServers":{"docs":{"url":"https://docs.invalid/mcp"}}}')
214
+ result = resolve_mcp_config(str(cfg))
215
+ assert isinstance(result, ConfigResolution)
216
+ selection = select_server(result, plugin_server)
217
+ assert isinstance(selection, ConfigResolutionError)
218
+ assert selection.kind is ConfigErrorKind.UNKNOWN_SERVER
219
+ assert result.search_label == str(cfg)
220
+
221
+
75
222
  class TestResolveMcpConfigExplicit:
76
223
  """Explicit `--mcp-config <path>` resolution path."""
77
224
 
@@ -965,6 +965,32 @@ class TestMCPViewerScreen:
965
965
  assert "paused" in disabled_text
966
966
  assert "disabled" in disabled_text
967
967
 
968
+ @pytest.mark.parametrize("plugin", [False, True])
969
+ async def test_plugin_badge_across_statuses(self, *, plugin: bool) -> None:
970
+ """Plugin server badges survive selection across every connection status."""
971
+ from dataclasses import replace
972
+
973
+ from deepagents_code.plugins.adapters.mcp import scoped_mcp_server_name
974
+
975
+ servers = [
976
+ replace(server, name=scoped_mcp_server_name("demo@market", server.name))
977
+ if plugin
978
+ else server
979
+ for server in _mixed_status_info()
980
+ ]
981
+ app = MCPViewerTestApp()
982
+ async with app.run_test(size=(120, 30)) as pilot:
983
+ screen = MCPViewerScreen(server_info=servers)
984
+ app.push_screen(screen)
985
+ await pilot.pause()
986
+
987
+ for _ in servers:
988
+ for header in screen.query(MCPServerHeaderItem):
989
+ text = _widget_text(header)
990
+ assert (" (plugin)" in text) is plugin
991
+ assert header.server.name in text
992
+ await pilot.press("tab")
993
+
968
994
  async def test_status_indicator_glyphs_use_glyph_set(self) -> None:
969
995
  """Status icons reuse existing `Glyphs` (unicode by default)."""
970
996
  from deepagents_code.config import get_glyphs
@@ -1118,18 +1144,50 @@ class TestModuleLevelHelpers:
1118
1144
 
1119
1145
  # --- _visible_tools_for ---
1120
1146
 
1121
- def test_visible_tools_for_zero_tool_server_name_match_returns_none(self) -> None:
1122
- """Server name match on a zero-tool server returns None (no stub header)."""
1123
- from deepagents_code.tui.widgets.mcp_viewer import _visible_tools_for
1147
+ @pytest.mark.parametrize("server", _mixed_status_info()[1:])
1148
+ async def test_filter_keeps_matching_zero_tool_server(
1149
+ self, server: MCPServerInfo
1150
+ ) -> None:
1151
+ """Searching a zero-tool server retains its header without an empty state."""
1152
+ app = MCPViewerTestApp()
1153
+ async with app.run_test() as pilot:
1154
+ screen = MCPViewerScreen(server_info=_mixed_status_info())
1155
+ await app.push_screen(screen)
1156
+ await pilot.pause()
1157
+ await pilot.press(*server.name.upper())
1158
+ await pilot.pause()
1124
1159
 
1125
- info = MCPServerInfo(
1126
- name="github",
1127
- transport="http",
1128
- status="unauthenticated",
1129
- error="Run: dcode mcp login github",
1130
- )
1131
- # Server name matches but tools=() → or None collapses to None
1132
- assert _visible_tools_for(info, ["github"]) is None
1160
+ headers = screen.query(MCPServerHeaderItem)
1161
+ assert len(headers) == 1
1162
+ assert headers.first().server.name == server.name
1163
+ assert not screen.query(MCPToolItem)
1164
+ assert not screen.query(".mcp-empty")
1165
+
1166
+ @pytest.mark.parametrize(
1167
+ ("query", "expected"),
1168
+ [
1169
+ ("WEB", ["search"]),
1170
+ ("search WEB", ["search"]),
1171
+ ("read write", []),
1172
+ ("remote-api", ["search"]),
1173
+ ("read_file", ["read_file"]),
1174
+ ("sse", []),
1175
+ ],
1176
+ )
1177
+ async def test_filter_names_and_descriptions(
1178
+ self, query: str, expected: list[str]
1179
+ ) -> None:
1180
+ """Filter names and descriptions case-insensitively with all tokens required."""
1181
+ app = MCPViewerTestApp()
1182
+ async with app.run_test() as pilot:
1183
+ screen = MCPViewerScreen(server_info=_sample_info())
1184
+ await app.push_screen(screen)
1185
+ await pilot.pause()
1186
+ await pilot.press(*query)
1187
+ await pilot.pause()
1188
+
1189
+ assert [tool.tool_name for tool in screen.query(MCPToolItem)] == expected
1190
+ assert bool(screen.query(".mcp-empty")) == (not expected)
1133
1191
 
1134
1192
  def test_visible_tools_for_zero_tool_server_no_tokens_returns_empty_tuple(
1135
1193
  self,