deepagents-cli 0.0.57__tar.gz → 0.0.58__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.58}/CHANGELOG.md +6 -0
  2. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/PKG-INFO +6 -6
  3. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/THREAT_MODEL.md +2 -1
  4. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_version.py +1 -1
  5. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/app.py +16 -83
  6. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/integrations/sandbox_factory.py +1 -1
  7. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/local_context.py +1 -0
  8. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/remote_client.py +18 -2
  9. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/pyproject.toml +6 -6
  10. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/test_compact_resume.py +14 -35
  11. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_app.py +29 -36
  12. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_offload.py +16 -24
  13. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_offload_dict_messages.py +3 -4
  14. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/uv.lock +127 -52
  15. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/.gitignore +0 -0
  16. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/DEV.md +0 -0
  17. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/Makefile +0 -0
  18. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/README.md +0 -0
  19. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/__init__.py +0 -0
  20. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/__main__.py +0 -0
  21. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_ask_user_types.py +0 -0
  22. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_cli_context.py +0 -0
  23. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_constants.py +0 -0
  24. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_debug.py +0 -0
  25. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_env_vars.py +0 -0
  26. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_git.py +0 -0
  27. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_server_config.py +0 -0
  28. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_session_stats.py +0 -0
  29. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_testing_models.py +0 -0
  30. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_textual_patches.py +0 -0
  31. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/agent.py +0 -0
  32. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/app.tcss +0 -0
  33. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/ask_user.py +0 -0
  34. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/auth_store.py +0 -0
  35. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/built_in_skills/__init__.py +0 -0
  36. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/built_in_skills/remember/SKILL.md +0 -0
  37. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/built_in_skills/skill-creator/SKILL.md +0 -0
  38. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  39. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  40. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/clipboard.py +0 -0
  41. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/command_registry.py +0 -0
  42. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/config.py +0 -0
  43. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/configurable_model.py +0 -0
  44. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/default_agent_prompt.md +0 -0
  45. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/__init__.py +0 -0
  46. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/bundler.py +0 -0
  47. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/commands.py +0 -0
  48. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/config.py +0 -0
  49. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/context_hub.py +0 -0
  50. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/assets/anonymous-B9UzAXQd.js +0 -0
  51. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/assets/clerk-5xHgyQyG.js +0 -0
  52. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/assets/highlighted-body-OFNGDK62-rX-7qT8o.js +0 -0
  53. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/assets/index-DM3gptpu.js +0 -0
  54. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/assets/index-Ddy7F6KI.css +0 -0
  55. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/assets/supabase-S6NACDgm.js +0 -0
  56. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/index.html +0 -0
  57. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/logo-dark.svg +0 -0
  58. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/logo-light.svg +0 -0
  59. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/templates.py +0 -0
  60. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/editor.py +0 -0
  61. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/event_bus.py +0 -0
  62. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/extras_info.py +0 -0
  63. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/file_ops.py +0 -0
  64. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/formatting.py +0 -0
  65. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/hooks.py +0 -0
  66. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/input.py +0 -0
  67. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/integrations/__init__.py +0 -0
  68. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/integrations/sandbox_provider.py +0 -0
  69. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/iterm_cursor_guide.py +0 -0
  70. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/main.py +0 -0
  71. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_auth.py +0 -0
  72. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_commands.py +0 -0
  73. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_providers/__init__.py +0 -0
  74. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_providers/_registry.py +0 -0
  75. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_providers/base.py +0 -0
  76. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_providers/github.py +0 -0
  77. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_providers/slack.py +0 -0
  78. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_tools.py +0 -0
  79. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_trust.py +0 -0
  80. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/media_utils.py +0 -0
  81. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/model_config.py +0 -0
  82. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/non_interactive.py +0 -0
  83. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/notifications.py +0 -0
  84. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/offload.py +0 -0
  85. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/onboarding.py +0 -0
  86. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/output.py +0 -0
  87. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/project_utils.py +0 -0
  88. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/py.typed +0 -0
  89. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/server.py +0 -0
  90. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/server_graph.py +0 -0
  91. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/server_manager.py +0 -0
  92. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/sessions.py +0 -0
  93. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/skills/__init__.py +0 -0
  94. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/skills/commands.py +0 -0
  95. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/skills/invocation.py +0 -0
  96. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/skills/load.py +0 -0
  97. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/state_migration.py +0 -0
  98. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/subagents.py +0 -0
  99. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/system_prompt.md +0 -0
  100. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/terminal_capabilities.py +0 -0
  101. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/terminal_escape.py +0 -0
  102. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/textual_adapter.py +0 -0
  103. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/theme.py +0 -0
  104. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/token_state.py +0 -0
  105. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/tool_display.py +0 -0
  106. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/tools.py +0 -0
  107. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/ui.py +0 -0
  108. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/unicode_security.py +0 -0
  109. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/update_check.py +0 -0
  110. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/__init__.py +0 -0
  111. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/_links.py +0 -0
  112. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/agent_selector.py +0 -0
  113. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/approval.py +0 -0
  114. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/ask_user.py +0 -0
  115. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/auth.py +0 -0
  116. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/autocomplete.py +0 -0
  117. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/chat_input.py +0 -0
  118. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/diff.py +0 -0
  119. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/history.py +0 -0
  120. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/launch_init.py +0 -0
  121. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/loading.py +0 -0
  122. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/mcp_viewer.py +0 -0
  123. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/message_store.py +0 -0
  124. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/messages.py +0 -0
  125. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/model_selector.py +0 -0
  126. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/notification_center.py +0 -0
  127. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/notification_detail.py +0 -0
  128. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/notification_settings.py +0 -0
  129. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/status.py +0 -0
  130. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/theme_selector.py +0 -0
  131. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/thread_selector.py +0 -0
  132. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/tool_renderers.py +0 -0
  133. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/tool_widgets.py +0 -0
  134. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/update_available.py +0 -0
  135. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/update_progress.py +0 -0
  136. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/welcome.py +0 -0
  137. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/deploy-content-writer/.env.example +0 -0
  138. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/deploy-content-writer/skills/blog-post/SKILL.md +0 -0
  139. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/deploy-content-writer/skills/social-media/SKILL.md +0 -0
  140. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/deploy-content-writer/user/context.md +0 -0
  141. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/deploy-content-writer/user/preferences.md +0 -0
  142. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/skills/arxiv-search/SKILL.md +0 -0
  143. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  144. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/skills/langgraph-docs/SKILL.md +0 -0
  145. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/skills/skill-creator/SKILL.md +0 -0
  146. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  147. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  148. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/skills/web-research/SKILL.md +0 -0
  149. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/.nvmrc +0 -0
  150. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/index.html +0 -0
  151. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/package-lock.json +0 -0
  152. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/package.json +0 -0
  153. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/postcss.config.js +0 -0
  154. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/public/logo-dark.svg +0 -0
  155. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/public/logo-light.svg +0 -0
  156. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/App.tsx +0 -0
  157. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/ThemeProvider.tsx +0 -0
  158. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/auth/anonymous.tsx +0 -0
  159. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/auth/clerk.tsx +0 -0
  160. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/auth/loader.tsx +0 -0
  161. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/auth/supabase.tsx +0 -0
  162. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/auth/types.ts +0 -0
  163. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/AppHeader.tsx +0 -0
  164. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/FilePanels.tsx +0 -0
  165. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/MessageList.tsx +0 -0
  166. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/SubagentActivity.tsx +0 -0
  167. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/ThreadPicker.tsx +0 -0
  168. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/TodosPanel.tsx +0 -0
  169. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/ToolCallCard.tsx +0 -0
  170. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/toolcalls/FileToolCard.tsx +0 -0
  171. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/toolcalls/SearchCard.tsx +0 -0
  172. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/toolcalls/ThinkCard.tsx +0 -0
  173. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/toolcalls/TodosCard.tsx +0 -0
  174. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/toolcalls/index.ts +0 -0
  175. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/constants.ts +0 -0
  176. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/index.css +0 -0
  177. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/main.tsx +0 -0
  178. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/runtimeConfig.ts +0 -0
  179. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/types.ts +0 -0
  180. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/vite-env.d.ts +0 -0
  181. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/tsconfig.json +0 -0
  182. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/vite.config.ts +0 -0
  183. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/images/cli.png +0 -0
  184. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/scripts/check_imports.py +0 -0
  185. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/scripts/debug_server.sh +0 -0
  186. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/scripts/install.sh +0 -0
  187. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/README.md +0 -0
  188. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/__init__.py +0 -0
  189. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/benchmarks/__init__.py +0 -0
  190. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  191. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  192. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/conftest.py +0 -0
  193. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/test_acp_mode.py +0 -0
  194. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/test_context_hub.py +0 -0
  195. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/test_deploy_hub.py +0 -0
  196. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/test_sandbox_factory.py +0 -0
  197. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/test_sandbox_operations.py +0 -0
  198. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/__init__.py +0 -0
  199. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/conftest.py +0 -0
  200. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/deploy/__init__.py +0 -0
  201. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/deploy/test_bundler.py +0 -0
  202. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/deploy/test_commands.py +0 -0
  203. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/deploy/test_config.py +0 -0
  204. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/deploy/test_context_hub.py +0 -0
  205. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/deploy/test_frontend_bundle.py +0 -0
  206. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/deploy/test_frontend_config.py +0 -0
  207. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/skills/__init__.py +0 -0
  208. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/skills/test_commands.py +0 -0
  209. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/skills/test_load.py +0 -0
  210. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/skills/test_skills_json.py +0 -0
  211. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_agent.py +0 -0
  212. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_agent_friendly.py +0 -0
  213. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_agent_selector.py +0 -0
  214. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_approval.py +0 -0
  215. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_args.py +0 -0
  216. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_ask_user.py +0 -0
  217. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  218. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_auth_store.py +0 -0
  219. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_auth_widgets.py +0 -0
  220. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_autocomplete.py +0 -0
  221. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_charset.py +0 -0
  222. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_chat_input.py +0 -0
  223. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_clipboard.py +0 -0
  224. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_command_registry.py +0 -0
  225. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_compact_tool.py +0 -0
  226. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_config.py +0 -0
  227. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_configurable_model.py +0 -0
  228. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_debug.py +0 -0
  229. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_editor.py +0 -0
  230. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_end_to_end.py +0 -0
  231. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_env_vars.py +0 -0
  232. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_event_bus.py +0 -0
  233. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_exception_handling.py +0 -0
  234. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_extras_info.py +0 -0
  235. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_file_ops.py +0 -0
  236. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_formatting.py +0 -0
  237. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_git.py +0 -0
  238. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_history.py +0 -0
  239. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_hooks.py +0 -0
  240. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_imports.py +0 -0
  241. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_input_parsing.py +0 -0
  242. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  243. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_launch_init.py +0 -0
  244. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_links.py +0 -0
  245. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_loading.py +0 -0
  246. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_local_context.py +0 -0
  247. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_main.py +0 -0
  248. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_main_acp_mode.py +0 -0
  249. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_main_args.py +0 -0
  250. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_mcp_auth.py +0 -0
  251. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_mcp_commands.py +0 -0
  252. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_mcp_tools.py +0 -0
  253. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_mcp_trust.py +0 -0
  254. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_mcp_viewer.py +0 -0
  255. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_media_utils.py +0 -0
  256. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_message_store.py +0 -0
  257. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_messages.py +0 -0
  258. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_model_config.py +0 -0
  259. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_model_selector.py +0 -0
  260. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_model_switch.py +0 -0
  261. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_non_interactive.py +0 -0
  262. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_notification_center.py +0 -0
  263. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_notification_detail.py +0 -0
  264. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_notifications.py +0 -0
  265. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_onboarding.py +0 -0
  266. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_output.py +0 -0
  267. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_reload.py +0 -0
  268. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_remote_client.py +0 -0
  269. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_sandbox_factory.py +0 -0
  270. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_server.py +0 -0
  271. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_server_config.py +0 -0
  272. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_server_graph.py +0 -0
  273. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_server_helpers.py +0 -0
  274. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_server_manager.py +0 -0
  275. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_session_stats.py +0 -0
  276. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_sessions.py +0 -0
  277. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_shell_allow_list.py +0 -0
  278. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_skill_invocation.py +0 -0
  279. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  280. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_state_migration.py +0 -0
  281. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_status.py +0 -0
  282. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_subagents.py +0 -0
  283. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  284. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_terminal_escape.py +0 -0
  285. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_textual_adapter.py +0 -0
  286. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_textual_patches.py +0 -0
  287. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_theme.py +0 -0
  288. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_thread_selector.py +0 -0
  289. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_token_tracker.py +0 -0
  290. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_tool_display.py +0 -0
  291. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_ui.py +0 -0
  292. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_unicode_security.py +0 -0
  293. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_update_available.py +0 -0
  294. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_update_check.py +0 -0
  295. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_update_progress.py +0 -0
  296. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_version.py +0 -0
  297. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_welcome.py +0 -0
  298. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/tools/__init__.py +0 -0
  299. {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/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.58](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.57...deepagents-cli==0.0.58) (2026-05-12)
4
+
5
+ ### Features
6
+
7
+ * Pin v0.6 and fix import race ([4db09ac](https://github.com/langchain-ai/deepagents/commit/4db09acba34b38521192b8f278723524be560779))
8
+
3
9
  ## [0.0.57](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.56...deepagents-cli==0.0.57) (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.57
3
+ Version: 0.0.58
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,6 @@
1
1
  """Version information and lightweight constants for `deepagents-cli`."""
2
2
 
3
- __version__ = "0.0.57" # x-release-please-version
3
+ __version__ = "0.0.58" # x-release-please-version
4
4
 
5
5
  DOCS_URL = "https://docs.langchain.com/oss/python/deepagents/cli"
6
6
  """URL for `deepagents-cli` documentation."""
@@ -1591,7 +1591,7 @@ class DeepAgentsApp(App):
1591
1591
  - The agent is a local `Pregel` graph (e.g. ACP mode, test harnesses).
1592
1592
 
1593
1593
  Used to gate features that require a server-backed agent (e.g. model
1594
- switching via `ConfigurableModelMiddleware`, checkpointer fallback).
1594
+ switching via `ConfigurableModelMiddleware`, thread registration).
1595
1595
  Checks the agent type rather than server ownership so this works for
1596
1596
  both CLI-spawned servers and externally managed ones.
1597
1597
 
@@ -5486,9 +5486,6 @@ class DeepAgentsApp(App):
5486
5486
  if result.offload_warning:
5487
5487
  await self._mount_message(ErrorMessage(result.offload_warning))
5488
5488
 
5489
- if remote := self._remote_agent():
5490
- await remote.aensure_thread(config) # ty: ignore[invalid-argument-type]
5491
-
5492
5489
  await self._agent.aupdate_state(
5493
5490
  config, {"_summarization_event": result.new_event}
5494
5491
  )
@@ -5835,12 +5832,14 @@ class DeepAgentsApp(App):
5835
5832
  return result
5836
5833
 
5837
5834
  async def _get_thread_state_values(self, thread_id: str) -> dict[str, Any]:
5838
- """Fetch thread state values, with remote checkpointer fallback.
5835
+ """Fetch thread state values for a thread.
5839
5836
 
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.
5837
+ In server mode the LangGraph dev server starts with an empty in-memory
5838
+ thread store, so `aget_state` returns empty state for any thread that
5839
+ was not registered in the current server session. Calling
5840
+ `aensure_thread` first registers the thread idempotently so the
5841
+ subsequent `aget_state` call can read from the checkpointer correctly,
5842
+ including proper reconstruction of delta channels.
5844
5843
 
5845
5844
  Args:
5846
5845
  thread_id: Thread ID to fetch from checkpoint storage.
@@ -5853,46 +5852,20 @@ class DeepAgentsApp(App):
5853
5852
  return {}
5854
5853
 
5855
5854
  config: RunnableConfig = {"configurable": {"thread_id": thread_id}}
5856
- state = await self._agent.aget_state(config)
5855
+ remote_config: dict[str, Any] = {"configurable": {"thread_id": thread_id}}
5857
5856
 
5858
- values: dict[str, Any] = {}
5859
- if state and state.values:
5860
- values = dict(state.values)
5857
+ if remote := self._remote_agent():
5858
+ await remote.aensure_thread(remote_config)
5861
5859
 
5862
- messages = values.get("messages")
5863
- if isinstance(messages, list) and messages:
5864
- return values
5865
- if not self._remote_agent():
5866
- return values
5860
+ state = await self._agent.aget_state(config)
5867
5861
 
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
5862
+ if state and state.values:
5863
+ return dict(state.values)
5864
+ return {}
5887
5865
 
5888
5866
  async def _fetch_thread_history_data(self, thread_id: str) -> _ThreadHistoryPayload:
5889
5867
  """Fetch and convert stored messages for a thread.
5890
5868
 
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
5869
  Args:
5897
5870
  thread_id: Thread ID to fetch from checkpoint storage.
5898
5871
 
@@ -5910,10 +5883,8 @@ class DeepAgentsApp(App):
5910
5883
  if not messages:
5911
5884
  return _ThreadHistoryPayload([], context_tokens)
5912
5885
 
5913
- # Server mode / direct checkpointer may return dicts; convert to
5886
+ # RemoteGraph.aget_state returns values as raw JSON dicts; convert to
5914
5887
  # LangChain message objects so _convert_messages_to_data works.
5915
- # `any(...)` guards against heterogeneous lists where only some
5916
- # elements are serialized.
5917
5888
  if any(isinstance(m, dict) for m in messages):
5918
5889
  from langchain_core.messages.utils import convert_to_messages
5919
5890
 
@@ -5923,44 +5894,6 @@ class DeepAgentsApp(App):
5923
5894
  data = await asyncio.to_thread(self._convert_messages_to_data, messages)
5924
5895
  return _ThreadHistoryPayload(data, context_tokens)
5925
5896
 
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
5897
  async def _upgrade_thread_message_link(
5965
5898
  self,
5966
5899
  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
@@ -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.58"
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()
@@ -4355,67 +4355,60 @@ class TestFetchThreadHistoryData:
4355
4355
  assert payload.messages[1].type == MessageType.ASSISTANT
4356
4356
  assert payload.messages[1].content == "Hi there!"
4357
4357
 
4358
- async def test_server_mode_falls_back_to_checkpointer(self) -> None:
4359
- """When the server returns empty state, read SQLite checkpointer directly."""
4358
+ async def test_server_mode_ensures_thread_before_fetching_state(self) -> None:
4359
+ """Server-mode history reads should fetch state through the remote server."""
4360
4360
  from langchain_core.messages import AIMessage, HumanMessage
4361
4361
 
4362
4362
  from deepagents_cli.remote_client import RemoteAgent
4363
- from deepagents_cli.widgets.message_store import MessageData, MessageType
4363
+ from deepagents_cli.widgets.message_store import MessageType
4364
4364
 
4365
- # Server returns empty state (fresh restart, thread not loaded)
4366
- empty_state = MagicMock()
4367
- empty_state.values = {}
4365
+ state = MagicMock()
4366
+ state.values = {
4367
+ "messages": [
4368
+ HumanMessage(content="hello", id="h1"),
4369
+ AIMessage(content="world", id="a1"),
4370
+ ]
4371
+ }
4368
4372
 
4369
- # spec=RemoteAgent so _remote_agent() isinstance check passes
4370
4373
  mock_agent = MagicMock(spec=RemoteAgent)
4371
- mock_agent.aget_state = AsyncMock(return_value=empty_state)
4374
+ mock_agent.aensure_thread = AsyncMock()
4375
+ mock_agent.aget_state = AsyncMock(return_value=state)
4372
4376
 
4373
4377
  app = DeepAgentsApp(agent=mock_agent, thread_id="t-1")
4378
+ payload = await app._fetch_thread_history_data("t-1")
4374
4379
 
4375
- # Patch the checkpointer fallback to return messages
4376
- checkpointer_msgs = [
4377
- HumanMessage(content="hello", id="h1"),
4378
- AIMessage(content="world", id="a1"),
4379
- ]
4380
- with patch.object(
4381
- DeepAgentsApp,
4382
- "_read_channel_values_from_checkpointer",
4383
- return_value={"messages": checkpointer_msgs},
4384
- ):
4385
- payload = await app._fetch_thread_history_data("t-1")
4386
-
4380
+ mock_agent.aensure_thread.assert_awaited_once_with(
4381
+ {"configurable": {"thread_id": "t-1"}}
4382
+ )
4387
4383
  assert len(payload.messages) == 2
4388
4384
  assert payload.messages[0].type == MessageType.USER
4389
4385
  assert payload.messages[0].content == "hello"
4390
4386
  assert payload.messages[1].type == MessageType.ASSISTANT
4391
4387
  assert payload.messages[1].content == "world"
4392
4388
 
4393
- async def test_server_mode_fallback_includes_context_tokens(self) -> None:
4394
- """Server-mode fallback should merge `_context_tokens` from the checkpointer."""
4389
+ async def test_server_mode_state_includes_context_tokens(self) -> None:
4390
+ """Server-mode history reads should preserve `_context_tokens` from state."""
4395
4391
  from langchain_core.messages import HumanMessage
4396
4392
 
4397
4393
  from deepagents_cli.remote_client import RemoteAgent
4398
4394
  from deepagents_cli.widgets.message_store import MessageType
4399
4395
 
4400
- empty_state = MagicMock()
4401
- empty_state.values = {}
4396
+ state = MagicMock()
4397
+ state.values = {
4398
+ "messages": [HumanMessage(content="hi", id="h1")],
4399
+ "_context_tokens": 5000,
4400
+ }
4402
4401
 
4403
4402
  mock_agent = MagicMock(spec=RemoteAgent)
4404
- mock_agent.aget_state = AsyncMock(return_value=empty_state)
4403
+ mock_agent.aensure_thread = AsyncMock()
4404
+ mock_agent.aget_state = AsyncMock(return_value=state)
4405
4405
 
4406
4406
  app = DeepAgentsApp(agent=mock_agent, thread_id="t-1")
4407
+ payload = await app._fetch_thread_history_data("t-1")
4407
4408
 
4408
- checkpointer_data = {
4409
- "messages": [HumanMessage(content="hi", id="h1")],
4410
- "_context_tokens": 5000,
4411
- }
4412
- with patch.object(
4413
- DeepAgentsApp,
4414
- "_read_channel_values_from_checkpointer",
4415
- return_value=checkpointer_data,
4416
- ):
4417
- payload = await app._fetch_thread_history_data("t-1")
4418
-
4409
+ mock_agent.aensure_thread.assert_awaited_once_with(
4410
+ {"configurable": {"thread_id": "t-1"}}
4411
+ )
4419
4412
  assert payload.context_tokens == 5000
4420
4413
  assert len(payload.messages) == 1
4421
4414
  assert payload.messages[0].type == MessageType.USER
@@ -906,8 +906,8 @@ class TestOffloadRouting:
906
906
  class TestOffloadRemoteFallback:
907
907
  """Verify `/offload` handles resumed remote threads."""
908
908
 
909
- async def test_resumed_remote_thread_uses_checkpointer_state(self) -> None:
910
- """Should offload using checkpoint fallback when remote state is empty."""
909
+ async def test_resumed_remote_thread_uses_server_state(self) -> None:
910
+ """Should offload using state returned by the remote server."""
911
911
  from deepagents_cli.remote_client import RemoteAgent
912
912
 
913
913
  app = DeepAgentsApp()
@@ -924,11 +924,14 @@ class TestOffloadRemoteFallback:
924
924
  "file_path": None,
925
925
  }
926
926
 
927
- empty_state = MagicMock()
928
- empty_state.values = {}
927
+ state = MagicMock()
928
+ state.values = {
929
+ "messages": messages,
930
+ "_summarization_event": prior_event,
931
+ }
929
932
 
930
933
  app._agent = MagicMock(spec=RemoteAgent)
931
- app._agent.aget_state = AsyncMock(return_value=empty_state)
934
+ app._agent.aget_state = AsyncMock(return_value=state)
932
935
  app._agent.aensure_thread = AsyncMock()
933
936
  app._agent.aupdate_state = AsyncMock()
934
937
  app._backend = MagicMock()
@@ -942,27 +945,14 @@ class TestOffloadRemoteFallback:
942
945
  messages_kept=12,
943
946
  )
944
947
 
945
- with (
946
- patch.object(
947
- DeepAgentsApp,
948
- "_read_channel_values_from_checkpointer",
949
- return_value={
950
- "messages": messages,
951
- "_summarization_event": prior_event,
952
- },
953
- ) as checkpointer_mock,
954
- patch(
955
- _PERFORM_OFFLOAD_PATH,
956
- new_callable=AsyncMock,
957
- return_value=result,
958
- ) as mock_perform,
959
- ):
948
+ with patch(
949
+ _PERFORM_OFFLOAD_PATH,
950
+ new_callable=AsyncMock,
951
+ return_value=result,
952
+ ) as mock_perform:
960
953
  await app._handle_offload()
961
954
  await pilot.pause()
962
955
 
963
- checkpointer_mock.assert_awaited_once_with("test-thread")
964
-
965
- # Verify perform_offload was called with the fallback state
966
956
  kwargs = mock_perform.call_args.kwargs
967
957
  assert kwargs["messages"] == messages
968
958
  assert kwargs["prior_event"] is prior_event
@@ -1070,7 +1060,9 @@ class TestOffloadRemoteStateNormalization:
1070
1060
 
1071
1061
  passed_event = mock_mw._apply_event_to_messages.call_args[0][1]
1072
1062
  assert isinstance(passed_event["summary_message"], BaseMessage)
1073
- app._agent.aensure_thread.assert_not_called()
1063
+ app._agent.aensure_thread.assert_awaited_once_with(
1064
+ {"configurable": {"thread_id": "test-thread"}}
1065
+ )
1074
1066
  app._agent.aupdate_state.assert_not_called()
1075
1067
 
1076
1068
 
@@ -1,7 +1,7 @@
1
1
  """Tests for #2741 fix: `perform_offload()` handles serialized state payloads.
2
2
 
3
- Remote HTTP state snapshots and checkpointer fallbacks may surface messages as
4
- raw dicts rather than `BaseMessage` objects. `perform_offload()` must
3
+ Remote HTTP state snapshots may surface messages as raw dicts rather than
4
+ `BaseMessage` objects. `perform_offload()` must
5
5
  normalize these before passing them to middleware helpers like
6
6
  `get_buffer_string()`.
7
7
  """
@@ -18,8 +18,7 @@ from deepagents_cli.offload import OffloadResult, perform_offload
18
18
  if TYPE_CHECKING:
19
19
  from deepagents.middleware.summarization import SummarizationEvent
20
20
 
21
- # Raw dict messages — what remote state snapshots and checkpoint fallbacks
22
- # may return before deserialization.
21
+ # Raw dict messages — what remote state snapshots may return before deserialization.
23
22
  _DICT_MESSAGES: list[dict[str, Any]] = [
24
23
  {
25
24
  "content": "Hi!",