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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/CHANGELOG.md +13 -0
  2. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/PKG-INFO +4 -4
  3. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_build_info.py +1 -1
  4. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_version.py +1 -1
  5. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/agent.py +43 -25
  6. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/app.py +17 -52
  7. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/auto_mode.py +5 -8
  8. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/config.py +10 -24
  9. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/extras_info.py +82 -0
  10. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/capabilities.py +34 -1
  11. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/env.py +4 -0
  12. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/legacy.py +2 -1
  13. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/loading.py +5 -3
  14. deepagents_code-0.1.48/deepagents_code/hooks/migration.py +190 -0
  15. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/models/config.py +21 -1
  16. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/models/domain.py +42 -0
  17. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/models/wire.py +31 -0
  18. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/projection.py +33 -0
  19. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/reducer.py +31 -0
  20. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/runner.py +94 -13
  21. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/snapshot.py +5 -0
  22. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/main.py +17 -33
  23. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/offload.py +2 -2
  24. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/store.py +5 -1
  25. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/__init__.py +28 -0
  26. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/agent_selector.py +5 -4
  27. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/model_selector.py +4 -0
  28. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/restart_prompt.py +1 -1
  29. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/update_check.py +24 -0
  30. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/pyproject.toml +3 -3
  31. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/hooks/models/test_models.py +17 -0
  32. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/hooks/test_configuration.py +157 -4
  33. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/hooks/test_engine.py +234 -0
  34. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/hooks/test_execution.py +180 -24
  35. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_agent.py +73 -28
  36. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_app.py +3 -1
  37. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_auto_mode.py +19 -29
  38. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_config.py +25 -1
  39. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_extras_info.py +49 -0
  40. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_model_config.py +20 -0
  41. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_reasoning_effort.py +6 -0
  42. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_reload.py +10 -0
  43. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_server_helpers.py +3 -0
  44. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_update_check.py +46 -0
  45. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +92 -0
  46. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_model_selector.py +16 -0
  47. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/uv.lock +15 -15
  48. deepagents_code-0.1.47/deepagents_code/hooks/migration.py +0 -90
  49. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/.gitignore +0 -0
  50. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/AGENTS.md +0 -0
  51. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/ARCHITECTURE.md +0 -0
  52. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/COMMANDS.md +0 -0
  53. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/DEVELOPMENT.md +0 -0
  54. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/Makefile +0 -0
  55. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/README.md +0 -0
  56. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/THREAT_MODEL.md +0 -0
  57. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/__init__.py +0 -0
  58. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/__main__.py +0 -0
  59. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_ask_user_types.py +0 -0
  60. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_cli_context.py +0 -0
  61. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_constants.py +0 -0
  62. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_debug.py +0 -0
  63. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_debug_buffer.py +0 -0
  64. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_env_vars.py +0 -0
  65. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_fake_models.py +0 -0
  66. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_git.py +0 -0
  67. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_glm_5p2_profile.py +0 -0
  68. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_paths.py +0 -0
  69. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_repository_bounds.py +0 -0
  70. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_server_config.py +0 -0
  71. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_session_stats.py +0 -0
  72. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_startup_error.py +0 -0
  73. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_testing_models.py +0 -0
  74. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_textual_patches.py +0 -0
  75. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/_tool_stream.py +0 -0
  76. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/app.tcss +0 -0
  77. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/approval_mode.py +0 -0
  78. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/ask_user.py +0 -0
  79. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/auth_display.py +0 -0
  80. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/auth_store.py +0 -0
  81. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/__init__.py +0 -0
  82. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
  83. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
  84. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  85. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  86. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  87. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  88. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/__init__.py +0 -0
  89. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/commands/__init__.py +0 -0
  90. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/commands/auth.py +0 -0
  91. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/commands/config.py +0 -0
  92. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/commands/mcp.py +0 -0
  93. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/commands/tools.py +0 -0
  94. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/launch/__init__.py +0 -0
  95. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/launch/server.py +0 -0
  96. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/launch/server_manager.py +0 -0
  97. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/non_interactive.py +0 -0
  98. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/client/remote_client.py +0 -0
  99. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/clipboard.py +0 -0
  100. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/command_registry.py +0 -0
  101. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/config_manifest.py +0 -0
  102. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/configurable_model.py +0 -0
  103. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/default_agent_prompt.md +0 -0
  104. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/doctor.py +0 -0
  105. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/editor.py +0 -0
  106. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/event_bus.py +0 -0
  107. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/file_ops.py +0 -0
  108. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/formatting.py +0 -0
  109. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/goal_rubric.py +0 -0
  110. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/goal_state_notice.py +0 -0
  111. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/goal_tools.py +0 -0
  112. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/__init__.py +0 -0
  113. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/engine.py +0 -0
  114. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/models/__init__.py +0 -0
  115. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/models/adapters.py +0 -0
  116. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/models/transport.py +0 -0
  117. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/runtime.py +0 -0
  118. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/tools.py +0 -0
  119. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/transcript.py +0 -0
  120. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
  121. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/input.py +0 -0
  122. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/integrations/__init__.py +0 -0
  123. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/integrations/openai_codex.py +0 -0
  124. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/integrations/sandbox_config.py +0 -0
  125. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/integrations/sandbox_factory.py +0 -0
  126. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/integrations/sandbox_provider.py +0 -0
  127. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/integrations/sandbox_registry.py +0 -0
  128. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/iterm_cursor_guide.py +0 -0
  129. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/json_types.py +0 -0
  130. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/local_context.py +0 -0
  131. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/managed_tools.py +0 -0
  132. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_auth.py +0 -0
  133. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_config.py +0 -0
  134. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_disabled.py +0 -0
  135. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_login_service.py +0 -0
  136. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_oauth_ui.py +0 -0
  137. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/__init__.py +0 -0
  138. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/_registry.py +0 -0
  139. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/base.py +0 -0
  140. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/github.py +0 -0
  141. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_providers/slack.py +0 -0
  142. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/mcp_tools.py +0 -0
  143. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/media_utils.py +0 -0
  144. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/memory_guard.py +0 -0
  145. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/model_config.py +0 -0
  146. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/notifications.py +0 -0
  147. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/offload_middleware.py +0 -0
  148. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/onboarding.py +0 -0
  149. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/output.py +0 -0
  150. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/paste_collapse.py +0 -0
  151. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/__init__.py +0 -0
  152. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/_json.py +0 -0
  153. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/adapters/__init__.py +0 -0
  154. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/adapters/mcp.py +0 -0
  155. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/adapters/skills.py +0 -0
  156. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
  157. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/commands_cli.py +0 -0
  158. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/discovery.py +0 -0
  159. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/manifest.py +0 -0
  160. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/marketplace.py +0 -0
  161. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/models.py +0 -0
  162. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/plugins/substitution.py +0 -0
  163. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/project_utils.py +0 -0
  164. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/py.typed +0 -0
  165. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/reasoning_effort.py +0 -0
  166. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/reliable_rubric.py +0 -0
  167. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/resume_state.py +0 -0
  168. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/server_graph.py +0 -0
  169. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/sessions.py +0 -0
  170. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/skills/__init__.py +0 -0
  171. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/skills/commands.py +0 -0
  172. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/skills/invocation.py +0 -0
  173. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/skills/load.py +0 -0
  174. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/skills/merge.py +0 -0
  175. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/skills/trust.py +0 -0
  176. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/state_migration.py +0 -0
  177. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/subagents.py +0 -0
  178. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/system_prompt.md +0 -0
  179. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/terminal_capabilities.py +0 -0
  180. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/terminal_escape.py +0 -0
  181. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/theme.py +0 -0
  182. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/todo_list_prompt.md +0 -0
  183. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tool_catalog.py +0 -0
  184. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tool_display.py +0 -0
  185. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tools.py +0 -0
  186. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/__init__.py +0 -0
  187. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/modals/__init__.py +0 -0
  188. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
  189. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
  190. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
  191. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
  192. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
  193. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/screens/__init__.py +0 -0
  194. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/textual_adapter.py +0 -0
  195. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/__init__.py +0 -0
  196. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
  197. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  198. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/_links.py +0 -0
  199. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
  200. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/approval.py +0 -0
  201. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/ask_user.py +0 -0
  202. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/auth.py +0 -0
  203. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
  204. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/autocomplete.py +0 -0
  205. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/chat_input.py +0 -0
  206. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  207. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  208. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/debug_console.py +0 -0
  209. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/diff.py +0 -0
  210. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  211. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/goal_review.py +0 -0
  212. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/goal_status.py +0 -0
  213. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/history.py +0 -0
  214. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  215. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/launch_init.py +0 -0
  216. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/loading.py +0 -0
  217. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  218. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  219. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
  220. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/message_store.py +0 -0
  221. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/messages.py +0 -0
  222. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/notification_center.py +0 -0
  223. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  224. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  225. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/plugin_reload.py +0 -0
  226. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  227. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/startup_tip.py +0 -0
  228. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/status.py +0 -0
  229. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  230. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  231. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/thread_selector.py +0 -0
  232. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  233. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  234. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/update_available.py +0 -0
  235. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  236. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/update_progress.py +0 -0
  237. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/welcome.py +0 -0
  238. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
  239. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/ui.py +0 -0
  240. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/deepagents_code/unicode_security.py +0 -0
  241. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/examples/skills/arxiv-search/SKILL.md +0 -0
  242. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  243. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/examples/skills/langgraph-docs/SKILL.md +0 -0
  244. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/examples/skills/skill-creator/SKILL.md +0 -0
  245. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  246. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  247. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/examples/skills/web-research/SKILL.md +0 -0
  248. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/hatch_build.py +0 -0
  249. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/images/tui.png +0 -0
  250. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/scripts/check_imports.py +0 -0
  251. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/scripts/debug_server.sh +0 -0
  252. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/scripts/generate_commands_catalog.py +0 -0
  253. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/scripts/install.sh +0 -0
  254. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/README.md +0 -0
  255. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/__init__.py +0 -0
  256. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/benchmarks/__init__.py +0 -0
  257. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  258. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
  259. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  260. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/conftest.py +0 -0
  261. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/test_acp_mode.py +0 -0
  262. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  263. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/test_compact_resume.py +0 -0
  264. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
  265. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/test_offload_server_side.py +0 -0
  266. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/test_sandbox_factory.py +0 -0
  267. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/integration_tests/test_sandbox_operations.py +0 -0
  268. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/__init__.py +0 -0
  269. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/client/__init__.py +0 -0
  270. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/client/commands/__init__.py +0 -0
  271. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/client/commands/test_auth.py +0 -0
  272. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/client/commands/test_mcp.py +0 -0
  273. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/client/commands/test_tools.py +0 -0
  274. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/conftest.py +0 -0
  275. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  276. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/hooks/__init__.py +0 -0
  277. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/hooks/models/__init__.py +0 -0
  278. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/hooks/test_transcript.py +0 -0
  279. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/plugins/__init__.py +0 -0
  280. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/plugins/test_marketplace.py +0 -0
  281. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
  282. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/plugins/test_store.py +0 -0
  283. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/skills/__init__.py +0 -0
  284. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_commands.py +0 -0
  285. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_load.py +0 -0
  286. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_merge.py +0 -0
  287. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  288. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_skills_json.py +0 -0
  289. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
  290. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  291. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  292. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
  293. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
  294. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test__tool_stream.py +0 -0
  295. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_agent_friendly.py +0 -0
  296. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_approval_mode.py +0 -0
  297. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_args.py +0 -0
  298. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  299. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_auth_display.py +0 -0
  300. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_auth_store.py +0 -0
  301. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  302. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_charset.py +0 -0
  303. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_clipboard.py +0 -0
  304. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  305. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_command_registry.py +0 -0
  306. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_compact_tool.py +0 -0
  307. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_config_manifest.py +0 -0
  308. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_config_recursion_limit.py +0 -0
  309. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_configurable_model.py +0 -0
  310. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_cursor_blink.py +0 -0
  311. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_cursor_style.py +0 -0
  312. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_debug.py +0 -0
  313. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_debug_buffer.py +0 -0
  314. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_debug_console.py +0 -0
  315. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_doctor.py +0 -0
  316. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_editor.py +0 -0
  317. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_end_to_end.py +0 -0
  318. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_env_vars.py +0 -0
  319. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_event_bus.py +0 -0
  320. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_exception_handling.py +0 -0
  321. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_file_ops.py +0 -0
  322. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_formatting.py +0 -0
  323. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_git.py +0 -0
  324. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
  325. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_criteria_client.py +0 -0
  326. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_rubric.py +0 -0
  327. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_state_notice.py +0 -0
  328. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_state_persistence.py +0 -0
  329. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_goal_tools.py +0 -0
  330. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_hatch_build.py +0 -0
  331. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_hooks.py +0 -0
  332. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_imports.py +0 -0
  333. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_input_parsing.py +0 -0
  334. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_install_command.py +0 -0
  335. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_install_script.py +0 -0
  336. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  337. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_json_types.py +0 -0
  338. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_local_context.py +0 -0
  339. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_main.py +0 -0
  340. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_main_acp_mode.py +0 -0
  341. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_main_args.py +0 -0
  342. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_managed_tools.py +0 -0
  343. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_auth.py +0 -0
  344. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_config.py +0 -0
  345. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_disabled.py +0 -0
  346. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_login_service.py +0 -0
  347. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  348. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_mcp_tools.py +0 -0
  349. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_media_utils.py +0 -0
  350. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_memory_guard.py +0 -0
  351. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_model_switch.py +0 -0
  352. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_non_interactive.py +0 -0
  353. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_notifications.py +0 -0
  354. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_offload.py +0 -0
  355. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_onboarding.py +0 -0
  356. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  357. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_output.py +0 -0
  358. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_paths.py +0 -0
  359. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_reliable_rubric.py +0 -0
  360. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_remote_client.py +0 -0
  361. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_repository_bounds.py +0 -0
  362. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_resume_state.py +0 -0
  363. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_rubric_cli.py +0 -0
  364. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_sandbox_config.py +0 -0
  365. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_sandbox_factory.py +0 -0
  366. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_sandbox_provider.py +0 -0
  367. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_sandbox_registry.py +0 -0
  368. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_server.py +0 -0
  369. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_server_config.py +0 -0
  370. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_server_graph.py +0 -0
  371. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_server_manager.py +0 -0
  372. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_session_stats.py +0 -0
  373. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_sessions.py +0 -0
  374. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_shell_allow_list.py +0 -0
  375. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_skill_invocation.py +0 -0
  376. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_startup_blocking.py +0 -0
  377. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  378. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_state_migration.py +0 -0
  379. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_subagents.py +0 -0
  380. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  381. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_terminal_escape.py +0 -0
  382. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  383. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_textual_patches.py +0 -0
  384. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_theme.py +0 -0
  385. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_threads_resume.py +0 -0
  386. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_tool_catalog.py +0 -0
  387. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_tool_display.py +0 -0
  388. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_tracing_replicas.py +0 -0
  389. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  390. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_ui.py +0 -0
  391. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_unicode_security.py +0 -0
  392. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/test_version.py +0 -0
  393. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tools/__init__.py +0 -0
  394. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tools/test_current_thread.py +0 -0
  395. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  396. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
  397. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/__init__.py +0 -0
  398. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/modals/__init__.py +0 -0
  399. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
  400. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  401. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
  402. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  403. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  404. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  405. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
  406. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
  407. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
  408. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
  409. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  410. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  411. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
  412. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  413. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
  414. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  415. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  416. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  417. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  418. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  419. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  420. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
  421. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
  422. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
  423. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  424. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  425. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
  426. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_plugin_reload.py +0 -0
  427. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  428. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  429. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
  430. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_status.py +0 -0
  431. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  432. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
  433. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  434. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  435. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  436. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
  437. {deepagents_code-0.1.47 → deepagents_code-0.1.48}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
@@ -2,6 +2,19 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.48](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.47...deepagents-code==0.1.48) (2026-07-27)
6
+
7
+ ### Features
8
+
9
+ - Added Fireworks `kimi-k3`, GLM-5.2-Fast, and Kimi-K3 to model selection and recommended models. ([#5082](https://github.com/langchain-ai/deepagents/issues/5082), [#5072](https://github.com/langchain-ai/deepagents/issues/5072))
10
+ - Migrated legacy hooks to v2 events. ([#4971](https://github.com/langchain-ai/deepagents/issues/4971))
11
+
12
+ ### Bug Fixes
13
+
14
+ - Require an `AGENTS.md` marker for `/agent` discovery, resolving unintended discovery behavior. ([#5076](https://github.com/langchain-ai/deepagents/issues/5076), closes [#4991](https://github.com/langchain-ai/deepagents/issues/4991))
15
+ - Removed the redundant `/restart` hint from the restart prompt. ([#5083](https://github.com/langchain-ai/deepagents/issues/5083))
16
+ - Removed the caret flash in plugin type-to-search. ([#5078](https://github.com/langchain-ai/deepagents/issues/5078))
17
+
5
18
  ## [0.1.47](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.46...deepagents-code==0.1.47) (2026-07-24)
6
19
 
7
20
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents-code
3
- Version: 0.1.47
3
+ Version: 0.1.48
4
4
  Summary: Terminal coding agent built on the Deep Agents SDK - works with any model, with persistent memory, customizable skills, subagents, and approval controls.
5
5
  Project-URL: Homepage, https://docs.langchain.com/oss/python/deepagents/overview
6
6
  Project-URL: Documentation, https://reference.langchain.com/python/deepagents/
@@ -31,7 +31,7 @@ Requires-Dist: deepagents-acp<1.0.0,>=0.0.9
31
31
  Requires-Dist: deepagents==0.7.0b2
32
32
  Requires-Dist: filelock<3.30,>=3.29.7
33
33
  Requires-Dist: httpx<1.0.0,>=0.28.1
34
- Requires-Dist: langchain-anthropic<2.0.0,>=1.5.1
34
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.5.2
35
35
  Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1
36
36
  Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.0
37
37
  Requires-Dist: langchain-openai<2.0.0,>=1.4.1
@@ -63,7 +63,7 @@ Provides-Extra: agentcore
63
63
  Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.5; extra == 'agentcore'
64
64
  Provides-Extra: all-providers
65
65
  Requires-Dist: aiohttp<3.15.0,>=3.14.3; extra == 'all-providers'
66
- Requires-Dist: langchain-anthropic<2.0.0,>=1.5.1; extra == 'all-providers'
66
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.5.2; extra == 'all-providers'
67
67
  Requires-Dist: langchain-aws<2.0.0,>=1.6.3; extra == 'all-providers'
68
68
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'all-providers'
69
69
  Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
@@ -91,7 +91,7 @@ Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
91
91
  Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
92
92
  Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
93
93
  Provides-Extra: anthropic
94
- Requires-Dist: langchain-anthropic<2.0.0,>=1.5.1; extra == 'anthropic'
94
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.5.2; extra == 'anthropic'
95
95
  Provides-Extra: baseten
96
96
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'baseten'
97
97
  Provides-Extra: bedrock
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "8aa29dd"
3
+ BUILD_COMMIT = "803b832"
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Keep the `x-release-please-version` annotation — release-please uses it to
4
4
  # bump `__version__` in sync with `pyproject.toml` on every release PR.
5
- __version__ = "0.1.47" # x-release-please-version
5
+ __version__ = "0.1.48" # x-release-please-version
6
6
 
7
7
  DOCS_URL = "https://docs.langchain.com/oss/python/deepagents/code"
8
8
  """URL for `deepagents-code` documentation."""
@@ -1107,12 +1107,25 @@ def load_async_subagents(config_path: Path | None = None) -> list[AsyncSubAgent]
1107
1107
  return agents
1108
1108
 
1109
1109
 
1110
+ _AGENT_DIR_MARKER = "AGENTS.md"
1111
+ """Filename that marks a `~/.deepagents/<name>/` directory as an agent profile.
1112
+
1113
+ Discovery is fail-closed: only directories containing this marker are listed by
1114
+ the `/agent` picker. Real agents always create it (empty on first use when
1115
+ memory is enabled), so empty folders stay out of the picker without being
1116
+ named. Known app-owned directory names are still denylisted so a forced
1117
+ invocation such as `dcode -a plugins` cannot stamp the marker into app state
1118
+ and surface that directory as a selectable agent.
1119
+ """
1120
+
1121
+
1110
1122
  @functools.lru_cache(maxsize=1)
1111
1123
  def _reserved_agent_dir_names() -> frozenset[str]:
1112
1124
  """Return non-agent directory names reserved by the app under `~/.deepagents/`.
1113
1125
 
1114
1126
  These directories are created by the app for its own use and must never
1115
- appear in the agent picker:
1127
+ appear in the agent picker — even if they contain an `AGENTS.md` file
1128
+ (e.g. after `dcode -a plugins` stamps the marker via memory setup):
1116
1129
 
1117
1130
  - `bin/` holds the managed `rg` binary (`managed_tools.BIN_DIR`).
1118
1131
  - `plugins/` holds installed plugin state (`plugins.store`).
@@ -1134,28 +1147,38 @@ def _reserved_agent_dir_names() -> frozenset[str]:
1134
1147
  def _is_agent_dir_entry(entry: Path) -> bool:
1135
1148
  """Return whether a `~/.deepagents/` entry should be listed as an agent.
1136
1149
 
1137
- Filters out symlinks (so dangling links don't masquerade as agents),
1138
- dot-prefixed names `.state/` (app internal state) plus any other
1139
- hidden directory the user may have placed there — and reserved names
1140
- the app owns (`bin/`, `plugins/`, and `conversation_history/`).
1150
+ Fail-closed on the `AGENTS.md` marker: a directory is an agent only when
1151
+ that file exists as a regular (non-symlink) file inside it.
1152
+
1153
+ Also rejects:
1141
1154
 
1142
- `OSError` from `is_dir`/`is_symlink` propagates so callers can log
1143
- with the failing entry's name as context.
1155
+ - Dot-prefixed names (hidden dirs such as `.state/`)
1156
+ - Reserved app-owned names (`bin/`, `plugins/`, `conversation_history/`),
1157
+ even if they contain the marker
1158
+ - Symlinked directories (including dangling links)
1159
+ - Non-directories
1160
+
1161
+ `OSError` from `is_dir`/`is_symlink`/`is_file` propagates so callers can
1162
+ log with the failing entry's name as context.
1144
1163
  """
1145
1164
  if entry.name.startswith(".") or entry.name in _reserved_agent_dir_names():
1146
1165
  return False
1147
- return entry.is_dir() and not entry.is_symlink()
1166
+ if entry.is_symlink() or not entry.is_dir():
1167
+ return False
1168
+ marker = entry / _AGENT_DIR_MARKER
1169
+ # `is_file()` is True for a symlink-to-file; reject those so a dangling or
1170
+ # external link cannot mint an agent entry.
1171
+ return marker.is_file() and not marker.is_symlink()
1148
1172
 
1149
1173
 
1150
1174
  def get_available_agent_names() -> list[str]:
1151
1175
  """Return a sorted list of available agent names from `~/.deepagents/`.
1152
1176
 
1153
1177
  Scans the user's `.deepagents` directory and returns each real
1154
- subdirectory found there. Symlinks excluded so a dangling link does not
1155
- masquerade as an agent. Dot-prefixed entries (e.g., `.state/`) and
1156
- reserved app-owned directories (`bin/`, `plugins/`, and
1157
- `conversation_history/`) are skipped so internal state never appears as an
1158
- agent.
1178
+ subdirectory that contains the `AGENTS.md` agent marker and is not an
1179
+ app-reserved name. Fail-closed: bare directories, reserved app state
1180
+ (`bin/`, `plugins/`, `conversation_history/`), symlinks, and hidden
1181
+ entries are not agents.
1159
1182
 
1160
1183
  Filesystem errors (missing parent, permission denied, broken entries) are
1161
1184
  logged and surfaced as an empty list rather than raised — the caller shows
@@ -1222,7 +1245,9 @@ def list_agents(*, output_format: OutputFormat = "text") -> None:
1222
1245
  {
1223
1246
  "name": name,
1224
1247
  "path": str(agent_path),
1225
- "has_agents_md": (agent_path / "AGENTS.md").exists(),
1248
+ # Always True for names from `get_available_agent_names`
1249
+ # (fail-closed marker). Kept for JSON schema stability.
1250
+ "has_agents_md": (agent_path / _AGENT_DIR_MARKER).is_file(),
1226
1251
  "is_default": name == DEFAULT_AGENT_NAME,
1227
1252
  }
1228
1253
  )
@@ -1240,17 +1265,10 @@ def list_agents(*, output_format: OutputFormat = "text") -> None:
1240
1265
  is_default = name == DEFAULT_AGENT_NAME
1241
1266
  default_label = " [dim](default)[/dim]" if is_default else ""
1242
1267
 
1243
- if (agent_path / "AGENTS.md").exists():
1244
- console.print(
1245
- f" {bullet} [bold]{agent_name}[/bold]{default_label}",
1246
- style=theme.PRIMARY,
1247
- )
1248
- else:
1249
- console.print(
1250
- f" {bullet} [bold]{agent_name}[/bold]{default_label}"
1251
- " [dim](incomplete)[/dim]",
1252
- style=theme.WARNING,
1253
- )
1268
+ console.print(
1269
+ f" {bullet} [bold]{agent_name}[/bold]{default_label}",
1270
+ style=theme.PRIMARY,
1271
+ )
1254
1272
  console.print(
1255
1273
  f" {escape_markup(str(agent_path))}",
1256
1274
  style=theme.MUTED,
@@ -5052,37 +5052,20 @@ class DeepAgentsApp(App):
5052
5052
  and self._server_kwargs is not None
5053
5053
  ):
5054
5054
  missing = self._server_startup_missing_provider_package
5055
- from deepagents_code.extras_info import extra_for_package
5055
+ from deepagents_code.extras_info import resolve_install_hint
5056
5056
 
5057
- extra = extra_for_package(missing.package)
5058
- if extra is not None:
5057
+ hint = resolve_install_hint(missing.package)
5058
+ if hint.extra is not None:
5059
5059
  text += (
5060
- f"\n\nHint: install the package with `/install {extra}`, "
5060
+ f"\n\nHint: install the package with `/install {hint.extra}`, "
5061
5061
  f"then run `/model {missing.provider}:<model>` to retry. "
5062
5062
  "Or pick a different provider with `/model`."
5063
5063
  )
5064
5064
  else:
5065
- from deepagents_code.extras_info import ExtrasIntrospectionError
5066
- from deepagents_code.update_check import (
5067
- ToolRequirementIntrospectionError,
5068
- install_package_command,
5069
- )
5070
-
5071
- try:
5072
- install_cmd = install_package_command(missing.package)
5073
- except (
5074
- ValueError,
5075
- ExtrasIntrospectionError,
5076
- ToolRequirementIntrospectionError,
5077
- ) as exc:
5078
- logger.debug(
5079
- "install_package_command failed; falling back to "
5080
- "manual hint: %s",
5081
- exc,
5082
- )
5083
- install_hint = f"install the `{missing.package}` package manually"
5065
+ if hint.command is not None:
5066
+ install_hint = f"run `{hint.command}`"
5084
5067
  else:
5085
- install_hint = f"run `{install_cmd}`"
5068
+ install_hint = f"install the `{missing.package}` package manually"
5086
5069
  text += (
5087
5070
  f"\n\nHint: {install_hint}, then run "
5088
5071
  f"`/model {missing.provider}:<model>` "
@@ -6034,9 +6017,9 @@ class DeepAgentsApp(App):
6034
6017
  create_update_log_path,
6035
6018
  editable_extra_hint,
6036
6019
  install_extra_command,
6037
- install_extra_recovery_command,
6038
6020
  is_valid_extra_name,
6039
6021
  perform_install_extra,
6022
+ safe_install_extra_recovery_command,
6040
6023
  )
6041
6024
  except ImportError as exc:
6042
6025
  logger.warning("/install command import failed", exc_info=True)
@@ -6121,19 +6104,9 @@ class DeepAgentsApp(App):
6121
6104
  # already bound above so the hint is never empty. `manual_cmd` is
6122
6105
  # rendered into a Textual `Content` (literal, not Rich markup), so no
6123
6106
  # bracket escaping is needed here.
6124
- try:
6125
- manual_cmd = await asyncio.to_thread(
6126
- install_extra_recovery_command, extra
6127
- )
6128
- except (
6129
- ExtrasIntrospectionError,
6130
- ToolRequirementIntrospectionError,
6131
- ValueError,
6132
- ):
6133
- logger.warning(
6134
- "/install recovery command failed (install raised)",
6135
- exc_info=True,
6136
- )
6107
+ manual_cmd = await asyncio.to_thread(
6108
+ safe_install_extra_recovery_command, extra, fallback=manual_cmd
6109
+ )
6137
6110
  await self._mount_message(
6138
6111
  ErrorMessage(
6139
6112
  f"Install failed: {type(exc).__name__}: {exc}\n"
@@ -6149,19 +6122,9 @@ class DeepAgentsApp(App):
6149
6122
  detail = f": {output[-200:]}" if output else ""
6150
6123
  # See the OSError branch above: best-effort recovery command, falling
6151
6124
  # back to the already-bound install-script command on failure.
6152
- try:
6153
- manual_cmd = await asyncio.to_thread(
6154
- install_extra_recovery_command, extra
6155
- )
6156
- except (
6157
- ExtrasIntrospectionError,
6158
- ToolRequirementIntrospectionError,
6159
- ValueError,
6160
- ):
6161
- logger.warning(
6162
- "/install recovery command failed (install reported failure)",
6163
- exc_info=True,
6164
- )
6125
+ manual_cmd = await asyncio.to_thread(
6126
+ safe_install_extra_recovery_command, extra, fallback=manual_cmd
6127
+ )
6165
6128
  await self._mount_message(
6166
6129
  ErrorMessage(
6167
6130
  f"Install failed{detail}\n"
@@ -16901,7 +16864,9 @@ class DeepAgentsApp(App):
16901
16864
  elif kind == "denial":
16902
16865
  text = f"Auto denied [{event.get('category', 'policy')}]: {reason}"
16903
16866
  elif kind == "unavailable":
16904
- text = f"Auto classifier unavailable: {reason}"
16867
+ # Reason is a short cause fragment from the server; keep the UI
16868
+ # line outcome-focused so the blocked action is obvious.
16869
+ text = f"Auto classifier unavailable: {reason} (action blocked)"
16905
16870
  else:
16906
16871
  text = f"Auto warning: {reason}"
16907
16872
  await self._mount_message(AppMessage(text))
@@ -506,9 +506,9 @@ def classifier_unavailable_reason(exc: BaseException, *, timeout_seconds: float)
506
506
 
507
507
  Provider exception text stays out of the reason (it can carry secrets or
508
508
  noisy HTML). Only real local deadline expiry
509
- (`_ClassifierDeadlineExceededError`) gets app-timeout wording; a bare
510
- provider `TimeoutError` stays type-only so we do not claim dcode
511
- cancelled a call the model failed first.
509
+ (`_ClassifierDeadlineExceededError`) includes the configured wait budget; a
510
+ bare provider `TimeoutError` stays type-only so we do not claim dcode's
511
+ deadline fired when the model failed first.
512
512
 
513
513
  Args:
514
514
  exc: Failure raised while invoking or validating the classifier.
@@ -518,11 +518,8 @@ def classifier_unavailable_reason(exc: BaseException, *, timeout_seconds: float)
518
518
  Compact single-line reason for tool messages and TUI events.
519
519
  """
520
520
  if isinstance(exc, _ClassifierDeadlineExceededError):
521
- return (
522
- "dcode cancelled the authorization classifier after its local "
523
- f"{timeout_seconds:g}s timeout (app-imposed, not a provider timeout)."
524
- )
525
- return f"The authorization classifier was unavailable ({type(exc).__name__})."
521
+ return f"no decision within Auto's {timeout_seconds:g}s limit"
522
+ return f"failed ({type(exc).__name__})"
526
523
 
527
524
 
528
525
  def _default_counters(mode: ApprovalMode) -> AutoModeCounters:
@@ -112,6 +112,7 @@ _DOTENV_DENIED_ENV_KEYS = frozenset(
112
112
  "BASH_ENV",
113
113
  "BASHOPTS",
114
114
  "CDPATH",
115
+ "COMSPEC",
115
116
  "DYLD_INSERT_LIBRARIES",
116
117
  "DYLD_LIBRARY_PATH",
117
118
  "ENV",
@@ -128,6 +129,8 @@ _DOTENV_DENIED_ENV_KEYS = frozenset(
128
129
  "PYTHONSTARTUP",
129
130
  "SHELLOPTS",
130
131
  "SSH_ASKPASS",
132
+ "SYSTEMROOT",
133
+ "WINDIR",
131
134
  _INHERITED_PYTHONPATH_ENV,
132
135
  }
133
136
  )
@@ -4534,36 +4537,19 @@ def _create_model_via_init(
4534
4537
  f"import for provider '{provider}': {e}"
4535
4538
  )
4536
4539
  else:
4537
- from deepagents_code.extras_info import extra_for_package
4540
+ from deepagents_code.extras_info import resolve_install_hint
4538
4541
 
4539
- extra = extra_for_package(package)
4540
- if extra is not None:
4542
+ hint = resolve_install_hint(package)
4543
+ if hint.extra is not None:
4541
4544
  msg = (
4542
4545
  f"Missing package for provider '{provider}'. "
4543
- f"Install: /install {extra}"
4546
+ f"Install: /install {hint.extra}"
4544
4547
  )
4545
4548
  else:
4546
- from deepagents_code.extras_info import ExtrasIntrospectionError
4547
- from deepagents_code.update_check import (
4548
- ToolRequirementIntrospectionError,
4549
- install_package_command,
4550
- )
4551
-
4552
- try:
4553
- install_cmd = install_package_command(package)
4554
- except (
4555
- ValueError,
4556
- ExtrasIntrospectionError,
4557
- ToolRequirementIntrospectionError,
4558
- ) as exc:
4559
- logger.debug(
4560
- "install_package_command failed; falling back to "
4561
- "manual hint: %s",
4562
- exc,
4563
- )
4564
- install_hint = f"Install the '{package}' package manually"
4549
+ if hint.command is not None:
4550
+ install_hint = f"Install with: {hint.command}"
4565
4551
  else:
4566
- install_hint = f"Install with: {install_cmd}"
4552
+ install_hint = f"Install the '{package}' package manually"
4567
4553
  msg = (
4568
4554
  f"Missing package for provider '{provider}'. "
4569
4555
  f"{install_hint}, then retry with `/model`."
@@ -1129,6 +1129,88 @@ def extra_for_package(
1129
1129
  return None
1130
1130
 
1131
1131
 
1132
+ @dataclass(frozen=True)
1133
+ class InstallHint:
1134
+ """Resolved recovery action for a missing provider package.
1135
+
1136
+ Exactly one of three outcomes:
1137
+
1138
+ - `extra` set, `command` `None` — prefer installing the extra that declares
1139
+ the package (callers format this for their UI surface).
1140
+ - `command` set, `extra` `None` — no declared extra; use this raw install
1141
+ command.
1142
+ - both `None` — neither could be derived; caller should fall back to
1143
+ "install the package manually" phrasing.
1144
+
1145
+ Attributes:
1146
+ extra: Preferred `deepagents-code` extra name, or `None`.
1147
+ command: Ready-to-run install command for the raw package, or `None`.
1148
+ Never set when `extra` is set.
1149
+ """
1150
+
1151
+ extra: str | None
1152
+ command: str | None
1153
+
1154
+ def __post_init__(self) -> None:
1155
+ """Reject impossible dual-action resolutions.
1156
+
1157
+ Raises:
1158
+ ValueError: If both `extra` and `command` are set.
1159
+ """
1160
+ if self.extra is not None and self.command is not None:
1161
+ msg = "InstallHint cannot set both extra and command"
1162
+ raise ValueError(msg)
1163
+
1164
+
1165
+ def resolve_install_hint(
1166
+ package: str,
1167
+ distribution_name: str = "deepagents-code",
1168
+ ) -> InstallHint:
1169
+ """Resolve how to recover from a missing provider package.
1170
+
1171
+ Centralizes the `extra_for_package` -> `install_package_command` fallback so
1172
+ the TUI startup hint and the model-initialization error path render
1173
+ consistent recovery data without each re-implementing the branching and
1174
+ error handling. Prefers the installable extra; otherwise derives a raw
1175
+ package install command, degrading to a manual hint (both fields `None`)
1176
+ when that cannot be determined.
1177
+
1178
+ Callers own sentence wording and command framing (for example interactive
1179
+ `/install` / `/model` copy). This helper only resolves the recovery action.
1180
+
1181
+ Args:
1182
+ package: Distribution package name that failed to import.
1183
+ distribution_name: Name of the installed distribution to inspect when
1184
+ mapping the package to an extra and when building a raw package
1185
+ install command that preserves already-installed extras.
1186
+
1187
+ Returns:
1188
+ An `InstallHint` describing the recommended recovery action.
1189
+ """
1190
+ extra = extra_for_package(package, distribution_name)
1191
+ if extra is not None:
1192
+ return InstallHint(extra=extra, command=None)
1193
+
1194
+ from deepagents_code.update_check import (
1195
+ ToolRequirementIntrospectionError,
1196
+ install_package_command,
1197
+ )
1198
+
1199
+ try:
1200
+ command = install_package_command(package, distribution_name=distribution_name)
1201
+ except (
1202
+ ValueError,
1203
+ ExtrasIntrospectionError,
1204
+ ToolRequirementIntrospectionError,
1205
+ ) as exc:
1206
+ logger.debug(
1207
+ "install_package_command failed; falling back to manual hint: %s",
1208
+ exc,
1209
+ )
1210
+ return InstallHint(extra=None, command=None)
1211
+ return InstallHint(extra=None, command=command)
1212
+
1213
+
1132
1214
  def verify_interpreter_deps() -> None:
1133
1215
  """Check that `langchain-quickjs` is installed for the interpreter.
1134
1216
 
@@ -16,6 +16,8 @@ from deepagents_code.hooks.models.domain import (
16
16
  PermissionRequestEvent,
17
17
  PostToolUseDecision,
18
18
  PostToolUseEvent,
19
+ PreCompactDecision,
20
+ PreCompactEvent,
19
21
  PreToolUseDecision,
20
22
  PreToolUseEvent,
21
23
  SessionEndDecision,
@@ -28,6 +30,8 @@ from deepagents_code.hooks.models.domain import (
28
30
  SubagentStartEvent,
29
31
  SubagentStopDecision,
30
32
  SubagentStopEvent,
33
+ UserPromptSubmitDecision,
34
+ UserPromptSubmitEvent,
31
35
  )
32
36
 
33
37
  if TYPE_CHECKING:
@@ -52,6 +56,7 @@ class PlainOutputPolicy(StrEnum):
52
56
  class ExitCodePolicy(StrEnum):
53
57
  """How exit code 2 is interpreted for an event."""
54
58
 
59
+ BLOCK = "block"
55
60
  CONTEXT = "context"
56
61
  DENY = "deny"
57
62
  FEEDBACK = "feedback"
@@ -72,7 +77,7 @@ class AggregationPolicy(StrEnum):
72
77
 
73
78
  DEFAULT_COMMAND_TIMEOUT_SECONDS = 600.0
74
79
  MatcherField: TypeAlias = Literal[
75
- "cause", "tool_name", "notification_type", "agent_name"
80
+ "cause", "tool_name", "notification_type", "agent_name", "trigger"
76
81
  ]
77
82
 
78
83
 
@@ -106,6 +111,18 @@ _HOOK_EVENT_SPECS: Final[Mapping[HookEvent, HookEventSpec]] = MappingProxyType(
106
111
  aggregation_policy=AggregationPolicy.CONTEXT,
107
112
  supported_handler_types=frozenset({HandlerType.COMMAND}),
108
113
  ),
114
+ HookEvent.USER_PROMPT_SUBMIT: HookEventSpec(
115
+ event=HookEvent.USER_PROMPT_SUBMIT,
116
+ owner=HookOwner.CLIENT,
117
+ event_model=UserPromptSubmitEvent,
118
+ decision_model=UserPromptSubmitDecision,
119
+ matcher_field=None,
120
+ default_timeout_seconds=30.0,
121
+ exit_code_policy=ExitCodePolicy.BLOCK,
122
+ plain_output_policy=PlainOutputPolicy.CONTEXT,
123
+ aggregation_policy=AggregationPolicy.CONTEXT,
124
+ supported_handler_types=frozenset({HandlerType.COMMAND}),
125
+ ),
109
126
  HookEvent.SESSION_END: HookEventSpec(
110
127
  event=HookEvent.SESSION_END,
111
128
  owner=HookOwner.CLIENT,
@@ -166,6 +183,18 @@ _HOOK_EVENT_SPECS: Final[Mapping[HookEvent, HookEventSpec]] = MappingProxyType(
166
183
  aggregation_policy=AggregationPolicy.FEEDBACK_AND_CONTEXT,
167
184
  supported_handler_types=frozenset({HandlerType.COMMAND}),
168
185
  ),
186
+ HookEvent.PRE_COMPACT: HookEventSpec(
187
+ event=HookEvent.PRE_COMPACT,
188
+ owner=HookOwner.CLIENT,
189
+ event_model=PreCompactEvent,
190
+ decision_model=PreCompactDecision,
191
+ matcher_field="trigger",
192
+ default_timeout_seconds=DEFAULT_COMMAND_TIMEOUT_SECONDS,
193
+ exit_code_policy=ExitCodePolicy.BLOCK,
194
+ plain_output_policy=PlainOutputPolicy.IGNORE,
195
+ aggregation_policy=AggregationPolicy.SIDE_EFFECT,
196
+ supported_handler_types=frozenset({HandlerType.COMMAND}),
197
+ ),
169
198
  HookEvent.STOP: HookEventSpec(
170
199
  event=HookEvent.STOP,
171
200
  owner=HookOwner.SERVER,
@@ -218,6 +247,8 @@ def get_event_spec(event: HookEvent) -> HookEventSpec:
218
247
  match event:
219
248
  case HookEvent.SESSION_START:
220
249
  return _HOOK_EVENT_SPECS[HookEvent.SESSION_START]
250
+ case HookEvent.USER_PROMPT_SUBMIT:
251
+ return _HOOK_EVENT_SPECS[HookEvent.USER_PROMPT_SUBMIT]
221
252
  case HookEvent.SESSION_END:
222
253
  return _HOOK_EVENT_SPECS[HookEvent.SESSION_END]
223
254
  case HookEvent.PERMISSION_REQUEST:
@@ -228,6 +259,8 @@ def get_event_spec(event: HookEvent) -> HookEventSpec:
228
259
  return _HOOK_EVENT_SPECS[HookEvent.PRE_TOOL_USE]
229
260
  case HookEvent.POST_TOOL_USE:
230
261
  return _HOOK_EVENT_SPECS[HookEvent.POST_TOOL_USE]
262
+ case HookEvent.PRE_COMPACT:
263
+ return _HOOK_EVENT_SPECS[HookEvent.PRE_COMPACT]
231
264
  case HookEvent.STOP:
232
265
  return _HOOK_EVENT_SPECS[HookEvent.STOP]
233
266
  case HookEvent.SUBAGENT_START:
@@ -10,6 +10,10 @@ from deepagents_code.config_manifest import _is_secret_env
10
10
  if TYPE_CHECKING:
11
11
  from collections.abc import Mapping
12
12
 
13
+ # Shared bound for legacy hook subprocesses and the migration adapter's nested
14
+ # `subprocess.run`. Keep the legacy dispatcher and Hooks v2 migration aligned.
15
+ HOOK_SUBPROCESS_TIMEOUT = 5.0
16
+
13
17
 
14
18
  def sanitize_hook_environ(
15
19
  source: Mapping[str, str] | None = None,
@@ -82,6 +82,8 @@ import subprocess # ruff:ignore[suspicious-subprocess-import]
82
82
  from concurrent.futures import ThreadPoolExecutor
83
83
  from typing import TYPE_CHECKING, Any
84
84
 
85
+ from deepagents_code.hooks.env import HOOK_SUBPROCESS_TIMEOUT
86
+
85
87
  if TYPE_CHECKING:
86
88
  from collections.abc import Mapping
87
89
 
@@ -101,7 +103,6 @@ that act on the arguments (e.g. a linter reading a `write_file` `content`) see
101
103
  the exact value the tool received.
102
104
  """
103
105
 
104
- HOOK_SUBPROCESS_TIMEOUT = 5
105
106
  """Seconds a single hook subprocess may run before it is killed.
106
107
 
107
108
  Bounds how long one misbehaving hook can block the dispatch thread. Consumed in
@@ -172,7 +172,9 @@ def canonical_hooks_bytes(config: HooksConfig) -> bytes:
172
172
 
173
173
 
174
174
  def _canonical_group(group: MatcherGroup) -> dict[str, object]:
175
- raw = group.model_dump(mode="json", by_alias=True, exclude_none=True)
175
+ raw = group.model_dump(
176
+ mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
177
+ )
176
178
  handlers: list[dict[str, object]] = []
177
179
  hooks_raw = raw.get("hooks")
178
180
  if isinstance(hooks_raw, list):
@@ -226,8 +228,8 @@ def _read_hooks_document(
226
228
  ]
227
229
  migrated = migrate_legacy_hooks(legacy_entries)
228
230
  migration_message = (
229
- f"Migrated semantically equivalent session.end hooks from {path}; "
230
- "all other legacy events remain unmapped"
231
+ f"Migrated semantically equivalent legacy hooks from {path}; "
232
+ "unsupported legacy events remain unmapped"
231
233
  if migrated.hooks
232
234
  else (
233
235
  f"Legacy hooks at {path} contained no events that are safe to "