deepagents-cli 0.0.30__tar.gz → 0.0.31__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 (144) hide show
  1. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/CHANGELOG.md +20 -0
  2. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/PKG-INFO +19 -10
  3. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/README.md +18 -9
  4. deepagents_cli-0.0.31/deepagents_cli/_version.py +3 -0
  5. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/agent.py +86 -8
  6. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/app.py +229 -21
  7. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/app.tcss +55 -0
  8. deepagents_cli-0.0.31/deepagents_cli/ask_user.py +376 -0
  9. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/config.py +143 -6
  10. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/integrations/langsmith.py +25 -16
  11. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/main.py +44 -0
  12. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/model_config.py +215 -1
  13. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/non_interactive.py +25 -5
  14. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/sessions.py +479 -67
  15. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/system_prompt.md +3 -4
  16. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/textual_adapter.py +219 -34
  17. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/tool_display.py +6 -1
  18. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/ui.py +23 -4
  19. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/approval.py +14 -14
  20. deepagents_cli-0.0.31/deepagents_cli/widgets/ask_user.py +399 -0
  21. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/autocomplete.py +2 -1
  22. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/chat_input.py +72 -4
  23. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/messages.py +7 -3
  24. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/status.py +50 -7
  25. deepagents_cli-0.0.31/deepagents_cli/widgets/thread_selector.py +1740 -0
  26. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/welcome.py +5 -1
  27. deepagents_cli-0.0.31/images/cli.png +0 -0
  28. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/pyproject.toml +1 -1
  29. deepagents_cli-0.0.31/scripts/install.sh +77 -0
  30. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_agent.py +215 -0
  31. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_app.py +490 -3
  32. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_approval.py +77 -0
  33. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_args.py +36 -1
  34. deepagents_cli-0.0.31/tests/unit_tests/test_ask_user.py +601 -0
  35. deepagents_cli-0.0.31/tests/unit_tests/test_ask_user_middleware.py +221 -0
  36. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_chat_input.py +99 -2
  37. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_config.py +15 -0
  38. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_messages.py +6 -6
  39. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_model_config.py +131 -0
  40. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_model_switch.py +34 -0
  41. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_non_interactive.py +55 -0
  42. deepagents_cli-0.0.31/tests/unit_tests/test_reload.py +240 -0
  43. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_sessions.py +665 -16
  44. deepagents_cli-0.0.31/tests/unit_tests/test_status.py +133 -0
  45. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_textual_adapter.py +293 -7
  46. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_thread_selector.py +1035 -159
  47. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/uv.lock +1 -1
  48. deepagents_cli-0.0.30/deepagents_cli/_version.py +0 -3
  49. deepagents_cli-0.0.30/deepagents_cli/widgets/thread_selector.py +0 -698
  50. deepagents_cli-0.0.30/images/cli.png +0 -0
  51. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/.gitignore +0 -0
  52. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/Makefile +0 -0
  53. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/__init__.py +0 -0
  54. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/__main__.py +0 -0
  55. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/built_in_skills/__init__.py +0 -0
  56. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/built_in_skills/skill-creator/SKILL.md +0 -0
  57. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  58. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  59. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/clipboard.py +0 -0
  60. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/default_agent_prompt.md +0 -0
  61. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/file_ops.py +0 -0
  62. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/hooks.py +0 -0
  63. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/input.py +0 -0
  64. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/integrations/__init__.py +0 -0
  65. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/integrations/daytona.py +0 -0
  66. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/integrations/modal.py +0 -0
  67. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/integrations/runloop.py +0 -0
  68. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/integrations/sandbox_factory.py +0 -0
  69. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/integrations/sandbox_provider.py +0 -0
  70. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/local_context.py +0 -0
  71. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/mcp_tools.py +0 -0
  72. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/mcp_trust.py +0 -0
  73. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/media_utils.py +0 -0
  74. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/project_utils.py +0 -0
  75. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/py.typed +0 -0
  76. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/skills/__init__.py +0 -0
  77. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/skills/commands.py +0 -0
  78. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/skills/load.py +0 -0
  79. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/subagents.py +0 -0
  80. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/tools.py +0 -0
  81. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/unicode_security.py +0 -0
  82. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/update_check.py +0 -0
  83. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/__init__.py +0 -0
  84. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/_links.py +0 -0
  85. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/diff.py +0 -0
  86. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/history.py +0 -0
  87. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/loading.py +0 -0
  88. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/mcp_viewer.py +0 -0
  89. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/message_store.py +0 -0
  90. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/model_selector.py +0 -0
  91. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/tool_renderers.py +0 -0
  92. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/tool_widgets.py +0 -0
  93. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/examples/skills/arxiv-search/SKILL.md +0 -0
  94. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  95. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/examples/skills/langgraph-docs/SKILL.md +0 -0
  96. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/examples/skills/skill-creator/SKILL.md +0 -0
  97. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  98. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  99. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/examples/skills/web-research/SKILL.md +0 -0
  100. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/scripts/check_imports.py +0 -0
  101. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/README.md +0 -0
  102. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/integration_tests/__init__.py +0 -0
  103. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/integration_tests/benchmarks/__init__.py +0 -0
  104. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  105. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/integration_tests/conftest.py +0 -0
  106. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/integration_tests/test_acp_mode.py +0 -0
  107. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/integration_tests/test_sandbox_factory.py +0 -0
  108. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/integration_tests/test_sandbox_operations.py +0 -0
  109. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/__init__.py +0 -0
  110. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/conftest.py +0 -0
  111. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/skills/__init__.py +0 -0
  112. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/skills/test_commands.py +0 -0
  113. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/skills/test_load.py +0 -0
  114. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_autocomplete.py +0 -0
  115. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_charset.py +0 -0
  116. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_compact.py +0 -0
  117. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_compact_tool.py +0 -0
  118. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_end_to_end.py +0 -0
  119. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_exception_handling.py +0 -0
  120. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_file_ops.py +0 -0
  121. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_history.py +0 -0
  122. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_hooks.py +0 -0
  123. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_imports.py +0 -0
  124. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_input_parsing.py +0 -0
  125. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_local_context.py +0 -0
  126. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_main.py +0 -0
  127. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_main_acp_mode.py +0 -0
  128. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_main_args.py +0 -0
  129. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_mcp_tools.py +0 -0
  130. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_mcp_trust.py +0 -0
  131. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_mcp_viewer.py +0 -0
  132. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_media_utils.py +0 -0
  133. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_message_store.py +0 -0
  134. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_model_selector.py +0 -0
  135. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_shell_allow_list.py +0 -0
  136. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_subagents.py +0 -0
  137. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_token_tracker.py +0 -0
  138. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_ui.py +0 -0
  139. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_unicode_security.py +0 -0
  140. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_update_check.py +0 -0
  141. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_version.py +0 -0
  142. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_welcome.py +0 -0
  143. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/tools/__init__.py +0 -0
  144. {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/tools/test_fetch_url.py +0 -0
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.0.31](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.30...deepagents-cli==0.0.31) (2026-03-09)
4
+
5
+ ### Features
6
+
7
+ * Opt-in `ask_user` tool for interactive agent questions ([#1377](https://github.com/langchain-ai/deepagents/issues/1377)) ([de7068d](https://github.com/langchain-ai/deepagents/commit/de7068d21fd4b932c6e53f500b0ea3b02a04c0aa))
8
+ * Big thread improvements!
9
+ * Rework `/thread` switcher with search, columns, delete, and sort toggle ([#1723](https://github.com/langchain-ai/deepagents/issues/1723)) ([8b21ddb](https://github.com/langchain-ai/deepagents/commit/8b21ddb2ff7f13d6b3ffcbf2fe605bfbadbc3d38))
10
+ * Track and display working directory per thread ([#1735](https://github.com/langchain-ai/deepagents/issues/1735)) ([0e4f25d](https://github.com/langchain-ai/deepagents/commit/0e4f25dfbc3e15653bc3f8a6d32a0a61ead4ba82))
11
+ * Add `-n` short flag for `threads list --limit` ([#1731](https://github.com/langchain-ai/deepagents/issues/1731)) ([8bbace9](https://github.com/langchain-ai/deepagents/commit/8bbace9facd1e33757521e835dcb291accd2fa91))
12
+ * Add sort, branch filter, and verbose flags to threads list ([#1732](https://github.com/langchain-ai/deepagents/issues/1732)) ([11dc8e3](https://github.com/langchain-ai/deepagents/commit/11dc8e3397ef9e9dbe8b15578e9258544ed6b452))
13
+ * Tailor system prompt for non-interactive mode ([#1727](https://github.com/langchain-ai/deepagents/issues/1727)) ([871e5cf](https://github.com/langchain-ai/deepagents/commit/871e5cf76b1a7e7cf7175b4415bb8e2206da39ec))
14
+ * `/reload` command for in-session config refresh ([#1722](https://github.com/langchain-ai/deepagents/issues/1722)) ([381aee6](https://github.com/langchain-ai/deepagents/commit/381aee6d223fe3d866bedfe3a534916f419a4435))
15
+ * Rearrange HITL option order in approval menu ([#1726](https://github.com/langchain-ai/deepagents/issues/1726)) ([0ca6cb2](https://github.com/langchain-ai/deepagents/commit/0ca6cb237b6da538bad2b4bf292942c8db72ec1f))
16
+
17
+ ### Bug Fixes
18
+
19
+ * Localize newline shortcut labels by platform ([#1721](https://github.com/langchain-ai/deepagents/issues/1721)) ([f35576b](https://github.com/langchain-ai/deepagents/commit/f35576bafac711d6c04f1f9dd40ec97a90e30060))
20
+ * Prevent `shift+enter` from sending `backslash+enter` ([#1728](https://github.com/langchain-ai/deepagents/issues/1728)) ([81dceb0](https://github.com/langchain-ai/deepagents/commit/81dceb043097a47702bb5a0227a8f12e9055bd05))
21
+ * Write files with langsmith sandbox ([#1714](https://github.com/langchain-ai/deepagents/issues/1714)) ([5933c9e](https://github.com/langchain-ai/deepagents/commit/5933c9e2995c422e43649c61981e086ac1eaf725))
22
+
3
23
  ## [0.0.30](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.29...deepagents-cli==0.0.30) (2026-03-07)
4
24
 
5
25
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents-cli
3
- Version: 0.0.30
3
+ Version: 0.0.31
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/
@@ -137,20 +137,25 @@ deepagents
137
137
 
138
138
  ## 🤔 What is this?
139
139
 
140
- Using an LLM to call tools in a loop is the simplest form of an agent. This architecture, however, can yield agents that are "shallow" and fail to plan and act over longer, more complex tasks.
140
+ The fastest way to start using Deep Agents. `deepagents-cli` is a pre-built coding agent in your terminal similar to Claude Code or Cursor — powered by any LLM that supports tool calling. One install command and you're up and running, no code required.
141
141
 
142
- Applications like "Deep Research", "Manus", and "Claude Code" have gotten around this limitation by implementing a combination of four things: a **planning tool**, **sub agents**, access to a **file system**, and a **detailed prompt**.
142
+ **What the CLI adds on top of the SDK:**
143
143
 
144
- `deepagents` is a Python package that implements these in a general purpose way so that you can easily create a Deep Agent for your application. For a full overview and quickstart of Deep Agents, the best resource is our [docs](https://docs.langchain.com/oss/python/deepagents/overview).
145
-
146
- **Acknowledgements: This project was primarily inspired by Claude Code, and initially was largely an attempt to see what made Claude Code general purpose, and make it even more so.**
144
+ - **Interactive TUI** rich terminal interface with streaming responses
145
+ - **Conversation resume** — pick up where you left off across sessions
146
+ - **Web search** ground responses in live information
147
+ - **Remote sandboxes** — run code in isolated environments (Modal, Runloop, Daytona, & more)
148
+ - **Persistent memory** — agent remembers context across conversations
149
+ - **Custom skills** — extend the agent with your own slash commands
150
+ - **Headless mode** — run non-interactively for scripting and CI
151
+ - **Human-in-the-loop** — approve or reject tool calls before execution
147
152
 
148
153
  ## 📖 Resources
149
154
 
150
- - **[CLI Documentation](https://docs.langchain.com/oss/python/deepagents/cli/overview)** — Full documentation
151
- - **[CLI Source](https://github.com/langchain-ai/deepagents/tree/main/libs/cli)** — Full source code
152
- - **[Deep Agents SDK](https://github.com/langchain-ai/deepagents)** — The underlying agent harness
153
- - **[Chat LangChain](https://chat.langchain.com)** - Chat interactively with the docs
155
+ - **[CLI Documentation](https://docs.langchain.com/oss/python/deepagents/cli/overview)**
156
+ - **[Changelog](https://github.com/langchain-ai/deepagents/blob/main/libs/cli/CHANGELOG.md)**
157
+ - **[Source code](https://github.com/langchain-ai/deepagents/tree/main/libs/cli)**
158
+ - **[Deep Agents SDK](https://github.com/langchain-ai/deepagents)** underlying agent harness
154
159
 
155
160
  ## 📕 Releases & Versioning
156
161
 
@@ -161,3 +166,7 @@ See our [Releases](https://docs.langchain.com/oss/python/release-policy) and [Ve
161
166
  As an open-source project in a rapidly developing field, we are extremely open to contributions, whether it be in the form of a new feature, improved infrastructure, or better documentation.
162
167
 
163
168
  For detailed information on how to contribute, see the [Contributing Guide](https://docs.langchain.com/oss/python/contributing/overview).
169
+
170
+ ## 🤝 Acknowledgements
171
+
172
+ This project was primarily inspired by Claude Code, and initially was largely an attempt to see what made Claude Code general purpose, and make it even more so.
@@ -35,20 +35,25 @@ deepagents
35
35
 
36
36
  ## 🤔 What is this?
37
37
 
38
- Using an LLM to call tools in a loop is the simplest form of an agent. This architecture, however, can yield agents that are "shallow" and fail to plan and act over longer, more complex tasks.
38
+ The fastest way to start using Deep Agents. `deepagents-cli` is a pre-built coding agent in your terminal similar to Claude Code or Cursor — powered by any LLM that supports tool calling. One install command and you're up and running, no code required.
39
39
 
40
- Applications like "Deep Research", "Manus", and "Claude Code" have gotten around this limitation by implementing a combination of four things: a **planning tool**, **sub agents**, access to a **file system**, and a **detailed prompt**.
40
+ **What the CLI adds on top of the SDK:**
41
41
 
42
- `deepagents` is a Python package that implements these in a general purpose way so that you can easily create a Deep Agent for your application. For a full overview and quickstart of Deep Agents, the best resource is our [docs](https://docs.langchain.com/oss/python/deepagents/overview).
43
-
44
- **Acknowledgements: This project was primarily inspired by Claude Code, and initially was largely an attempt to see what made Claude Code general purpose, and make it even more so.**
42
+ - **Interactive TUI** rich terminal interface with streaming responses
43
+ - **Conversation resume** — pick up where you left off across sessions
44
+ - **Web search** ground responses in live information
45
+ - **Remote sandboxes** — run code in isolated environments (Modal, Runloop, Daytona, & more)
46
+ - **Persistent memory** — agent remembers context across conversations
47
+ - **Custom skills** — extend the agent with your own slash commands
48
+ - **Headless mode** — run non-interactively for scripting and CI
49
+ - **Human-in-the-loop** — approve or reject tool calls before execution
45
50
 
46
51
  ## 📖 Resources
47
52
 
48
- - **[CLI Documentation](https://docs.langchain.com/oss/python/deepagents/cli/overview)** — Full documentation
49
- - **[CLI Source](https://github.com/langchain-ai/deepagents/tree/main/libs/cli)** — Full source code
50
- - **[Deep Agents SDK](https://github.com/langchain-ai/deepagents)** — The underlying agent harness
51
- - **[Chat LangChain](https://chat.langchain.com)** - Chat interactively with the docs
53
+ - **[CLI Documentation](https://docs.langchain.com/oss/python/deepagents/cli/overview)**
54
+ - **[Changelog](https://github.com/langchain-ai/deepagents/blob/main/libs/cli/CHANGELOG.md)**
55
+ - **[Source code](https://github.com/langchain-ai/deepagents/tree/main/libs/cli)**
56
+ - **[Deep Agents SDK](https://github.com/langchain-ai/deepagents)** underlying agent harness
52
57
 
53
58
  ## 📕 Releases & Versioning
54
59
 
@@ -59,3 +64,7 @@ See our [Releases](https://docs.langchain.com/oss/python/release-policy) and [Ve
59
64
  As an open-source project in a rapidly developing field, we are extremely open to contributions, whether it be in the form of a new feature, improved infrastructure, or better documentation.
60
65
 
61
66
  For detailed information on how to contribute, see the [Contributing Guide](https://docs.langchain.com/oss/python/contributing/overview).
67
+
68
+ ## 🤝 Acknowledgements
69
+
70
+ This project was primarily inspired by Claude Code, and initially was largely an attempt to see what made Claude Code general purpose, and make it even more so.
@@ -0,0 +1,3 @@
1
+ """Version information for `deepagents-cli`."""
2
+
3
+ __version__ = "0.0.31" # x-release-please-version
@@ -2,7 +2,9 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import logging
5
6
  import os
7
+ import re
6
8
  import shutil
7
9
  import tempfile
8
10
  from pathlib import Path
@@ -50,6 +52,8 @@ from deepagents_cli.unicode_security import (
50
52
  summarize_issues,
51
53
  )
52
54
 
55
+ logger = logging.getLogger(__name__)
56
+
53
57
  DEFAULT_AGENT_NAME = "agent"
54
58
  """The default agent name used when no `-a` flag is provided."""
55
59
 
@@ -136,12 +140,17 @@ def reset_agent(agent_name: str, source_agent: str | None = None) -> None:
136
140
  console.print(f"Location: {agent_dir}\n", style=COLORS["dim"])
137
141
 
138
142
 
139
- def get_system_prompt(assistant_id: str, sandbox_type: str | None = None) -> str:
143
+ def get_system_prompt(
144
+ assistant_id: str,
145
+ sandbox_type: str | None = None,
146
+ *,
147
+ interactive: bool = True,
148
+ ) -> str:
140
149
  """Get the base system prompt for the agent.
141
150
 
142
- Loads the immutable system prompt from `system_prompt.md` and
151
+ Loads the base system prompt template from `system_prompt.md` and
143
152
  interpolates dynamic sections (model identity, working directory,
144
- skills path).
153
+ skills path, execution mode).
145
154
 
146
155
  Args:
147
156
  assistant_id: The agent identifier for path references
@@ -149,6 +158,8 @@ def get_system_prompt(assistant_id: str, sandbox_type: str | None = None) -> str
149
158
  (`'daytona'`, `'langsmith'`, `'modal'`, `'runloop'`).
150
159
 
151
160
  If `None`, agent is operating in local mode.
161
+ interactive: When `False`, the prompt is tailored for headless
162
+ non-interactive execution (no human in the loop).
152
163
 
153
164
  Returns:
154
165
  The system prompt string
@@ -166,6 +177,41 @@ def get_system_prompt(assistant_id: str, sandbox_type: str | None = None) -> str
166
177
 
167
178
  skills_path = f"~/.deepagents/{assistant_id}/skills/"
168
179
 
180
+ if interactive:
181
+ mode_description = "an interactive CLI on the user's computer"
182
+ interactive_preamble = (
183
+ "The user sends you messages and you respond with text and tool "
184
+ "calls. Your tools run on the user's machine. The user can see "
185
+ "your responses and tool outputs in real time, so keep them "
186
+ "informed — but don't over-explain."
187
+ )
188
+ ambiguity_guidance = (
189
+ "- If the request is ambiguous, ask questions before acting.\n"
190
+ "- If asked how to approach something, explain first, then act."
191
+ )
192
+ else:
193
+ mode_description = (
194
+ "non-interactive (headless) mode — there is no human operator "
195
+ "monitoring your output in real time"
196
+ )
197
+ interactive_preamble = (
198
+ "You received a single task and must complete it fully and "
199
+ "autonomously. There is no human available to answer follow-up "
200
+ "questions, so do NOT ask for clarification — make reasonable "
201
+ "assumptions and proceed."
202
+ )
203
+ ambiguity_guidance = (
204
+ "- Do NOT ask clarifying questions — there is no human to answer "
205
+ "them. Make reasonable assumptions and proceed.\n"
206
+ "- If you encounter ambiguity, choose the most reasonable "
207
+ "interpretation and note your assumption briefly.\n"
208
+ "- Always use non-interactive command variants — no human is "
209
+ "available to respond to prompts. Examples: `npm init -y` not "
210
+ "`npm init`, `apt-get install -y` not `apt-get install`, "
211
+ "`yes |` or `--no-input`/`--non-interactive` flags where "
212
+ "available. Never run commands that block waiting for stdin."
213
+ )
214
+
169
215
  # Build model identity section
170
216
  model_identity_section = ""
171
217
  if settings.model_name:
@@ -195,7 +241,14 @@ def get_system_prompt(assistant_id: str, sandbox_type: str | None = None) -> str
195
241
  f"- Use `{working_dir}` as your working directory for all operations\n\n"
196
242
  )
197
243
  else:
198
- cwd = Path.cwd()
244
+ try:
245
+ cwd = Path.cwd()
246
+ except OSError:
247
+ logger.warning(
248
+ "Could not determine working directory for system prompt",
249
+ exc_info=True,
250
+ )
251
+ cwd = Path()
199
252
  working_dir_section = (
200
253
  f"### Current Working Directory\n\n"
201
254
  f"The filesystem backend is currently operating in: `{cwd}`\n\n"
@@ -208,12 +261,22 @@ def get_system_prompt(assistant_id: str, sandbox_type: str | None = None) -> str
208
261
  f"- Never use relative paths - always construct full absolute paths\n\n"
209
262
  )
210
263
 
211
- return (
212
- template.replace("{model_identity_section}", model_identity_section)
264
+ result = (
265
+ template.replace("{mode_description}", mode_description)
266
+ .replace("{interactive_preamble}", interactive_preamble)
267
+ .replace("{ambiguity_guidance}", ambiguity_guidance)
268
+ .replace("{model_identity_section}", model_identity_section)
213
269
  .replace("{working_dir_section}", working_dir_section)
214
270
  .replace("{skills_path}", skills_path)
215
271
  )
216
272
 
273
+ # Detect unreplaced placeholders (defense-in-depth for template typos)
274
+ unreplaced = re.findall(r"\{[a-z_]+\}", result)
275
+ if unreplaced:
276
+ logger.warning("System prompt contains unreplaced placeholders: %s", unreplaced)
277
+
278
+ return result
279
+
217
280
 
218
281
  def _format_write_file_description(
219
282
  tool_call: ToolCall, _state: AgentState[Any], _runtime: Runtime[Any]
@@ -431,10 +494,12 @@ def create_cli_agent(
431
494
  sandbox: SandboxBackendProtocol | None = None,
432
495
  sandbox_type: str | None = None,
433
496
  system_prompt: str | None = None,
497
+ interactive: bool = True,
434
498
  auto_approve: bool = False,
435
499
  enable_memory: bool = True,
436
500
  enable_skills: bool = True,
437
501
  enable_shell: bool = True,
502
+ enable_ask_user: bool = False,
438
503
  checkpointer: BaseCheckpointSaver | None = None,
439
504
  mcp_server_info: list[MCPServerInfo] | None = None,
440
505
  ) -> tuple[Pregel, CompositeBackend]:
@@ -456,7 +521,11 @@ def create_cli_agent(
456
521
  Used for system prompt generation.
457
522
  system_prompt: Override the default system prompt.
458
523
 
459
- If `None`, generates one based on `sandbox_type` and `assistant_id`.
524
+ If `None`, generates one based on `sandbox_type`, `assistant_id`,
525
+ and `interactive`.
526
+ interactive: When `False`, the auto-generated system prompt is
527
+ tailored for headless non-interactive execution. Ignored when
528
+ `system_prompt` is provided explicitly.
460
529
  auto_approve: If `True`, no tools trigger human-in-the-loop
461
530
  interrupts — all calls (shell execution, file writes/edits,
462
531
  web search, URL fetch) run automatically.
@@ -467,6 +536,7 @@ def create_cli_agent(
467
536
  enable_skills: Enable `SkillsMiddleware` for custom agent skills
468
537
  enable_shell: Enable shell execution via `LocalShellBackend`
469
538
  (only in local mode). When enabled, the `execute` tool is available.
539
+ enable_ask_user: Enable the `ask_user` tool for interactive questioning.
470
540
  checkpointer: Optional checkpointer for session persistence.
471
541
 
472
542
  If `None`, uses `InMemorySaver` (no persistence across
@@ -523,6 +593,12 @@ def create_cli_agent(
523
593
  # Build middleware stack based on enabled features
524
594
  agent_middleware = []
525
595
 
596
+ # Add ask_user middleware (must be early so its tool is available)
597
+ if enable_ask_user:
598
+ from deepagents_cli.ask_user import AskUserMiddleware
599
+
600
+ agent_middleware.append(AskUserMiddleware())
601
+
526
602
  # Add memory middleware
527
603
  if enable_memory:
528
604
  memory_sources = [str(settings.get_user_agent_md_path(assistant_id))]
@@ -592,7 +668,9 @@ def create_cli_agent(
592
668
  # Get or use custom system prompt
593
669
  if system_prompt is None:
594
670
  system_prompt = get_system_prompt(
595
- assistant_id=assistant_id, sandbox_type=sandbox_type
671
+ assistant_id=assistant_id,
672
+ sandbox_type=sandbox_type,
673
+ interactive=interactive,
596
674
  )
597
675
 
598
676
  # Configure interrupt_on based on auto_approve setting