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.
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/CHANGELOG.md +6 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/PKG-INFO +6 -6
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/THREAT_MODEL.md +2 -1
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_version.py +1 -1
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/app.py +16 -83
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/integrations/sandbox_factory.py +1 -1
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/local_context.py +1 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/remote_client.py +18 -2
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/pyproject.toml +6 -6
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/test_compact_resume.py +14 -35
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_app.py +29 -36
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_offload.py +16 -24
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_offload_dict_messages.py +3 -4
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/uv.lock +127 -52
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/.gitignore +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/DEV.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/Makefile +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/README.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/__main__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_ask_user_types.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_cli_context.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_constants.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_debug.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_env_vars.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_git.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_server_config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_session_stats.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_testing_models.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/_textual_patches.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/agent.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/app.tcss +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/ask_user.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/auth_store.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/built_in_skills/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/clipboard.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/command_registry.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/configurable_model.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/default_agent_prompt.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/bundler.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/commands.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/context_hub.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/assets/anonymous-B9UzAXQd.js +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/assets/clerk-5xHgyQyG.js +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/assets/highlighted-body-OFNGDK62-rX-7qT8o.js +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/assets/index-DM3gptpu.js +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/assets/index-Ddy7F6KI.css +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/assets/supabase-S6NACDgm.js +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/index.html +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/logo-dark.svg +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/frontend_dist/logo-light.svg +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/deploy/templates.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/editor.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/event_bus.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/extras_info.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/file_ops.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/formatting.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/hooks.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/input.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/integrations/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/integrations/sandbox_provider.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/iterm_cursor_guide.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/main.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_auth.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_commands.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_providers/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_providers/_registry.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_providers/base.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_providers/github.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_providers/slack.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_tools.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/mcp_trust.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/media_utils.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/model_config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/non_interactive.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/notifications.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/offload.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/onboarding.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/output.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/project_utils.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/py.typed +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/server.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/server_graph.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/server_manager.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/sessions.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/skills/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/skills/commands.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/skills/invocation.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/skills/load.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/state_migration.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/subagents.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/system_prompt.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/terminal_capabilities.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/terminal_escape.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/textual_adapter.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/theme.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/token_state.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/tool_display.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/tools.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/ui.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/unicode_security.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/update_check.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/_links.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/agent_selector.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/approval.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/ask_user.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/auth.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/autocomplete.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/chat_input.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/diff.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/history.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/launch_init.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/loading.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/mcp_viewer.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/message_store.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/messages.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/model_selector.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/notification_center.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/notification_detail.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/notification_settings.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/status.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/theme_selector.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/thread_selector.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/tool_renderers.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/tool_widgets.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/update_available.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/update_progress.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/widgets/welcome.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/deploy-content-writer/.env.example +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/deploy-content-writer/skills/blog-post/SKILL.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/deploy-content-writer/skills/social-media/SKILL.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/deploy-content-writer/user/context.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/deploy-content-writer/user/preferences.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/.nvmrc +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/index.html +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/package-lock.json +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/package.json +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/postcss.config.js +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/public/logo-dark.svg +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/public/logo-light.svg +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/App.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/ThemeProvider.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/auth/anonymous.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/auth/clerk.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/auth/loader.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/auth/supabase.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/auth/types.ts +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/AppHeader.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/FilePanels.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/MessageList.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/SubagentActivity.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/ThreadPicker.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/TodosPanel.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/ToolCallCard.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/toolcalls/FileToolCard.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/toolcalls/SearchCard.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/toolcalls/ThinkCard.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/toolcalls/TodosCard.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/components/toolcalls/index.ts +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/constants.ts +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/index.css +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/main.tsx +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/runtimeConfig.ts +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/types.ts +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/src/vite-env.d.ts +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/tsconfig.json +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/frontend/vite.config.ts +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/images/cli.png +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/scripts/check_imports.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/scripts/debug_server.sh +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/scripts/install.sh +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/README.md +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/conftest.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/test_context_hub.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/test_deploy_hub.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/conftest.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/deploy/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/deploy/test_bundler.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/deploy/test_commands.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/deploy/test_config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/deploy/test_context_hub.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/deploy/test_frontend_bundle.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/deploy/test_frontend_config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_agent.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_agent_selector.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_approval.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_args.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_ask_user.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_auth_widgets.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_autocomplete.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_chat_input.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_git.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_history.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_launch_init.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_links.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_loading.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_main.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_mcp_commands.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_mcp_trust.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_mcp_viewer.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_message_store.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_messages.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_model_config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_model_selector.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_notification_center.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_notification_detail.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_output.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_server.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_status.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_textual_adapter.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_thread_selector.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_token_tracker.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_update_available.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_update_progress.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_version.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_welcome.py +0 -0
- {deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/tools/__init__.py +0 -0
- {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.
|
|
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.
|
|
30
|
+
Requires-Dist: deepagents==0.6.1
|
|
31
31
|
Requires-Dist: httpx<1.0.0,>=0.28.1
|
|
32
32
|
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.3
|
|
33
33
|
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.2
|
|
34
34
|
Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.2.2
|
|
35
35
|
Requires-Dist: langchain-openai<2.0.0,>=1.2.1
|
|
36
|
-
Requires-Dist: langchain<2.0.0,>=1.
|
|
37
|
-
Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.0
|
|
36
|
+
Requires-Dist: langchain<2.0.0,>=1.3.0
|
|
37
|
+
Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
|
|
38
38
|
Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.24
|
|
39
|
-
Requires-Dist: langgraph-
|
|
39
|
+
Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.28.1
|
|
40
40
|
Requires-Dist: langgraph-sdk<1.0.0,>=0.3.13
|
|
41
|
-
Requires-Dist: langgraph<2.0.0,>=1.
|
|
41
|
+
Requires-Dist: langgraph<2.0.0,>=1.2.0
|
|
42
42
|
Requires-Dist: langsmith[sandbox]>=0.8.0
|
|
43
43
|
Requires-Dist: markdownify<2.0.0,>=0.13.0
|
|
44
44
|
Requires-Dist: packaging>=23.0
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
|
|
58
58
|
### Architecture Diagram
|
|
59
59
|
|
|
60
|
-
```
|
|
60
|
+
```txt
|
|
61
61
|
┌──────────────────────────────────────────────────────────────────────┐
|
|
62
62
|
│ User (local machine) │
|
|
63
63
|
│ │
|
|
@@ -138,6 +138,7 @@
|
|
|
138
138
|
| C17 | Model Config Loader | Resolves model provider, supports `class_path` for arbitrary `BaseChatModel` instantiation via `importlib` | user-controlled | N/A | `config.create_model`, `config._create_model_from_class`, `model_config.ModelConfig.load` |
|
|
139
139
|
|
|
140
140
|
**Notes:**
|
|
141
|
+
|
|
141
142
|
1. `http_request` and `fetch_url` enabled by default; `web_search` requires `TAVILY_API_KEY`.
|
|
142
143
|
2. MCP servers only load if `.mcp.json` config files are present.
|
|
143
144
|
3. Hooks only execute if `~/.deepagents/hooks.json` exists.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Version information and lightweight constants for `deepagents-cli`."""
|
|
2
2
|
|
|
3
|
-
__version__ = "0.0.
|
|
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`,
|
|
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
|
|
5835
|
+
"""Fetch thread state values for a thread.
|
|
5839
5836
|
|
|
5840
|
-
In server mode the LangGraph dev server
|
|
5841
|
-
|
|
5842
|
-
|
|
5843
|
-
|
|
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
|
-
|
|
5855
|
+
remote_config: dict[str, Any] = {"configurable": {"thread_id": thread_id}}
|
|
5857
5856
|
|
|
5858
|
-
|
|
5859
|
-
|
|
5860
|
-
values = dict(state.values)
|
|
5857
|
+
if remote := self._remote_agent():
|
|
5858
|
+
await remote.aensure_thread(remote_config)
|
|
5861
5859
|
|
|
5862
|
-
|
|
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
|
-
|
|
5869
|
-
|
|
5870
|
-
|
|
5871
|
-
)
|
|
5872
|
-
fallback_values = await self._read_channel_values_from_checkpointer(thread_id)
|
|
5873
|
-
fallback_messages = fallback_values.get("messages")
|
|
5874
|
-
if isinstance(fallback_messages, list) and fallback_messages:
|
|
5875
|
-
values["messages"] = fallback_messages
|
|
5876
|
-
if (
|
|
5877
|
-
values.get("_summarization_event") is None
|
|
5878
|
-
and "_summarization_event" in fallback_values
|
|
5879
|
-
):
|
|
5880
|
-
values["_summarization_event"] = fallback_values["_summarization_event"]
|
|
5881
|
-
if (
|
|
5882
|
-
values.get("_context_tokens") is None
|
|
5883
|
-
and "_context_tokens" in fallback_values
|
|
5884
|
-
):
|
|
5885
|
-
values["_context_tokens"] = fallback_values["_context_tokens"]
|
|
5886
|
-
return values
|
|
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
|
-
#
|
|
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,
|
{deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/deepagents_cli/integrations/sandbox_factory.py
RENAMED
|
@@ -710,7 +710,7 @@ class _AgentCoreProvider(SandboxProvider):
|
|
|
710
710
|
|
|
711
711
|
# Validate AWS credentials early for a clear error message.
|
|
712
712
|
try:
|
|
713
|
-
import boto3 # ty: ignore[unresolved-import
|
|
713
|
+
import boto3 # ty: ignore[unresolved-import]
|
|
714
714
|
|
|
715
715
|
session = boto3.Session()
|
|
716
716
|
credentials = session.get_credentials()
|
|
@@ -183,7 +183,8 @@ class RemoteAgent:
|
|
|
183
183
|
) -> Any: # noqa: ANN401
|
|
184
184
|
"""Get the current state of a thread.
|
|
185
185
|
|
|
186
|
-
Returns `None` when the thread does not exist on the server (404)
|
|
186
|
+
Returns `None` when the thread does not exist on the server (404) or
|
|
187
|
+
when the thread exists but has no checkpoint yet (new/empty thread).
|
|
187
188
|
All other errors (network, auth, 500) are logged at WARNING and
|
|
188
189
|
re-raised so callers can handle them.
|
|
189
190
|
|
|
@@ -196,10 +197,11 @@ class RemoteAgent:
|
|
|
196
197
|
|
|
197
198
|
Returns:
|
|
198
199
|
Thread state object with `values` and `next` attributes, or `None`
|
|
199
|
-
if the thread is not found.
|
|
200
|
+
if the thread is not found or has no checkpoint.
|
|
200
201
|
|
|
201
202
|
Raises:
|
|
202
203
|
ValueError: If `thread_id` is not present in `config`.
|
|
204
|
+
TypeError: If the server returns an unexpected state shape.
|
|
203
205
|
""" # noqa: DOC502 — raised by _require_thread_id
|
|
204
206
|
from langgraph_sdk.errors import NotFoundError
|
|
205
207
|
|
|
@@ -211,6 +213,20 @@ class RemoteAgent:
|
|
|
211
213
|
except NotFoundError:
|
|
212
214
|
logger.debug("Thread %s not found on server", thread_id)
|
|
213
215
|
return None
|
|
216
|
+
except TypeError as e:
|
|
217
|
+
# langgraph SDK bug: _create_state_snapshot does
|
|
218
|
+
# state["checkpoint"]["thread_id"], but the server returns
|
|
219
|
+
# checkpoint=null for threads with no checkpoint yet (new threads,
|
|
220
|
+
# or threads registered via aensure_thread before any run).
|
|
221
|
+
if "subscriptable" in str(e).lower():
|
|
222
|
+
logger.debug(
|
|
223
|
+
"Thread %s has no checkpoint yet; treating as empty", thread_id
|
|
224
|
+
)
|
|
225
|
+
return None
|
|
226
|
+
logger.warning(
|
|
227
|
+
"Failed to get state for thread %s", thread_id, exc_info=True
|
|
228
|
+
)
|
|
229
|
+
raise
|
|
214
230
|
except Exception:
|
|
215
231
|
logger.warning(
|
|
216
232
|
"Failed to get state for thread %s", thread_id, exc_info=True
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "deepagents-cli"
|
|
7
|
-
version = "0.0.
|
|
7
|
+
version = "0.0.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.
|
|
30
|
-
"langchain>=1.
|
|
31
|
-
"langgraph>=1.
|
|
32
|
-
"langgraph-checkpoint-sqlite>=3.0
|
|
33
|
-
"langgraph-prebuilt>=1.0.13,<2.0.0",
|
|
29
|
+
"deepagents==0.6.1",
|
|
30
|
+
"langchain>=1.3.0,<2.0.0",
|
|
31
|
+
"langgraph>=1.2.0,<2.0.0",
|
|
32
|
+
"langgraph-checkpoint-sqlite>=3.1.0,<4.0.0",
|
|
34
33
|
|
|
35
34
|
# Client-server architecture
|
|
36
35
|
"langgraph-sdk>=0.3.13,<1.0.0",
|
|
37
36
|
"langgraph-cli[inmem]>=0.4.24,<1.0.0",
|
|
37
|
+
"langgraph-runtime-inmem>=0.28.1,<1.0.0",
|
|
38
38
|
"httpx>=0.28.1,<1.0.0",
|
|
39
39
|
|
|
40
40
|
# Core model providers - others are added as optional
|
{deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/integration_tests/test_compact_resume.py
RENAMED
|
@@ -2,9 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from types import SimpleNamespace
|
|
6
5
|
from typing import TYPE_CHECKING
|
|
7
|
-
from unittest.mock import AsyncMock
|
|
8
6
|
|
|
9
7
|
import pytest
|
|
10
8
|
|
|
@@ -62,12 +60,11 @@ def _event_field(event: object, key: str) -> object | None:
|
|
|
62
60
|
async def test_compact_resumed_thread_uses_persisted_history(
|
|
63
61
|
tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
64
62
|
) -> None:
|
|
65
|
-
"""
|
|
63
|
+
"""Offloads a resumed thread after restart using remote server state.
|
|
66
64
|
|
|
67
65
|
The test seeds a real persisted thread on one server instance, restarts the
|
|
68
66
|
server, resumes that thread in a fresh `DeepAgentsApp`, and verifies that
|
|
69
|
-
`/
|
|
70
|
-
checkpointer rather than live in-memory server state.
|
|
67
|
+
`/offload` succeeds after the app registers the thread with the server.
|
|
71
68
|
"""
|
|
72
69
|
home_dir = tmp_path / "home"
|
|
73
70
|
project_dir = tmp_path / "project"
|
|
@@ -92,7 +89,7 @@ async def test_compact_resumed_thread_uses_persisted_history(
|
|
|
92
89
|
from deepagents_cli.app import DeepAgentsApp
|
|
93
90
|
from deepagents_cli.config import create_model
|
|
94
91
|
from deepagents_cli.server_manager import server_session
|
|
95
|
-
from deepagents_cli.sessions import generate_thread_id
|
|
92
|
+
from deepagents_cli.sessions import generate_thread_id
|
|
96
93
|
from deepagents_cli.widgets.messages import AppMessage, ErrorMessage
|
|
97
94
|
|
|
98
95
|
config_path = home_dir / ".deepagents" / "config.toml"
|
|
@@ -124,15 +121,12 @@ async def test_compact_resumed_thread_uses_persisted_history(
|
|
|
124
121
|
prompt=_build_long_prompt(turn),
|
|
125
122
|
)
|
|
126
123
|
|
|
127
|
-
assert await thread_exists(thread_id)
|
|
128
|
-
|
|
129
124
|
compact_backend = CompositeBackend(
|
|
130
125
|
default=FilesystemBackend(root_dir=backend_root, virtual_mode=True),
|
|
131
126
|
routes={},
|
|
132
127
|
)
|
|
133
128
|
|
|
134
|
-
# Server 2: same SQLite DB, but a fresh server process
|
|
135
|
-
# in-memory thread registry.
|
|
129
|
+
# Server 2: same SQLite DB, but a fresh server process.
|
|
136
130
|
async with server_session(
|
|
137
131
|
assistant_id=assistant_id,
|
|
138
132
|
model_name="itest:fake",
|
|
@@ -142,15 +136,6 @@ async def test_compact_resumed_thread_uses_persisted_history(
|
|
|
142
136
|
sandbox_type="none",
|
|
143
137
|
) as (agent, _server_proc):
|
|
144
138
|
config = {"configurable": {"thread_id": thread_id}}
|
|
145
|
-
actual_state = await agent.aget_state(config)
|
|
146
|
-
actual_values = getattr(actual_state, "values", None) or {}
|
|
147
|
-
|
|
148
|
-
# Fresh dev servers may return empty state for persisted threads
|
|
149
|
-
# after restart. If that behavior changes upstream, force the
|
|
150
|
-
# empty-state precondition so this test still covers the SQLite
|
|
151
|
-
# fallback path.
|
|
152
|
-
if actual_values:
|
|
153
|
-
agent.aget_state = AsyncMock(return_value=SimpleNamespace(values={})) # ty: ignore[invalid-assignment]
|
|
154
139
|
|
|
155
140
|
app = DeepAgentsApp(
|
|
156
141
|
agent=agent, # ty: ignore[invalid-argument-type]
|
|
@@ -170,20 +155,15 @@ async def test_compact_resumed_thread_uses_persisted_history(
|
|
|
170
155
|
break
|
|
171
156
|
|
|
172
157
|
assert app._message_store.total_count > 0
|
|
173
|
-
resume_messages = app.query(AppMessage)
|
|
174
|
-
assert any(
|
|
175
|
-
"Resumed thread:" in str(widget._content)
|
|
176
|
-
for widget in resume_messages
|
|
177
|
-
)
|
|
178
158
|
|
|
179
159
|
await app._handle_offload()
|
|
180
160
|
|
|
181
|
-
# `/
|
|
161
|
+
# `/offload` posts a success message after the async state write
|
|
182
162
|
# and archive offload finish.
|
|
183
163
|
for _ in range(120):
|
|
184
164
|
await pilot.pause(0.1)
|
|
185
165
|
if any(
|
|
186
|
-
"
|
|
166
|
+
"Offloaded " in str(widget._content)
|
|
187
167
|
for widget in app.query(AppMessage)
|
|
188
168
|
):
|
|
189
169
|
break
|
|
@@ -195,16 +175,15 @@ async def test_compact_resumed_thread_uses_persisted_history(
|
|
|
195
175
|
str(widget._content) for widget in app.query(ErrorMessage)
|
|
196
176
|
]
|
|
197
177
|
|
|
198
|
-
assert "Nothing to
|
|
199
|
-
assert any("
|
|
178
|
+
assert "Nothing to offload" not in "\n".join(app_messages)
|
|
179
|
+
assert any("Offloaded " in content for content in app_messages)
|
|
200
180
|
assert not error_messages
|
|
201
181
|
|
|
202
|
-
# The summarization event must be
|
|
203
|
-
# see compacted context instead of
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
)
|
|
207
|
-
summarization_event = channel_values.get("_summarization_event")
|
|
182
|
+
# The summarization event must be visible through server state so
|
|
183
|
+
# subsequent turns see compacted context instead of full history.
|
|
184
|
+
state = await agent.aget_state(config)
|
|
185
|
+
values = getattr(state, "values", None) or {}
|
|
186
|
+
summarization_event = values.get("_summarization_event")
|
|
208
187
|
assert summarization_event is not None
|
|
209
188
|
cutoff = _event_field(summarization_event, "cutoff_index")
|
|
210
189
|
assert isinstance(cutoff, int)
|
|
@@ -219,7 +198,7 @@ async def test_compact_resumed_thread_uses_persisted_history(
|
|
|
219
198
|
archive_path = backend_root / "conversation_history" / f"{thread_id}.md"
|
|
220
199
|
assert archive_path.exists()
|
|
221
200
|
archive_text = archive_path.read_text()
|
|
222
|
-
assert "
|
|
201
|
+
assert "Offloaded at" in archive_text
|
|
223
202
|
assert "keeps enough unique detail" in archive_text
|
|
224
203
|
finally:
|
|
225
204
|
model_config.clear_caches()
|
|
@@ -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
|
|
4359
|
-
"""
|
|
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
|
|
4363
|
+
from deepagents_cli.widgets.message_store import MessageType
|
|
4364
4364
|
|
|
4365
|
-
|
|
4366
|
-
|
|
4367
|
-
|
|
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.
|
|
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
|
-
|
|
4376
|
-
|
|
4377
|
-
|
|
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
|
|
4394
|
-
"""Server-mode
|
|
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
|
-
|
|
4401
|
-
|
|
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.
|
|
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
|
-
|
|
4409
|
-
"
|
|
4410
|
-
|
|
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
|
|
910
|
-
"""Should offload using
|
|
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
|
-
|
|
928
|
-
|
|
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=
|
|
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
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
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.
|
|
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
|
|
{deepagents_cli-0.0.57 → deepagents_cli-0.0.58}/tests/unit_tests/test_offload_dict_messages.py
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Tests for #2741 fix: `perform_offload()` handles serialized state payloads.
|
|
2
2
|
|
|
3
|
-
Remote HTTP state snapshots
|
|
4
|
-
|
|
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
|
|
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!",
|