deepagents-cli 0.0.58__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.58 → deepagents_cli-0.0.59}/CHANGELOG.md +6 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/PKG-INFO +1 -1
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_version.py +3 -1
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/app.py +22 -5
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/skills/load.py +5 -1
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/pyproject.toml +1 -1
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/skills/test_load.py +34 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_app.py +99 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/uv.lock +4 -4
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/.gitignore +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/DEV.md +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/Makefile +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/README.md +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/THREAT_MODEL.md +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/__init__.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/__main__.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_ask_user_types.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_cli_context.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_constants.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_debug.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_env_vars.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_git.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_server_config.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_session_stats.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_testing_models.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_textual_patches.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/agent.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/app.tcss +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/ask_user.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/auth_store.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/__init__.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/clipboard.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/command_registry.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/config.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/configurable_model.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/default_agent_prompt.md +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/__init__.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/bundler.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/commands.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/config.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/context_hub.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/anonymous-B9UzAXQd.js +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/clerk-5xHgyQyG.js +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/highlighted-body-OFNGDK62-rX-7qT8o.js +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/index-DM3gptpu.js +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/index-Ddy7F6KI.css +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/supabase-S6NACDgm.js +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/index.html +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/logo-dark.svg +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/logo-light.svg +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/templates.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/editor.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/event_bus.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/extras_info.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/file_ops.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/formatting.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/hooks.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/input.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/integrations/__init__.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/integrations/sandbox_factory.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/integrations/sandbox_provider.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/iterm_cursor_guide.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/local_context.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/main.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_auth.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_commands.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/__init__.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/_registry.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/base.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/github.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/slack.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_tools.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_trust.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/media_utils.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/model_config.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/non_interactive.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/notifications.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/offload.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/onboarding.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/output.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/project_utils.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/py.typed +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/remote_client.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/server.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/server_graph.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/server_manager.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/sessions.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/skills/__init__.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/skills/commands.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/skills/invocation.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/state_migration.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/subagents.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/system_prompt.md +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/terminal_capabilities.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/terminal_escape.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/textual_adapter.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/theme.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/token_state.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/tool_display.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/tools.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/ui.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/unicode_security.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/update_check.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/__init__.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/_links.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/agent_selector.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/approval.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/ask_user.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/auth.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/autocomplete.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/chat_input.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/diff.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/history.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/launch_init.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/loading.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/mcp_viewer.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/message_store.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/messages.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/model_selector.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/notification_center.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/notification_detail.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/notification_settings.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/status.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/theme_selector.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/thread_selector.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/tool_renderers.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/tool_widgets.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/update_available.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/update_progress.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/welcome.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/deploy-content-writer/.env.example +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/deploy-content-writer/skills/blog-post/SKILL.md +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/deploy-content-writer/skills/social-media/SKILL.md +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/deploy-content-writer/user/context.md +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/deploy-content-writer/user/preferences.md +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/.nvmrc +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/index.html +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/package-lock.json +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/package.json +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/postcss.config.js +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/public/logo-dark.svg +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/public/logo-light.svg +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/App.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/ThemeProvider.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/auth/anonymous.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/auth/clerk.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/auth/loader.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/auth/supabase.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/auth/types.ts +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/AppHeader.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/FilePanels.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/MessageList.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/SubagentActivity.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/ThreadPicker.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/TodosPanel.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/ToolCallCard.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/FileToolCard.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/SearchCard.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/ThinkCard.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/TodosCard.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/index.ts +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/constants.ts +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/index.css +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/main.tsx +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/runtimeConfig.ts +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/types.ts +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/vite-env.d.ts +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/tsconfig.json +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/vite.config.ts +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/images/cli.png +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/scripts/check_imports.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/scripts/debug_server.sh +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/scripts/install.sh +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/README.md +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/__init__.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/conftest.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/test_context_hub.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/test_deploy_hub.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/__init__.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/conftest.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/__init__.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_bundler.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_commands.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_config.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_context_hub.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_frontend_bundle.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_frontend_config.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_agent.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_agent_selector.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_approval.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_args.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_ask_user.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_auth_widgets.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_autocomplete.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_chat_input.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_config.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_git.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_history.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_launch_init.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_links.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_loading.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_main.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_commands.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_trust.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_viewer.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_message_store.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_messages.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_model_config.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_model_selector.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_notification_center.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_notification_detail.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_offload_dict_messages.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_output.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_server.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_status.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_textual_adapter.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_thread_selector.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_token_tracker.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_update_available.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_update_progress.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_version.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_welcome.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/tools/test_fetch_url.py +0 -0
|
@@ -1,5 +1,11 @@
|
|
|
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
|
+
|
|
3
9
|
## [0.0.58](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.57...deepagents-cli==0.0.58) (2026-05-12)
|
|
4
10
|
|
|
5
11
|
### 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/
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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" }
|
|
@@ -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."""
|
|
@@ -7771,6 +7771,105 @@ class TestPrewarmAwait:
|
|
|
7771
7771
|
for notify_call in warning_calls:
|
|
7772
7772
|
assert notify_call.kwargs.get("markup") is False
|
|
7773
7773
|
|
|
7774
|
+
async def test_discover_skills_awaits_prewarm_before_thread_offload(
|
|
7775
|
+
self,
|
|
7776
|
+
) -> None:
|
|
7777
|
+
"""Locks the call-order invariant that prevents an import deadlock.
|
|
7778
|
+
|
|
7779
|
+
Skill discovery and prewarm import overlapping parts of the Deep Agents
|
|
7780
|
+
graph in separate workers. A regression that drops the
|
|
7781
|
+
`await _await_prewarm_imports()` re-introduces the production crash;
|
|
7782
|
+
this is the only test that catches that ordering contract.
|
|
7783
|
+
"""
|
|
7784
|
+
call_order: list[str] = []
|
|
7785
|
+
|
|
7786
|
+
app = DeepAgentsApp(agent=MagicMock(), thread_id="t")
|
|
7787
|
+
|
|
7788
|
+
async def record_prewarm() -> None:
|
|
7789
|
+
call_order.append("prewarm")
|
|
7790
|
+
await asyncio.sleep(0)
|
|
7791
|
+
|
|
7792
|
+
def record_discover() -> tuple[list[Any], list[Any]]:
|
|
7793
|
+
call_order.append("discover")
|
|
7794
|
+
return [], []
|
|
7795
|
+
|
|
7796
|
+
with (
|
|
7797
|
+
patch.object(app, "_await_prewarm_imports", side_effect=record_prewarm),
|
|
7798
|
+
patch.object(
|
|
7799
|
+
app, "_discover_skills_and_roots", side_effect=record_discover
|
|
7800
|
+
),
|
|
7801
|
+
):
|
|
7802
|
+
await app._discover_skills()
|
|
7803
|
+
|
|
7804
|
+
assert call_order == ["prewarm", "discover"], (
|
|
7805
|
+
f"prewarm must precede skill discovery thread; got {call_order}"
|
|
7806
|
+
)
|
|
7807
|
+
|
|
7808
|
+
async def test_discover_skills_prewarm_failure_warns_with_debug_hint(
|
|
7809
|
+
self,
|
|
7810
|
+
) -> None:
|
|
7811
|
+
"""A prewarm failure should use the discovery failure toast path."""
|
|
7812
|
+
app = DeepAgentsApp(agent=MagicMock(), thread_id="t")
|
|
7813
|
+
|
|
7814
|
+
with (
|
|
7815
|
+
patch.object(
|
|
7816
|
+
app,
|
|
7817
|
+
"_await_prewarm_imports",
|
|
7818
|
+
AsyncMock(side_effect=RuntimeError("prewarm failed")),
|
|
7819
|
+
),
|
|
7820
|
+
patch.object(app, "_discover_skills_and_roots") as discover_mock,
|
|
7821
|
+
patch.object(app, "notify") as notify_mock,
|
|
7822
|
+
):
|
|
7823
|
+
ok = await app._discover_skills()
|
|
7824
|
+
|
|
7825
|
+
assert ok is False
|
|
7826
|
+
discover_mock.assert_not_called()
|
|
7827
|
+
notify_mock.assert_called_once()
|
|
7828
|
+
message = notify_mock.call_args.args[0]
|
|
7829
|
+
assert "RuntimeError" in message
|
|
7830
|
+
assert "DEEPAGENTS_CLI_DEBUG=1" in message
|
|
7831
|
+
assert notify_mock.call_args.kwargs["severity"] == "warning"
|
|
7832
|
+
assert notify_mock.call_args.kwargs["markup"] is False
|
|
7833
|
+
|
|
7834
|
+
async def test_start_server_waits_for_skill_discovery_import_gate(
|
|
7835
|
+
self,
|
|
7836
|
+
) -> None:
|
|
7837
|
+
"""Startup model creation must not import during skill discovery."""
|
|
7838
|
+
from deepagents_cli import config as cli_config
|
|
7839
|
+
|
|
7840
|
+
app = DeepAgentsApp(agent=MagicMock(), thread_id="t")
|
|
7841
|
+
app._model_kwargs = {"model_spec": "anthropic:claude-opus-4-7"}
|
|
7842
|
+
app._server_kwargs = None
|
|
7843
|
+
app._mcp_preload_kwargs = None
|
|
7844
|
+
app._resume_thread_intent = None
|
|
7845
|
+
app._assistant_id = None
|
|
7846
|
+
|
|
7847
|
+
await app._deepagents_import_lock.acquire()
|
|
7848
|
+
|
|
7849
|
+
def fake_create_model(**_: Any) -> MagicMock:
|
|
7850
|
+
result = MagicMock()
|
|
7851
|
+
result.apply_to_settings = MagicMock()
|
|
7852
|
+
result.provider = "anthropic"
|
|
7853
|
+
result.model_name = "claude-opus-4-7"
|
|
7854
|
+
return result
|
|
7855
|
+
|
|
7856
|
+
with (
|
|
7857
|
+
patch.object(app, "_await_prewarm_imports", AsyncMock()),
|
|
7858
|
+
patch.object(
|
|
7859
|
+
cli_config, "create_model", side_effect=fake_create_model
|
|
7860
|
+
) as create_model_mock,
|
|
7861
|
+
patch("deepagents_cli.model_config.save_recent_model"),
|
|
7862
|
+
patch.object(app, "post_message"),
|
|
7863
|
+
):
|
|
7864
|
+
task = asyncio.create_task(app._start_server_background())
|
|
7865
|
+
await asyncio.sleep(0)
|
|
7866
|
+
assert create_model_mock.call_count == 0
|
|
7867
|
+
app._deepagents_import_lock.release()
|
|
7868
|
+
with contextlib.suppress(Exception):
|
|
7869
|
+
await task
|
|
7870
|
+
|
|
7871
|
+
create_model_mock.assert_called_once()
|
|
7872
|
+
|
|
7774
7873
|
|
|
7775
7874
|
class TestHeaderAndTitle:
|
|
7776
7875
|
"""Header widget visibility and custom title overrides."""
|
|
@@ -1025,7 +1025,7 @@ wheels = [
|
|
|
1025
1025
|
|
|
1026
1026
|
[[package]]
|
|
1027
1027
|
name = "deepagents-cli"
|
|
1028
|
-
version = "0.0.
|
|
1028
|
+
version = "0.0.59"
|
|
1029
1029
|
source = { editable = "." }
|
|
1030
1030
|
dependencies = [
|
|
1031
1031
|
{ name = "aiosqlite" },
|
|
@@ -4976,11 +4976,11 @@ wheels = [
|
|
|
4976
4976
|
|
|
4977
4977
|
[[package]]
|
|
4978
4978
|
name = "python-multipart"
|
|
4979
|
-
version = "0.0.
|
|
4979
|
+
version = "0.0.28"
|
|
4980
4980
|
source = { registry = "https://pypi.org/simple" }
|
|
4981
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
4981
|
+
sdist = { url = "https://files.pythonhosted.org/packages/82/54/a85eb421fbdd5007bc5af39d0f4ed9fa609e0fedbfdc2adcf0b34526870e/python_multipart-0.0.28.tar.gz", hash = "sha256:8550da197eac0f7ab748961fc9509b999fa2662ea25cef857f05249f6893c0f8", size = 45314, upload-time = "2026-05-10T11:05:16.596Z" }
|
|
4982
4982
|
wheels = [
|
|
4983
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
4983
|
+
{ url = "https://files.pythonhosted.org/packages/f3/a2/43bbc5860b5034e2af4ef99a0e04d726ff329c43e192ef3abaa8d7ecfce5/python_multipart-0.0.28-py3-none-any.whl", hash = "sha256:10faac07eb966c3f48dc415f9dee46c04cb10d58d30a35677db8027c825ed9b6", size = 29438, upload-time = "2026-05-10T11:05:15.052Z" },
|
|
4984
4984
|
]
|
|
4985
4985
|
|
|
4986
4986
|
[[package]]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/remember/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/index.html
RENAMED
|
File without changes
|
{deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/logo-dark.svg
RENAMED
|
File without changes
|
{deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/logo-light.svg
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/integrations/sandbox_factory.py
RENAMED
|
File without changes
|
{deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/integrations/sandbox_provider.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/notification_center.py
RENAMED
|
File without changes
|
{deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/notification_detail.py
RENAMED
|
File without changes
|
{deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/notification_settings.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|