deepagents-code 0.1.73__tar.gz → 0.1.75__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 (563) hide show
  1. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/CHANGELOG.md +26 -0
  2. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/PKG-INFO +11 -11
  3. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/THREAT_MODEL.md +27 -23
  4. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_build_info.py +1 -1
  5. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_session_stats.py +26 -2
  6. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_version.py +1 -1
  7. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/app.py +50 -1
  8. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/auto_mode.py +328 -105
  9. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/client/non_interactive.py +3 -0
  10. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/legacy.py +2 -2
  11. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/main.py +3 -2
  12. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/mcp_tools.py +7 -1
  13. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/model_retry.py +11 -0
  14. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/sessions.py +90 -7
  15. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/system_prompt.md +4 -0
  16. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/modals/cost_breakdown.py +26 -3
  17. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/autocomplete.py +268 -0
  18. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/chat_input.py +89 -30
  19. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/debug_console.py +3 -1
  20. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/startup_tip.py +2 -1
  21. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/thread_selector.py +17 -5
  22. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/ui.py +9 -1
  23. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/pyproject.toml +8 -8
  24. deepagents_code-0.1.75/tests/integration_tests/benchmarks/test_thread_loading_benchmarks.py +165 -0
  25. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/smoke_tests/snapshots/system_prompt_headless_local.md +4 -0
  26. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +4 -0
  27. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_app.py +136 -0
  28. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_auto_mode.py +527 -542
  29. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_debug_console.py +31 -0
  30. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_hooks.py +11 -0
  31. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_input_parsing.py +8 -0
  32. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_model_retry.py +36 -2
  33. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_session_stats.py +43 -0
  34. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_sessions.py +65 -1
  35. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_text_encoding.py +19 -2
  36. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_autocomplete.py +68 -0
  37. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_chat_input.py +159 -0
  38. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -4
  39. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/uv.lock +24 -22
  40. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/.gitignore +0 -0
  41. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/AGENTS.md +0 -0
  42. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/ARCHITECTURE.md +0 -0
  43. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/COMMANDS.md +0 -0
  44. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/DEVELOPMENT.md +0 -0
  45. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/EXTENSIONS.md +0 -0
  46. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/HOOKS.md +0 -0
  47. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/LICENSE +0 -0
  48. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/Makefile +0 -0
  49. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/PRICING.md +0 -0
  50. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/README.md +0 -0
  51. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/__init__.py +0 -0
  52. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/__main__.py +0 -0
  53. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_ask_user_types.py +0 -0
  54. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_cli_context.py +0 -0
  55. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_constants.py +0 -0
  56. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_content_blocks.py +0 -0
  57. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_debug.py +0 -0
  58. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_debug_buffer.py +0 -0
  59. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_dep_floor_check.py +0 -0
  60. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_env_vars.py +0 -0
  61. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_fake_models.py +0 -0
  62. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_git.py +0 -0
  63. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_glm_5p2_profile.py +0 -0
  64. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_home_error.py +0 -0
  65. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_invocation.py +0 -0
  66. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_markdown.py +0 -0
  67. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_paths.py +0 -0
  68. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_repository_bounds.py +0 -0
  69. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_reserved_names.py +0 -0
  70. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_server_config.py +0 -0
  71. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_startup_error.py +0 -0
  72. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_terminal_stderr.py +0 -0
  73. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_testing_models.py +0 -0
  74. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_textual_patches.py +0 -0
  75. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_tool_stream.py +0 -0
  76. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/_tracing.py +0 -0
  77. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/acp.py +0 -0
  78. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/agent.py +0 -0
  79. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/app.tcss +0 -0
  80. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/approval_mode.py +0 -0
  81. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/ask_user.py +0 -0
  82. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/auth_display.py +0 -0
  83. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/auth_store.py +0 -0
  84. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/built_in_skills/__init__.py +0 -0
  85. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
  86. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
  87. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  88. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  89. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  90. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  91. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/bundled_prices.README.md +0 -0
  92. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/bundled_prices.json +0 -0
  93. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/client/__init__.py +0 -0
  94. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/client/commands/__init__.py +0 -0
  95. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/client/commands/auth.py +0 -0
  96. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/client/commands/config.py +0 -0
  97. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/client/commands/extras.py +0 -0
  98. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/client/commands/mcp.py +0 -0
  99. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/client/commands/tools.py +0 -0
  100. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/client/launch/__init__.py +0 -0
  101. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/client/launch/server.py +0 -0
  102. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/client/launch/server_manager.py +0 -0
  103. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/client/remote_client.py +0 -0
  104. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/clipboard.py +0 -0
  105. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/cold_cache.py +0 -0
  106. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/command_registry.py +0 -0
  107. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/config.py +0 -0
  108. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/config_manifest.py +0 -0
  109. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/configurable_model.py +0 -0
  110. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/configuration/__init__.py +0 -0
  111. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/configuration/interpreter.py +0 -0
  112. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/configuration/paths.py +0 -0
  113. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/configuration/provider.py +0 -0
  114. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/configuration/providers.py +0 -0
  115. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/configuration/resolver.py +0 -0
  116. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/configuration/service.py +0 -0
  117. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/configuration/theme_resolution.py +0 -0
  118. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/configuration/types.py +0 -0
  119. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/configuration/writer.py +0 -0
  120. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/context_doctor.py +0 -0
  121. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/cost_tracking.py +0 -0
  122. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/default_agent_prompt.md +0 -0
  123. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/diff_utils.py +0 -0
  124. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/doctor.py +0 -0
  125. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/editor.py +0 -0
  126. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/event_bus.py +0 -0
  127. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/extensions/__init__.py +0 -0
  128. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/extensions/api.py +0 -0
  129. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/extensions/discovery.py +0 -0
  130. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/extensions/hosting.py +0 -0
  131. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/extensions/loader.py +0 -0
  132. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/extensions/registry.py +0 -0
  133. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/extensions/runtime.py +0 -0
  134. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/extensions/settings.py +0 -0
  135. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/extensions/trust.py +0 -0
  136. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/extras_info.py +0 -0
  137. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/file_ops.py +0 -0
  138. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/formatting.py +0 -0
  139. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/goal_rubric.py +0 -0
  140. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/goal_state_limits.py +0 -0
  141. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/goal_state_notice.py +0 -0
  142. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/goal_tools.py +0 -0
  143. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/__init__.py +0 -0
  144. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/capabilities.py +0 -0
  145. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/client.py +0 -0
  146. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/client_lifecycle.py +0 -0
  147. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/context.py +0 -0
  148. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/engine.py +0 -0
  149. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/env.py +0 -0
  150. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/envelope.py +0 -0
  151. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/interrupt.py +0 -0
  152. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/loading.py +0 -0
  153. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/manager.py +0 -0
  154. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/migration.py +0 -0
  155. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/models/__init__.py +0 -0
  156. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/models/adapters.py +0 -0
  157. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/models/config.py +0 -0
  158. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/models/domain.py +0 -0
  159. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/models/transport.py +0 -0
  160. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/models/wire.py +0 -0
  161. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/permissions.py +0 -0
  162. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/presenter.py +0 -0
  163. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/projection.py +0 -0
  164. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/reducer.py +0 -0
  165. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/runner.py +0 -0
  166. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/runtime.py +0 -0
  167. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/server_middleware.py +0 -0
  168. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/snapshot.py +0 -0
  169. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/tools.py +0 -0
  170. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/transcript.py +0 -0
  171. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/trust.py +0 -0
  172. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
  173. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/input.py +0 -0
  174. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/integrations/__init__.py +0 -0
  175. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/integrations/openai_codex.py +0 -0
  176. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/integrations/sandbox_config.py +0 -0
  177. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/integrations/sandbox_factory.py +0 -0
  178. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/integrations/sandbox_provider.py +0 -0
  179. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/integrations/sandbox_registry.py +0 -0
  180. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/iterm_cursor_guide.py +0 -0
  181. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/json_types.py +0 -0
  182. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/local_context.py +0 -0
  183. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/managed_tools.py +0 -0
  184. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/mcp_auth.py +0 -0
  185. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/mcp_config.py +0 -0
  186. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/mcp_disabled.py +0 -0
  187. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/mcp_login_service.py +0 -0
  188. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/mcp_middleware.py +0 -0
  189. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/mcp_oauth_ui.py +0 -0
  190. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/mcp_providers/__init__.py +0 -0
  191. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/mcp_providers/_registry.py +0 -0
  192. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/mcp_providers/base.py +0 -0
  193. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/mcp_providers/github.py +0 -0
  194. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/mcp_providers/slack.py +0 -0
  195. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/mcp_proxy.py +0 -0
  196. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/media_utils.py +0 -0
  197. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/memory_guard.py +0 -0
  198. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/model_config.py +0 -0
  199. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/notifications.py +0 -0
  200. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/offload.py +0 -0
  201. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/offload_api.py +0 -0
  202. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/offload_middleware.py +0 -0
  203. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/onboarding.py +0 -0
  204. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/output.py +0 -0
  205. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/paste_collapse.py +0 -0
  206. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/plugins/__init__.py +0 -0
  207. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/plugins/_json.py +0 -0
  208. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/plugins/adapters/__init__.py +0 -0
  209. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/plugins/adapters/hooks.py +0 -0
  210. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/plugins/adapters/mcp.py +0 -0
  211. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/plugins/adapters/skills.py +0 -0
  212. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
  213. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/plugins/commands_cli.py +0 -0
  214. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/plugins/discovery.py +0 -0
  215. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/plugins/manifest.py +0 -0
  216. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/plugins/marketplace.py +0 -0
  217. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/plugins/models.py +0 -0
  218. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/plugins/store.py +0 -0
  219. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/plugins/substitution.py +0 -0
  220. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/project_utils.py +0 -0
  221. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/py.typed +0 -0
  222. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/reasoning_effort.py +0 -0
  223. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/reliable_rubric.py +0 -0
  224. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/resume_state.py +0 -0
  225. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/server_graph.py +0 -0
  226. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/skills/__init__.py +0 -0
  227. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/skills/commands.py +0 -0
  228. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/skills/invocation.py +0 -0
  229. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/skills/load.py +0 -0
  230. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/skills/merge.py +0 -0
  231. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/skills/trust.py +0 -0
  232. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/state_migration.py +0 -0
  233. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/subagents.py +0 -0
  234. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/terminal_capabilities.py +0 -0
  235. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/terminal_escape.py +0 -0
  236. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/theme.py +0 -0
  237. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tool_catalog.py +0 -0
  238. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tool_display.py +0 -0
  239. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tools.py +0 -0
  240. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/__init__.py +0 -0
  241. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/key_hints.py +0 -0
  242. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/modals/__init__.py +0 -0
  243. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/modals/cold_cache.py +0 -0
  244. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/modals/model_switch.py +0 -0
  245. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
  246. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
  247. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
  248. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
  249. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
  250. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
  251. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/modals/prompt_clipboard.py +0 -0
  252. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/modals/prompt_clipboard.tcss +0 -0
  253. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/modals/resume_blocked.py +0 -0
  254. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/modals/resume_compact.py +0 -0
  255. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/modals/session_cost.py +0 -0
  256. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/modals/session_cost.tcss +0 -0
  257. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/screens/__init__.py +0 -0
  258. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/textual_adapter.py +0 -0
  259. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/__init__.py +0 -0
  260. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/_condense_path.py +0 -0
  261. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
  262. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
  263. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  264. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/_links.py +0 -0
  265. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
  266. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/agent_selector.py +0 -0
  267. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/approval.py +0 -0
  268. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/ask_user.py +0 -0
  269. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/auth.py +0 -0
  270. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
  271. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  272. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/context_usage.py +0 -0
  273. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  274. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/diff.py +0 -0
  275. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  276. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/goal_review.py +0 -0
  277. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/goal_status.py +0 -0
  278. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/history.py +0 -0
  279. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  280. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/launch_init.py +0 -0
  281. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/loading.py +0 -0
  282. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  283. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  284. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
  285. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/message_store.py +0 -0
  286. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/messages.py +0 -0
  287. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/model_selector.py +0 -0
  288. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/notification_center.py +0 -0
  289. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  290. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  291. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/prompt_search.py +0 -0
  292. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
  293. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  294. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/status.py +0 -0
  295. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  296. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  297. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
  298. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  299. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  300. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/update_available.py +0 -0
  301. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  302. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/update_progress.py +0 -0
  303. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/welcome.py +0 -0
  304. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
  305. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/unicode_security.py +0 -0
  306. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/update_check.py +0 -0
  307. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/workspace.py +0 -0
  308. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/deepagents_code/workspace_diagnostics.py +0 -0
  309. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/examples/extensions/memory_store.py +0 -0
  310. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/examples/skills/arxiv-search/SKILL.md +0 -0
  311. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  312. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/examples/skills/langgraph-docs/SKILL.md +0 -0
  313. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/examples/skills/skill-creator/SKILL.md +0 -0
  314. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  315. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  316. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/examples/skills/web-research/SKILL.md +0 -0
  317. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/hatch_build.py +0 -0
  318. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/images/debug-console-cost-breakdown.png +0 -0
  319. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/images/model-stream-retry.png +0 -0
  320. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/images/tui.png +0 -0
  321. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/scripts/check_imports.py +0 -0
  322. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/scripts/check_process_cwd.py +0 -0
  323. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/scripts/debug_server.sh +0 -0
  324. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/scripts/generate_commands_catalog.py +0 -0
  325. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/scripts/install.sh +0 -0
  326. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/README.md +0 -0
  327. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/integration_tests/__init__.py +0 -0
  328. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/integration_tests/benchmarks/__init__.py +0 -0
  329. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  330. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
  331. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  332. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/integration_tests/conftest.py +0 -0
  333. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/integration_tests/test_acp_mode.py +0 -0
  334. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  335. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/integration_tests/test_compact_resume.py +0 -0
  336. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/integration_tests/test_offload_server_side.py +0 -0
  337. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/integration_tests/test_pending_work_recovery.py +0 -0
  338. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/integration_tests/test_sandbox_factory.py +0 -0
  339. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/integration_tests/test_sandbox_operations.py +0 -0
  340. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/__init__.py +0 -0
  341. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/client/__init__.py +0 -0
  342. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/client/commands/__init__.py +0 -0
  343. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/client/commands/test_auth.py +0 -0
  344. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/client/commands/test_extras.py +0 -0
  345. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/client/commands/test_mcp.py +0 -0
  346. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/client/commands/test_tools.py +0 -0
  347. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/conftest.py +0 -0
  348. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  349. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/hooks/__init__.py +0 -0
  350. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/hooks/models/__init__.py +0 -0
  351. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/hooks/models/test_models.py +0 -0
  352. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
  353. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/hooks/test_configuration.py +0 -0
  354. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/hooks/test_engine.py +0 -0
  355. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/hooks/test_execution.py +0 -0
  356. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/hooks/test_manager.py +0 -0
  357. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/hooks/test_presenter.py +0 -0
  358. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/hooks/test_server_lifecycle.py +0 -0
  359. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/hooks/test_transcript.py +0 -0
  360. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/hooks/test_trust.py +0 -0
  361. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/plugins/__init__.py +0 -0
  362. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/plugins/test_marketplace.py +0 -0
  363. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
  364. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
  365. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/skills/__init__.py +0 -0
  366. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/skills/test_commands.py +0 -0
  367. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/skills/test_load.py +0 -0
  368. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/skills/test_merge.py +0 -0
  369. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  370. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/skills/test_skills_json.py +0 -0
  371. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
  372. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  373. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  374. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
  375. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test__tool_stream.py +0 -0
  376. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_acp.py +0 -0
  377. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_agent.py +0 -0
  378. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_agent_friendly.py +0 -0
  379. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_approval_mode.py +0 -0
  380. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_args.py +0 -0
  381. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  382. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_ask_user_types.py +0 -0
  383. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_auth_display.py +0 -0
  384. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_auth_store.py +0 -0
  385. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  386. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_charset.py +0 -0
  387. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_cli_provider.py +0 -0
  388. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_clipboard.py +0 -0
  389. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  390. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_cold_cache.py +0 -0
  391. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_command_registry.py +0 -0
  392. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_compact_tool.py +0 -0
  393. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_config.py +0 -0
  394. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_config_manifest.py +0 -0
  395. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_configurable_model.py +0 -0
  396. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_configuration.py +0 -0
  397. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_configuration_resolution.py +0 -0
  398. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_configuration_resolver.py +0 -0
  399. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_context_doctor.py +0 -0
  400. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_cost_tracking.py +0 -0
  401. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_cursor_style.py +0 -0
  402. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_debug.py +0 -0
  403. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_debug_buffer.py +0 -0
  404. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_dep_floor_check.py +0 -0
  405. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_diff_utils.py +0 -0
  406. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_doctor.py +0 -0
  407. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_editor.py +0 -0
  408. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_end_to_end.py +0 -0
  409. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_env_vars.py +0 -0
  410. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_event_bus.py +0 -0
  411. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_exception_handling.py +0 -0
  412. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_extension_api.py +0 -0
  413. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_extension_cli_trust.py +0 -0
  414. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_extension_config_manifest.py +0 -0
  415. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_extension_discovery.py +0 -0
  416. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_extension_display.py +0 -0
  417. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_extension_host_runtime.py +0 -0
  418. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_extension_hosting.py +0 -0
  419. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_extension_runtime.py +0 -0
  420. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_extra_skills_dirs.py +0 -0
  421. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_extras_info.py +0 -0
  422. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_file_ops.py +0 -0
  423. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_formatting.py +0 -0
  424. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_git.py +0 -0
  425. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
  426. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_goal_criteria_client.py +0 -0
  427. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_goal_rubric.py +0 -0
  428. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_goal_state_limits.py +0 -0
  429. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_goal_state_notice.py +0 -0
  430. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_goal_state_persistence.py +0 -0
  431. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_goal_tools.py +0 -0
  432. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_hatch_build.py +0 -0
  433. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_imports.py +0 -0
  434. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_install_command.py +0 -0
  435. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_install_script.py +0 -0
  436. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_invocation.py +0 -0
  437. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  438. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_json_types.py +0 -0
  439. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_local_context.py +0 -0
  440. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_main.py +0 -0
  441. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_main_acp_mode.py +0 -0
  442. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_main_args.py +0 -0
  443. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_managed_tools.py +0 -0
  444. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_mcp_auth.py +0 -0
  445. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_mcp_config.py +0 -0
  446. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_mcp_disabled.py +0 -0
  447. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_mcp_lifecycle.py +0 -0
  448. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_mcp_login_service.py +0 -0
  449. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  450. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_mcp_proxy.py +0 -0
  451. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_mcp_schema.py +0 -0
  452. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_mcp_tools.py +0 -0
  453. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_media_utils.py +0 -0
  454. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_memory_guard.py +0 -0
  455. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_model_config.py +0 -0
  456. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_model_switch.py +0 -0
  457. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_non_interactive.py +0 -0
  458. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_notifications.py +0 -0
  459. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_offload.py +0 -0
  460. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_offload_api.py +0 -0
  461. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_onboarding.py +0 -0
  462. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  463. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_output.py +0 -0
  464. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_paths.py +0 -0
  465. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_process_cwd_check.py +0 -0
  466. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_reasoning_effort.py +0 -0
  467. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_reliable_rubric.py +0 -0
  468. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_reload.py +0 -0
  469. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_remote_client.py +0 -0
  470. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_repository_bounds.py +0 -0
  471. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_resume_compaction_recovery.py +0 -0
  472. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_resume_state.py +0 -0
  473. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_rubric_cli.py +0 -0
  474. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_sandbox_config.py +0 -0
  475. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_sandbox_factory.py +0 -0
  476. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_sandbox_provider.py +0 -0
  477. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_sandbox_registry.py +0 -0
  478. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_server.py +0 -0
  479. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_server_config.py +0 -0
  480. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_server_graph.py +0 -0
  481. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_server_helpers.py +0 -0
  482. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_server_manager.py +0 -0
  483. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_server_tracing.py +0 -0
  484. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_shell_allow_list.py +0 -0
  485. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_skill_invocation.py +0 -0
  486. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  487. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_state_migration.py +0 -0
  488. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_subagents.py +0 -0
  489. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  490. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_terminal_escape.py +0 -0
  491. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  492. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_terminal_stderr.py +0 -0
  493. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_textual_patches.py +0 -0
  494. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_theme.py +0 -0
  495. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_threads_resume.py +0 -0
  496. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_tool_catalog.py +0 -0
  497. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_tool_display.py +0 -0
  498. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_tracing.py +0 -0
  499. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_tracing_replicas.py +0 -0
  500. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  501. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_ui.py +0 -0
  502. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_unicode_security.py +0 -0
  503. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_uninstall_command.py +0 -0
  504. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_update_check.py +0 -0
  505. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_version.py +0 -0
  506. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_workspace.py +0 -0
  507. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/test_workspace_diagnostics.py +0 -0
  508. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tools/__init__.py +0 -0
  509. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tools/test_current_thread.py +0 -0
  510. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  511. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
  512. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tools/test_web_search.py +0 -0
  513. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/__init__.py +0 -0
  514. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/modals/__init__.py +0 -0
  515. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
  516. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
  517. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/modals/test_cold_cache.py +0 -0
  518. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/modals/test_model_switch.py +0 -0
  519. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/modals/test_prompt_clipboard.py +0 -0
  520. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/modals/test_resume_blocked.py +0 -0
  521. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/modals/test_session_cost.py +0 -0
  522. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/test_key_hints.py +0 -0
  523. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/test_modal_footer_layout.py +0 -0
  524. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  525. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
  526. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  527. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  528. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  529. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
  530. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
  531. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
  532. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_condense_path.py +0 -0
  533. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
  534. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  535. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  536. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
  537. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  538. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
  539. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  540. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  541. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  542. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  543. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  544. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  545. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
  546. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
  547. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
  548. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
  549. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  550. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  551. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
  552. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_prompt_search.py +0 -0
  553. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  554. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  555. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
  556. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_status.py +0 -0
  557. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  558. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
  559. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  560. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  561. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  562. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
  563. {deepagents_code-0.1.73 → deepagents_code-0.1.75}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
@@ -2,6 +2,32 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.75](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.74...deepagents-code==0.1.75) (2026-09-23)
6
+
7
+ ### Bug Fixes
8
+
9
+ - Lazy MCP caches now warm without blocking the event loop.
10
+ - Token and cost breakdowns now refresh while the view is open.
11
+
12
+ ## [0.1.74](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.73...deepagents-code==0.1.74) (2026-09-23)
13
+
14
+ ### Features
15
+
16
+ - Added inline thread mentions & picker via `@@` ([#6197](https://github.com/langchain-ai/deepagents/pull/6197)).
17
+ - Usage summaries now show human invocations ([#6500](https://github.com/langchain-ai/deepagents/pull/6500)).
18
+
19
+ ### Bug Fixes
20
+
21
+ - Retry bare `openai.APIError` exceptions raised mid-stream ([#6499](https://github.com/langchain-ai/deepagents/pull/6499)).
22
+ - Keep prompt recall results out of the file picker ([#6494](https://github.com/langchain-ai/deepagents/pull/6494)).
23
+ - Read `hooks.json` as UTF-8 in the legacy hook loader ([#6501](https://github.com/langchain-ai/deepagents/pull/6501)).
24
+
25
+ ### Performance Improvements
26
+
27
+ - Reuse Auto classifier history ([#6056](https://github.com/langchain-ai/deepagents/pull/6056)).
28
+ - Rank checkpoint and message row IDs before loading blobs and prompts ([#6488](https://github.com/langchain-ai/deepagents/pull/6488), [#6489](https://github.com/langchain-ai/deepagents/pull/6489)).
29
+ - Log thread-loading phase timings ([#6490](https://github.com/langchain-ai/deepagents/pull/6490)).
30
+
5
31
  ## [0.1.73](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.72...deepagents-code==0.1.73) (2026-09-22)
6
32
 
7
33
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: deepagents-code
3
- Version: 0.1.73
3
+ Version: 0.1.75
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://www.langchain.com/dcode
6
6
  Project-URL: Documentation, https://docs.langchain.com/oss/deepagents/code/overview
@@ -30,14 +30,14 @@ Requires-Python: <4.0,>=3.12
30
30
  Requires-Dist: aiosqlite<1.0.0,>=0.22.1
31
31
  Requires-Dist: anyio<5.0.0,>=4.14.2
32
32
  Requires-Dist: deepagents-acp<1.0.0,>=0.0.10
33
- Requires-Dist: deepagents==0.7.17
33
+ Requires-Dist: deepagents==0.7.18
34
34
  Requires-Dist: fastmcp<5.0.0,>=4.0.0b4
35
35
  Requires-Dist: filelock<3.30,>=3.29.7
36
- Requires-Dist: genai-prices<0.2.0,>=0.1.7
36
+ Requires-Dist: genai-prices<0.2.0,>=0.1.8
37
37
  Requires-Dist: httpx<1.0.0,>=0.28.1
38
- Requires-Dist: langchain-anthropic<2.0.0,>=1.7.2
38
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.7.3
39
39
  Requires-Dist: langchain-google-genai<5.0.0,>=4.4.0
40
- Requires-Dist: langchain-openai<2.0.0,>=1.6.3
40
+ Requires-Dist: langchain-openai<2.0.0,>=1.6.4
41
41
  Requires-Dist: langchain-quickjs<0.4.0,>=0.3.4
42
42
  Requires-Dist: langchain<2.0.0,>=1.4.2
43
43
  Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.1
@@ -66,7 +66,7 @@ Provides-Extra: agentcore
66
66
  Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.5; extra == 'agentcore'
67
67
  Provides-Extra: all-providers
68
68
  Requires-Dist: aiohttp<3.15.0,>=3.14.3; extra == 'all-providers'
69
- Requires-Dist: langchain-anthropic<2.0.0,>=1.7.2; extra == 'all-providers'
69
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.7.3; extra == 'all-providers'
70
70
  Requires-Dist: langchain-aws<2.0.0,>=1.7.9; extra == 'all-providers'
71
71
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.4; extra == 'all-providers'
72
72
  Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
@@ -77,12 +77,12 @@ Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.4; extra == 'all-providers'
77
77
  Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'all-providers'
78
78
  Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'all-providers'
79
79
  Requires-Dist: langchain-ibm<2.0.0,>=1.1.0; extra == 'all-providers'
80
- Requires-Dist: langchain-litellm<2.0.0,>=0.7.2; extra == 'all-providers'
80
+ Requires-Dist: langchain-litellm<2.0.0,>=0.8.0; extra == 'all-providers'
81
81
  Requires-Dist: langchain-meta<2.0.0,>=0.5.0; extra == 'all-providers'
82
82
  Requires-Dist: langchain-mistralai<2.0.0,>=1.1.6; extra == 'all-providers'
83
83
  Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'all-providers'
84
84
  Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
85
- Requires-Dist: langchain-openai<2.0.0,>=1.6.3; extra == 'all-providers'
85
+ Requires-Dist: langchain-openai<2.0.0,>=1.6.4; extra == 'all-providers'
86
86
  Requires-Dist: langchain-openrouter<2.0.0,>=0.2.9; extra == 'all-providers'
87
87
  Requires-Dist: langchain-perplexity<2.0.0,>=1.4.1; extra == 'all-providers'
88
88
  Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'all-providers'
@@ -94,7 +94,7 @@ Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
94
94
  Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
95
95
  Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
96
96
  Provides-Extra: anthropic
97
- Requires-Dist: langchain-anthropic<2.0.0,>=1.7.2; extra == 'anthropic'
97
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.7.3; extra == 'anthropic'
98
98
  Provides-Extra: baseten
99
99
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.4; extra == 'baseten'
100
100
  Provides-Extra: bedrock
@@ -116,7 +116,7 @@ Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'huggingface'
116
116
  Provides-Extra: ibm
117
117
  Requires-Dist: langchain-ibm<2.0.0,>=1.1.0; extra == 'ibm'
118
118
  Provides-Extra: litellm
119
- Requires-Dist: langchain-litellm<2.0.0,>=0.7.2; extra == 'litellm'
119
+ Requires-Dist: langchain-litellm<2.0.0,>=0.8.0; extra == 'litellm'
120
120
  Provides-Extra: media
121
121
  Requires-Dist: av<19.0.0,>=18.0.0; extra == 'media'
122
122
  Requires-Dist: pillow<13.0.0,>=12.3.0; extra == 'media'
@@ -132,7 +132,7 @@ Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'nvidia'
132
132
  Provides-Extra: ollama
133
133
  Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'ollama'
134
134
  Provides-Extra: openai
135
- Requires-Dist: langchain-openai<2.0.0,>=1.6.3; extra == 'openai'
135
+ Requires-Dist: langchain-openai<2.0.0,>=1.6.4; extra == 'openai'
136
136
  Provides-Extra: openrouter
137
137
  Requires-Dist: langchain-openrouter<2.0.0,>=0.2.9; extra == 'openrouter'
138
138
  Provides-Extra: perplexity
@@ -15,7 +15,7 @@
15
15
  - Interactive TUI (`app.py`, `tui/textual_adapter.py`, `tui/widgets/`)
16
16
  - Non-interactive pipeline runner (`client/non_interactive.py`)
17
17
  - Agent creation (`agent.py`)
18
- - Built-in tools (`tools.py`: `http_request`, `web_search`, `fetch_url`)
18
+ - Built-in tools (`tools.py`: `web_search`, `fetch_url`)
19
19
  - MCP config loader and per-server allow/deny lists (`mcp_tools.py`, `model_config.py`)
20
20
  - Hook runtimes (`hooks/`)
21
21
  - Sandbox integration factory (`integrations/sandbox_factory.py`, `integrations/sandbox_provider.py`)
@@ -63,7 +63,9 @@
63
63
 
64
64
  ## System Overview
65
65
 
66
- `deepagents-code` is a terminal-based AI coding assistant. It wraps the `deepagents` SDK in an interactive TUI (Textual) and a headless non-interactive mode. Both modes route agent execution through a local `langgraph dev` subprocess: the CLI spawns a server, passes configuration via `DA_SERVER_*` environment variables, and communicates via a `RemoteAgent` HTTP+SSE client. The agent receives user prompts, reasons with a configurable LLM, and executes side-effecting tools (file read/write, shell commands, web search, HTTP requests) subject to a human-in-the-loop (HITL) approval gate. Sessions are persisted in a local SQLite checkpoint database. Users can extend the agent with MCP servers (stdio processes or remote HTTP/SSE endpoints), hooks (event-driven subprocesses), custom subagents (AGENTS.md files in `.deepagents/agents/`), async remote subagents (LangGraph deployments configured in `config.toml`), and pluggable sandbox backends for remote code execution.
66
+ `deepagents-code` is a terminal-based AI coding assistant. It wraps the `deepagents` SDK in an interactive TUI (Textual) and a headless non-interactive mode. Both modes route agent execution through a local `langgraph dev` subprocess: the CLI spawns a server, passes configuration via `DA_SERVER_*` environment variables, and communicates via a `RemoteAgent` HTTP+SSE client. The agent receives user prompts, reasons with a configurable LLM, and executes side-effecting tools (file read/write, shell commands, web search, HTTP requests) subject to the selected approval mode and configured policies (not universally to human approval). Sessions are persisted in a local SQLite checkpoint database. Users can extend the agent with MCP servers (stdio processes or remote HTTP/SSE endpoints), hooks (event-driven subprocesses), custom subagents (AGENTS.md files in `.deepagents/agents/`), async remote subagents (LangGraph deployments configured in `config.toml`), and pluggable sandbox backends for remote code execution.
67
+
68
+ Non-interactive mode (`-n` or piped stdin) does not ask for human tool approvals. Non-shell tools, including file mutations and permitted network requests, run unattended by default. Shell execution is disabled unless a shell allow-list is configured; configured permission hooks remain effective (TB2). Disabling shell execution does not make a run read-only or confine local filesystem access to the project: the local backend uses `virtual_mode=False`, so absolute paths and relative paths escaping the project remain accessible subject to OS permissions. Untrusted repository content and tool output can influence an unattended agent. Human approval, automated permission hooks, shell policy, HTTP URL protections, and sandbox isolation are distinct controls, not substitutes for one another.
67
69
 
68
70
  ### Architecture Diagram
69
71
 
@@ -138,7 +140,7 @@
138
140
  | C1 | CLI Entry Point | Parses argv, loads config/env, bootstraps session | framework-controlled | Yes | `main.cli_main`, `main.parse_args` |
139
141
  | C2 | TUI / Non-interactive | Textual UI for interactive chat; `client/non_interactive.py` for headless pipelines (both use `RemoteAgent`) | framework-controlled | Yes | `app.DeepAgentsApp.run`, `client.non_interactive.run_non_interactive` |
140
142
  | C3 | Agent Engine | LangGraph agent graph running inside `langgraph dev` server, assembled by `create_cli_agent` | framework-controlled | Yes | `agent.create_cli_agent`, `agent._add_interrupt_on`, `server_graph.make_graph` |
141
- | C4 | Built-in Tools | `http_request`, `web_search` (Tavily), `fetch_url` (HTML→markdown) | framework-controlled | Partial¹ | `tools.http_request`, `tools.web_search`, `tools.fetch_url` |
143
+ | C4 | Built-in Tools | `web_search` (Tavily), `fetch_url` (HTML→markdown) | framework-controlled | Partial¹ | `tools.web_search`, `tools.fetch_url` |
142
144
  | C5 | MCP Loader & Trust | Discovers/loads `.mcp.json`, validates server configs, applies per-server allow/deny lists + interactive approval | framework-controlled | No² | `mcp_tools.resolve_and_load_mcp_tools`, `model_config.load_mcp_server_trust_lists`, `main._check_mcp_project_trust` |
143
145
  | C6 | Hook Runtime | Fires subprocess commands on agent lifecycle events | framework-controlled | No³ | `hooks.runtime.HooksRuntime`, `hooks.runner.run_command_handler` |
144
146
  | C7 | Sandbox Integration | Creates/destroys remote sandboxes (Daytona, LangSmith, Modal, Runloop, AgentCore) | framework-controlled | No⁴ | `integrations.sandbox_factory.create_sandbox` |
@@ -156,7 +158,7 @@
156
158
  | C19 | Goal/Rubric State Notice | Projects persisted goal objectives, active criteria, and status notes into synthetic messages for the primary model | framework-controlled | Yes | `goal_state_notice.build_goal_state_notice`, `goal_tools.GoalToolsMiddleware` |
157
159
 
158
160
  **Notes:**
159
- 1. `http_request` and `fetch_url` enabled by default; `web_search` requires `TAVILY_API_KEY`.
161
+ 1. `fetch_url` enabled by default; `web_search` requires `TAVILY_API_KEY`.
160
162
  2. MCP servers only load if `.mcp.json` config files are present.
161
163
  3. User hooks load from `~/.deepagents/hooks.json`. Project hooks load from `.deepagents/hooks.json` only after interactive workspace trust or the headless `--trust-project-hooks` opt-in.
162
164
  4. Sandbox mode requires explicit `--sandbox` CLI flag.
@@ -219,7 +221,7 @@
219
221
  | ID | Boundary | Description | Controls (Inside) | Does NOT Control (Outside) |
220
222
  |------|---------------------------------------|----------------------------------------------------------------------------|---------------------------------------------------------------------------------|---------------------------------------------------------------|
221
223
  | TB1 | User Input → Agent Engine | Where user-typed prompts enter the agent graph | Prompt routing, session threading, UI rendering | Prompt content — any text accepted |
222
- | TB2 | LLM Decision → Tool Execution | HITL gate on all side-effecting tool calls | Interrupt map, allow-list check, auto-approve toggle | LLM reasoning; what user approves |
224
+ | TB2 | LLM Decision → Tool Execution | Approval-mode-dependent gating of configured tools | Interrupt map, permission hooks, shell allow-list, approval mode | LLM reasoning; what user approves |
223
225
  | TB3 | Tool Result → LLM Context | Tool outputs re-enter the context window | Unicode warnings on URLs in args; markdownify HTML conversion | Content of fetched web pages, MCP responses, search results |
224
226
  | TB4 | MCP Config → Process / Network | `.mcp.json` triggers subprocess spawn or network connection | Schema validation; per-server allow/deny lists + interactive approval prompt | What the MCP process does once trusted and running |
225
227
  | TB5 | Hooks Config → Subprocess | `hooks.json` commands execute as local subprocesses | Workspace trust for project hooks, schema validation, bounded execution, sanitized environment | Command content (user-authored) |
@@ -243,10 +245,11 @@
243
245
 
244
246
  #### TB2: LLM Decision → Tool Execution Gate (HITL)
245
247
 
246
- - **Inside**: `agent._add_interrupt_on` registers interrupt configs for `execute`, `write_file`, `edit_file`, `web_search`, `fetch_url`, `task`, `compact_conversation`, `launch_async_subagent`, `update_async_subagent`, `cancel_async_subagent`. In non-interactive mode, `client.non_interactive._handle_action_request` enforces the shell allow-list via `config.is_shell_command_allowed`.
247
- - **Outside**: Once the user clicks "approve" (interactive) or a command passes the allow-list check (non-interactive), the tool executes with no further framework-level gating.
248
- - **Crossing mechanism**: LangGraph HITL interrupt routed through `RemoteAgent` SSE stream.
249
- - **Key note**: `auto_approve` mode bypasses all HITL approval prompts while still displaying Unicode/URL warnings.
248
+ - **Inside**: `agent._add_interrupt_on` configures gated tools, including shell execution, file mutations, web search, URL fetching, and delegation. Interactive Manual mode routes these calls through HITL; read-only tools do not all prompt. Auto uses automated review, while YOLO bypasses human approval.
249
+ - **Non-interactive**: Without configured `PermissionRequest` hooks, `run_non_interactive` selects auto-approval when shell is disabled or unrestricted (`all`); with a restrictive shell allow-list, `create_cli_agent` omits HITL middleware and installs `ShellAllowListMiddleware`. Non-shell tools run unattended in both cases.
250
+ - **Permission-hook exception**: Configured `PermissionRequest` handlers disable those middleware shortcuts so gated calls reach the client. `_process_hitl_interrupts` uses hook decisions first, including allow, deny, or interruption; unresolved calls fall back to `_make_hitl_decision`, which approves non-shell tools and checks shell commands against the allow-list (rejecting them when none is configured). A hook-provided decision takes precedence over that fallback. This is automated policy handling, not a human prompt.
251
+ - **Outside**: Approval does not validate model intent or isolate execution. Tool-specific URL checks, configured hooks, backend access rules, and OS/sandbox restrictions remain separate controls.
252
+ - **Crossing mechanism**: When installed and applicable to the approval mode, LangGraph HITL interrupts are routed through the `RemoteAgent` SSE stream. Non-interactive runs resolve them programmatically.
250
253
  - **Key note**: This boundary gates the *model-initiated* `compact_conversation` tool.
251
254
  - **Authorization**: The explicit `/offload` command does *not* cross it. C18 invokes the agent's shared compaction service directly, with no tool node and no synthetic message. The slash command is the authorization.
252
255
  - **Hook events**: The operation still dispatches `PreCompact` and `PreToolUse` against an in-memory forced call. Hooks may veto or interrupt. The TUI returns opaque hook replies over the operation protocol.
@@ -367,7 +370,7 @@
367
370
  | DF4 | C11 LangGraph Dev Server | C12 RemoteAgent | SSE stream (AI responses, tool calls, interrupts) | DC2 | TB10 | HTTP+SSE (localhost) |
368
371
  | DF5 | C3 Agent | External LLM | System prompt + message history | DC1, DC2 | TB7 | HTTPS / LangChain |
369
372
  | DF6 | External LLM | C3 Agent | AI response + tool call decisions | — | TB7 | HTTPS / LangChain |
370
- | DF7 | C3 Agent | C4 Tools | Tool call arguments (file/URL/command) | — | TB2 | Function call + HITL |
373
+ | DF7 | C3 Agent | C4 Tools | Tool call arguments (file/URL/command) | — | TB2 | Function call + mode-dependent approval |
371
374
  | DF8 | External | C4 Tools | HTTP response bodies (web/API content) | — | TB3 | HTTPS |
372
375
  | DF9 | C4 Tools | C3 Agent | Tool results (file content, web pages) | — | TB3 | ToolMessage |
373
376
  | DF10 | C9 Config | C1 Entry | TOML config, env vars, API keys | DC1 | None | File + environ |
@@ -398,7 +401,7 @@
398
401
 
399
402
  - **Data**: Arbitrary HTML/JSON from the internet, converted to markdown by `markdownify`. Can be megabytes.
400
403
  - **Validation**: URL domain checked for Unicode spoofing / script mixing (`unicode_security.check_url_safety`); displayed as warning in approval dialog. Content not scanned for prompt-injection patterns.
401
- - **Trust assumption**: User approved the fetch. Content is data — but the LLM may interpret adversarial content as instructions.
404
+ - **Trust assumption**: A permitted fetch is not necessarily human-approved; non-interactive runs fetch unattended by default. `fetch_url` enforces the URL protections in D3 independently of approval mode. Content is data — but the LLM may interpret adversarial content as instructions.
402
405
 
403
406
  #### DF11: MCP Tool Results → Agent Context
404
407
 
@@ -445,7 +448,7 @@
445
448
  | T1 | DF8, DF9 | — | Prompt injection via fetched web content causes LLM to request harmful actions | TB3 | Medium | Likely | `tools.fetch_url`, `agent._add_interrupt_on` |
446
449
  | T2 | DF7 | — | `--shell-allow-list all` removes pattern checks; LLM-injected shell commands execute without approval in non-interactive mode | TB2 | Medium | Verified | `config.is_shell_command_allowed`, `client.non_interactive._handle_action_request` |
447
450
  | T3 | DF7 | — | Unicode-homoglyph URL in LLM-generated tool args deceives user during approval | TB2 | Low | Disproven | `unicode_security.check_url_safety`, `agent._format_fetch_url_description` |
448
- | T4 | DF5, DF9 | — | Auto-approve mode bypasses all HITL gates; any LLM-initiated tool call executes | TB2 | Low | Verified | `agent.create_cli_agent` (`auto_approve` param), `agent._add_interrupt_on` |
451
+ | T4 | DF5, DF9 | — | YOLO and non-interactive operation omit human tool approval; other controls still apply | TB2 | Low | Verified | `agent.create_cli_agent` (`auto_approve` param), `agent._add_interrupt_on` |
449
452
  | T5 | DF13, DF14| DC2 | Local SQLite checkpoint file tampered with to inject adversarial content into future LLM context | None | Low | Unverified | `sessions.get_db_path` |
450
453
  | T6 | DF3, DF4, DF26 | DC2 | Unauthenticated LangGraph dev server on localhost can be accessed by any local process | TB10 | Medium | Verified | `server._build_server_env`, `server._DEFAULT_HOST`, `offload_api.app` |
451
454
  | T7 | DF19, DF20| DC3 | Makefile or project file content injected into system prompt via LocalContextMiddleware | TB9 | Low | Verified | `local_context._section_makefile`, `local_context.LocalContextMiddleware._get_modified_request` |
@@ -465,12 +468,12 @@
465
468
 
466
469
  - **Flow**: DF8 (external web) → DF9 (tool result) → C3 Agent context
467
470
  - **Description**: When the agent calls `fetch_url` or `web_search`, the response body enters the LLM's context window as a `ToolMessage`. A maliciously crafted web page or search snippet can embed natural-language instructions that the LLM may interpret as authoritative commands, leading to unexpected tool call requests in the next turn.
468
- - **Preconditions**: (1) User or LLM-initiated call to `fetch_url`/`web_search` reaches a malicious page; (2) LLM interprets injected instructions as directives; (3) In interactive mode, user must still approve the resulting tool call.
471
+ - **Preconditions**: (1) User or LLM-initiated call to `fetch_url`/`web_search` reaches a malicious page; (2) LLM interprets injected instructions as directives; (3) In interactive Manual mode, gated calls still require approval unless resolved by a configured permission hook; non-interactive calls are resolved without human review.
469
472
 
470
473
  #### T15: Stored Prompt Injection Through Goal/Rubric State
471
474
 
472
475
  - **Flow**: DF28/DF29 (user or local-file content → checkpointed notice → primary-model context)
473
- - **Description**: The goal-state notice embeds the full actionable objective, active criteria, and status note in a synthetic `HumanMessage`. A rubric loaded from an untrusted repository file, or a crafted status note, can therefore persist instructions that influence later model behavior. Bounded superseded notices remain in the append-only request history until compaction; the latest notice identifies itself as authoritative, but a model can still attend to older text. Oversized legacy notices are replaced only in the transient model request. HTML escaping and boundary labels prevent literal tag forgery. They do not stop natural-language prompt injection. Interactive HITL still gates side-effecting tool calls. Auto and non-interactive configurations can reduce that protection.
476
+ - **Description**: The goal-state notice embeds the full actionable objective, active criteria, and status note in a synthetic `HumanMessage`. A rubric loaded from an untrusted repository file, or a crafted status note, can therefore persist instructions that influence later model behavior. Bounded superseded notices remain in the append-only request history until compaction; the latest notice identifies itself as authoritative, but a model can still attend to older text. Oversized legacy notices are replaced only in the transient model request. HTML escaping and boundary labels prevent literal tag forgery. They do not stop natural-language prompt injection. Interactive Manual mode gates configured tools; Auto, YOLO, and non-interactive operation have different approval semantics (TB2).
474
477
  - **Preconditions**: (1) The user accepts a goal/rubric or loads a file containing attacker-controlled instructions; (2) the state is actionable or the rubric remains active; (3) the primary model follows the injected content; (4) for side effects, the resulting tool call is approved or an approval-bypassing mode is active.
475
478
 
476
479
  #### T16: Automatic Disclosure of File-Loaded Rubrics
@@ -497,11 +500,11 @@
497
500
  - **Description**: An LLM influenced by adversarial input could generate a `fetch_url` call with a URL containing mixed-script or confusable characters visually identical to ASCII.
498
501
  - **Preconditions**: LLM generates a confusable URL (requires adversarial steering). `check_url_safety` detects mixed-script domain labels and `strip_dangerous_unicode` removes invisible BiDi/zero-width characters; warnings displayed in approval dialog. Classified Disproven as a project vulnerability — the UI warnings are the intended control.
499
502
 
500
- #### T4: Auto-Approve Removes All Execution Safeguards
503
+ #### T4: Unattended Tool Execution Without Human Approval
501
504
 
502
- - **Flow**: DF7 (all tool calls) when `auto_approve=True`
503
- - **Description**: When auto-approve is enabled (via `--auto-approve` flag or `Shift+Tab` in TUI), all tool calls including `execute`, `write_file`, `edit_file`, `fetch_url`, `launch_async_subagent` execute without user confirmation.
504
- - **Preconditions**: User explicitly enables auto-approve. Default is approval-required.
505
+ - **Flow**: DF7 (tool calls), influenced by DF5/DF9 (model context and tool results).
506
+ - **Description**: YOLO bypasses human tool approval. Non-interactive mode also runs non-shell tools, including file mutations and permitted network requests, unattended by default, without requiring a separate auto-approve flag. Shell execution is disabled unless configured through the shell allow-list; `all` removes command-pattern restrictions. Configured permission hooks retain the decision precedence described in TB2. URL protections and OS/sandbox access restrictions still apply: omitting human approval does not remove every security check.
507
+ - **Preconditions**: The user selects YOLO or invokes non-interactive operation (`-n` or piped stdin). Untrusted repository content or tool output can then influence actions without human review. Interactive Manual approval is not a universal default for all modes or every tool. Shell-disabled local runs are neither read-only nor project-confined; use appropriate filesystem permissions and isolation for unattended work.
505
508
 
506
509
  #### T5: Local SQLite Checkpoint Tampering
507
510
 
@@ -600,8 +603,8 @@ Threats that appear valid in isolation but fall outside project responsibility b
600
603
 
601
604
  | Pattern | Why Out of Scope | Project Responsibility Ends At |
602
605
  |-------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------|
603
- | Prompt injection leading to arbitrary code execution (interactive mode) | In interactive mode, every side-effecting tool call requires explicit user approval via the HITL dialog. The user is the final gatekeeper. | Providing HITL for all side-effecting tools (`agent._add_interrupt_on`) and Unicode/URL warnings in the approval dialog. |
604
- | API key exfiltration via LLM-directed `http_request` | `http_request` requires HITL in interactive mode. Keys it could exfiltrate are user-supplied env vars. In non-interactive mode, user has opted into autonomous operation. | Providing HITL gate for HTTP tools. Users control which env vars are in scope. |
606
+ | Prompt injection leading to arbitrary code execution (interactive mode) | In interactive Manual mode, configured gated calls require approval unless resolved by permission hooks. This rationale does not apply to unattended modes or ungated tools. | Providing mode-dependent HITL for configured tools (`agent._add_interrupt_on`) and Unicode/URL warnings in the approval dialog. |
607
+ | Data exfiltration via LLM-directed network requests | Permitted public URLs can carry sensitive data even with SSRF protections. Non-interactive requests run unattended by default; interactive Manual mode gates `fetch_url`. | Enforcing `fetch_url` URL protections and the configured approval policy, not guaranteeing content confidentiality. |
605
608
  | Malicious MCP server injecting prompt instructions | Users configure MCP servers and explicitly trust project-level configs. Once trusted, MCP tool outputs are data from a system the user controls. | Interactive approval prompt + per-server allow/deny lists for project-level configs (`main._check_mcp_project_trust`, `model_config.load_mcp_server_trust_lists`). |
606
609
  | LLM jailbreak / safety bypass | Model selection and safety configuration are user-controlled. The project routes prompts to the configured LLM but cannot guarantee model behavior. | Correctly routing prompts to the configured LLM; applying the system prompt from `agent.get_system_prompt`. |
607
610
  | Sandbox provider security vulnerabilities | Daytona, LangSmith, Modal, Runloop, and AgentCore are third-party services. Their internal security is not this project's responsibility. | Correctly initializing sandbox sessions via `integrations.sandbox_factory.create_sandbox`. |
@@ -612,11 +615,11 @@ Threats that appear valid in isolation but fall outside project responsibility b
612
615
 
613
616
  ### Rationale
614
617
 
615
- **Prompt injection in interactive mode**: The HITL interrupt means every file write, shell command, web search, URL fetch, task delegation, and async subagent action shows the user a confirmation dialog with full tool arguments. Even a successful prompt injection can only execute what the user explicitly approves. The project's responsibility is to make that dialog accurate — hence the Unicode/URL warning layer in `unicode_security.py`.
618
+ **Prompt injection in interactive Manual mode**: Configured gated tools show a confirmation dialog unless a permission hook resolves the request. This does not cover every tool or apply to Auto, YOLO, or non-interactive operation (TB2/T4). Approval UI warnings help users inspect arguments; they do not prevent prompt injection in repository content or tool results.
616
619
 
617
620
  **LangGraph dev server without auth**: The `LANGGRAPH_AUTH_TYPE=noop` setting is intentional for local dev server use. Adding authentication would require users to manage tokens for a locally-spawned ephemeral process, creating more friction than security benefit in this context. The 127.0.0.1 binding limits exposure to the local machine. T6 documents this as an accepted risk for the threat model.
618
621
 
619
- **Custom subagent system prompts**: Subagent definitions in `.deepagents/agents/` are user-authored files. The framework correctly treats them as user-controlled content. The HITL gate on `task` tool calls ensures the user approves subagent delegation before it occurs.
622
+ **Custom subagent system prompts**: Subagent definitions in `.deepagents/agents/` are user-authored files. The framework correctly treats them as user-controlled content. In interactive Manual mode, `task` is gated unless resolved by permission hooks; unattended modes do not promise human approval of delegation.
620
623
 
621
624
  **`class_path` code execution**: This follows the same trust model as `pyproject.toml` build scripts — the user edits their own config file on their own machine. The `issubclass(BaseChatModel)` check provides a post-import guard, though module-level side effects execute before it. Documented as intentional in `model_config.py`.
622
625
 
@@ -637,7 +640,7 @@ Threats that appear valid in isolation but fall outside project responsibility b
637
640
  |----|----------------|---------------|----------|------------|
638
641
  | D1 | Unsafe msgpack deserialization in langgraph checkpoint loading | Verified fix status — confirmed fixed and closed upstream. | Users on current `langgraph` versions are not exposed. | Upstream langgraph has patched the unsafe msgpack deserialization. No longer an active risk. |
639
642
  | D2 | Unicode URL homoglyph as project vulnerability | Traced `check_url_safety` + `strip_dangerous_unicode` + `format_warning_detail` → approval dialog display | `unicode_security.check_url_safety`, `agent._format_fetch_url_description` | Warning system is the intended control — the project correctly surfaces the risk to the user in the approval dialog. Not a project vulnerability; classified as mitigated by design (UI warning). |
640
- | D3 | SSRF via `http_request` / `fetch_url` to internal services | Traced `tools.http_request` and `tools.fetch_url` — no URL scheme or host blocklist. However, both tools require HITL approval in interactive mode. In non-interactive mode, only shell commands are auto-approved via the allow-list; HTTP tools still go through the HITL interrupt gate. | `tools.http_request`, `tools.fetch_url`, `agent._add_interrupt_on` | Not a project vulnerability in isolation — the HITL gate is the intended control for all HTTP tool calls. The user sees the full URL before approving. SSRF is only reachable if the user approves the request (interactive) or enables auto-approve (explicit opt-in). Classified as out-of-scope for the same reason as prompt injection in interactive mode. |
643
+ | D3 | SSRF via built-in URL fetching to internal services | Current `tools.py` exposes `fetch_url`, not `http_request`. `fetch_url` permits only HTTP/HTTPS and rejects hosts resolving to private, loopback, link-local, reserved, multicast, unspecified, or other non-global IPs. Each redirect is revalidated (maximum five); connections are pinned to validated IPs and environment proxies are disabled. | `tools._validate_url`, `tools._is_blocked_ip`, `tools._fetch_with_redirects`, `tools._pinned_dns` | These URL/connection protections apply independently of human approval. Non-interactive fetches run unattended by default, subject to configured hooks. The protections do not prevent disclosure to permitted public destinations or constrain network access through other tools or MCP servers. |
641
644
  | D4 | Offload path injection via archive filename | Checked `SummarizationMiddleware._get_session_id`/`_get_history_path` — the leaf is `session_` plus a `uuid4().hex`. | `SummarizationMiddleware._get_session_id`, `SummarizationMiddleware._get_history_path` | The archive filename is minted by the framework from a UUID4 hex, so no user-controlled path component reaches the file path. Not exploitable. |
642
645
 
643
646
  ---
@@ -668,3 +671,4 @@ Threats that appear valid in isolation but fall outside project responsibility b
668
671
  | 2026-08-24 | langster-threat-model (diff) | Removed the client-seeded `/offload` fallback. `/offload` is now available only through C18 on built-in servers; local in-process and ACP agents do not support it, and custom or older servers without the route fail at the HTTP boundary. Updated DC5, TB2, TB10, and T6 to remove the client self-approval and synthetic-message attack surface. The server route, hook behavior, archive guard, and state-only persistence controls are unchanged; no new threat was identified. |
669
672
  | 2026-08-24 | manual update | The C18 boundary now strips endpoint/proxy/transport keys (`base_url`, `openai_proxy`, `http_client`, and similar) from client-supplied `model_params` before they reach `config.create_model` (`offload_api._strip_transport_model_params`), closing the credential-redirection consequence of T6 for this route. Client-supplied `model` and behavioral params still flow through; in-process `CLIContextSchema` model params remain trusted and unfiltered |
670
673
  | 2026-08-25 | manual update | Stopped replacing bounded superseded goal-state notices in model requests while retaining bounded same-index stand-ins for oversized legacy notices. Goal/rubric history now remains append-only for prompt-cache stability where safe, and the latest notice explicitly supersedes earlier notices. Updated T15 to record the residual risk that a model can still attend to older bounded goal text until compaction. |
674
+ | 2026-09-22 | manual update | Corrected TB2, T4, D3, and related approval claims to describe existing non-interactive behavior, permission-hook exceptions, local filesystem access, and `fetch_url` URL/connection protections. Runtime behavior is unchanged. |
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "d5a1896"
3
+ BUILD_COMMIT = "c526854"
@@ -90,6 +90,9 @@ class ModelStats:
90
90
  request_count: int = 0
91
91
  """Number of LLM API requests made to this model."""
92
92
 
93
+ invocation_count: int = 0
94
+ """Human-submitted turns started with this model."""
95
+
93
96
  input_tokens: int = 0
94
97
  """Cumulative input tokens sent to this model."""
95
98
 
@@ -218,6 +221,9 @@ class SessionStats:
218
221
  recording each chunk separately.
219
222
  """
220
223
 
224
+ invocation_count: int = 0
225
+ """Human-submitted agent turns, attributed to their starting model."""
226
+
221
227
  input_tokens: int = 0
222
228
  """Cumulative input tokens across all LLM requests."""
223
229
 
@@ -250,6 +256,16 @@ class SessionStats:
250
256
  per_kind: dict[UsageKind, KindStats] = field(default_factory=dict)
251
257
  """Per-type breakdown for assistant, nested, and hidden model spend."""
252
258
 
259
+ def record_invocation(self, model_name: str, provider: str = "") -> None:
260
+ """Count one human turn against its configured starting model."""
261
+ self.invocation_count += 1
262
+ model_name = model_name or "Unknown"
263
+ entry = self.per_model.setdefault(
264
+ (provider, model_name),
265
+ ModelStats(provider=provider, model_name=model_name),
266
+ )
267
+ entry.invocation_count += 1
268
+
253
269
  def record_request(
254
270
  self,
255
271
  model_name: str,
@@ -366,7 +382,7 @@ class SessionStats:
366
382
  if cost_usd is not None:
367
383
  entry.cost_usd -= cost_usd
368
384
  entry.priced_request_count -= 1
369
- if entry.request_count <= 0:
385
+ if entry.request_count <= 0 and entry.invocation_count == 0:
370
386
  # The chunk-revision path can move a request to a different
371
387
  # model once the final chunk names one; drop the row it
372
388
  # vacated so the breakdown does not show an empty entry.
@@ -381,6 +397,7 @@ class SessionStats:
381
397
  other: The stats to fold in.
382
398
  """
383
399
  self.request_count += other.request_count
400
+ self.invocation_count += other.invocation_count
384
401
  self.input_tokens += other.input_tokens
385
402
  self.output_tokens += other.output_tokens
386
403
  self.cache_read_tokens += other.cache_read_tokens
@@ -394,6 +411,7 @@ class SessionStats:
394
411
  ModelStats(provider=ms.provider, model_name=ms.model_name),
395
412
  )
396
413
  entry.request_count += ms.request_count
414
+ entry.invocation_count += ms.invocation_count
397
415
  entry.input_tokens += ms.input_tokens
398
416
  entry.output_tokens += ms.output_tokens
399
417
  entry.cost_usd += ms.cost_usd
@@ -1489,7 +1507,9 @@ def print_usage_table(
1489
1507
  from rich.table import Table
1490
1508
 
1491
1509
  has_time = wall_time >= 0.1 # noqa: PLR2004
1492
- if not (stats.request_count or stats.input_tokens or has_time):
1510
+ if not (
1511
+ stats.request_count or stats.input_tokens or stats.invocation_count or has_time
1512
+ ):
1493
1513
  return
1494
1514
 
1495
1515
  if stats.per_model:
@@ -1505,6 +1525,7 @@ def print_usage_table(
1505
1525
  table.add_column("Provider", style="dim")
1506
1526
  table.add_column("Model", style="dim")
1507
1527
  table.add_column("Reqs", justify="right", style="dim")
1528
+ table.add_column("Invocations", justify="right", style="dim")
1508
1529
  table.add_column("InputTok", justify="right", style="dim")
1509
1530
  table.add_column("OutputTok", justify="right", style="dim")
1510
1531
  table.add_column("Cost", justify="right", style="dim")
@@ -1515,6 +1536,7 @@ def print_usage_table(
1515
1536
  ms.provider,
1516
1537
  ms.model_name,
1517
1538
  str(ms.request_count),
1539
+ str(ms.invocation_count),
1518
1540
  format_token_count(ms.input_tokens),
1519
1541
  format_token_count(ms.output_tokens),
1520
1542
  _recorded_cost(ms.cost_usd, ms.priced_request_count),
@@ -1523,6 +1545,7 @@ def print_usage_table(
1523
1545
  "",
1524
1546
  "Total",
1525
1547
  str(stats.request_count),
1548
+ str(stats.invocation_count),
1526
1549
  format_token_count(stats.input_tokens),
1527
1550
  format_token_count(stats.output_tokens),
1528
1551
  _recorded_cost(stats.total_cost_usd, stats.priced_request_count),
@@ -1533,6 +1556,7 @@ def print_usage_table(
1533
1556
  ms.provider,
1534
1557
  ms.model_name,
1535
1558
  str(stats.request_count),
1559
+ str(ms.invocation_count),
1536
1560
  format_token_count(stats.input_tokens),
1537
1561
  format_token_count(stats.output_tokens),
1538
1562
  _recorded_cost(stats.total_cost_usd, stats.priced_request_count),
@@ -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.73" # x-release-please-version
5
+ __version__ = "0.1.75" # 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."""
@@ -121,6 +121,7 @@ from deepagents_code.goal_state_limits import (
121
121
  validate_rubric,
122
122
  )
123
123
  from deepagents_code.goal_state_notice import (
124
+ GOAL_CONTROL_MESSAGE_SOURCE,
124
125
  build_goal_continuation,
125
126
  build_goal_state_notice,
126
127
  goal_notice_size_error,
@@ -16864,6 +16865,7 @@ class DeepAgentsApp(App):
16864
16865
  " Ctrl+\\ Toggle the debug console\n"
16865
16866
  " Shift+Tab Toggle auto-approve mode\n"
16866
16867
  " @filename Auto-complete files and inject content\n"
16868
+ " @@query Search recent conversations by title or ID\n"
16867
16869
  " /command Slash commands (/help, /clear, /quit)\n"
16868
16870
  " !command Run shell commands directly\n"
16869
16871
  " !!command Run shell commands without adding "
@@ -18978,6 +18980,15 @@ class DeepAgentsApp(App):
18978
18980
  # Published on the app so exit() can merge the stats synchronously
18979
18981
  # if the worker is cancelled before this method can return (e.g.
18980
18982
  # Ctrl+D during HITL).
18983
+ if graph_input is None and (
18984
+ (message_kwargs or {}).get("additional_kwargs", {}).get("lc_source")
18985
+ != GOAL_CONTROL_MESSAGE_SOURCE
18986
+ ):
18987
+ from deepagents_code.config import runtime_state
18988
+
18989
+ turn_stats.record_invocation(
18990
+ runtime_state.model_name or "", runtime_state.model_provider or ""
18991
+ )
18981
18992
  self._inflight_turn_stats = turn_stats
18982
18993
  self._inflight_turn_start = time.monotonic()
18983
18994
  self._inflight_thread_id = self._lc_thread_id
@@ -23640,8 +23651,13 @@ class DeepAgentsApp(App):
23640
23651
  if chat_input is None:
23641
23652
  return
23642
23653
 
23654
+ thread_query = chat_input.active_thread_query()
23655
+ if thread_query is not None:
23656
+ self._open_thread_reference_selector(thread_query)
23657
+ return
23658
+
23643
23659
  tier = chat_input.open_prompt_search()
23644
- if tier == "inline":
23660
+ if tier in {"inline", "file_picker"}:
23645
23661
  return
23646
23662
  if tier == "noop":
23647
23663
  # The composer is mounted but its text area or search panel is not.
@@ -29065,6 +29081,39 @@ class DeepAgentsApp(App):
29065
29081
  )
29066
29082
  )
29067
29083
 
29084
+ def _open_thread_reference_selector(self, initial_query: str) -> None:
29085
+ """Open the full thread picker and insert the selected reference."""
29086
+ from deepagents_code.sessions import get_cached_threads, get_thread_limit
29087
+ from deepagents_code.tui.widgets.thread_selector import ThreadSelectorScreen
29088
+
29089
+ thread_limit = get_thread_limit()
29090
+
29091
+ def handle_result(result: str | None) -> None:
29092
+ def apply_result() -> None:
29093
+ chat_input = self._chat_input
29094
+ if result is not None and (
29095
+ chat_input is None or not chat_input.insert_thread_reference(result)
29096
+ ):
29097
+ self.notify(
29098
+ "Could not insert the thread reference: the composer changed",
29099
+ severity="warning",
29100
+ )
29101
+ if chat_input is not None:
29102
+ chat_input.focus_input()
29103
+
29104
+ self.call_after_refresh(apply_result)
29105
+
29106
+ self.push_screen(
29107
+ ThreadSelectorScreen(
29108
+ thread_limit=thread_limit,
29109
+ initial_threads=get_cached_threads(limit=thread_limit),
29110
+ initial_query=initial_query,
29111
+ filter_cwd=None,
29112
+ reference_mode=True,
29113
+ ),
29114
+ handle_result,
29115
+ )
29116
+
29068
29117
  async def _show_thread_selector(self) -> None:
29069
29118
  """Show interactive thread selector as a modal screen."""
29070
29119
  from functools import partial