deepagents-code 0.1.43__tar.gz → 0.1.45__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 (418) hide show
  1. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/AGENTS.md +1 -0
  2. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/CHANGELOG.md +38 -0
  3. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/PKG-INFO +30 -30
  4. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/THREAT_MODEL.md +2 -1
  5. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/_build_info.py +1 -1
  6. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/_constants.py +14 -0
  7. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/_env_vars.py +20 -4
  8. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/_git.py +177 -0
  9. deepagents_code-0.1.45/deepagents_code/_glm_5p2_profile.py +309 -0
  10. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/_server_config.py +98 -2
  11. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/_textual_patches.py +24 -22
  12. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/_version.py +1 -1
  13. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/agent.py +195 -6
  14. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/app.py +788 -136
  15. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/auto_mode.py +565 -21
  16. deepagents_code-0.1.45/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +50 -0
  17. deepagents_code-0.1.45/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +638 -0
  18. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/client/commands/tools.py +7 -5
  19. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/client/launch/server.py +234 -131
  20. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/client/launch/server_manager.py +12 -0
  21. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/client/non_interactive.py +7 -0
  22. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/command_registry.py +1 -1
  23. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/config.py +74 -14
  24. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/config_manifest.py +17 -5
  25. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/goal_rubric.py +13 -1
  26. deepagents_code-0.1.45/deepagents_code/hooks/__init__.py +24 -0
  27. deepagents_code-0.1.45/deepagents_code/hooks/engine.py +82 -0
  28. deepagents_code-0.1.43/deepagents_code/hooks.py → deepagents_code-0.1.45/deepagents_code/hooks/legacy.py +15 -7
  29. deepagents_code-0.1.45/deepagents_code/hooks/models/__init__.py +1 -0
  30. deepagents_code-0.1.45/deepagents_code/hooks/models/adapters.py +24 -0
  31. deepagents_code-0.1.45/deepagents_code/hooks/models/config.py +46 -0
  32. deepagents_code-0.1.45/deepagents_code/hooks/models/domain.py +359 -0
  33. deepagents_code-0.1.45/deepagents_code/hooks/models/transport.py +40 -0
  34. deepagents_code-0.1.45/deepagents_code/hooks/models/wire.py +446 -0
  35. deepagents_code-0.1.45/deepagents_code/hooks/projection.py +229 -0
  36. deepagents_code-0.1.45/deepagents_code/hooks/reducer.py +331 -0
  37. deepagents_code-0.1.45/deepagents_code/hooks/runner.py +239 -0
  38. deepagents_code-0.1.45/deepagents_code/hooks/snapshot.py +209 -0
  39. deepagents_code-0.1.45/deepagents_code/hooks/tools.py +116 -0
  40. deepagents_code-0.1.45/deepagents_code/json_types.py +12 -0
  41. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/local_context.py +124 -58
  42. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/main.py +137 -20
  43. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/mcp_tools.py +173 -68
  44. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/model_config.py +268 -85
  45. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/plugins/models.py +2 -2
  46. deepagents_code-0.1.45/deepagents_code/reasoning_effort.py +332 -0
  47. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/server_graph.py +1 -0
  48. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/system_prompt.md +1 -7
  49. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tool_catalog.py +52 -1
  50. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/modals/plugin_manager/__init__.py +36 -19
  51. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/modals/plugin_manager/content.py +10 -3
  52. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -1
  53. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/_inline_prompt.py +20 -18
  54. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/_paste_textarea.py +118 -2
  55. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/approval.py +86 -47
  56. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/ask_user.py +2 -0
  57. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/chat_input.py +36 -98
  58. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/debug_console.py +101 -17
  59. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/goal_review.py +4 -3
  60. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/model_selector.py +2 -2
  61. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/welcome.py +31 -2
  62. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/ui.py +4 -0
  63. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/update_check.py +32 -3
  64. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/pyproject.toml +35 -30
  65. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/scripts/install.sh +209 -61
  66. deepagents_code-0.1.45/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +315 -0
  67. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/client/commands/test_tools.py +32 -1
  68. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/conftest.py +3 -3
  69. deepagents_code-0.1.45/tests/unit_tests/hooks/__init__.py +1 -0
  70. deepagents_code-0.1.45/tests/unit_tests/hooks/models/__init__.py +1 -0
  71. deepagents_code-0.1.45/tests/unit_tests/hooks/models/test_models.py +428 -0
  72. deepagents_code-0.1.45/tests/unit_tests/hooks/test_engine.py +1067 -0
  73. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/plugins/test_plugins_p0.py +3 -3
  74. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/skills/test_load.py +23 -0
  75. deepagents_code-0.1.45/tests/unit_tests/skills/test_thread_inspector.py +676 -0
  76. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +2 -3
  77. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_agent.py +755 -7
  78. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_app.py +2115 -203
  79. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_auto_mode.py +806 -3
  80. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_config.py +181 -10
  81. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_configurable_model.py +26 -1
  82. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_debug_console.py +272 -3
  83. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_extras_info.py +1 -1
  84. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_git.py +211 -0
  85. deepagents_code-0.1.45/tests/unit_tests/test_glm_5p2_profile.py +363 -0
  86. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_goal_rubric.py +233 -2
  87. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_hooks.py +1 -1
  88. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_install_script.py +360 -5
  89. deepagents_code-0.1.45/tests/unit_tests/test_json_types.py +35 -0
  90. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_local_context.py +205 -5
  91. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_main.py +317 -7
  92. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_main_acp_mode.py +86 -0
  93. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_main_args.py +271 -0
  94. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_mcp_login_service.py +3 -1
  95. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_mcp_tools.py +324 -1
  96. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_model_config.py +648 -19
  97. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_model_switch.py +4 -9
  98. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_non_interactive.py +53 -0
  99. deepagents_code-0.1.45/tests/unit_tests/test_reasoning_effort.py +1383 -0
  100. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_reload.py +63 -0
  101. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_server.py +224 -5
  102. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_server_graph.py +7 -0
  103. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_server_manager.py +147 -0
  104. deepagents_code-0.1.45/tests/unit_tests/test_startup_blocking.py +72 -0
  105. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_textual_patches.py +7 -0
  106. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_tool_catalog.py +128 -3
  107. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_update_check.py +40 -0
  108. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +110 -10
  109. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_approval.py +276 -5
  110. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_ask_user.py +17 -0
  111. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_chat_input.py +96 -4
  112. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_goal_review.py +33 -0
  113. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_inline_prompt.py +145 -1
  114. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_status.py +2 -2
  115. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_welcome.py +103 -0
  116. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/uv.lock +1489 -1562
  117. deepagents_code-0.1.43/deepagents_code/reasoning_effort.py +0 -641
  118. deepagents_code-0.1.43/tests/unit_tests/test_reasoning_effort.py +0 -833
  119. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/.gitignore +0 -0
  120. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/ARCHITECTURE.md +0 -0
  121. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/COMMANDS.md +0 -0
  122. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/DEVELOPMENT.md +0 -0
  123. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/Makefile +0 -0
  124. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/README.md +0 -0
  125. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/__init__.py +0 -0
  126. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/__main__.py +0 -0
  127. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/_ask_user_types.py +0 -0
  128. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/_cli_context.py +0 -0
  129. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/_debug.py +0 -0
  130. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/_debug_buffer.py +0 -0
  131. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/_fake_models.py +0 -0
  132. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/_paths.py +0 -0
  133. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/_session_stats.py +0 -0
  134. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/_startup_error.py +0 -0
  135. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/_testing_models.py +0 -0
  136. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/_tool_stream.py +0 -0
  137. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/app.tcss +0 -0
  138. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/approval_mode.py +0 -0
  139. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/ask_user.py +0 -0
  140. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/auth_display.py +0 -0
  141. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/auth_store.py +0 -0
  142. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/built_in_skills/__init__.py +0 -0
  143. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  144. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  145. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  146. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  147. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/client/__init__.py +0 -0
  148. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/client/commands/__init__.py +0 -0
  149. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/client/commands/auth.py +0 -0
  150. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/client/commands/config.py +0 -0
  151. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/client/commands/mcp.py +0 -0
  152. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/client/launch/__init__.py +0 -0
  153. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/client/remote_client.py +0 -0
  154. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/clipboard.py +0 -0
  155. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/configurable_model.py +0 -0
  156. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/default_agent_prompt.md +0 -0
  157. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/doctor.py +0 -0
  158. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/editor.py +0 -0
  159. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/event_bus.py +0 -0
  160. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/extras_info.py +0 -0
  161. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/file_ops.py +0 -0
  162. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/formatting.py +0 -0
  163. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/goal_tools.py +0 -0
  164. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/input.py +0 -0
  165. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/integrations/__init__.py +0 -0
  166. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/integrations/openai_codex.py +0 -0
  167. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/integrations/sandbox_config.py +0 -0
  168. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/integrations/sandbox_factory.py +0 -0
  169. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/integrations/sandbox_provider.py +0 -0
  170. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/integrations/sandbox_registry.py +0 -0
  171. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/iterm_cursor_guide.py +0 -0
  172. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/managed_tools.py +0 -0
  173. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/mcp_auth.py +0 -0
  174. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/mcp_config.py +0 -0
  175. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/mcp_disabled.py +0 -0
  176. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/mcp_login_service.py +0 -0
  177. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/mcp_oauth_ui.py +0 -0
  178. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/mcp_providers/__init__.py +0 -0
  179. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/mcp_providers/_registry.py +0 -0
  180. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/mcp_providers/base.py +0 -0
  181. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/mcp_providers/github.py +0 -0
  182. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/mcp_providers/slack.py +0 -0
  183. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/media_utils.py +0 -0
  184. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/memory_guard.py +0 -0
  185. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/notifications.py +0 -0
  186. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/offload.py +0 -0
  187. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/offload_middleware.py +0 -0
  188. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/onboarding.py +0 -0
  189. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/output.py +0 -0
  190. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/paste_collapse.py +0 -0
  191. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/plugins/__init__.py +0 -0
  192. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/plugins/_json.py +0 -0
  193. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/plugins/adapters/__init__.py +0 -0
  194. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/plugins/adapters/mcp.py +0 -0
  195. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/plugins/adapters/skills.py +0 -0
  196. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
  197. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/plugins/commands_cli.py +0 -0
  198. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/plugins/discovery.py +0 -0
  199. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/plugins/manifest.py +0 -0
  200. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/plugins/marketplace.py +0 -0
  201. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/plugins/store.py +0 -0
  202. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/plugins/substitution.py +0 -0
  203. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/project_utils.py +0 -0
  204. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/py.typed +0 -0
  205. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/reliable_rubric.py +0 -0
  206. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/resume_state.py +0 -0
  207. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/sessions.py +0 -0
  208. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/skills/__init__.py +0 -0
  209. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/skills/commands.py +0 -0
  210. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/skills/invocation.py +0 -0
  211. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/skills/load.py +0 -0
  212. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/skills/merge.py +0 -0
  213. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/skills/trust.py +0 -0
  214. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/state_migration.py +0 -0
  215. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/subagents.py +0 -0
  216. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/terminal_capabilities.py +0 -0
  217. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/terminal_escape.py +0 -0
  218. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/theme.py +0 -0
  219. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/todo_list_prompt.md +0 -0
  220. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tool_display.py +0 -0
  221. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tools.py +0 -0
  222. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/__init__.py +0 -0
  223. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/modals/__init__.py +0 -0
  224. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
  225. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
  226. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
  227. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/screens/__init__.py +0 -0
  228. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/textual_adapter.py +0 -0
  229. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/__init__.py +0 -0
  230. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  231. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/_links.py +0 -0
  232. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/agent_selector.py +0 -0
  233. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/auth.py +0 -0
  234. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/autocomplete.py +0 -0
  235. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  236. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  237. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/diff.py +0 -0
  238. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  239. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/goal_status.py +0 -0
  240. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/history.py +0 -0
  241. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  242. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/launch_init.py +0 -0
  243. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/loading.py +0 -0
  244. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  245. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  246. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
  247. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/message_store.py +0 -0
  248. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/messages.py +0 -0
  249. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/notification_center.py +0 -0
  250. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  251. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  252. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/plugin_reload.py +0 -0
  253. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
  254. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  255. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/startup_tip.py +0 -0
  256. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/status.py +0 -0
  257. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  258. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  259. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/thread_selector.py +0 -0
  260. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  261. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  262. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/update_available.py +0 -0
  263. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  264. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/tui/widgets/update_progress.py +0 -0
  265. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/deepagents_code/unicode_security.py +0 -0
  266. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/examples/skills/arxiv-search/SKILL.md +0 -0
  267. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  268. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/examples/skills/langgraph-docs/SKILL.md +0 -0
  269. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/examples/skills/skill-creator/SKILL.md +0 -0
  270. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  271. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  272. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/examples/skills/web-research/SKILL.md +0 -0
  273. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/hatch_build.py +0 -0
  274. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/images/tui.png +0 -0
  275. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/scripts/check_imports.py +0 -0
  276. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/scripts/debug_server.sh +0 -0
  277. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/scripts/generate_commands_catalog.py +0 -0
  278. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/README.md +0 -0
  279. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/integration_tests/__init__.py +0 -0
  280. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/integration_tests/benchmarks/__init__.py +0 -0
  281. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  282. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  283. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/integration_tests/conftest.py +0 -0
  284. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/integration_tests/test_acp_mode.py +0 -0
  285. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  286. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/integration_tests/test_compact_resume.py +0 -0
  287. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
  288. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/integration_tests/test_offload_server_side.py +0 -0
  289. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/integration_tests/test_sandbox_factory.py +0 -0
  290. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/integration_tests/test_sandbox_operations.py +0 -0
  291. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/__init__.py +0 -0
  292. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/client/__init__.py +0 -0
  293. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/client/commands/__init__.py +0 -0
  294. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/client/commands/test_auth.py +0 -0
  295. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/client/commands/test_mcp.py +0 -0
  296. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  297. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/plugins/__init__.py +0 -0
  298. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/plugins/test_marketplace.py +0 -0
  299. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/plugins/test_store.py +0 -0
  300. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/skills/__init__.py +0 -0
  301. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/skills/test_commands.py +0 -0
  302. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/skills/test_merge.py +0 -0
  303. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  304. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/skills/test_skills_json.py +0 -0
  305. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  306. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  307. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
  308. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test__tool_stream.py +0 -0
  309. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_agent_friendly.py +0 -0
  310. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_approval_mode.py +0 -0
  311. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_args.py +0 -0
  312. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  313. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_auth_display.py +0 -0
  314. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_auth_store.py +0 -0
  315. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  316. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_charset.py +0 -0
  317. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_clipboard.py +0 -0
  318. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  319. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_command_registry.py +0 -0
  320. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_compact_tool.py +0 -0
  321. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_config_manifest.py +0 -0
  322. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_cursor_blink.py +0 -0
  323. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_cursor_style.py +0 -0
  324. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_debug.py +0 -0
  325. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_debug_buffer.py +0 -0
  326. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_doctor.py +0 -0
  327. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_editor.py +0 -0
  328. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_end_to_end.py +0 -0
  329. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_env_vars.py +0 -0
  330. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_event_bus.py +0 -0
  331. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_exception_handling.py +0 -0
  332. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_file_ops.py +0 -0
  333. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_formatting.py +0 -0
  334. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_goal_criteria_client.py +0 -0
  335. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_goal_tools.py +0 -0
  336. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_hatch_build.py +0 -0
  337. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_imports.py +0 -0
  338. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_input_parsing.py +0 -0
  339. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_install_command.py +0 -0
  340. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  341. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_managed_tools.py +0 -0
  342. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_mcp_auth.py +0 -0
  343. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_mcp_config.py +0 -0
  344. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_mcp_disabled.py +0 -0
  345. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  346. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_media_utils.py +0 -0
  347. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_memory_guard.py +0 -0
  348. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_notifications.py +0 -0
  349. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_offload.py +0 -0
  350. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_onboarding.py +0 -0
  351. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  352. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_output.py +0 -0
  353. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_paths.py +0 -0
  354. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_reliable_rubric.py +0 -0
  355. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_remote_client.py +0 -0
  356. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_resume_state.py +0 -0
  357. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_rubric_cli.py +0 -0
  358. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_sandbox_config.py +0 -0
  359. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_sandbox_factory.py +0 -0
  360. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_sandbox_provider.py +0 -0
  361. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_sandbox_registry.py +0 -0
  362. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_server_config.py +0 -0
  363. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_server_helpers.py +0 -0
  364. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_session_stats.py +0 -0
  365. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_sessions.py +0 -0
  366. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_shell_allow_list.py +0 -0
  367. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_skill_invocation.py +0 -0
  368. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  369. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_state_migration.py +0 -0
  370. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_subagents.py +0 -0
  371. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  372. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_terminal_escape.py +0 -0
  373. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  374. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_theme.py +0 -0
  375. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_threads_resume.py +0 -0
  376. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_tool_display.py +0 -0
  377. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_tracing_replicas.py +0 -0
  378. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  379. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_ui.py +0 -0
  380. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_unicode_security.py +0 -0
  381. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/test_version.py +0 -0
  382. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tools/__init__.py +0 -0
  383. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tools/test_current_thread.py +0 -0
  384. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  385. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/__init__.py +0 -0
  386. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/modals/__init__.py +0 -0
  387. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
  388. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  389. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
  390. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  391. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  392. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
  393. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
  394. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  395. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  396. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  397. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  398. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  399. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  400. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  401. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  402. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  403. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
  404. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
  405. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
  406. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
  407. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  408. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  409. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_plugin_reload.py +0 -0
  410. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  411. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  412. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
  413. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  414. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
  415. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  416. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  417. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  418. {deepagents_code-0.1.43 → deepagents_code-0.1.45}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
@@ -62,6 +62,7 @@ Apply these rules to new UI; do not treat them as a mandate to refactor existing
62
62
  - Co-locate a screen's `.tcss` file with its root component and set `CSS_PATH` relative to that module. Its styles may target sibling and small nested components, but a large nested component should generally own its own stylesheet.
63
63
  - Widgets cannot use `CSS_PATH`; put intrinsic, auto-scoped defaults in `DEFAULT_CSS`. The mounting screen owns the widget's sizing and placement.
64
64
  - Children must not import parent components. They may import shared utilities and data models; send events up and pass state/data down.
65
+ - A `ModalScreen` root inherits Textual's default translucent backdrop (`background: $background 60%`, which degrades to transparent under ansi themes) so it dims and composites the content underneath. Don't override it with `background: transparent` unless the modal is deliberately a non-dimming popover (as some selector overlays are); doing so by accident removes the dim.
65
66
 
66
67
  ### Testing Textual apps
67
68
 
@@ -2,6 +2,44 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.45](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.44...deepagents-code==0.1.45) (2026-07-22)
6
+
7
+ ### Features
8
+
9
+ - Added the Hooks v2 execution engine and typed hooks data models ([#4880](https://github.com/langchain-ai/deepagents/issues/4880), [#4870](https://github.com/langchain-ai/deepagents/issues/4870))
10
+ - Added a filesystem tool allowlist for `dcode` with `--allow-fs-tools` ([#4635](https://github.com/langchain-ai/deepagents/issues/4635))
11
+ - Added a GLM-5.2 harness profile ([#4710](https://github.com/langchain-ai/deepagents/issues/4710))
12
+ - Added a built-in thread inspector skill ([#4769](https://github.com/langchain-ai/deepagents/issues/4769))
13
+ - Replaced Gemini 3.5 Flash with Gemini 3.6 Flash in the model switcher ([#4890](https://github.com/langchain-ai/deepagents/issues/4890))
14
+ - Show experimental mode in the splash screen and debug console ([#4863](https://github.com/langchain-ai/deepagents/issues/4863))
15
+ - Gate debug console click-to-copy behind a checkbox ([#4810](https://github.com/langchain-ai/deepagents/issues/4810))
16
+
17
+ ### Bug Fixes
18
+
19
+ - Improved scratch-file handling by allowing cleanup of agent-created scratch files and safe OS-temp scratch artifacts ([#4860](https://github.com/langchain-ai/deepagents/issues/4860), [#4869](https://github.com/langchain-ai/deepagents/issues/4869))
20
+ - Skip grading during `/goal` proposals ([#4941](https://github.com/langchain-ai/deepagents/issues/4941))
21
+ - Improved MCP approval handling: Esc now aborts project MCP approval, disabled MCP servers are honored for plugins, remembered approvals are preserved with the env allowlist, and approvals are shared across Git worktrees ([#4888](https://github.com/langchain-ai/deepagents/issues/4888), [#4848](https://github.com/langchain-ai/deepagents/issues/4848), [#4889](https://github.com/langchain-ai/deepagents/issues/4889), [#4939](https://github.com/langchain-ai/deepagents/issues/4939))
22
+ - Hardened installer downloads and paths ([#4871](https://github.com/langchain-ai/deepagents/issues/4871))
23
+ - Fixed forced `dcode update` checks to bust the CDN cache ([#4862](https://github.com/langchain-ai/deepagents/issues/4862))
24
+ - Prevented failed exit setup from stranding the app ([#4913](https://github.com/langchain-ai/deepagents/issues/4913))
25
+ - Fixed routing so `ctrl+x` goes to the focused `ask_user` input ([#4926](https://github.com/langchain-ai/deepagents/issues/4926))
26
+ - Show `-m` prompts as queued immediately on startup ([#4861](https://github.com/langchain-ai/deepagents/issues/4861))
27
+ - Kept harness-profile diagnostics out of terminal output ([#4943](https://github.com/langchain-ai/deepagents/issues/4943))
28
+ - Avoid tracking inline restart callers ([#4894](https://github.com/langchain-ai/deepagents/issues/4894))
29
+ - Fixed debug console thread ID copying on click ([#4945](https://github.com/langchain-ai/deepagents/issues/4945))
30
+
31
+ ### Performance Improvements
32
+
33
+ - Reduced exit latency by coordinating async shutdown teardown ([#4831](https://github.com/langchain-ai/deepagents/issues/4831))
34
+ - Sped up local context detection ([#4922](https://github.com/langchain-ai/deepagents/issues/4922))
35
+
36
+ ## [0.1.44](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.43...deepagents-code==0.1.44) (2026-07-20)
37
+
38
+ ### Bug Fixes
39
+
40
+ - Improved approval handling by hiding the `Auto` option when it isn't eligible and moving Auto mode path checks off the event loop. ([#4839](https://github.com/langchain-ai/deepagents/issues/4839), [#4856](https://github.com/langchain-ai/deepagents/issues/4856))
41
+ - Warmed MCP auth imports off the event loop to avoid blocking runtime work. ([#4855](https://github.com/langchain-ai/deepagents/issues/4855))
42
+
5
43
  ## [0.1.43](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.42...deepagents-code==0.1.43) (2026-07-17)
6
44
 
7
45
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents-code
3
- Version: 0.1.43
3
+ Version: 0.1.45
4
4
  Summary: Terminal coding agent built on the Deep Agents SDK - works with any model, with persistent memory, customizable skills, subagents, and approval controls.
5
5
  Project-URL: Homepage, https://docs.langchain.com/oss/python/deepagents/overview
6
6
  Project-URL: Documentation, https://reference.langchain.com/python/deepagents/
@@ -26,26 +26,26 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
26
26
  Classifier: Topic :: Terminals
27
27
  Requires-Python: <4.0,>=3.11
28
28
  Requires-Dist: aiosqlite<1.0.0,>=0.22.1
29
- Requires-Dist: anyio<5.0.0,>=4.0.0
30
- Requires-Dist: deepagents-acp<1.0.0,>=0.0.8
31
- Requires-Dist: deepagents==0.7.0a7
32
- Requires-Dist: filelock<3.30,>=3.12
29
+ Requires-Dist: anyio<5.0.0,>=4.14.2
30
+ Requires-Dist: deepagents-acp<1.0.0,>=0.0.9
31
+ Requires-Dist: deepagents==0.7.0a8
32
+ Requires-Dist: filelock<3.30,>=3.29.7
33
33
  Requires-Dist: httpx<1.0.0,>=0.28.1
34
- Requires-Dist: langchain-anthropic<2.0.0,>=1.4.8
35
- Requires-Dist: langchain-google-genai<5.0.0,>=4.2.7
34
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.5.0
35
+ Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1
36
36
  Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.0
37
- Requires-Dist: langchain-openai<2.0.0,>=1.3.5
37
+ Requires-Dist: langchain-openai<2.0.0,>=1.4.0
38
38
  Requires-Dist: langchain-quickjs<0.4.0,>=0.3.3
39
- Requires-Dist: langchain<2.0.0,>=1.3.13
39
+ Requires-Dist: langchain<2.0.0,>=1.3.14
40
40
  Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
41
- Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.30
42
- Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.31.0
41
+ Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.31
42
+ Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.31.1
43
43
  Requires-Dist: langgraph-sdk<1.0.0,>=0.4.2
44
- Requires-Dist: langsmith[sandbox]>=0.9.3
45
- Requires-Dist: markdownify<2.0.0,>=1.2.2
44
+ Requires-Dist: langsmith[sandbox]>=0.10.9
45
+ Requires-Dist: markdownify<2.0.0,>=1.2.3
46
46
  Requires-Dist: mcp<2.0.0,>=1.28.1
47
47
  Requires-Dist: packaging>=26.2
48
- Requires-Dist: pillow<13.0.0,>=12.2.0
48
+ Requires-Dist: pillow<13.0.0,>=12.3.0
49
49
  Requires-Dist: prompt-toolkit<4.0.0,>=3.0.52
50
50
  Requires-Dist: pydantic<2.14.0a0,>=2.12.5
51
51
  Requires-Dist: pyperclip<2.0.0,>=1.11.0
@@ -56,20 +56,20 @@ Requires-Dist: rich<16.0.0,>=15.0.0
56
56
  Requires-Dist: tavily-python<1.0.0,>=0.7.26
57
57
  Requires-Dist: textual-autocomplete<5.0.0,>=4.0.6
58
58
  Requires-Dist: textual-speedups<1.0.0,>=0.2.1
59
- Requires-Dist: textual<9.0.0,>=8.2.7
59
+ Requires-Dist: textual<9.0.0,>=8.2.8
60
60
  Requires-Dist: tomli-w<2.0.0,>=1.2.0
61
- Requires-Dist: uuid-utils<1.0.0,>=0.16.2
61
+ Requires-Dist: uuid-utils<1.0.0,>=0.17.0
62
62
  Provides-Extra: agentcore
63
63
  Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.5; extra == 'agentcore'
64
64
  Provides-Extra: all-providers
65
- Requires-Dist: aiohttp<3.15.0,>=3.14.1; extra == 'all-providers'
66
- Requires-Dist: langchain-anthropic<2.0.0,>=1.4.8; extra == 'all-providers'
65
+ Requires-Dist: aiohttp<3.15.0,>=3.14.2; extra == 'all-providers'
66
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.5.0; extra == 'all-providers'
67
67
  Requires-Dist: langchain-aws<2.0.0,>=1.6.2; extra == 'all-providers'
68
68
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'all-providers'
69
69
  Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
70
70
  Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'all-providers'
71
- Requires-Dist: langchain-fireworks<2.0.0,>=1.4.4; extra == 'all-providers'
72
- Requires-Dist: langchain-google-genai<5.0.0,>=4.2.7; extra == 'all-providers'
71
+ Requires-Dist: langchain-fireworks<2.0.0,>=1.5.0; extra == 'all-providers'
72
+ Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1; extra == 'all-providers'
73
73
  Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.4; extra == 'all-providers'
74
74
  Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'all-providers'
75
75
  Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'all-providers'
@@ -79,11 +79,11 @@ Requires-Dist: langchain-meta<2.0.0,>=0.5.0; extra == 'all-providers'
79
79
  Requires-Dist: langchain-mistralai<2.0.0,>=1.1.6; extra == 'all-providers'
80
80
  Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'all-providers'
81
81
  Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
82
- Requires-Dist: langchain-openai<2.0.0,>=1.3.5; extra == 'all-providers'
82
+ Requires-Dist: langchain-openai<2.0.0,>=1.4.0; extra == 'all-providers'
83
83
  Requires-Dist: langchain-openrouter<2.0.0,>=0.2.6; extra == 'all-providers'
84
84
  Requires-Dist: langchain-perplexity<2.0.0,>=1.4.0; extra == 'all-providers'
85
85
  Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'all-providers'
86
- Requires-Dist: langchain-xai<2.0.0,>=1.2.2; extra == 'all-providers'
86
+ Requires-Dist: langchain-xai<2.0.0,>=1.3.0; extra == 'all-providers'
87
87
  Provides-Extra: all-sandboxes
88
88
  Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.5; extra == 'all-sandboxes'
89
89
  Requires-Dist: langchain-daytona>=0.0.7; extra == 'all-sandboxes'
@@ -91,7 +91,7 @@ Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
91
91
  Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
92
92
  Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
93
93
  Provides-Extra: anthropic
94
- Requires-Dist: langchain-anthropic<2.0.0,>=1.4.8; extra == 'anthropic'
94
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.5.0; extra == 'anthropic'
95
95
  Provides-Extra: baseten
96
96
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'baseten'
97
97
  Provides-Extra: bedrock
@@ -103,9 +103,9 @@ Requires-Dist: langchain-daytona>=0.0.7; extra == 'daytona'
103
103
  Provides-Extra: deepseek
104
104
  Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'deepseek'
105
105
  Provides-Extra: fireworks
106
- Requires-Dist: langchain-fireworks<2.0.0,>=1.4.4; extra == 'fireworks'
106
+ Requires-Dist: langchain-fireworks<2.0.0,>=1.5.0; extra == 'fireworks'
107
107
  Provides-Extra: google-genai
108
- Requires-Dist: langchain-google-genai<5.0.0,>=4.2.7; extra == 'google-genai'
108
+ Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1; extra == 'google-genai'
109
109
  Provides-Extra: groq
110
110
  Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'groq'
111
111
  Provides-Extra: huggingface
@@ -115,8 +115,8 @@ Requires-Dist: langchain-ibm<2.0.0,>=1.1.0; extra == 'ibm'
115
115
  Provides-Extra: litellm
116
116
  Requires-Dist: langchain-litellm<2.0.0,>=0.7.0; extra == 'litellm'
117
117
  Provides-Extra: media
118
- Requires-Dist: av<18.0.0,>=17.0.0; extra == 'media'
119
- Requires-Dist: pillow<13.0.0,>=12.2.0; extra == 'media'
118
+ Requires-Dist: av<18.0.0,>=17.1.0; extra == 'media'
119
+ Requires-Dist: pillow<13.0.0,>=12.3.0; extra == 'media'
120
120
  Provides-Extra: meta
121
121
  Requires-Dist: langchain-meta<2.0.0,>=0.5.0; extra == 'meta'
122
122
  Provides-Extra: mistralai
@@ -124,12 +124,12 @@ Requires-Dist: langchain-mistralai<2.0.0,>=1.1.6; extra == 'mistralai'
124
124
  Provides-Extra: modal
125
125
  Requires-Dist: langchain-modal>=0.0.5; extra == 'modal'
126
126
  Provides-Extra: nvidia
127
- Requires-Dist: aiohttp<3.15.0,>=3.14.1; extra == 'nvidia'
127
+ Requires-Dist: aiohttp<3.15.0,>=3.14.2; extra == 'nvidia'
128
128
  Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'nvidia'
129
129
  Provides-Extra: ollama
130
130
  Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'ollama'
131
131
  Provides-Extra: openai
132
- Requires-Dist: langchain-openai<2.0.0,>=1.3.5; extra == 'openai'
132
+ Requires-Dist: langchain-openai<2.0.0,>=1.4.0; extra == 'openai'
133
133
  Provides-Extra: openrouter
134
134
  Requires-Dist: langchain-openrouter<2.0.0,>=0.2.6; extra == 'openrouter'
135
135
  Provides-Extra: perplexity
@@ -144,7 +144,7 @@ Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'vercel'
144
144
  Provides-Extra: vertex
145
145
  Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.4; extra == 'vertex'
146
146
  Provides-Extra: xai
147
- Requires-Dist: langchain-xai<2.0.0,>=1.2.2; extra == 'xai'
147
+ Requires-Dist: langchain-xai<2.0.0,>=1.3.0; extra == 'xai'
148
148
  Description-Content-Type: text/markdown
149
149
 
150
150
  # 🧠🤖 Deep Agents Code
@@ -231,7 +231,7 @@
231
231
 
232
232
  #### TB4: MCP Config → Process / Network
233
233
 
234
- - **Inside**: `mcp_tools._validate_server_config` validates JSON structure and field types. Project-level servers (stdio and remote) require approval: an interactive prompt (`main._check_mcp_project_trust`) that offers allow-for-this-session ("y"), remember a chosen subset of servers ("r"), or deny ("N") — unless `--trust-project-mcp` is set, which trusts the whole config for the run. Whole-config trust is never persisted; it exists only as in-memory run state, set by `--trust-project-mcp` or by an interactive allow-once/remember decision. The remembered subset governs only what is persisted for future runs — both allow-once and remember load every prompted server for the current session. Persistent "remember" (a.k.a. "always allow") decisions are stored in `[mcp].enabled_project_server_approvals` with project root, server name, and server definition fingerprint, so a different project or changed command/URL under the same name requires re-approval. Users can reject individual project server names via `[mcp].disabled_project_servers` (or `DEEPAGENTS_CODE_DISABLED_PROJECT_MCP_SERVERS`). There is also an explicit process-wide escape hatch, `DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS`, that approves matching names globally and intentionally bypasses the project/fingerprint binding. Reject wins over approval and over full trust, with one documented exception: if the user's `config.toml` is unreadable (see below), any deny defined *only* there is lost, so a name that is both TOML-`disabled` and exported in `DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS` survives — an accepted footgun (`load_mcp_server_trust_lists` documents it inline) that requires a self-contradicting config plus the explicit dangerous opt-in, and the read error is surfaced to the user. These policies are read by `model_config.load_mcp_server_trust_lists` only from user-controlled sources — the user-level `~/.deepagents/config.toml`, the global `~/.deepagents/.env`, and shell-exported env — never from `.mcp.json` or any repo-committed file, so a committed config cannot self-approve its own servers. In particular, the env forms (`DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS` / `..._DISABLED_...`) are added to `config._PROJECT_DOTENV_DENIED_ENV_KEYS`, so a committed *project* `.env` cannot inject them into `os.environ` even though it is loaded at bootstrap. The dangerous enable env var replaces TOML approvals when set, while disabled *unions* TOML and env so a deny can never be silently emptied by the other source. If the user's `config.toml` exists but cannot be read or parsed, the loader fails closed (project configs are treated as untrusted and the error is surfaced) rather than proceeding with an empty deny list. Only scoped-approved, dangerously env-enabled, or fully trusted names survive into the merged config, so a non-approved remote entry is never preflighted and its interpolated headers are never resolved.
234
+ - **Inside**: `mcp_tools._validate_server_config` validates JSON structure and field types. Project-level servers (stdio and remote) require approval: an interactive prompt (`main._check_mcp_project_trust`) that offers allow-for-this-session ("y"), remember a chosen subset of servers ("r"), or deny ("N") — unless `--trust-project-mcp` is set, which trusts the whole config for the run. Whole-config trust is never persisted; it exists only as in-memory run state, set by `--trust-project-mcp` or by an interactive allow-once/remember decision. The remembered subset governs only what is persisted for future runs — both allow-once and remember load every prompted server for the current session. Persistent "remember" (a.k.a. "always allow") decisions are stored in `[mcp].enabled_project_server_approvals` with a local-project identity, server name, and server definition fingerprint. Remote server approvals with fixed URLs are shared by main checkouts and linked worktrees only through validated reciprocal Git common-directory metadata; independent clones remain separate, and non-Git or malformed/forged metadata falls back to the exact resolved root. Remote definitions with interpolated URLs remain exact-worktree scoped because project `.env` files can resolve the same template to different endpoints. Local stdio server approvals always use the exact resolved worktree root because the same command can execute different files in another checkout. A changed command, URL, or transport under the same name requires re-approval. Users can reject individual project server names via `[mcp].disabled_project_servers` (or `DEEPAGENTS_CODE_DISABLED_PROJECT_MCP_SERVERS`). There is also an explicit process-wide escape hatch, `DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS`, that approves matching names globally and intentionally bypasses the project/fingerprint binding. Reject wins over approval and over full trust, with one documented exception: if the user's `config.toml` is unreadable (see below), any deny defined *only* there is lost, so a name that is both TOML-`disabled` and exported in `DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS` survives — an accepted footgun (`load_mcp_server_trust_lists` documents it inline) that requires a self-contradicting config plus the explicit dangerous opt-in, and the read error is surfaced to the user. These policies are read by `model_config.load_mcp_server_trust_lists` only from user-controlled sources — the user-level `~/.deepagents/config.toml`, the global `~/.deepagents/.env`, and shell-exported env — never from `.mcp.json` or any repo-committed file, so a committed config cannot self-approve its own servers. In particular, the env forms (`DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS` / `..._DISABLED_...`) are added to `config._PROJECT_DOTENV_DENIED_ENV_KEYS`, so a committed *project* `.env` cannot inject them into `os.environ` even though it is loaded at bootstrap. The dangerous enable env var and scoped TOML approvals are independent grants: setting the env var, including to an empty value, does not suppress remembered approvals. Disabled *unions* TOML and env so a deny can never be silently emptied by the other source. If the user's `config.toml` exists but cannot be read or parsed, the loader fails closed (project configs are treated as untrusted and the error is surfaced) rather than proceeding with an empty deny list. Only scoped-approved, dangerously env-enabled, or fully trusted names survive into the merged config, so a non-approved remote entry is never preflighted and its interpolated headers are never resolved.
235
235
  - **Outside**: Stdio server `command`, `args`, and `env` fields are user-controlled strings passed directly to `StdioConnection`. The `env` dict from MCP config is forwarded without filtering — users can set arbitrary environment variables (including `PATH`, `LD_PRELOAD`, `PYTHONPATH`) for the MCP subprocess.
236
236
  - **Crossing mechanism**: `subprocess.Popen` (via `langchain_mcp_adapters`) for stdio; HTTP/SSE for remote servers.
237
237
 
@@ -494,3 +494,4 @@ Threats that appear valid in isolation but fall outside project responsibility b
494
494
  | 2026-06-25 | manual update | Added T12 (project `.env` injects shell interpreter startup hooks) under TB11; extended the TB11 boundary controls and details with the dotenv shell-startup-hook denylist (`BASH_ENV`, `ENV`); clarified the `.env` out-of-scope row to separate ordinary config discovery from the in-scope code-execution implication |
495
495
  | 2026-06-25 | manual update | Updated T6 and TB10 to reflect the dev server binding an OS-assigned ephemeral port by default (`server._EPHEMERAL_PORT`) instead of squatting the well-known `langgraph dev` port 2024; noted unpredictable-port-across-runs as added defense-in-depth in the port-discovery dismissal row |
496
496
  | 2026-07-08 | manual update | Removed the SHA-256 config fingerprint trust store (`mcp_trust.py`, `~/.deepagents/.state/mcp_trust.json`, DC4). Project MCP trust is now the interactive approval prompt (allow-for-session / always-allow scoped to project root + server-definition fingerprint / deny), the `--trust-project-mcp` run flag, the `[mcp].enabled_project_server_approvals` and `[mcp].disabled_project_servers` lists, and the process-wide `DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS` name-based escape hatch. The legacy flat `[mcp].enabled_project_servers` key is ignored. Persisted approvals bind to a server definition's fingerprint rather than a whole-config fingerprint. Updated C5, TB4, T10, the configuration input-coverage row, and the malicious-MCP-server dismissal accordingly |
497
+ | 2026-07-21 | manual update | Clarified TB4 after process-wide MCP names and scoped remembered approvals changed from replacement semantics to independent grants. An empty process-wide allowlist no longer suppresses remembered approvals; disabled-server precedence is unchanged. |
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "e14e0ad"
3
+ BUILD_COMMIT = "7794b61"
@@ -13,6 +13,20 @@ from typing import Final
13
13
  DEFAULT_AGENT_NAME: Final[str] = "agent"
14
14
  """Default agent / assistant identifier when no `-a` flag is given."""
15
15
 
16
+ FS_TOOL_NAMES: Final[frozenset[str]] = frozenset(
17
+ {"ls", "read_file", "write_file", "edit_file", "delete", "glob", "grep", "execute"}
18
+ )
19
+ """Mirror of the SDK's `FsToolName` literal members.
20
+
21
+ Hardcoded here rather than derived from `deepagents.FsToolName` because
22
+ `deepagents` must not be imported on the arg-parsing hot path (see AGENTS.md
23
+ "Startup performance"); this module is dependency-free and safe for `main.py` to
24
+ import. Consumers (`main._parse_allow_fs_tools_flag`,
25
+ `tool_catalog.collect_built_in_tools`) alias this set, and `get_args(FsToolName)`
26
+ drift guards in `test_main_args` and `test_tool_catalog` pin it so a new or
27
+ renamed SDK filesystem tool fails a test instead of silently diverging.
28
+ """
29
+
16
30
  FIREWORKS_PROVIDER_ID_PREFIX: Final[str] = "accounts/fireworks/"
17
31
  """Prefix used to infer Fireworks from fully-qualified IDs."""
18
32
 
@@ -67,10 +67,11 @@ file, so it does not weaken the user-level-only trust boundary (a committed
67
67
  This dangerous contract is name-based: a different project, command change, or
68
68
  URL change under the same server name still matches.
69
69
 
70
- When set, this replaces (takes precedence over) the scoped
71
- `[mcp].enabled_project_server_approvals` TOML approvals.
72
- (`DISABLED_PROJECT_MCP_SERVERS` instead *unions* with its TOML list, so a deny
73
- is never silently emptied.)
70
+ This process-wide allowlist and the scoped
71
+ `[mcp].enabled_project_server_approvals` TOML approvals are independent grants.
72
+ Setting this variable, including to an empty value, does not suppress remembered
73
+ project approvals. (`DISABLED_PROJECT_MCP_SERVERS` instead *unions* with its
74
+ TOML list, so a deny is never silently emptied.)
74
75
  """
75
76
 
76
77
  DEBUG = "DEEPAGENTS_CODE_DEBUG"
@@ -80,6 +81,21 @@ Parsed by `is_env_truthy`: accepts `1`, `true`, `yes`, `on` (case-insensitive)
80
81
  as enabled, and `0`, `false`, `no`, `off`, empty string, or unset as disabled.
81
82
  """
82
83
 
84
+ DEBUG_CONSOLE_CLICK_TO_COPY = "DEEPAGENTS_CODE_DEBUG_CONSOLE_CLICK_TO_COPY"
85
+ r"""Enable click-to-copy in the `Ctrl+\` Debug Console when enabled.
86
+
87
+ Off by default; toggle the "Click to copy" checkbox in the console or set
88
+ `[ui].debug_console_click_to_copy` in config.toml. A recognized value is parsed
89
+ by `classify_env_bool`; an unrecognized value falls through to the config value.
90
+ An empty/whitespace value is ignored before parsing (rather than being treated
91
+ as falsy) and also falls through, so it never masks the saved preference.
92
+
93
+ When set, this env var takes precedence over the persisted
94
+ `[ui].debug_console_click_to_copy` config value on launch, so toggling the
95
+ checkbox will not appear to "stick" across restarts while the env var remains
96
+ set.
97
+ """
98
+
83
99
  DEBUG_FILE = "DEEPAGENTS_CODE_DEBUG_FILE"
84
100
  """Path for the debug log file (default: `DEFAULT_DEBUG_FILE`)."""
85
101
 
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import logging
6
+ import os
6
7
  import re
7
8
  from pathlib import Path
8
9
  from typing import NamedTuple
@@ -159,6 +160,182 @@ def find_git_root(path: str | Path) -> Path | None:
159
160
  return None
160
161
 
161
162
 
163
+ def _read_single_git_metadata_line(path: Path) -> str | None:
164
+ """Read one non-empty line from a regular Git metadata file.
165
+
166
+ Args:
167
+ path: Metadata file to read.
168
+
169
+ Returns:
170
+ The stripped line, or `None` when the file is unsafe or malformed.
171
+ """
172
+ if path.is_symlink() or not path.is_file():
173
+ return None
174
+ try:
175
+ raw = path.read_text(encoding="utf-8")
176
+ except (OSError, UnicodeError):
177
+ logger.debug("Failed to read Git metadata from %s", path, exc_info=True)
178
+ return None
179
+
180
+ lines = raw.splitlines()
181
+ if len(lines) != 1:
182
+ return None
183
+ value = lines[0].strip()
184
+ if not value or "\x00" in value:
185
+ return None
186
+ return value
187
+
188
+
189
+ def _resolve_git_metadata_path(path: Path, *, relative_to: Path) -> Path | None:
190
+ """Resolve a path stored in a single-line Git metadata file.
191
+
192
+ Args:
193
+ path: Metadata file containing the path.
194
+ relative_to: Base directory for a relative stored path.
195
+
196
+ Returns:
197
+ The strictly resolved path, or `None` when it cannot be trusted.
198
+ """
199
+ value = _read_single_git_metadata_line(path)
200
+ if value is None:
201
+ return None
202
+ candidate = Path(value)
203
+ if not candidate.is_absolute():
204
+ candidate = relative_to / candidate
205
+ try:
206
+ return candidate.resolve(strict=True)
207
+ except (OSError, RuntimeError, ValueError):
208
+ logger.debug("Failed to resolve Git metadata path from %s", path, exc_info=True)
209
+ return None
210
+
211
+
212
+ def _normalize_git_metadata_path(path: Path, *, relative_to: Path) -> Path | None:
213
+ """Normalize a stored path without following its target.
214
+
215
+ Args:
216
+ path: Metadata file containing the path.
217
+ relative_to: Base directory for a relative stored path.
218
+
219
+ Returns:
220
+ The absolute lexical path, or `None` when the metadata is malformed.
221
+ """
222
+ value = _read_single_git_metadata_line(path)
223
+ if value is None:
224
+ return None
225
+ candidate = Path(value)
226
+ if not candidate.is_absolute():
227
+ candidate = relative_to / candidate
228
+ try:
229
+ return Path(os.path.abspath(candidate)) # noqa: PTH100 # do not follow links
230
+ except (OSError, RuntimeError, ValueError):
231
+ logger.debug(
232
+ "Failed to normalize Git metadata path from %s", path, exc_info=True
233
+ )
234
+ return None
235
+
236
+
237
+ def _parse_trusted_git_dir_pointer(git_entry: Path) -> Path | None:
238
+ """Resolve a strict worktree `.git` pointer for a trust decision.
239
+
240
+ Args:
241
+ git_entry: Regular `.git` file to parse.
242
+
243
+ Returns:
244
+ The canonical administration directory, or `None` for an invalid pointer.
245
+ """
246
+ value = _read_single_git_metadata_line(git_entry)
247
+ if value is None or not value.startswith(_GIT_DIR_POINTER_PREFIX):
248
+ return None
249
+ pointer = value.removeprefix(_GIT_DIR_POINTER_PREFIX).strip()
250
+ if not pointer:
251
+ return None
252
+ candidate = Path(pointer)
253
+ if not candidate.is_absolute():
254
+ candidate = git_entry.parent / candidate
255
+ try:
256
+ git_dir = candidate.resolve(strict=True)
257
+ except (OSError, RuntimeError, ValueError):
258
+ logger.debug(
259
+ "Failed to resolve trusted gitdir pointer %s", git_entry, exc_info=True
260
+ )
261
+ return None
262
+ return git_dir if git_dir.is_dir() else None
263
+
264
+
265
+ def _is_valid_git_common_dir(path: Path) -> bool:
266
+ """Return whether `path` has the required shared-repository metadata."""
267
+ return (
268
+ path.is_dir()
269
+ and (path / "HEAD").is_file()
270
+ and (path / "config").is_file()
271
+ and (path / "objects").is_dir()
272
+ and (path / "refs").is_dir()
273
+ )
274
+
275
+
276
+ def find_git_common_dir(path: str | Path) -> Path | None:
277
+ """Resolve a validated identity shared by one repository's Git worktrees.
278
+
279
+ A normal checkout uses its in-tree `.git` directory. A linked worktree is
280
+ accepted only when its administration directory lives directly under the
281
+ common repository's `worktrees` directory and its `gitdir` file points back
282
+ to the current worktree's `.git` file, and both the shared common directory
283
+ and the worktree's own administration directory carry valid repository
284
+ metadata (`_is_valid_git_common_dir` plus the worktree's own `HEAD`). These
285
+ checks prevent a forged pointer or directory link from borrowing another
286
+ repository's identity.
287
+
288
+ Args:
289
+ path: Exact working-tree root or persisted common-directory path.
290
+
291
+ Returns:
292
+ The canonical Git common directory, or `None` when the metadata cannot
293
+ be validated confidently.
294
+ """
295
+ try:
296
+ root = _normalize_lookup_path(path)
297
+ if not root.is_dir():
298
+ return None
299
+ if _is_valid_git_common_dir(root):
300
+ return root
301
+ root = root.resolve(strict=True)
302
+ git_entry = root / ".git"
303
+ if git_entry.is_symlink():
304
+ return None
305
+
306
+ if git_entry.is_dir():
307
+ common_dir = git_entry.resolve(strict=True)
308
+ if common_dir != git_entry or not _is_valid_git_common_dir(common_dir):
309
+ return None
310
+ return common_dir
311
+ if not git_entry.is_file():
312
+ return None
313
+
314
+ git_dir = _parse_trusted_git_dir_pointer(git_entry)
315
+ if git_dir is None:
316
+ return None
317
+
318
+ common_dir = _resolve_git_metadata_path(
319
+ git_dir / "commondir", relative_to=git_dir
320
+ )
321
+ if common_dir is None or git_dir.parent != common_dir / "worktrees":
322
+ return None
323
+ if not _is_valid_git_common_dir(common_dir):
324
+ return None
325
+ if not (git_dir / "HEAD").is_file():
326
+ return None
327
+
328
+ backlink = _normalize_git_metadata_path(git_dir / "gitdir", relative_to=git_dir)
329
+ if backlink is None or backlink != git_entry:
330
+ return None
331
+ except (OSError, RuntimeError, ValueError):
332
+ logger.debug(
333
+ "Failed to validate Git common directory for %s", path, exc_info=True
334
+ )
335
+ return None
336
+ return common_dir
337
+
338
+
162
339
  def read_git_branch_from_filesystem(path: str | Path) -> str | None:
163
340
  """Read the current git branch from repository metadata.
164
341