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.
Files changed (299) hide show
  1. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/CHANGELOG.md +6 -0
  2. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/PKG-INFO +1 -1
  3. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_version.py +3 -1
  4. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/app.py +22 -5
  5. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/skills/load.py +5 -1
  6. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/pyproject.toml +1 -1
  7. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/skills/test_load.py +34 -0
  8. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_app.py +99 -0
  9. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/uv.lock +4 -4
  10. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/.gitignore +0 -0
  11. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/DEV.md +0 -0
  12. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/Makefile +0 -0
  13. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/README.md +0 -0
  14. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/THREAT_MODEL.md +0 -0
  15. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/__init__.py +0 -0
  16. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/__main__.py +0 -0
  17. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_ask_user_types.py +0 -0
  18. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_cli_context.py +0 -0
  19. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_constants.py +0 -0
  20. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_debug.py +0 -0
  21. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_env_vars.py +0 -0
  22. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_git.py +0 -0
  23. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_server_config.py +0 -0
  24. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_session_stats.py +0 -0
  25. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_testing_models.py +0 -0
  26. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/_textual_patches.py +0 -0
  27. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/agent.py +0 -0
  28. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/app.tcss +0 -0
  29. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/ask_user.py +0 -0
  30. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/auth_store.py +0 -0
  31. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/__init__.py +0 -0
  32. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/remember/SKILL.md +0 -0
  33. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/skill-creator/SKILL.md +0 -0
  34. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  35. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  36. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/clipboard.py +0 -0
  37. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/command_registry.py +0 -0
  38. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/config.py +0 -0
  39. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/configurable_model.py +0 -0
  40. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/default_agent_prompt.md +0 -0
  41. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/__init__.py +0 -0
  42. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/bundler.py +0 -0
  43. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/commands.py +0 -0
  44. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/config.py +0 -0
  45. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/context_hub.py +0 -0
  46. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/anonymous-B9UzAXQd.js +0 -0
  47. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/clerk-5xHgyQyG.js +0 -0
  48. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/highlighted-body-OFNGDK62-rX-7qT8o.js +0 -0
  49. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/index-DM3gptpu.js +0 -0
  50. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/index-Ddy7F6KI.css +0 -0
  51. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/supabase-S6NACDgm.js +0 -0
  52. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/index.html +0 -0
  53. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/logo-dark.svg +0 -0
  54. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/logo-light.svg +0 -0
  55. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/deploy/templates.py +0 -0
  56. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/editor.py +0 -0
  57. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/event_bus.py +0 -0
  58. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/extras_info.py +0 -0
  59. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/file_ops.py +0 -0
  60. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/formatting.py +0 -0
  61. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/hooks.py +0 -0
  62. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/input.py +0 -0
  63. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/integrations/__init__.py +0 -0
  64. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/integrations/sandbox_factory.py +0 -0
  65. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/integrations/sandbox_provider.py +0 -0
  66. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/iterm_cursor_guide.py +0 -0
  67. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/local_context.py +0 -0
  68. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/main.py +0 -0
  69. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_auth.py +0 -0
  70. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_commands.py +0 -0
  71. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/__init__.py +0 -0
  72. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/_registry.py +0 -0
  73. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/base.py +0 -0
  74. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/github.py +0 -0
  75. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/slack.py +0 -0
  76. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_tools.py +0 -0
  77. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/mcp_trust.py +0 -0
  78. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/media_utils.py +0 -0
  79. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/model_config.py +0 -0
  80. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/non_interactive.py +0 -0
  81. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/notifications.py +0 -0
  82. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/offload.py +0 -0
  83. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/onboarding.py +0 -0
  84. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/output.py +0 -0
  85. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/project_utils.py +0 -0
  86. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/py.typed +0 -0
  87. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/remote_client.py +0 -0
  88. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/server.py +0 -0
  89. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/server_graph.py +0 -0
  90. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/server_manager.py +0 -0
  91. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/sessions.py +0 -0
  92. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/skills/__init__.py +0 -0
  93. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/skills/commands.py +0 -0
  94. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/skills/invocation.py +0 -0
  95. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/state_migration.py +0 -0
  96. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/subagents.py +0 -0
  97. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/system_prompt.md +0 -0
  98. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/terminal_capabilities.py +0 -0
  99. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/terminal_escape.py +0 -0
  100. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/textual_adapter.py +0 -0
  101. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/theme.py +0 -0
  102. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/token_state.py +0 -0
  103. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/tool_display.py +0 -0
  104. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/tools.py +0 -0
  105. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/ui.py +0 -0
  106. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/unicode_security.py +0 -0
  107. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/update_check.py +0 -0
  108. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/__init__.py +0 -0
  109. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/_links.py +0 -0
  110. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/agent_selector.py +0 -0
  111. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/approval.py +0 -0
  112. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/ask_user.py +0 -0
  113. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/auth.py +0 -0
  114. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/autocomplete.py +0 -0
  115. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/chat_input.py +0 -0
  116. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/diff.py +0 -0
  117. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/history.py +0 -0
  118. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/launch_init.py +0 -0
  119. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/loading.py +0 -0
  120. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/mcp_viewer.py +0 -0
  121. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/message_store.py +0 -0
  122. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/messages.py +0 -0
  123. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/model_selector.py +0 -0
  124. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/notification_center.py +0 -0
  125. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/notification_detail.py +0 -0
  126. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/notification_settings.py +0 -0
  127. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/status.py +0 -0
  128. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/theme_selector.py +0 -0
  129. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/thread_selector.py +0 -0
  130. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/tool_renderers.py +0 -0
  131. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/tool_widgets.py +0 -0
  132. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/update_available.py +0 -0
  133. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/update_progress.py +0 -0
  134. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/deepagents_cli/widgets/welcome.py +0 -0
  135. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/deploy-content-writer/.env.example +0 -0
  136. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/deploy-content-writer/skills/blog-post/SKILL.md +0 -0
  137. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/deploy-content-writer/skills/social-media/SKILL.md +0 -0
  138. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/deploy-content-writer/user/context.md +0 -0
  139. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/deploy-content-writer/user/preferences.md +0 -0
  140. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/skills/arxiv-search/SKILL.md +0 -0
  141. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  142. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/skills/langgraph-docs/SKILL.md +0 -0
  143. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/skills/skill-creator/SKILL.md +0 -0
  144. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  145. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  146. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/examples/skills/web-research/SKILL.md +0 -0
  147. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/.nvmrc +0 -0
  148. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/index.html +0 -0
  149. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/package-lock.json +0 -0
  150. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/package.json +0 -0
  151. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/postcss.config.js +0 -0
  152. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/public/logo-dark.svg +0 -0
  153. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/public/logo-light.svg +0 -0
  154. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/App.tsx +0 -0
  155. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/ThemeProvider.tsx +0 -0
  156. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/auth/anonymous.tsx +0 -0
  157. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/auth/clerk.tsx +0 -0
  158. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/auth/loader.tsx +0 -0
  159. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/auth/supabase.tsx +0 -0
  160. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/auth/types.ts +0 -0
  161. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/AppHeader.tsx +0 -0
  162. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/FilePanels.tsx +0 -0
  163. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/MessageList.tsx +0 -0
  164. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/SubagentActivity.tsx +0 -0
  165. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/ThreadPicker.tsx +0 -0
  166. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/TodosPanel.tsx +0 -0
  167. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/ToolCallCard.tsx +0 -0
  168. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/FileToolCard.tsx +0 -0
  169. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/SearchCard.tsx +0 -0
  170. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/ThinkCard.tsx +0 -0
  171. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/TodosCard.tsx +0 -0
  172. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/index.ts +0 -0
  173. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/constants.ts +0 -0
  174. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/index.css +0 -0
  175. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/main.tsx +0 -0
  176. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/runtimeConfig.ts +0 -0
  177. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/types.ts +0 -0
  178. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/src/vite-env.d.ts +0 -0
  179. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/tsconfig.json +0 -0
  180. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/frontend/vite.config.ts +0 -0
  181. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/images/cli.png +0 -0
  182. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/scripts/check_imports.py +0 -0
  183. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/scripts/debug_server.sh +0 -0
  184. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/scripts/install.sh +0 -0
  185. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/README.md +0 -0
  186. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/__init__.py +0 -0
  187. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/benchmarks/__init__.py +0 -0
  188. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  189. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  190. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/conftest.py +0 -0
  191. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/test_acp_mode.py +0 -0
  192. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/test_compact_resume.py +0 -0
  193. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/test_context_hub.py +0 -0
  194. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/test_deploy_hub.py +0 -0
  195. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/test_sandbox_factory.py +0 -0
  196. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/integration_tests/test_sandbox_operations.py +0 -0
  197. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/__init__.py +0 -0
  198. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/conftest.py +0 -0
  199. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/__init__.py +0 -0
  200. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_bundler.py +0 -0
  201. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_commands.py +0 -0
  202. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_config.py +0 -0
  203. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_context_hub.py +0 -0
  204. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_frontend_bundle.py +0 -0
  205. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_frontend_config.py +0 -0
  206. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/skills/__init__.py +0 -0
  207. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/skills/test_commands.py +0 -0
  208. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/skills/test_skills_json.py +0 -0
  209. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_agent.py +0 -0
  210. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_agent_friendly.py +0 -0
  211. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_agent_selector.py +0 -0
  212. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_approval.py +0 -0
  213. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_args.py +0 -0
  214. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_ask_user.py +0 -0
  215. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  216. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_auth_store.py +0 -0
  217. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_auth_widgets.py +0 -0
  218. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_autocomplete.py +0 -0
  219. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_charset.py +0 -0
  220. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_chat_input.py +0 -0
  221. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_clipboard.py +0 -0
  222. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_command_registry.py +0 -0
  223. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_compact_tool.py +0 -0
  224. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_config.py +0 -0
  225. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_configurable_model.py +0 -0
  226. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_debug.py +0 -0
  227. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_editor.py +0 -0
  228. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_end_to_end.py +0 -0
  229. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_env_vars.py +0 -0
  230. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_event_bus.py +0 -0
  231. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_exception_handling.py +0 -0
  232. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_extras_info.py +0 -0
  233. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_file_ops.py +0 -0
  234. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_formatting.py +0 -0
  235. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_git.py +0 -0
  236. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_history.py +0 -0
  237. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_hooks.py +0 -0
  238. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_imports.py +0 -0
  239. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_input_parsing.py +0 -0
  240. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  241. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_launch_init.py +0 -0
  242. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_links.py +0 -0
  243. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_loading.py +0 -0
  244. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_local_context.py +0 -0
  245. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_main.py +0 -0
  246. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_main_acp_mode.py +0 -0
  247. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_main_args.py +0 -0
  248. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_auth.py +0 -0
  249. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_commands.py +0 -0
  250. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_tools.py +0 -0
  251. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_trust.py +0 -0
  252. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_viewer.py +0 -0
  253. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_media_utils.py +0 -0
  254. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_message_store.py +0 -0
  255. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_messages.py +0 -0
  256. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_model_config.py +0 -0
  257. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_model_selector.py +0 -0
  258. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_model_switch.py +0 -0
  259. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_non_interactive.py +0 -0
  260. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_notification_center.py +0 -0
  261. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_notification_detail.py +0 -0
  262. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_notifications.py +0 -0
  263. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_offload.py +0 -0
  264. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_offload_dict_messages.py +0 -0
  265. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_onboarding.py +0 -0
  266. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_output.py +0 -0
  267. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_reload.py +0 -0
  268. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_remote_client.py +0 -0
  269. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_sandbox_factory.py +0 -0
  270. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_server.py +0 -0
  271. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_server_config.py +0 -0
  272. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_server_graph.py +0 -0
  273. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_server_helpers.py +0 -0
  274. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_server_manager.py +0 -0
  275. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_session_stats.py +0 -0
  276. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_sessions.py +0 -0
  277. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_shell_allow_list.py +0 -0
  278. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_skill_invocation.py +0 -0
  279. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  280. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_state_migration.py +0 -0
  281. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_status.py +0 -0
  282. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_subagents.py +0 -0
  283. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  284. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_terminal_escape.py +0 -0
  285. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_textual_adapter.py +0 -0
  286. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_textual_patches.py +0 -0
  287. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_theme.py +0 -0
  288. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_thread_selector.py +0 -0
  289. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_token_tracker.py +0 -0
  290. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_tool_display.py +0 -0
  291. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_ui.py +0 -0
  292. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_unicode_security.py +0 -0
  293. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_update_available.py +0 -0
  294. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_update_check.py +0 -0
  295. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_update_progress.py +0 -0
  296. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_version.py +0 -0
  297. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/test_welcome.py +0 -0
  298. {deepagents_cli-0.0.58 → deepagents_cli-0.0.59}/tests/unit_tests/tools/__init__.py +0 -0
  299. {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.58
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
- __version__ = "0.0.58" # x-release-please-version
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
- skills, roots = await asyncio.to_thread(self._discover_skills_and_roots)
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. Check logs for details.",
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
- result = create_model(**self._model_kwargs)
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 (OSError, KeyError, TypeError):
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.58"
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.58"
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.26"
4979
+ version = "0.0.28"
4980
4980
  source = { registry = "https://pypi.org/simple" }
4981
- sdist = { url = "https://files.pythonhosted.org/packages/88/71/b145a380824a960ebd60e1014256dbb7d2253f2316ff2d73dfd8928ec2c3/python_multipart-0.0.26.tar.gz", hash = "sha256:08fadc45918cd615e26846437f50c5d6d23304da32c341f289a617127b081f17", size = 43501, upload-time = "2026-04-10T14:09:59.473Z" }
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/9a/22/f1925cdda983ab66fc8ec6ec8014b959262747e58bdca26a4e3d1da29d56/python_multipart-0.0.26-py3-none-any.whl", hash = "sha256:c0b169f8c4484c13b0dcf2ef0ec3a4adb255c4b7d18d8e420477d2b1dd03f185", size = 28847, upload-time = "2026-04-10T14:09:58.131Z" },
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