deepagents-code 0.1.11__tar.gz → 0.1.13__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 (279) hide show
  1. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/.gitignore +15 -0
  2. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/AGENTS.md +55 -1
  3. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/CHANGELOG.md +53 -0
  4. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/COMMANDS.md +3 -3
  5. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/PKG-INFO +20 -20
  6. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/THREAT_MODEL.md +7 -0
  7. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_debug.py +29 -9
  8. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_env_vars.py +37 -7
  9. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_server_config.py +3 -1
  10. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_session_stats.py +1 -1
  11. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_textual_patches.py +137 -4
  12. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_version.py +1 -1
  13. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/agent.py +124 -30
  14. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/app.py +1473 -123
  15. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/command_registry.py +8 -6
  16. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/config.py +579 -206
  17. deepagents_code-0.1.13/deepagents_code/config_commands.py +487 -0
  18. deepagents_code-0.1.13/deepagents_code/config_manifest.py +1055 -0
  19. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/configurable_model.py +1 -1
  20. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/filesystem_empty_result.py +11 -0
  21. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/input.py +2 -2
  22. deepagents_code-0.1.13/deepagents_code/integrations/sandbox_config.py +198 -0
  23. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/integrations/sandbox_factory.py +74 -71
  24. deepagents_code-0.1.13/deepagents_code/integrations/sandbox_provider.py +137 -0
  25. deepagents_code-0.1.13/deepagents_code/integrations/sandbox_registry.py +341 -0
  26. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/local_context.py +129 -7
  27. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/main.py +248 -24
  28. deepagents_code-0.1.13/deepagents_code/managed_tools.py +470 -0
  29. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_auth.py +8 -2
  30. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_commands.py +4 -0
  31. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_tools.py +46 -11
  32. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/media_utils.py +2 -2
  33. deepagents_code-0.1.13/deepagents_code/memory_guard.py +406 -0
  34. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/model_config.py +104 -6
  35. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/offload.py +1 -1
  36. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/onboarding.py +35 -0
  37. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/remote_client.py +29 -4
  38. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/server.py +51 -4
  39. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/server_graph.py +2 -2
  40. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/sessions.py +27 -1
  41. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/system_prompt.md +2 -0
  42. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/textual_adapter.py +45 -6
  43. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/theme.py +3 -3
  44. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/tools.py +25 -2
  45. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/ui.py +60 -1
  46. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/update_check.py +17 -5
  47. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/ask_user.py +5 -2
  48. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/autocomplete.py +53 -4
  49. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/chat_input.py +177 -15
  50. deepagents_code-0.1.13/deepagents_code/widgets/cwd_switch.py +157 -0
  51. deepagents_code-0.1.13/deepagents_code/widgets/install_confirm.py +120 -0
  52. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/messages.py +174 -88
  53. deepagents_code-0.1.13/deepagents_code/widgets/restart_prompt.py +135 -0
  54. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/status.py +110 -1
  55. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/theme_selector.py +60 -6
  56. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/thread_selector.py +63 -24
  57. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/welcome.py +24 -175
  58. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/examples/skills/arxiv-search/arxiv_search.py +1 -1
  59. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/pyproject.toml +30 -37
  60. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/test_compact_resume.py +2 -2
  61. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/test_sandbox_factory.py +5 -6
  62. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/conftest.py +15 -0
  63. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_agent.py +331 -13
  64. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_agent_friendly.py +1 -1
  65. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_app.py +3132 -361
  66. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_approval.py +9 -9
  67. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_args.py +73 -1
  68. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_auth_display.py +6 -1
  69. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_autocomplete.py +194 -0
  70. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_charset.py +18 -1
  71. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_chat_input.py +248 -6
  72. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_command_registry.py +15 -3
  73. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_config.py +481 -3
  74. deepagents_code-0.1.13/tests/unit_tests/test_config_manifest.py +999 -0
  75. deepagents_code-0.1.13/tests/unit_tests/test_cwd_switch.py +85 -0
  76. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_debug.py +72 -1
  77. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_event_bus.py +1 -1
  78. deepagents_code-0.1.13/tests/unit_tests/test_install_command.py +784 -0
  79. deepagents_code-0.1.13/tests/unit_tests/test_install_confirm.py +88 -0
  80. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_launch_init.py +2 -2
  81. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_links.py +2 -2
  82. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_loading.py +4 -7
  83. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_local_context.py +250 -15
  84. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_main.py +120 -3
  85. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_main_acp_mode.py +6 -2
  86. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_main_args.py +365 -18
  87. deepagents_code-0.1.13/tests/unit_tests/test_managed_tools.py +690 -0
  88. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_auth.py +1 -1
  89. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_commands.py +1 -1
  90. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_login_modal.py +11 -11
  91. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_tools.py +106 -34
  92. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_viewer.py +5 -5
  93. deepagents_code-0.1.13/tests/unit_tests/test_memory_guard.py +411 -0
  94. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_message_store.py +1 -1
  95. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_messages.py +275 -34
  96. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_model_config.py +113 -4
  97. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_model_switch.py +44 -44
  98. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_non_interactive.py +2 -2
  99. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_notifications.py +1 -1
  100. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_offload.py +13 -13
  101. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_onboarding.py +53 -2
  102. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_reload.py +160 -26
  103. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_remote_client.py +39 -4
  104. deepagents_code-0.1.13/tests/unit_tests/test_restart_prompt.py +88 -0
  105. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_resume_state.py +14 -14
  106. deepagents_code-0.1.13/tests/unit_tests/test_sandbox_config.py +140 -0
  107. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_sandbox_factory.py +95 -10
  108. deepagents_code-0.1.13/tests/unit_tests/test_sandbox_provider.py +50 -0
  109. deepagents_code-0.1.13/tests/unit_tests/test_sandbox_registry.py +305 -0
  110. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_server.py +41 -1
  111. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_server_graph.py +3 -1
  112. deepagents_code-0.1.13/tests/unit_tests/test_server_helpers.py +169 -0
  113. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_sessions.py +50 -3
  114. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_skill_invocation.py +11 -10
  115. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_startup_fast_paths.py +2 -0
  116. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_status.py +207 -5
  117. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_terminal_escape.py +11 -2
  118. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_textual_adapter.py +63 -25
  119. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_textual_patches.py +115 -0
  120. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_theme.py +461 -5
  121. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_thread_selector.py +472 -83
  122. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_tool_display.py +3 -3
  123. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_ui.py +34 -1
  124. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_update_check.py +31 -5
  125. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_update_progress.py +5 -2
  126. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_welcome.py +47 -143
  127. deepagents_code-0.1.13/tests/unit_tests/tools/test_current_thread.py +27 -0
  128. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/uv.lock +174 -171
  129. deepagents_code-0.1.11/deepagents_code/integrations/sandbox_provider.py +0 -71
  130. deepagents_code-0.1.11/tests/unit_tests/test_install_command.py +0 -357
  131. deepagents_code-0.1.11/tests/unit_tests/test_server_helpers.py +0 -95
  132. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/DEV.md +0 -0
  133. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/Makefile +0 -0
  134. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/README.md +0 -0
  135. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/__init__.py +0 -0
  136. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/__main__.py +0 -0
  137. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_ask_user_types.py +0 -0
  138. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_cli_context.py +0 -0
  139. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_constants.py +0 -0
  140. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_git.py +0 -0
  141. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_startup_error.py +0 -0
  142. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/_testing_models.py +0 -0
  143. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/app.tcss +0 -0
  144. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/ask_user.py +0 -0
  145. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/auth_display.py +0 -0
  146. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/auth_store.py +0 -0
  147. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/built_in_skills/__init__.py +0 -0
  148. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  149. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  150. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  151. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  152. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/clipboard.py +0 -0
  153. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/default_agent_prompt.md +0 -0
  154. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/editor.py +0 -0
  155. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/event_bus.py +0 -0
  156. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/extras_info.py +0 -0
  157. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/file_ops.py +0 -0
  158. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/formatting.py +0 -0
  159. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/hooks.py +0 -0
  160. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/integrations/__init__.py +0 -0
  161. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/iterm_cursor_guide.py +0 -0
  162. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_disabled.py +0 -0
  163. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_login_service.py +0 -0
  164. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_oauth_ui.py +0 -0
  165. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_providers/__init__.py +0 -0
  166. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_providers/_registry.py +0 -0
  167. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_providers/base.py +0 -0
  168. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_providers/github.py +0 -0
  169. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_providers/slack.py +0 -0
  170. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/mcp_trust.py +0 -0
  171. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/non_interactive.py +0 -0
  172. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/notifications.py +0 -0
  173. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/output.py +0 -0
  174. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/project_utils.py +0 -0
  175. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/py.typed +0 -0
  176. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/resume_state.py +0 -0
  177. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/server_manager.py +0 -0
  178. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/skills/__init__.py +0 -0
  179. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/skills/commands.py +0 -0
  180. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/skills/invocation.py +0 -0
  181. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/skills/load.py +0 -0
  182. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/state_migration.py +0 -0
  183. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/subagents.py +0 -0
  184. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/terminal_capabilities.py +0 -0
  185. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/terminal_escape.py +0 -0
  186. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/tool_display.py +0 -0
  187. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/unicode_security.py +0 -0
  188. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/__init__.py +0 -0
  189. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/_links.py +0 -0
  190. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/agent_selector.py +0 -0
  191. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/approval.py +0 -0
  192. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/auth.py +0 -0
  193. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/diff.py +0 -0
  194. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/history.py +0 -0
  195. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/launch_init.py +0 -0
  196. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/loading.py +0 -0
  197. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/mcp_login.py +0 -0
  198. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/mcp_reconnect.py +0 -0
  199. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/mcp_viewer.py +0 -0
  200. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/message_store.py +0 -0
  201. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/model_selector.py +0 -0
  202. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/notification_center.py +0 -0
  203. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/notification_detail.py +0 -0
  204. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/notification_settings.py +0 -0
  205. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/tool_renderers.py +0 -0
  206. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/tool_widgets.py +0 -0
  207. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/update_available.py +0 -0
  208. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/deepagents_code/widgets/update_progress.py +0 -0
  209. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/examples/skills/arxiv-search/SKILL.md +0 -0
  210. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/examples/skills/langgraph-docs/SKILL.md +0 -0
  211. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/examples/skills/skill-creator/SKILL.md +0 -0
  212. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  213. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  214. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/examples/skills/web-research/SKILL.md +0 -0
  215. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/images/tui.png +0 -0
  216. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/scripts/check_imports.py +0 -0
  217. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/scripts/debug_server.sh +0 -0
  218. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/scripts/generate_commands_catalog.py +0 -0
  219. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/scripts/install.sh +0 -0
  220. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/README.md +0 -0
  221. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/__init__.py +0 -0
  222. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/benchmarks/__init__.py +0 -0
  223. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  224. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  225. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/conftest.py +0 -0
  226. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/test_acp_mode.py +0 -0
  227. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/integration_tests/test_sandbox_operations.py +0 -0
  228. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/__init__.py +0 -0
  229. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/skills/__init__.py +0 -0
  230. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/skills/test_commands.py +0 -0
  231. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/skills/test_load.py +0 -0
  232. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/skills/test_skills_json.py +0 -0
  233. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_agent_selector.py +0 -0
  234. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_ask_user.py +0 -0
  235. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  236. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_auth_store.py +0 -0
  237. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_auth_widgets.py +0 -0
  238. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_clipboard.py +0 -0
  239. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_compact_tool.py +0 -0
  240. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_configurable_model.py +0 -0
  241. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_cursor_blink.py +0 -0
  242. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_editor.py +0 -0
  243. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_end_to_end.py +0 -0
  244. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_env_vars.py +0 -0
  245. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_exception_handling.py +0 -0
  246. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_extras_info.py +0 -0
  247. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_file_ops.py +0 -0
  248. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_filesystem_empty_result.py +0 -0
  249. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_formatting.py +0 -0
  250. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_git.py +0 -0
  251. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_history.py +0 -0
  252. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_hooks.py +0 -0
  253. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_imports.py +0 -0
  254. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_input_parsing.py +0 -0
  255. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  256. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_disabled.py +0 -0
  257. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_login_service.py +0 -0
  258. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  259. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_reconnect.py +0 -0
  260. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_mcp_trust.py +0 -0
  261. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_media_utils.py +0 -0
  262. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_model_selector.py +0 -0
  263. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_notification_center.py +0 -0
  264. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_notification_detail.py +0 -0
  265. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_offload_dict_messages.py +0 -0
  266. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_output.py +0 -0
  267. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_server_config.py +0 -0
  268. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_server_manager.py +0 -0
  269. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_session_stats.py +0 -0
  270. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_shell_allow_list.py +0 -0
  271. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_state_migration.py +0 -0
  272. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_subagents.py +0 -0
  273. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  274. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  275. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_unicode_security.py +0 -0
  276. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_update_available.py +0 -0
  277. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/test_version.py +0 -0
  278. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/tools/__init__.py +0 -0
  279. {deepagents_code-0.1.11 → deepagents_code-0.1.13}/tests/unit_tests/tools/test_fetch_url.py +0 -0
@@ -137,6 +137,7 @@ celerybeat.pid
137
137
 
138
138
  # Environments
139
139
  .env
140
+ .env.*
140
141
  .envrc
141
142
  env.local
142
143
  *.env.local
@@ -147,6 +148,20 @@ ENV/
147
148
  env.bak/
148
149
  venv.bak/
149
150
 
151
+ # Local credentials and secrets
152
+ *.pem
153
+ *.key
154
+ *.crt
155
+ *.p12
156
+ *.pfx
157
+ *.jks
158
+ credentials.json
159
+ token.json
160
+ Cookies
161
+ Cookies.db
162
+ cookies.sqlite
163
+ cookies.txt
164
+
150
165
  # Spyder project settings
151
166
  .spyderproject
152
167
  .spyproject
@@ -38,6 +38,13 @@ Textual's `App.notify(message)` parses the message string as Rich markup by defa
38
38
 
39
39
  `console.print()` defaults to `highlight=True`, which runs `ReprHighlighter` and auto-applies bold + cyan to any detected numbers. This visually overrides subtle styles like `dim` (bold cancels dim in most terminals). Pass `highlight=False` on any `console.print()` call where the content contains numbers and consistent dim/subtle styling matters.
40
40
 
41
+ ### Glyphs and spinners — reuse, don't redefine
42
+
43
+ Charset-dependent characters and animations have **single sources of truth**. Reuse them instead of hand-rolling new ones — copies drift, and (more subtly) a hardcoded Unicode literal won't degrade to ASCII on terminals that need it.
44
+
45
+ - **Glyphs** (checkmarks, arrows, ellipsis, cursor, box-drawing, branch icon, etc.): pull from `get_glyphs()` (`config.Glyphs`). Each glyph has a Unicode and an ASCII variant; `get_glyphs()` returns the right set for the active terminal. Never inline `"✓"`, `"…"`, `"›"`, and friends.
46
+ - **Animated spinners**: reuse the `Spinner` class in `widgets/loading.py`, which wraps `get_glyphs().spinner_frames` (braille on Unicode, `(-) (\) (|) (/)` on ASCII) and exposes `next_frame()`/`current_frame()`. Do **not** define your own frame tuples or interval constants for a spinner — drive a `Spinner` on a `set_interval`. The status-bar reconnect indicator (`widgets/status.py`) is the reference example; it ticks at the same 0.1s cadence as `LoadingWidget`. All connection/queue progress lives in the status bar — the welcome banner deliberately stays out of it, so there are currently no bespoke spinners to carve an exception for.
47
+
41
48
  ### Textual patterns used in this codebase
42
49
 
43
50
  - **Workers** (`@work` decorator) for async operations - see [Workers guide](https://textual.textualize.io/guide/workers/)
@@ -48,11 +55,57 @@ Textual's `App.notify(message)` parses the message string as Rich markup by defa
48
55
 
49
56
  - Use `textual.pilot` for async UI testing - see [Testing guide](https://textual.textualize.io/guide/testing/)
50
57
  - Snapshot testing available for visual regression - see repo `notes/snapshot_testing.md`
58
+ - For modal flows, test the real interaction path with keypresses when possible. Unit tests that call action methods or resume handlers directly can miss focus and modal-stack bugs.
59
+ - Do not open another modal or refocus the base chat input directly inside a modal dismiss callback. Preserve the non-blocking `push_screen(..., callback)` flow and schedule follow-up UI work with `call_after_refresh` so the dismissing modal fully unwinds first.
60
+ - Be cautious replacing `push_screen(..., callback)` with an awaited modal result inside slash-command handlers; awaiting can block the Textual message pump and break keyboard navigation in the active modal.
61
+
62
+ ### Typing and test doubles
63
+
64
+ When fixing `ty` diagnostics, do not mechanically replace `# type: ignore[...]` with `cast(...)`. First try to improve the actual type shape: narrower annotations, typed futures/callbacks, covariant read-only types such as `Mapping`/`Sequence`, local mock variables, or `monkeypatch.setattr(...)`. Treat `cast("Any", ...)` as a last resort.
65
+
66
+ For Textual tests that intentionally replace concrete app methods with `MagicMock` or `AsyncMock`, prefer `monkeypatch.setattr(...)` or one small documented dynamic helper over repeated `cast("Any", app)` expressions. Assert on local mock variables instead of re-reading mocked methods from the concrete object when possible.
67
+
68
+ 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.
51
69
 
52
70
  ## SDK dependency pin
53
71
 
54
72
  `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 matches the current SDK version at release time (unless bypassed with `dangerous-skip-sdk-pin-check`).
55
73
 
74
+ ## Local dev installs
75
+
76
+ Keep the released CLI and editable development CLI separate:
77
+
78
+ - `dcode` / `deepagents-code` should point at the normal installed tool, typically managed by `uv tool install deepagents-code`.
79
+ - `dcode-dev` should point at a dedicated editable venv under `~/.local/share/dcode-dev`, with a symlink in `~/.local/bin/dcode-dev`.
80
+
81
+ This uses a manual `uv venv` + `uv pip install -e` rather than `uv sync` or `uv tool install --editable` on purpose: it builds an isolated venv outside the workspace's locked environment, so the dev binary can be re-resolved on demand without disturbing the released tool or the repo's `uv.lock`. `uv pip`/`uv venv` are first-class `uv` subcommands here, not bare `pip`.
82
+
83
+ `~/.local/bin` must be on your `PATH` for the `dcode-dev` symlink to resolve (`uv tool install` adds its own shim directory automatically, but a hand-rolled symlink does not).
84
+
85
+ Example setup. The `--python` value is illustrative — any interpreter satisfying the package's `requires-python` (currently `>=3.11`) works; omit the flag to let `uv` pick. Replace `<repo>` with your local checkout path.
86
+
87
+ ```bash
88
+ uv venv ~/.local/share/dcode-dev --python 3.13
89
+ uv pip install --python ~/.local/share/dcode-dev/bin/python -e <repo>/libs/code
90
+ ln -sf ~/.local/share/dcode-dev/bin/dcode ~/.local/bin/dcode-dev
91
+ ```
92
+
93
+ When dependency constraints change in `libs/code/pyproject.toml`, update the dev venv explicitly:
94
+
95
+ ```bash
96
+ uv pip install --python ~/.local/share/dcode-dev/bin/python -e <repo>/libs/code --upgrade
97
+ ```
98
+
99
+ Verify command resolution and editable imports (the `dcode` checks assume the released tool is installed separately, per above):
100
+
101
+ ```bash
102
+ which dcode
103
+ which dcode-dev
104
+ dcode --version
105
+ dcode-dev --version
106
+ ~/.local/share/dcode-dev/bin/python -c 'import deepagents_code; print(deepagents_code.__file__)'
107
+ ```
108
+
56
109
  ## Startup performance
57
110
 
58
111
  `deepagents-code` must stay fast to launch. Never import heavy packages (e.g., `deepagents`, LangChain, LangGraph) at module level or in the argument-parsing path. These imports pull in large dependency trees and add seconds to every invocation, including trivial commands like `deepagents-code -v`.
@@ -94,7 +147,8 @@ To add a new slash command: (1) add a `SlashCommand` entry to `COMMANDS`, (2) se
94
147
  1. `deepagents_code/model_config.py` — add `"provider_name": "ENV_VAR_NAME"` to `PROVIDER_API_KEY_ENV`
95
148
  2. `deepagents_code/model_config.py` — if the provider reads a *dedicated* endpoint env var, add `"provider_name": ("CANONICAL_BASE_URL", "ALTERNATE", ...)` to `PROVIDER_BASE_URL_ENV` (see guidelines below); omit the provider entirely when it has no provider-specific endpoint variable
96
149
  3. `pyproject.toml` — add `provider = ["langchain-provider>=X.Y.Z,<N.0.0"]` to `[project.optional-dependencies]` and include it in the `all-providers` composite extra
97
- 4. `tests/unit_tests/test_model_config.py` — add `assert PROVIDER_API_KEY_ENV["provider_name"] == "ENV_VAR_NAME"` to `TestProviderApiKeyEnv.test_contains_major_providers`, and pin any `PROVIDER_BASE_URL_ENV` entry with a matching assertion
150
+ 4. `deepagents_code/model_config.py` — add `"provider_name"` to `RETRY_PARAM_BY_PROVIDER` if the provider's chat model accepts `max_retries`
151
+ 5. `tests/unit_tests/test_model_config.py` — add `assert PROVIDER_API_KEY_ENV["provider_name"] == "ENV_VAR_NAME"` to `TestProviderApiKeyEnv.test_contains_major_providers`, and pin any `PROVIDER_BASE_URL_ENV` entry with a matching assertion
98
152
 
99
153
  ### `PROVIDER_BASE_URL_ENV` guidelines
100
154
 
@@ -2,6 +2,59 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.13](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.12...deepagents-code==0.1.13) (2026-06-11)
6
+
7
+ ### Features
8
+
9
+ * Pluggable third-party sandbox backends ([#3842](https://github.com/langchain-ai/deepagents/issues/3842)) ([2b635a7](https://github.com/langchain-ai/deepagents/commit/2b635a7e6e6b50ca8ce783c2ac96ed8643ae0224))
10
+ * Auto-install ripgrep on first run ([#3348](https://github.com/langchain-ai/deepagents/issues/3348)) ([fecf22b](https://github.com/langchain-ai/deepagents/commit/fecf22b0909e79ff7bdf180baf20abf5fdf1f390))
11
+ * `config` command and canonical config manifest ([#3763](https://github.com/langchain-ai/deepagents/issues/3763)) ([79899a3](https://github.com/langchain-ai/deepagents/commit/79899a306d01de6217a1dfcc013ae92c808a47a0))
12
+ * Confirm modal for `/install --package` ([#3840](https://github.com/langchain-ai/deepagents/issues/3840)) ([3d75026](https://github.com/langchain-ai/deepagents/commit/3d75026e2f241648fae78d9e1de2cbb4985f58ff))
13
+ * Copy focused input selection on `Ctrl+C` ([#3841](https://github.com/langchain-ai/deepagents/issues/3841)) ([99f782c](https://github.com/langchain-ai/deepagents/commit/99f782cf08336c200d02a24ae4edaa650af67ed2))
14
+ * `[retries]` config ([#3772](https://github.com/langchain-ai/deepagents/issues/3772)) ([9334d91](https://github.com/langchain-ai/deepagents/commit/9334d91ef94997e46d5373daca9c146fa9498763))
15
+ * Show connection state in the status bar ([#3710](https://github.com/langchain-ai/deepagents/issues/3710)) ([3e3e8fe](https://github.com/langchain-ai/deepagents/commit/3e3e8feb0e6e1b77be75a7756fbf32e5c9497c28))
16
+ * Surface LangSmith tracing projects in `LocalContextMiddleware` ([#3836](https://github.com/langchain-ai/deepagents/issues/3836)) ([676abec](https://github.com/langchain-ai/deepagents/commit/676abecf892ff537fcb1425ba5929cace3c5d503))
17
+
18
+ ### Bug Fixes
19
+
20
+ * Add debug-log guidance for truncated startup errors ([#3849](https://github.com/langchain-ai/deepagents/issues/3849)) ([cd1ef30](https://github.com/langchain-ai/deepagents/commit/cd1ef303cf5d0e9d746c787eb09a4a89437e965a))
21
+ * Drop lock-key events so Caps Lock in iTerm2 doesn't type ([#3855](https://github.com/langchain-ai/deepagents/issues/3855)) ([110f1a7](https://github.com/langchain-ai/deepagents/commit/110f1a7a975743efda12e181cb3afc8404202254))
22
+ * Hand pointer over splash tracing project link ([#3858](https://github.com/langchain-ai/deepagents/issues/3858)) ([ea7dae5](https://github.com/langchain-ai/deepagents/commit/ea7dae58a37cfb1d2b96544eb7c941aad331b280))
23
+ * Keep terminal-default theme on Esc in `/theme` selector ([#3854](https://github.com/langchain-ai/deepagents/issues/3854)) ([c3bc67b](https://github.com/langchain-ai/deepagents/commit/c3bc67b0cdeda6f4dbcc6360ddd72b455aec4fe7))
24
+ * Preserve inherited `PYTHONPATH` for server subprocess ([#3833](https://github.com/langchain-ai/deepagents/issues/3833)) ([4689569](https://github.com/langchain-ai/deepagents/commit/4689569f94138987319cd9cbb45ce66a1f496934))
25
+ * Resolve interpreter PTC allowlist against the runtime tool registry ([#3845](https://github.com/langchain-ai/deepagents/issues/3845)) ([c59a27e](https://github.com/langchain-ai/deepagents/commit/c59a27ef2405b8e04c4351ce7ffa53d8d16d519c))
26
+ * Treat multi-line key-event pastes as one input ([#3856](https://github.com/langchain-ai/deepagents/issues/3856)) ([6bb15d4](https://github.com/langchain-ai/deepagents/commit/6bb15d4bd97bd16f47504f937c8458d1b53d9cc4))
27
+
28
+ ## [0.1.12](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.11...deepagents-code==0.1.12) (2026-06-10)
29
+
30
+ ### Features
31
+
32
+ * Add `get_current_thread_id` tool ([#3820](https://github.com/langchain-ai/deepagents/issues/3820)) ([18ce094](https://github.com/langchain-ai/deepagents/commit/18ce094b7036796c7e23ce1338f4da56dc2ef126))
33
+ * Guard managed onboarding-name memory block from edits ([#3822](https://github.com/langchain-ai/deepagents/issues/3822)) ([dc0a51f](https://github.com/langchain-ai/deepagents/commit/dc0a51fc81d01b62dc8043148a9fd87099fc9123))
34
+ * Offer restart after restart-capable install ([#3821](https://github.com/langchain-ai/deepagents/issues/3821)) ([e356efe](https://github.com/langchain-ai/deepagents/commit/e356efeff1c8bfb894119cebbb7d3c0853d327a2))
35
+ * Persist `/threads` directory-scope preference ([#3824](https://github.com/langchain-ai/deepagents/issues/3824)) ([51a29f4](https://github.com/langchain-ai/deepagents/commit/51a29f4a0c28c122acae296a0df03bee20474455))
36
+ * Surface gateway key mismatch on `PermissionDeniedError` ([#3813](https://github.com/langchain-ai/deepagents/issues/3813)) ([5bd1ef8](https://github.com/langchain-ai/deepagents/commit/5bd1ef8cb29db781ccbb37755db44ce0ab1d7bd2))
37
+
38
+ ### Bug Fixes
39
+
40
+ * Surface cached MCP errors as failed tool messages ([#3829](https://github.com/langchain-ai/deepagents/issues/3829)) ([d83b428](https://github.com/langchain-ai/deepagents/commit/d83b428f7f97bc40b9219c02846c2d8b4ccac434))
41
+ * Handle MCP tool errors locally ([#3830](https://github.com/langchain-ai/deepagents/issues/3830)) ([97a7052](https://github.com/langchain-ai/deepagents/commit/97a7052b3eef7ec80bc90a4c3b606deeaf13cb9b))
42
+ * Make non-incognito `!` shell output visible to the model ([#3825](https://github.com/langchain-ai/deepagents/issues/3825)) ([2407bca](https://github.com/langchain-ai/deepagents/commit/2407bca66bac5d199a923a0e58872c813eb006bc))
43
+ * Expose `/restart` slash command ([#3809](https://github.com/langchain-ai/deepagents/issues/3809)) ([64505b8](https://github.com/langchain-ai/deepagents/commit/64505b848868b80213b6da87113cd63890c3d520))
44
+ * Agent retries `gh search` with invalid `mergedAt` field ([#3802](https://github.com/langchain-ai/deepagents/issues/3802)) ([0b683a9](https://github.com/langchain-ai/deepagents/commit/0b683a9435b95bce79d10451868eae54c6a3e88c))
45
+ * Clarify `/restart` message during server startup ([#3823](https://github.com/langchain-ai/deepagents/issues/3823)) ([49ded9e](https://github.com/langchain-ai/deepagents/commit/49ded9ef448dcd263bee07ac15f4904dd342bfa2))
46
+ * Cursor at end when popping queued message to input ([#3832](https://github.com/langchain-ai/deepagents/issues/3832)) ([aa522c9](https://github.com/langchain-ai/deepagents/commit/aa522c94fffb93dc578addb39b4879f779ac5899))
47
+ * Coalesce streamed markdown writes to keep input responsive ([#3819](https://github.com/langchain-ai/deepagents/issues/3819)) ([b45eeeb](https://github.com/langchain-ai/deepagents/commit/b45eeebaf7e6ae6e07b8f9ca521525c66fe14f63))
48
+ * Don't show `"No threads found"` while threads load ([#3815](https://github.com/langchain-ai/deepagents/issues/3815)) ([68e6426](https://github.com/langchain-ai/deepagents/commit/68e64263f590b3244b689664715f354fb3a389cd))
49
+ * Ignore stale cwd warmers in file autocomplete cache ([#3835](https://github.com/langchain-ai/deepagents/issues/3835)) ([9c8c2b2](https://github.com/langchain-ai/deepagents/commit/9c8c2b24853b7b3a7610cbcfc368a6464c0711e0))
50
+ * Offer cwd switch on resume ([#3810](https://github.com/langchain-ai/deepagents/issues/3810)) ([d417f53](https://github.com/langchain-ai/deepagents/commit/d417f530aafa8c77523487393dc3039cc822dc09))
51
+ * Recover from tool errors instead of aborting run ([#3804](https://github.com/langchain-ai/deepagents/issues/3804)) ([45691c5](https://github.com/langchain-ai/deepagents/commit/45691c556105e171c7210c7c10388dc73202a025))
52
+ * Show `/restart` feedback ([#3808](https://github.com/langchain-ai/deepagents/issues/3808)) ([c40bef9](https://github.com/langchain-ai/deepagents/commit/c40bef9b2aaace3909593503b28e8b548bc20014))
53
+ * Standardize search previews and restart status ([#3806](https://github.com/langchain-ai/deepagents/issues/3806)) ([71a6d50](https://github.com/langchain-ai/deepagents/commit/71a6d508b21b275c0c7c6bd2e0752adfba496ea9))
54
+ * Suppress stale update notices ([#3801](https://github.com/langchain-ai/deepagents/issues/3801)) ([db25241](https://github.com/langchain-ai/deepagents/commit/db252411d8ca945aca86429acb644540ec970bdb))
55
+ * Unblock `/remember` in server mode ([#3812](https://github.com/langchain-ai/deepagents/issues/3812)) ([12e00e1](https://github.com/langchain-ai/deepagents/commit/12e00e1a78e2d6be106147a0aa95a518be66849f))
56
+ * Unblock TUI input during `/restart` ([#3826](https://github.com/langchain-ai/deepagents/issues/3826)) ([366cd81](https://github.com/langchain-ai/deepagents/commit/366cd81269e2d3891a477848b774cf51af0cefc0))
57
+
5
58
  ## [0.1.11](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.10...deepagents-code==0.1.11) (2026-06-07)
6
59
 
7
60
  ### Bug Fixes
@@ -6,7 +6,7 @@ Canonical list of slash commands for `deepagents-code`, derived from
6
6
  regenerate after editing the registry.
7
7
 
8
8
 
9
- ## Public (27)
9
+ ## Public (28)
10
10
 
11
11
  | Command | Aliases | Description |
12
12
  | --- | --- | --- |
@@ -29,6 +29,7 @@ regenerate after editing the registry.
29
29
  | `/quit` | `/q` | Exit app |
30
30
  | `/reload` | | Reload config from environment variables and .env |
31
31
  | `/remember` | | Update memory and skills from conversation |
32
+ | `/restart` | | Restart the app-owned LangGraph server |
32
33
  | `/skill-creator` | | Guide for creating effective agent skills |
33
34
  | `/theme` | | Switch color theme |
34
35
  | `/threads` | | Browse and resume previous threads |
@@ -38,9 +39,8 @@ regenerate after editing the registry.
38
39
  | `/update` | | Check for and install updates |
39
40
  | `/version` | `/about` | Show version |
40
41
 
41
- ## Hidden (2)
42
+ ## Hidden (1)
42
43
 
43
44
  Hidden commands not exposed in autocomplete or help. See the `HIDDEN_COMMANDS` docstring in the registry for context.
44
45
 
45
46
  - `/debug-error`
46
- - `/restart`
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents-code
3
- Version: 0.1.11
3
+ Version: 0.1.13
4
4
  Summary: Terminal interface for Deep Agents - interactive AI agent with file operations, shell access, and sub-agent capabilities.
5
5
  Project-URL: Homepage, https://docs.langchain.com/oss/python/deepagents/overview
6
6
  Project-URL: Documentation, https://reference.langchain.com/python/deepagents/
@@ -31,23 +31,23 @@ Requires-Dist: deepagents==0.6.8
31
31
  Requires-Dist: httpx<1.0.0,>=0.28.1
32
32
  Requires-Dist: langchain-anthropic<2.0.0,>=1.4.4
33
33
  Requires-Dist: langchain-google-genai<5.0.0,>=4.2.4
34
- Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.2.2
34
+ Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.0
35
35
  Requires-Dist: langchain-openai<2.0.0,>=1.2.2
36
36
  Requires-Dist: langchain<2.0.0,>=1.3.4
37
37
  Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
38
38
  Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.27
39
39
  Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.29.0
40
40
  Requires-Dist: langgraph-sdk<1.0.0,>=0.4.2
41
- Requires-Dist: langsmith[sandbox]>=0.8.8
41
+ Requires-Dist: langsmith[sandbox]>=0.8.11
42
42
  Requires-Dist: markdownify<2.0.0,>=1.2.2
43
43
  Requires-Dist: packaging>=26.2
44
44
  Requires-Dist: pillow<13.0.0,>=12.2.0
45
45
  Requires-Dist: prompt-toolkit<4.0.0,>=3.0.52
46
46
  Requires-Dist: pyperclip<2.0.0,>=1.11.0
47
47
  Requires-Dist: python-dotenv<2.0.0,>=1.2.2
48
- Requires-Dist: pyyaml>=6.0.0
48
+ Requires-Dist: pyyaml>=6.0.3
49
49
  Requires-Dist: requests<3.0.0,>=2.34.2
50
- Requires-Dist: rich<16.0.0,>=14.0.0
50
+ Requires-Dist: rich<16.0.0,>=15.0.0
51
51
  Requires-Dist: tavily-python<1.0.0,>=0.7.25
52
52
  Requires-Dist: textual-autocomplete<5.0.0,>=4.0.6
53
53
  Requires-Dist: textual-speedups<1.0.0,>=0.2.1
@@ -55,13 +55,13 @@ Requires-Dist: textual<9.0.0,>=8.2.7
55
55
  Requires-Dist: tomli-w<2.0.0,>=1.2.0
56
56
  Requires-Dist: uuid-utils<1.0.0,>=0.16.0
57
57
  Provides-Extra: agentcore
58
- Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.3; extra == 'agentcore'
58
+ Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.4; extra == 'agentcore'
59
59
  Provides-Extra: all-providers
60
60
  Requires-Dist: langchain-anthropic<2.0.0,>=1.4.4; extra == 'all-providers'
61
- Requires-Dist: langchain-aws<2.0.0,>=1.5.0; extra == 'all-providers'
61
+ Requires-Dist: langchain-aws<2.0.0,>=1.5.1; extra == 'all-providers'
62
62
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.0; extra == 'all-providers'
63
63
  Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
64
- Requires-Dist: langchain-deepseek<2.0.0,>=1.0.1; extra == 'all-providers'
64
+ Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'all-providers'
65
65
  Requires-Dist: langchain-fireworks<2.0.0,>=1.4.2; extra == 'all-providers'
66
66
  Requires-Dist: langchain-google-genai<5.0.0,>=4.2.4; extra == 'all-providers'
67
67
  Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.3; extra == 'all-providers'
@@ -70,30 +70,30 @@ Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'all-providers'
70
70
  Requires-Dist: langchain-ibm<2.0.0,>=1.1.0; extra == 'all-providers'
71
71
  Requires-Dist: langchain-litellm<2.0.0,>=0.6.6; extra == 'all-providers'
72
72
  Requires-Dist: langchain-mistralai<2.0.0,>=1.1.4; extra == 'all-providers'
73
- Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.0; extra == 'all-providers'
73
+ Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.1; extra == 'all-providers'
74
74
  Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
75
75
  Requires-Dist: langchain-openai<2.0.0,>=1.2.2; extra == 'all-providers'
76
76
  Requires-Dist: langchain-openrouter<2.0.0,>=0.2.3; extra == 'all-providers'
77
- Requires-Dist: langchain-perplexity<2.0.0,>=1.3.1; extra == 'all-providers'
77
+ Requires-Dist: langchain-perplexity<2.0.0,>=1.3.2; extra == 'all-providers'
78
78
  Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'all-providers'
79
79
  Requires-Dist: langchain-xai<2.0.0,>=1.2.2; extra == 'all-providers'
80
80
  Provides-Extra: all-sandboxes
81
- Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.3; extra == 'all-sandboxes'
82
- Requires-Dist: langchain-daytona>=0.0.6; extra == 'all-sandboxes'
83
- Requires-Dist: langchain-modal>=0.0.4; extra == 'all-sandboxes'
81
+ Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.4; extra == 'all-sandboxes'
82
+ Requires-Dist: langchain-daytona>=0.0.7; extra == 'all-sandboxes'
83
+ Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
84
84
  Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
85
85
  Provides-Extra: anthropic
86
86
  Requires-Dist: langchain-anthropic<2.0.0,>=1.4.4; extra == 'anthropic'
87
87
  Provides-Extra: baseten
88
88
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.0; extra == 'baseten'
89
89
  Provides-Extra: bedrock
90
- Requires-Dist: langchain-aws<2.0.0,>=1.5.0; extra == 'bedrock'
90
+ Requires-Dist: langchain-aws<2.0.0,>=1.5.1; extra == 'bedrock'
91
91
  Provides-Extra: cohere
92
92
  Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'cohere'
93
93
  Provides-Extra: daytona
94
- Requires-Dist: langchain-daytona>=0.0.6; extra == 'daytona'
94
+ Requires-Dist: langchain-daytona>=0.0.7; extra == 'daytona'
95
95
  Provides-Extra: deepseek
96
- Requires-Dist: langchain-deepseek<2.0.0,>=1.0.1; extra == 'deepseek'
96
+ Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'deepseek'
97
97
  Provides-Extra: fireworks
98
98
  Requires-Dist: langchain-fireworks<2.0.0,>=1.4.2; extra == 'fireworks'
99
99
  Provides-Extra: google-genai
@@ -109,9 +109,9 @@ Requires-Dist: langchain-litellm<2.0.0,>=0.6.6; extra == 'litellm'
109
109
  Provides-Extra: mistralai
110
110
  Requires-Dist: langchain-mistralai<2.0.0,>=1.1.4; extra == 'mistralai'
111
111
  Provides-Extra: modal
112
- Requires-Dist: langchain-modal>=0.0.4; extra == 'modal'
112
+ Requires-Dist: langchain-modal>=0.0.5; extra == 'modal'
113
113
  Provides-Extra: nvidia
114
- Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.0; extra == 'nvidia'
114
+ Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.1; extra == 'nvidia'
115
115
  Provides-Extra: ollama
116
116
  Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'ollama'
117
117
  Provides-Extra: openai
@@ -119,9 +119,9 @@ Requires-Dist: langchain-openai<2.0.0,>=1.2.2; extra == 'openai'
119
119
  Provides-Extra: openrouter
120
120
  Requires-Dist: langchain-openrouter<2.0.0,>=0.2.3; extra == 'openrouter'
121
121
  Provides-Extra: perplexity
122
- Requires-Dist: langchain-perplexity<2.0.0,>=1.3.1; extra == 'perplexity'
122
+ Requires-Dist: langchain-perplexity<2.0.0,>=1.3.2; extra == 'perplexity'
123
123
  Provides-Extra: quickjs
124
- Requires-Dist: langchain-quickjs<0.2.0,>=0.1.3; extra == 'quickjs'
124
+ Requires-Dist: langchain-quickjs<0.2.0,>=0.1.4; extra == 'quickjs'
125
125
  Provides-Extra: runloop
126
126
  Requires-Dist: langchain-runloop>=0.0.6; extra == 'runloop'
127
127
  Provides-Extra: together
@@ -409,6 +409,13 @@
409
409
  - **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.
410
410
  - **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.
411
411
 
412
+ #### T11: Auto-Installed ripgrep Binary from Upstream Release
413
+
414
+ - **Flow**: First-run download performed by `managed_tools.ensure_ripgrep` when `rg` is not on `PATH`.
415
+ - **Description**: On first invocation without a system `rg`, Deep Agents Code fetches the pinned ripgrep release tarball from `github.com/BurntSushi/ripgrep/releases/...`, verifies it against an in-tree SHA-256 (`RIPGREP_ASSETS`), extracts it under a `TemporaryDirectory`, and atomically moves the binary into `~/.deepagents/bin/rg`. The binary then runs unsandboxed, inheriting the same trust as a user-installed `rg` (the SDK invokes it via `subprocess.run(["rg", ...])`).
416
+ - **Mitigations**: (1) SHA-256 verified against the pinned hash table before move — a mismatch aborts the install and leaves `BIN_DIR` clean. (2) Network egress is limited to `github.com`. (3) Opt-out via `DEEPAGENTS_CODE_OFFLINE` for air-gapped environments. (4) Pinned version + checksums are bumped in-tree, so a compromised upstream release is detected on the next Deep Agents Code release rather than silently propagating. (5) Atomic move-into-place avoids partial installs when concurrent CLI invocations race.
417
+ - **Preconditions**: User has not installed `rg` via their package manager, `DEEPAGENTS_CODE_OFFLINE` is unset, and the host can reach `github.com`. The pinned SHA-256 in `RIPGREP_ASSETS` would need to be incorrect (a supply-chain compromise of the deepagents-code release) for a tampered binary to be installed.
418
+
412
419
  ---
413
420
 
414
421
  ## Input Source Coverage
@@ -13,7 +13,12 @@ import os
13
13
  import sys
14
14
  from pathlib import Path
15
15
 
16
- from deepagents_code._env_vars import DEBUG, DEBUG_FILE, is_env_truthy
16
+ from deepagents_code._env_vars import (
17
+ DEBUG,
18
+ DEBUG_FILE,
19
+ DEFAULT_DEBUG_FILE,
20
+ is_env_truthy,
21
+ )
17
22
 
18
23
  _DEBUG_HANDLER_ATTR = "_deepagents_code_debug_handler"
19
24
 
@@ -25,8 +30,8 @@ def configure_debug_logging(target: logging.Logger) -> None:
25
30
  module loggers reach the same file via propagation, so individual modules do
26
31
  not configure logging themselves.
27
32
 
28
- The log file defaults to `'/tmp/deepagents_debug.log'` but can be overridden
29
- with `DEEPAGENTS_CODE_DEBUG_FILE`. The handler appends (`mode='a'`) so logs
33
+ The log file defaults to `DEFAULT_DEBUG_FILE` but can be overridden with
34
+ `DEEPAGENTS_CODE_DEBUG_FILE`. The handler appends (`mode='a'`) so logs
30
35
  are preserved across separate process runs. Calling this again with the same
31
36
  resolved path is a no-op: the existing tagged handler is reused rather than
32
37
  stacking duplicates. If the resolved path changes, the stale handler is
@@ -40,12 +45,7 @@ def configure_debug_logging(target: logging.Logger) -> None:
40
45
  if not is_env_truthy(DEBUG):
41
46
  return
42
47
 
43
- debug_path = Path(
44
- os.environ.get(
45
- DEBUG_FILE,
46
- "/tmp/deepagents_debug.log", # noqa: S108
47
- )
48
- )
48
+ debug_path = Path(os.environ.get(DEBUG_FILE, DEFAULT_DEBUG_FILE))
49
49
  for existing in list(target.handlers):
50
50
  if not (
51
51
  isinstance(existing, logging.FileHandler)
@@ -74,3 +74,23 @@ def configure_debug_logging(target: logging.Logger) -> None:
74
74
  handler.setFormatter(logging.Formatter("%(asctime)s %(name)s %(message)s"))
75
75
  target.addHandler(handler)
76
76
  target.setLevel(logging.DEBUG)
77
+
78
+
79
+ def installed_debug_log_path() -> Path | None:
80
+ """Return the path of the active debug log file, or `None` if not logging.
81
+
82
+ Reflects the file handler actually attached by `configure_debug_logging`,
83
+ not the current `DEEPAGENTS_CODE_DEBUG` env value. The two diverge when the
84
+ variable is set after import — e.g. via a project/global `.env` loaded during
85
+ settings bootstrap — in which case the variable reads truthy but no handler
86
+ was installed and no log file exists. Callers that surface "full error in
87
+ <path>" hints must use this rather than the env var to avoid pointing users
88
+ at a file that was never created.
89
+ """
90
+ package_logger = logging.getLogger(__package__ or "deepagents_code")
91
+ for handler in package_logger.handlers:
92
+ if isinstance(handler, logging.FileHandler) and getattr(
93
+ handler, _DEBUG_HANDLER_ATTR, False
94
+ ):
95
+ return Path(handler.baseFilename)
96
+ return None
@@ -46,7 +46,10 @@ as enabled, and `0`, `false`, `no`, `off`, empty string, or unset as disabled.
46
46
  """
47
47
 
48
48
  DEBUG_FILE = "DEEPAGENTS_CODE_DEBUG_FILE"
49
- """Path for the debug log file (default: `/tmp/deepagents_debug.log`)."""
49
+ """Path for the debug log file (default: `DEFAULT_DEBUG_FILE`)."""
50
+
51
+ DEFAULT_DEBUG_FILE = "/tmp/deepagents_debug.log" # noqa: S108 # opt-in debug log
52
+ """Default path for the debug log when `DEBUG_FILE` is unset."""
50
53
 
51
54
  DEBUG_MCP_PROJECT_TRUST = "DEEPAGENTS_CODE_DEBUG_MCP_PROJECT_TRUST"
52
55
  """Force the project MCP approval prompt for manual UI testing.
@@ -124,6 +127,14 @@ NO_TERMINAL_ESCAPE = "DEEPAGENTS_CODE_NO_TERMINAL_ESCAPE"
124
127
  NO_UPDATE_CHECK = "DEEPAGENTS_CODE_NO_UPDATE_CHECK"
125
128
  """Disable automatic update checking when set."""
126
129
 
130
+ OFFLINE = "DEEPAGENTS_CODE_OFFLINE"
131
+ """Disable network downloads of managed binaries (e.g. ripgrep).
132
+
133
+ Parsed by `is_env_truthy`: accepts `1`, `true`, `yes`, `on` as enabled. When
134
+ truthy, `managed_tools.ensure_ripgrep` will not attempt to download a binary
135
+ and falls back to the existing missing-tool notification + slow Python regex
136
+ path."""
137
+
127
138
  OLLAMA_DISCOVERY = "DEEPAGENTS_CODE_OLLAMA_DISCOVERY"
128
139
  """Toggle Ollama model and profile discovery probes.
129
140
 
@@ -164,6 +175,29 @@ _TRUTHY_VALUES = frozenset({"1", "true", "yes", "on"})
164
175
  _FALSY_VALUES = frozenset({"0", "false", "no", "off", ""})
165
176
 
166
177
 
178
+ def classify_env_bool(raw: str) -> bool | None:
179
+ """Classify a raw env-var string as a truthy, falsy, or unrecognized token.
180
+
181
+ The single source of truth for which strings count as boolean on/off
182
+ values; `is_env_truthy` and the config resolver both build on it so they
183
+ agree on what "recognizably boolean" means.
184
+
185
+ Args:
186
+ raw: The raw (unstripped) environment-variable value.
187
+
188
+ Returns:
189
+ `True` for `1`/`true`/`yes`/`on`, `False` for `0`/`false`/`no`/`off`/
190
+ empty string (case-insensitive), or `None` when the value
191
+ is neither.
192
+ """
193
+ lowered = raw.strip().lower()
194
+ if lowered in _TRUTHY_VALUES:
195
+ return True
196
+ if lowered in _FALSY_VALUES:
197
+ return False
198
+ return None
199
+
200
+
167
201
  def is_env_truthy(name: str, *, default: bool = False) -> bool:
168
202
  """Return whether env var *name* is set to a recognizably truthy value.
169
203
 
@@ -184,9 +218,5 @@ def is_env_truthy(name: str, *, default: bool = False) -> bool:
184
218
  raw = os.environ.get(name)
185
219
  if raw is None:
186
220
  return default
187
- lowered = raw.strip().lower()
188
- if lowered in _TRUTHY_VALUES:
189
- return True
190
- if lowered in _FALSY_VALUES:
191
- return False
192
- return default
221
+ classified = classify_env_bool(raw)
222
+ return default if classified is None else classified
@@ -164,7 +164,9 @@ class ServerConfig:
164
164
 
165
165
  `None` means "fall through to whatever `settings.interpreter_ptc` resolves
166
166
  to from `~/.deepagents/config.toml`". A string is one of `"safe"`/`"all"`;
167
- a list is an explicit allowlist of tool names.
167
+ a list is an explicit allowlist of tool names that may also include the
168
+ `"safe"` preset (expanded at agent-build time); `"all"` is rejected inside
169
+ a list.
168
170
  """
169
171
 
170
172
  interpreter_ptc_acknowledge_unsafe: bool = False
@@ -11,7 +11,7 @@ from __future__ import annotations
11
11
  from dataclasses import dataclass, field
12
12
  from typing import Literal
13
13
 
14
- SpinnerStatus = Literal["Thinking", "Offloading"] | None
14
+ SpinnerStatus = Literal["Thinking", "Offloading", "Loading thread"] | None
15
15
  """Valid spinner display states, or `None` to hide."""
16
16
 
17
17