deepagents-cli 0.0.57__tar.gz → 0.0.59__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.57 → deepagents_cli-0.0.59}/CHANGELOG.md +12 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/PKG-INFO +6 -6
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/THREAT_MODEL.md +2 -1
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_version.py +3 -1
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/app.py +38 -88
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/integrations/sandbox_factory.py +1 -1
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/local_context.py +1 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/remote_client.py +18 -2
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/skills/load.py +5 -1
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/pyproject.toml +6 -6
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/test_compact_resume.py +14 -35
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/skills/test_load.py +34 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_app.py +128 -36
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_offload.py +16 -24
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_offload_dict_messages.py +3 -4
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/uv.lock +127 -52
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/.gitignore +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/DEV.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/Makefile +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/README.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/__main__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_ask_user_types.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_cli_context.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_constants.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_debug.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_env_vars.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_git.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_server_config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_session_stats.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_testing_models.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_textual_patches.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/agent.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/app.tcss +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/ask_user.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/auth_store.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/clipboard.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/command_registry.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/configurable_model.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/default_agent_prompt.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/bundler.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/commands.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/context_hub.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/anonymous-B9UzAXQd.js +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/clerk-5xHgyQyG.js +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/highlighted-body-OFNGDK62-rX-7qT8o.js +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/index-DM3gptpu.js +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/index-Ddy7F6KI.css +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/supabase-S6NACDgm.js +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/index.html +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/logo-dark.svg +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/logo-light.svg +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/templates.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/editor.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/event_bus.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/extras_info.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/file_ops.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/formatting.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/hooks.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/input.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/integrations/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/integrations/sandbox_provider.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/iterm_cursor_guide.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/main.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_auth.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_commands.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/_registry.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/base.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/github.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/slack.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_tools.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_trust.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/media_utils.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/model_config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/non_interactive.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/notifications.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/offload.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/onboarding.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/output.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/project_utils.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/py.typed +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/server.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/server_graph.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/server_manager.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/sessions.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/skills/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/skills/commands.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/skills/invocation.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/state_migration.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/subagents.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/system_prompt.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/terminal_capabilities.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/terminal_escape.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/textual_adapter.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/theme.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/token_state.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/tool_display.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/tools.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/ui.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/unicode_security.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/update_check.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/_links.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/agent_selector.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/approval.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/ask_user.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/auth.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/autocomplete.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/chat_input.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/diff.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/history.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/launch_init.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/loading.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/mcp_viewer.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/message_store.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/messages.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/model_selector.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/notification_center.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/notification_detail.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/notification_settings.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/status.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/theme_selector.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/thread_selector.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/tool_renderers.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/tool_widgets.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/update_available.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/update_progress.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/welcome.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/deploy-content-writer/.env.example +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/deploy-content-writer/skills/blog-post/SKILL.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/deploy-content-writer/skills/social-media/SKILL.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/deploy-content-writer/user/context.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/deploy-content-writer/user/preferences.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/.nvmrc +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/index.html +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/package-lock.json +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/package.json +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/postcss.config.js +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/public/logo-dark.svg +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/public/logo-light.svg +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/App.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/ThemeProvider.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/auth/anonymous.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/auth/clerk.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/auth/loader.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/auth/supabase.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/auth/types.ts +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/AppHeader.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/FilePanels.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/MessageList.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/SubagentActivity.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/ThreadPicker.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/TodosPanel.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/ToolCallCard.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/FileToolCard.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/SearchCard.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/ThinkCard.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/TodosCard.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/index.ts +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/constants.ts +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/index.css +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/main.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/runtimeConfig.ts +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/types.ts +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/vite-env.d.ts +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/tsconfig.json +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/vite.config.ts +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/images/cli.png +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/scripts/check_imports.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/scripts/debug_server.sh +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/scripts/install.sh +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/README.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/conftest.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/test_context_hub.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/test_deploy_hub.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/conftest.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_bundler.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_commands.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_context_hub.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_frontend_bundle.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_frontend_config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_agent.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_agent_selector.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_approval.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_args.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_ask_user.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_auth_widgets.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_autocomplete.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_chat_input.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_git.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_history.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_launch_init.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_links.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_loading.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_main.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_commands.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_trust.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_viewer.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_message_store.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_messages.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_model_config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_model_selector.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_notification_center.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_notification_detail.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_output.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_server.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_status.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_textual_adapter.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_thread_selector.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_token_tracker.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_update_available.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_update_progress.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_version.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_welcome.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/tools/test_fetch_url.py +0 -0
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Deep Agents CLI Changelog
|
|
2
2
|
|
|
3
|
+
## [0.0.59](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.58...deepagents-cli==0.0.59) (2026-05-12)
|
|
4
|
+
|
|
5
|
+
### Bug Fixes
|
|
6
|
+
|
|
7
|
+
* Prevent import deadlock during skill discovery and prewarm ([#3385](https://github.com/langchain-ai/deepagents/issues/3385)) ([0bf8dd1](https://github.com/langchain-ai/deepagents/commit/0bf8dd1cfd680bd4d27ce19295f96c720f525787))
|
|
8
|
+
|
|
9
|
+
## [0.0.58](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.57...deepagents-cli==0.0.58) (2026-05-12)
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* Pin v0.6 and fix import race ([4db09ac](https://github.com/langchain-ai/deepagents/commit/4db09acba34b38521192b8f278723524be560779))
|
|
14
|
+
|
|
3
15
|
## [0.0.57](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.56...deepagents-cli==0.0.57) (2026-05-12)
|
|
4
16
|
|
|
5
17
|
### Features
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-cli
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.59
|
|
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/
|
|
@@ -27,18 +27,18 @@ Classifier: Topic :: Terminals
|
|
|
27
27
|
Requires-Python: <4.0,>=3.11
|
|
28
28
|
Requires-Dist: aiosqlite<1.0.0,>=0.19.0
|
|
29
29
|
Requires-Dist: deepagents-acp>=0.0.4
|
|
30
|
-
Requires-Dist: deepagents==0.
|
|
30
|
+
Requires-Dist: deepagents==0.6.1
|
|
31
31
|
Requires-Dist: httpx<1.0.0,>=0.28.1
|
|
32
32
|
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.3
|
|
33
33
|
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.2
|
|
34
34
|
Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.2.2
|
|
35
35
|
Requires-Dist: langchain-openai<2.0.0,>=1.2.1
|
|
36
|
-
Requires-Dist: langchain<2.0.0,>=1.
|
|
37
|
-
Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.0
|
|
36
|
+
Requires-Dist: langchain<2.0.0,>=1.3.0
|
|
37
|
+
Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
|
|
38
38
|
Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.24
|
|
39
|
-
Requires-Dist: langgraph-
|
|
39
|
+
Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.28.1
|
|
40
40
|
Requires-Dist: langgraph-sdk<1.0.0,>=0.3.13
|
|
41
|
-
Requires-Dist: langgraph<2.0.0,>=1.
|
|
41
|
+
Requires-Dist: langgraph<2.0.0,>=1.2.0
|
|
42
42
|
Requires-Dist: langsmith[sandbox]>=0.8.0
|
|
43
43
|
Requires-Dist: markdownify<2.0.0,>=0.13.0
|
|
44
44
|
Requires-Dist: packaging>=23.0
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
|
|
58
58
|
### Architecture Diagram
|
|
59
59
|
|
|
60
|
-
```
|
|
60
|
+
```txt
|
|
61
61
|
┌──────────────────────────────────────────────────────────────────────┐
|
|
62
62
|
│ User (local machine) │
|
|
63
63
|
│ │
|
|
@@ -138,6 +138,7 @@
|
|
|
138
138
|
| C17 | Model Config Loader | Resolves model provider, supports `class_path` for arbitrary `BaseChatModel` instantiation via `importlib` | user-controlled | N/A | `config.create_model`, `config._create_model_from_class`, `model_config.ModelConfig.load` |
|
|
139
139
|
|
|
140
140
|
**Notes:**
|
|
141
|
+
|
|
141
142
|
1. `http_request` and `fetch_url` enabled by default; `web_search` requires `TAVILY_API_KEY`.
|
|
142
143
|
2. MCP servers only load if `.mcp.json` config files are present.
|
|
143
144
|
3. Hooks only execute if `~/.deepagents/hooks.json` exists.
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"""Version information and lightweight constants for `deepagents-cli`."""
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
# Keep the `x-release-please-version` annotation — release-please uses it to
|
|
4
|
+
# bump `__version__` in sync with `pyproject.toml` on every release PR.
|
|
5
|
+
__version__ = "0.0.59" # x-release-please-version
|
|
4
6
|
|
|
5
7
|
DOCS_URL = "https://docs.langchain.com/oss/python/deepagents/cli"
|
|
6
8
|
"""URL for `deepagents-cli` documentation."""
|
|
@@ -43,6 +43,7 @@ from deepagents_cli import (
|
|
|
43
43
|
)
|
|
44
44
|
from deepagents_cli._cli_context import CLIContext
|
|
45
45
|
from deepagents_cli._constants import DEFAULT_AGENT_NAME as DEFAULT_ASSISTANT_ID
|
|
46
|
+
from deepagents_cli._debug import configure_debug_logging
|
|
46
47
|
from deepagents_cli._git import (
|
|
47
48
|
read_git_branch_from_filesystem,
|
|
48
49
|
read_git_branch_via_subprocess,
|
|
@@ -90,6 +91,7 @@ from deepagents_cli.widgets.status import StatusBar
|
|
|
90
91
|
from deepagents_cli.widgets.welcome import WelcomeBanner
|
|
91
92
|
|
|
92
93
|
logger = logging.getLogger(__name__)
|
|
94
|
+
configure_debug_logging(logger)
|
|
93
95
|
_monotonic = time.monotonic
|
|
94
96
|
|
|
95
97
|
_DEFERRED_START_NOTICE = (
|
|
@@ -1388,6 +1390,14 @@ class DeepAgentsApp(App):
|
|
|
1388
1390
|
loop re-enters the same module graph (see that method for why).
|
|
1389
1391
|
"""
|
|
1390
1392
|
|
|
1393
|
+
self._deepagents_import_lock = asyncio.Lock()
|
|
1394
|
+
"""Serializes cold imports into the Deep Agents graph after prewarm.
|
|
1395
|
+
|
|
1396
|
+
Startup model creation and skill discovery can both be triggered during
|
|
1397
|
+
first paint. If prewarm failed or did not cover a transitive module,
|
|
1398
|
+
both paths may cold-import overlapping modules at the same time.
|
|
1399
|
+
"""
|
|
1400
|
+
|
|
1391
1401
|
# Lifecycle flags & re-entry guards
|
|
1392
1402
|
self._connecting = (
|
|
1393
1403
|
server_kwargs is not None and not self._server_startup_deferred
|
|
@@ -1591,7 +1601,7 @@ class DeepAgentsApp(App):
|
|
|
1591
1601
|
- The agent is a local `Pregel` graph (e.g. ACP mode, test harnesses).
|
|
1592
1602
|
|
|
1593
1603
|
Used to gate features that require a server-backed agent (e.g. model
|
|
1594
|
-
switching via `ConfigurableModelMiddleware`,
|
|
1604
|
+
switching via `ConfigurableModelMiddleware`, thread registration).
|
|
1595
1605
|
Checks the agent type rather than server ownership so this works for
|
|
1596
1606
|
both CLI-spawned servers and externally managed ones.
|
|
1597
1607
|
|
|
@@ -2144,7 +2154,12 @@ class DeepAgentsApp(App):
|
|
|
2144
2154
|
from deepagents_cli.command_registry import SLASH_COMMANDS, build_skill_commands
|
|
2145
2155
|
|
|
2146
2156
|
try:
|
|
2147
|
-
|
|
2157
|
+
# Discovery and prewarm import overlapping parts of the Deep Agents
|
|
2158
|
+
# graph in separate workers. Let prewarm finish first so CPython's
|
|
2159
|
+
# per-module import locks cannot form a cycle.
|
|
2160
|
+
await self._await_prewarm_imports()
|
|
2161
|
+
async with self._deepagents_import_lock:
|
|
2162
|
+
skills, roots = await asyncio.to_thread(self._discover_skills_and_roots)
|
|
2148
2163
|
except OSError:
|
|
2149
2164
|
logger.warning(
|
|
2150
2165
|
"Filesystem error during skill discovery",
|
|
@@ -2158,11 +2173,12 @@ class DeepAgentsApp(App):
|
|
|
2158
2173
|
markup=False,
|
|
2159
2174
|
)
|
|
2160
2175
|
return False
|
|
2161
|
-
except Exception:
|
|
2176
|
+
except Exception as exc:
|
|
2162
2177
|
logger.exception("Unexpected error during skill discovery")
|
|
2163
2178
|
self.notify(
|
|
2164
|
-
"Skill discovery failed unexpectedly. "
|
|
2165
|
-
"/skill: commands may not work.
|
|
2179
|
+
f"Skill discovery failed unexpectedly ({type(exc).__name__}). "
|
|
2180
|
+
"/skill: commands may not work. "
|
|
2181
|
+
"Set DEEPAGENTS_CLI_DEBUG=1 for details.",
|
|
2166
2182
|
severity="warning",
|
|
2167
2183
|
timeout=8,
|
|
2168
2184
|
markup=False,
|
|
@@ -2332,7 +2348,8 @@ class DeepAgentsApp(App):
|
|
|
2332
2348
|
from deepagents_cli.model_config import ModelConfigError, save_recent_model
|
|
2333
2349
|
|
|
2334
2350
|
try:
|
|
2335
|
-
|
|
2351
|
+
async with self._deepagents_import_lock:
|
|
2352
|
+
result = create_model(**self._model_kwargs)
|
|
2336
2353
|
except ModelConfigError as exc:
|
|
2337
2354
|
self.post_message(self.ServerStartFailed(error=exc))
|
|
2338
2355
|
return
|
|
@@ -5486,9 +5503,6 @@ class DeepAgentsApp(App):
|
|
|
5486
5503
|
if result.offload_warning:
|
|
5487
5504
|
await self._mount_message(ErrorMessage(result.offload_warning))
|
|
5488
5505
|
|
|
5489
|
-
if remote := self._remote_agent():
|
|
5490
|
-
await remote.aensure_thread(config) # ty: ignore[invalid-argument-type]
|
|
5491
|
-
|
|
5492
5506
|
await self._agent.aupdate_state(
|
|
5493
5507
|
config, {"_summarization_event": result.new_event}
|
|
5494
5508
|
)
|
|
@@ -5835,12 +5849,14 @@ class DeepAgentsApp(App):
|
|
|
5835
5849
|
return result
|
|
5836
5850
|
|
|
5837
5851
|
async def _get_thread_state_values(self, thread_id: str) -> dict[str, Any]:
|
|
5838
|
-
"""Fetch thread state values
|
|
5852
|
+
"""Fetch thread state values for a thread.
|
|
5839
5853
|
|
|
5840
|
-
In server mode the LangGraph dev server
|
|
5841
|
-
|
|
5842
|
-
|
|
5843
|
-
|
|
5854
|
+
In server mode the LangGraph dev server starts with an empty in-memory
|
|
5855
|
+
thread store, so `aget_state` returns empty state for any thread that
|
|
5856
|
+
was not registered in the current server session. Calling
|
|
5857
|
+
`aensure_thread` first registers the thread idempotently so the
|
|
5858
|
+
subsequent `aget_state` call can read from the checkpointer correctly,
|
|
5859
|
+
including proper reconstruction of delta channels.
|
|
5844
5860
|
|
|
5845
5861
|
Args:
|
|
5846
5862
|
thread_id: Thread ID to fetch from checkpoint storage.
|
|
@@ -5853,46 +5869,20 @@ class DeepAgentsApp(App):
|
|
|
5853
5869
|
return {}
|
|
5854
5870
|
|
|
5855
5871
|
config: RunnableConfig = {"configurable": {"thread_id": thread_id}}
|
|
5856
|
-
|
|
5872
|
+
remote_config: dict[str, Any] = {"configurable": {"thread_id": thread_id}}
|
|
5857
5873
|
|
|
5858
|
-
|
|
5859
|
-
|
|
5860
|
-
values = dict(state.values)
|
|
5874
|
+
if remote := self._remote_agent():
|
|
5875
|
+
await remote.aensure_thread(remote_config)
|
|
5861
5876
|
|
|
5862
|
-
|
|
5863
|
-
if isinstance(messages, list) and messages:
|
|
5864
|
-
return values
|
|
5865
|
-
if not self._remote_agent():
|
|
5866
|
-
return values
|
|
5877
|
+
state = await self._agent.aget_state(config)
|
|
5867
5878
|
|
|
5868
|
-
|
|
5869
|
-
|
|
5870
|
-
|
|
5871
|
-
)
|
|
5872
|
-
fallback_values = await self._read_channel_values_from_checkpointer(thread_id)
|
|
5873
|
-
fallback_messages = fallback_values.get("messages")
|
|
5874
|
-
if isinstance(fallback_messages, list) and fallback_messages:
|
|
5875
|
-
values["messages"] = fallback_messages
|
|
5876
|
-
if (
|
|
5877
|
-
values.get("_summarization_event") is None
|
|
5878
|
-
and "_summarization_event" in fallback_values
|
|
5879
|
-
):
|
|
5880
|
-
values["_summarization_event"] = fallback_values["_summarization_event"]
|
|
5881
|
-
if (
|
|
5882
|
-
values.get("_context_tokens") is None
|
|
5883
|
-
and "_context_tokens" in fallback_values
|
|
5884
|
-
):
|
|
5885
|
-
values["_context_tokens"] = fallback_values["_context_tokens"]
|
|
5886
|
-
return values
|
|
5879
|
+
if state and state.values:
|
|
5880
|
+
return dict(state.values)
|
|
5881
|
+
return {}
|
|
5887
5882
|
|
|
5888
5883
|
async def _fetch_thread_history_data(self, thread_id: str) -> _ThreadHistoryPayload:
|
|
5889
5884
|
"""Fetch and convert stored messages for a thread.
|
|
5890
5885
|
|
|
5891
|
-
In server mode the LangGraph dev server starts with an empty thread
|
|
5892
|
-
store, so `aget_state` via the HTTP API returns no messages even when
|
|
5893
|
-
checkpoints exist on disk. We fall back to reading the SQLite
|
|
5894
|
-
checkpointer directly to guarantee resumed threads load their history.
|
|
5895
|
-
|
|
5896
5886
|
Args:
|
|
5897
5887
|
thread_id: Thread ID to fetch from checkpoint storage.
|
|
5898
5888
|
|
|
@@ -5910,10 +5900,8 @@ class DeepAgentsApp(App):
|
|
|
5910
5900
|
if not messages:
|
|
5911
5901
|
return _ThreadHistoryPayload([], context_tokens)
|
|
5912
5902
|
|
|
5913
|
-
#
|
|
5903
|
+
# RemoteGraph.aget_state returns values as raw JSON dicts; convert to
|
|
5914
5904
|
# LangChain message objects so _convert_messages_to_data works.
|
|
5915
|
-
# `any(...)` guards against heterogeneous lists where only some
|
|
5916
|
-
# elements are serialized.
|
|
5917
5905
|
if any(isinstance(m, dict) for m in messages):
|
|
5918
5906
|
from langchain_core.messages.utils import convert_to_messages
|
|
5919
5907
|
|
|
@@ -5923,44 +5911,6 @@ class DeepAgentsApp(App):
|
|
|
5923
5911
|
data = await asyncio.to_thread(self._convert_messages_to_data, messages)
|
|
5924
5912
|
return _ThreadHistoryPayload(data, context_tokens)
|
|
5925
5913
|
|
|
5926
|
-
@staticmethod
|
|
5927
|
-
async def _read_channel_values_from_checkpointer(thread_id: str) -> dict[str, Any]:
|
|
5928
|
-
"""Read checkpoint channel values directly from the SQLite checkpointer.
|
|
5929
|
-
|
|
5930
|
-
Args:
|
|
5931
|
-
thread_id: Thread ID to look up.
|
|
5932
|
-
|
|
5933
|
-
Returns:
|
|
5934
|
-
Channel values from the latest checkpoint, or an empty dict on
|
|
5935
|
-
failure.
|
|
5936
|
-
"""
|
|
5937
|
-
try:
|
|
5938
|
-
from langgraph.checkpoint.sqlite.aio import AsyncSqliteSaver
|
|
5939
|
-
|
|
5940
|
-
from deepagents_cli.sessions import get_db_path
|
|
5941
|
-
|
|
5942
|
-
db_path = str(get_db_path())
|
|
5943
|
-
config: RunnableConfig = {"configurable": {"thread_id": thread_id}}
|
|
5944
|
-
async with AsyncSqliteSaver.from_conn_string(db_path) as saver:
|
|
5945
|
-
tup = await saver.aget_tuple(config)
|
|
5946
|
-
if tup and tup.checkpoint:
|
|
5947
|
-
channel_values = tup.checkpoint.get("channel_values", {})
|
|
5948
|
-
if isinstance(channel_values, dict):
|
|
5949
|
-
return dict(channel_values)
|
|
5950
|
-
except (ImportError, OSError) as exc:
|
|
5951
|
-
logger.warning(
|
|
5952
|
-
"Failed to read checkpointer directly for %s: %s",
|
|
5953
|
-
thread_id,
|
|
5954
|
-
exc,
|
|
5955
|
-
)
|
|
5956
|
-
except Exception:
|
|
5957
|
-
logger.warning(
|
|
5958
|
-
"Unexpected error reading checkpointer for %s",
|
|
5959
|
-
thread_id,
|
|
5960
|
-
exc_info=True,
|
|
5961
|
-
)
|
|
5962
|
-
return {}
|
|
5963
|
-
|
|
5964
5914
|
async def _upgrade_thread_message_link(
|
|
5965
5915
|
self,
|
|
5966
5916
|
widget: AppMessage,
|
{deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/integrations/sandbox_factory.py
RENAMED
|
@@ -710,7 +710,7 @@ class _AgentCoreProvider(SandboxProvider):
|
|
|
710
710
|
|
|
711
711
|
# Validate AWS credentials early for a clear error message.
|
|
712
712
|
try:
|
|
713
|
-
import boto3 # ty: ignore[unresolved-import
|
|
713
|
+
import boto3 # ty: ignore[unresolved-import]
|
|
714
714
|
|
|
715
715
|
session = boto3.Session()
|
|
716
716
|
credentials = session.get_credentials()
|
|
@@ -183,7 +183,8 @@ class RemoteAgent:
|
|
|
183
183
|
) -> Any: # noqa: ANN401
|
|
184
184
|
"""Get the current state of a thread.
|
|
185
185
|
|
|
186
|
-
Returns `None` when the thread does not exist on the server (404)
|
|
186
|
+
Returns `None` when the thread does not exist on the server (404) or
|
|
187
|
+
when the thread exists but has no checkpoint yet (new/empty thread).
|
|
187
188
|
All other errors (network, auth, 500) are logged at WARNING and
|
|
188
189
|
re-raised so callers can handle them.
|
|
189
190
|
|
|
@@ -196,10 +197,11 @@ class RemoteAgent:
|
|
|
196
197
|
|
|
197
198
|
Returns:
|
|
198
199
|
Thread state object with `values` and `next` attributes, or `None`
|
|
199
|
-
if the thread is not found.
|
|
200
|
+
if the thread is not found or has no checkpoint.
|
|
200
201
|
|
|
201
202
|
Raises:
|
|
202
203
|
ValueError: If `thread_id` is not present in `config`.
|
|
204
|
+
TypeError: If the server returns an unexpected state shape.
|
|
203
205
|
""" # noqa: DOC502 — raised by _require_thread_id
|
|
204
206
|
from langgraph_sdk.errors import NotFoundError
|
|
205
207
|
|
|
@@ -211,6 +213,20 @@ class RemoteAgent:
|
|
|
211
213
|
except NotFoundError:
|
|
212
214
|
logger.debug("Thread %s not found on server", thread_id)
|
|
213
215
|
return None
|
|
216
|
+
except TypeError as e:
|
|
217
|
+
# langgraph SDK bug: _create_state_snapshot does
|
|
218
|
+
# state["checkpoint"]["thread_id"], but the server returns
|
|
219
|
+
# checkpoint=null for threads with no checkpoint yet (new threads,
|
|
220
|
+
# or threads registered via aensure_thread before any run).
|
|
221
|
+
if "subscriptable" in str(e).lower():
|
|
222
|
+
logger.debug(
|
|
223
|
+
"Thread %s has no checkpoint yet; treating as empty", thread_id
|
|
224
|
+
)
|
|
225
|
+
return None
|
|
226
|
+
logger.warning(
|
|
227
|
+
"Failed to get state for thread %s", thread_id, exc_info=True
|
|
228
|
+
)
|
|
229
|
+
raise
|
|
214
230
|
except Exception:
|
|
215
231
|
logger.warning(
|
|
216
232
|
"Failed to get state for thread %s", thread_id, exc_info=True
|
|
@@ -123,7 +123,11 @@ def list_skills(
|
|
|
123
123
|
}
|
|
124
124
|
extended = cast("ExtendedSkillMetadata", {**skill, **extra})
|
|
125
125
|
all_skills[skill["name"]] = extended
|
|
126
|
-
except
|
|
126
|
+
except Exception:
|
|
127
|
+
# Degrade gracefully — one malformed/inaccessible source must not
|
|
128
|
+
# block discovery of others, so catch broadly and log instead.
|
|
129
|
+
# WARNING (not ERROR) because a half-written SKILL.md from a user is
|
|
130
|
+
# an expected condition, not a code defect.
|
|
127
131
|
logger.warning(
|
|
128
132
|
"Could not load skills from %s",
|
|
129
133
|
skill_dir,
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "deepagents-cli"
|
|
7
|
-
version = "0.0.
|
|
7
|
+
version = "0.0.59"
|
|
8
8
|
description = "Terminal interface for Deep Agents - interactive AI agent with file operations, shell access, and sub-agent capabilities."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "MIT" }
|
|
@@ -26,15 +26,15 @@ classifiers = [
|
|
|
26
26
|
]
|
|
27
27
|
dependencies = [
|
|
28
28
|
# Framework
|
|
29
|
-
"deepagents==0.
|
|
30
|
-
"langchain>=1.
|
|
31
|
-
"langgraph>=1.
|
|
32
|
-
"langgraph-checkpoint-sqlite>=3.0
|
|
33
|
-
"langgraph-prebuilt>=1.0.13,<2.0.0",
|
|
29
|
+
"deepagents==0.6.1",
|
|
30
|
+
"langchain>=1.3.0,<2.0.0",
|
|
31
|
+
"langgraph>=1.2.0,<2.0.0",
|
|
32
|
+
"langgraph-checkpoint-sqlite>=3.1.0,<4.0.0",
|
|
34
33
|
|
|
35
34
|
# Client-server architecture
|
|
36
35
|
"langgraph-sdk>=0.3.13,<1.0.0",
|
|
37
36
|
"langgraph-cli[inmem]>=0.4.24,<1.0.0",
|
|
37
|
+
"langgraph-runtime-inmem>=0.28.1,<1.0.0",
|
|
38
38
|
"httpx>=0.28.1,<1.0.0",
|
|
39
39
|
|
|
40
40
|
# Core model providers - others are added as optional
|
{deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/test_compact_resume.py
RENAMED
|
@@ -2,9 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from types import SimpleNamespace
|
|
6
5
|
from typing import TYPE_CHECKING
|
|
7
|
-
from unittest.mock import AsyncMock
|
|
8
6
|
|
|
9
7
|
import pytest
|
|
10
8
|
|
|
@@ -62,12 +60,11 @@ def _event_field(event: object, key: str) -> object | None:
|
|
|
62
60
|
async def test_compact_resumed_thread_uses_persisted_history(
|
|
63
61
|
tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
64
62
|
) -> None:
|
|
65
|
-
"""
|
|
63
|
+
"""Offloads a resumed thread after restart using remote server state.
|
|
66
64
|
|
|
67
65
|
The test seeds a real persisted thread on one server instance, restarts the
|
|
68
66
|
server, resumes that thread in a fresh `DeepAgentsApp`, and verifies that
|
|
69
|
-
`/
|
|
70
|
-
checkpointer rather than live in-memory server state.
|
|
67
|
+
`/offload` succeeds after the app registers the thread with the server.
|
|
71
68
|
"""
|
|
72
69
|
home_dir = tmp_path / "home"
|
|
73
70
|
project_dir = tmp_path / "project"
|
|
@@ -92,7 +89,7 @@ async def test_compact_resumed_thread_uses_persisted_history(
|
|
|
92
89
|
from deepagents_cli.app import DeepAgentsApp
|
|
93
90
|
from deepagents_cli.config import create_model
|
|
94
91
|
from deepagents_cli.server_manager import server_session
|
|
95
|
-
from deepagents_cli.sessions import generate_thread_id
|
|
92
|
+
from deepagents_cli.sessions import generate_thread_id
|
|
96
93
|
from deepagents_cli.widgets.messages import AppMessage, ErrorMessage
|
|
97
94
|
|
|
98
95
|
config_path = home_dir / ".deepagents" / "config.toml"
|
|
@@ -124,15 +121,12 @@ async def test_compact_resumed_thread_uses_persisted_history(
|
|
|
124
121
|
prompt=_build_long_prompt(turn),
|
|
125
122
|
)
|
|
126
123
|
|
|
127
|
-
assert await thread_exists(thread_id)
|
|
128
|
-
|
|
129
124
|
compact_backend = CompositeBackend(
|
|
130
125
|
default=FilesystemBackend(root_dir=backend_root, virtual_mode=True),
|
|
131
126
|
routes={},
|
|
132
127
|
)
|
|
133
128
|
|
|
134
|
-
# Server 2: same SQLite DB, but a fresh server process
|
|
135
|
-
# in-memory thread registry.
|
|
129
|
+
# Server 2: same SQLite DB, but a fresh server process.
|
|
136
130
|
async with server_session(
|
|
137
131
|
assistant_id=assistant_id,
|
|
138
132
|
model_name="itest:fake",
|
|
@@ -142,15 +136,6 @@ async def test_compact_resumed_thread_uses_persisted_history(
|
|
|
142
136
|
sandbox_type="none",
|
|
143
137
|
) as (agent, _server_proc):
|
|
144
138
|
config = {"configurable": {"thread_id": thread_id}}
|
|
145
|
-
actual_state = await agent.aget_state(config)
|
|
146
|
-
actual_values = getattr(actual_state, "values", None) or {}
|
|
147
|
-
|
|
148
|
-
# Fresh dev servers may return empty state for persisted threads
|
|
149
|
-
# after restart. If that behavior changes upstream, force the
|
|
150
|
-
# empty-state precondition so this test still covers the SQLite
|
|
151
|
-
# fallback path.
|
|
152
|
-
if actual_values:
|
|
153
|
-
agent.aget_state = AsyncMock(return_value=SimpleNamespace(values={})) # ty: ignore[invalid-assignment]
|
|
154
139
|
|
|
155
140
|
app = DeepAgentsApp(
|
|
156
141
|
agent=agent, # ty: ignore[invalid-argument-type]
|
|
@@ -170,20 +155,15 @@ async def test_compact_resumed_thread_uses_persisted_history(
|
|
|
170
155
|
break
|
|
171
156
|
|
|
172
157
|
assert app._message_store.total_count > 0
|
|
173
|
-
resume_messages = app.query(AppMessage)
|
|
174
|
-
assert any(
|
|
175
|
-
"Resumed thread:" in str(widget._content)
|
|
176
|
-
for widget in resume_messages
|
|
177
|
-
)
|
|
178
158
|
|
|
179
159
|
await app._handle_offload()
|
|
180
160
|
|
|
181
|
-
# `/
|
|
161
|
+
# `/offload` posts a success message after the async state write
|
|
182
162
|
# and archive offload finish.
|
|
183
163
|
for _ in range(120):
|
|
184
164
|
await pilot.pause(0.1)
|
|
185
165
|
if any(
|
|
186
|
-
"
|
|
166
|
+
"Offloaded " in str(widget._content)
|
|
187
167
|
for widget in app.query(AppMessage)
|
|
188
168
|
):
|
|
189
169
|
break
|
|
@@ -195,16 +175,15 @@ async def test_compact_resumed_thread_uses_persisted_history(
|
|
|
195
175
|
str(widget._content) for widget in app.query(ErrorMessage)
|
|
196
176
|
]
|
|
197
177
|
|
|
198
|
-
assert "Nothing to
|
|
199
|
-
assert any("
|
|
178
|
+
assert "Nothing to offload" not in "\n".join(app_messages)
|
|
179
|
+
assert any("Offloaded " in content for content in app_messages)
|
|
200
180
|
assert not error_messages
|
|
201
181
|
|
|
202
|
-
# The summarization event must be
|
|
203
|
-
# see compacted context instead of
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
)
|
|
207
|
-
summarization_event = channel_values.get("_summarization_event")
|
|
182
|
+
# The summarization event must be visible through server state so
|
|
183
|
+
# subsequent turns see compacted context instead of full history.
|
|
184
|
+
state = await agent.aget_state(config)
|
|
185
|
+
values = getattr(state, "values", None) or {}
|
|
186
|
+
summarization_event = values.get("_summarization_event")
|
|
208
187
|
assert summarization_event is not None
|
|
209
188
|
cutoff = _event_field(summarization_event, "cutoff_index")
|
|
210
189
|
assert isinstance(cutoff, int)
|
|
@@ -219,7 +198,7 @@ async def test_compact_resumed_thread_uses_persisted_history(
|
|
|
219
198
|
archive_path = backend_root / "conversation_history" / f"{thread_id}.md"
|
|
220
199
|
assert archive_path.exists()
|
|
221
200
|
archive_text = archive_path.read_text()
|
|
222
|
-
assert "
|
|
201
|
+
assert "Offloaded at" in archive_text
|
|
223
202
|
assert "keeps enough unique detail" in archive_text
|
|
224
203
|
finally:
|
|
225
204
|
model_config.clear_caches()
|
|
@@ -719,6 +719,40 @@ class TestListSkillsBuiltIn:
|
|
|
719
719
|
assert len(skills) == 1
|
|
720
720
|
assert skills[0]["name"] == "user-skill"
|
|
721
721
|
|
|
722
|
+
def test_unexpected_source_error_does_not_break_others(
|
|
723
|
+
self, tmp_path: Path
|
|
724
|
+
) -> None:
|
|
725
|
+
"""Any per-source discovery error should preserve remaining sources."""
|
|
726
|
+
user_dir = tmp_path / "user_skills"
|
|
727
|
+
_create_skill(user_dir / "user-skill", "user-skill", "A user skill")
|
|
728
|
+
|
|
729
|
+
built_in_dir = tmp_path / "built_in_skills"
|
|
730
|
+
built_in_dir.mkdir()
|
|
731
|
+
|
|
732
|
+
original_list = __import__(
|
|
733
|
+
"deepagents.middleware.skills", fromlist=["_list_skills"]
|
|
734
|
+
)._list_skills
|
|
735
|
+
|
|
736
|
+
call_count = 0
|
|
737
|
+
|
|
738
|
+
def patched_list(backend: object, source_path: str) -> list[object]:
|
|
739
|
+
nonlocal call_count
|
|
740
|
+
call_count += 1
|
|
741
|
+
if call_count == 1:
|
|
742
|
+
msg = "simulated parser edge case"
|
|
743
|
+
raise ValueError(msg)
|
|
744
|
+
return original_list(backend=backend, source_path=source_path)
|
|
745
|
+
|
|
746
|
+
with patch("deepagents_cli.skills.load.list_skills_from_backend", patched_list):
|
|
747
|
+
skills = list_skills(
|
|
748
|
+
built_in_skills_dir=built_in_dir,
|
|
749
|
+
user_skills_dir=user_dir,
|
|
750
|
+
project_skills_dir=None,
|
|
751
|
+
)
|
|
752
|
+
|
|
753
|
+
assert len(skills) == 1
|
|
754
|
+
assert skills[0]["name"] == "user-skill"
|
|
755
|
+
|
|
722
756
|
|
|
723
757
|
class TestListSkillsClaudeDirectories:
|
|
724
758
|
"""Test `list_skills` with experimental Claude skills directories."""
|