deepagents-code 0.1.47__tar.gz → 0.1.49__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 (439) hide show
  1. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/AGENTS.md +1 -1
  2. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/CHANGELOG.md +28 -0
  3. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/COMMANDS.md +4 -1
  4. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/PKG-INFO +13 -13
  5. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_build_info.py +1 -1
  6. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_version.py +1 -1
  7. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/agent.py +43 -25
  8. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/app.py +191 -68
  9. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/auto_mode.py +6 -8
  10. deepagents_code-0.1.49/deepagents_code/client/commands/extras.py +304 -0
  11. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/command_registry.py +18 -0
  12. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/config.py +10 -24
  13. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/extras_info.py +82 -0
  14. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/capabilities.py +34 -1
  15. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/env.py +4 -0
  16. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/legacy.py +2 -1
  17. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/loading.py +5 -3
  18. deepagents_code-0.1.49/deepagents_code/hooks/migration.py +190 -0
  19. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/models/config.py +21 -1
  20. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/models/domain.py +42 -0
  21. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/models/wire.py +31 -0
  22. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/projection.py +33 -0
  23. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/reducer.py +31 -0
  24. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/runner.py +94 -13
  25. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/snapshot.py +5 -0
  26. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/integrations/sandbox_factory.py +1 -1
  27. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/integrations/sandbox_provider.py +2 -2
  28. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/main.py +54 -242
  29. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/model_config.py +79 -0
  30. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/offload.py +2 -2
  31. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/plugins/store.py +5 -1
  32. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/server_graph.py +49 -8
  33. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/__init__.py +28 -0
  34. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/agent_selector.py +5 -4
  35. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/message_store.py +23 -1
  36. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/messages.py +360 -34
  37. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/model_selector.py +4 -0
  38. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/restart_prompt.py +1 -1
  39. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/startup_tip.py +2 -0
  40. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/yolo_mode_notice.py +39 -18
  41. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/ui.py +53 -7
  42. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/update_check.py +24 -0
  43. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/pyproject.toml +9 -9
  44. deepagents_code-0.1.49/tests/unit_tests/client/commands/test_extras.py +168 -0
  45. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/hooks/models/test_models.py +17 -0
  46. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/hooks/test_configuration.py +157 -4
  47. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/hooks/test_engine.py +234 -0
  48. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/hooks/test_execution.py +180 -24
  49. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_agent.py +73 -28
  50. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_agent_friendly.py +8 -0
  51. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_app.py +345 -1
  52. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_auto_mode.py +19 -29
  53. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_config.py +25 -1
  54. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_extras_info.py +50 -1
  55. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_install_command.py +58 -0
  56. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_model_config.py +115 -0
  57. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_model_switch.py +177 -72
  58. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_reasoning_effort.py +6 -0
  59. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_reload.py +10 -0
  60. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_sandbox_factory.py +1 -1
  61. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_sandbox_provider.py +2 -2
  62. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_sandbox_registry.py +1 -1
  63. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_server_graph.py +41 -6
  64. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_server_helpers.py +3 -0
  65. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_update_check.py +46 -0
  66. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +92 -0
  67. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_message_store.py +31 -0
  68. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_messages.py +298 -6
  69. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_model_selector.py +16 -0
  70. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/uv.lock +32 -32
  71. deepagents_code-0.1.47/deepagents_code/hooks/migration.py +0 -90
  72. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/.gitignore +0 -0
  73. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/ARCHITECTURE.md +0 -0
  74. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/DEVELOPMENT.md +0 -0
  75. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/Makefile +0 -0
  76. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/README.md +0 -0
  77. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/THREAT_MODEL.md +0 -0
  78. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/__init__.py +0 -0
  79. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/__main__.py +0 -0
  80. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_ask_user_types.py +0 -0
  81. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_cli_context.py +0 -0
  82. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_constants.py +0 -0
  83. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_debug.py +0 -0
  84. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_debug_buffer.py +0 -0
  85. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_env_vars.py +0 -0
  86. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_fake_models.py +0 -0
  87. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_git.py +0 -0
  88. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_glm_5p2_profile.py +0 -0
  89. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_paths.py +0 -0
  90. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_repository_bounds.py +0 -0
  91. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_server_config.py +0 -0
  92. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_session_stats.py +0 -0
  93. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_startup_error.py +0 -0
  94. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_testing_models.py +0 -0
  95. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_textual_patches.py +0 -0
  96. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/_tool_stream.py +0 -0
  97. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/app.tcss +0 -0
  98. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/approval_mode.py +0 -0
  99. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/ask_user.py +0 -0
  100. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/auth_display.py +0 -0
  101. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/auth_store.py +0 -0
  102. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/__init__.py +0 -0
  103. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
  104. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
  105. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  106. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  107. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  108. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  109. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/client/__init__.py +0 -0
  110. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/client/commands/__init__.py +0 -0
  111. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/client/commands/auth.py +0 -0
  112. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/client/commands/config.py +0 -0
  113. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/client/commands/mcp.py +0 -0
  114. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/client/commands/tools.py +0 -0
  115. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/client/launch/__init__.py +0 -0
  116. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/client/launch/server.py +0 -0
  117. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/client/launch/server_manager.py +0 -0
  118. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/client/non_interactive.py +0 -0
  119. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/client/remote_client.py +0 -0
  120. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/clipboard.py +0 -0
  121. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/config_manifest.py +0 -0
  122. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/configurable_model.py +0 -0
  123. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/default_agent_prompt.md +0 -0
  124. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/doctor.py +0 -0
  125. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/editor.py +0 -0
  126. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/event_bus.py +0 -0
  127. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/file_ops.py +0 -0
  128. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/formatting.py +0 -0
  129. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/goal_rubric.py +0 -0
  130. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/goal_state_notice.py +0 -0
  131. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/goal_tools.py +0 -0
  132. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/__init__.py +0 -0
  133. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/engine.py +0 -0
  134. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/models/__init__.py +0 -0
  135. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/models/adapters.py +0 -0
  136. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/models/transport.py +0 -0
  137. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/runtime.py +0 -0
  138. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/tools.py +0 -0
  139. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/transcript.py +0 -0
  140. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
  141. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/input.py +0 -0
  142. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/integrations/__init__.py +0 -0
  143. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/integrations/openai_codex.py +0 -0
  144. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/integrations/sandbox_config.py +0 -0
  145. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/integrations/sandbox_registry.py +0 -0
  146. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/iterm_cursor_guide.py +0 -0
  147. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/json_types.py +0 -0
  148. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/local_context.py +0 -0
  149. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/managed_tools.py +0 -0
  150. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/mcp_auth.py +0 -0
  151. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/mcp_config.py +0 -0
  152. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/mcp_disabled.py +0 -0
  153. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/mcp_login_service.py +0 -0
  154. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/mcp_oauth_ui.py +0 -0
  155. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/mcp_providers/__init__.py +0 -0
  156. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/mcp_providers/_registry.py +0 -0
  157. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/mcp_providers/base.py +0 -0
  158. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/mcp_providers/github.py +0 -0
  159. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/mcp_providers/slack.py +0 -0
  160. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/mcp_tools.py +0 -0
  161. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/media_utils.py +0 -0
  162. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/memory_guard.py +0 -0
  163. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/notifications.py +0 -0
  164. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/offload_middleware.py +0 -0
  165. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/onboarding.py +0 -0
  166. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/output.py +0 -0
  167. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/paste_collapse.py +0 -0
  168. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/plugins/__init__.py +0 -0
  169. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/plugins/_json.py +0 -0
  170. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/plugins/adapters/__init__.py +0 -0
  171. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/plugins/adapters/mcp.py +0 -0
  172. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/plugins/adapters/skills.py +0 -0
  173. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
  174. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/plugins/commands_cli.py +0 -0
  175. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/plugins/discovery.py +0 -0
  176. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/plugins/manifest.py +0 -0
  177. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/plugins/marketplace.py +0 -0
  178. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/plugins/models.py +0 -0
  179. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/plugins/substitution.py +0 -0
  180. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/project_utils.py +0 -0
  181. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/py.typed +0 -0
  182. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/reasoning_effort.py +0 -0
  183. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/reliable_rubric.py +0 -0
  184. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/resume_state.py +0 -0
  185. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/sessions.py +0 -0
  186. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/skills/__init__.py +0 -0
  187. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/skills/commands.py +0 -0
  188. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/skills/invocation.py +0 -0
  189. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/skills/load.py +0 -0
  190. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/skills/merge.py +0 -0
  191. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/skills/trust.py +0 -0
  192. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/state_migration.py +0 -0
  193. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/subagents.py +0 -0
  194. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/system_prompt.md +0 -0
  195. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/terminal_capabilities.py +0 -0
  196. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/terminal_escape.py +0 -0
  197. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/theme.py +0 -0
  198. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/todo_list_prompt.md +0 -0
  199. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tool_catalog.py +0 -0
  200. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tool_display.py +0 -0
  201. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tools.py +0 -0
  202. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/__init__.py +0 -0
  203. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/modals/__init__.py +0 -0
  204. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
  205. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
  206. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
  207. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
  208. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
  209. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/screens/__init__.py +0 -0
  210. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/textual_adapter.py +0 -0
  211. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/__init__.py +0 -0
  212. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
  213. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  214. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/_links.py +0 -0
  215. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
  216. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/approval.py +0 -0
  217. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/ask_user.py +0 -0
  218. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/auth.py +0 -0
  219. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
  220. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/autocomplete.py +0 -0
  221. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/chat_input.py +0 -0
  222. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  223. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  224. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/debug_console.py +0 -0
  225. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/diff.py +0 -0
  226. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  227. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/goal_review.py +0 -0
  228. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/goal_status.py +0 -0
  229. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/history.py +0 -0
  230. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  231. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/launch_init.py +0 -0
  232. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/loading.py +0 -0
  233. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  234. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  235. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
  236. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/notification_center.py +0 -0
  237. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  238. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  239. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/plugin_reload.py +0 -0
  240. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  241. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/status.py +0 -0
  242. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  243. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  244. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/thread_selector.py +0 -0
  245. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  246. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  247. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/update_available.py +0 -0
  248. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  249. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/update_progress.py +0 -0
  250. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/welcome.py +0 -0
  251. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/deepagents_code/unicode_security.py +0 -0
  252. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/examples/skills/arxiv-search/SKILL.md +0 -0
  253. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  254. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/examples/skills/langgraph-docs/SKILL.md +0 -0
  255. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/examples/skills/skill-creator/SKILL.md +0 -0
  256. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  257. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  258. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/examples/skills/web-research/SKILL.md +0 -0
  259. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/hatch_build.py +0 -0
  260. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/images/tui.png +0 -0
  261. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/scripts/check_imports.py +0 -0
  262. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/scripts/debug_server.sh +0 -0
  263. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/scripts/generate_commands_catalog.py +0 -0
  264. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/scripts/install.sh +0 -0
  265. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/README.md +0 -0
  266. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/integration_tests/__init__.py +0 -0
  267. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/integration_tests/benchmarks/__init__.py +0 -0
  268. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  269. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
  270. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  271. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/integration_tests/conftest.py +0 -0
  272. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/integration_tests/test_acp_mode.py +0 -0
  273. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  274. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/integration_tests/test_compact_resume.py +0 -0
  275. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
  276. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/integration_tests/test_offload_server_side.py +0 -0
  277. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/integration_tests/test_sandbox_factory.py +0 -0
  278. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/integration_tests/test_sandbox_operations.py +0 -0
  279. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/__init__.py +0 -0
  280. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/client/__init__.py +0 -0
  281. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/client/commands/__init__.py +0 -0
  282. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/client/commands/test_auth.py +0 -0
  283. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/client/commands/test_mcp.py +0 -0
  284. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/client/commands/test_tools.py +0 -0
  285. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/conftest.py +0 -0
  286. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  287. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/hooks/__init__.py +0 -0
  288. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/hooks/models/__init__.py +0 -0
  289. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/hooks/test_transcript.py +0 -0
  290. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/plugins/__init__.py +0 -0
  291. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/plugins/test_marketplace.py +0 -0
  292. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
  293. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/plugins/test_store.py +0 -0
  294. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/skills/__init__.py +0 -0
  295. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_commands.py +0 -0
  296. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_load.py +0 -0
  297. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_merge.py +0 -0
  298. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  299. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_skills_json.py +0 -0
  300. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
  301. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  302. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  303. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
  304. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
  305. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test__tool_stream.py +0 -0
  306. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_approval_mode.py +0 -0
  307. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_args.py +0 -0
  308. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  309. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_auth_display.py +0 -0
  310. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_auth_store.py +0 -0
  311. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  312. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_charset.py +0 -0
  313. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_clipboard.py +0 -0
  314. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  315. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_command_registry.py +0 -0
  316. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_compact_tool.py +0 -0
  317. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_config_manifest.py +0 -0
  318. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_config_recursion_limit.py +0 -0
  319. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_configurable_model.py +0 -0
  320. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_cursor_blink.py +0 -0
  321. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_cursor_style.py +0 -0
  322. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_debug.py +0 -0
  323. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_debug_buffer.py +0 -0
  324. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_debug_console.py +0 -0
  325. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_doctor.py +0 -0
  326. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_editor.py +0 -0
  327. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_end_to_end.py +0 -0
  328. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_env_vars.py +0 -0
  329. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_event_bus.py +0 -0
  330. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_exception_handling.py +0 -0
  331. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_file_ops.py +0 -0
  332. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_formatting.py +0 -0
  333. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_git.py +0 -0
  334. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
  335. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_goal_criteria_client.py +0 -0
  336. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_goal_rubric.py +0 -0
  337. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_goal_state_notice.py +0 -0
  338. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_goal_state_persistence.py +0 -0
  339. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_goal_tools.py +0 -0
  340. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_hatch_build.py +0 -0
  341. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_hooks.py +0 -0
  342. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_imports.py +0 -0
  343. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_input_parsing.py +0 -0
  344. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_install_script.py +0 -0
  345. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  346. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_json_types.py +0 -0
  347. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_local_context.py +0 -0
  348. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_main.py +0 -0
  349. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_main_acp_mode.py +0 -0
  350. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_main_args.py +0 -0
  351. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_managed_tools.py +0 -0
  352. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_auth.py +0 -0
  353. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_config.py +0 -0
  354. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_disabled.py +0 -0
  355. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_login_service.py +0 -0
  356. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  357. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_tools.py +0 -0
  358. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_media_utils.py +0 -0
  359. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_memory_guard.py +0 -0
  360. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_non_interactive.py +0 -0
  361. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_notifications.py +0 -0
  362. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_offload.py +0 -0
  363. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_onboarding.py +0 -0
  364. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  365. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_output.py +0 -0
  366. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_paths.py +0 -0
  367. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_reliable_rubric.py +0 -0
  368. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_remote_client.py +0 -0
  369. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_repository_bounds.py +0 -0
  370. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_resume_state.py +0 -0
  371. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_rubric_cli.py +0 -0
  372. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_sandbox_config.py +0 -0
  373. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_server.py +0 -0
  374. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_server_config.py +0 -0
  375. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_server_manager.py +0 -0
  376. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_session_stats.py +0 -0
  377. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_sessions.py +0 -0
  378. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_shell_allow_list.py +0 -0
  379. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_skill_invocation.py +0 -0
  380. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_startup_blocking.py +0 -0
  381. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  382. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_state_migration.py +0 -0
  383. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_subagents.py +0 -0
  384. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  385. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_terminal_escape.py +0 -0
  386. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  387. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_textual_patches.py +0 -0
  388. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_theme.py +0 -0
  389. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_threads_resume.py +0 -0
  390. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_tool_catalog.py +0 -0
  391. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_tool_display.py +0 -0
  392. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_tracing_replicas.py +0 -0
  393. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  394. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_ui.py +0 -0
  395. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_unicode_security.py +0 -0
  396. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/test_version.py +0 -0
  397. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tools/__init__.py +0 -0
  398. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tools/test_current_thread.py +0 -0
  399. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  400. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
  401. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/__init__.py +0 -0
  402. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/modals/__init__.py +0 -0
  403. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
  404. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  405. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
  406. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  407. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  408. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  409. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
  410. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
  411. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
  412. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
  413. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  414. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  415. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
  416. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  417. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
  418. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  419. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  420. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  421. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  422. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  423. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  424. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
  425. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  426. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  427. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
  428. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_plugin_reload.py +0 -0
  429. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  430. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  431. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
  432. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_status.py +0 -0
  433. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  434. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
  435. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  436. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  437. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  438. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
  439. {deepagents_code-0.1.47 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
@@ -32,7 +32,7 @@ IMPORTANT: `Content` requires **Textual's** `Style` (`textual.style.Style`) for
32
32
 
33
33
  ### `App.notify()` defaults to `markup=True`
34
34
 
35
- Textual's `App.notify(message)` parses the message string as Rich markup by default. Any dynamic content (exception messages, file paths, user input, command strings) containing brackets `[]`, ANSI escape codes, or `=` will cause a `MarkupError` crash in Textual's Toast renderer. Always pass `markup=False` when the message contains f-string interpolated variables. Hardcoded string literals are safe with the default.
35
+ Textual's `App.notify(message)` parses the message string as Rich markup by default. Any dynamic content (exception messages, file paths, user input, command strings) containing square brackets is unsafe: tag-shaped text like `[bold]` is silently swallowed, and closing-tag-shaped text like `[/tmp/x]` raises a `MarkupError` crash in Textual's Toast renderer. Always pass `markup=False` when the message contains f-string interpolated variables. Hardcoded string literals are safe with the default.
36
36
 
37
37
  ### Rich `console.print()` and number highlighting
38
38
 
@@ -2,6 +2,34 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.49](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.48...deepagents-code==0.1.49) (2026-07-27)
6
+
7
+ ### Features
8
+
9
+ - Added recognition for LangSmith Gateway credentials. ([#5042](https://github.com/langchain-ai/deepagents/issues/5042))
10
+ - Added slash commands for mode changes and an option to escape to manual mode from the YOLO notice. ([#5092](https://github.com/langchain-ai/deepagents/issues/5092))
11
+ - Added an `install` subcommand. ([#5080](https://github.com/langchain-ai/deepagents/issues/5080))
12
+
13
+ ### Bug Fixes
14
+
15
+ - Kept the post-install restart modal responsive. ([#5086](https://github.com/langchain-ai/deepagents/issues/5086))
16
+ - Moved server graph bootstrap `cwd` calls off the event loop. ([#5081](https://github.com/langchain-ai/deepagents/issues/5081))
17
+ - Improved handling of long transcript user messages with toast notifications and expansion. ([#5073](https://github.com/langchain-ai/deepagents/issues/5073))
18
+ - Show model no-op notices as toasts instead of inline messages. ([#5074](https://github.com/langchain-ai/deepagents/issues/5074))
19
+
20
+ ## [0.1.48](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.47...deepagents-code==0.1.48) (2026-07-27)
21
+
22
+ ### Features
23
+
24
+ - Added Fireworks `kimi-k3`, GLM-5.2-Fast, and Kimi-K3 to model selection and recommended models. ([#5082](https://github.com/langchain-ai/deepagents/issues/5082), [#5072](https://github.com/langchain-ai/deepagents/issues/5072))
25
+ - Migrated legacy hooks to v2 events. ([#4971](https://github.com/langchain-ai/deepagents/issues/4971))
26
+
27
+ ### Bug Fixes
28
+
29
+ - Require an `AGENTS.md` marker for `/agent` discovery, resolving unintended discovery behavior. ([#5076](https://github.com/langchain-ai/deepagents/issues/5076), closes [#4991](https://github.com/langchain-ai/deepagents/issues/4991))
30
+ - Removed the redundant `/restart` hint from the restart prompt. ([#5083](https://github.com/langchain-ai/deepagents/issues/5083))
31
+ - Removed the caret flash in plugin type-to-search. ([#5078](https://github.com/langchain-ai/deepagents/issues/5078))
32
+
5
33
  ## [0.1.47](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.46...deepagents-code==0.1.47) (2026-07-24)
6
34
 
7
35
  ### Features
@@ -8,12 +8,13 @@ Regenerate this file with `make commands-catalog` after changing command names,
8
8
  aliases, descriptions, visibility, or hidden-command metadata.
9
9
 
10
10
 
11
- ## Public (34)
11
+ ## Public (37)
12
12
 
13
13
  | Command | Aliases | Description |
14
14
  | --- | --- | --- |
15
15
  | `/agents` | | Browse and switch between available agents |
16
16
  | `/auth` | `/connect` | Connect and manage provider and service credentials |
17
+ | `/auto` | | Switch to Auto approval mode |
17
18
  | `/auto-update` | | Turn automatic updates on or off |
18
19
  | `/changelog` | | Open the changelog in a browser |
19
20
  | `/clear` | | Clear the chat and start a new thread |
@@ -26,6 +27,7 @@ aliases, descriptions, visibility, or hidden-command metadata.
26
27
  | `/goal` | | Set and manage a persistent objective with acceptance criteria |
27
28
  | `/help` | | Show help and available commands |
28
29
  | `/install` | | Install an optional integration |
30
+ | `/manual` | | Switch to Manual approval mode |
29
31
  | `/mcp` | | Manage MCP servers and authentication |
30
32
  | `/model` | | Switch models or edit model settings |
31
33
  | `/notifications` | | Configure startup warnings |
@@ -46,6 +48,7 @@ aliases, descriptions, visibility, or hidden-command metadata.
46
48
  | `/trace` | | Open this thread in LangSmith |
47
49
  | `/update` | | Check for and install updates |
48
50
  | `/version` | `/about` | Show version information |
51
+ | `/yolo` | | Switch to YOLO approval mode (no review) |
49
52
 
50
53
  ## Hidden (2)
51
54
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents-code
3
- Version: 0.1.47
3
+ Version: 0.1.49
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://docs.langchain.com/oss/python/deepagents/overview
6
6
  Project-URL: Documentation, https://reference.langchain.com/python/deepagents/
@@ -31,11 +31,11 @@ Requires-Dist: deepagents-acp<1.0.0,>=0.0.9
31
31
  Requires-Dist: deepagents==0.7.0b2
32
32
  Requires-Dist: filelock<3.30,>=3.29.7
33
33
  Requires-Dist: httpx<1.0.0,>=0.28.1
34
- Requires-Dist: langchain-anthropic<2.0.0,>=1.5.1
35
- Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1
34
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.5.2
35
+ Requires-Dist: langchain-google-genai<5.0.0,>=4.3.2
36
36
  Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.0
37
37
  Requires-Dist: langchain-openai<2.0.0,>=1.4.1
38
- Requires-Dist: langchain-quickjs<0.4.0,>=0.3.3
38
+ Requires-Dist: langchain-quickjs<0.4.0,>=0.3.4
39
39
  Requires-Dist: langchain<2.0.0,>=1.3.14
40
40
  Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
41
41
  Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.31
@@ -46,7 +46,7 @@ Requires-Dist: markdownify<2.0.0,>=1.2.3
46
46
  Requires-Dist: mcp<2.0.0,>=1.28.1
47
47
  Requires-Dist: packaging>=26.2
48
48
  Requires-Dist: pillow<13.0.0,>=12.3.0
49
- Requires-Dist: prompt-toolkit<4.0.0,>=3.0.52
49
+ Requires-Dist: prompt-toolkit<4.0.0,>=3.0.53
50
50
  Requires-Dist: pydantic<2.14.0a0,>=2.12.5
51
51
  Requires-Dist: pyperclip<2.0.0,>=1.11.0
52
52
  Requires-Dist: python-dotenv<2.0.0,>=1.2.2
@@ -63,13 +63,13 @@ Provides-Extra: agentcore
63
63
  Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.5; extra == 'agentcore'
64
64
  Provides-Extra: all-providers
65
65
  Requires-Dist: aiohttp<3.15.0,>=3.14.3; extra == 'all-providers'
66
- Requires-Dist: langchain-anthropic<2.0.0,>=1.5.1; extra == 'all-providers'
66
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.5.2; extra == 'all-providers'
67
67
  Requires-Dist: langchain-aws<2.0.0,>=1.6.3; extra == 'all-providers'
68
- Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'all-providers'
68
+ Requires-Dist: langchain-baseten<1.0.0,>=0.2.3; extra == 'all-providers'
69
69
  Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
70
70
  Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'all-providers'
71
- Requires-Dist: langchain-fireworks<2.0.0,>=1.5.1; extra == 'all-providers'
72
- Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1; extra == 'all-providers'
71
+ Requires-Dist: langchain-fireworks<2.0.0,>=1.5.2; extra == 'all-providers'
72
+ Requires-Dist: langchain-google-genai<5.0.0,>=4.3.2; extra == 'all-providers'
73
73
  Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.4; extra == 'all-providers'
74
74
  Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'all-providers'
75
75
  Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'all-providers'
@@ -91,9 +91,9 @@ Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
91
91
  Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
92
92
  Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
93
93
  Provides-Extra: anthropic
94
- Requires-Dist: langchain-anthropic<2.0.0,>=1.5.1; extra == 'anthropic'
94
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.5.2; extra == 'anthropic'
95
95
  Provides-Extra: baseten
96
- Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'baseten'
96
+ Requires-Dist: langchain-baseten<1.0.0,>=0.2.3; extra == 'baseten'
97
97
  Provides-Extra: bedrock
98
98
  Requires-Dist: langchain-aws<2.0.0,>=1.6.3; extra == 'bedrock'
99
99
  Provides-Extra: cohere
@@ -103,9 +103,9 @@ Requires-Dist: langchain-daytona>=0.0.7; extra == 'daytona'
103
103
  Provides-Extra: deepseek
104
104
  Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'deepseek'
105
105
  Provides-Extra: fireworks
106
- Requires-Dist: langchain-fireworks<2.0.0,>=1.5.1; extra == 'fireworks'
106
+ Requires-Dist: langchain-fireworks<2.0.0,>=1.5.2; extra == 'fireworks'
107
107
  Provides-Extra: google-genai
108
- Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1; extra == 'google-genai'
108
+ Requires-Dist: langchain-google-genai<5.0.0,>=4.3.2; extra == 'google-genai'
109
109
  Provides-Extra: groq
110
110
  Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'groq'
111
111
  Provides-Extra: huggingface
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "8aa29dd"
3
+ BUILD_COMMIT = "44910bc"
@@ -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.47" # x-release-please-version
5
+ __version__ = "0.1.49" # 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."""
@@ -1107,12 +1107,25 @@ def load_async_subagents(config_path: Path | None = None) -> list[AsyncSubAgent]
1107
1107
  return agents
1108
1108
 
1109
1109
 
1110
+ _AGENT_DIR_MARKER = "AGENTS.md"
1111
+ """Filename that marks a `~/.deepagents/<name>/` directory as an agent profile.
1112
+
1113
+ Discovery is fail-closed: only directories containing this marker are listed by
1114
+ the `/agent` picker. Real agents always create it (empty on first use when
1115
+ memory is enabled), so empty folders stay out of the picker without being
1116
+ named. Known app-owned directory names are still denylisted so a forced
1117
+ invocation such as `dcode -a plugins` cannot stamp the marker into app state
1118
+ and surface that directory as a selectable agent.
1119
+ """
1120
+
1121
+
1110
1122
  @functools.lru_cache(maxsize=1)
1111
1123
  def _reserved_agent_dir_names() -> frozenset[str]:
1112
1124
  """Return non-agent directory names reserved by the app under `~/.deepagents/`.
1113
1125
 
1114
1126
  These directories are created by the app for its own use and must never
1115
- appear in the agent picker:
1127
+ appear in the agent picker — even if they contain an `AGENTS.md` file
1128
+ (e.g. after `dcode -a plugins` stamps the marker via memory setup):
1116
1129
 
1117
1130
  - `bin/` holds the managed `rg` binary (`managed_tools.BIN_DIR`).
1118
1131
  - `plugins/` holds installed plugin state (`plugins.store`).
@@ -1134,28 +1147,38 @@ def _reserved_agent_dir_names() -> frozenset[str]:
1134
1147
  def _is_agent_dir_entry(entry: Path) -> bool:
1135
1148
  """Return whether a `~/.deepagents/` entry should be listed as an agent.
1136
1149
 
1137
- Filters out symlinks (so dangling links don't masquerade as agents),
1138
- dot-prefixed names `.state/` (app internal state) plus any other
1139
- hidden directory the user may have placed there — and reserved names
1140
- the app owns (`bin/`, `plugins/`, and `conversation_history/`).
1150
+ Fail-closed on the `AGENTS.md` marker: a directory is an agent only when
1151
+ that file exists as a regular (non-symlink) file inside it.
1152
+
1153
+ Also rejects:
1141
1154
 
1142
- `OSError` from `is_dir`/`is_symlink` propagates so callers can log
1143
- with the failing entry's name as context.
1155
+ - Dot-prefixed names (hidden dirs such as `.state/`)
1156
+ - Reserved app-owned names (`bin/`, `plugins/`, `conversation_history/`),
1157
+ even if they contain the marker
1158
+ - Symlinked directories (including dangling links)
1159
+ - Non-directories
1160
+
1161
+ `OSError` from `is_dir`/`is_symlink`/`is_file` propagates so callers can
1162
+ log with the failing entry's name as context.
1144
1163
  """
1145
1164
  if entry.name.startswith(".") or entry.name in _reserved_agent_dir_names():
1146
1165
  return False
1147
- return entry.is_dir() and not entry.is_symlink()
1166
+ if entry.is_symlink() or not entry.is_dir():
1167
+ return False
1168
+ marker = entry / _AGENT_DIR_MARKER
1169
+ # `is_file()` is True for a symlink-to-file; reject those so a dangling or
1170
+ # external link cannot mint an agent entry.
1171
+ return marker.is_file() and not marker.is_symlink()
1148
1172
 
1149
1173
 
1150
1174
  def get_available_agent_names() -> list[str]:
1151
1175
  """Return a sorted list of available agent names from `~/.deepagents/`.
1152
1176
 
1153
1177
  Scans the user's `.deepagents` directory and returns each real
1154
- subdirectory found there. Symlinks excluded so a dangling link does not
1155
- masquerade as an agent. Dot-prefixed entries (e.g., `.state/`) and
1156
- reserved app-owned directories (`bin/`, `plugins/`, and
1157
- `conversation_history/`) are skipped so internal state never appears as an
1158
- agent.
1178
+ subdirectory that contains the `AGENTS.md` agent marker and is not an
1179
+ app-reserved name. Fail-closed: bare directories, reserved app state
1180
+ (`bin/`, `plugins/`, `conversation_history/`), symlinks, and hidden
1181
+ entries are not agents.
1159
1182
 
1160
1183
  Filesystem errors (missing parent, permission denied, broken entries) are
1161
1184
  logged and surfaced as an empty list rather than raised — the caller shows
@@ -1222,7 +1245,9 @@ def list_agents(*, output_format: OutputFormat = "text") -> None:
1222
1245
  {
1223
1246
  "name": name,
1224
1247
  "path": str(agent_path),
1225
- "has_agents_md": (agent_path / "AGENTS.md").exists(),
1248
+ # Always True for names from `get_available_agent_names`
1249
+ # (fail-closed marker). Kept for JSON schema stability.
1250
+ "has_agents_md": (agent_path / _AGENT_DIR_MARKER).is_file(),
1226
1251
  "is_default": name == DEFAULT_AGENT_NAME,
1227
1252
  }
1228
1253
  )
@@ -1240,17 +1265,10 @@ def list_agents(*, output_format: OutputFormat = "text") -> None:
1240
1265
  is_default = name == DEFAULT_AGENT_NAME
1241
1266
  default_label = " [dim](default)[/dim]" if is_default else ""
1242
1267
 
1243
- if (agent_path / "AGENTS.md").exists():
1244
- console.print(
1245
- f" {bullet} [bold]{agent_name}[/bold]{default_label}",
1246
- style=theme.PRIMARY,
1247
- )
1248
- else:
1249
- console.print(
1250
- f" {bullet} [bold]{agent_name}[/bold]{default_label}"
1251
- " [dim](incomplete)[/dim]",
1252
- style=theme.WARNING,
1253
- )
1268
+ console.print(
1269
+ f" {bullet} [bold]{agent_name}[/bold]{default_label}",
1270
+ style=theme.PRIMARY,
1271
+ )
1254
1272
  console.print(
1255
1273
  f" {escape_markup(str(agent_path))}",
1256
1274
  style=theme.MUTED,