deepagents-code 0.1.75__tar.gz → 0.1.77__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 (564) hide show
  1. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/CHANGELOG.md +21 -0
  2. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/PKG-INFO +9 -9
  3. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_build_info.py +1 -1
  4. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_version.py +1 -1
  5. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/mcp_auth.py +16 -1
  6. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/mcp_disabled.py +1 -1
  7. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/mcp_login_service.py +40 -11
  8. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/mcp_oauth_ui.py +65 -1
  9. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/model_config.py +9 -4
  10. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/__init__.py +60 -6
  11. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/content.py +23 -10
  12. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/state.py +55 -0
  13. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/mcp_viewer.py +15 -31
  14. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/prompt_search.py +11 -7
  15. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/startup_tip.py +1 -0
  16. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/workspace_diagnostics.py +25 -9
  17. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/pyproject.toml +7 -7
  18. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_auth.py +50 -0
  19. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_disabled.py +14 -0
  20. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_login_service.py +149 -2
  21. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_oauth_ui.py +121 -1
  22. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_model_config.py +57 -1
  23. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_workspace_diagnostics.py +98 -2
  24. deepagents_code-0.1.77/tests/unit_tests/tui/modals/plugin_manager/test_inspection.py +370 -0
  25. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +1 -1
  26. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_chat_input.py +28 -0
  27. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +69 -11
  28. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/uv.lock +18 -18
  29. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/.gitignore +0 -0
  30. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/AGENTS.md +0 -0
  31. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/ARCHITECTURE.md +0 -0
  32. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/COMMANDS.md +0 -0
  33. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/DEVELOPMENT.md +0 -0
  34. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/EXTENSIONS.md +0 -0
  35. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/HOOKS.md +0 -0
  36. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/LICENSE +0 -0
  37. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/Makefile +0 -0
  38. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/PRICING.md +0 -0
  39. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/README.md +0 -0
  40. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/THREAT_MODEL.md +0 -0
  41. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/__init__.py +0 -0
  42. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/__main__.py +0 -0
  43. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_ask_user_types.py +0 -0
  44. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_cli_context.py +0 -0
  45. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_constants.py +0 -0
  46. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_content_blocks.py +0 -0
  47. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_debug.py +0 -0
  48. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_debug_buffer.py +0 -0
  49. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_dep_floor_check.py +0 -0
  50. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_env_vars.py +0 -0
  51. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_fake_models.py +0 -0
  52. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_git.py +0 -0
  53. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_glm_5p2_profile.py +0 -0
  54. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_home_error.py +0 -0
  55. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_invocation.py +0 -0
  56. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_markdown.py +0 -0
  57. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_paths.py +0 -0
  58. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_repository_bounds.py +0 -0
  59. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_reserved_names.py +0 -0
  60. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_server_config.py +0 -0
  61. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_session_stats.py +0 -0
  62. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_startup_error.py +0 -0
  63. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_terminal_stderr.py +0 -0
  64. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_testing_models.py +0 -0
  65. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_textual_patches.py +0 -0
  66. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_tool_stream.py +0 -0
  67. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/_tracing.py +0 -0
  68. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/acp.py +0 -0
  69. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/agent.py +0 -0
  70. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/app.py +0 -0
  71. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/app.tcss +0 -0
  72. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/approval_mode.py +0 -0
  73. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/ask_user.py +0 -0
  74. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/auth_display.py +0 -0
  75. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/auth_store.py +0 -0
  76. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/auto_mode.py +0 -0
  77. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/__init__.py +0 -0
  78. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
  79. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
  80. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  81. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  82. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  83. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  84. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/bundled_prices.README.md +0 -0
  85. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/bundled_prices.json +0 -0
  86. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/client/__init__.py +0 -0
  87. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/client/commands/__init__.py +0 -0
  88. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/client/commands/auth.py +0 -0
  89. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/client/commands/config.py +0 -0
  90. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/client/commands/extras.py +0 -0
  91. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/client/commands/mcp.py +0 -0
  92. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/client/commands/tools.py +0 -0
  93. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/client/launch/__init__.py +0 -0
  94. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/client/launch/server.py +0 -0
  95. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/client/launch/server_manager.py +0 -0
  96. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/client/non_interactive.py +0 -0
  97. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/client/remote_client.py +0 -0
  98. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/clipboard.py +0 -0
  99. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/cold_cache.py +0 -0
  100. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/command_registry.py +0 -0
  101. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/config.py +0 -0
  102. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/config_manifest.py +0 -0
  103. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/configurable_model.py +0 -0
  104. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/configuration/__init__.py +0 -0
  105. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/configuration/interpreter.py +0 -0
  106. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/configuration/paths.py +0 -0
  107. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/configuration/provider.py +0 -0
  108. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/configuration/providers.py +0 -0
  109. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/configuration/resolver.py +0 -0
  110. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/configuration/service.py +0 -0
  111. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/configuration/theme_resolution.py +0 -0
  112. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/configuration/types.py +0 -0
  113. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/configuration/writer.py +0 -0
  114. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/context_doctor.py +0 -0
  115. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/cost_tracking.py +0 -0
  116. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/default_agent_prompt.md +0 -0
  117. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/diff_utils.py +0 -0
  118. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/doctor.py +0 -0
  119. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/editor.py +0 -0
  120. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/event_bus.py +0 -0
  121. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/extensions/__init__.py +0 -0
  122. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/extensions/api.py +0 -0
  123. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/extensions/discovery.py +0 -0
  124. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/extensions/hosting.py +0 -0
  125. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/extensions/loader.py +0 -0
  126. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/extensions/registry.py +0 -0
  127. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/extensions/runtime.py +0 -0
  128. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/extensions/settings.py +0 -0
  129. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/extensions/trust.py +0 -0
  130. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/extras_info.py +0 -0
  131. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/file_ops.py +0 -0
  132. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/formatting.py +0 -0
  133. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/goal_rubric.py +0 -0
  134. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/goal_state_limits.py +0 -0
  135. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/goal_state_notice.py +0 -0
  136. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/goal_tools.py +0 -0
  137. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/__init__.py +0 -0
  138. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/capabilities.py +0 -0
  139. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/client.py +0 -0
  140. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/client_lifecycle.py +0 -0
  141. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/context.py +0 -0
  142. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/engine.py +0 -0
  143. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/env.py +0 -0
  144. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/envelope.py +0 -0
  145. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/interrupt.py +0 -0
  146. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/legacy.py +0 -0
  147. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/loading.py +0 -0
  148. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/manager.py +0 -0
  149. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/migration.py +0 -0
  150. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/models/__init__.py +0 -0
  151. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/models/adapters.py +0 -0
  152. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/models/config.py +0 -0
  153. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/models/domain.py +0 -0
  154. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/models/transport.py +0 -0
  155. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/models/wire.py +0 -0
  156. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/permissions.py +0 -0
  157. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/presenter.py +0 -0
  158. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/projection.py +0 -0
  159. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/reducer.py +0 -0
  160. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/runner.py +0 -0
  161. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/runtime.py +0 -0
  162. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/server_middleware.py +0 -0
  163. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/snapshot.py +0 -0
  164. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/tools.py +0 -0
  165. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/transcript.py +0 -0
  166. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/trust.py +0 -0
  167. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
  168. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/input.py +0 -0
  169. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/integrations/__init__.py +0 -0
  170. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/integrations/openai_codex.py +0 -0
  171. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/integrations/sandbox_config.py +0 -0
  172. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/integrations/sandbox_factory.py +0 -0
  173. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/integrations/sandbox_provider.py +0 -0
  174. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/integrations/sandbox_registry.py +0 -0
  175. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/iterm_cursor_guide.py +0 -0
  176. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/json_types.py +0 -0
  177. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/local_context.py +0 -0
  178. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/main.py +0 -0
  179. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/managed_tools.py +0 -0
  180. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/mcp_config.py +0 -0
  181. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/mcp_middleware.py +0 -0
  182. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/mcp_providers/__init__.py +0 -0
  183. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/mcp_providers/_registry.py +0 -0
  184. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/mcp_providers/base.py +0 -0
  185. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/mcp_providers/github.py +0 -0
  186. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/mcp_providers/slack.py +0 -0
  187. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/mcp_proxy.py +0 -0
  188. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/mcp_tools.py +0 -0
  189. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/media_utils.py +0 -0
  190. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/memory_guard.py +0 -0
  191. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/model_retry.py +0 -0
  192. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/notifications.py +0 -0
  193. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/offload.py +0 -0
  194. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/offload_api.py +0 -0
  195. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/offload_middleware.py +0 -0
  196. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/onboarding.py +0 -0
  197. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/output.py +0 -0
  198. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/paste_collapse.py +0 -0
  199. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/plugins/__init__.py +0 -0
  200. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/plugins/_json.py +0 -0
  201. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/plugins/adapters/__init__.py +0 -0
  202. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/plugins/adapters/hooks.py +0 -0
  203. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/plugins/adapters/mcp.py +0 -0
  204. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/plugins/adapters/skills.py +0 -0
  205. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
  206. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/plugins/commands_cli.py +0 -0
  207. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/plugins/discovery.py +0 -0
  208. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/plugins/manifest.py +0 -0
  209. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/plugins/marketplace.py +0 -0
  210. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/plugins/models.py +0 -0
  211. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/plugins/store.py +0 -0
  212. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/plugins/substitution.py +0 -0
  213. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/project_utils.py +0 -0
  214. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/py.typed +0 -0
  215. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/reasoning_effort.py +0 -0
  216. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/reliable_rubric.py +0 -0
  217. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/resume_state.py +0 -0
  218. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/server_graph.py +0 -0
  219. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/sessions.py +0 -0
  220. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/skills/__init__.py +0 -0
  221. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/skills/commands.py +0 -0
  222. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/skills/invocation.py +0 -0
  223. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/skills/load.py +0 -0
  224. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/skills/merge.py +0 -0
  225. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/skills/trust.py +0 -0
  226. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/state_migration.py +0 -0
  227. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/subagents.py +0 -0
  228. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/system_prompt.md +0 -0
  229. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/terminal_capabilities.py +0 -0
  230. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/terminal_escape.py +0 -0
  231. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/theme.py +0 -0
  232. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tool_catalog.py +0 -0
  233. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tool_display.py +0 -0
  234. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tools.py +0 -0
  235. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/__init__.py +0 -0
  236. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/key_hints.py +0 -0
  237. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/modals/__init__.py +0 -0
  238. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/modals/cold_cache.py +0 -0
  239. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/modals/cost_breakdown.py +0 -0
  240. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/modals/model_switch.py +0 -0
  241. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
  242. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
  243. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
  244. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/modals/prompt_clipboard.py +0 -0
  245. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/modals/prompt_clipboard.tcss +0 -0
  246. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/modals/resume_blocked.py +0 -0
  247. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/modals/resume_compact.py +0 -0
  248. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/modals/session_cost.py +0 -0
  249. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/modals/session_cost.tcss +0 -0
  250. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/screens/__init__.py +0 -0
  251. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/textual_adapter.py +0 -0
  252. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/__init__.py +0 -0
  253. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_condense_path.py +0 -0
  254. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
  255. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
  256. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  257. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_links.py +0 -0
  258. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
  259. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/agent_selector.py +0 -0
  260. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/approval.py +0 -0
  261. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/ask_user.py +0 -0
  262. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/auth.py +0 -0
  263. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
  264. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/autocomplete.py +0 -0
  265. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/chat_input.py +0 -0
  266. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  267. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/context_usage.py +0 -0
  268. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  269. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/debug_console.py +0 -0
  270. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/diff.py +0 -0
  271. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  272. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/goal_review.py +0 -0
  273. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/goal_status.py +0 -0
  274. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/history.py +0 -0
  275. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  276. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/launch_init.py +0 -0
  277. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/loading.py +0 -0
  278. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  279. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  280. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/message_store.py +0 -0
  281. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/messages.py +0 -0
  282. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/model_selector.py +0 -0
  283. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/notification_center.py +0 -0
  284. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  285. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  286. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
  287. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  288. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/status.py +0 -0
  289. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  290. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  291. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
  292. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/thread_selector.py +0 -0
  293. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  294. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  295. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/update_available.py +0 -0
  296. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  297. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/update_progress.py +0 -0
  298. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/welcome.py +0 -0
  299. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
  300. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/ui.py +0 -0
  301. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/unicode_security.py +0 -0
  302. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/update_check.py +0 -0
  303. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/deepagents_code/workspace.py +0 -0
  304. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/examples/extensions/memory_store.py +0 -0
  305. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/examples/skills/arxiv-search/SKILL.md +0 -0
  306. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  307. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/examples/skills/langgraph-docs/SKILL.md +0 -0
  308. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/examples/skills/skill-creator/SKILL.md +0 -0
  309. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  310. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  311. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/examples/skills/web-research/SKILL.md +0 -0
  312. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/hatch_build.py +0 -0
  313. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/images/debug-console-cost-breakdown.png +0 -0
  314. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/images/model-stream-retry.png +0 -0
  315. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/images/tui.png +0 -0
  316. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/scripts/check_imports.py +0 -0
  317. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/scripts/check_process_cwd.py +0 -0
  318. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/scripts/debug_server.sh +0 -0
  319. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/scripts/generate_commands_catalog.py +0 -0
  320. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/scripts/install.sh +0 -0
  321. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/README.md +0 -0
  322. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/integration_tests/__init__.py +0 -0
  323. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/integration_tests/benchmarks/__init__.py +0 -0
  324. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  325. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
  326. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  327. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/integration_tests/benchmarks/test_thread_loading_benchmarks.py +0 -0
  328. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/integration_tests/conftest.py +0 -0
  329. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/integration_tests/test_acp_mode.py +0 -0
  330. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  331. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/integration_tests/test_compact_resume.py +0 -0
  332. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/integration_tests/test_offload_server_side.py +0 -0
  333. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/integration_tests/test_pending_work_recovery.py +0 -0
  334. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/integration_tests/test_sandbox_factory.py +0 -0
  335. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/integration_tests/test_sandbox_operations.py +0 -0
  336. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/__init__.py +0 -0
  337. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/client/__init__.py +0 -0
  338. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/client/commands/__init__.py +0 -0
  339. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/client/commands/test_auth.py +0 -0
  340. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/client/commands/test_extras.py +0 -0
  341. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/client/commands/test_mcp.py +0 -0
  342. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/client/commands/test_tools.py +0 -0
  343. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/conftest.py +0 -0
  344. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  345. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/hooks/__init__.py +0 -0
  346. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/hooks/models/__init__.py +0 -0
  347. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/hooks/models/test_models.py +0 -0
  348. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
  349. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_configuration.py +0 -0
  350. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_engine.py +0 -0
  351. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_execution.py +0 -0
  352. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_manager.py +0 -0
  353. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_presenter.py +0 -0
  354. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_server_lifecycle.py +0 -0
  355. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_transcript.py +0 -0
  356. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_trust.py +0 -0
  357. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/plugins/__init__.py +0 -0
  358. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/plugins/test_marketplace.py +0 -0
  359. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
  360. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
  361. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/skills/__init__.py +0 -0
  362. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_commands.py +0 -0
  363. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_load.py +0 -0
  364. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_merge.py +0 -0
  365. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  366. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_skills_json.py +0 -0
  367. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
  368. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  369. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  370. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/smoke_tests/snapshots/system_prompt_headless_local.md +0 -0
  371. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
  372. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
  373. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test__tool_stream.py +0 -0
  374. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_acp.py +0 -0
  375. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_agent.py +0 -0
  376. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_agent_friendly.py +0 -0
  377. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_app.py +0 -0
  378. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_approval_mode.py +0 -0
  379. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_args.py +0 -0
  380. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  381. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_ask_user_types.py +0 -0
  382. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_auth_display.py +0 -0
  383. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_auth_store.py +0 -0
  384. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  385. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_auto_mode.py +0 -0
  386. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_charset.py +0 -0
  387. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_cli_provider.py +0 -0
  388. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_clipboard.py +0 -0
  389. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  390. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_cold_cache.py +0 -0
  391. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_command_registry.py +0 -0
  392. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_compact_tool.py +0 -0
  393. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_config.py +0 -0
  394. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_config_manifest.py +0 -0
  395. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_configurable_model.py +0 -0
  396. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_configuration.py +0 -0
  397. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_configuration_resolution.py +0 -0
  398. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_configuration_resolver.py +0 -0
  399. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_context_doctor.py +0 -0
  400. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_cost_tracking.py +0 -0
  401. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_cursor_style.py +0 -0
  402. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_debug.py +0 -0
  403. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_debug_buffer.py +0 -0
  404. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_debug_console.py +0 -0
  405. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_dep_floor_check.py +0 -0
  406. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_diff_utils.py +0 -0
  407. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_doctor.py +0 -0
  408. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_editor.py +0 -0
  409. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_end_to_end.py +0 -0
  410. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_env_vars.py +0 -0
  411. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_event_bus.py +0 -0
  412. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_exception_handling.py +0 -0
  413. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_api.py +0 -0
  414. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_cli_trust.py +0 -0
  415. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_config_manifest.py +0 -0
  416. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_discovery.py +0 -0
  417. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_display.py +0 -0
  418. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_host_runtime.py +0 -0
  419. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_hosting.py +0 -0
  420. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_runtime.py +0 -0
  421. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_extra_skills_dirs.py +0 -0
  422. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_extras_info.py +0 -0
  423. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_file_ops.py +0 -0
  424. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_formatting.py +0 -0
  425. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_git.py +0 -0
  426. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
  427. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_criteria_client.py +0 -0
  428. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_rubric.py +0 -0
  429. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_state_limits.py +0 -0
  430. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_state_notice.py +0 -0
  431. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_state_persistence.py +0 -0
  432. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_tools.py +0 -0
  433. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_hatch_build.py +0 -0
  434. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_hooks.py +0 -0
  435. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_imports.py +0 -0
  436. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_input_parsing.py +0 -0
  437. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_install_command.py +0 -0
  438. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_install_script.py +0 -0
  439. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_invocation.py +0 -0
  440. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  441. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_json_types.py +0 -0
  442. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_local_context.py +0 -0
  443. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_main.py +0 -0
  444. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_main_acp_mode.py +0 -0
  445. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_main_args.py +0 -0
  446. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_managed_tools.py +0 -0
  447. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_config.py +0 -0
  448. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_lifecycle.py +0 -0
  449. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_proxy.py +0 -0
  450. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_schema.py +0 -0
  451. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_tools.py +0 -0
  452. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_media_utils.py +0 -0
  453. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_memory_guard.py +0 -0
  454. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_model_retry.py +0 -0
  455. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_model_switch.py +0 -0
  456. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_non_interactive.py +0 -0
  457. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_notifications.py +0 -0
  458. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_offload.py +0 -0
  459. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_offload_api.py +0 -0
  460. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_onboarding.py +0 -0
  461. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  462. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_output.py +0 -0
  463. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_paths.py +0 -0
  464. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_process_cwd_check.py +0 -0
  465. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_reasoning_effort.py +0 -0
  466. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_reliable_rubric.py +0 -0
  467. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_reload.py +0 -0
  468. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_remote_client.py +0 -0
  469. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_repository_bounds.py +0 -0
  470. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_resume_compaction_recovery.py +0 -0
  471. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_resume_state.py +0 -0
  472. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_rubric_cli.py +0 -0
  473. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_sandbox_config.py +0 -0
  474. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_sandbox_factory.py +0 -0
  475. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_sandbox_provider.py +0 -0
  476. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_sandbox_registry.py +0 -0
  477. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_server.py +0 -0
  478. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_server_config.py +0 -0
  479. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_server_graph.py +0 -0
  480. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_server_helpers.py +0 -0
  481. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_server_manager.py +0 -0
  482. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_server_tracing.py +0 -0
  483. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_session_stats.py +0 -0
  484. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_sessions.py +0 -0
  485. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_shell_allow_list.py +0 -0
  486. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_skill_invocation.py +0 -0
  487. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  488. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_state_migration.py +0 -0
  489. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_subagents.py +0 -0
  490. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  491. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_terminal_escape.py +0 -0
  492. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  493. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_terminal_stderr.py +0 -0
  494. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_text_encoding.py +0 -0
  495. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_textual_patches.py +0 -0
  496. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_theme.py +0 -0
  497. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_threads_resume.py +0 -0
  498. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_tool_catalog.py +0 -0
  499. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_tool_display.py +0 -0
  500. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_tracing.py +0 -0
  501. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_tracing_replicas.py +0 -0
  502. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  503. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_ui.py +0 -0
  504. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_unicode_security.py +0 -0
  505. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_uninstall_command.py +0 -0
  506. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_update_check.py +0 -0
  507. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_version.py +0 -0
  508. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/test_workspace.py +0 -0
  509. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tools/__init__.py +0 -0
  510. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tools/test_current_thread.py +0 -0
  511. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  512. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
  513. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tools/test_web_search.py +0 -0
  514. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/__init__.py +0 -0
  515. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/__init__.py +0 -0
  516. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
  517. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/test_cold_cache.py +0 -0
  518. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/test_model_switch.py +0 -0
  519. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/test_prompt_clipboard.py +0 -0
  520. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/test_resume_blocked.py +0 -0
  521. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/test_session_cost.py +0 -0
  522. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/test_key_hints.py +0 -0
  523. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/test_modal_footer_layout.py +0 -0
  524. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  525. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
  526. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  527. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  528. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  529. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
  530. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
  531. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
  532. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
  533. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_condense_path.py +0 -0
  534. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
  535. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  536. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  537. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
  538. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  539. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
  540. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  541. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  542. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  543. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  544. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  545. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  546. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
  547. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
  548. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
  549. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  550. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  551. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
  552. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_prompt_search.py +0 -0
  553. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  554. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  555. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
  556. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_status.py +0 -0
  557. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  558. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
  559. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
  560. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  561. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  562. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  563. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
  564. {deepagents_code-0.1.75 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
@@ -2,6 +2,27 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.77](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.76...deepagents-code==0.1.77) (2026-09-24)
6
+
7
+ ### Bug Fixes
8
+
9
+ - Preview remote plugin contents before installation.
10
+ - Report mis-encoded `config.toml` files created by older config writers.
11
+ - Show how to cancel MCP browser login and handle Escape.
12
+ - Make workspace configuration warnings actionable.
13
+ - Hide prompt search hints when search is unavailable.
14
+
15
+ ## [0.1.76](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.75...deepagents-code==0.1.76) (2026-09-24)
16
+
17
+ ### Features
18
+
19
+ - Label plugin servers in the MCP viewer ([#6539](https://github.com/langchain-ai/deepagents/pull/6539)).
20
+
21
+ ### Bug Fixes
22
+
23
+ - Resolve plugin MCP servers during login ([#6524](https://github.com/langchain-ai/deepagents/pull/6524)).
24
+ - Keep empty MCP servers searchable and include descriptions in search results ([#6540](https://github.com/langchain-ai/deepagents/pull/6540)).
25
+
5
26
  ## [0.1.75](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.74...deepagents-code==0.1.75) (2026-09-23)
6
27
 
7
28
  ### 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.77
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
@@ -30,18 +30,18 @@ Requires-Python: <4.0,>=3.12
30
30
  Requires-Dist: aiosqlite<1.0.0,>=0.22.1
31
31
  Requires-Dist: anyio<5.0.0,>=4.14.2
32
32
  Requires-Dist: deepagents-acp<1.0.0,>=0.0.10
33
- Requires-Dist: deepagents==0.7.18
33
+ Requires-Dist: deepagents==0.7.19
34
34
  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 = "dcf4feb"
@@ -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.77" # 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."""
@@ -1218,6 +1218,7 @@ def _make_loopback_handlers(
1218
1218
  extras = dict(extra_auth_params or {})
1219
1219
  interaction = ui if ui is not None else _default_ui()
1220
1220
  last_authorize_url: str | None = None
1221
+ browser_opened = False
1221
1222
  _paste_redirect, paste_callback = _make_paste_back_handlers(
1222
1223
  extra_auth_params=extra_auth_params,
1223
1224
  ui=interaction,
@@ -1227,7 +1228,8 @@ def _make_loopback_handlers(
1227
1228
  import asyncio
1228
1229
  import webbrowser
1229
1230
 
1230
- nonlocal last_authorize_url
1231
+ nonlocal last_authorize_url, browser_opened
1232
+ browser_opened = False
1231
1233
  final_url = _append_query_params(auth_url, extras) if extras else auth_url
1232
1234
  last_authorize_url = final_url
1233
1235
 
@@ -1268,10 +1270,18 @@ def _make_loopback_handlers(
1268
1270
  )
1269
1271
  await interaction.show_authorize_url(final_url, opened_in_browser=False)
1270
1272
  return
1273
+ browser_opened = True
1271
1274
  await interaction.show_authorize_url(final_url, opened_in_browser=True)
1272
1275
 
1273
1276
  async def callback() -> AuthorizationCodeResult:
1277
+ from deepagents_code.mcp_oauth_ui import (
1278
+ CliOAuthInteraction,
1279
+ _wait_for_browser_authorization,
1280
+ )
1281
+
1274
1282
  try:
1283
+ if browser_opened and isinstance(interaction, CliOAuthInteraction):
1284
+ return await _wait_for_browser_authorization(callback_server.wait)
1275
1285
  return await callback_server.wait()
1276
1286
  except (
1277
1287
  _LoopbackCallbackTimeoutError,
@@ -1998,6 +2008,7 @@ def format_login_failure(exc: BaseException) -> str:
1998
2008
  if reauth is not None:
1999
2009
  return str(reauth)
2000
2010
 
2011
+ from deepagents_code.mcp_oauth_ui import MCPLoginAbortedError
2001
2012
  from deepagents_code.mcp_tools import MCPConfigError
2002
2013
 
2003
2014
  if isinstance(exc, MCPConfigError):
@@ -2018,8 +2029,12 @@ def format_login_failure(exc: BaseException) -> str:
2018
2029
  visited: set[int] = set()
2019
2030
  while current is not None and id(current) not in visited:
2020
2031
  visited.add(id(current))
2032
+ if isinstance(current, MCPLoginAbortedError):
2033
+ return "MCP login aborted."
2021
2034
  parts.append(type(current).__name__)
2022
2035
  if isinstance(current, BaseExceptionGroup):
2036
+ if current.subgroup(MCPLoginAbortedError) is not None:
2037
+ return "MCP login aborted."
2023
2038
  parts.append(
2024
2039
  "[" + ", ".join(type(e).__name__ for e in current.exceptions[:5]) + "]"
2025
2040
  )
@@ -74,7 +74,7 @@ def _load_config(config_path: Path) -> dict[str, Any]:
74
74
  try:
75
75
  with config_path.open("rb") as f:
76
76
  return tomllib.load(f)
77
- except (OSError, tomllib.TOMLDecodeError) as exc:
77
+ except (OSError, UnicodeDecodeError, tomllib.TOMLDecodeError) as exc:
78
78
  logger.warning(
79
79
  "Could not read MCP disabled config at %s: %s",
80
80
  config_path,
@@ -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,
@@ -17,7 +17,71 @@ so leaks come from misuse, not from this interface's shape.
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- from typing import Protocol
20
+ from typing import TYPE_CHECKING, Protocol
21
+
22
+ if TYPE_CHECKING:
23
+ from collections.abc import Callable, Coroutine
24
+
25
+
26
+ class MCPLoginAbortedError(RuntimeError):
27
+ """The user aborted browser authorization from the terminal."""
28
+
29
+
30
+ async def _wait_for_browser_authorization[T](
31
+ wait: Callable[[], Coroutine[object, object, T]],
32
+ ) -> T:
33
+ """Wait for a browser callback with terminal-only Esc cancellation.
34
+
35
+ Returns:
36
+ The browser callback result.
37
+
38
+ Raises:
39
+ MCPLoginAbortedError: If the user aborts authorization.
40
+ """
41
+ import asyncio
42
+ import sys
43
+
44
+ if not (sys.stdin.isatty() and sys.stderr.isatty()):
45
+ return await wait()
46
+
47
+ from prompt_toolkit.application import Application
48
+ from prompt_toolkit.key_binding import KeyBindings, KeyPressEvent
49
+ from prompt_toolkit.layout import Layout, Window
50
+ from prompt_toolkit.layout.controls import FormattedTextControl
51
+ from prompt_toolkit.output.defaults import create_output
52
+
53
+ bindings = KeyBindings()
54
+
55
+ @bindings.add("escape")
56
+ @bindings.add("c-c")
57
+ @bindings.add("c-d")
58
+ def abort(event: KeyPressEvent) -> None:
59
+ event.app.exit(exception=MCPLoginAbortedError())
60
+
61
+ app: Application[None] = Application(
62
+ layout=Layout(Window(FormattedTextControl("esc to abort"), height=1)),
63
+ key_bindings=bindings,
64
+ output=create_output(stdout=sys.stderr),
65
+ full_screen=False,
66
+ erase_when_done=True,
67
+ )
68
+ callback = asyncio.create_task(wait())
69
+ keyboard = asyncio.create_task(app.run_async(handle_sigint=False))
70
+ try:
71
+ done, _ = await asyncio.wait(
72
+ (callback, keyboard), return_when=asyncio.FIRST_COMPLETED
73
+ )
74
+ if callback in done:
75
+ return await callback
76
+ try:
77
+ await keyboard
78
+ except EOFError as exc:
79
+ raise MCPLoginAbortedError from exc
80
+ raise MCPLoginAbortedError
81
+ finally:
82
+ callback.cancel()
83
+ keyboard.cancel()
84
+ await asyncio.gather(callback, keyboard, return_exceptions=True)
21
85
 
22
86
 
23
87
  class OAuthInteraction(Protocol):
@@ -4639,6 +4639,11 @@ def suppress_warning_reason(key: str, config_path: Path | None = None) -> str |
4639
4639
  except tomllib.TOMLDecodeError:
4640
4640
  logger.exception("Could not save warning suppression for '%s'", key)
4641
4641
  return f"{config_path} is not valid TOML"
4642
+ except UnicodeDecodeError:
4643
+ # `tomllib` decodes the bytes itself, so a file that is not UTF-8
4644
+ # raises `UnicodeDecodeError` rather than `TOMLDecodeError`.
4645
+ logger.exception("Could not save warning suppression for '%s'", key)
4646
+ return f"{config_path} is not UTF-8 encoded"
4642
4647
  except OSError:
4643
4648
  logger.exception("Could not save warning suppression for '%s'", key)
4644
4649
  return f"{config_path} could not be written"
@@ -4705,7 +4710,7 @@ def unsuppress_warning(key: str, config_path: Path | None = None) -> bool:
4705
4710
  with contextlib.suppress(OSError):
4706
4711
  Path(tmp_path).unlink()
4707
4712
  raise
4708
- except (OSError, tomllib.TOMLDecodeError):
4713
+ except (OSError, UnicodeDecodeError, tomllib.TOMLDecodeError):
4709
4714
  logger.exception("Could not remove warning suppression for '%s'", key)
4710
4715
  return False
4711
4716
  _invalidate_config_caches(config_path)
@@ -6156,7 +6161,7 @@ def save_thread_columns(
6156
6161
  with contextlib.suppress(OSError):
6157
6162
  Path(tmp_path).unlink()
6158
6163
  raise
6159
- except (OSError, tomllib.TOMLDecodeError):
6164
+ except (OSError, UnicodeDecodeError, tomllib.TOMLDecodeError):
6160
6165
  logger.exception("Could not save thread column preferences")
6161
6166
  return False
6162
6167
  invalidate_thread_config_cache()
@@ -6220,7 +6225,7 @@ def save_thread_relative_time(enabled: bool, config_path: Path | None = None) ->
6220
6225
  with contextlib.suppress(OSError):
6221
6226
  Path(tmp_path).unlink()
6222
6227
  raise
6223
- except (OSError, tomllib.TOMLDecodeError):
6228
+ except (OSError, UnicodeDecodeError, tomllib.TOMLDecodeError):
6224
6229
  logger.exception("Could not save thread relative_time preference")
6225
6230
  return False
6226
6231
  invalidate_thread_config_cache()
@@ -6449,7 +6454,7 @@ def save_thread_sort_order(sort_order: str, config_path: Path | None = None) ->
6449
6454
  with contextlib.suppress(OSError):
6450
6455
  Path(tmp_path).unlink()
6451
6456
  raise
6452
- except (OSError, tomllib.TOMLDecodeError):
6457
+ except (OSError, UnicodeDecodeError, tomllib.TOMLDecodeError):
6453
6458
  logger.exception("Could not save thread sort_order preference")
6454
6459
  return False
6455
6460
  invalidate_thread_config_cache()
@@ -34,6 +34,7 @@ if TYPE_CHECKING:
34
34
  )
35
35
 
36
36
  from deepagents_code import theme
37
+ from deepagents_code._env_vars import OFFLINE, is_env_truthy
37
38
  from deepagents_code.config import get_glyphs, is_ascii_mode
38
39
  from deepagents_code.model_config import _save_toml_field
39
40
  from deepagents_code.plugins import (
@@ -44,7 +45,7 @@ from deepagents_code.plugins import (
44
45
  uninstall_plugin,
45
46
  )
46
47
  from deepagents_code.plugins.discovery import plugin_auto_update_setting
47
- from deepagents_code.plugins.marketplace import MarketplaceError
48
+ from deepagents_code.plugins.marketplace import MarketplaceError, redact_urls_in_text
48
49
  from deepagents_code.tui.modals.plugin_manager.content import (
49
50
  _confirm_marketplace_removal_options,
50
51
  _install_details_options,
@@ -62,7 +63,10 @@ from deepagents_code.tui.modals.plugin_manager.models import (
62
63
  PluginTab,
63
64
  _ManagerState,
64
65
  )
65
- from deepagents_code.tui.modals.plugin_manager.state import _load_manager_state
66
+ from deepagents_code.tui.modals.plugin_manager.state import (
67
+ _inspect_plugin,
68
+ _load_manager_state,
69
+ )
66
70
  from deepagents_code.tui.modals.plugin_manager.tabs import (
67
71
  TAB_LABELS,
68
72
  PluginTabLabel,
@@ -166,6 +170,8 @@ class PluginManagerScreen(ModalScreen[PluginManagerResult]): # noqa: RUF067
166
170
  self._status: str | None = None
167
171
  self._error: str | None = None
168
172
  self._selected_plugin: _PluginRow | None = None
173
+ self._previews: dict[str, _PluginRow] = {}
174
+ self._inspecting: set[str] = set()
169
175
  self._selected_marketplace: _MarketplaceRow | None = None
170
176
  self._adding_marketplace = False
171
177
  self._marketplace_spinner = Spinner()
@@ -454,7 +460,12 @@ class PluginManagerScreen(ModalScreen[PluginManagerResult]): # noqa: RUF067
454
460
  self._update_tab_labels()
455
461
  status_widget = self.query_one("#plugin-manager-status", Static)
456
462
  if self._mode == "plugin_details" and self._selected_plugin is not None:
457
- status_widget.update(_plugin_details_content(self._selected_plugin))
463
+ status_widget.update(
464
+ _plugin_details_content(
465
+ self._selected_plugin,
466
+ inspecting=self._selected_plugin.plugin_id in self._inspecting,
467
+ )
468
+ )
458
469
  elif self._mode == "installed_details" and self._selected_plugin is not None:
459
470
  status_widget.update(
460
471
  _installed_plugin_details_content(self._selected_plugin)
@@ -583,7 +594,11 @@ class PluginManagerScreen(ModalScreen[PluginManagerResult]): # noqa: RUF067
583
594
 
584
595
  def _active_details_options(self) -> list[Option]:
585
596
  if self._mode == "plugin_details":
586
- return _install_details_options()
597
+ row = self._selected_plugin
598
+ return _install_details_options(
599
+ uninspected=row is not None and row.skill_count is None,
600
+ inspecting=row is not None and row.plugin_id in self._inspecting,
601
+ )
587
602
  if self._mode == "installed_details" and self._selected_plugin is not None:
588
603
  return _installed_details_options(
589
604
  self._selected_plugin, divider_width=self._divider_width()
@@ -688,6 +703,7 @@ class PluginManagerScreen(ModalScreen[PluginManagerResult]): # noqa: RUF067
688
703
  # must retain the user's active filter.
689
704
  if clear_search:
690
705
  self._search_query = ""
706
+ self._previews.clear()
691
707
 
692
708
  # Take the snapshot only after acquiring the lock. A settled
693
709
  # connection update queued behind the initial load therefore uses
@@ -1050,6 +1066,8 @@ class PluginManagerScreen(ModalScreen[PluginManagerResult]): # noqa: RUF067
1050
1066
  self._selected_plugin = row
1051
1067
  self._mode = "plugin_details"
1052
1068
  self._error = None
1069
+ if row.skill_count is None and not is_env_truthy(OFFLINE):
1070
+ self._start_plugin_inspection(row)
1053
1071
  self._refresh_view()
1054
1072
  return
1055
1073
  if option_id.startswith("installed:"):
@@ -1066,6 +1084,11 @@ class PluginManagerScreen(ModalScreen[PluginManagerResult]): # noqa: RUF067
1066
1084
  if option_id == "action:toggle-auto-update":
1067
1085
  await self._toggle_auto_update()
1068
1086
  return
1087
+ if option_id == "action:inspect":
1088
+ row = self._selected_plugin
1089
+ if row is not None:
1090
+ self._start_plugin_inspection(row)
1091
+ return
1069
1092
  if option_id == "action:install":
1070
1093
  await self._install_selected_plugin()
1071
1094
  return
@@ -1097,7 +1120,7 @@ class PluginManagerScreen(ModalScreen[PluginManagerResult]): # noqa: RUF067
1097
1120
  def _find_available_plugin(self, plugin_id: str) -> _PluginRow | None:
1098
1121
  return next(
1099
1122
  (
1100
- row
1123
+ self._previews.get(plugin_id, row)
1101
1124
  for row in self._state.available_plugins
1102
1125
  if row.plugin_id == plugin_id
1103
1126
  ),
@@ -1137,9 +1160,40 @@ class PluginManagerScreen(ModalScreen[PluginManagerResult]): # noqa: RUF067
1137
1160
  if enabled and self._on_auto_update_enabled is not None:
1138
1161
  self._on_auto_update_enabled()
1139
1162
 
1163
+ def _start_plugin_inspection(self, row: _PluginRow) -> None:
1164
+ if row.plugin_id in self._inspecting:
1165
+ return
1166
+ self._inspecting.add(row.plugin_id)
1167
+ self._error = None
1168
+ self._refresh_view()
1169
+ self.call_after_refresh(self._inspect_selected_plugin, row)
1170
+
1171
+ @work(exit_on_error=False)
1172
+ async def _inspect_selected_plugin(self, row: _PluginRow) -> None:
1173
+ error: str | None = None
1174
+ try:
1175
+ self._previews[row.plugin_id] = await asyncio.to_thread(
1176
+ _inspect_plugin, row
1177
+ )
1178
+ except (MarketplaceError, OSError, ValueError, RuntimeError, TypeError) as exc:
1179
+ error = f"Could not inspect contents: {redact_urls_in_text(str(exc))}"
1180
+ logger.debug("%s", error)
1181
+ finally:
1182
+ self._inspecting.discard(row.plugin_id)
1183
+ if (
1184
+ not self._dismissed
1185
+ and self._close_phase == "browsing"
1186
+ and self._mode == "plugin_details"
1187
+ and self._selected_plugin is not None
1188
+ and self._selected_plugin.plugin_id == row.plugin_id
1189
+ ):
1190
+ self._selected_plugin = self._previews.get(row.plugin_id, row)
1191
+ self._error = error
1192
+ self._refresh_view()
1193
+
1140
1194
  async def _install_selected_plugin(self) -> None:
1141
1195
  row = self._selected_plugin
1142
- if row is None:
1196
+ if row is None or row.plugin_id in self._inspecting:
1143
1197
  return
1144
1198
  try:
1145
1199
  instance = await asyncio.to_thread(install_plugin, row.plugin_id)
@@ -74,9 +74,22 @@ def _plugin_prompt(row: _PluginRow, *, status: str | None) -> Content:
74
74
  )
75
75
 
76
76
 
77
- def _install_details_options() -> list[Option]:
77
+ def _install_details_options(
78
+ *, uninspected: bool = False, inspecting: bool = False
79
+ ) -> list[Option]:
80
+ options = (
81
+ [
82
+ Option(
83
+ "Inspect contents (downloads source)",
84
+ id="action:inspect",
85
+ )
86
+ ]
87
+ if uninspected and not inspecting
88
+ else []
89
+ )
78
90
  return [
79
- Option("Install", id="action:install"),
91
+ *options,
92
+ Option("Install", id="action:install", disabled=inspecting),
80
93
  Option("Back to plugin list", id="details-back"),
81
94
  ]
82
95
 
@@ -128,12 +141,7 @@ def _will_install_lines(row: _PluginRow) -> list[str]:
128
141
  _unsupported_summary(row.unsupported_components),
129
142
  ]
130
143
  if row.skill_count is None:
131
- return [
132
- (
133
- "Skills, MCP servers, and hooks if present "
134
- "(agents/ and commands/ are not loaded)."
135
- )
136
- ]
144
+ return ["Contents not inspected. Choose Inspect contents to preview."]
137
145
  return [
138
146
  "No supported components (skills/MCP/hooks).",
139
147
  "agents/ and commands/ are not loaded by deepagents-code.",
@@ -194,7 +202,7 @@ def _status_lines(row: _PluginRow) -> list[Content]:
194
202
  return lines
195
203
 
196
204
 
197
- def _plugin_details_content(row: _PluginRow) -> Content:
205
+ def _plugin_details_content(row: _PluginRow, *, inspecting: bool = False) -> Content:
198
206
  _, _, marketplace = row.plugin_id.partition("@")
199
207
  parts: list[Content | str] = [
200
208
  Content.styled("Plugin details", "bold"),
@@ -210,7 +218,12 @@ def _plugin_details_content(row: _PluginRow) -> Content:
210
218
  if row.author:
211
219
  parts.extend(["\n\n", Content.styled(f"By: {row.author}", "dim")])
212
220
  parts.extend(["\n\n", Content.styled("Will install:", "bold")])
213
- for line in _will_install_lines(row):
221
+ lines = (
222
+ ["Downloading and inspecting contents..."]
223
+ if inspecting
224
+ else _will_install_lines(row)
225
+ )
226
+ for line in lines:
214
227
  parts.extend(["\n ", Content.styled(line, "dim")])
215
228
  parts.extend(
216
229
  [