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.
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/CHANGELOG.md +20 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/PKG-INFO +19 -10
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/README.md +18 -9
- deepagents_cli-0.0.31/deepagents_cli/_version.py +3 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/agent.py +86 -8
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/app.py +229 -21
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/app.tcss +55 -0
- deepagents_cli-0.0.31/deepagents_cli/ask_user.py +376 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/config.py +143 -6
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/integrations/langsmith.py +25 -16
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/main.py +44 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/model_config.py +215 -1
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/non_interactive.py +25 -5
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/sessions.py +479 -67
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/system_prompt.md +3 -4
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/textual_adapter.py +219 -34
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/tool_display.py +6 -1
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/ui.py +23 -4
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/approval.py +14 -14
- deepagents_cli-0.0.31/deepagents_cli/widgets/ask_user.py +399 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/autocomplete.py +2 -1
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/chat_input.py +72 -4
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/messages.py +7 -3
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/status.py +50 -7
- deepagents_cli-0.0.31/deepagents_cli/widgets/thread_selector.py +1740 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/welcome.py +5 -1
- deepagents_cli-0.0.31/images/cli.png +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/pyproject.toml +1 -1
- deepagents_cli-0.0.31/scripts/install.sh +77 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_agent.py +215 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_app.py +490 -3
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_approval.py +77 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_args.py +36 -1
- deepagents_cli-0.0.31/tests/unit_tests/test_ask_user.py +601 -0
- deepagents_cli-0.0.31/tests/unit_tests/test_ask_user_middleware.py +221 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_chat_input.py +99 -2
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_config.py +15 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_messages.py +6 -6
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_model_config.py +131 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_model_switch.py +34 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_non_interactive.py +55 -0
- deepagents_cli-0.0.31/tests/unit_tests/test_reload.py +240 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_sessions.py +665 -16
- deepagents_cli-0.0.31/tests/unit_tests/test_status.py +133 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_textual_adapter.py +293 -7
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_thread_selector.py +1035 -159
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/uv.lock +1 -1
- deepagents_cli-0.0.30/deepagents_cli/_version.py +0 -3
- deepagents_cli-0.0.30/deepagents_cli/widgets/thread_selector.py +0 -698
- deepagents_cli-0.0.30/images/cli.png +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/.gitignore +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/Makefile +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/__init__.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/__main__.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/built_in_skills/__init__.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/clipboard.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/default_agent_prompt.md +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/file_ops.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/hooks.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/input.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/integrations/__init__.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/integrations/daytona.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/integrations/modal.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/integrations/runloop.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/integrations/sandbox_factory.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/integrations/sandbox_provider.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/local_context.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/mcp_tools.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/mcp_trust.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/media_utils.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/project_utils.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/py.typed +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/skills/__init__.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/skills/commands.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/skills/load.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/subagents.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/tools.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/unicode_security.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/update_check.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/__init__.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/_links.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/diff.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/history.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/loading.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/mcp_viewer.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/message_store.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/model_selector.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/tool_renderers.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/deepagents_cli/widgets/tool_widgets.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/scripts/check_imports.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/README.md +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/integration_tests/__init__.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/integration_tests/conftest.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/__init__.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/conftest.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_autocomplete.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_compact.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_history.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_main.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_mcp_trust.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_mcp_viewer.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_message_store.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_model_selector.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_token_tracker.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_version.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/test_welcome.py +0 -0
- {deepagents_cli-0.0.30 → deepagents_cli-0.0.31}/tests/unit_tests/tools/__init__.py +0 -0
- {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.
|
|
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
|
-
|
|
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
|
-
|
|
142
|
+
**What the CLI adds on top of the SDK:**
|
|
143
143
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
**
|
|
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)**
|
|
151
|
-
- **[
|
|
152
|
-
- **[
|
|
153
|
-
- **[
|
|
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
|
-
|
|
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
|
-
|
|
40
|
+
**What the CLI adds on top of the SDK:**
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
**
|
|
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)**
|
|
49
|
-
- **[
|
|
50
|
-
- **[
|
|
51
|
-
- **[
|
|
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.
|
|
@@ -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(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
212
|
-
template.replace("{
|
|
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
|
|
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,
|
|
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
|