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.
Files changed (299) hide show
  1. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/CHANGELOG.md +12 -0
  2. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/PKG-INFO +6 -6
  3. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/THREAT_MODEL.md +2 -1
  4. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_version.py +3 -1
  5. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/app.py +38 -88
  6. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/integrations/sandbox_factory.py +1 -1
  7. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/local_context.py +1 -0
  8. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/remote_client.py +18 -2
  9. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/skills/load.py +5 -1
  10. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/pyproject.toml +6 -6
  11. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/test_compact_resume.py +14 -35
  12. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/skills/test_load.py +34 -0
  13. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_app.py +128 -36
  14. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_offload.py +16 -24
  15. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_offload_dict_messages.py +3 -4
  16. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/uv.lock +127 -52
  17. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/.gitignore +0 -0
  18. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/DEV.md +0 -0
  19. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/Makefile +0 -0
  20. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/README.md +0 -0
  21. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/__init__.py +0 -0
  22. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/__main__.py +0 -0
  23. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_ask_user_types.py +0 -0
  24. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_cli_context.py +0 -0
  25. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_constants.py +0 -0
  26. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_debug.py +0 -0
  27. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_env_vars.py +0 -0
  28. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_git.py +0 -0
  29. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_server_config.py +0 -0
  30. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_session_stats.py +0 -0
  31. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_testing_models.py +0 -0
  32. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/_textual_patches.py +0 -0
  33. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/agent.py +0 -0
  34. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/app.tcss +0 -0
  35. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/ask_user.py +0 -0
  36. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/auth_store.py +0 -0
  37. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/__init__.py +0 -0
  38. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/remember/SKILL.md +0 -0
  39. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/skill-creator/SKILL.md +0 -0
  40. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  41. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  42. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/clipboard.py +0 -0
  43. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/command_registry.py +0 -0
  44. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/config.py +0 -0
  45. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/configurable_model.py +0 -0
  46. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/default_agent_prompt.md +0 -0
  47. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/__init__.py +0 -0
  48. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/bundler.py +0 -0
  49. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/commands.py +0 -0
  50. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/config.py +0 -0
  51. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/context_hub.py +0 -0
  52. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/anonymous-B9UzAXQd.js +0 -0
  53. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/clerk-5xHgyQyG.js +0 -0
  54. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/highlighted-body-OFNGDK62-rX-7qT8o.js +0 -0
  55. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/index-DM3gptpu.js +0 -0
  56. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/index-Ddy7F6KI.css +0 -0
  57. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/assets/supabase-S6NACDgm.js +0 -0
  58. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/index.html +0 -0
  59. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/logo-dark.svg +0 -0
  60. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/frontend_dist/logo-light.svg +0 -0
  61. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/deploy/templates.py +0 -0
  62. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/editor.py +0 -0
  63. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/event_bus.py +0 -0
  64. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/extras_info.py +0 -0
  65. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/file_ops.py +0 -0
  66. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/formatting.py +0 -0
  67. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/hooks.py +0 -0
  68. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/input.py +0 -0
  69. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/integrations/__init__.py +0 -0
  70. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/integrations/sandbox_provider.py +0 -0
  71. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/iterm_cursor_guide.py +0 -0
  72. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/main.py +0 -0
  73. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_auth.py +0 -0
  74. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_commands.py +0 -0
  75. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/__init__.py +0 -0
  76. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/_registry.py +0 -0
  77. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/base.py +0 -0
  78. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/github.py +0 -0
  79. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_providers/slack.py +0 -0
  80. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_tools.py +0 -0
  81. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/mcp_trust.py +0 -0
  82. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/media_utils.py +0 -0
  83. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/model_config.py +0 -0
  84. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/non_interactive.py +0 -0
  85. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/notifications.py +0 -0
  86. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/offload.py +0 -0
  87. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/onboarding.py +0 -0
  88. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/output.py +0 -0
  89. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/project_utils.py +0 -0
  90. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/py.typed +0 -0
  91. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/server.py +0 -0
  92. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/server_graph.py +0 -0
  93. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/server_manager.py +0 -0
  94. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/sessions.py +0 -0
  95. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/skills/__init__.py +0 -0
  96. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/skills/commands.py +0 -0
  97. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/skills/invocation.py +0 -0
  98. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/state_migration.py +0 -0
  99. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/subagents.py +0 -0
  100. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/system_prompt.md +0 -0
  101. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/terminal_capabilities.py +0 -0
  102. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/terminal_escape.py +0 -0
  103. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/textual_adapter.py +0 -0
  104. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/theme.py +0 -0
  105. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/token_state.py +0 -0
  106. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/tool_display.py +0 -0
  107. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/tools.py +0 -0
  108. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/ui.py +0 -0
  109. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/unicode_security.py +0 -0
  110. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/update_check.py +0 -0
  111. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/__init__.py +0 -0
  112. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/_links.py +0 -0
  113. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/agent_selector.py +0 -0
  114. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/approval.py +0 -0
  115. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/ask_user.py +0 -0
  116. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/auth.py +0 -0
  117. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/autocomplete.py +0 -0
  118. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/chat_input.py +0 -0
  119. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/diff.py +0 -0
  120. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/history.py +0 -0
  121. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/launch_init.py +0 -0
  122. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/loading.py +0 -0
  123. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/mcp_viewer.py +0 -0
  124. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/message_store.py +0 -0
  125. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/messages.py +0 -0
  126. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/model_selector.py +0 -0
  127. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/notification_center.py +0 -0
  128. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/notification_detail.py +0 -0
  129. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/notification_settings.py +0 -0
  130. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/status.py +0 -0
  131. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/theme_selector.py +0 -0
  132. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/thread_selector.py +0 -0
  133. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/tool_renderers.py +0 -0
  134. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/tool_widgets.py +0 -0
  135. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/update_available.py +0 -0
  136. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/update_progress.py +0 -0
  137. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/deepagents_cli/widgets/welcome.py +0 -0
  138. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/deploy-content-writer/.env.example +0 -0
  139. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/deploy-content-writer/skills/blog-post/SKILL.md +0 -0
  140. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/deploy-content-writer/skills/social-media/SKILL.md +0 -0
  141. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/deploy-content-writer/user/context.md +0 -0
  142. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/deploy-content-writer/user/preferences.md +0 -0
  143. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/skills/arxiv-search/SKILL.md +0 -0
  144. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  145. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/skills/langgraph-docs/SKILL.md +0 -0
  146. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/skills/skill-creator/SKILL.md +0 -0
  147. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  148. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  149. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/examples/skills/web-research/SKILL.md +0 -0
  150. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/.nvmrc +0 -0
  151. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/index.html +0 -0
  152. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/package-lock.json +0 -0
  153. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/package.json +0 -0
  154. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/postcss.config.js +0 -0
  155. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/public/logo-dark.svg +0 -0
  156. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/public/logo-light.svg +0 -0
  157. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/App.tsx +0 -0
  158. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/ThemeProvider.tsx +0 -0
  159. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/auth/anonymous.tsx +0 -0
  160. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/auth/clerk.tsx +0 -0
  161. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/auth/loader.tsx +0 -0
  162. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/auth/supabase.tsx +0 -0
  163. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/auth/types.ts +0 -0
  164. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/AppHeader.tsx +0 -0
  165. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/FilePanels.tsx +0 -0
  166. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/MessageList.tsx +0 -0
  167. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/SubagentActivity.tsx +0 -0
  168. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/ThreadPicker.tsx +0 -0
  169. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/TodosPanel.tsx +0 -0
  170. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/ToolCallCard.tsx +0 -0
  171. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/FileToolCard.tsx +0 -0
  172. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/SearchCard.tsx +0 -0
  173. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/ThinkCard.tsx +0 -0
  174. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/TodosCard.tsx +0 -0
  175. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/components/toolcalls/index.ts +0 -0
  176. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/constants.ts +0 -0
  177. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/index.css +0 -0
  178. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/main.tsx +0 -0
  179. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/runtimeConfig.ts +0 -0
  180. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/types.ts +0 -0
  181. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/src/vite-env.d.ts +0 -0
  182. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/tsconfig.json +0 -0
  183. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/frontend/vite.config.ts +0 -0
  184. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/images/cli.png +0 -0
  185. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/scripts/check_imports.py +0 -0
  186. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/scripts/debug_server.sh +0 -0
  187. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/scripts/install.sh +0 -0
  188. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/README.md +0 -0
  189. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/__init__.py +0 -0
  190. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/benchmarks/__init__.py +0 -0
  191. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  192. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  193. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/conftest.py +0 -0
  194. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/test_acp_mode.py +0 -0
  195. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/test_context_hub.py +0 -0
  196. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/test_deploy_hub.py +0 -0
  197. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/test_sandbox_factory.py +0 -0
  198. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/integration_tests/test_sandbox_operations.py +0 -0
  199. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/__init__.py +0 -0
  200. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/conftest.py +0 -0
  201. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/__init__.py +0 -0
  202. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_bundler.py +0 -0
  203. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_commands.py +0 -0
  204. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_config.py +0 -0
  205. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_context_hub.py +0 -0
  206. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_frontend_bundle.py +0 -0
  207. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/deploy/test_frontend_config.py +0 -0
  208. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/skills/__init__.py +0 -0
  209. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/skills/test_commands.py +0 -0
  210. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/skills/test_skills_json.py +0 -0
  211. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_agent.py +0 -0
  212. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_agent_friendly.py +0 -0
  213. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_agent_selector.py +0 -0
  214. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_approval.py +0 -0
  215. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_args.py +0 -0
  216. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_ask_user.py +0 -0
  217. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  218. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_auth_store.py +0 -0
  219. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_auth_widgets.py +0 -0
  220. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_autocomplete.py +0 -0
  221. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_charset.py +0 -0
  222. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_chat_input.py +0 -0
  223. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_clipboard.py +0 -0
  224. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_command_registry.py +0 -0
  225. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_compact_tool.py +0 -0
  226. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_config.py +0 -0
  227. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_configurable_model.py +0 -0
  228. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_debug.py +0 -0
  229. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_editor.py +0 -0
  230. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_end_to_end.py +0 -0
  231. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_env_vars.py +0 -0
  232. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_event_bus.py +0 -0
  233. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_exception_handling.py +0 -0
  234. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_extras_info.py +0 -0
  235. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_file_ops.py +0 -0
  236. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_formatting.py +0 -0
  237. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_git.py +0 -0
  238. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_history.py +0 -0
  239. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_hooks.py +0 -0
  240. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_imports.py +0 -0
  241. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_input_parsing.py +0 -0
  242. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  243. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_launch_init.py +0 -0
  244. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_links.py +0 -0
  245. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_loading.py +0 -0
  246. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_local_context.py +0 -0
  247. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_main.py +0 -0
  248. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_main_acp_mode.py +0 -0
  249. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_main_args.py +0 -0
  250. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_auth.py +0 -0
  251. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_commands.py +0 -0
  252. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_tools.py +0 -0
  253. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_trust.py +0 -0
  254. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_mcp_viewer.py +0 -0
  255. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_media_utils.py +0 -0
  256. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_message_store.py +0 -0
  257. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_messages.py +0 -0
  258. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_model_config.py +0 -0
  259. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_model_selector.py +0 -0
  260. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_model_switch.py +0 -0
  261. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_non_interactive.py +0 -0
  262. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_notification_center.py +0 -0
  263. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_notification_detail.py +0 -0
  264. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_notifications.py +0 -0
  265. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_onboarding.py +0 -0
  266. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_output.py +0 -0
  267. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_reload.py +0 -0
  268. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_remote_client.py +0 -0
  269. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_sandbox_factory.py +0 -0
  270. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_server.py +0 -0
  271. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_server_config.py +0 -0
  272. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_server_graph.py +0 -0
  273. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_server_helpers.py +0 -0
  274. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_server_manager.py +0 -0
  275. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_session_stats.py +0 -0
  276. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_sessions.py +0 -0
  277. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_shell_allow_list.py +0 -0
  278. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_skill_invocation.py +0 -0
  279. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  280. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_state_migration.py +0 -0
  281. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_status.py +0 -0
  282. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_subagents.py +0 -0
  283. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  284. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_terminal_escape.py +0 -0
  285. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_textual_adapter.py +0 -0
  286. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_textual_patches.py +0 -0
  287. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_theme.py +0 -0
  288. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_thread_selector.py +0 -0
  289. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_token_tracker.py +0 -0
  290. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_tool_display.py +0 -0
  291. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_ui.py +0 -0
  292. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_unicode_security.py +0 -0
  293. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_update_available.py +0 -0
  294. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_update_check.py +0 -0
  295. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_update_progress.py +0 -0
  296. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_version.py +0 -0
  297. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/test_welcome.py +0 -0
  298. {deepagents_cli-0.0.57 → deepagents_cli-0.0.59}/tests/unit_tests/tools/__init__.py +0 -0
  299. {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.57
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.5.9
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.2.17
37
- Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.0.3
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-prebuilt<2.0.0,>=1.0.13
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.1.10
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
- __version__ = "0.0.57" # 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
@@ -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`, checkpointer fallback).
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
- 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
@@ -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, with remote checkpointer fallback.
5852
+ """Fetch thread state values for a thread.
5839
5853
 
5840
- In server mode the LangGraph dev server can report an empty thread state
5841
- after a restart even when checkpoints exist on disk. When that happens,
5842
- read the latest checkpoint directly so resumed threads can still load
5843
- history and offload correctly.
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
- state = await self._agent.aget_state(config)
5872
+ remote_config: dict[str, Any] = {"configurable": {"thread_id": thread_id}}
5857
5873
 
5858
- values: dict[str, Any] = {}
5859
- if state and state.values:
5860
- values = dict(state.values)
5874
+ if remote := self._remote_agent():
5875
+ await remote.aensure_thread(remote_config)
5861
5876
 
5862
- messages = values.get("messages")
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
- logger.debug(
5869
- "Remote state empty for thread %s; falling back to local checkpointer",
5870
- thread_id,
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
- # Server mode / direct checkpointer may return dicts; convert to
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,
@@ -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, unused-ignore-comment]
713
+ import boto3 # ty: ignore[unresolved-import]
714
714
 
715
715
  session = boto3.Session()
716
716
  credentials = session.get_credentials()
@@ -104,6 +104,7 @@ class _AsyncExecutableBackend(Protocol):
104
104
 
105
105
  logger = logging.getLogger(__name__)
106
106
 
107
+
107
108
  # ---------------------------------------------------------------------------
108
109
  # Context detection script
109
110
  #
@@ -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 (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.57"
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.5.9",
30
- "langchain>=1.2.17,<2.0.0",
31
- "langgraph>=1.1.10,<2.0.0",
32
- "langgraph-checkpoint-sqlite>=3.0.3,<4.0.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
@@ -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
- """Compacts a resumed thread after restart using SQLite-backed history.
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
- `/compact` succeeds even when the resumed history comes from the
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, thread_exists
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 and empty
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
- # `/compact` posts a success message after the async state write
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
- "Conversation compacted." in str(widget._content)
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 compact" not in "\n".join(app_messages)
199
- assert any("Conversation compacted." in content for content in app_messages)
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 checkpointed so subsequent turns
203
- # see compacted context instead of the full message history.
204
- channel_values = await DeepAgentsApp._read_channel_values_from_checkpointer(
205
- thread_id
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 "Compacted at" in archive_text
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."""