deepagents-code 0.1.39__tar.gz → 0.1.40__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 (391) hide show
  1. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/AGENTS.md +23 -0
  2. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/CHANGELOG.md +22 -0
  3. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/COMMANDS.md +2 -1
  4. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/PKG-INFO +1 -1
  5. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/THREAT_MODEL.md +10 -10
  6. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_build_info.py +1 -1
  7. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_env_vars.py +47 -28
  8. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_server_config.py +12 -0
  9. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_testing_models.py +41 -0
  10. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_version.py +1 -1
  11. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/agent.py +165 -68
  12. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/app.py +1312 -417
  13. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/commands/mcp.py +65 -15
  14. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/commands/tools.py +1 -1
  15. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/launch/server.py +1 -3
  16. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/launch/server_manager.py +6 -0
  17. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/non_interactive.py +22 -4
  18. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/remote_client.py +1 -1
  19. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/command_registry.py +96 -16
  20. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/config.py +2 -2
  21. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/config_manifest.py +19 -4
  22. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/configurable_model.py +16 -2
  23. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/editor.py +34 -7
  24. deepagents_code-0.1.40/deepagents_code/goal_rubric.py +1572 -0
  25. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/goal_tools.py +11 -9
  26. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/local_context.py +2 -1
  27. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/main.py +667 -110
  28. deepagents_code-0.1.40/deepagents_code/mcp_login_service.py +555 -0
  29. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_tools.py +349 -119
  30. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/model_config.py +939 -220
  31. deepagents_code-0.1.40/deepagents_code/offload.py +298 -0
  32. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/offload_middleware.py +2 -2
  33. deepagents_code-0.1.40/deepagents_code/plugins/__init__.py +28 -0
  34. deepagents_code-0.1.40/deepagents_code/plugins/_json.py +45 -0
  35. deepagents_code-0.1.40/deepagents_code/plugins/adapters/__init__.py +1 -0
  36. deepagents_code-0.1.40/deepagents_code/plugins/adapters/mcp.py +192 -0
  37. deepagents_code-0.1.40/deepagents_code/plugins/adapters/skills.py +121 -0
  38. deepagents_code-0.1.40/deepagents_code/plugins/adapters/skills_middleware.py +348 -0
  39. deepagents_code-0.1.40/deepagents_code/plugins/commands_cli.py +225 -0
  40. deepagents_code-0.1.40/deepagents_code/plugins/discovery.py +392 -0
  41. deepagents_code-0.1.40/deepagents_code/plugins/manifest.py +272 -0
  42. deepagents_code-0.1.40/deepagents_code/plugins/marketplace.py +805 -0
  43. deepagents_code-0.1.40/deepagents_code/plugins/models.py +227 -0
  44. deepagents_code-0.1.40/deepagents_code/plugins/store.py +555 -0
  45. deepagents_code-0.1.40/deepagents_code/plugins/substitution.py +107 -0
  46. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/resume_state.py +49 -13
  47. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/server_graph.py +74 -8
  48. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/sessions.py +28 -17
  49. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/skills/invocation.py +8 -0
  50. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/skills/load.py +37 -18
  51. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/skills/trust.py +6 -7
  52. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/system_prompt.md +17 -0
  53. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tool_catalog.py +7 -0
  54. deepagents_code-0.1.40/deepagents_code/tui/modals/__init__.py +1 -0
  55. deepagents_code-0.1.40/deepagents_code/tui/modals/plugin_manager/__init__.py +649 -0
  56. deepagents_code-0.1.40/deepagents_code/tui/modals/plugin_manager/content.py +193 -0
  57. deepagents_code-0.1.40/deepagents_code/tui/modals/plugin_manager/models.py +44 -0
  58. deepagents_code-0.1.40/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +67 -0
  59. deepagents_code-0.1.40/deepagents_code/tui/modals/plugin_manager/state.py +210 -0
  60. deepagents_code-0.1.40/deepagents_code/tui/screens/__init__.py +1 -0
  61. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/textual_adapter.py +136 -76
  62. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/_inline_prompt.py +44 -9
  63. deepagents_code-0.1.40/deepagents_code/tui/widgets/_paste_textarea.py +568 -0
  64. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/ask_user.py +7 -3
  65. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/autocomplete.py +20 -10
  66. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/chat_input.py +39 -220
  67. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/goal_review.py +9 -5
  68. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/message_store.py +13 -1
  69. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/messages.py +26 -0
  70. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/ui.py +24 -0
  71. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/update_check.py +444 -128
  72. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/pyproject.toml +4 -1
  73. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/test_compact_resume.py +7 -2
  74. deepagents_code-0.1.40/tests/integration_tests/test_goal_criteria_remote.py +117 -0
  75. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/test_offload_server_side.py +5 -2
  76. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/test_sandbox_operations.py +7 -9
  77. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/client/commands/test_mcp.py +205 -26
  78. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/client/commands/test_tools.py +6 -2
  79. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/conftest.py +60 -11
  80. deepagents_code-0.1.40/tests/unit_tests/plugins/__init__.py +1 -0
  81. deepagents_code-0.1.40/tests/unit_tests/plugins/test_marketplace.py +351 -0
  82. deepagents_code-0.1.40/tests/unit_tests/plugins/test_plugins_p0.py +1303 -0
  83. deepagents_code-0.1.40/tests/unit_tests/plugins/test_store.py +68 -0
  84. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/skills/test_load.py +46 -0
  85. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/skills/test_skill_trust.py +1 -1
  86. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +23 -48
  87. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/smoke_tests/test_system_prompt.py +7 -4
  88. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_agent.py +242 -108
  89. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_app.py +2203 -507
  90. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_args.py +31 -0
  91. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_command_registry.py +50 -74
  92. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_compact_tool.py +5 -0
  93. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_config_manifest.py +2 -0
  94. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_configurable_model.py +43 -0
  95. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_editor.py +13 -0
  96. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_end_to_end.py +14 -3
  97. deepagents_code-0.1.40/tests/unit_tests/test_goal_criteria_client.py +473 -0
  98. deepagents_code-0.1.40/tests/unit_tests/test_goal_rubric.py +1770 -0
  99. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_main.py +1502 -126
  100. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_main_acp_mode.py +62 -1
  101. deepagents_code-0.1.40/tests/unit_tests/test_mcp_login_service.py +784 -0
  102. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_mcp_tools.py +635 -80
  103. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_model_config.py +1095 -32
  104. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_model_switch.py +55 -1
  105. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_non_interactive.py +2 -0
  106. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_offload.py +209 -6
  107. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_reasoning_effort.py +119 -1
  108. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_reload.py +81 -11
  109. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_resume_state.py +6 -0
  110. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_server_config.py +12 -0
  111. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_server_graph.py +171 -11
  112. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_server_manager.py +3 -2
  113. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_sessions.py +51 -3
  114. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_skill_invocation.py +47 -0
  115. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_theme.py +2 -1
  116. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_tool_catalog.py +34 -0
  117. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_update_check.py +638 -71
  118. deepagents_code-0.1.40/tests/unit_tests/tui/modals/__init__.py +1 -0
  119. deepagents_code-0.1.40/tests/unit_tests/tui/modals/plugin_manager/__init__.py +1 -0
  120. deepagents_code-0.1.40/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +59 -0
  121. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/test_textual_adapter.py +330 -6
  122. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_ask_user.py +79 -0
  123. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_autocomplete.py +71 -5
  124. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_chat_input.py +169 -28
  125. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_goal_review.py +85 -0
  126. deepagents_code-0.1.40/tests/unit_tests/tui/widgets/test_inline_prompt.py +357 -0
  127. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_message_store.py +52 -0
  128. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_messages.py +44 -0
  129. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/uv.lock +1 -1
  130. deepagents_code-0.1.39/deepagents_code/goal_rubric.py +0 -497
  131. deepagents_code-0.1.39/deepagents_code/mcp_login_service.py +0 -281
  132. deepagents_code-0.1.39/deepagents_code/mcp_trust.py +0 -207
  133. deepagents_code-0.1.39/deepagents_code/offload.py +0 -146
  134. deepagents_code-0.1.39/tests/unit_tests/test_goal_rubric.py +0 -697
  135. deepagents_code-0.1.39/tests/unit_tests/test_mcp_login_service.py +0 -291
  136. deepagents_code-0.1.39/tests/unit_tests/test_mcp_trust.py +0 -158
  137. deepagents_code-0.1.39/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -43
  138. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/.gitignore +0 -0
  139. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/ARCHITECTURE.md +0 -0
  140. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/DEVELOPMENT.md +0 -0
  141. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/Makefile +0 -0
  142. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/README.md +0 -0
  143. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/__init__.py +0 -0
  144. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/__main__.py +0 -0
  145. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_ask_user_types.py +0 -0
  146. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_cli_context.py +0 -0
  147. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_constants.py +0 -0
  148. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_debug.py +0 -0
  149. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_debug_buffer.py +0 -0
  150. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_fake_models.py +0 -0
  151. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_git.py +0 -0
  152. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_paths.py +0 -0
  153. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_session_stats.py +0 -0
  154. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_startup_error.py +0 -0
  155. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_textual_patches.py +0 -0
  156. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/_tool_stream.py +0 -0
  157. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/app.tcss +0 -0
  158. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/approval_mode.py +0 -0
  159. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/ask_user.py +0 -0
  160. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/auth_display.py +0 -0
  161. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/auth_store.py +0 -0
  162. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/built_in_skills/__init__.py +0 -0
  163. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  164. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  165. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  166. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  167. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/__init__.py +0 -0
  168. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/commands/__init__.py +0 -0
  169. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/commands/auth.py +0 -0
  170. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/commands/config.py +0 -0
  171. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/client/launch/__init__.py +0 -0
  172. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/clipboard.py +0 -0
  173. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/default_agent_prompt.md +0 -0
  174. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/doctor.py +0 -0
  175. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/event_bus.py +0 -0
  176. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/extras_info.py +0 -0
  177. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/file_ops.py +0 -0
  178. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/formatting.py +0 -0
  179. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/hooks.py +0 -0
  180. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/input.py +0 -0
  181. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/integrations/__init__.py +0 -0
  182. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/integrations/openai_codex.py +0 -0
  183. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/integrations/sandbox_config.py +0 -0
  184. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/integrations/sandbox_factory.py +0 -0
  185. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/integrations/sandbox_provider.py +0 -0
  186. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/integrations/sandbox_registry.py +0 -0
  187. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/iterm_cursor_guide.py +0 -0
  188. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/managed_tools.py +0 -0
  189. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_auth.py +0 -0
  190. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_config.py +0 -0
  191. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_disabled.py +0 -0
  192. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_oauth_ui.py +0 -0
  193. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_providers/__init__.py +0 -0
  194. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_providers/_registry.py +0 -0
  195. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_providers/base.py +0 -0
  196. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_providers/github.py +0 -0
  197. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/mcp_providers/slack.py +0 -0
  198. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/media_utils.py +0 -0
  199. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/memory_guard.py +0 -0
  200. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/notifications.py +0 -0
  201. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/onboarding.py +0 -0
  202. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/output.py +0 -0
  203. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/paste_collapse.py +0 -0
  204. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/project_utils.py +0 -0
  205. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/py.typed +0 -0
  206. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/reasoning_effort.py +0 -0
  207. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/reliable_rubric.py +0 -0
  208. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/skills/__init__.py +0 -0
  209. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/skills/commands.py +0 -0
  210. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/state_migration.py +0 -0
  211. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/subagents.py +0 -0
  212. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/terminal_capabilities.py +0 -0
  213. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/terminal_escape.py +0 -0
  214. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/theme.py +0 -0
  215. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/todo_list_prompt.md +0 -0
  216. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tool_display.py +0 -0
  217. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tools.py +0 -0
  218. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/__init__.py +0 -0
  219. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/__init__.py +0 -0
  220. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  221. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/_links.py +0 -0
  222. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/agent_selector.py +0 -0
  223. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/approval.py +0 -0
  224. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/auth.py +0 -0
  225. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  226. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  227. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/debug_console.py +0 -0
  228. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/diff.py +0 -0
  229. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  230. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/goal_status.py +0 -0
  231. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/history.py +0 -0
  232. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  233. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/launch_init.py +0 -0
  234. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/loading.py +0 -0
  235. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  236. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  237. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
  238. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/model_selector.py +0 -0
  239. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/notification_center.py +0 -0
  240. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  241. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  242. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
  243. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  244. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/startup_tip.py +0 -0
  245. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/status.py +0 -0
  246. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  247. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  248. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/thread_selector.py +0 -0
  249. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  250. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  251. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/update_available.py +0 -0
  252. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  253. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/update_progress.py +0 -0
  254. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/tui/widgets/welcome.py +0 -0
  255. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/deepagents_code/unicode_security.py +0 -0
  256. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/examples/skills/arxiv-search/SKILL.md +0 -0
  257. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  258. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/examples/skills/langgraph-docs/SKILL.md +0 -0
  259. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/examples/skills/skill-creator/SKILL.md +0 -0
  260. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  261. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  262. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/examples/skills/web-research/SKILL.md +0 -0
  263. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/hatch_build.py +0 -0
  264. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/images/tui.png +0 -0
  265. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/scripts/check_imports.py +0 -0
  266. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/scripts/debug_server.sh +0 -0
  267. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/scripts/generate_commands_catalog.py +0 -0
  268. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/scripts/install.sh +0 -0
  269. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/README.md +0 -0
  270. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/__init__.py +0 -0
  271. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/benchmarks/__init__.py +0 -0
  272. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  273. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  274. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/conftest.py +0 -0
  275. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/test_acp_mode.py +0 -0
  276. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  277. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/integration_tests/test_sandbox_factory.py +0 -0
  278. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/__init__.py +0 -0
  279. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/client/__init__.py +0 -0
  280. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/client/commands/__init__.py +0 -0
  281. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/client/commands/test_auth.py +0 -0
  282. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  283. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/skills/__init__.py +0 -0
  284. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/skills/test_commands.py +0 -0
  285. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/skills/test_skills_json.py +0 -0
  286. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  287. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  288. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test__tool_stream.py +0 -0
  289. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_agent_friendly.py +0 -0
  290. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_approval_mode.py +0 -0
  291. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  292. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_auth_display.py +0 -0
  293. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_auth_store.py +0 -0
  294. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  295. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_charset.py +0 -0
  296. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_clipboard.py +0 -0
  297. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  298. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_config.py +0 -0
  299. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_cursor_blink.py +0 -0
  300. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_cursor_style.py +0 -0
  301. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_debug.py +0 -0
  302. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_debug_buffer.py +0 -0
  303. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_debug_console.py +0 -0
  304. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_doctor.py +0 -0
  305. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_env_vars.py +0 -0
  306. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_event_bus.py +0 -0
  307. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_exception_handling.py +0 -0
  308. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_extras_info.py +0 -0
  309. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_file_ops.py +0 -0
  310. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_formatting.py +0 -0
  311. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_git.py +0 -0
  312. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_goal_tools.py +0 -0
  313. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_hatch_build.py +0 -0
  314. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_hooks.py +0 -0
  315. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_imports.py +0 -0
  316. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_input_parsing.py +0 -0
  317. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_install_command.py +0 -0
  318. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_install_script.py +0 -0
  319. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  320. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_local_context.py +0 -0
  321. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_main_args.py +0 -0
  322. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_managed_tools.py +0 -0
  323. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_mcp_auth.py +0 -0
  324. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_mcp_config.py +0 -0
  325. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_mcp_disabled.py +0 -0
  326. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  327. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_media_utils.py +0 -0
  328. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_memory_guard.py +0 -0
  329. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_notifications.py +0 -0
  330. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_onboarding.py +0 -0
  331. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  332. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_output.py +0 -0
  333. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_paths.py +0 -0
  334. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_reliable_rubric.py +0 -0
  335. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_remote_client.py +0 -0
  336. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_rubric_cli.py +0 -0
  337. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_sandbox_config.py +0 -0
  338. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_sandbox_factory.py +0 -0
  339. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_sandbox_provider.py +0 -0
  340. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_sandbox_registry.py +0 -0
  341. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_server.py +0 -0
  342. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_server_helpers.py +0 -0
  343. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_session_stats.py +0 -0
  344. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_shell_allow_list.py +0 -0
  345. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  346. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_state_migration.py +0 -0
  347. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_subagents.py +0 -0
  348. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  349. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_terminal_escape.py +0 -0
  350. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  351. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_textual_patches.py +0 -0
  352. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_threads_resume.py +0 -0
  353. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_tool_display.py +0 -0
  354. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_tracing_replicas.py +0 -0
  355. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  356. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_ui.py +0 -0
  357. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_unicode_security.py +0 -0
  358. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/test_version.py +0 -0
  359. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tools/__init__.py +0 -0
  360. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tools/test_current_thread.py +0 -0
  361. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  362. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/__init__.py +0 -0
  363. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  364. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  365. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  366. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  367. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
  368. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  369. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  370. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  371. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  372. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  373. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  374. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  375. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  376. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  377. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
  378. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
  379. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  380. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  381. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  382. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  383. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
  384. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_status.py +0 -0
  385. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  386. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
  387. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  388. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  389. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  390. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
  391. {deepagents_code-0.1.39 → deepagents_code-0.1.40}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
@@ -51,6 +51,18 @@ Charset-dependent characters and animations have **single sources of truth**. Re
51
51
  - **Message passing** for widget communication - see [Events guide](https://textual.textualize.io/guide/events/)
52
52
  - **Reactive attributes** for state management - see [Reactivity guide](https://textual.textualize.io/guide/reactivity/)
53
53
 
54
+ ### UI component organization
55
+
56
+ Apply these rules to new UI; do not treat them as a mandate to refactor existing code.
57
+
58
+ - Put root abstractions under `tui/screens/` and `tui/modals/`, and reusable components under `tui/widgets/`.
59
+ - Give a large component its own `snake_case/` directory. Export its PascalCase root class from `__init__.py` (prefer implementing it there); give large subcomponents nested directories with the same pattern, while small subcomponents stay as sibling modules.
60
+ - Keep single-use constants, helpers, business logic, and UI logic beside the component that owns them. If a helper gains a second caller, consider hoisting it to their nearest shared directory; by the third caller, extract it to a shared utility module.
61
+ - Keep components focused; UI component modules should rarely exceed 200 lines.
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
+ - Widgets cannot use `CSS_PATH`; put intrinsic, auto-scoped defaults in `DEFAULT_CSS`. The mounting screen owns the widget's sizing and placement.
64
+ - Children must not import parent components. They may import shared utilities and data models; send events up and pass state/data down.
65
+
54
66
  ### Testing Textual apps
55
67
 
56
68
  - Use `textual.pilot` for async UI testing - see [Testing guide](https://textual.textualize.io/guide/testing/)
@@ -67,6 +79,17 @@ For Textual tests that intentionally replace concrete app methods with `MagicMoc
67
79
 
68
80
  Casts are acceptable when the type violation is the point of the test (for example, passing a wrong runtime type to exercise defensive validation) or when a third-party overload is narrower than verified runtime behavior. In those cases, keep the cast narrowly scoped and add a short comment explaining why it is intentional.
69
81
 
82
+ ## Input surface nomenclature
83
+
84
+ The REPL has **many** text-entry surfaces, so "the input" / "the input box" is ambiguous. Use these precise terms in code, comments, commit messages, and when talking to an agent. Each maps to a concrete class so there is a single, greppable referent.
85
+
86
+ - **Chat input** (a.k.a. the composer): the primary prompt field at the bottom of the REPL where the user types messages to the agent. The widget is `ChatInput` (`tui/widgets/chat_input.py`), a container whose bordered box has id `#input-box`. Its editable field is the `ChatTextArea` with id `#chat-input`. When an unqualified "the input box" is used, it means **this** — but prefer "chat input" to stay unambiguous.
87
+ - **Inline prompt**: a multi-line `TextArea` rendered inline in the message flow (not the chat input, not inside a modal). Base class `InlinePromptTextArea` (`tui/widgets/_inline_prompt.py`), subclassed by `AskUserTextArea` (free-text answers to agent `ask_user` questions, `ask_user.py`) and `GoalReviewTextArea` (editing goal text, `goal_review.py`).
88
+ - **Modal field**: a single-line Textual `Input` inside a modal screen. Refer to it by its owner, e.g. the *auth key field* (`auth.py`), *MCP login field* (`#ml-input`, `mcp_login.py`), or the *rejection reason field* (`approval.py`).
89
+ - **Filter input**: the single-line `Input` that filters an `OptionList`/`Select` in a picker — the *model-selector filter* (`model_selector.py`), *thread-selector filter* (`thread_selector.py`), and *MCP viewer filter* (`#mcp-filter`, `mcp_viewer.py`). A specialized modal field; call it a "filter input" when the point is filtering.
90
+
91
+ Rule of thumb: say **chat input** for the main composer and name any other surface by its owner (`<owner> field` / `<owner> filter`). Reserve bare "input box" for the chat input only.
92
+
70
93
  ## SDK dependency pin
71
94
 
72
95
  `deepagents-code` pins an exact `deepagents==X.Y.Z` version in `pyproject.toml`. When developing features that depend on new SDK functionality, bump this pin as part of the same PR. A CI check verifies the pin is not older than the current SDK version at release time (unless bypassed with `dangerous-skip-sdk-pin-check`); pins ahead of the workspace SDK are allowed for intentional prerelease coordination.
@@ -2,6 +2,28 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.40](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.39...deepagents-code==0.1.40) (2026-07-16)
6
+
7
+ ### Features
8
+
9
+ - Added plugin marketplace support ([#4554](https://github.com/langchain-ai/deepagents/issues/4554)).
10
+ - Added an “always allow” option to the project MCP approval prompt ([#4562](https://github.com/langchain-ai/deepagents/issues/4562)).
11
+ - Improved `/goal` workflows: criteria generation now runs server-side, YOLO mode auto-accepts criteria, goals complete after satisfied grading, and goal review editing now supports `Ctrl+X` ([#4754](https://github.com/langchain-ai/deepagents/issues/4754), [#4784](https://github.com/langchain-ai/deepagents/issues/4784), [#4781](https://github.com/langchain-ai/deepagents/issues/4781), [#4780](https://github.com/langchain-ai/deepagents/issues/4780)).
12
+ - Reasoning effort now persists across restarts ([#4728](https://github.com/langchain-ai/deepagents/issues/4728)).
13
+ - Added a toast prompting you to re-paste when a chat paste collapses ([#4742](https://github.com/langchain-ai/deepagents/issues/4742)).
14
+
15
+ ### Bug Fixes
16
+
17
+ - Tool calls awaiting approval are now surfaced correctly ([#4739](https://github.com/langchain-ai/deepagents/issues/4739)).
18
+ - Fixed transcript tail hydration when scrolled to the bottom edge ([#4733](https://github.com/langchain-ai/deepagents/issues/4733)).
19
+ - Kept chat input responsive during MCP viewer `Ctrl+R` reconnects ([#4753](https://github.com/langchain-ai/deepagents/issues/4753)).
20
+ - Improved inline free-text prompts by sharing paste handling and matching primary-input `Ctrl+D` behavior ([#4736](https://github.com/langchain-ai/deepagents/issues/4736), [#4729](https://github.com/langchain-ai/deepagents/issues/4729)).
21
+ - Fixed local offloaded tool results to use the real filesystem ([#4740](https://github.com/langchain-ai/deepagents/issues/4740)).
22
+ - Cleaned offloaded history when deleting a thread ([#4751](https://github.com/langchain-ai/deepagents/issues/4751)).
23
+ - Removed duplicated content from the system prompt by overwriting the base prompt ([#4516](https://github.com/langchain-ai/deepagents/issues/4516)).
24
+ - Closed subprocess transport during install teardown ([#4735](https://github.com/langchain-ai/deepagents/issues/4735)).
25
+ - Added targeted `uv` constraints for prerelease dependencies ([#4744](https://github.com/langchain-ai/deepagents/issues/4744)).
26
+
5
27
  ## [0.1.39](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.38...deepagents-code==0.1.39) (2026-07-14)
6
28
 
7
29
  ### Bug fixes
@@ -8,7 +8,7 @@ Regenerate this file with `make commands-catalog` after changing command names,
8
8
  aliases, descriptions, visibility, or hidden-command metadata.
9
9
 
10
10
 
11
- ## Public (33)
11
+ ## Public (34)
12
12
 
13
13
  | Command | Aliases | Description |
14
14
  | --- | --- | --- |
@@ -30,6 +30,7 @@ aliases, descriptions, visibility, or hidden-command metadata.
30
30
  | `/model` | | Switch models or edit model settings |
31
31
  | `/notifications` | | Configure startup warnings |
32
32
  | `/offload` | `/compact` | Summarize and offload older messages to free context |
33
+ | `/plugins` | | Manage plugins (experimental) |
33
34
  | `/quit` | `/q` | Exit app |
34
35
  | `/reload` | | Reload environment and config |
35
36
  | `/remember` | | Save useful context to memory or skills |
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents-code
3
- Version: 0.1.39
3
+ Version: 0.1.40
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/
@@ -16,7 +16,7 @@
16
16
  - Non-interactive pipeline runner (`client/non_interactive.py`)
17
17
  - Agent creation (`agent.py`)
18
18
  - Built-in tools (`tools.py`: `http_request`, `web_search`, `fetch_url`)
19
- - MCP config loader and trust store (`mcp_tools.py`, `mcp_trust.py`)
19
+ - MCP config loader and per-server allow/deny lists (`mcp_tools.py`, `model_config.py`)
20
20
  - Hook dispatcher (`hooks.py`)
21
21
  - Sandbox integration factory (`integrations/sandbox_factory.py`, `integrations/sandbox_provider.py`)
22
22
  - Session persistence (`sessions.py`)
@@ -125,7 +125,7 @@
125
125
  | 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` |
126
126
  | 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` |
127
127
  | 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` |
128
- | C5 | MCP Loader & Trust | Discovers/loads `.mcp.json`, validates server configs, manages trust store | framework-controlled | No² | `mcp_tools.resolve_and_load_mcp_tools`, `mcp_trust.compute_config_fingerprint` |
128
+ | 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` |
129
129
  | C6 | Hook Dispatcher | Fires subprocess commands on agent lifecycle events | framework-controlled | No³ | `hooks.dispatch_hook`, `hooks._run_single_hook` |
130
130
  | C7 | Sandbox Integration | Creates/destroys remote sandboxes (Daytona, LangSmith, Modal, Runloop, AgentCore) | framework-controlled | No⁴ | `integrations.sandbox_factory.create_sandbox` |
131
131
  | C8 | Session Persistence | SQLite checkpoint store for LangGraph thread state | framework-controlled | Yes | `sessions.get_db_path`, `sessions.generate_thread_id` |
@@ -156,7 +156,6 @@
156
156
  | DC1 | API Keys / Credentials | `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `TAVILY_API_KEY`, `LANGSMITH_API_KEY`, `LANGGRAPH_API_KEY` | Critical | Process environment only; never written to disk by CLI code | N/A (in-memory) | Process lifetime | All — breach trigger |
157
157
  | DC2 | Conversation Messages | User prompts, LLM responses, tool args/results | High | SQLite (`~/.deepagents/*.db`) via LangGraph checkpointer | No (local file, unencrypted) | Unbounded (session files persist) | GDPR if personal data is discussed |
158
158
  | DC3 | System Prompt Content | `DA_SERVER_SYSTEM_PROMPT` env var; custom AGENTS.md contents | Medium | Process environment (transient); `~/.deepagents/{agent}/AGENTS.md` on disk | No | Config lifetime | None direct |
159
- | DC4 | MCP Trust Fingerprints | `projects.*` in `mcp_trust.json` | Low | `~/.deepagents/.state/mcp_trust.json` | No | Until revoked | None |
160
159
  | DC5 | Offloaded Conversation History | Summarized + raw conversation messages written to sandbox backend | High | Sandbox filesystem at `/conversation_history/{thread_id}.md` | Depends on sandbox provider | Sandbox session lifetime | GDPR if personal data is discussed |
161
160
 
162
161
  ### Data Classification Details
@@ -200,7 +199,7 @@
200
199
  | TB1 | User Input → Agent Engine | Where user-typed prompts enter the agent graph | Prompt routing, session threading, UI rendering | Prompt content — any text accepted |
201
200
  | 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 |
202
201
  | 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 |
203
- | TB4 | MCP Config → Process / Network | `.mcp.json` triggers subprocess spawn or network connection | Schema validation, SHA-256 fingerprint trust gate | What the MCP process does once trusted and running |
202
+ | 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 |
204
203
  | TB5 | Hooks Config → Subprocess | `hooks.json` commands execute as local subprocesses | JSON structure validation, 5-second timeout | Command content (user-authored); env vars available to child |
205
204
  | TB6 | Setup Script → Sandbox Execution | User-supplied script runs inside sandbox at startup | `shlex.quote()` wrapping; `string.Template.safe_substitute` | Script content (user-authored); sandbox network access |
206
205
  | TB7 | External LLM API → Agent State | LLM API responses drive tool call decisions | LLM client configuration, model selection, request params | LLM output content; provider-side safety |
@@ -232,7 +231,7 @@
232
231
 
233
232
  #### TB4: MCP Config → Process / Network
234
233
 
235
- - **Inside**: `mcp_tools._validate_server_config` validates JSON structure and field types. `mcp_trust.compute_config_fingerprint` computes SHA-256 over config file contents. Project-level stdio servers require trust approval (fingerprint prompt) unless `--trust-project-mcp` is set. A user can selectively pre-approve or reject individual project servers by name via `[mcp].enabled_project_servers` / `disabled_project_servers` (or the `DEEPAGENTS_CODE_ENABLED_PROJECT_MCP_SERVERS` / `..._DISABLED_...` env vars); reject wins over approval and over full trust. These lists 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_ENABLED_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. Enabled resolves env-over-TOML, but 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 allowlisted (or fully trusted) names survive into the merged config, so a non-allowlisted remote entry is never preflighted and its interpolated headers are never resolved. Note that the allow list binds by server *name*, not by fingerprint: an allowlisted name is loaded whatever definition the repo currently gives it, bypassing the fingerprint change-detection that re-prompts on full-config trust — so users should only allowlist names in repos they would otherwise trust.
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.
236
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.
237
236
  - **Crossing mechanism**: `subprocess.Popen` (via `langchain_mcp_adapters`) for stdio; HTTP/SSE for remote servers.
238
237
 
@@ -305,7 +304,7 @@
305
304
  #### DF11: MCP Tool Results → Agent Context
306
305
 
307
306
  - **Data**: Arbitrary strings/objects from MCP tool calls.
308
- - **Validation**: MCP config fingerprinted at load time. Tool result content not validated after server is trusted.
307
+ - **Validation**: MCP config approved at load time (per-server allow-list or interactive prompt). Tool result content not validated after server is trusted.
309
308
  - **Trust assumption**: User trusted the MCP server; its outputs are as reliable as the server.
310
309
 
311
310
  #### DF18: DA_SERVER_* Env Vars
@@ -330,7 +329,7 @@
330
329
 
331
330
  - **Data**: Arbitrary key-value pairs from the `"env"` field of stdio server definitions in `.mcp.json`.
332
331
  - **Validation**: Type check only — `env` must be a dict (`mcp_tools._validate_server_config`). No filtering of key names or values. Forwarded directly to `StdioConnection` which passes to `subprocess.Popen`.
333
- - **Trust assumption**: User authored or approved the MCP config. Project-level configs go through fingerprint trust gate before loading.
332
+ - **Trust assumption**: User authored or approved the MCP config. Project-level configs go through the approval gate (allow-list or interactive prompt) before loading.
334
333
 
335
334
  ---
336
335
 
@@ -410,7 +409,7 @@
410
409
 
411
410
  - **Flow**: DF24 (MCP config → subprocess environment)
412
411
  - **Description**: The `"env"` field in stdio MCP server definitions (`.mcp.json`) accepts an arbitrary key-value dict. `mcp_tools._validate_server_config` only checks that the field is a dict — it does not filter key names or values. The dict is forwarded directly to `StdioConnection(env=...)` which passes it to the subprocess. An attacker who can modify a project-level `.mcp.json` could set `PATH` to redirect command resolution, `LD_PRELOAD` to inject shared libraries, or `PYTHONPATH` to hijack Python imports in the MCP subprocess.
413
- - **Preconditions**: (1) Attacker has write access to a project-level `.mcp.json`; (2) The project MCP config must be trusted by the user (fingerprint approval gate via `mcp_trust`). For user-level `~/.deepagents/.mcp.json`, the attacker already has home directory write access. Note: the `env` dict from MCP config is passed to `StdioConnection` — whether it replaces or merges with `os.environ` depends on the `langchain_mcp_adapters` library implementation.
412
+ - **Preconditions**: (1) Attacker has write access to a project-level `.mcp.json`; (2) The project MCP config must be approved by the user (the interactive prompt, `--trust-project-mcp`, or the server approved via `[mcp].enabled_project_server_approvals` / the `DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS` env var). For user-level `~/.deepagents/.mcp.json`, the attacker already has home directory write access. Note: the `env` dict from MCP config is passed to `StdioConnection` — whether it replaces or merges with `os.environ` depends on the `langchain_mcp_adapters` library implementation.
414
413
 
415
414
  #### T11: Auto-Installed ripgrep Binary from Upstream Release
416
415
 
@@ -435,7 +434,7 @@
435
434
  | LLM output | DF6, DF7 | T1, T2, T3, T4| HITL gate; shell allow-list; Unicode/URL warnings on tool args | Project | LLM-generated tool args not scanned for injection beyond Unicode/URL |
436
435
  | Tool/function results | DF9, DF11 | T1 | Unicode warning on URL args; `markdownify` HTML conversion | Shared | Tool *results* pass to context without prompt-injection scan |
437
436
  | URL-fetched content | DF8, DF9 | T1 | `check_url_safety` on URL arg; HTML→markdown conversion | Shared | Markup-embedded instructions survive markdownify; no LLM-layer guardrail |
438
- | Configuration | DF10, DF12, DF15, DF23| T9, T10, T12 | Dotenv shell-env precedence; TOML schema; MCP schema + fingerprint; JSON structure check; `class_path` format check | User | Project `.env` can set shell startup-hook vars; `class_path` executes module code before type check; MCP env dict unfiltered |
437
+ | Configuration | DF10, DF12, DF15, DF23| T9, T10, T12 | Dotenv shell-env precedence; TOML schema; MCP schema + allow/deny lists; JSON structure check; `class_path` format check | User | Project `.env` can set shell startup-hook vars; `class_path` executes module code before type check; MCP env dict unfiltered |
439
438
  | Session restore | DF14 | T5 | OS file permissions; SQLite | Project | Unencrypted at rest |
440
439
  | Server IPC (env vars) | DF18 | T6 | `ServerConfig` serialization; parent env passed to child | Project | Provider API keys flow to server subprocess; system prompt in env |
441
440
  | Host environment | DF19, DF20 | T7 | Static script; exit code check; 30s timeout | Shared | Makefile content injected into system prompt without sanitization |
@@ -454,7 +453,7 @@ Threats that appear valid in isolation but fall outside project responsibility b
454
453
  |-------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------|
455
454
  | 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. |
456
455
  | 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. |
457
- | 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. | Fingerprint-based trust prompts for project-level stdio configs (`mcp_trust.compute_config_fingerprint`). |
456
+ | 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`). |
458
457
  | 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`. |
459
458
  | 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`. |
460
459
  | Hook commands doing harmful things | Hooks in `~/.deepagents/hooks.json` are 100% user-authored. The payload is data-only (JSON on stdin). | JSON structure validation (`hooks._load_hooks`); 5-second timeout. |
@@ -494,3 +493,4 @@ Threats that appear valid in isolation but fall outside project responsibility b
494
493
  | 2026-03-28 | langster-threat-model (automated) | Deep validation pass: added C17 (Model Config Loader with class_path), TB11 (Config→Code Execution); added DC5 (offloaded conversation history); added DF23-DF25 (class_path flow, MCP env dict flow, offload flow); added T9 (class_path arbitrary code execution), T10 (MCP env dict unfiltered); added D3 (SSRF dismissed — HITL is intended control), D4 (offload path injection dismissed — UUID7); **removed Status column and Mitigations/Residual Risk fields from all threats** (open source visibility compliance — mitigation status must not appear in public threat models); updated T6 validation from Likely to Verified (port is deterministic at 2024 default, discoverable via /proc); updated external context (no published advisories found); updated architecture diagram |
495
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 |
496
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
+ | 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 |
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "8eb909a"
3
+ BUILD_COMMIT = "019489e"
@@ -51,6 +51,28 @@ Takes precedence over `[ui].cursor_style` in config.toml. Invalid values fall
51
51
  through to the config file and then the default block cursor.
52
52
  """
53
53
 
54
+ DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS = (
55
+ "DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS"
56
+ )
57
+ """Comma-separated project MCP server names to dangerously pre-approve by name.
58
+
59
+ This is an explicit process-wide escape hatch. Servers named here load from an
60
+ otherwise-untrusted project `.mcp.json` without prompting (they are omitted from
61
+ the interactive approval prompt), while non-listed servers still require
62
+ approval (they go through the prompt, and stay dropped only on the
63
+ non-interactive or denied paths). Like
64
+ `DISABLED_PROJECT_MCP_SERVERS`, this is user-controlled process env, not a repo
65
+ file, so it does not weaken the user-level-only trust boundary (a committed
66
+ *project* `.env` cannot set it; see `config._PROJECT_DOTENV_DENIED_ENV_KEYS`).
67
+ This dangerous contract is name-based: a different project, command change, or
68
+ URL change under the same server name still matches.
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.)
74
+ """
75
+
54
76
  DEBUG = "DEEPAGENTS_CODE_DEBUG"
55
77
  """Enable verbose debug logging and preserve the server subprocess log.
56
78
 
@@ -106,34 +128,15 @@ DISABLED_PROJECT_MCP_SERVERS = "DEEPAGENTS_CODE_DISABLED_PROJECT_MCP_SERVERS"
106
128
  A user-level equivalent of `[mcp].disabled_project_servers`.
107
129
 
108
130
  Rejection wins over approval: a name listed here is dropped even when it also
109
- appears in `ENABLED_PROJECT_MCP_SERVERS` (or `[mcp].enabled_project_servers`)
110
- and even when the project config is otherwise trusted. Unlike the enabled list,
111
- this env var *unions* with (rather than replaces)
112
- `[mcp].disabled_project_servers` — denies accumulate across sources, so neither
113
- can silently empty a deny set in the other. This is process env the user
114
- controls, not a repo file, so it does not weaken the user-level-only
115
- trust boundary: a committed *project* `.env` is blocked from setting it
116
- (see `config._PROJECT_DOTENV_DENIED_ENV_KEYS`); only the user's shell,
117
- launch env, or global `~/.deepagents/.env` can.
118
- """
119
-
120
- ENABLED_PROJECT_MCP_SERVERS = "DEEPAGENTS_CODE_ENABLED_PROJECT_MCP_SERVERS"
121
- """Comma-separated project MCP server names to pre-approve by name.
122
-
123
- A user-level equivalent of `[mcp].enabled_project_servers`.
124
-
125
- Servers named here load from an otherwise-untrusted project `.mcp.json` without
126
- prompting (they are omitted from the interactive approval prompt), while
127
- non-listed servers stay dropped. Like `DISABLED_PROJECT_MCP_SERVERS`, this is
128
- user-controlled process env, not a repo file, so it does not weaken
129
- the user-level-only trust boundary (a committed *project* `.env` cannot set it;
130
- see `config._PROJECT_DOTENV_DENIED_ENV_KEYS`). This contract is name-based:
131
- a project command or URL change under the same server name still matches.
132
-
133
- When set, this replaces (takes precedence over) the
134
- `[mcp].enabled_project_servers` TOML list.
135
- (`DISABLED_PROJECT_MCP_SERVERS` instead *unions* with its TOML list, so a deny
136
- is never silently emptied.)
131
+ appears in `DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS` or in a scoped
132
+ `[mcp].enabled_project_server_approvals` entry, and even when the project config
133
+ is otherwise trusted. Unlike the enabled list, this env var *unions* with
134
+ (rather than replaces) `[mcp].disabled_project_servers` — denies accumulate
135
+ across sources, so neither can silently empty a deny set in the other. This is
136
+ process env the user controls, not a repo file, so it does not weaken the
137
+ user-level-only trust boundary: a committed *project* `.env` is blocked from
138
+ setting it (see `config._PROJECT_DOTENV_DENIED_ENV_KEYS`); only the user's
139
+ shell, launch env, or global `~/.deepagents/.env` can.
137
140
  """
138
141
 
139
142
  EXPERIMENTAL = "DEEPAGENTS_CODE_EXPERIMENTAL"
@@ -200,6 +203,13 @@ The value is comma-separated for forward-compatibility, not because multiple
200
203
  destinations are written today.
201
204
  """
202
205
 
206
+ LEGACY_ENABLED_PROJECT_MCP_SERVERS = "DEEPAGENTS_CODE_ENABLED_PROJECT_MCP_SERVERS"
207
+ """Removed project MCP allowlist env var retained for migration detection only.
208
+
209
+ The app no longer honors this value. It detects the old name so users receive a
210
+ migration notice pointing to `DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS`.
211
+ """
212
+
203
213
  LOG_LEVEL = "DEEPAGENTS_CODE_LOG_LEVEL"
204
214
  """Minimum level for `deepagents_code` runtime logging.
205
215
 
@@ -248,6 +258,12 @@ Set to a truthy value to bring the standalone integrations screen back into the
248
258
  flow. Parsed by `is_env_truthy`: accepts `1`, `true`, `yes`, `on` as enabled.
249
259
  """
250
260
 
261
+ PLUGIN_CACHE_DIR = "DEEPAGENTS_CODE_PLUGIN_CACHE_DIR"
262
+ """Override the plugin install/marketplace cache root.
263
+
264
+ When unset, plugins are stored under `DEFAULT_CONFIG_DIR / "plugins"`.
265
+ """
266
+
251
267
  RESTARTED_AFTER_UPDATE = "DEEPAGENTS_CODE_RESTARTED_AFTER_UPDATE"
252
268
  """Internal sentinel recording the target version immediately before the
253
269
  startup auto-update re-execs the process.
@@ -385,3 +401,6 @@ def is_env_truthy(name: str, *, default: bool = False) -> bool:
385
401
  return default
386
402
  classified = classify_env_bool(raw)
387
403
  return default if classified is None else classified
404
+
405
+
406
+ EXPERIMENTAL_HINT = f"This feature is experimental. Set {EXPERIMENTAL}=1 to enable."
@@ -195,6 +195,9 @@ class ServerConfig:
195
195
  """Extra kwargs forwarded to the chat model constructor (temperature,
196
196
  max_tokens, etc.)."""
197
197
 
198
+ profile_overrides: dict[str, Any] | None = None
199
+ """Model profile metadata overrides resolved by the client."""
200
+
198
201
  assistant_id: str = DEFAULT_ASSISTANT_ID
199
202
  """Identifier of the agent graph to invoke on the server."""
200
203
 
@@ -339,6 +342,11 @@ class ServerConfig:
339
342
  "MODEL_PARAMS": (
340
343
  json.dumps(self.model_params) if self.model_params is not None else None
341
344
  ),
345
+ "PROFILE_OVERRIDES": (
346
+ json.dumps(self.profile_overrides)
347
+ if self.profile_overrides is not None
348
+ else None
349
+ ),
342
350
  "ASSISTANT_ID": self.assistant_id,
343
351
  "SYSTEM_PROMPT": self.system_prompt,
344
352
  "AUTO_APPROVE": str(self.auto_approve).lower(),
@@ -396,6 +404,7 @@ class ServerConfig:
396
404
  return cls(
397
405
  model=_read_env_str("MODEL"),
398
406
  model_params=_read_env_json("MODEL_PARAMS"),
407
+ profile_overrides=_read_env_json("PROFILE_OVERRIDES"),
399
408
  assistant_id=_read_env_str("ASSISTANT_ID") or DEFAULT_ASSISTANT_ID,
400
409
  system_prompt=_read_env_str("SYSTEM_PROMPT"),
401
410
  auto_approve=_read_env_bool("AUTO_APPROVE"),
@@ -440,6 +449,7 @@ class ServerConfig:
440
449
  project_context: ProjectContext | None,
441
450
  model_name: str | None,
442
451
  model_params: dict[str, Any] | None,
452
+ profile_overrides: dict[str, Any] | None = None,
443
453
  assistant_id: str,
444
454
  auto_approve: bool,
445
455
  interrupt_shell_only: bool = False,
@@ -470,6 +480,7 @@ class ServerConfig:
470
480
  project_context: Explicit user/project path context.
471
481
  model_name: Model spec string.
472
482
  model_params: Extra model kwargs.
483
+ profile_overrides: Model profile metadata overrides.
473
484
  assistant_id: Agent identifier.
474
485
  auto_approve: Auto-approve all tools.
475
486
  interrupt_shell_only: Validate shell commands via middleware instead
@@ -508,6 +519,7 @@ class ServerConfig:
508
519
  return cls(
509
520
  model=model_name,
510
521
  model_params=model_params,
522
+ profile_overrides=profile_overrides,
511
523
  assistant_id=assistant_id,
512
524
  auto_approve=auto_approve,
513
525
  interrupt_shell_only=interrupt_shell_only,
@@ -27,6 +27,7 @@ if TYPE_CHECKING:
27
27
  DCA_TEST_WRITE_FILE_MARKER = "DCA_TEST_WRITE_FILE="
28
28
  DCA_TEST_DELEGATE_WRITE_MARKER = "DCA_TEST_DELEGATE_WRITE="
29
29
  DCA_SUBAGENT_WRITE_FILE_MARKER = "DCA_SUBAGENT_WRITE_FILE="
30
+ DCA_TEST_GOAL_CRITERIA_MARKER = "DCA_TEST_GOAL_CRITERIA="
30
31
 
31
32
  # Distinct file contents per write path, so a test asserting on file content can
32
33
  # prove which branch executed — in particular that subagent mode delegated through
@@ -303,3 +304,43 @@ class ToolCallingIntegrationChatModel(DeterministicIntegrationChatModel):
303
304
  ),
304
305
  ),
305
306
  )
307
+
308
+
309
+ class GoalCriteriaIntegrationChatModel(DeterministicIntegrationChatModel):
310
+ """Exercise nested criteria generation with a repository read."""
311
+
312
+ disable_streaming: bool = True
313
+
314
+ def _generate(
315
+ self,
316
+ messages: list[BaseMessage],
317
+ stop: list[str] | None = None, # noqa: ARG002
318
+ run_manager: CallbackManagerForLLMRun | None = None, # noqa: ARG002
319
+ **kwargs: Any, # noqa: ARG002
320
+ ) -> ChatResult:
321
+ """Read the marked file, then return a structured goal proposal.
322
+
323
+ Returns:
324
+ A repository tool call followed by a `GoalProposal` tool call.
325
+ """
326
+ prompt = "\n".join(
327
+ text
328
+ for message in messages
329
+ if (text := self._stringify_message(message)).strip()
330
+ )
331
+ has_tool_result = any(message.type == "tool" for message in messages)
332
+ if DCA_TEST_GOAL_CRITERIA_MARKER in prompt and not has_tool_result:
333
+ path = _extract_marker_path(prompt, DCA_TEST_GOAL_CRITERIA_MARKER)
334
+ return _tool_call_result(
335
+ "read_file",
336
+ {"file_path": path, "limit": 20},
337
+ "call_goal_read",
338
+ )
339
+ return _tool_call_result(
340
+ "GoalProposal",
341
+ {
342
+ "objective": "verify server-side criteria generation",
343
+ "criteria": "- server repository context is available",
344
+ },
345
+ "call_goal_proposal",
346
+ )
@@ -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.39" # x-release-please-version
5
+ __version__ = "0.1.40" # 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."""