deepagents-cli 0.0.40__tar.gz → 0.0.41__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.40 → deepagents_cli-0.0.41}/.gitignore +1 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/CHANGELOG.md +19 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/PKG-INFO +1 -1
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/_env_vars.py +12 -0
- deepagents_cli-0.0.41/deepagents_cli/_git.py +236 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/_version.py +8 -1
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/app.py +1162 -142
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/app.tcss +0 -2
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/ask_user.py +1 -1
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/config.py +10 -19
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/deploy/bundler.py +33 -4
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/deploy/config.py +80 -2
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/deploy/templates.py +141 -0
- deepagents_cli-0.0.41/deepagents_cli/extras_info.py +178 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/main.py +147 -22
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/non_interactive.py +137 -0
- deepagents_cli-0.0.41/deepagents_cli/notifications.py +244 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/project_utils.py +3 -12
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/textual_adapter.py +49 -13
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/ui.py +4 -1
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/update_check.py +272 -12
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/_links.py +33 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/ask_user.py +23 -1
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/chat_input.py +1 -1
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/loading.py +10 -2
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/message_store.py +40 -3
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/messages.py +82 -9
- deepagents_cli-0.0.41/deepagents_cli/widgets/notification_center.py +399 -0
- deepagents_cli-0.0.41/deepagents_cli/widgets/notification_detail.py +257 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/status.py +0 -1
- deepagents_cli-0.0.41/deepagents_cli/widgets/update_available.py +311 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/welcome.py +1 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/pyproject.toml +1 -1
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/deploy/test_bundler.py +88 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/deploy/test_config.py +124 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_app.py +1816 -27
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_args.py +33 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_ask_user.py +57 -1
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_config.py +41 -1
- deepagents_cli-0.0.41/tests/unit_tests/test_extras_info.py +162 -0
- deepagents_cli-0.0.41/tests/unit_tests/test_git.py +264 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_loading.py +21 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_main.py +77 -33
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_main_args.py +80 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_message_store.py +31 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_messages.py +82 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_model_switch.py +15 -14
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_non_interactive.py +178 -1
- deepagents_cli-0.0.41/tests/unit_tests/test_notification_center.py +312 -0
- deepagents_cli-0.0.41/tests/unit_tests/test_notification_detail.py +133 -0
- deepagents_cli-0.0.41/tests/unit_tests/test_notifications.py +204 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_textual_adapter.py +305 -5
- deepagents_cli-0.0.41/tests/unit_tests/test_tool_display.py +470 -0
- deepagents_cli-0.0.41/tests/unit_tests/test_update_available.py +183 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_update_check.py +493 -4
- deepagents_cli-0.0.41/tests/unit_tests/test_version.py +386 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_welcome.py +4 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/uv.lock +1 -1
- deepagents_cli-0.0.40/tests/unit_tests/test_version.py +0 -166
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/DEV.md +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/Makefile +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/README.md +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/THREAT_MODEL.md +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/__init__.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/__main__.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/_ask_user_types.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/_cli_context.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/_debug.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/_server_config.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/_session_stats.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/_testing_models.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/agent.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/built_in_skills/__init__.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/clipboard.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/command_registry.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/configurable_model.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/default_agent_prompt.md +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/deploy/__init__.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/deploy/commands.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/editor.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/file_ops.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/formatting.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/hooks.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/input.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/integrations/__init__.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/integrations/sandbox_factory.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/integrations/sandbox_provider.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/local_context.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/mcp_tools.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/mcp_trust.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/media_utils.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/model_config.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/offload.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/output.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/py.typed +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/remote_client.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/server.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/server_graph.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/server_manager.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/sessions.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/skills/__init__.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/skills/commands.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/skills/invocation.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/skills/load.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/subagents.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/system_prompt.md +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/theme.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/token_state.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/tool_display.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/tools.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/unicode_security.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/__init__.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/agent_selector.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/approval.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/autocomplete.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/diff.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/history.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/mcp_viewer.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/model_selector.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/notification_settings.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/theme_selector.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/thread_selector.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/tool_renderers.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/deepagents_cli/widgets/tool_widgets.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/examples/deploy-content-writer/.env.example +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/examples/deploy-content-writer/skills/blog-post/SKILL.md +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/examples/deploy-content-writer/skills/social-media/SKILL.md +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/examples/deploy-content-writer/user/context.md +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/examples/deploy-content-writer/user/preferences.md +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/images/cli.png +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/scripts/check_imports.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/scripts/debug_server.sh +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/scripts/install.sh +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/README.md +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/integration_tests/__init__.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/integration_tests/conftest.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/__init__.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/conftest.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/deploy/__init__.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/deploy/test_commands.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_agent.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_agent_selector.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_approval.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_autocomplete.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_chat_input.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_history.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_links.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_mcp_trust.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_mcp_viewer.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_model_config.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_model_selector.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_offload_dict_messages.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_output.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_server.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_status.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_thread_selector.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_token_tracker.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_cli-0.0.40 → deepagents_cli-0.0.41}/tests/unit_tests/tools/test_fetch_url.py +0 -0
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.0.41](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.40...deepagents-cli==0.0.41) (2026-04-21)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **cli:** `--startup-cmd` flag ([#2841](https://github.com/langchain-ai/deepagents/issues/2841)) ([8adcc2c](https://github.com/langchain-ai/deepagents/commit/8adcc2c2e612346c263d02d1ec5c33e0d63da5a3))
|
|
9
|
+
* **cli:** actionable notifications, update modal ([#2855](https://github.com/langchain-ai/deepagents/issues/2855)) ([5fcd368](https://github.com/langchain-ai/deepagents/commit/5fcd368088079a84f151e0a3f5e4b9ac29c360c1))
|
|
10
|
+
* **cli:** custom auth via `[auth]` ([#2734](https://github.com/langchain-ai/deepagents/issues/2734)) ([417ddaa](https://github.com/langchain-ai/deepagents/commit/417ddaab4804a54a8f83721bb8577d65cfa3659f))
|
|
11
|
+
* **cli:** refresh footer git branch after shell commands ([#2851](https://github.com/langchain-ai/deepagents/issues/2851)) ([ee4fddd](https://github.com/langchain-ai/deepagents/commit/ee4fddde9454ee8f7ede98ee9a346da6c5ccd3d9))
|
|
12
|
+
* **cli:** rework `/version`, add release-age and editable-install guard ([#2854](https://github.com/langchain-ai/deepagents/issues/2854)) ([1ae053f](https://github.com/langchain-ai/deepagents/commit/1ae053f347679e58562d2b81eb6d6e6e9bbf0b07))
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
* **cli:** gate agent-swap resume hint on server checkpoint ([#2862](https://github.com/langchain-ai/deepagents/issues/2862)) ([f14b9cd](https://github.com/langchain-ai/deepagents/commit/f14b9cd3cc41f92ddb089d4294cba8496d517807))
|
|
18
|
+
* **cli:** keep thinking spinner visible during text streaming ([#2849](https://github.com/langchain-ai/deepagents/issues/2849)) ([2cb2244](https://github.com/langchain-ai/deepagents/commit/2cb22446bc1351d20e8bbfa9f23b5d668947351f))
|
|
19
|
+
* **cli:** re-show thinking spinner on hitl/`ask_user` resume ([#2847](https://github.com/langchain-ai/deepagents/issues/2847)) ([34a6167](https://github.com/langchain-ai/deepagents/commit/34a6167b0c275c7e4da067ef276a837f60da2f8a))
|
|
20
|
+
* **cli:** restore ctrl+j newline keybinding ([#2827](https://github.com/langchain-ai/deepagents/issues/2827)) ([2e1a3f4](https://github.com/langchain-ai/deepagents/commit/2e1a3f45a9ff56390e294ea5b0f6a837200874ec))
|
|
21
|
+
|
|
3
22
|
## [0.0.40](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.39...deepagents-cli==0.0.40) (2026-04-20)
|
|
4
23
|
|
|
5
24
|
### Features
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-cli
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.41
|
|
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/
|
|
@@ -37,6 +37,18 @@ DEBUG = "DEEPAGENTS_CLI_DEBUG"
|
|
|
37
37
|
DEBUG_FILE = "DEEPAGENTS_CLI_DEBUG_FILE"
|
|
38
38
|
"""Path for the debug log file (default: `/tmp/deepagents_debug.log`)."""
|
|
39
39
|
|
|
40
|
+
DEBUG_NOTIFICATIONS = "DEEPAGENTS_CLI_DEBUG_NOTIFICATIONS"
|
|
41
|
+
"""Inject sample missing-dependency notifications at launch so the notification
|
|
42
|
+
center UI can be exercised without waiting for real conditions. Does not
|
|
43
|
+
auto-open the update modal (use `DEEPAGENTS_CLI_DEBUG_UPDATE` for that). Any
|
|
44
|
+
non-empty value enables the flag (including `"0"` or `"false"`)."""
|
|
45
|
+
|
|
46
|
+
DEBUG_UPDATE = "DEEPAGENTS_CLI_DEBUG_UPDATE"
|
|
47
|
+
"""Inject a sample update-available notification and auto-open the update modal
|
|
48
|
+
at launch so the update-available flow can be exercised without waiting for a
|
|
49
|
+
real PyPI release. Any non-empty value enables the flag (including `"0"` or
|
|
50
|
+
`"false"`)."""
|
|
51
|
+
|
|
40
52
|
EXTRA_SKILLS_DIRS = "DEEPAGENTS_CLI_EXTRA_SKILLS_DIRS"
|
|
41
53
|
"""Colon-separated paths added to the skill containment allowlist."""
|
|
42
54
|
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"""Lightweight git metadata helpers for CLI state detection."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
logger = logging.getLogger(__name__)
|
|
9
|
+
|
|
10
|
+
_GIT_DIR_POINTER_PREFIX = "gitdir: "
|
|
11
|
+
"""Prefix used by worktree-style `.git` files to point at the real git dir."""
|
|
12
|
+
|
|
13
|
+
_GIT_HEAD_REF_PREFIX = "ref: "
|
|
14
|
+
"""Prefix used by `HEAD` when it points at a named ref instead of a commit."""
|
|
15
|
+
|
|
16
|
+
_GIT_REF_PREFIXES = ("refs/heads/", "refs/remotes/", "refs/tags/", "refs/")
|
|
17
|
+
"""Known git ref prefixes stripped when formatting a branch-like display name."""
|
|
18
|
+
|
|
19
|
+
_git_dir_cache: dict[str, Path] = {}
|
|
20
|
+
"""Positive-only cache of resolved git metadata directories keyed by lookup path."""
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _abbreviate_git_ref(ref: str) -> str:
|
|
24
|
+
"""Convert a full git ref into a short display name.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
ref: Full git ref name from repository metadata.
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
The abbreviated ref name suitable for display.
|
|
31
|
+
"""
|
|
32
|
+
for prefix in _GIT_REF_PREFIXES:
|
|
33
|
+
if ref.startswith(prefix):
|
|
34
|
+
return ref.removeprefix(prefix)
|
|
35
|
+
return ref
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _parse_git_dir_pointer(git_entry: Path) -> Path | None:
|
|
39
|
+
"""Resolve a `.git` file containing a `gitdir:` pointer.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
git_entry: `.git` file to parse.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
The resolved git directory path, or `None` if the file is not a valid
|
|
46
|
+
gitdir pointer.
|
|
47
|
+
"""
|
|
48
|
+
try:
|
|
49
|
+
raw = git_entry.read_text(encoding="utf-8").strip()
|
|
50
|
+
except OSError:
|
|
51
|
+
logger.debug("Failed to read gitdir pointer from %s", git_entry, exc_info=True)
|
|
52
|
+
return None
|
|
53
|
+
|
|
54
|
+
if not raw.startswith(_GIT_DIR_POINTER_PREFIX):
|
|
55
|
+
return None
|
|
56
|
+
|
|
57
|
+
pointer = raw.removeprefix(_GIT_DIR_POINTER_PREFIX).strip()
|
|
58
|
+
if not pointer:
|
|
59
|
+
return None
|
|
60
|
+
|
|
61
|
+
git_dir = Path(pointer)
|
|
62
|
+
if not git_dir.is_absolute():
|
|
63
|
+
git_dir = git_entry.parent / git_dir
|
|
64
|
+
return git_dir.resolve(strict=False)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _normalize_lookup_path(path: str | Path) -> Path:
|
|
68
|
+
"""Normalize a lookup path for git metadata discovery.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
path: Directory or file path inside a repository.
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
A normalized absolute path when possible, or the expanded path if full
|
|
75
|
+
resolution fails.
|
|
76
|
+
"""
|
|
77
|
+
try:
|
|
78
|
+
return Path(path).expanduser().resolve(strict=False)
|
|
79
|
+
except OSError:
|
|
80
|
+
return Path(path).expanduser()
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _find_git_dir_uncached(path: Path) -> Path | None:
|
|
84
|
+
"""Locate the effective git metadata directory without using caches.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
path: Normalized directory or file path inside a repository.
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
The git metadata directory for the repository containing `path`, or
|
|
91
|
+
`None` when no repository can be identified.
|
|
92
|
+
"""
|
|
93
|
+
current = path
|
|
94
|
+
if not current.is_dir():
|
|
95
|
+
current = current.parent
|
|
96
|
+
|
|
97
|
+
for directory in (current, *current.parents):
|
|
98
|
+
git_entry = directory / ".git"
|
|
99
|
+
if git_entry.is_dir():
|
|
100
|
+
return git_entry
|
|
101
|
+
if git_entry.is_file():
|
|
102
|
+
git_dir = _parse_git_dir_pointer(git_entry)
|
|
103
|
+
if git_dir is not None and git_dir.is_dir():
|
|
104
|
+
return git_dir
|
|
105
|
+
return None
|
|
106
|
+
|
|
107
|
+
return None
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def find_git_dir(path: str | Path) -> Path | None:
|
|
111
|
+
"""Locate the effective git metadata directory for a path.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
path: Directory or file path inside a repository.
|
|
115
|
+
|
|
116
|
+
Returns:
|
|
117
|
+
The git metadata directory for the repository containing `path`, or
|
|
118
|
+
`None` when no repository can be identified.
|
|
119
|
+
"""
|
|
120
|
+
current = _normalize_lookup_path(path)
|
|
121
|
+
key = str(current)
|
|
122
|
+
cached = _git_dir_cache.get(key)
|
|
123
|
+
if cached is not None:
|
|
124
|
+
return cached
|
|
125
|
+
|
|
126
|
+
git_dir = _find_git_dir_uncached(current)
|
|
127
|
+
if git_dir is not None:
|
|
128
|
+
_git_dir_cache[key] = git_dir
|
|
129
|
+
return git_dir
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def find_git_root(path: str | Path) -> Path | None:
|
|
133
|
+
"""Locate the repository root for a path.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
path: Directory or file path inside a repository.
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
The repository root containing `path`, or `None` when no repository can
|
|
140
|
+
be identified.
|
|
141
|
+
"""
|
|
142
|
+
current = _normalize_lookup_path(path)
|
|
143
|
+
if not current.is_dir():
|
|
144
|
+
current = current.parent
|
|
145
|
+
|
|
146
|
+
for directory in (current, *current.parents):
|
|
147
|
+
git_entry = directory / ".git"
|
|
148
|
+
if git_entry.is_dir():
|
|
149
|
+
return directory
|
|
150
|
+
if git_entry.is_file():
|
|
151
|
+
git_dir = _parse_git_dir_pointer(git_entry)
|
|
152
|
+
if git_dir is not None and git_dir.is_dir():
|
|
153
|
+
return directory
|
|
154
|
+
return None
|
|
155
|
+
|
|
156
|
+
return None
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def read_git_branch_from_filesystem(path: str | Path) -> str | None:
|
|
160
|
+
"""Read the current git branch from repository metadata.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
path: Directory or file path inside a repository.
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
The abbreviated branch name, `HEAD` for detached HEAD, an empty string
|
|
167
|
+
when `path` is not inside a git repository, or `None` when metadata
|
|
168
|
+
exists but cannot be parsed confidently.
|
|
169
|
+
"""
|
|
170
|
+
git_dir = find_git_dir(path)
|
|
171
|
+
if git_dir is None:
|
|
172
|
+
return ""
|
|
173
|
+
|
|
174
|
+
head_path = git_dir / "HEAD"
|
|
175
|
+
try:
|
|
176
|
+
head = head_path.read_text(encoding="utf-8").strip()
|
|
177
|
+
except FileNotFoundError:
|
|
178
|
+
logger.debug("Git HEAD file not found in %s", git_dir)
|
|
179
|
+
return None
|
|
180
|
+
except OSError:
|
|
181
|
+
logger.debug("Failed to read git HEAD from %s", git_dir, exc_info=True)
|
|
182
|
+
return None
|
|
183
|
+
|
|
184
|
+
if not head:
|
|
185
|
+
return ""
|
|
186
|
+
if head.startswith(_GIT_HEAD_REF_PREFIX):
|
|
187
|
+
ref = head.removeprefix(_GIT_HEAD_REF_PREFIX).strip()
|
|
188
|
+
return _abbreviate_git_ref(ref) if ref else None
|
|
189
|
+
return "HEAD"
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def read_git_branch_via_subprocess(path: str | Path) -> str:
|
|
193
|
+
"""Fall back to `git rev-parse` for unusual repository layouts.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
path: Directory or file path inside a repository.
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
The branch name reported by git, or an empty string on failure.
|
|
200
|
+
"""
|
|
201
|
+
import subprocess # noqa: S404 # stdlib subprocess fallback
|
|
202
|
+
|
|
203
|
+
try:
|
|
204
|
+
result = subprocess.run(
|
|
205
|
+
["git", "rev-parse", "--abbrev-ref", "HEAD"], # noqa: S607
|
|
206
|
+
capture_output=True,
|
|
207
|
+
text=True,
|
|
208
|
+
timeout=2,
|
|
209
|
+
check=False,
|
|
210
|
+
cwd=path,
|
|
211
|
+
)
|
|
212
|
+
if result.returncode == 0:
|
|
213
|
+
return result.stdout.strip()
|
|
214
|
+
except FileNotFoundError:
|
|
215
|
+
pass # git not installed
|
|
216
|
+
except subprocess.TimeoutExpired:
|
|
217
|
+
logger.debug("Git branch detection timed out")
|
|
218
|
+
except OSError:
|
|
219
|
+
logger.debug("Git branch detection failed", exc_info=True)
|
|
220
|
+
return ""
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def resolve_git_branch(path: str | Path) -> str:
|
|
224
|
+
"""Resolve the current git branch with a filesystem-first strategy.
|
|
225
|
+
|
|
226
|
+
Args:
|
|
227
|
+
path: Directory or file path inside a repository.
|
|
228
|
+
|
|
229
|
+
Returns:
|
|
230
|
+
The current branch name, `HEAD` for detached HEAD, or an empty string
|
|
231
|
+
when no branch can be determined.
|
|
232
|
+
"""
|
|
233
|
+
branch = read_git_branch_from_filesystem(path)
|
|
234
|
+
if branch is not None:
|
|
235
|
+
return branch
|
|
236
|
+
return read_git_branch_via_subprocess(path)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Version information and lightweight constants for `deepagents-cli`."""
|
|
2
2
|
|
|
3
|
-
__version__ = "0.0.
|
|
3
|
+
__version__ = "0.0.41" # x-release-please-version
|
|
4
4
|
|
|
5
5
|
DOCS_URL = "https://docs.langchain.com/oss/python/deepagents/cli"
|
|
6
6
|
"""URL for `deepagents-cli` documentation."""
|
|
@@ -8,6 +8,13 @@ DOCS_URL = "https://docs.langchain.com/oss/python/deepagents/cli"
|
|
|
8
8
|
PYPI_URL = "https://pypi.org/pypi/deepagents-cli/json"
|
|
9
9
|
"""PyPI JSON API endpoint for version checks."""
|
|
10
10
|
|
|
11
|
+
SDK_PYPI_URL = "https://pypi.org/pypi/deepagents/json"
|
|
12
|
+
"""PyPI JSON API endpoint for reading `deepagents` SDK release metadata.
|
|
13
|
+
|
|
14
|
+
The CLI only reads release-age metadata from this endpoint; it never
|
|
15
|
+
performs SDK update checks.
|
|
16
|
+
"""
|
|
17
|
+
|
|
11
18
|
CHANGELOG_URL = (
|
|
12
19
|
"https://github.com/langchain-ai/deepagents/blob/main/libs/cli/CHANGELOG.md"
|
|
13
20
|
)
|