deepagents-code 0.1.76__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.76 → deepagents_code-0.1.77}/CHANGELOG.md +10 -0
  2. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/PKG-INFO +2 -2
  3. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_build_info.py +1 -1
  4. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_version.py +1 -1
  5. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_auth.py +16 -1
  6. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_disabled.py +1 -1
  7. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_oauth_ui.py +65 -1
  8. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/model_config.py +9 -4
  9. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/__init__.py +60 -6
  10. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/content.py +23 -10
  11. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/state.py +55 -0
  12. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/prompt_search.py +11 -7
  13. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/startup_tip.py +1 -0
  14. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/workspace_diagnostics.py +25 -9
  15. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/pyproject.toml +2 -2
  16. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_auth.py +50 -0
  17. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_disabled.py +14 -0
  18. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_oauth_ui.py +121 -1
  19. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_model_config.py +57 -1
  20. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_workspace_diagnostics.py +98 -2
  21. deepagents_code-0.1.77/tests/unit_tests/tui/modals/plugin_manager/test_inspection.py +370 -0
  22. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +1 -1
  23. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_chat_input.py +28 -0
  24. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/uv.lock +2 -2
  25. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/.gitignore +0 -0
  26. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/AGENTS.md +0 -0
  27. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/ARCHITECTURE.md +0 -0
  28. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/COMMANDS.md +0 -0
  29. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/DEVELOPMENT.md +0 -0
  30. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/EXTENSIONS.md +0 -0
  31. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/HOOKS.md +0 -0
  32. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/LICENSE +0 -0
  33. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/Makefile +0 -0
  34. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/PRICING.md +0 -0
  35. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/README.md +0 -0
  36. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/THREAT_MODEL.md +0 -0
  37. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/__init__.py +0 -0
  38. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/__main__.py +0 -0
  39. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_ask_user_types.py +0 -0
  40. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_cli_context.py +0 -0
  41. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_constants.py +0 -0
  42. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_content_blocks.py +0 -0
  43. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_debug.py +0 -0
  44. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_debug_buffer.py +0 -0
  45. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_dep_floor_check.py +0 -0
  46. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_env_vars.py +0 -0
  47. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_fake_models.py +0 -0
  48. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_git.py +0 -0
  49. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_glm_5p2_profile.py +0 -0
  50. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_home_error.py +0 -0
  51. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_invocation.py +0 -0
  52. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_markdown.py +0 -0
  53. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_paths.py +0 -0
  54. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_repository_bounds.py +0 -0
  55. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_reserved_names.py +0 -0
  56. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_server_config.py +0 -0
  57. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_session_stats.py +0 -0
  58. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_startup_error.py +0 -0
  59. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_terminal_stderr.py +0 -0
  60. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_testing_models.py +0 -0
  61. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_textual_patches.py +0 -0
  62. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_tool_stream.py +0 -0
  63. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/_tracing.py +0 -0
  64. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/acp.py +0 -0
  65. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/agent.py +0 -0
  66. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/app.py +0 -0
  67. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/app.tcss +0 -0
  68. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/approval_mode.py +0 -0
  69. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/ask_user.py +0 -0
  70. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/auth_display.py +0 -0
  71. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/auth_store.py +0 -0
  72. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/auto_mode.py +0 -0
  73. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/__init__.py +0 -0
  74. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
  75. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
  76. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  77. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  78. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  79. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  80. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/bundled_prices.README.md +0 -0
  81. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/bundled_prices.json +0 -0
  82. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/__init__.py +0 -0
  83. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/commands/__init__.py +0 -0
  84. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/commands/auth.py +0 -0
  85. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/commands/config.py +0 -0
  86. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/commands/extras.py +0 -0
  87. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/commands/mcp.py +0 -0
  88. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/commands/tools.py +0 -0
  89. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/launch/__init__.py +0 -0
  90. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/launch/server.py +0 -0
  91. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/launch/server_manager.py +0 -0
  92. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/non_interactive.py +0 -0
  93. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/client/remote_client.py +0 -0
  94. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/clipboard.py +0 -0
  95. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/cold_cache.py +0 -0
  96. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/command_registry.py +0 -0
  97. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/config.py +0 -0
  98. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/config_manifest.py +0 -0
  99. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configurable_model.py +0 -0
  100. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/__init__.py +0 -0
  101. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/interpreter.py +0 -0
  102. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/paths.py +0 -0
  103. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/provider.py +0 -0
  104. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/providers.py +0 -0
  105. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/resolver.py +0 -0
  106. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/service.py +0 -0
  107. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/theme_resolution.py +0 -0
  108. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/types.py +0 -0
  109. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/configuration/writer.py +0 -0
  110. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/context_doctor.py +0 -0
  111. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/cost_tracking.py +0 -0
  112. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/default_agent_prompt.md +0 -0
  113. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/diff_utils.py +0 -0
  114. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/doctor.py +0 -0
  115. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/editor.py +0 -0
  116. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/event_bus.py +0 -0
  117. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/__init__.py +0 -0
  118. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/api.py +0 -0
  119. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/discovery.py +0 -0
  120. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/hosting.py +0 -0
  121. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/loader.py +0 -0
  122. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/registry.py +0 -0
  123. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/runtime.py +0 -0
  124. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/settings.py +0 -0
  125. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extensions/trust.py +0 -0
  126. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/extras_info.py +0 -0
  127. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/file_ops.py +0 -0
  128. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/formatting.py +0 -0
  129. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/goal_rubric.py +0 -0
  130. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/goal_state_limits.py +0 -0
  131. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/goal_state_notice.py +0 -0
  132. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/goal_tools.py +0 -0
  133. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/__init__.py +0 -0
  134. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/capabilities.py +0 -0
  135. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/client.py +0 -0
  136. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/client_lifecycle.py +0 -0
  137. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/context.py +0 -0
  138. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/engine.py +0 -0
  139. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/env.py +0 -0
  140. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/envelope.py +0 -0
  141. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/interrupt.py +0 -0
  142. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/legacy.py +0 -0
  143. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/loading.py +0 -0
  144. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/manager.py +0 -0
  145. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/migration.py +0 -0
  146. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/models/__init__.py +0 -0
  147. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/models/adapters.py +0 -0
  148. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/models/config.py +0 -0
  149. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/models/domain.py +0 -0
  150. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/models/transport.py +0 -0
  151. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/models/wire.py +0 -0
  152. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/permissions.py +0 -0
  153. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/presenter.py +0 -0
  154. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/projection.py +0 -0
  155. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/reducer.py +0 -0
  156. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/runner.py +0 -0
  157. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/runtime.py +0 -0
  158. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/server_middleware.py +0 -0
  159. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/snapshot.py +0 -0
  160. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/tools.py +0 -0
  161. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/transcript.py +0 -0
  162. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/trust.py +0 -0
  163. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
  164. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/input.py +0 -0
  165. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/integrations/__init__.py +0 -0
  166. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/integrations/openai_codex.py +0 -0
  167. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/integrations/sandbox_config.py +0 -0
  168. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/integrations/sandbox_factory.py +0 -0
  169. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/integrations/sandbox_provider.py +0 -0
  170. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/integrations/sandbox_registry.py +0 -0
  171. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/iterm_cursor_guide.py +0 -0
  172. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/json_types.py +0 -0
  173. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/local_context.py +0 -0
  174. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/main.py +0 -0
  175. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/managed_tools.py +0 -0
  176. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_config.py +0 -0
  177. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_login_service.py +0 -0
  178. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_middleware.py +0 -0
  179. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_providers/__init__.py +0 -0
  180. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_providers/_registry.py +0 -0
  181. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_providers/base.py +0 -0
  182. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_providers/github.py +0 -0
  183. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_providers/slack.py +0 -0
  184. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_proxy.py +0 -0
  185. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/mcp_tools.py +0 -0
  186. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/media_utils.py +0 -0
  187. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/memory_guard.py +0 -0
  188. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/model_retry.py +0 -0
  189. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/notifications.py +0 -0
  190. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/offload.py +0 -0
  191. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/offload_api.py +0 -0
  192. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/offload_middleware.py +0 -0
  193. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/onboarding.py +0 -0
  194. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/output.py +0 -0
  195. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/paste_collapse.py +0 -0
  196. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/__init__.py +0 -0
  197. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/_json.py +0 -0
  198. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/adapters/__init__.py +0 -0
  199. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/adapters/hooks.py +0 -0
  200. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/adapters/mcp.py +0 -0
  201. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/adapters/skills.py +0 -0
  202. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
  203. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/commands_cli.py +0 -0
  204. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/discovery.py +0 -0
  205. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/manifest.py +0 -0
  206. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/marketplace.py +0 -0
  207. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/models.py +0 -0
  208. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/store.py +0 -0
  209. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/plugins/substitution.py +0 -0
  210. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/project_utils.py +0 -0
  211. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/py.typed +0 -0
  212. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/reasoning_effort.py +0 -0
  213. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/reliable_rubric.py +0 -0
  214. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/resume_state.py +0 -0
  215. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/server_graph.py +0 -0
  216. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/sessions.py +0 -0
  217. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/skills/__init__.py +0 -0
  218. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/skills/commands.py +0 -0
  219. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/skills/invocation.py +0 -0
  220. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/skills/load.py +0 -0
  221. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/skills/merge.py +0 -0
  222. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/skills/trust.py +0 -0
  223. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/state_migration.py +0 -0
  224. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/subagents.py +0 -0
  225. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/system_prompt.md +0 -0
  226. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/terminal_capabilities.py +0 -0
  227. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/terminal_escape.py +0 -0
  228. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/theme.py +0 -0
  229. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tool_catalog.py +0 -0
  230. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tool_display.py +0 -0
  231. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tools.py +0 -0
  232. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/__init__.py +0 -0
  233. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/key_hints.py +0 -0
  234. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/__init__.py +0 -0
  235. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/cold_cache.py +0 -0
  236. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/cost_breakdown.py +0 -0
  237. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/model_switch.py +0 -0
  238. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
  239. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
  240. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
  241. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/prompt_clipboard.py +0 -0
  242. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/prompt_clipboard.tcss +0 -0
  243. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/resume_blocked.py +0 -0
  244. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/resume_compact.py +0 -0
  245. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/session_cost.py +0 -0
  246. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/modals/session_cost.tcss +0 -0
  247. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/screens/__init__.py +0 -0
  248. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/textual_adapter.py +0 -0
  249. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/__init__.py +0 -0
  250. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_condense_path.py +0 -0
  251. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
  252. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
  253. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  254. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_links.py +0 -0
  255. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
  256. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/agent_selector.py +0 -0
  257. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/approval.py +0 -0
  258. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/ask_user.py +0 -0
  259. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/auth.py +0 -0
  260. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
  261. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/autocomplete.py +0 -0
  262. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/chat_input.py +0 -0
  263. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  264. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/context_usage.py +0 -0
  265. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  266. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/debug_console.py +0 -0
  267. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/diff.py +0 -0
  268. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  269. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/goal_review.py +0 -0
  270. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/goal_status.py +0 -0
  271. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/history.py +0 -0
  272. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  273. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/launch_init.py +0 -0
  274. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/loading.py +0 -0
  275. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  276. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  277. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
  278. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/message_store.py +0 -0
  279. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/messages.py +0 -0
  280. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/model_selector.py +0 -0
  281. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/notification_center.py +0 -0
  282. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  283. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  284. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
  285. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  286. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/status.py +0 -0
  287. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  288. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  289. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
  290. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/thread_selector.py +0 -0
  291. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  292. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  293. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/update_available.py +0 -0
  294. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  295. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/update_progress.py +0 -0
  296. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/welcome.py +0 -0
  297. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
  298. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/ui.py +0 -0
  299. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/unicode_security.py +0 -0
  300. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/update_check.py +0 -0
  301. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/deepagents_code/workspace.py +0 -0
  302. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/examples/extensions/memory_store.py +0 -0
  303. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/examples/skills/arxiv-search/SKILL.md +0 -0
  304. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  305. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/examples/skills/langgraph-docs/SKILL.md +0 -0
  306. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/examples/skills/skill-creator/SKILL.md +0 -0
  307. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  308. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  309. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/examples/skills/web-research/SKILL.md +0 -0
  310. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/hatch_build.py +0 -0
  311. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/images/debug-console-cost-breakdown.png +0 -0
  312. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/images/model-stream-retry.png +0 -0
  313. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/images/tui.png +0 -0
  314. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/scripts/check_imports.py +0 -0
  315. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/scripts/check_process_cwd.py +0 -0
  316. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/scripts/debug_server.sh +0 -0
  317. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/scripts/generate_commands_catalog.py +0 -0
  318. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/scripts/install.sh +0 -0
  319. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/README.md +0 -0
  320. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/__init__.py +0 -0
  321. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/benchmarks/__init__.py +0 -0
  322. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  323. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
  324. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  325. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/benchmarks/test_thread_loading_benchmarks.py +0 -0
  326. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/conftest.py +0 -0
  327. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/test_acp_mode.py +0 -0
  328. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  329. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/test_compact_resume.py +0 -0
  330. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/test_offload_server_side.py +0 -0
  331. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/test_pending_work_recovery.py +0 -0
  332. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/test_sandbox_factory.py +0 -0
  333. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/integration_tests/test_sandbox_operations.py +0 -0
  334. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/__init__.py +0 -0
  335. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/client/__init__.py +0 -0
  336. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/client/commands/__init__.py +0 -0
  337. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/client/commands/test_auth.py +0 -0
  338. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/client/commands/test_extras.py +0 -0
  339. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/client/commands/test_mcp.py +0 -0
  340. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/client/commands/test_tools.py +0 -0
  341. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/conftest.py +0 -0
  342. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  343. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/__init__.py +0 -0
  344. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/models/__init__.py +0 -0
  345. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/models/test_models.py +0 -0
  346. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
  347. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_configuration.py +0 -0
  348. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_engine.py +0 -0
  349. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_execution.py +0 -0
  350. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_manager.py +0 -0
  351. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_presenter.py +0 -0
  352. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_server_lifecycle.py +0 -0
  353. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_transcript.py +0 -0
  354. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/hooks/test_trust.py +0 -0
  355. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/plugins/__init__.py +0 -0
  356. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/plugins/test_marketplace.py +0 -0
  357. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
  358. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
  359. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/skills/__init__.py +0 -0
  360. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_commands.py +0 -0
  361. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_load.py +0 -0
  362. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_merge.py +0 -0
  363. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  364. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_skills_json.py +0 -0
  365. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
  366. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  367. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  368. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/smoke_tests/snapshots/system_prompt_headless_local.md +0 -0
  369. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
  370. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
  371. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test__tool_stream.py +0 -0
  372. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_acp.py +0 -0
  373. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_agent.py +0 -0
  374. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_agent_friendly.py +0 -0
  375. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_app.py +0 -0
  376. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_approval_mode.py +0 -0
  377. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_args.py +0 -0
  378. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  379. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_ask_user_types.py +0 -0
  380. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_auth_display.py +0 -0
  381. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_auth_store.py +0 -0
  382. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  383. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_auto_mode.py +0 -0
  384. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_charset.py +0 -0
  385. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_cli_provider.py +0 -0
  386. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_clipboard.py +0 -0
  387. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  388. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_cold_cache.py +0 -0
  389. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_command_registry.py +0 -0
  390. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_compact_tool.py +0 -0
  391. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_config.py +0 -0
  392. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_config_manifest.py +0 -0
  393. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_configurable_model.py +0 -0
  394. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_configuration.py +0 -0
  395. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_configuration_resolution.py +0 -0
  396. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_configuration_resolver.py +0 -0
  397. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_context_doctor.py +0 -0
  398. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_cost_tracking.py +0 -0
  399. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_cursor_style.py +0 -0
  400. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_debug.py +0 -0
  401. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_debug_buffer.py +0 -0
  402. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_debug_console.py +0 -0
  403. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_dep_floor_check.py +0 -0
  404. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_diff_utils.py +0 -0
  405. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_doctor.py +0 -0
  406. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_editor.py +0 -0
  407. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_end_to_end.py +0 -0
  408. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_env_vars.py +0 -0
  409. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_event_bus.py +0 -0
  410. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_exception_handling.py +0 -0
  411. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_api.py +0 -0
  412. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_cli_trust.py +0 -0
  413. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_config_manifest.py +0 -0
  414. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_discovery.py +0 -0
  415. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_display.py +0 -0
  416. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_host_runtime.py +0 -0
  417. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_hosting.py +0 -0
  418. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extension_runtime.py +0 -0
  419. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extra_skills_dirs.py +0 -0
  420. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_extras_info.py +0 -0
  421. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_file_ops.py +0 -0
  422. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_formatting.py +0 -0
  423. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_git.py +0 -0
  424. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
  425. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_criteria_client.py +0 -0
  426. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_rubric.py +0 -0
  427. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_state_limits.py +0 -0
  428. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_state_notice.py +0 -0
  429. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_state_persistence.py +0 -0
  430. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_goal_tools.py +0 -0
  431. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_hatch_build.py +0 -0
  432. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_hooks.py +0 -0
  433. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_imports.py +0 -0
  434. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_input_parsing.py +0 -0
  435. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_install_command.py +0 -0
  436. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_install_script.py +0 -0
  437. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_invocation.py +0 -0
  438. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  439. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_json_types.py +0 -0
  440. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_local_context.py +0 -0
  441. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_main.py +0 -0
  442. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_main_acp_mode.py +0 -0
  443. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_main_args.py +0 -0
  444. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_managed_tools.py +0 -0
  445. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_config.py +0 -0
  446. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_lifecycle.py +0 -0
  447. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_login_service.py +0 -0
  448. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_proxy.py +0 -0
  449. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_schema.py +0 -0
  450. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_mcp_tools.py +0 -0
  451. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_media_utils.py +0 -0
  452. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_memory_guard.py +0 -0
  453. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_model_retry.py +0 -0
  454. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_model_switch.py +0 -0
  455. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_non_interactive.py +0 -0
  456. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_notifications.py +0 -0
  457. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_offload.py +0 -0
  458. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_offload_api.py +0 -0
  459. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_onboarding.py +0 -0
  460. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  461. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_output.py +0 -0
  462. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_paths.py +0 -0
  463. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_process_cwd_check.py +0 -0
  464. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_reasoning_effort.py +0 -0
  465. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_reliable_rubric.py +0 -0
  466. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_reload.py +0 -0
  467. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_remote_client.py +0 -0
  468. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_repository_bounds.py +0 -0
  469. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_resume_compaction_recovery.py +0 -0
  470. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_resume_state.py +0 -0
  471. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_rubric_cli.py +0 -0
  472. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_sandbox_config.py +0 -0
  473. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_sandbox_factory.py +0 -0
  474. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_sandbox_provider.py +0 -0
  475. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_sandbox_registry.py +0 -0
  476. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_server.py +0 -0
  477. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_server_config.py +0 -0
  478. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_server_graph.py +0 -0
  479. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_server_helpers.py +0 -0
  480. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_server_manager.py +0 -0
  481. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_server_tracing.py +0 -0
  482. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_session_stats.py +0 -0
  483. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_sessions.py +0 -0
  484. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_shell_allow_list.py +0 -0
  485. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_skill_invocation.py +0 -0
  486. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  487. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_state_migration.py +0 -0
  488. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_subagents.py +0 -0
  489. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  490. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_terminal_escape.py +0 -0
  491. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  492. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_terminal_stderr.py +0 -0
  493. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_text_encoding.py +0 -0
  494. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_textual_patches.py +0 -0
  495. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_theme.py +0 -0
  496. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_threads_resume.py +0 -0
  497. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_tool_catalog.py +0 -0
  498. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_tool_display.py +0 -0
  499. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_tracing.py +0 -0
  500. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_tracing_replicas.py +0 -0
  501. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  502. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_ui.py +0 -0
  503. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_unicode_security.py +0 -0
  504. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_uninstall_command.py +0 -0
  505. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_update_check.py +0 -0
  506. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_version.py +0 -0
  507. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/test_workspace.py +0 -0
  508. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tools/__init__.py +0 -0
  509. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tools/test_current_thread.py +0 -0
  510. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  511. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
  512. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tools/test_web_search.py +0 -0
  513. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/__init__.py +0 -0
  514. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/__init__.py +0 -0
  515. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
  516. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/test_cold_cache.py +0 -0
  517. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/test_model_switch.py +0 -0
  518. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/test_prompt_clipboard.py +0 -0
  519. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/test_resume_blocked.py +0 -0
  520. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/modals/test_session_cost.py +0 -0
  521. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/test_key_hints.py +0 -0
  522. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/test_modal_footer_layout.py +0 -0
  523. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  524. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
  525. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  526. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  527. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  528. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
  529. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
  530. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
  531. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
  532. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_condense_path.py +0 -0
  533. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
  534. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  535. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  536. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
  537. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  538. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
  539. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  540. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  541. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  542. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  543. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  544. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  545. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
  546. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
  547. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
  548. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
  549. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  550. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  551. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
  552. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_prompt_search.py +0 -0
  553. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  554. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  555. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
  556. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_status.py +0 -0
  557. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  558. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
  559. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
  560. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  561. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  562. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  563. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
  564. {deepagents_code-0.1.76 → deepagents_code-0.1.77}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
@@ -2,6 +2,16 @@
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
+
5
15
  ## [0.1.76](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.75...deepagents-code==0.1.76) (2026-09-24)
6
16
 
7
17
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: deepagents-code
3
- Version: 0.1.76
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,7 +30,7 @@ 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
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "e801fa1"
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.76" # 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,
@@ -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
  [
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import json
5
6
  import logging
6
7
  from pathlib import Path
7
8
  from typing import TYPE_CHECKING
@@ -23,6 +24,7 @@ from deepagents_code.plugins.marketplace import (
23
24
  materialize_plugin_source,
24
25
  redact_marketplace_source,
25
26
  redact_urls_in_text,
27
+ unresolved_source_message,
26
28
  )
27
29
  from deepagents_code.plugins.models import LocalPluginSource, split_plugin_id
28
30
  from deepagents_code.plugins.store import (
@@ -30,6 +32,7 @@ from deepagents_code.plugins.store import (
30
32
  load_enabled_plugin_ids,
31
33
  load_installed_plugins,
32
34
  load_marketplace_records,
35
+ plugin_mutation_lock,
33
36
  )
34
37
  from deepagents_code.tui.modals.plugin_manager.models import (
35
38
  _ManagerState,
@@ -208,6 +211,58 @@ def _preview_local_plugin_instance(
208
211
  return loaded
209
212
 
210
213
 
214
+ @plugin_mutation_lock()
215
+ def _inspect_plugin(row: _PluginRow) -> _PluginRow:
216
+ """Download and inventory one plugin without installing or executing it.
217
+
218
+ Returns:
219
+ A row with the inspected component names.
220
+
221
+ Raises:
222
+ MarketplaceError: If the source or its inventory cannot be inspected.
223
+ """
224
+ from deepagents_code.plugins.discovery import (
225
+ _plugin_from_install_path,
226
+ _resolve_marketplace_and_entry,
227
+ )
228
+
229
+ marketplace, entry = _resolve_marketplace_and_entry(row.plugin_id)
230
+ rejections: list[str] = []
231
+ root = materialize_plugin_source(marketplace, entry, rejections=rejections)
232
+ if root is None:
233
+ raise MarketplaceError(
234
+ unresolved_source_message(row.plugin_id, entry, rejections)
235
+ )
236
+ instance, warnings = _plugin_from_install_path(
237
+ plugin_id=row.plugin_id,
238
+ root=root,
239
+ marketplace_name=marketplace.name,
240
+ fallback_name=entry.name,
241
+ )
242
+ if instance is None or warnings:
243
+ msg = "; ".join(warnings) or "Could not inspect plugin contents."
244
+ raise MarketplaceError(msg)
245
+ for path in (*instance.inventory.mcp_files, *instance.inventory.hook_files):
246
+ if path.suffix in {".mcpb", ".dxt"}:
247
+ msg = f"Cannot inspect unsupported MCP bundle: {path.name}"
248
+ raise MarketplaceError(msg)
249
+ document = json.loads(path.read_text(encoding="utf-8"))
250
+ if not isinstance(document, dict):
251
+ msg = f"Cannot inspect {path.name}: expected a JSON object."
252
+ raise MarketplaceError(msg)
253
+ return _row_from_instance(
254
+ plugin_id=row.plugin_id,
255
+ description=row.description,
256
+ author=row.author,
257
+ is_enabled=row.enabled,
258
+ instance=instance,
259
+ mcp_server_info=(),
260
+ mcp_connecting=False,
261
+ loaded_plugin_ids=frozenset(),
262
+ display_name=row.display_name,
263
+ )
264
+
265
+
211
266
  def _row_from_instance(
212
267
  *,
213
268
  plugin_id: str,
@@ -27,13 +27,16 @@ PROMPT_SEARCH_MAX_ROWS = 5
27
27
  """Result rows the inline panel shows before the list scrolls."""
28
28
 
29
29
 
30
- def prompt_search_hint() -> str:
30
+ def prompt_search_hint(*, has_matches: bool = True) -> str:
31
31
  """Build the footer line for the current charset mode.
32
32
 
33
33
  The Ctrl+R mention is what makes the modal tier discoverable. The line is
34
34
  kept short enough to wrap within `PROMPT_SEARCH_MAX_HINT_ROWS` at the
35
35
  narrow widths the composer supports.
36
36
 
37
+ Args:
38
+ has_matches: Whether navigation and insertion are available.
39
+
37
40
  Returns:
38
41
  The hint text, using ASCII glyphs on terminals that need them.
39
42
  """
@@ -41,14 +44,13 @@ def prompt_search_hint() -> str:
41
44
 
42
45
  glyphs = get_glyphs()
43
46
  sep = f" {glyphs.bullet} "
44
- return sep.join(
45
- (
47
+ hints = ["Ctrl+R full view", "Esc cancel"]
48
+ if has_matches:
49
+ hints[:0] = [
46
50
  f"{glyphs.arrow_up}/{glyphs.arrow_down} navigate",
47
51
  "Tab/Enter insert",
48
- "Ctrl+R full view",
49
- "Esc cancel",
50
- )
51
- )
52
+ ]
53
+ return sep.join(hints)
52
54
 
53
55
 
54
56
  PROMPT_SEARCH_WINDOW = 50
@@ -382,6 +384,8 @@ class PromptSearchPanel(Vertical):
382
384
  """
383
385
  if empty is not None:
384
386
  titles = []
387
+ if self._hint_static is not None:
388
+ self._hint_static.update(prompt_search_hint(has_matches=bool(titles)))
385
389
  self._selected_index = selected_index
386
390
  # Copy: the panel keeps this list across frames, so an owner that
387
391
  # mutated the list it passed would rewrite the pending window in place.
@@ -31,6 +31,7 @@ _TIPS: dict[str, int] = {
31
31
  "Press Ctrl+R to search and reuse submitted prompts": 2,
32
32
  "Use /cost to see a breakdown of estimated spend": 1,
33
33
  "Use /tools to list the tools available to the agent": 1,
34
+ "Use /plugins to inspect a plugin's contents before installing": 1,
34
35
  "Open /mcp and press Enter on a remote server to sign in again": 1,
35
36
  "Use /remember to save learnings from this conversation": 1,
36
37
  "Use /model to switch models mid-conversation": 2,
@@ -22,6 +22,8 @@ from typing import TYPE_CHECKING, Any, Literal, cast
22
22
 
23
23
  from textual.content import Content
24
24
 
25
+ from deepagents_code.unicode_security import strip_dangerous_unicode
26
+
25
27
  if TYPE_CHECKING:
26
28
  from collections.abc import Mapping, Sequence
27
29
 
@@ -102,9 +104,9 @@ def build_snapshot(workspace_payload: Mapping[str, Any]) -> dict[str, object]:
102
104
 
103
105
  """
104
106
  snapshot: dict[str, object] = {}
105
- for key in sorted(SAFE_SNAPSHOT_FIELDS):
106
- value = _safe_value(workspace_payload.get(key))
107
- if value is None:
107
+ for key in sorted(SAFE_SNAPSHOT_FIELDS & workspace_payload.keys()):
108
+ value = _safe_value(workspace_payload[key])
109
+ if value is None and workspace_payload[key] is not None:
108
110
  continue
109
111
  candidate = {**snapshot, key: value}
110
112
  serialized = json.dumps(candidate, sort_keys=True, separators=(",", ":"))
@@ -357,6 +359,11 @@ def diff_snapshots(
357
359
  name=key,
358
360
  bound=bound_fields.get(key),
359
361
  current=current_fields.get(key),
362
+ state=(
363
+ "changed"
364
+ if key in bound_fields and key in current_fields
365
+ else "values_unavailable"
366
+ ),
360
367
  )
361
368
  for key in sorted(set(bound_fields) | set(current_fields))
362
369
  if bound_fields.get(key) != current_fields.get(key)
@@ -412,19 +419,28 @@ def format_diagnostics_content(diagnostics: WorkspaceDiagnostics) -> Content:
412
419
  """
413
420
  lines = [Content.styled(f"Server refusal: {diagnostics.reason}", "bold")]
414
421
  if diagnostics.changes:
415
- lines.append(Content.styled("Changed since this thread was bound:", "dim"))
422
+ lines.append(
423
+ Content("To resume this thread, restore these settings and relaunch:")
424
+ )
416
425
  for change in diagnostics.changes:
417
426
  if change.state == "values_unavailable":
418
427
  lines.append(
419
- Content.from_markup(" • $field changed", field=change.name)
428
+ Content.from_markup(
429
+ " • Restore $field to its original value (unavailable)",
430
+ field=strip_dangerous_unicode(change.name),
431
+ )
420
432
  )
421
433
  else:
422
434
  lines.append(
423
435
  Content.from_markup(
424
- " • $field: $bound → $current",
425
- field=change.name,
426
- bound=_display_value(change.bound),
427
- current=_display_value(change.current),
436
+ (
437
+ " • Unset $field (currently $current)"
438
+ if change.bound is None
439
+ else " • Set $field to $bound (currently $current)"
440
+ ),
441
+ field=strip_dangerous_unicode(change.name),
442
+ bound=strip_dangerous_unicode(_display_value(change.bound)),
443
+ current=strip_dangerous_unicode(_display_value(change.current)),
428
444
  )
429
445
  )
430
446
  if diagnostics.snapshot_status == "unavailable":
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "deepagents-code"
7
- version = "0.1.76"
7
+ version = "0.1.77"
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" }
@@ -27,7 +27,7 @@ classifiers = [
27
27
  ]
28
28
  dependencies = [
29
29
  # Framework
30
- "deepagents==0.7.18",
30
+ "deepagents==0.7.19",
31
31
  "langchain>=1.4.2,<2.0.0",
32
32
  "langgraph-checkpoint-sqlite>=3.1.1,<4.0.0",
33
33