deepagents-code 0.1.46__tar.gz → 0.1.47__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 (436) hide show
  1. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/CHANGELOG.md +7 -0
  2. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/PKG-INFO +1 -1
  3. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_build_info.py +1 -1
  4. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_env_vars.py +11 -0
  5. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_version.py +1 -1
  6. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/app.py +120 -15
  7. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/approval_mode.py +40 -0
  8. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/config.py +21 -0
  9. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/config_manifest.py +13 -0
  10. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/startup_tip.py +47 -7
  11. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/welcome.py +4 -4
  12. deepagents_code-0.1.47/deepagents_code/tui/widgets/yolo_mode_notice.py +161 -0
  13. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/pyproject.toml +1 -1
  14. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/scripts/install.sh +7 -0
  15. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_app.py +334 -0
  16. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_approval_mode.py +33 -0
  17. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_config_manifest.py +68 -0
  18. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_install_script.py +9 -0
  19. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_startup_tip.py +47 -6
  20. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_welcome.py +14 -14
  21. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/uv.lock +1 -1
  22. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/.gitignore +0 -0
  23. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/AGENTS.md +0 -0
  24. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/ARCHITECTURE.md +0 -0
  25. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/COMMANDS.md +0 -0
  26. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/DEVELOPMENT.md +0 -0
  27. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/Makefile +0 -0
  28. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/README.md +0 -0
  29. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/THREAT_MODEL.md +0 -0
  30. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/__init__.py +0 -0
  31. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/__main__.py +0 -0
  32. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_ask_user_types.py +0 -0
  33. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_cli_context.py +0 -0
  34. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_constants.py +0 -0
  35. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_debug.py +0 -0
  36. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_debug_buffer.py +0 -0
  37. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_fake_models.py +0 -0
  38. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_git.py +0 -0
  39. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_glm_5p2_profile.py +0 -0
  40. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_paths.py +0 -0
  41. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_repository_bounds.py +0 -0
  42. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_server_config.py +0 -0
  43. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_session_stats.py +0 -0
  44. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_startup_error.py +0 -0
  45. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_testing_models.py +0 -0
  46. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_textual_patches.py +0 -0
  47. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/_tool_stream.py +0 -0
  48. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/agent.py +0 -0
  49. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/app.tcss +0 -0
  50. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/ask_user.py +0 -0
  51. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/auth_display.py +0 -0
  52. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/auth_store.py +0 -0
  53. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/auto_mode.py +0 -0
  54. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/__init__.py +0 -0
  55. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
  56. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
  57. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  58. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  59. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  60. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  61. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/__init__.py +0 -0
  62. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/commands/__init__.py +0 -0
  63. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/commands/auth.py +0 -0
  64. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/commands/config.py +0 -0
  65. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/commands/mcp.py +0 -0
  66. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/commands/tools.py +0 -0
  67. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/launch/__init__.py +0 -0
  68. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/launch/server.py +0 -0
  69. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/launch/server_manager.py +0 -0
  70. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/non_interactive.py +0 -0
  71. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/client/remote_client.py +0 -0
  72. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/clipboard.py +0 -0
  73. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/command_registry.py +0 -0
  74. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/configurable_model.py +0 -0
  75. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/default_agent_prompt.md +0 -0
  76. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/doctor.py +0 -0
  77. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/editor.py +0 -0
  78. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/event_bus.py +0 -0
  79. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/extras_info.py +0 -0
  80. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/file_ops.py +0 -0
  81. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/formatting.py +0 -0
  82. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/goal_rubric.py +0 -0
  83. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/goal_state_notice.py +0 -0
  84. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/goal_tools.py +0 -0
  85. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/__init__.py +0 -0
  86. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/capabilities.py +0 -0
  87. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/engine.py +0 -0
  88. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/env.py +0 -0
  89. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/legacy.py +0 -0
  90. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/loading.py +0 -0
  91. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/migration.py +0 -0
  92. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/models/__init__.py +0 -0
  93. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/models/adapters.py +0 -0
  94. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/models/config.py +0 -0
  95. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/models/domain.py +0 -0
  96. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/models/transport.py +0 -0
  97. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/models/wire.py +0 -0
  98. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/projection.py +0 -0
  99. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/reducer.py +0 -0
  100. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/runner.py +0 -0
  101. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/runtime.py +0 -0
  102. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/snapshot.py +0 -0
  103. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/tools.py +0 -0
  104. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/transcript.py +0 -0
  105. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
  106. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/input.py +0 -0
  107. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/integrations/__init__.py +0 -0
  108. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/integrations/openai_codex.py +0 -0
  109. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/integrations/sandbox_config.py +0 -0
  110. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/integrations/sandbox_factory.py +0 -0
  111. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/integrations/sandbox_provider.py +0 -0
  112. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/integrations/sandbox_registry.py +0 -0
  113. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/iterm_cursor_guide.py +0 -0
  114. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/json_types.py +0 -0
  115. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/local_context.py +0 -0
  116. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/main.py +0 -0
  117. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/managed_tools.py +0 -0
  118. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_auth.py +0 -0
  119. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_config.py +0 -0
  120. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_disabled.py +0 -0
  121. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_login_service.py +0 -0
  122. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_oauth_ui.py +0 -0
  123. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_providers/__init__.py +0 -0
  124. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_providers/_registry.py +0 -0
  125. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_providers/base.py +0 -0
  126. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_providers/github.py +0 -0
  127. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_providers/slack.py +0 -0
  128. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/mcp_tools.py +0 -0
  129. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/media_utils.py +0 -0
  130. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/memory_guard.py +0 -0
  131. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/model_config.py +0 -0
  132. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/notifications.py +0 -0
  133. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/offload.py +0 -0
  134. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/offload_middleware.py +0 -0
  135. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/onboarding.py +0 -0
  136. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/output.py +0 -0
  137. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/paste_collapse.py +0 -0
  138. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/__init__.py +0 -0
  139. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/_json.py +0 -0
  140. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/adapters/__init__.py +0 -0
  141. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/adapters/mcp.py +0 -0
  142. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/adapters/skills.py +0 -0
  143. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
  144. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/commands_cli.py +0 -0
  145. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/discovery.py +0 -0
  146. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/manifest.py +0 -0
  147. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/marketplace.py +0 -0
  148. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/models.py +0 -0
  149. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/store.py +0 -0
  150. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/plugins/substitution.py +0 -0
  151. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/project_utils.py +0 -0
  152. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/py.typed +0 -0
  153. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/reasoning_effort.py +0 -0
  154. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/reliable_rubric.py +0 -0
  155. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/resume_state.py +0 -0
  156. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/server_graph.py +0 -0
  157. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/sessions.py +0 -0
  158. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/skills/__init__.py +0 -0
  159. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/skills/commands.py +0 -0
  160. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/skills/invocation.py +0 -0
  161. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/skills/load.py +0 -0
  162. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/skills/merge.py +0 -0
  163. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/skills/trust.py +0 -0
  164. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/state_migration.py +0 -0
  165. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/subagents.py +0 -0
  166. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/system_prompt.md +0 -0
  167. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/terminal_capabilities.py +0 -0
  168. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/terminal_escape.py +0 -0
  169. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/theme.py +0 -0
  170. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/todo_list_prompt.md +0 -0
  171. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tool_catalog.py +0 -0
  172. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tool_display.py +0 -0
  173. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tools.py +0 -0
  174. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/__init__.py +0 -0
  175. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/modals/__init__.py +0 -0
  176. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
  177. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
  178. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
  179. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
  180. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
  181. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
  182. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/screens/__init__.py +0 -0
  183. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/textual_adapter.py +0 -0
  184. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/__init__.py +0 -0
  185. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
  186. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  187. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/_links.py +0 -0
  188. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
  189. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/agent_selector.py +0 -0
  190. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/approval.py +0 -0
  191. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/ask_user.py +0 -0
  192. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/auth.py +0 -0
  193. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
  194. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/autocomplete.py +0 -0
  195. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/chat_input.py +0 -0
  196. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  197. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  198. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/debug_console.py +0 -0
  199. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/diff.py +0 -0
  200. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  201. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/goal_review.py +0 -0
  202. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/goal_status.py +0 -0
  203. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/history.py +0 -0
  204. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  205. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/launch_init.py +0 -0
  206. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/loading.py +0 -0
  207. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  208. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  209. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
  210. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/message_store.py +0 -0
  211. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/messages.py +0 -0
  212. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/model_selector.py +0 -0
  213. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/notification_center.py +0 -0
  214. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  215. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  216. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/plugin_reload.py +0 -0
  217. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
  218. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  219. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/status.py +0 -0
  220. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  221. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  222. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/thread_selector.py +0 -0
  223. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  224. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  225. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/update_available.py +0 -0
  226. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  227. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/update_progress.py +0 -0
  228. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/ui.py +0 -0
  229. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/unicode_security.py +0 -0
  230. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/deepagents_code/update_check.py +0 -0
  231. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/examples/skills/arxiv-search/SKILL.md +0 -0
  232. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  233. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/examples/skills/langgraph-docs/SKILL.md +0 -0
  234. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/examples/skills/skill-creator/SKILL.md +0 -0
  235. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  236. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  237. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/examples/skills/web-research/SKILL.md +0 -0
  238. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/hatch_build.py +0 -0
  239. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/images/tui.png +0 -0
  240. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/scripts/check_imports.py +0 -0
  241. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/scripts/debug_server.sh +0 -0
  242. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/scripts/generate_commands_catalog.py +0 -0
  243. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/README.md +0 -0
  244. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/__init__.py +0 -0
  245. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/benchmarks/__init__.py +0 -0
  246. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  247. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
  248. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  249. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/conftest.py +0 -0
  250. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/test_acp_mode.py +0 -0
  251. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  252. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/test_compact_resume.py +0 -0
  253. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
  254. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/test_offload_server_side.py +0 -0
  255. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/test_sandbox_factory.py +0 -0
  256. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/integration_tests/test_sandbox_operations.py +0 -0
  257. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/__init__.py +0 -0
  258. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/client/__init__.py +0 -0
  259. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/client/commands/__init__.py +0 -0
  260. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/client/commands/test_auth.py +0 -0
  261. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/client/commands/test_mcp.py +0 -0
  262. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/client/commands/test_tools.py +0 -0
  263. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/conftest.py +0 -0
  264. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  265. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/hooks/__init__.py +0 -0
  266. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/hooks/models/__init__.py +0 -0
  267. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/hooks/models/test_models.py +0 -0
  268. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/hooks/test_configuration.py +0 -0
  269. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/hooks/test_engine.py +0 -0
  270. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/hooks/test_execution.py +0 -0
  271. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/hooks/test_transcript.py +0 -0
  272. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/plugins/__init__.py +0 -0
  273. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/plugins/test_marketplace.py +0 -0
  274. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
  275. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/plugins/test_store.py +0 -0
  276. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/skills/__init__.py +0 -0
  277. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_commands.py +0 -0
  278. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_load.py +0 -0
  279. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_merge.py +0 -0
  280. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  281. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_skills_json.py +0 -0
  282. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
  283. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  284. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  285. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
  286. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
  287. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test__tool_stream.py +0 -0
  288. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_agent.py +0 -0
  289. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_agent_friendly.py +0 -0
  290. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_args.py +0 -0
  291. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  292. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_auth_display.py +0 -0
  293. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_auth_store.py +0 -0
  294. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  295. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_auto_mode.py +0 -0
  296. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_charset.py +0 -0
  297. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_clipboard.py +0 -0
  298. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  299. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_command_registry.py +0 -0
  300. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_compact_tool.py +0 -0
  301. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_config.py +0 -0
  302. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_config_recursion_limit.py +0 -0
  303. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_configurable_model.py +0 -0
  304. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_cursor_blink.py +0 -0
  305. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_cursor_style.py +0 -0
  306. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_debug.py +0 -0
  307. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_debug_buffer.py +0 -0
  308. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_debug_console.py +0 -0
  309. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_doctor.py +0 -0
  310. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_editor.py +0 -0
  311. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_end_to_end.py +0 -0
  312. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_env_vars.py +0 -0
  313. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_event_bus.py +0 -0
  314. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_exception_handling.py +0 -0
  315. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_extras_info.py +0 -0
  316. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_file_ops.py +0 -0
  317. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_formatting.py +0 -0
  318. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_git.py +0 -0
  319. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
  320. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_goal_criteria_client.py +0 -0
  321. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_goal_rubric.py +0 -0
  322. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_goal_state_notice.py +0 -0
  323. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_goal_state_persistence.py +0 -0
  324. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_goal_tools.py +0 -0
  325. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_hatch_build.py +0 -0
  326. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_hooks.py +0 -0
  327. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_imports.py +0 -0
  328. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_input_parsing.py +0 -0
  329. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_install_command.py +0 -0
  330. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  331. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_json_types.py +0 -0
  332. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_local_context.py +0 -0
  333. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_main.py +0 -0
  334. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_main_acp_mode.py +0 -0
  335. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_main_args.py +0 -0
  336. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_managed_tools.py +0 -0
  337. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_auth.py +0 -0
  338. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_config.py +0 -0
  339. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_disabled.py +0 -0
  340. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_login_service.py +0 -0
  341. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  342. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_tools.py +0 -0
  343. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_media_utils.py +0 -0
  344. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_memory_guard.py +0 -0
  345. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_model_config.py +0 -0
  346. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_model_switch.py +0 -0
  347. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_non_interactive.py +0 -0
  348. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_notifications.py +0 -0
  349. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_offload.py +0 -0
  350. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_onboarding.py +0 -0
  351. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  352. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_output.py +0 -0
  353. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_paths.py +0 -0
  354. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_reasoning_effort.py +0 -0
  355. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_reliable_rubric.py +0 -0
  356. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_reload.py +0 -0
  357. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_remote_client.py +0 -0
  358. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_repository_bounds.py +0 -0
  359. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_resume_state.py +0 -0
  360. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_rubric_cli.py +0 -0
  361. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_sandbox_config.py +0 -0
  362. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_sandbox_factory.py +0 -0
  363. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_sandbox_provider.py +0 -0
  364. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_sandbox_registry.py +0 -0
  365. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_server.py +0 -0
  366. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_server_config.py +0 -0
  367. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_server_graph.py +0 -0
  368. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_server_helpers.py +0 -0
  369. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_server_manager.py +0 -0
  370. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_session_stats.py +0 -0
  371. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_sessions.py +0 -0
  372. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_shell_allow_list.py +0 -0
  373. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_skill_invocation.py +0 -0
  374. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_startup_blocking.py +0 -0
  375. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  376. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_state_migration.py +0 -0
  377. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_subagents.py +0 -0
  378. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  379. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_terminal_escape.py +0 -0
  380. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  381. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_textual_patches.py +0 -0
  382. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_theme.py +0 -0
  383. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_threads_resume.py +0 -0
  384. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_tool_catalog.py +0 -0
  385. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_tool_display.py +0 -0
  386. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_tracing_replicas.py +0 -0
  387. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  388. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_ui.py +0 -0
  389. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_unicode_security.py +0 -0
  390. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_update_check.py +0 -0
  391. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/test_version.py +0 -0
  392. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tools/__init__.py +0 -0
  393. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tools/test_current_thread.py +0 -0
  394. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  395. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
  396. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/__init__.py +0 -0
  397. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/modals/__init__.py +0 -0
  398. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
  399. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
  400. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  401. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
  402. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  403. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  404. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  405. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
  406. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
  407. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
  408. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
  409. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  410. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  411. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
  412. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  413. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
  414. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  415. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  416. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  417. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  418. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  419. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  420. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
  421. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
  422. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
  423. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
  424. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  425. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  426. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
  427. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_plugin_reload.py +0 -0
  428. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  429. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  430. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_status.py +0 -0
  431. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  432. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
  433. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  434. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  435. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  436. {deepagents_code-0.1.46 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
@@ -2,6 +2,13 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.47](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.46...deepagents-code==0.1.47) (2026-07-24)
6
+
7
+ ### Features
8
+
9
+ - Added `yolo` mode to the `Shift+Tab` approval cycle ([#5035](https://github.com/langchain-ai/deepagents/issues/5035)).
10
+ - Show the changelog link before prompting to update via the install script ([#5034](https://github.com/langchain-ai/deepagents/issues/5034)).
11
+
5
12
  ## [0.1.46](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.45...deepagents-code==0.1.46) (2026-07-24)
6
13
 
7
14
  ### 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.47
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/
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "efa86c5"
3
+ BUILD_COMMIT = "8aa29dd"
@@ -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.47" # 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."""
@@ -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(
@@ -16912,10 +16913,12 @@ class DeepAgentsApp(App):
16912
16913
  panel.toggle()
16913
16914
 
16914
16915
  async def action_toggle_auto_approve(self) -> None:
16915
- """Toggle between Manual and Auto after Store acknowledgement.
16916
+ """Cycle Manual Auto → YOLO (when enabled) after Store acknowledgement.
16916
16917
 
16917
- A session launched in YOLO moves to Manual; normal key navigation never
16918
- enters unrestricted mode.
16918
+ YOLO is included by default (`startup.yolo_switcher` / env). Auto is
16919
+ skipped when a sandbox makes classifier-backed Auto ineligible. The
16920
+ first Shift+Tab into YOLO prompts for the same install-local
16921
+ acknowledgement used by `--yolo` before unrestricted mode becomes active.
16919
16922
  """
16920
16923
  from deepagents_code.tui.modals.plugin_manager import PluginManagerScreen
16921
16924
  from deepagents_code.tui.widgets.agent_selector import AgentSelectorScreen
@@ -16969,17 +16972,47 @@ class DeepAgentsApp(App):
16969
16972
  if self._pending_ask_user_widget is not None:
16970
16973
  self._pending_ask_user_widget.action_previous_question()
16971
16974
  return
16972
- from deepagents_code.approval_mode import ApprovalMode
16975
+ from deepagents_code.approval_mode import (
16976
+ ApprovalMode,
16977
+ has_yolo_acknowledgement,
16978
+ next_approval_mode,
16979
+ )
16980
+ from deepagents_code.config import is_yolo_switcher_enabled
16973
16981
 
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
16982
+ yolo_switcher_enabled = is_yolo_switcher_enabled()
16983
+ target = next_approval_mode(
16984
+ self._approval_mode,
16985
+ auto_eligible=self._auto_mode_eligible,
16986
+ yolo_switcher_enabled=yolo_switcher_enabled,
16987
+ )
16988
+ if target is None:
16989
+ # `next_approval_mode` returns None only from Manual when neither
16990
+ # Auto (sandbox-ineligible) nor the YOLO switcher entry is available,
16991
+ # so this is the only reachable case.
16992
+ self._warn_live_approval_mode_unavailable(
16993
+ "Auto is unavailable with a sandbox, and YOLO is disabled "
16994
+ "in the approval switcher."
16995
+ )
16996
+ return
16997
+
16998
+ # Gate the first YOLO switcher entry on the same policy acknowledgement
16999
+ # as `--yolo`. Do not activate YOLO until the user continues.
17000
+ if target is ApprovalMode.YOLO and not has_yolo_acknowledgement():
17001
+ self._prompt_yolo_switcher_acknowledgement()
17002
+ return
17003
+
17004
+ await self._set_approval_mode(target)
17005
+
17006
+ async def _set_approval_mode(self, target: ApprovalMode) -> bool:
17007
+ """Apply an approval-mode change after optional live Store acknowledgement.
17008
+
17009
+ Args:
17010
+ target: Mode to select.
17011
+
17012
+ Returns:
17013
+ `True` when local UI state was updated to `target`.
17014
+ """
17015
+ from deepagents_code.approval_mode import ApprovalMode
16983
17016
 
16984
17017
  # With no usable agent/session pair there is no running graph to update.
16985
17018
  # Stage the selection locally; `execute_task_textual` persists it before
@@ -16993,7 +17026,12 @@ class DeepAgentsApp(App):
16993
17026
  self._warn_live_approval_mode_unavailable(
16994
17027
  "Auto could not be persisted; remaining in Manual."
16995
17028
  )
16996
- return
17029
+ return False
17030
+ if target is ApprovalMode.YOLO:
17031
+ self._warn_live_approval_mode_unavailable(
17032
+ "YOLO could not be persisted; remaining in the previous mode."
17033
+ )
17034
+ return False
16997
17035
  self._approval_mode_blocked = True
16998
17036
  self._warn_live_approval_mode_unavailable(
16999
17037
  "Manual could not be persisted; active work was cancelled and "
@@ -17001,7 +17039,7 @@ class DeepAgentsApp(App):
17001
17039
  )
17002
17040
  if self._agent_running:
17003
17041
  self._force_interrupt_active_work()
17004
- return
17042
+ return False
17005
17043
 
17006
17044
  self._approval_mode_blocked = False
17007
17045
  self._approval_mode = target
@@ -17014,6 +17052,73 @@ class DeepAgentsApp(App):
17014
17052
  self._notify_auto_mode_enabled_once()
17015
17053
  if should_persist_live:
17016
17054
  await self._auto_accept_pending_goal_rubric()
17055
+ elif target is ApprovalMode.YOLO:
17056
+ # Warn before the await below. State is already committed above, so
17057
+ # if goal-rubric auto-accept raises, YOLO is active and the "no
17058
+ # review" warning must have fired first. AUTO notifies before its
17059
+ # await for the same reason.
17060
+ self.notify(
17061
+ "YOLO is active: gated actions run without review.",
17062
+ severity="warning",
17063
+ timeout=8,
17064
+ markup=False,
17065
+ )
17066
+ if should_persist_live:
17067
+ await self._auto_accept_pending_goal_rubric()
17068
+ return True
17069
+
17070
+ def _prompt_yolo_switcher_acknowledgement(self) -> None:
17071
+ """Show the first-run YOLO acknowledgement before entering unrestricted mode.
17072
+
17073
+ YOLO stays inactive until Enter persists the acknowledgement and the
17074
+ follow-up mode write succeeds. Esc (or a non-true dismiss) leaves the
17075
+ current mode untouched and does not store the acknowledgement.
17076
+ """
17077
+ from deepagents_code.approval_mode import (
17078
+ ApprovalMode,
17079
+ save_yolo_acknowledgement,
17080
+ )
17081
+ from deepagents_code.tui.widgets.yolo_mode_notice import YoloModeNoticeScreen
17082
+
17083
+ if getattr(self, "_yolo_mode_notice_pending", False):
17084
+ return
17085
+
17086
+ def handle_result(accepted: bool | None) -> None:
17087
+ self._yolo_mode_notice_pending = False
17088
+ if accepted is not True:
17089
+ self.notify(
17090
+ "Stayed in the current approval mode.",
17091
+ severity="information",
17092
+ markup=False,
17093
+ )
17094
+ return
17095
+ if not save_yolo_acknowledgement():
17096
+ self._warn_live_approval_mode_unavailable(
17097
+ "YOLO acknowledgement could not be saved; staying in the "
17098
+ "current mode."
17099
+ )
17100
+ return
17101
+ task = asyncio.create_task(self._set_approval_mode(ApprovalMode.YOLO))
17102
+ task.add_done_callback(_log_task_exception)
17103
+
17104
+ try:
17105
+ self.push_screen(YoloModeNoticeScreen(), handle_result)
17106
+ except Exception:
17107
+ # This modal *is* the YOLO gate (unlike Auto's post-hoc notice), so
17108
+ # a failed push leaves the mode unchanged. Surface it, or Shift+Tab
17109
+ # looks dead. Leaving `_yolo_mode_notice_pending` unset (it is set
17110
+ # only below, after a successful push) lets a later Shift+Tab retry.
17111
+ logger.warning(
17112
+ "Could not show YOLO switcher acknowledgement", exc_info=True
17113
+ )
17114
+ self._warn_live_approval_mode_unavailable(
17115
+ "Could not open the YOLO confirmation; approval mode unchanged."
17116
+ )
17117
+ return
17118
+
17119
+ # Mark pending only after the push succeeds so a failed push cannot
17120
+ # suppress a later try for the whole session.
17121
+ self._yolo_mode_notice_pending = True
17017
17122
 
17018
17123
  def action_toggle_tool_output(self) -> None:
17019
17124
  """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
 
@@ -3255,6 +3255,27 @@ def is_memory_auto_save_enabled() -> bool:
3255
3255
  return bool(value)
3256
3256
 
3257
3257
 
3258
+ def is_yolo_switcher_enabled() -> bool:
3259
+ """Return whether Shift+Tab may enter unrestricted YOLO mode.
3260
+
3261
+ Resolves the `startup.yolo_switcher` option from env/`config.toml`,
3262
+ defaulting to enabled. When disabled, the interactive cycle stays Manual /
3263
+ Auto only (or Manual alone when Auto is ineligible). Sessions already in
3264
+ YOLO (for example via `--yolo`) can still leave it with Shift+Tab.
3265
+ """
3266
+ from deepagents_code.config_manifest import (
3267
+ get_option,
3268
+ load_config_toml,
3269
+ resolve_scalar,
3270
+ )
3271
+
3272
+ option = get_option("startup.yolo_switcher")
3273
+ if option is None:
3274
+ return True
3275
+ value, _ = resolve_scalar(option, toml_data=load_config_toml())
3276
+ return bool(value)
3277
+
3278
+
3258
3279
  def is_openai_prompt_cache_key_enabled() -> bool:
3259
3280
  """Return whether OpenAI model calls should carry a per-thread cache key.
3260
3281
 
@@ -1464,6 +1464,19 @@ _STATIC_OPTIONS: tuple[ConfigOption, ...] = (
1464
1464
  toml_keys=("startup", "mode"),
1465
1465
  cli_flag="--auto-approve",
1466
1466
  ),
1467
+ ConfigOption(
1468
+ key="startup.yolo_switcher",
1469
+ group="Startup",
1470
+ summary=(
1471
+ "Include YOLO in the Shift+Tab approval-mode cycle "
1472
+ "(Manual → Auto → YOLO); disable to keep the cycle Manual/Auto only."
1473
+ ),
1474
+ kind=OptionKind.BOOL,
1475
+ default=True,
1476
+ env_var=_env_vars.YOLO_SWITCHER,
1477
+ empty_env_is_false=True,
1478
+ toml_keys=("startup", "yolo_switcher"),
1479
+ ),
1467
1480
  # --- Debug / Development -------------------------------------------
1468
1481
  ConfigOption(
1469
1482
  key="debug.enabled",
@@ -10,6 +10,12 @@ from textual.widgets import Static
10
10
 
11
11
  from deepagents_code._env_vars import HIDE_SPLASH_TIPS, is_env_truthy
12
12
 
13
+ _TIP_SHIFT_TAB_WITH_YOLO = "Press Shift+Tab to cycle Manual, Auto, and YOLO modes"
14
+ """Tip used when `startup.yolo_switcher` keeps YOLO in the approval cycle."""
15
+
16
+ _TIP_SHIFT_TAB_WITHOUT_YOLO = "Press Shift+Tab to toggle Manual and Auto modes"
17
+ """Tip used when orgs/users disable YOLO entry via the approval switcher."""
18
+
13
19
  _TIPS: dict[str, int] = {
14
20
  "Use @ to reference files and / for commands": 3,
15
21
  "Try /threads to resume a previous conversation": 2,
@@ -27,12 +33,16 @@ _TIPS: dict[str, int] = {
27
33
  "Ask for a workflow to fan work out to subagents in parallel": 3,
28
34
  "Use /timestamps to show or hide message timestamp footers": 1,
29
35
  "Use /agents to browse and switch between your available agents": 2,
30
- "Press Shift+Tab to toggle Manual and Auto modes": 2,
36
+ _TIP_SHIFT_TAB_WITH_YOLO: 2,
31
37
  "Use !! for incognito shell commands that stay out of model context": 1,
32
38
  "Deep Agents can explain its own features and look up its docs. Ask it how to use.": 3, # noqa: E501
33
39
  }
34
40
  """Tips shown above the chat input. One is chosen at random per launch,
35
- weighted by these relative selection weights."""
41
+ weighted by these relative selection weights.
42
+
43
+ The Shift+Tab tip is varied at pick time via `_active_tips` so disabled-YOLO
44
+ installs do not advertise a switcher path that policy has removed.
45
+ """
36
46
 
37
47
  # Fail fast at import if the registry is ever emptied or given a non-positive
38
48
  # weight: `random.choices` would otherwise raise a cryptic error at widget
@@ -46,15 +56,45 @@ if any(weight <= 0 for weight in _TIPS.values()):
46
56
  raise ValueError(msg)
47
57
 
48
58
 
49
- def _pick_tip() -> str:
59
+ def _active_tips(*, yolo_switcher_enabled: bool | None = None) -> dict[str, int]:
60
+ """Return the weighted tip registry for the current switcher policy.
61
+
62
+ Args:
63
+ yolo_switcher_enabled: Override for whether YOLO appears in the
64
+ Shift+Tab cycle. When omitted, resolves `startup.yolo_switcher`.
65
+
66
+ Returns:
67
+ Weighted tip map appropriate for the active YOLO switcher setting.
68
+ """
69
+ if yolo_switcher_enabled is None:
70
+ from deepagents_code.config import is_yolo_switcher_enabled
71
+
72
+ yolo_switcher_enabled = is_yolo_switcher_enabled()
73
+
74
+ tips = dict(_TIPS)
75
+ if yolo_switcher_enabled:
76
+ return tips
77
+
78
+ # Replace the YOLO cycle tip with the Manual/Auto-only wording so the
79
+ # splash never claims Shift+Tab can enter unrestricted mode when policy
80
+ # has removed that entry from the switcher.
81
+ weight = tips.pop(_TIP_SHIFT_TAB_WITH_YOLO, None)
82
+ if weight is not None:
83
+ tips[_TIP_SHIFT_TAB_WITHOUT_YOLO] = weight
84
+ return tips
85
+
86
+
87
+ def _pick_tip(*, yolo_switcher_enabled: bool | None = None) -> str:
50
88
  """Pick one startup tip using the configured relative weights.
51
89
 
90
+ Args:
91
+ yolo_switcher_enabled: Optional override forwarded to `_active_tips`.
92
+
52
93
  Returns:
53
- Tip text selected from `_TIPS`.
94
+ Tip text selected from the active tip registry.
54
95
  """
55
- tips = list(_TIPS.keys())
56
- weights = list(_TIPS.values())
57
- return random.choices(tips, weights=weights, k=1)[0] # noqa: S311
96
+ tips = _active_tips(yolo_switcher_enabled=yolo_switcher_enabled)
97
+ return random.choices(list(tips.keys()), weights=list(tips.values()), k=1)[0] # noqa: S311
58
98
 
59
99
 
60
100
  def show_startup_tip() -> bool:
@@ -117,7 +117,7 @@ def _debug_tag_style(*, ansi: bool, colors: theme.ThemeColors) -> str | TStyle:
117
117
 
118
118
 
119
119
  def _experimental_tag_style(*, ansi: bool, colors: theme.ThemeColors) -> str | TStyle:
120
- """Build the style for the `(experimental mode)` tag.
120
+ """Build the style for the `(experimental)` tag.
121
121
 
122
122
  Args:
123
123
  ansi: Whether the active theme is an ANSI terminal theme.
@@ -162,7 +162,7 @@ class WelcomeBanner(Static):
162
162
 
163
163
  Renders a bordered box with the product title and optional version. A
164
164
  `(debug enabled)` tag appears when `DEEPAGENTS_CODE_DEBUG` is enabled
165
- (truthy), and an `(experimental mode)` tag appears when
165
+ (truthy), and an `(experimental)` tag appears when
166
166
  `DEEPAGENTS_CODE_EXPERIMENTAL` is enabled (truthy), both even when the
167
167
  version is hidden. A `(local)` tag appears for
168
168
  editable installs only when the version is shown. Rows follow that appear
@@ -372,7 +372,7 @@ class WelcomeBanner(Static):
372
372
 
373
373
  Returns:
374
374
  Content with the title, optional version, and any applicable header
375
- tags (`(debug enabled)` when debug is on; `(experimental mode)` when
375
+ tags (`(debug enabled)` when debug is on; `(experimental)` when
376
376
  experimental mode is on; `(local)` for editable
377
377
  installs when the version is shown), followed by any applicable rows
378
378
  in order: model (when `SPLASH_SHOW_MODEL`), directory (when
@@ -406,7 +406,7 @@ class WelcomeBanner(Static):
406
406
  if self._experimental_enabled:
407
407
  parts.append(
408
408
  (
409
- " (experimental mode)",
409
+ " (experimental)",
410
410
  _experimental_tag_style(ansi=ansi, colors=colors),
411
411
  )
412
412
  )
@@ -0,0 +1,161 @@
1
+ """First-enable confirmation modal before Shift+Tab enters YOLO.
2
+
3
+ Shown when the user cycles into unrestricted YOLO without a persisted
4
+ acknowledgement. Enter acknowledges YOLO and records the policy version; Esc
5
+ keeps the previous approval mode and leaves the acknowledgement unsaved.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from typing import TYPE_CHECKING, ClassVar
11
+
12
+ from textual.binding import Binding, BindingType
13
+ from textual.containers import Vertical
14
+ from textual.screen import ModalScreen
15
+ from textual.widgets import Markdown, Static
16
+
17
+ from deepagents_code.tui.widgets._links import open_checked_url_async
18
+
19
+ if TYPE_CHECKING:
20
+ from textual.app import ComposeResult
21
+
22
+ YOLO_MODE_DOCS_URL = (
23
+ "https://docs.langchain.com/oss/python/deepagents/code/approval-modes"
24
+ )
25
+ """Canonical docs page for Manual / Auto / YOLO behavior."""
26
+
27
+ YOLO_MODE_NOTICE_BODY = (
28
+ "You are about to enable **YOLO**. The agent will run **gated actions "
29
+ "without asking first** — shell commands, file edits, network calls, and "
30
+ "other tools on this machine.\n\n"
31
+ "This is **not Auto**. There is **no classifier review** and **no approval "
32
+ "prompt** while YOLO is active. Prefer Auto unless you intend full "
33
+ "unrestricted execution.\n\n"
34
+ "This notice appears **once** on this machine after you continue. You can "
35
+ "leave YOLO any time with **Shift+Tab**.\n\n"
36
+ f"[Learn more about approval modes]({YOLO_MODE_DOCS_URL})"
37
+ )
38
+ """Default Markdown body shown before the first YOLO switcher enable."""
39
+
40
+
41
+ class YoloModeNoticeScreen(ModalScreen[bool]):
42
+ """In-TUI acknowledgement shown before unrestricted YOLO becomes active.
43
+
44
+ Dismisses with `True` on Enter (acknowledge and enable) and `False` on Esc
45
+ (keep the previous mode). Programmatic dismiss may yield `None`; callers
46
+ treat that like cancel so YOLO is never left active without an explicit
47
+ acknowledge.
48
+ """
49
+
50
+ BINDINGS: ClassVar[list[BindingType]] = [
51
+ Binding("enter", "confirm", "Enable YOLO", show=False, priority=True),
52
+ Binding("escape", "cancel", "Keep previous", show=False, priority=True),
53
+ ]
54
+
55
+ CSS = """
56
+ YoloModeNoticeScreen {
57
+ align: center middle;
58
+ }
59
+
60
+ YoloModeNoticeScreen > Vertical {
61
+ width: 72;
62
+ max-width: 90%;
63
+ height: auto;
64
+ background: $surface;
65
+ border: solid $error;
66
+ padding: 1 2;
67
+ }
68
+
69
+ YoloModeNoticeScreen .yolo-mode-notice-title {
70
+ text-style: bold;
71
+ color: $error;
72
+ text-align: center;
73
+ margin-bottom: 1;
74
+ }
75
+
76
+ YoloModeNoticeScreen .yolo-mode-notice-body {
77
+ height: auto;
78
+ color: $text;
79
+ margin-bottom: 1;
80
+ padding: 0;
81
+ }
82
+
83
+ YoloModeNoticeScreen .yolo-mode-notice-body > * {
84
+ margin: 0 0 1 0;
85
+ }
86
+
87
+ YoloModeNoticeScreen .yolo-mode-notice-body > *:last-child {
88
+ margin-bottom: 0;
89
+ }
90
+
91
+ YoloModeNoticeScreen .yolo-mode-notice-help {
92
+ height: 1;
93
+ color: $text-muted;
94
+ text-style: italic;
95
+ text-align: center;
96
+ margin-top: 1;
97
+ }
98
+ """
99
+
100
+ # The screen must be the focus target for its own priority Enter binding to
101
+ # fire (see `on_mount`). Esc does not depend on focus: the app owns a global
102
+ # priority `escape` binding that routes to `action_cancel` for active modals.
103
+ can_focus = True
104
+
105
+ def __init__(self, body: str | None = None) -> None:
106
+ """Initialize the notice.
107
+
108
+ Args:
109
+ body: Optional Markdown body under the title. Defaults to
110
+ `YOLO_MODE_NOTICE_BODY`. Links open in a browser.
111
+ """
112
+ super().__init__()
113
+ self._body = YOLO_MODE_NOTICE_BODY if body is None else body
114
+
115
+ def on_mount(self) -> None:
116
+ """Take focus so priority bindings receive Enter/Esc."""
117
+ self.focus()
118
+
119
+ def compose(self) -> ComposeResult:
120
+ """Compose the YOLO acknowledgement notice.
121
+
122
+ Yields:
123
+ Title, body, and help-row widgets parented inside a `Vertical`.
124
+ """
125
+ with Vertical():
126
+ yield Static(
127
+ "YOLO mode",
128
+ classes="yolo-mode-notice-title",
129
+ markup=False,
130
+ )
131
+ # open_links=False so we own the click path (toast feedback + shared
132
+ # URL safety). Assistant message widgets use the same pattern.
133
+ yield Markdown(
134
+ self._body,
135
+ classes="yolo-mode-notice-body",
136
+ open_links=False,
137
+ )
138
+ yield Static(
139
+ "Enter to acknowledge and enable YOLO · Esc to keep current mode",
140
+ classes="yolo-mode-notice-help",
141
+ markup=False,
142
+ )
143
+
144
+ async def on_markdown_link_clicked(self, event: Markdown.LinkClicked) -> None:
145
+ """Open docs (or any body link) with the shared URL helper."""
146
+ event.stop()
147
+ await open_checked_url_async(event.href, app=self.app, notify_on_success=True)
148
+
149
+ def action_confirm(self) -> None:
150
+ """Acknowledge YOLO and mark the notice dismissed without re-showing."""
151
+ self.dismiss(True)
152
+
153
+ def action_cancel(self) -> None:
154
+ """Keep the previous approval mode without persisting acknowledgement.
155
+
156
+ The method name must stay `cancel`: the app owns a priority `escape`
157
+ binding that, for an active `ModalScreen`, dispatches to
158
+ `action_cancel` if present and otherwise falls through to
159
+ `dismiss(None)`. Renaming this would silently regress Esc handling.
160
+ """
161
+ self.dismiss(False)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "deepagents-code"
7
- version = "0.1.46"
7
+ version = "0.1.47"
8
8
  description = "Terminal coding agent built on the Deep Agents SDK - works with any model, with persistent memory, customizable skills, subagents, and approval controls."
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -833,6 +833,12 @@ esac
833
833
  # tell whether an existing install is out of date before upgrading it.
834
834
  PYPI_JSON_URL="https://pypi.org/pypi/deepagents-code/json"
835
835
 
836
+ # Base URL for a version-specific GitHub release, surfaced before the update
837
+ # prompt so users can review what changed before agreeing to upgrade. Release
838
+ # tags are `deepagents-code==X.Y.Z`; the `==` must be percent-encoded (%3D%3D)
839
+ # for the tag URL to resolve.
840
+ RELEASE_TAG_URL_BASE="https://github.com/langchain-ai/deepagents/releases/tag/deepagents-code%3D%3D"
841
+
836
842
  # Validate and normalize extras: accept bare CSV, wrap in brackets for pip
837
843
  if [[ -n "$EXTRAS" ]]; then
838
844
  # Strip brackets if the user passed them anyway
@@ -1257,6 +1263,7 @@ elif [ -n "$PRE_VERSION" ] && [ -z "$VERSION" ] && [ -z "$PRERELEASE_REQUESTED"
1257
1263
  elif [ "$ASSUME_YES" = "1" ]; then
1258
1264
  log_info "Updating deepagents-code ${PRE_VERSION} → ${LATEST_VERSION}..."
1259
1265
  elif can_prompt; then
1266
+ log_info "What's new: ${RELEASE_TAG_URL_BASE}${LATEST_VERSION}"
1260
1267
  if prompt_yn "Update deepagents-code ${PRE_VERSION} → ${LATEST_VERSION}?"; then
1261
1268
  log_info "Updating deepagents-code ${PRE_VERSION} → ${LATEST_VERSION}..."
1262
1269
  else