deepagents-code 0.1.48__tar.gz → 0.1.49__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/AGENTS.md +1 -1
  2. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/CHANGELOG.md +15 -0
  3. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/COMMANDS.md +4 -1
  4. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/PKG-INFO +10 -10
  5. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_build_info.py +1 -1
  6. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_version.py +1 -1
  7. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/app.py +176 -18
  8. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/auto_mode.py +5 -4
  9. deepagents_code-0.1.49/deepagents_code/client/commands/extras.py +304 -0
  10. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/command_registry.py +18 -0
  11. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/integrations/sandbox_factory.py +1 -1
  12. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/integrations/sandbox_provider.py +2 -2
  13. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/main.py +54 -226
  14. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/model_config.py +79 -0
  15. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/server_graph.py +49 -8
  16. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/message_store.py +23 -1
  17. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/messages.py +360 -34
  18. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/startup_tip.py +2 -0
  19. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/yolo_mode_notice.py +39 -18
  20. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/ui.py +53 -7
  21. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/pyproject.toml +7 -7
  22. deepagents_code-0.1.49/tests/unit_tests/client/commands/test_extras.py +168 -0
  23. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_agent_friendly.py +8 -0
  24. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_app.py +342 -0
  25. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_auto_mode.py +4 -4
  26. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_extras_info.py +1 -1
  27. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_install_command.py +58 -0
  28. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_model_config.py +95 -0
  29. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_model_switch.py +177 -72
  30. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_sandbox_factory.py +1 -1
  31. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_sandbox_provider.py +2 -2
  32. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_sandbox_registry.py +1 -1
  33. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_server_graph.py +41 -6
  34. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_message_store.py +31 -0
  35. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_messages.py +298 -6
  36. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/uv.lock +18 -18
  37. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/.gitignore +0 -0
  38. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/ARCHITECTURE.md +0 -0
  39. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/DEVELOPMENT.md +0 -0
  40. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/Makefile +0 -0
  41. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/README.md +0 -0
  42. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/THREAT_MODEL.md +0 -0
  43. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/__init__.py +0 -0
  44. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/__main__.py +0 -0
  45. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_ask_user_types.py +0 -0
  46. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_cli_context.py +0 -0
  47. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_constants.py +0 -0
  48. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_debug.py +0 -0
  49. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_debug_buffer.py +0 -0
  50. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_env_vars.py +0 -0
  51. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_fake_models.py +0 -0
  52. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_git.py +0 -0
  53. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_glm_5p2_profile.py +0 -0
  54. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_paths.py +0 -0
  55. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_repository_bounds.py +0 -0
  56. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_server_config.py +0 -0
  57. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_session_stats.py +0 -0
  58. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_startup_error.py +0 -0
  59. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_testing_models.py +0 -0
  60. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_textual_patches.py +0 -0
  61. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/_tool_stream.py +0 -0
  62. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/agent.py +0 -0
  63. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/app.tcss +0 -0
  64. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/approval_mode.py +0 -0
  65. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/ask_user.py +0 -0
  66. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/auth_display.py +0 -0
  67. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/auth_store.py +0 -0
  68. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/__init__.py +0 -0
  69. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
  70. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
  71. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  72. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  73. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  74. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  75. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/__init__.py +0 -0
  76. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/commands/__init__.py +0 -0
  77. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/commands/auth.py +0 -0
  78. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/commands/config.py +0 -0
  79. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/commands/mcp.py +0 -0
  80. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/commands/tools.py +0 -0
  81. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/launch/__init__.py +0 -0
  82. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/launch/server.py +0 -0
  83. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/launch/server_manager.py +0 -0
  84. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/non_interactive.py +0 -0
  85. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/client/remote_client.py +0 -0
  86. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/clipboard.py +0 -0
  87. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/config.py +0 -0
  88. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/config_manifest.py +0 -0
  89. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/configurable_model.py +0 -0
  90. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/default_agent_prompt.md +0 -0
  91. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/doctor.py +0 -0
  92. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/editor.py +0 -0
  93. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/event_bus.py +0 -0
  94. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/extras_info.py +0 -0
  95. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/file_ops.py +0 -0
  96. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/formatting.py +0 -0
  97. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/goal_rubric.py +0 -0
  98. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/goal_state_notice.py +0 -0
  99. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/goal_tools.py +0 -0
  100. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/__init__.py +0 -0
  101. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/capabilities.py +0 -0
  102. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/engine.py +0 -0
  103. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/env.py +0 -0
  104. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/legacy.py +0 -0
  105. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/loading.py +0 -0
  106. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/migration.py +0 -0
  107. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/models/__init__.py +0 -0
  108. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/models/adapters.py +0 -0
  109. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/models/config.py +0 -0
  110. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/models/domain.py +0 -0
  111. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/models/transport.py +0 -0
  112. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/models/wire.py +0 -0
  113. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/projection.py +0 -0
  114. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/reducer.py +0 -0
  115. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/runner.py +0 -0
  116. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/runtime.py +0 -0
  117. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/snapshot.py +0 -0
  118. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/tools.py +0 -0
  119. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/transcript.py +0 -0
  120. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
  121. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/input.py +0 -0
  122. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/integrations/__init__.py +0 -0
  123. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/integrations/openai_codex.py +0 -0
  124. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/integrations/sandbox_config.py +0 -0
  125. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/integrations/sandbox_registry.py +0 -0
  126. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/iterm_cursor_guide.py +0 -0
  127. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/json_types.py +0 -0
  128. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/local_context.py +0 -0
  129. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/managed_tools.py +0 -0
  130. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_auth.py +0 -0
  131. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_config.py +0 -0
  132. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_disabled.py +0 -0
  133. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_login_service.py +0 -0
  134. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_oauth_ui.py +0 -0
  135. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_providers/__init__.py +0 -0
  136. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_providers/_registry.py +0 -0
  137. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_providers/base.py +0 -0
  138. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_providers/github.py +0 -0
  139. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_providers/slack.py +0 -0
  140. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/mcp_tools.py +0 -0
  141. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/media_utils.py +0 -0
  142. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/memory_guard.py +0 -0
  143. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/notifications.py +0 -0
  144. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/offload.py +0 -0
  145. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/offload_middleware.py +0 -0
  146. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/onboarding.py +0 -0
  147. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/output.py +0 -0
  148. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/paste_collapse.py +0 -0
  149. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/__init__.py +0 -0
  150. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/_json.py +0 -0
  151. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/adapters/__init__.py +0 -0
  152. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/adapters/mcp.py +0 -0
  153. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/adapters/skills.py +0 -0
  154. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
  155. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/commands_cli.py +0 -0
  156. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/discovery.py +0 -0
  157. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/manifest.py +0 -0
  158. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/marketplace.py +0 -0
  159. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/models.py +0 -0
  160. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/store.py +0 -0
  161. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/plugins/substitution.py +0 -0
  162. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/project_utils.py +0 -0
  163. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/py.typed +0 -0
  164. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/reasoning_effort.py +0 -0
  165. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/reliable_rubric.py +0 -0
  166. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/resume_state.py +0 -0
  167. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/sessions.py +0 -0
  168. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/skills/__init__.py +0 -0
  169. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/skills/commands.py +0 -0
  170. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/skills/invocation.py +0 -0
  171. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/skills/load.py +0 -0
  172. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/skills/merge.py +0 -0
  173. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/skills/trust.py +0 -0
  174. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/state_migration.py +0 -0
  175. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/subagents.py +0 -0
  176. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/system_prompt.md +0 -0
  177. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/terminal_capabilities.py +0 -0
  178. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/terminal_escape.py +0 -0
  179. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/theme.py +0 -0
  180. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/todo_list_prompt.md +0 -0
  181. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tool_catalog.py +0 -0
  182. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tool_display.py +0 -0
  183. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tools.py +0 -0
  184. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/__init__.py +0 -0
  185. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/modals/__init__.py +0 -0
  186. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
  187. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
  188. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
  189. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
  190. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
  191. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
  192. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/screens/__init__.py +0 -0
  193. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/textual_adapter.py +0 -0
  194. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/__init__.py +0 -0
  195. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
  196. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  197. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/_links.py +0 -0
  198. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
  199. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/agent_selector.py +0 -0
  200. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/approval.py +0 -0
  201. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/ask_user.py +0 -0
  202. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/auth.py +0 -0
  203. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
  204. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/autocomplete.py +0 -0
  205. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/chat_input.py +0 -0
  206. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  207. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  208. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/debug_console.py +0 -0
  209. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/diff.py +0 -0
  210. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  211. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/goal_review.py +0 -0
  212. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/goal_status.py +0 -0
  213. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/history.py +0 -0
  214. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  215. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/launch_init.py +0 -0
  216. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/loading.py +0 -0
  217. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  218. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  219. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
  220. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/model_selector.py +0 -0
  221. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/notification_center.py +0 -0
  222. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  223. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  224. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/plugin_reload.py +0 -0
  225. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
  226. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  227. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/status.py +0 -0
  228. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  229. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  230. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/thread_selector.py +0 -0
  231. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  232. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  233. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/update_available.py +0 -0
  234. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  235. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/update_progress.py +0 -0
  236. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/tui/widgets/welcome.py +0 -0
  237. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/unicode_security.py +0 -0
  238. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/deepagents_code/update_check.py +0 -0
  239. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/examples/skills/arxiv-search/SKILL.md +0 -0
  240. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  241. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/examples/skills/langgraph-docs/SKILL.md +0 -0
  242. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/examples/skills/skill-creator/SKILL.md +0 -0
  243. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  244. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  245. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/examples/skills/web-research/SKILL.md +0 -0
  246. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/hatch_build.py +0 -0
  247. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/images/tui.png +0 -0
  248. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/scripts/check_imports.py +0 -0
  249. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/scripts/debug_server.sh +0 -0
  250. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/scripts/generate_commands_catalog.py +0 -0
  251. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/scripts/install.sh +0 -0
  252. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/README.md +0 -0
  253. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/__init__.py +0 -0
  254. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/benchmarks/__init__.py +0 -0
  255. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  256. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
  257. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  258. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/conftest.py +0 -0
  259. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/test_acp_mode.py +0 -0
  260. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  261. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/test_compact_resume.py +0 -0
  262. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
  263. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/test_offload_server_side.py +0 -0
  264. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/test_sandbox_factory.py +0 -0
  265. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/integration_tests/test_sandbox_operations.py +0 -0
  266. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/__init__.py +0 -0
  267. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/client/__init__.py +0 -0
  268. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/client/commands/__init__.py +0 -0
  269. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/client/commands/test_auth.py +0 -0
  270. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/client/commands/test_mcp.py +0 -0
  271. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/client/commands/test_tools.py +0 -0
  272. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/conftest.py +0 -0
  273. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  274. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/hooks/__init__.py +0 -0
  275. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/hooks/models/__init__.py +0 -0
  276. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/hooks/models/test_models.py +0 -0
  277. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/hooks/test_configuration.py +0 -0
  278. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/hooks/test_engine.py +0 -0
  279. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/hooks/test_execution.py +0 -0
  280. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/hooks/test_transcript.py +0 -0
  281. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/plugins/__init__.py +0 -0
  282. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/plugins/test_marketplace.py +0 -0
  283. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
  284. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/plugins/test_store.py +0 -0
  285. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/skills/__init__.py +0 -0
  286. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_commands.py +0 -0
  287. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_load.py +0 -0
  288. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_merge.py +0 -0
  289. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  290. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_skills_json.py +0 -0
  291. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
  292. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  293. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  294. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
  295. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
  296. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test__tool_stream.py +0 -0
  297. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_agent.py +0 -0
  298. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_approval_mode.py +0 -0
  299. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_args.py +0 -0
  300. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  301. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_auth_display.py +0 -0
  302. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_auth_store.py +0 -0
  303. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  304. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_charset.py +0 -0
  305. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_clipboard.py +0 -0
  306. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  307. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_command_registry.py +0 -0
  308. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_compact_tool.py +0 -0
  309. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_config.py +0 -0
  310. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_config_manifest.py +0 -0
  311. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_config_recursion_limit.py +0 -0
  312. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_configurable_model.py +0 -0
  313. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_cursor_blink.py +0 -0
  314. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_cursor_style.py +0 -0
  315. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_debug.py +0 -0
  316. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_debug_buffer.py +0 -0
  317. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_debug_console.py +0 -0
  318. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_doctor.py +0 -0
  319. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_editor.py +0 -0
  320. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_end_to_end.py +0 -0
  321. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_env_vars.py +0 -0
  322. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_event_bus.py +0 -0
  323. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_exception_handling.py +0 -0
  324. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_file_ops.py +0 -0
  325. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_formatting.py +0 -0
  326. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_git.py +0 -0
  327. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
  328. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_goal_criteria_client.py +0 -0
  329. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_goal_rubric.py +0 -0
  330. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_goal_state_notice.py +0 -0
  331. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_goal_state_persistence.py +0 -0
  332. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_goal_tools.py +0 -0
  333. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_hatch_build.py +0 -0
  334. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_hooks.py +0 -0
  335. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_imports.py +0 -0
  336. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_input_parsing.py +0 -0
  337. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_install_script.py +0 -0
  338. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  339. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_json_types.py +0 -0
  340. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_local_context.py +0 -0
  341. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_main.py +0 -0
  342. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_main_acp_mode.py +0 -0
  343. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_main_args.py +0 -0
  344. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_managed_tools.py +0 -0
  345. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_auth.py +0 -0
  346. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_config.py +0 -0
  347. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_disabled.py +0 -0
  348. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_login_service.py +0 -0
  349. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  350. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_mcp_tools.py +0 -0
  351. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_media_utils.py +0 -0
  352. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_memory_guard.py +0 -0
  353. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_non_interactive.py +0 -0
  354. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_notifications.py +0 -0
  355. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_offload.py +0 -0
  356. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_onboarding.py +0 -0
  357. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  358. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_output.py +0 -0
  359. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_paths.py +0 -0
  360. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_reasoning_effort.py +0 -0
  361. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_reliable_rubric.py +0 -0
  362. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_reload.py +0 -0
  363. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_remote_client.py +0 -0
  364. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_repository_bounds.py +0 -0
  365. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_resume_state.py +0 -0
  366. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_rubric_cli.py +0 -0
  367. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_sandbox_config.py +0 -0
  368. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_server.py +0 -0
  369. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_server_config.py +0 -0
  370. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_server_helpers.py +0 -0
  371. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_server_manager.py +0 -0
  372. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_session_stats.py +0 -0
  373. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_sessions.py +0 -0
  374. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_shell_allow_list.py +0 -0
  375. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_skill_invocation.py +0 -0
  376. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_startup_blocking.py +0 -0
  377. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  378. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_state_migration.py +0 -0
  379. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_subagents.py +0 -0
  380. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  381. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_terminal_escape.py +0 -0
  382. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  383. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_textual_patches.py +0 -0
  384. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_theme.py +0 -0
  385. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_threads_resume.py +0 -0
  386. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_tool_catalog.py +0 -0
  387. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_tool_display.py +0 -0
  388. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_tracing_replicas.py +0 -0
  389. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  390. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_ui.py +0 -0
  391. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_unicode_security.py +0 -0
  392. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_update_check.py +0 -0
  393. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/test_version.py +0 -0
  394. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tools/__init__.py +0 -0
  395. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tools/test_current_thread.py +0 -0
  396. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  397. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
  398. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/__init__.py +0 -0
  399. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/modals/__init__.py +0 -0
  400. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
  401. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
  402. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  403. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
  404. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  405. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  406. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  407. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
  408. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
  409. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
  410. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
  411. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  412. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  413. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
  414. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  415. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
  416. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  417. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  418. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  419. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  420. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  421. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  422. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
  423. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
  424. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  425. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  426. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
  427. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_plugin_reload.py +0 -0
  428. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  429. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  430. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
  431. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_status.py +0 -0
  432. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  433. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
  434. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  435. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  436. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  437. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
  438. {deepagents_code-0.1.48 → deepagents_code-0.1.49}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
@@ -32,7 +32,7 @@ IMPORTANT: `Content` requires **Textual's** `Style` (`textual.style.Style`) for
32
32
 
33
33
  ### `App.notify()` defaults to `markup=True`
34
34
 
35
- Textual's `App.notify(message)` parses the message string as Rich markup by default. Any dynamic content (exception messages, file paths, user input, command strings) containing brackets `[]`, ANSI escape codes, or `=` will cause a `MarkupError` crash in Textual's Toast renderer. Always pass `markup=False` when the message contains f-string interpolated variables. Hardcoded string literals are safe with the default.
35
+ Textual's `App.notify(message)` parses the message string as Rich markup by default. Any dynamic content (exception messages, file paths, user input, command strings) containing square brackets is unsafe: tag-shaped text like `[bold]` is silently swallowed, and closing-tag-shaped text like `[/tmp/x]` raises a `MarkupError` crash in Textual's Toast renderer. Always pass `markup=False` when the message contains f-string interpolated variables. Hardcoded string literals are safe with the default.
36
36
 
37
37
  ### Rich `console.print()` and number highlighting
38
38
 
@@ -2,6 +2,21 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.49](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.48...deepagents-code==0.1.49) (2026-07-27)
6
+
7
+ ### Features
8
+
9
+ - Added recognition for LangSmith Gateway credentials. ([#5042](https://github.com/langchain-ai/deepagents/issues/5042))
10
+ - Added slash commands for mode changes and an option to escape to manual mode from the YOLO notice. ([#5092](https://github.com/langchain-ai/deepagents/issues/5092))
11
+ - Added an `install` subcommand. ([#5080](https://github.com/langchain-ai/deepagents/issues/5080))
12
+
13
+ ### Bug Fixes
14
+
15
+ - Kept the post-install restart modal responsive. ([#5086](https://github.com/langchain-ai/deepagents/issues/5086))
16
+ - Moved server graph bootstrap `cwd` calls off the event loop. ([#5081](https://github.com/langchain-ai/deepagents/issues/5081))
17
+ - Improved handling of long transcript user messages with toast notifications and expansion. ([#5073](https://github.com/langchain-ai/deepagents/issues/5073))
18
+ - Show model no-op notices as toasts instead of inline messages. ([#5074](https://github.com/langchain-ai/deepagents/issues/5074))
19
+
5
20
  ## [0.1.48](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.47...deepagents-code==0.1.48) (2026-07-27)
6
21
 
7
22
  ### Features
@@ -8,12 +8,13 @@ Regenerate this file with `make commands-catalog` after changing command names,
8
8
  aliases, descriptions, visibility, or hidden-command metadata.
9
9
 
10
10
 
11
- ## Public (34)
11
+ ## Public (37)
12
12
 
13
13
  | Command | Aliases | Description |
14
14
  | --- | --- | --- |
15
15
  | `/agents` | | Browse and switch between available agents |
16
16
  | `/auth` | `/connect` | Connect and manage provider and service credentials |
17
+ | `/auto` | | Switch to Auto approval mode |
17
18
  | `/auto-update` | | Turn automatic updates on or off |
18
19
  | `/changelog` | | Open the changelog in a browser |
19
20
  | `/clear` | | Clear the chat and start a new thread |
@@ -26,6 +27,7 @@ aliases, descriptions, visibility, or hidden-command metadata.
26
27
  | `/goal` | | Set and manage a persistent objective with acceptance criteria |
27
28
  | `/help` | | Show help and available commands |
28
29
  | `/install` | | Install an optional integration |
30
+ | `/manual` | | Switch to Manual approval mode |
29
31
  | `/mcp` | | Manage MCP servers and authentication |
30
32
  | `/model` | | Switch models or edit model settings |
31
33
  | `/notifications` | | Configure startup warnings |
@@ -46,6 +48,7 @@ aliases, descriptions, visibility, or hidden-command metadata.
46
48
  | `/trace` | | Open this thread in LangSmith |
47
49
  | `/update` | | Check for and install updates |
48
50
  | `/version` | `/about` | Show version information |
51
+ | `/yolo` | | Switch to YOLO approval mode (no review) |
49
52
 
50
53
  ## Hidden (2)
51
54
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents-code
3
- Version: 0.1.48
3
+ Version: 0.1.49
4
4
  Summary: Terminal coding agent built on the Deep Agents SDK - works with any model, with persistent memory, customizable skills, subagents, and approval controls.
5
5
  Project-URL: Homepage, https://docs.langchain.com/oss/python/deepagents/overview
6
6
  Project-URL: Documentation, https://reference.langchain.com/python/deepagents/
@@ -32,10 +32,10 @@ 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
34
  Requires-Dist: langchain-anthropic<2.0.0,>=1.5.2
35
- Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1
35
+ Requires-Dist: langchain-google-genai<5.0.0,>=4.3.2
36
36
  Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.0
37
37
  Requires-Dist: langchain-openai<2.0.0,>=1.4.1
38
- Requires-Dist: langchain-quickjs<0.4.0,>=0.3.3
38
+ Requires-Dist: langchain-quickjs<0.4.0,>=0.3.4
39
39
  Requires-Dist: langchain<2.0.0,>=1.3.14
40
40
  Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
41
41
  Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.31
@@ -46,7 +46,7 @@ Requires-Dist: markdownify<2.0.0,>=1.2.3
46
46
  Requires-Dist: mcp<2.0.0,>=1.28.1
47
47
  Requires-Dist: packaging>=26.2
48
48
  Requires-Dist: pillow<13.0.0,>=12.3.0
49
- Requires-Dist: prompt-toolkit<4.0.0,>=3.0.52
49
+ Requires-Dist: prompt-toolkit<4.0.0,>=3.0.53
50
50
  Requires-Dist: pydantic<2.14.0a0,>=2.12.5
51
51
  Requires-Dist: pyperclip<2.0.0,>=1.11.0
52
52
  Requires-Dist: python-dotenv<2.0.0,>=1.2.2
@@ -65,11 +65,11 @@ Provides-Extra: all-providers
65
65
  Requires-Dist: aiohttp<3.15.0,>=3.14.3; extra == 'all-providers'
66
66
  Requires-Dist: langchain-anthropic<2.0.0,>=1.5.2; extra == 'all-providers'
67
67
  Requires-Dist: langchain-aws<2.0.0,>=1.6.3; extra == 'all-providers'
68
- Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'all-providers'
68
+ Requires-Dist: langchain-baseten<1.0.0,>=0.2.3; extra == 'all-providers'
69
69
  Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
70
70
  Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'all-providers'
71
- Requires-Dist: langchain-fireworks<2.0.0,>=1.5.1; extra == 'all-providers'
72
- Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1; extra == 'all-providers'
71
+ Requires-Dist: langchain-fireworks<2.0.0,>=1.5.2; extra == 'all-providers'
72
+ Requires-Dist: langchain-google-genai<5.0.0,>=4.3.2; extra == 'all-providers'
73
73
  Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.4; extra == 'all-providers'
74
74
  Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'all-providers'
75
75
  Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'all-providers'
@@ -93,7 +93,7 @@ Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
93
93
  Provides-Extra: anthropic
94
94
  Requires-Dist: langchain-anthropic<2.0.0,>=1.5.2; extra == 'anthropic'
95
95
  Provides-Extra: baseten
96
- Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'baseten'
96
+ Requires-Dist: langchain-baseten<1.0.0,>=0.2.3; extra == 'baseten'
97
97
  Provides-Extra: bedrock
98
98
  Requires-Dist: langchain-aws<2.0.0,>=1.6.3; extra == 'bedrock'
99
99
  Provides-Extra: cohere
@@ -103,9 +103,9 @@ Requires-Dist: langchain-daytona>=0.0.7; extra == 'daytona'
103
103
  Provides-Extra: deepseek
104
104
  Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'deepseek'
105
105
  Provides-Extra: fireworks
106
- Requires-Dist: langchain-fireworks<2.0.0,>=1.5.1; extra == 'fireworks'
106
+ Requires-Dist: langchain-fireworks<2.0.0,>=1.5.2; extra == 'fireworks'
107
107
  Provides-Extra: google-genai
108
- Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1; extra == 'google-genai'
108
+ Requires-Dist: langchain-google-genai<5.0.0,>=4.3.2; extra == 'google-genai'
109
109
  Provides-Extra: groq
110
110
  Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'groq'
111
111
  Provides-Extra: huggingface
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "803b832"
3
+ BUILD_COMMIT = "44910bc"
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Keep the `x-release-please-version` annotation — release-please uses it to
4
4
  # bump `__version__` in sync with `pyproject.toml` on every release PR.
5
- __version__ = "0.1.48" # x-release-please-version
5
+ __version__ = "0.1.49" # x-release-please-version
6
6
 
7
7
  DOCS_URL = "https://docs.langchain.com/oss/python/deepagents/code"
8
8
  """URL for `deepagents-code` documentation."""
@@ -571,7 +571,13 @@ class _ConfigWriteResult:
571
571
  ScreenResultT = TypeVar("ScreenResultT")
572
572
 
573
573
  if TYPE_CHECKING:
574
- from collections.abc import AsyncIterator, Awaitable, Callable, Mapping
574
+ from collections.abc import (
575
+ AsyncIterator,
576
+ Awaitable,
577
+ Callable,
578
+ Coroutine,
579
+ Mapping,
580
+ )
575
581
 
576
582
  from deepagents.backends import CompositeBackend
577
583
  from langchain_core.messages import BaseMessage
@@ -3161,8 +3167,14 @@ class DeepAgentsApp(App):
3161
3167
  )
3162
3168
  """Per-turn model params override set via startup or `/model` params."""
3163
3169
 
3164
- self._last_model_unchanged_message: str | None = None
3165
- """Most recent same-model notice, used to suppress duplicates."""
3170
+ self._last_model_unchanged: tuple[str, float] | None = None
3171
+ """Most recent same-model toast, as `(text, monotonic timestamp)`.
3172
+
3173
+ Used to suppress duplicates. Suppression only lasts for the toast
3174
+ lifetime (`NOTIFICATION_TIMEOUT`); after expiry, a later identical
3175
+ no-op selection can toast again. Text and timestamp are one field so
3176
+ they cannot drift out of sync.
3177
+ """
3166
3178
 
3167
3179
  self._model_install_switching = False
3168
3180
  """True while a provider extra install-then-switch flow is active."""
@@ -6179,9 +6191,14 @@ class DeepAgentsApp(App):
6179
6191
  # restart. `_offer_restart_after_install` owns all follow-up messaging
6180
6192
  # (the prompt's button is the call to action when shown; it mounts a
6181
6193
  # `/restart`-or-relaunch hint itself when it can't show the prompt), so
6182
- # a redundant "Run /restart" line is never appended here.
6194
+ # a redundant "Run /restart" line is never appended here. The offer is
6195
+ # scheduled off the message pump so the modal stays responsive (see
6196
+ # `_schedule_restart_offer`); the interactive offer never affects this
6197
+ # method's return value, so detaching it does not change the contract.
6183
6198
  await self._mount_message(AppMessage(f"Installed extra '{extra}'."))
6184
- await self._offer_restart_after_install(extra)
6199
+ self._schedule_restart_offer(
6200
+ self._offer_restart_after_install(extra), context=f"extra:{extra}"
6201
+ )
6185
6202
  return True
6186
6203
 
6187
6204
  async def _handle_install_package(self, package: str, *, force: bool) -> None:
@@ -6272,7 +6289,11 @@ class DeepAgentsApp(App):
6272
6289
  "now, or relaunch dcode.",
6273
6290
  ),
6274
6291
  )
6275
- await self._offer_restart_after_install(package)
6292
+ # Scheduled off the message pump so the restart modal stays responsive
6293
+ # to Enter/Esc (see `_schedule_restart_offer`).
6294
+ self._schedule_restart_offer(
6295
+ self._offer_restart_after_install(package), context=f"package:{package}"
6296
+ )
6276
6297
 
6277
6298
  async def _confirm_install_package(self, package: str) -> bool:
6278
6299
  """Ask the user to confirm installing an arbitrary package.
@@ -12379,6 +12400,10 @@ class DeepAgentsApp(App):
12379
12400
  await self._handle_version_command()
12380
12401
  elif cmd == "/agents":
12381
12402
  await self._show_agent_selector()
12403
+ elif cmd in {"/manual", "/auto", "/yolo"}:
12404
+ from deepagents_code.approval_mode import ApprovalMode
12405
+
12406
+ await self._handle_approval_mode_command(ApprovalMode(cmd.lstrip("/")))
12382
12407
  elif cmd == "/goal" or cmd.startswith("/goal "):
12383
12408
  await self._handle_goal_command(command)
12384
12409
  elif cmd in {"/rubric", "/criteria"} or cmd.startswith(
@@ -13821,6 +13846,24 @@ class DeepAgentsApp(App):
13821
13846
  )
13822
13847
  await self._mount_message(user_message)
13823
13848
  self._active_user_message = user_message
13849
+ # Toast only on submit when the transcript will collapse the body —
13850
+ # the model still receives the full text; the UI is head+tail until
13851
+ # the user expands. Asking the widget (rather than re-deriving from
13852
+ # `message`) keeps this in step with what `render()` actually collapses,
13853
+ # including its mode-prefix handling.
13854
+ if user_message.has_expandable_body:
13855
+ # "Shortened", not "collapsed": a large paste already toasted
13856
+ # "Large paste collapsed" in the composer (see chat_input), and
13857
+ # that means something different (a placeholder chip, not a
13858
+ # head+tail elision in the transcript).
13859
+ self.notify(
13860
+ "Long message shortened in the transcript — click "
13861
+ "'show full message' to expand it. The full text was still "
13862
+ "sent to the model.",
13863
+ severity="information",
13864
+ markup=False,
13865
+ timeout=8,
13866
+ )
13824
13867
  await self._send_to_agent(message)
13825
13868
 
13826
13869
  async def _send_to_agent(
@@ -15723,6 +15766,23 @@ class DeepAgentsApp(App):
15723
15766
  )
15724
15767
  self._schedule_message_height_measurement(event.widget.id)
15725
15768
 
15769
+ def on_user_message_expansion_changed(
15770
+ self,
15771
+ event: UserMessage.ExpansionChanged,
15772
+ ) -> None:
15773
+ """Keep long-prompt expansion state across transcript virtualization.
15774
+
15775
+ Also re-measures the row: expanding a collapsed prompt can add hundreds
15776
+ of lines, and the spacer math that sizes the scrollbar reads a cached
15777
+ height that `refresh(layout=True)` alone does not update.
15778
+ """
15779
+ if event.widget.id:
15780
+ self._message_store.update_message(
15781
+ event.widget.id,
15782
+ user_expanded=event.expanded,
15783
+ )
15784
+ self._schedule_message_height_measurement(event.widget.id)
15785
+
15726
15786
  async def _clear_messages(self) -> None:
15727
15787
  """Clear the messages area and message store."""
15728
15788
  # Drop buffered `!` shell output so it never leaks across a thread
@@ -16865,8 +16925,8 @@ class DeepAgentsApp(App):
16865
16925
  text = f"Auto denied [{event.get('category', 'policy')}]: {reason}"
16866
16926
  elif kind == "unavailable":
16867
16927
  # 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)"
16928
+ # line outcome-focused so fail-closed denial is obvious.
16929
+ text = f"Auto classifier unavailable: {reason} tool not executed"
16870
16930
  else:
16871
16931
  text = f"Auto warning: {reason}"
16872
16932
  await self._mount_message(AppMessage(text))
@@ -17032,25 +17092,82 @@ class DeepAgentsApp(App):
17032
17092
  await self._auto_accept_pending_goal_rubric()
17033
17093
  return True
17034
17094
 
17095
+ async def _handle_approval_mode_command(self, target: ApprovalMode) -> None:
17096
+ """Switch approval mode from a slash command (`/manual`, `/auto`, `/yolo`).
17097
+
17098
+ Mirrors the Shift+Tab switcher: Auto is refused with a sandbox, YOLO
17099
+ honors the `startup.yolo_switcher` policy and prompts the first-run
17100
+ acknowledgement modal before unrestricted mode becomes active. Feedback
17101
+ is delivered via toasts and the status bar, not chat messages, so the
17102
+ command stays quiet like the keybinding.
17103
+
17104
+ Args:
17105
+ target: The approval mode requested by the command.
17106
+ """
17107
+ from deepagents_code.approval_mode import (
17108
+ ApprovalMode,
17109
+ has_yolo_acknowledgement,
17110
+ )
17111
+ from deepagents_code.config import is_yolo_switcher_enabled
17112
+
17113
+ if self._approval_mode is target:
17114
+ self.notify(
17115
+ f"Already in {target.value.capitalize()} mode.",
17116
+ severity="information",
17117
+ markup=False,
17118
+ )
17119
+ return
17120
+
17121
+ if target is ApprovalMode.AUTO and not self._auto_mode_eligible:
17122
+ self._warn_live_approval_mode_unavailable(
17123
+ "Auto is unavailable with a sandbox."
17124
+ )
17125
+ return
17126
+
17127
+ if target is ApprovalMode.YOLO:
17128
+ if not is_yolo_switcher_enabled():
17129
+ self._warn_live_approval_mode_unavailable(
17130
+ "YOLO is disabled in the approval switcher."
17131
+ )
17132
+ return
17133
+ if not has_yolo_acknowledgement():
17134
+ self._prompt_yolo_switcher_acknowledgement()
17135
+ return
17136
+
17137
+ await self._set_approval_mode(target)
17138
+
17035
17139
  def _prompt_yolo_switcher_acknowledgement(self) -> None:
17036
17140
  """Show the first-run YOLO acknowledgement before entering unrestricted mode.
17037
17141
 
17038
17142
  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.
17143
+ follow-up mode write succeeds. `m` switches to Manual instead. Esc (or a
17144
+ non-acknowledge dismiss) leaves the current mode untouched and does not
17145
+ store the acknowledgement.
17041
17146
  """
17042
17147
  from deepagents_code.approval_mode import (
17043
17148
  ApprovalMode,
17044
17149
  save_yolo_acknowledgement,
17045
17150
  )
17046
- from deepagents_code.tui.widgets.yolo_mode_notice import YoloModeNoticeScreen
17151
+ from deepagents_code.tui.widgets.yolo_mode_notice import (
17152
+ YoloModeNoticeResult,
17153
+ YoloModeNoticeScreen,
17154
+ )
17047
17155
 
17048
17156
  if getattr(self, "_yolo_mode_notice_pending", False):
17049
17157
  return
17050
17158
 
17051
- def handle_result(accepted: bool | None) -> None:
17159
+ def handle_result(result: YoloModeNoticeResult | None) -> None:
17052
17160
  self._yolo_mode_notice_pending = False
17053
- if accepted is not True:
17161
+ if result is YoloModeNoticeResult.MANUAL:
17162
+ # Already-Manual is a no-op: skip the live store write so a
17163
+ # failed redundant write cannot flip `_approval_mode_blocked`
17164
+ # and cancel an active run after the user declined YOLO.
17165
+ if self._approval_mode is ApprovalMode.MANUAL:
17166
+ return
17167
+ task = asyncio.create_task(self._set_approval_mode(ApprovalMode.MANUAL))
17168
+ task.add_done_callback(_log_task_exception)
17169
+ return
17170
+ if result is not YoloModeNoticeResult.ACKNOWLEDGE:
17054
17171
  self.notify(
17055
17172
  "Stayed in the current approval mode.",
17056
17173
  severity="information",
@@ -17139,6 +17256,13 @@ class DeepAgentsApp(App):
17139
17256
  if child.has_output:
17140
17257
  child.toggle_output()
17141
17258
  return
17259
+ # Long UserMessages are collapsible. This scan is newest-first and
17260
+ # first-match-wins, so any later tool/skill/group row claims Ctrl+O
17261
+ # and the prompt is then reachable only by click. Assistant rows are
17262
+ # not in the chain, so they do not block it.
17263
+ if isinstance(child, UserMessage) and child.has_expandable_body:
17264
+ child.toggle_expanded()
17265
+ return
17142
17266
 
17143
17267
  # Approval menu action handlers (delegated from App-level bindings)
17144
17268
  # NOTE: These only activate when approval widget is pending
@@ -20759,6 +20883,28 @@ class DeepAgentsApp(App):
20759
20883
  except ModuleNotFoundError:
20760
20884
  logger.warning("Could not preload restart_prompt modal", exc_info=True)
20761
20885
 
20886
+ def _schedule_restart_offer(
20887
+ self, coro: Coroutine[Any, Any, None], *, context: str
20888
+ ) -> None:
20889
+ """Run a post-install restart offer as a detached background task.
20890
+
20891
+ The `/install` slash command reaches the restart offer through the App's
20892
+ `on_chat_input_submitted` handler, which is awaited inline on the App
20893
+ message pump. Awaiting the restart modal there blocks the pump, so the
20894
+ modal never receives the Enter/Esc key events it needs to resolve and
20895
+ appears frozen. Detaching the offer onto its own task lets the command
20896
+ handler return and frees the pump to route keys to the modal — the same
20897
+ reason the post-`/auth` web-search offer is scheduled rather than
20898
+ awaited (see `_launch_web_search_restart_prompt`).
20899
+
20900
+ Args:
20901
+ coro: The restart-offer coroutine to run off the message pump.
20902
+ context: Short description used if the task is logged on failure.
20903
+ """
20904
+ task = asyncio.create_task(coro, name=f"restart-offer:{context}")
20905
+ self._track_server_restart_task(task)
20906
+ task.add_done_callback(_log_task_exception)
20907
+
20762
20908
  async def _offer_restart_after_install(self, label: str) -> None:
20763
20909
  """Offer a one-keypress restart after a restart-capable install.
20764
20910
 
@@ -22263,7 +22409,7 @@ class DeepAgentsApp(App):
22263
22409
  (e.g., `'anthropic:claude-sonnet-4-5'`) or just the model name
22264
22410
  for auto-detection.
22265
22411
  extra_kwargs: Extra constructor kwargs from `--model-params`.
22266
- announce_unchanged: Whether to mount a message when the requested
22412
+ announce_unchanged: Whether to toast a notice when the requested
22267
22413
  model is already active.
22268
22414
  persist: Whether to write the model to the user's recent/default
22269
22415
  config.
@@ -22390,9 +22536,21 @@ class DeepAgentsApp(App):
22390
22536
  params_suffix = _format_model_params(extra_kwargs)
22391
22537
  if announce_unchanged:
22392
22538
  message = f"Already using {current}{params_suffix}"
22393
- if message != self._last_model_unchanged_message:
22394
- await self._mount_message(AppMessage(message))
22395
- self._last_model_unchanged_message = message
22539
+ # Suppress only while the previous identical toast is
22540
+ # presumed still on-screen. Once it expires, a later
22541
+ # intentional no-op selection must be able to toast again.
22542
+ now = _monotonic()
22543
+ last = self._last_model_unchanged
22544
+ if (
22545
+ last is None
22546
+ or last[0] != message
22547
+ or (now - last[1]) >= self.NOTIFICATION_TIMEOUT
22548
+ ):
22549
+ # A no-op re-selection is transient feedback, not part
22550
+ # of the conversation, so surface it as a toast rather
22551
+ # than an inline chat message.
22552
+ self.notify(message, markup=False)
22553
+ self._last_model_unchanged = (message, now)
22396
22554
  logger.info(
22397
22555
  "Model unchanged (%s); model_params=%s",
22398
22556
  current,
@@ -22444,7 +22602,7 @@ class DeepAgentsApp(App):
22444
22602
 
22445
22603
  self._sync_status_model()
22446
22604
 
22447
- self._last_model_unchanged_message = None
22605
+ self._last_model_unchanged = None
22448
22606
  params_suffix = _format_model_params(extra_kwargs)
22449
22607
  if not persist:
22450
22608
  # Session-only switch (e.g. adopting a resumed thread's model):
@@ -506,9 +506,10 @@ 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`) 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.
509
+ (`_ClassifierDeadlineExceededError`) says the classifier did not respond
510
+ within the configured wait budget; a bare provider `TimeoutError` stays
511
+ type-only so we do not claim dcode's deadline fired when the model failed
512
+ first.
512
513
 
513
514
  Args:
514
515
  exc: Failure raised while invoking or validating the classifier.
@@ -518,7 +519,7 @@ def classifier_unavailable_reason(exc: BaseException, *, timeout_seconds: float)
518
519
  Compact single-line reason for tool messages and TUI events.
519
520
  """
520
521
  if isinstance(exc, _ClassifierDeadlineExceededError):
521
- return f"no decision within Auto's {timeout_seconds:g}s limit"
522
+ return f"classifier did not respond within {timeout_seconds:g}s"
522
523
  return f"failed ({type(exc).__name__})"
523
524
 
524
525