deepagents-code 0.1.46__tar.gz → 0.1.48__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 (437) hide show
  1. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/CHANGELOG.md +20 -0
  2. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/PKG-INFO +4 -4
  3. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_build_info.py +1 -1
  4. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_env_vars.py +11 -0
  5. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_version.py +1 -1
  6. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/agent.py +43 -25
  7. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/app.py +137 -67
  8. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/approval_mode.py +40 -0
  9. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/auto_mode.py +5 -8
  10. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/config.py +31 -24
  11. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/config_manifest.py +13 -0
  12. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/extras_info.py +82 -0
  13. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/capabilities.py +34 -1
  14. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/env.py +4 -0
  15. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/legacy.py +2 -1
  16. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/loading.py +5 -3
  17. deepagents_code-0.1.48/deepagents_code/hooks/migration.py +190 -0
  18. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/models/config.py +21 -1
  19. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/models/domain.py +42 -0
  20. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/models/wire.py +31 -0
  21. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/projection.py +33 -0
  22. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/reducer.py +31 -0
  23. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/runner.py +94 -13
  24. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/snapshot.py +5 -0
  25. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/main.py +17 -33
  26. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/offload.py +2 -2
  27. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/store.py +5 -1
  28. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/__init__.py +28 -0
  29. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/agent_selector.py +5 -4
  30. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/model_selector.py +4 -0
  31. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/restart_prompt.py +1 -1
  32. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/startup_tip.py +47 -7
  33. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/welcome.py +4 -4
  34. deepagents_code-0.1.48/deepagents_code/tui/widgets/yolo_mode_notice.py +161 -0
  35. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/update_check.py +24 -0
  36. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/pyproject.toml +3 -3
  37. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/scripts/install.sh +7 -0
  38. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/hooks/models/test_models.py +17 -0
  39. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/hooks/test_configuration.py +157 -4
  40. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/hooks/test_engine.py +234 -0
  41. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/hooks/test_execution.py +180 -24
  42. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_agent.py +73 -28
  43. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_app.py +337 -1
  44. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_approval_mode.py +33 -0
  45. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_auto_mode.py +19 -29
  46. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_config.py +25 -1
  47. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_config_manifest.py +68 -0
  48. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_extras_info.py +49 -0
  49. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_install_script.py +9 -0
  50. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_model_config.py +20 -0
  51. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_reasoning_effort.py +6 -0
  52. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_reload.py +10 -0
  53. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_server_helpers.py +3 -0
  54. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_update_check.py +46 -0
  55. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +92 -0
  56. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_model_selector.py +16 -0
  57. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_startup_tip.py +47 -6
  58. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_welcome.py +14 -14
  59. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/uv.lock +15 -15
  60. deepagents_code-0.1.46/deepagents_code/hooks/migration.py +0 -90
  61. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/.gitignore +0 -0
  62. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/AGENTS.md +0 -0
  63. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/ARCHITECTURE.md +0 -0
  64. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/COMMANDS.md +0 -0
  65. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/DEVELOPMENT.md +0 -0
  66. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/Makefile +0 -0
  67. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/README.md +0 -0
  68. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/THREAT_MODEL.md +0 -0
  69. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/__init__.py +0 -0
  70. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/__main__.py +0 -0
  71. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_ask_user_types.py +0 -0
  72. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_cli_context.py +0 -0
  73. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_constants.py +0 -0
  74. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_debug.py +0 -0
  75. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_debug_buffer.py +0 -0
  76. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_fake_models.py +0 -0
  77. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_git.py +0 -0
  78. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_glm_5p2_profile.py +0 -0
  79. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_paths.py +0 -0
  80. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_repository_bounds.py +0 -0
  81. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_server_config.py +0 -0
  82. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_session_stats.py +0 -0
  83. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_startup_error.py +0 -0
  84. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_testing_models.py +0 -0
  85. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_textual_patches.py +0 -0
  86. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/_tool_stream.py +0 -0
  87. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/app.tcss +0 -0
  88. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/ask_user.py +0 -0
  89. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/auth_display.py +0 -0
  90. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/auth_store.py +0 -0
  91. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/__init__.py +0 -0
  92. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
  93. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
  94. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  95. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  96. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  97. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  98. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/__init__.py +0 -0
  99. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/commands/__init__.py +0 -0
  100. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/commands/auth.py +0 -0
  101. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/commands/config.py +0 -0
  102. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/commands/mcp.py +0 -0
  103. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/commands/tools.py +0 -0
  104. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/launch/__init__.py +0 -0
  105. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/launch/server.py +0 -0
  106. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/launch/server_manager.py +0 -0
  107. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/non_interactive.py +0 -0
  108. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/client/remote_client.py +0 -0
  109. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/clipboard.py +0 -0
  110. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/command_registry.py +0 -0
  111. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/configurable_model.py +0 -0
  112. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/default_agent_prompt.md +0 -0
  113. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/doctor.py +0 -0
  114. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/editor.py +0 -0
  115. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/event_bus.py +0 -0
  116. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/file_ops.py +0 -0
  117. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/formatting.py +0 -0
  118. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/goal_rubric.py +0 -0
  119. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/goal_state_notice.py +0 -0
  120. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/goal_tools.py +0 -0
  121. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/__init__.py +0 -0
  122. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/engine.py +0 -0
  123. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/models/__init__.py +0 -0
  124. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/models/adapters.py +0 -0
  125. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/models/transport.py +0 -0
  126. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/runtime.py +0 -0
  127. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/tools.py +0 -0
  128. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/transcript.py +0 -0
  129. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
  130. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/input.py +0 -0
  131. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/integrations/__init__.py +0 -0
  132. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/integrations/openai_codex.py +0 -0
  133. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/integrations/sandbox_config.py +0 -0
  134. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/integrations/sandbox_factory.py +0 -0
  135. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/integrations/sandbox_provider.py +0 -0
  136. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/integrations/sandbox_registry.py +0 -0
  137. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/iterm_cursor_guide.py +0 -0
  138. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/json_types.py +0 -0
  139. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/local_context.py +0 -0
  140. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/managed_tools.py +0 -0
  141. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_auth.py +0 -0
  142. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_config.py +0 -0
  143. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_disabled.py +0 -0
  144. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_login_service.py +0 -0
  145. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_oauth_ui.py +0 -0
  146. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/__init__.py +0 -0
  147. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/_registry.py +0 -0
  148. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/base.py +0 -0
  149. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/github.py +0 -0
  150. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/slack.py +0 -0
  151. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/mcp_tools.py +0 -0
  152. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/media_utils.py +0 -0
  153. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/memory_guard.py +0 -0
  154. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/model_config.py +0 -0
  155. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/notifications.py +0 -0
  156. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/offload_middleware.py +0 -0
  157. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/onboarding.py +0 -0
  158. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/output.py +0 -0
  159. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/paste_collapse.py +0 -0
  160. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/__init__.py +0 -0
  161. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/_json.py +0 -0
  162. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/adapters/__init__.py +0 -0
  163. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/adapters/mcp.py +0 -0
  164. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/adapters/skills.py +0 -0
  165. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
  166. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/commands_cli.py +0 -0
  167. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/discovery.py +0 -0
  168. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/manifest.py +0 -0
  169. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/marketplace.py +0 -0
  170. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/models.py +0 -0
  171. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/plugins/substitution.py +0 -0
  172. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/project_utils.py +0 -0
  173. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/py.typed +0 -0
  174. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/reasoning_effort.py +0 -0
  175. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/reliable_rubric.py +0 -0
  176. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/resume_state.py +0 -0
  177. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/server_graph.py +0 -0
  178. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/sessions.py +0 -0
  179. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/skills/__init__.py +0 -0
  180. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/skills/commands.py +0 -0
  181. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/skills/invocation.py +0 -0
  182. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/skills/load.py +0 -0
  183. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/skills/merge.py +0 -0
  184. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/skills/trust.py +0 -0
  185. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/state_migration.py +0 -0
  186. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/subagents.py +0 -0
  187. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/system_prompt.md +0 -0
  188. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/terminal_capabilities.py +0 -0
  189. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/terminal_escape.py +0 -0
  190. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/theme.py +0 -0
  191. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/todo_list_prompt.md +0 -0
  192. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tool_catalog.py +0 -0
  193. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tool_display.py +0 -0
  194. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tools.py +0 -0
  195. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/__init__.py +0 -0
  196. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/modals/__init__.py +0 -0
  197. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
  198. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
  199. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
  200. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
  201. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
  202. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/screens/__init__.py +0 -0
  203. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/textual_adapter.py +0 -0
  204. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/__init__.py +0 -0
  205. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
  206. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  207. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/_links.py +0 -0
  208. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
  209. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/approval.py +0 -0
  210. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/ask_user.py +0 -0
  211. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/auth.py +0 -0
  212. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
  213. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/autocomplete.py +0 -0
  214. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/chat_input.py +0 -0
  215. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  216. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  217. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/debug_console.py +0 -0
  218. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/diff.py +0 -0
  219. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  220. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/goal_review.py +0 -0
  221. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/goal_status.py +0 -0
  222. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/history.py +0 -0
  223. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  224. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/launch_init.py +0 -0
  225. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/loading.py +0 -0
  226. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  227. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  228. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
  229. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/message_store.py +0 -0
  230. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/messages.py +0 -0
  231. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/notification_center.py +0 -0
  232. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  233. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  234. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/plugin_reload.py +0 -0
  235. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  236. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/status.py +0 -0
  237. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  238. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  239. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/thread_selector.py +0 -0
  240. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  241. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  242. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/update_available.py +0 -0
  243. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  244. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/update_progress.py +0 -0
  245. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/ui.py +0 -0
  246. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/deepagents_code/unicode_security.py +0 -0
  247. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/examples/skills/arxiv-search/SKILL.md +0 -0
  248. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  249. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/examples/skills/langgraph-docs/SKILL.md +0 -0
  250. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/examples/skills/skill-creator/SKILL.md +0 -0
  251. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  252. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  253. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/examples/skills/web-research/SKILL.md +0 -0
  254. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/hatch_build.py +0 -0
  255. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/images/tui.png +0 -0
  256. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/scripts/check_imports.py +0 -0
  257. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/scripts/debug_server.sh +0 -0
  258. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/scripts/generate_commands_catalog.py +0 -0
  259. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/README.md +0 -0
  260. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/__init__.py +0 -0
  261. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/benchmarks/__init__.py +0 -0
  262. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  263. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
  264. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  265. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/conftest.py +0 -0
  266. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/test_acp_mode.py +0 -0
  267. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  268. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/test_compact_resume.py +0 -0
  269. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
  270. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/test_offload_server_side.py +0 -0
  271. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/test_sandbox_factory.py +0 -0
  272. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/integration_tests/test_sandbox_operations.py +0 -0
  273. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/__init__.py +0 -0
  274. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/client/__init__.py +0 -0
  275. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/client/commands/__init__.py +0 -0
  276. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/client/commands/test_auth.py +0 -0
  277. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/client/commands/test_mcp.py +0 -0
  278. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/client/commands/test_tools.py +0 -0
  279. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/conftest.py +0 -0
  280. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  281. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/hooks/__init__.py +0 -0
  282. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/hooks/models/__init__.py +0 -0
  283. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/hooks/test_transcript.py +0 -0
  284. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/plugins/__init__.py +0 -0
  285. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/plugins/test_marketplace.py +0 -0
  286. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
  287. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/plugins/test_store.py +0 -0
  288. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/skills/__init__.py +0 -0
  289. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_commands.py +0 -0
  290. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_load.py +0 -0
  291. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_merge.py +0 -0
  292. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  293. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_skills_json.py +0 -0
  294. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
  295. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  296. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  297. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
  298. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
  299. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test__tool_stream.py +0 -0
  300. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_agent_friendly.py +0 -0
  301. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_args.py +0 -0
  302. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  303. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_auth_display.py +0 -0
  304. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_auth_store.py +0 -0
  305. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  306. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_charset.py +0 -0
  307. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_clipboard.py +0 -0
  308. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  309. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_command_registry.py +0 -0
  310. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_compact_tool.py +0 -0
  311. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_config_recursion_limit.py +0 -0
  312. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_configurable_model.py +0 -0
  313. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_cursor_blink.py +0 -0
  314. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_cursor_style.py +0 -0
  315. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_debug.py +0 -0
  316. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_debug_buffer.py +0 -0
  317. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_debug_console.py +0 -0
  318. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_doctor.py +0 -0
  319. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_editor.py +0 -0
  320. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_end_to_end.py +0 -0
  321. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_env_vars.py +0 -0
  322. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_event_bus.py +0 -0
  323. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_exception_handling.py +0 -0
  324. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_file_ops.py +0 -0
  325. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_formatting.py +0 -0
  326. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_git.py +0 -0
  327. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
  328. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_criteria_client.py +0 -0
  329. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_rubric.py +0 -0
  330. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_state_notice.py +0 -0
  331. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_state_persistence.py +0 -0
  332. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_tools.py +0 -0
  333. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_hatch_build.py +0 -0
  334. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_hooks.py +0 -0
  335. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_imports.py +0 -0
  336. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_input_parsing.py +0 -0
  337. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_install_command.py +0 -0
  338. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  339. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_json_types.py +0 -0
  340. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_local_context.py +0 -0
  341. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_main.py +0 -0
  342. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_main_acp_mode.py +0 -0
  343. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_main_args.py +0 -0
  344. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_managed_tools.py +0 -0
  345. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_auth.py +0 -0
  346. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_config.py +0 -0
  347. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_disabled.py +0 -0
  348. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_login_service.py +0 -0
  349. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  350. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_tools.py +0 -0
  351. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_media_utils.py +0 -0
  352. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_memory_guard.py +0 -0
  353. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_model_switch.py +0 -0
  354. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_non_interactive.py +0 -0
  355. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_notifications.py +0 -0
  356. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_offload.py +0 -0
  357. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_onboarding.py +0 -0
  358. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  359. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_output.py +0 -0
  360. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_paths.py +0 -0
  361. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_reliable_rubric.py +0 -0
  362. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_remote_client.py +0 -0
  363. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_repository_bounds.py +0 -0
  364. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_resume_state.py +0 -0
  365. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_rubric_cli.py +0 -0
  366. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_sandbox_config.py +0 -0
  367. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_sandbox_factory.py +0 -0
  368. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_sandbox_provider.py +0 -0
  369. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_sandbox_registry.py +0 -0
  370. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_server.py +0 -0
  371. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_server_config.py +0 -0
  372. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_server_graph.py +0 -0
  373. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_server_manager.py +0 -0
  374. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_session_stats.py +0 -0
  375. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_sessions.py +0 -0
  376. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_shell_allow_list.py +0 -0
  377. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_skill_invocation.py +0 -0
  378. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_startup_blocking.py +0 -0
  379. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  380. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_state_migration.py +0 -0
  381. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_subagents.py +0 -0
  382. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  383. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_terminal_escape.py +0 -0
  384. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  385. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_textual_patches.py +0 -0
  386. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_theme.py +0 -0
  387. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_threads_resume.py +0 -0
  388. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_tool_catalog.py +0 -0
  389. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_tool_display.py +0 -0
  390. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_tracing_replicas.py +0 -0
  391. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  392. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_ui.py +0 -0
  393. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_unicode_security.py +0 -0
  394. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/test_version.py +0 -0
  395. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tools/__init__.py +0 -0
  396. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tools/test_current_thread.py +0 -0
  397. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  398. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
  399. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/__init__.py +0 -0
  400. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/modals/__init__.py +0 -0
  401. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
  402. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  403. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
  404. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  405. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  406. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  407. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
  408. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
  409. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
  410. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
  411. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  412. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  413. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
  414. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  415. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
  416. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  417. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  418. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  419. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  420. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  421. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  422. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
  423. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
  424. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
  425. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  426. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  427. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
  428. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_plugin_reload.py +0 -0
  429. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  430. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  431. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_status.py +0 -0
  432. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  433. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
  434. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  435. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  436. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  437. {deepagents_code-0.1.46 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
@@ -2,6 +2,26 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.48](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.47...deepagents-code==0.1.48) (2026-07-27)
6
+
7
+ ### Features
8
+
9
+ - 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))
10
+ - Migrated legacy hooks to v2 events. ([#4971](https://github.com/langchain-ai/deepagents/issues/4971))
11
+
12
+ ### Bug Fixes
13
+
14
+ - 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))
15
+ - Removed the redundant `/restart` hint from the restart prompt. ([#5083](https://github.com/langchain-ai/deepagents/issues/5083))
16
+ - Removed the caret flash in plugin type-to-search. ([#5078](https://github.com/langchain-ai/deepagents/issues/5078))
17
+
18
+ ## [0.1.47](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.46...deepagents-code==0.1.47) (2026-07-24)
19
+
20
+ ### Features
21
+
22
+ - Added `yolo` mode to the `Shift+Tab` approval cycle ([#5035](https://github.com/langchain-ai/deepagents/issues/5035)).
23
+ - Show the changelog link before prompting to update via the install script ([#5034](https://github.com/langchain-ai/deepagents/issues/5034)).
24
+
5
25
  ## [0.1.46](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.45...deepagents-code==0.1.46) (2026-07-24)
6
26
 
7
27
  ### Highlights
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents-code
3
- Version: 0.1.46
3
+ Version: 0.1.48
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,7 +31,7 @@ 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
34
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.5.2
35
35
  Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1
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
@@ -63,7 +63,7 @@ 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
68
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'all-providers'
69
69
  Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
@@ -91,7 +91,7 @@ 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
96
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'baseten'
97
97
  Provides-Extra: bedrock
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "efa86c5"
3
+ BUILD_COMMIT = "803b832"
@@ -401,6 +401,17 @@ THEME = "DEEPAGENTS_CODE_THEME"
401
401
  USER_ID = "DEEPAGENTS_CODE_USER_ID"
402
402
  """Attach a user identifier to LangSmith trace metadata."""
403
403
 
404
+ YOLO_SWITCHER = "DEEPAGENTS_CODE_YOLO_SWITCHER"
405
+ """Include YOLO in the Shift+Tab approval-mode cycle.
406
+
407
+ Enabled by default so an interactive session can cycle Manual → Auto → YOLO
408
+ without restarting with `--yolo`. Set to a falsy value (`0`, `false`, `no`,
409
+ `off`, or empty) to leave Shift+Tab limited to Manual/Auto. Also settable via
410
+ `[startup].yolo_switcher` in config.toml so orgs can distribute the opt-out.
411
+ Parsed by `classify_env_bool` through the config resolver (unrecognized values
412
+ fall through rather than forcing the default).
413
+ """
414
+
404
415
  _TRUTHY_VALUES = frozenset({"1", "true", "yes", "on"})
405
416
  _FALSY_VALUES = frozenset({"0", "false", "no", "off", ""})
406
417
 
@@ -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.46" # x-release-please-version
5
+ __version__ = "0.1.48" # 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,
@@ -3105,6 +3105,7 @@ class DeepAgentsApp(App):
3105
3105
  self._auto_approve = False
3106
3106
  self._approval_mode_blocked = False
3107
3107
  self._auto_mode_notice_pending = False
3108
+ self._yolo_mode_notice_pending = False
3108
3109
 
3109
3110
  if sub_title is None and self._sandbox_type is not None:
3110
3111
  display = _SANDBOX_DISPLAY_NAMES.get(
@@ -5051,37 +5052,20 @@ class DeepAgentsApp(App):
5051
5052
  and self._server_kwargs is not None
5052
5053
  ):
5053
5054
  missing = self._server_startup_missing_provider_package
5054
- from deepagents_code.extras_info import extra_for_package
5055
+ from deepagents_code.extras_info import resolve_install_hint
5055
5056
 
5056
- extra = extra_for_package(missing.package)
5057
- if extra is not None:
5057
+ hint = resolve_install_hint(missing.package)
5058
+ if hint.extra is not None:
5058
5059
  text += (
5059
- f"\n\nHint: install the package with `/install {extra}`, "
5060
+ f"\n\nHint: install the package with `/install {hint.extra}`, "
5060
5061
  f"then run `/model {missing.provider}:<model>` to retry. "
5061
5062
  "Or pick a different provider with `/model`."
5062
5063
  )
5063
5064
  else:
5064
- from deepagents_code.extras_info import ExtrasIntrospectionError
5065
- from deepagents_code.update_check import (
5066
- ToolRequirementIntrospectionError,
5067
- install_package_command,
5068
- )
5069
-
5070
- try:
5071
- install_cmd = install_package_command(missing.package)
5072
- except (
5073
- ValueError,
5074
- ExtrasIntrospectionError,
5075
- ToolRequirementIntrospectionError,
5076
- ) as exc:
5077
- logger.debug(
5078
- "install_package_command failed; falling back to "
5079
- "manual hint: %s",
5080
- exc,
5081
- )
5082
- install_hint = f"install the `{missing.package}` package manually"
5065
+ if hint.command is not None:
5066
+ install_hint = f"run `{hint.command}`"
5083
5067
  else:
5084
- install_hint = f"run `{install_cmd}`"
5068
+ install_hint = f"install the `{missing.package}` package manually"
5085
5069
  text += (
5086
5070
  f"\n\nHint: {install_hint}, then run "
5087
5071
  f"`/model {missing.provider}:<model>` "
@@ -6033,9 +6017,9 @@ class DeepAgentsApp(App):
6033
6017
  create_update_log_path,
6034
6018
  editable_extra_hint,
6035
6019
  install_extra_command,
6036
- install_extra_recovery_command,
6037
6020
  is_valid_extra_name,
6038
6021
  perform_install_extra,
6022
+ safe_install_extra_recovery_command,
6039
6023
  )
6040
6024
  except ImportError as exc:
6041
6025
  logger.warning("/install command import failed", exc_info=True)
@@ -6120,19 +6104,9 @@ class DeepAgentsApp(App):
6120
6104
  # already bound above so the hint is never empty. `manual_cmd` is
6121
6105
  # rendered into a Textual `Content` (literal, not Rich markup), so no
6122
6106
  # bracket escaping is needed here.
6123
- try:
6124
- manual_cmd = await asyncio.to_thread(
6125
- install_extra_recovery_command, extra
6126
- )
6127
- except (
6128
- ExtrasIntrospectionError,
6129
- ToolRequirementIntrospectionError,
6130
- ValueError,
6131
- ):
6132
- logger.warning(
6133
- "/install recovery command failed (install raised)",
6134
- exc_info=True,
6135
- )
6107
+ manual_cmd = await asyncio.to_thread(
6108
+ safe_install_extra_recovery_command, extra, fallback=manual_cmd
6109
+ )
6136
6110
  await self._mount_message(
6137
6111
  ErrorMessage(
6138
6112
  f"Install failed: {type(exc).__name__}: {exc}\n"
@@ -6148,19 +6122,9 @@ class DeepAgentsApp(App):
6148
6122
  detail = f": {output[-200:]}" if output else ""
6149
6123
  # See the OSError branch above: best-effort recovery command, falling
6150
6124
  # back to the already-bound install-script command on failure.
6151
- try:
6152
- manual_cmd = await asyncio.to_thread(
6153
- install_extra_recovery_command, extra
6154
- )
6155
- except (
6156
- ExtrasIntrospectionError,
6157
- ToolRequirementIntrospectionError,
6158
- ValueError,
6159
- ):
6160
- logger.warning(
6161
- "/install recovery command failed (install reported failure)",
6162
- exc_info=True,
6163
- )
6125
+ manual_cmd = await asyncio.to_thread(
6126
+ safe_install_extra_recovery_command, extra, fallback=manual_cmd
6127
+ )
6164
6128
  await self._mount_message(
6165
6129
  ErrorMessage(
6166
6130
  f"Install failed{detail}\n"
@@ -16900,7 +16864,9 @@ class DeepAgentsApp(App):
16900
16864
  elif kind == "denial":
16901
16865
  text = f"Auto denied [{event.get('category', 'policy')}]: {reason}"
16902
16866
  elif kind == "unavailable":
16903
- text = f"Auto classifier unavailable: {reason}"
16867
+ # Reason is a short cause fragment from the server; keep the UI
16868
+ # line outcome-focused so the blocked action is obvious.
16869
+ text = f"Auto classifier unavailable: {reason} (action blocked)"
16904
16870
  else:
16905
16871
  text = f"Auto warning: {reason}"
16906
16872
  await self._mount_message(AppMessage(text))
@@ -16912,10 +16878,12 @@ class DeepAgentsApp(App):
16912
16878
  panel.toggle()
16913
16879
 
16914
16880
  async def action_toggle_auto_approve(self) -> None:
16915
- """Toggle between Manual and Auto after Store acknowledgement.
16881
+ """Cycle Manual Auto → YOLO (when enabled) after Store acknowledgement.
16916
16882
 
16917
- A session launched in YOLO moves to Manual; normal key navigation never
16918
- enters unrestricted mode.
16883
+ YOLO is included by default (`startup.yolo_switcher` / env). Auto is
16884
+ skipped when a sandbox makes classifier-backed Auto ineligible. The
16885
+ first Shift+Tab into YOLO prompts for the same install-local
16886
+ acknowledgement used by `--yolo` before unrestricted mode becomes active.
16919
16887
  """
16920
16888
  from deepagents_code.tui.modals.plugin_manager import PluginManagerScreen
16921
16889
  from deepagents_code.tui.widgets.agent_selector import AgentSelectorScreen
@@ -16969,17 +16937,47 @@ class DeepAgentsApp(App):
16969
16937
  if self._pending_ask_user_widget is not None:
16970
16938
  self._pending_ask_user_widget.action_previous_question()
16971
16939
  return
16972
- from deepagents_code.approval_mode import ApprovalMode
16940
+ from deepagents_code.approval_mode import (
16941
+ ApprovalMode,
16942
+ has_yolo_acknowledgement,
16943
+ next_approval_mode,
16944
+ )
16945
+ from deepagents_code.config import is_yolo_switcher_enabled
16973
16946
 
16974
- if self._approval_mode is ApprovalMode.MANUAL:
16975
- if not self._auto_mode_eligible:
16976
- self._warn_live_approval_mode_unavailable(
16977
- "Auto is unavailable with a sandbox."
16978
- )
16979
- return
16980
- target = ApprovalMode.AUTO
16981
- else:
16982
- target = ApprovalMode.MANUAL
16947
+ yolo_switcher_enabled = is_yolo_switcher_enabled()
16948
+ target = next_approval_mode(
16949
+ self._approval_mode,
16950
+ auto_eligible=self._auto_mode_eligible,
16951
+ yolo_switcher_enabled=yolo_switcher_enabled,
16952
+ )
16953
+ if target is None:
16954
+ # `next_approval_mode` returns None only from Manual when neither
16955
+ # Auto (sandbox-ineligible) nor the YOLO switcher entry is available,
16956
+ # so this is the only reachable case.
16957
+ self._warn_live_approval_mode_unavailable(
16958
+ "Auto is unavailable with a sandbox, and YOLO is disabled "
16959
+ "in the approval switcher."
16960
+ )
16961
+ return
16962
+
16963
+ # Gate the first YOLO switcher entry on the same policy acknowledgement
16964
+ # as `--yolo`. Do not activate YOLO until the user continues.
16965
+ if target is ApprovalMode.YOLO and not has_yolo_acknowledgement():
16966
+ self._prompt_yolo_switcher_acknowledgement()
16967
+ return
16968
+
16969
+ await self._set_approval_mode(target)
16970
+
16971
+ async def _set_approval_mode(self, target: ApprovalMode) -> bool:
16972
+ """Apply an approval-mode change after optional live Store acknowledgement.
16973
+
16974
+ Args:
16975
+ target: Mode to select.
16976
+
16977
+ Returns:
16978
+ `True` when local UI state was updated to `target`.
16979
+ """
16980
+ from deepagents_code.approval_mode import ApprovalMode
16983
16981
 
16984
16982
  # With no usable agent/session pair there is no running graph to update.
16985
16983
  # Stage the selection locally; `execute_task_textual` persists it before
@@ -16993,7 +16991,12 @@ class DeepAgentsApp(App):
16993
16991
  self._warn_live_approval_mode_unavailable(
16994
16992
  "Auto could not be persisted; remaining in Manual."
16995
16993
  )
16996
- return
16994
+ return False
16995
+ if target is ApprovalMode.YOLO:
16996
+ self._warn_live_approval_mode_unavailable(
16997
+ "YOLO could not be persisted; remaining in the previous mode."
16998
+ )
16999
+ return False
16997
17000
  self._approval_mode_blocked = True
16998
17001
  self._warn_live_approval_mode_unavailable(
16999
17002
  "Manual could not be persisted; active work was cancelled and "
@@ -17001,7 +17004,7 @@ class DeepAgentsApp(App):
17001
17004
  )
17002
17005
  if self._agent_running:
17003
17006
  self._force_interrupt_active_work()
17004
- return
17007
+ return False
17005
17008
 
17006
17009
  self._approval_mode_blocked = False
17007
17010
  self._approval_mode = target
@@ -17014,6 +17017,73 @@ class DeepAgentsApp(App):
17014
17017
  self._notify_auto_mode_enabled_once()
17015
17018
  if should_persist_live:
17016
17019
  await self._auto_accept_pending_goal_rubric()
17020
+ elif target is ApprovalMode.YOLO:
17021
+ # Warn before the await below. State is already committed above, so
17022
+ # if goal-rubric auto-accept raises, YOLO is active and the "no
17023
+ # review" warning must have fired first. AUTO notifies before its
17024
+ # await for the same reason.
17025
+ self.notify(
17026
+ "YOLO is active: gated actions run without review.",
17027
+ severity="warning",
17028
+ timeout=8,
17029
+ markup=False,
17030
+ )
17031
+ if should_persist_live:
17032
+ await self._auto_accept_pending_goal_rubric()
17033
+ return True
17034
+
17035
+ def _prompt_yolo_switcher_acknowledgement(self) -> None:
17036
+ """Show the first-run YOLO acknowledgement before entering unrestricted mode.
17037
+
17038
+ YOLO stays inactive until Enter persists the acknowledgement and the
17039
+ follow-up mode write succeeds. Esc (or a non-true dismiss) leaves the
17040
+ current mode untouched and does not store the acknowledgement.
17041
+ """
17042
+ from deepagents_code.approval_mode import (
17043
+ ApprovalMode,
17044
+ save_yolo_acknowledgement,
17045
+ )
17046
+ from deepagents_code.tui.widgets.yolo_mode_notice import YoloModeNoticeScreen
17047
+
17048
+ if getattr(self, "_yolo_mode_notice_pending", False):
17049
+ return
17050
+
17051
+ def handle_result(accepted: bool | None) -> None:
17052
+ self._yolo_mode_notice_pending = False
17053
+ if accepted is not True:
17054
+ self.notify(
17055
+ "Stayed in the current approval mode.",
17056
+ severity="information",
17057
+ markup=False,
17058
+ )
17059
+ return
17060
+ if not save_yolo_acknowledgement():
17061
+ self._warn_live_approval_mode_unavailable(
17062
+ "YOLO acknowledgement could not be saved; staying in the "
17063
+ "current mode."
17064
+ )
17065
+ return
17066
+ task = asyncio.create_task(self._set_approval_mode(ApprovalMode.YOLO))
17067
+ task.add_done_callback(_log_task_exception)
17068
+
17069
+ try:
17070
+ self.push_screen(YoloModeNoticeScreen(), handle_result)
17071
+ except Exception:
17072
+ # This modal *is* the YOLO gate (unlike Auto's post-hoc notice), so
17073
+ # a failed push leaves the mode unchanged. Surface it, or Shift+Tab
17074
+ # looks dead. Leaving `_yolo_mode_notice_pending` unset (it is set
17075
+ # only below, after a successful push) lets a later Shift+Tab retry.
17076
+ logger.warning(
17077
+ "Could not show YOLO switcher acknowledgement", exc_info=True
17078
+ )
17079
+ self._warn_live_approval_mode_unavailable(
17080
+ "Could not open the YOLO confirmation; approval mode unchanged."
17081
+ )
17082
+ return
17083
+
17084
+ # Mark pending only after the push succeeds so a failed push cannot
17085
+ # suppress a later try for the whole session.
17086
+ self._yolo_mode_notice_pending = True
17017
17087
 
17018
17088
  def action_toggle_tool_output(self) -> None:
17019
17089
  """Toggle the most recent collapsible transcript unit."""
@@ -63,6 +63,46 @@ def coerce_approval_mode(value: object) -> ApprovalMode:
63
63
  return ApprovalMode.MANUAL
64
64
 
65
65
 
66
+ def next_approval_mode(
67
+ current: ApprovalMode | str | object,
68
+ *,
69
+ auto_eligible: bool,
70
+ yolo_switcher_enabled: bool,
71
+ ) -> ApprovalMode | None:
72
+ """Return the next Shift+Tab approval mode for the active session.
73
+
74
+ The cycle is Manual → Auto → YOLO → Manual when both Auto and the YOLO
75
+ switcher entry are available. Auto is omitted when `auto_eligible` is false
76
+ (for example a remote sandbox). YOLO is omitted when orgs/users disable
77
+ `startup.yolo_switcher`. Launching with `--yolo` still leaves unrestricted
78
+ mode when the switcher entry is disabled; Shift+Tab only exits YOLO then.
79
+
80
+ Args:
81
+ current: Active approval mode (mode enum or raw value).
82
+ auto_eligible: Whether classifier-backed Auto can be selected.
83
+ yolo_switcher_enabled: Whether unrestricted YOLO appears in the cycle.
84
+
85
+ Returns:
86
+ The next mode, or `None` when no alternate mode is available.
87
+ """
88
+ mode = (
89
+ current if isinstance(current, ApprovalMode) else coerce_approval_mode(current)
90
+ )
91
+ if mode is ApprovalMode.MANUAL:
92
+ if auto_eligible:
93
+ return ApprovalMode.AUTO
94
+ if yolo_switcher_enabled:
95
+ return ApprovalMode.YOLO
96
+ return None
97
+ if mode is ApprovalMode.AUTO:
98
+ if yolo_switcher_enabled:
99
+ return ApprovalMode.YOLO
100
+ return ApprovalMode.MANUAL
101
+ # Only genuine YOLO reaches here; unknown/invalid values were normalized to
102
+ # Manual above and took that branch. Exiting YOLO always returns to Manual.
103
+ return ApprovalMode.MANUAL
104
+
105
+
66
106
  def approval_mode_key(thread_id: str) -> str:
67
107
  """Return the store key for a thread's live approval mode.
68
108
 
@@ -506,9 +506,9 @@ def classifier_unavailable_reason(exc: BaseException, *, timeout_seconds: float)
506
506
 
507
507
  Provider exception text stays out of the reason (it can carry secrets or
508
508
  noisy HTML). Only real local deadline expiry
509
- (`_ClassifierDeadlineExceededError`) gets app-timeout wording; a bare
510
- provider `TimeoutError` stays type-only so we do not claim dcode
511
- cancelled a call the model failed first.
509
+ (`_ClassifierDeadlineExceededError`) includes the configured wait budget; a
510
+ bare provider `TimeoutError` stays type-only so we do not claim dcode's
511
+ deadline fired when the model failed first.
512
512
 
513
513
  Args:
514
514
  exc: Failure raised while invoking or validating the classifier.
@@ -518,11 +518,8 @@ def classifier_unavailable_reason(exc: BaseException, *, timeout_seconds: float)
518
518
  Compact single-line reason for tool messages and TUI events.
519
519
  """
520
520
  if isinstance(exc, _ClassifierDeadlineExceededError):
521
- return (
522
- "dcode cancelled the authorization classifier after its local "
523
- f"{timeout_seconds:g}s timeout (app-imposed, not a provider timeout)."
524
- )
525
- return f"The authorization classifier was unavailable ({type(exc).__name__})."
521
+ return f"no decision within Auto's {timeout_seconds:g}s limit"
522
+ return f"failed ({type(exc).__name__})"
526
523
 
527
524
 
528
525
  def _default_counters(mode: ApprovalMode) -> AutoModeCounters: