deepagents-code 0.1.52__tar.gz → 0.1.53__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_code-0.1.52 → deepagents_code-0.1.53}/.gitignore +3 -1
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/ARCHITECTURE.md +2 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/CHANGELOG.md +18 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/HOOKS.md +3 -2
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/PKG-INFO +5 -5
- deepagents_code-0.1.53/PRICING.md +105 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_ask_user_types.py +5 -3
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_build_info.py +1 -1
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/app.py +198 -38
- deepagents_code-0.1.53/deepagents_code/bundled_prices.README.md +80 -0
- deepagents_code-0.1.53/deepagents_code/bundled_prices.json +21 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/command_registry.py +20 -2
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/config.py +173 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/config_manifest.py +16 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/cost_tracking.py +690 -3
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/capabilities.py +16 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/models/domain.py +21 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/models/wire.py +21 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/projection.py +22 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/reducer.py +19 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/server_middleware.py +62 -21
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/snapshot.py +6 -1
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/main.py +180 -36
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/offload_middleware.py +4 -2
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/sessions.py +86 -21
- deepagents_code-0.1.53/deepagents_code/tui/modals/resume_compact.py +121 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/textual_adapter.py +24 -4
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/update_check.py +141 -22
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/pyproject.toml +18 -5
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/scripts/install.sh +698 -73
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/conftest.py +33 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_engine.py +40 -3
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_server_lifecycle.py +29 -10
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_app.py +214 -14
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_coding_agent_metadata.py +22 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_command_registry.py +16 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_compact_tool.py +3 -8
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_config.py +322 -1
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_cost_tracking.py +1029 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_end_to_end.py +0 -1
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_install_script.py +1048 -37
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_main.py +325 -25
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_sessions.py +111 -1
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_threads_resume.py +6 -2
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_update_check.py +155 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/test_textual_adapter.py +229 -4
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/uv.lock +7 -7
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/AGENTS.md +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/COMMANDS.md +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/DEVELOPMENT.md +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/LICENSE +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/Makefile +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/README.md +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/THREAT_MODEL.md +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_debug_buffer.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_env_vars.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_fake_models.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_invocation.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_markdown.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_paths.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_repository_bounds.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_server_config.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_tool_stream.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/agent.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/approval_mode.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/auto_mode.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/commands/auth.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/commands/config.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/commands/extras.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/commands/mcp.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/commands/tools.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/launch/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/launch/server.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/launch/server_manager.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/non_interactive.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/remote_client.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/configurable_model.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/doctor.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/extras_info.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/goal_rubric.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/goal_state_notice.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/goal_tools.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/client.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/client_lifecycle.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/context.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/engine.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/env.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/envelope.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/interrupt.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/legacy.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/loading.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/manager.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/migration.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/models/adapters.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/models/config.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/models/transport.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/permissions.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/presenter.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/runner.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/runtime.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/tools.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/transcript.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/trust.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/integrations/sandbox_factory.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/json_types.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/managed_tools.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_auth.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_config.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_tools.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/model_config.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/offload.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/paste_collapse.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/_json.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/adapters/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/adapters/hooks.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/adapters/mcp.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/adapters/skills.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/commands_cli.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/discovery.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/manifest.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/marketplace.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/models.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/store.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/substitution.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/reasoning_effort.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/reliable_rubric.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/server_graph.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/skills/merge.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/skills/trust.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/system_prompt.md +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tool_catalog.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/screens/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/_links.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/approval.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/ask_user.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/auth.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/chat_input.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/codex_auth.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/debug_console.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/diff.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/effort_selector.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/goal_review.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/goal_status.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/history.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/install_confirm.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/loading.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/message_store.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/messages.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/model_selector.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/plugin_reload.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/skill_trust.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/startup_tip.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/status.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/thread_selector.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/update_available.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/update_confirm.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/welcome.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/ui.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/hatch_build.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/images/tui.png +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/README.md +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/test_auto_approve_remote.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/test_offload_server_side.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/client/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/client/commands/test_auth.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/client/commands/test_extras.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/client/commands/test_mcp.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/client/commands/test_tools.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/models/test_models.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_configuration.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_execution.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_manager.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_presenter.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_transcript.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_trust.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/plugins/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/plugins/test_marketplace.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/plugins/test_store.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/skills/test_merge.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/skills/test_skill_trust.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/smoke_tests/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/smoke_tests/conftest.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test__tool_stream.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_agent.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_approval_mode.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_args.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_ask_user_types.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_auto_mode.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_config_manifest.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_config_recursion_limit.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_cursor_blink.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_cursor_style.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_debug_buffer.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_debug_console.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_doctor.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_goal_criteria_client.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_goal_rubric.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_goal_state_notice.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_goal_state_persistence.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_goal_tools.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_hatch_build.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_install_command.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_invocation.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_json_types.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_managed_tools.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_mcp_config.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_model_config.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_paths.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_reasoning_effort.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_reliable_rubric.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_repository_bounds.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_rubric_cli.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_sandbox_registry.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_server.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_startup_blocking.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_tool_catalog.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_tracing_replicas.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_transcript_virtualization.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_history.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_links.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_plugin_reload.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_status.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
- {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
|
@@ -241,8 +241,10 @@ __marimo__/
|
|
|
241
241
|
#claude
|
|
242
242
|
.claude
|
|
243
243
|
|
|
244
|
-
# Harbor local job output
|
|
244
|
+
# Harbor local job output. `harbor-jobs/` is the per-suite variant the eval Makefile and
|
|
245
|
+
# the CI workflow write to (`harbor-jobs/<category>`).
|
|
245
246
|
jobs/
|
|
247
|
+
harbor-jobs/
|
|
246
248
|
|
|
247
249
|
.idea
|
|
248
250
|
TEXTUAL_REFACTOR_PLAN.md
|
|
@@ -67,5 +67,7 @@ The main cost is the client/server boundary. When debugging, first decide which
|
|
|
67
67
|
- For local setup and debugging, see [`DEVELOPMENT.md`](./DEVELOPMENT.md).
|
|
68
68
|
- For command behavior, see [`COMMANDS.md`](./COMMANDS.md).
|
|
69
69
|
- For lifecycle hooks (`hooks.json`), see [`HOOKS.md`](./HOOKS.md).
|
|
70
|
+
- For cost estimates and local pricing overrides (`prices.json`), see
|
|
71
|
+
[`PRICING.md`](./PRICING.md).
|
|
70
72
|
- For security boundaries, see [`THREAT_MODEL.md`](./THREAT_MODEL.md).
|
|
71
73
|
- For package-specific coding conventions, see [`AGENTS.md`](./AGENTS.md).
|
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.1.53](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.52...deepagents-code==0.1.53) (2026-08-06)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- Added pricing coverage with Baseten built-in overrides and local fallback overrides when `genai-prices` is missing data ([#5312](https://github.com/langchain-ai/deepagents/issues/5312), [#5304](https://github.com/langchain-ai/deepagents/issues/5304)).
|
|
10
|
+
- Suggest compacting large resumed threads ([#5318](https://github.com/langchain-ai/deepagents/issues/5318)).
|
|
11
|
+
- Added terminal program trace metadata ([#5329](https://github.com/langchain-ai/deepagents/issues/5329)).
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
- Preserved runtime offload archive routing ([#5328](https://github.com/langchain-ai/deepagents/issues/5328)).
|
|
16
|
+
- Always restart after a successful startup auto-update ([#5317](https://github.com/langchain-ai/deepagents/issues/5317)).
|
|
17
|
+
- Fixed leaked turn coroutines and SQLite handles ([#5218](https://github.com/langchain-ai/deepagents/issues/5218)).
|
|
18
|
+
- Keep MCP shutdown-race tracebacks from appearing in the terminal ([#5325](https://github.com/langchain-ai/deepagents/issues/5325)).
|
|
19
|
+
- Open the `/auto model` selector immediately while connecting ([#5341](https://github.com/langchain-ai/deepagents/issues/5341)).
|
|
20
|
+
- Route failures to `PostToolUseFailure` ([#5315](https://github.com/langchain-ai/deepagents/issues/5315)).
|
|
21
|
+
- Use dismissed copy for ask-user prompts ([#5331](https://github.com/langchain-ai/deepagents/issues/5331)).
|
|
22
|
+
|
|
5
23
|
## [0.1.52](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.51...deepagents-code==0.1.52) (2026-08-04)
|
|
6
24
|
|
|
7
25
|
### Features
|
|
@@ -54,7 +54,8 @@ Native tools are matched by their wire names (for example `execute` → `Bash`,
|
|
|
54
54
|
| `PermissionRequest` | client | `tool_name` | The client is about to ask for tool permission |
|
|
55
55
|
| `Notification` | client | `notification_type` | A client lifecycle notification is emitted |
|
|
56
56
|
| `PreToolUse` | server | `tool_name` | Before a tool call runs |
|
|
57
|
-
| `PostToolUse` | server | `tool_name` | After a tool call
|
|
57
|
+
| `PostToolUse` | server | `tool_name` | After a tool call succeeds |
|
|
58
|
+
| `PostToolUseFailure` | server | `tool_name` | After a tool call fails |
|
|
58
59
|
| `PreCompact` | server | `trigger` | Before conversation compaction |
|
|
59
60
|
| `Stop` | server | _(none)_ | After an agent stop turn |
|
|
60
61
|
| `SubagentStart` | server | `agent_name` | When a subagent starts |
|
|
@@ -127,7 +128,7 @@ Matchers use wire tool names. `execute` is exposed as `Bash`. Exit code `2` (or
|
|
|
127
128
|
|
|
128
129
|
Handlers communicate through:
|
|
129
130
|
|
|
130
|
-
- **Exit code `2`**: treated as a synthetic `decision: "block"`. Interpretation depends on the event (for example deny on `PreToolUse` / `PermissionRequest`, block further processing on `UserPromptSubmit` / `PreCompact`, feedback on `PostToolUse`).
|
|
131
|
+
- **Exit code `2`**: treated as a synthetic `decision: "block"`. Interpretation depends on the event (for example deny on `PreToolUse` / `PermissionRequest`, block further processing on `UserPromptSubmit` / `PreCompact`, feedback on `PostToolUse` / `PostToolUseFailure`).
|
|
131
132
|
- **Other non-zero exits**: recorded as diagnostics; they do not apply a block decision.
|
|
132
133
|
- **JSON stdout** (`HookWireOutput`): may set `continue` / `stopReason`, `systemMessage` (user-visible notice), `additionalContext` via `hookSpecificOutput`, and event-specific fields such as `permissionDecision` on `PreToolUse`.
|
|
133
134
|
- **Non-JSON stdout**: becomes additional context for events whose plain-output policy is context (`SessionStart`, `UserPromptSubmit`); otherwise it is a diagnostic.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.53
|
|
4
4
|
Summary: Terminal coding agent built on the Deep Agents SDK - works with any model, with persistent memory, customizable skills, subagents, and approval controls.
|
|
5
5
|
Project-URL: Homepage, https://docs.langchain.com/oss/python/deepagents/overview
|
|
6
6
|
Project-URL: Documentation, https://reference.langchain.com/python/deepagents/
|
|
@@ -29,11 +29,11 @@ Requires-Python: <4.0,>=3.11
|
|
|
29
29
|
Requires-Dist: aiosqlite<1.0.0,>=0.22.1
|
|
30
30
|
Requires-Dist: anyio<5.0.0,>=4.14.2
|
|
31
31
|
Requires-Dist: deepagents-acp<1.0.0,>=0.0.9
|
|
32
|
-
Requires-Dist: deepagents==0.7.
|
|
32
|
+
Requires-Dist: deepagents==0.7.4
|
|
33
33
|
Requires-Dist: filelock<3.30,>=3.29.7
|
|
34
34
|
Requires-Dist: genai-prices<0.2.0,>=0.1.1
|
|
35
35
|
Requires-Dist: httpx<1.0.0,>=0.28.1
|
|
36
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.
|
|
36
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.4
|
|
37
37
|
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.2
|
|
38
38
|
Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.0
|
|
39
39
|
Requires-Dist: langchain-openai<2.0.0,>=1.4.1
|
|
@@ -65,7 +65,7 @@ Provides-Extra: agentcore
|
|
|
65
65
|
Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.5; extra == 'agentcore'
|
|
66
66
|
Provides-Extra: all-providers
|
|
67
67
|
Requires-Dist: aiohttp<3.15.0,>=3.14.3; extra == 'all-providers'
|
|
68
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.
|
|
68
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.4; extra == 'all-providers'
|
|
69
69
|
Requires-Dist: langchain-aws<2.0.0,>=1.6.3; extra == 'all-providers'
|
|
70
70
|
Requires-Dist: langchain-baseten<1.0.0,>=0.2.3; extra == 'all-providers'
|
|
71
71
|
Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
|
|
@@ -93,7 +93,7 @@ Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
|
|
|
93
93
|
Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
|
|
94
94
|
Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
|
|
95
95
|
Provides-Extra: anthropic
|
|
96
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.
|
|
96
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.4; extra == 'anthropic'
|
|
97
97
|
Provides-Extra: baseten
|
|
98
98
|
Requires-Dist: langchain-baseten<1.0.0,>=0.2.3; extra == 'baseten'
|
|
99
99
|
Provides-Extra: bedrock
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Cost estimates and local pricing overrides
|
|
2
|
+
|
|
3
|
+
`/cost` reports an estimate for the current thread. Rates come from
|
|
4
|
+
[genai-prices](https://github.com/pydantic/genai-prices), which ships an offline
|
|
5
|
+
catalog and refreshes it hourly in the background (opt out with
|
|
6
|
+
`DEEPAGENTS_CODE_PRICES_AUTO_UPDATE=0`, or `[update].prices_auto_update = false`
|
|
7
|
+
in `config.toml`).
|
|
8
|
+
|
|
9
|
+
Estimates are display-only. Nothing in dcode caps spend or gates execution on
|
|
10
|
+
them, so a wrong rate costs you an inaccurate number and nothing else.
|
|
11
|
+
|
|
12
|
+
## When a model has no rates
|
|
13
|
+
|
|
14
|
+
A model the catalog does not cover is left out of the total. `/cost` distinguishes
|
|
15
|
+
that from a genuinely free request: it reports how many of the recorded requests
|
|
16
|
+
are included in the figure.
|
|
17
|
+
|
|
18
|
+
That happens with a newly released model, a self-hosted or proxied endpoint, or a
|
|
19
|
+
provider name that does not line up with what genai-prices calls it. If you would
|
|
20
|
+
rather see an estimate than a gap, write your own rates to:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
~/.deepagents/prices.json
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The file is read once, on the first request that needs it. **Edits take effect on
|
|
27
|
+
the next dcode start**, not mid-session.
|
|
28
|
+
|
|
29
|
+
## File format
|
|
30
|
+
|
|
31
|
+
`prices.json` uses the same provider-array schema as genai-prices' own
|
|
32
|
+
`prices/new_data/v2/data.json`, so an entry can be contributed upstream as-is.
|
|
33
|
+
It is a JSON array of providers:
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
[
|
|
37
|
+
{
|
|
38
|
+
"id": "my-proxy",
|
|
39
|
+
"name": "My proxy",
|
|
40
|
+
"api_pattern": "gateway\\.example\\.internal",
|
|
41
|
+
"models": [
|
|
42
|
+
{
|
|
43
|
+
"id": "house-model-v2",
|
|
44
|
+
"match": { "equals": "house-model-v2" },
|
|
45
|
+
"prices": { "input_mtok": 2.5, "output_mtok": 10.0 }
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Required, and easy to omit:
|
|
53
|
+
|
|
54
|
+
| Field | Where | Notes |
|
|
55
|
+
| --- | --- | --- |
|
|
56
|
+
| `id` | provider | Must be the provider id dcode reports for the request — see below. |
|
|
57
|
+
| `name` | provider | Any display string. |
|
|
58
|
+
| `api_pattern` | provider | Regex against the API URL. Unused by dcode, but the schema requires it. |
|
|
59
|
+
| `id` | model | Any identifier; used in log messages. |
|
|
60
|
+
| `match` | model | How to recognize the model: `{"equals": ...}`, `{"starts_with": ...}`, `{"contains": ...}`, or `{"regex": ...}`. |
|
|
61
|
+
| `prices` | model | At least one rate. |
|
|
62
|
+
|
|
63
|
+
Rates are per million tokens: `input_mtok`, `output_mtok`, and optionally
|
|
64
|
+
`cache_read_mtok`, `cache_write_mtok`, `output_reasoning_mtok`,
|
|
65
|
+
`input_audio_mtok`. Only list a bucket you have a real rate for — tokens in an
|
|
66
|
+
omitted bucket are billed at the ordinary input or output rate rather than being
|
|
67
|
+
dropped.
|
|
68
|
+
|
|
69
|
+
## Getting the provider id right
|
|
70
|
+
|
|
71
|
+
This is where a hand-written file usually goes wrong. dcode resolves the
|
|
72
|
+
LangChain provider name through its own alias table before looking anything up,
|
|
73
|
+
so the id it searches on is not always the string you would expect.
|
|
74
|
+
|
|
75
|
+
If no provider in your file claims that id, dcode falls back to searching **every**
|
|
76
|
+
provider in the file by model id alone. That keeps your entry reachable, but it
|
|
77
|
+
also means an entry can price a request that ran against a different provider —
|
|
78
|
+
`llama-3.3-70b` costs very different amounts on Bedrock, Together, and Groq. When
|
|
79
|
+
that happens you get a warning naming both providers; pin the entry by using the
|
|
80
|
+
id from the warning.
|
|
81
|
+
|
|
82
|
+
## Diagnosing a file that is not working
|
|
83
|
+
|
|
84
|
+
Everything below is logged to the Debug Console (`Ctrl+\`), each message once per
|
|
85
|
+
session:
|
|
86
|
+
|
|
87
|
+
| What you see | What it means |
|
|
88
|
+
| --- | --- |
|
|
89
|
+
| Nothing at all, cost still missing | The file is not where dcode looks, or is empty. Both are silent by design. |
|
|
90
|
+
| "No pricing override matched model=… though … contributed N model entries" | The file loaded, but nothing matched. The `provider_id` in the message is the post-alias id your entry must use. |
|
|
91
|
+
| "Could not parse … as JSON" / "must be an array of providers" | Syntax or shape problem. The payload must be a bare array, not `{"providers": [...]}`. |
|
|
92
|
+
| "the entries failed validation against the genai-prices provider schema" | A required field is missing or mistyped. |
|
|
93
|
+
| "the request ran against provider …" | Priced by a sweep, possibly from the wrong provider's entry. See above. |
|
|
94
|
+
| "its entry matched but its rates were rejected" | A rate is unusable — negative, or large enough to overflow. |
|
|
95
|
+
|
|
96
|
+
A malformed `prices.json` never breaks a model turn and never disables ordinary
|
|
97
|
+
pricing: the bad source is dropped and everything else still prices.
|
|
98
|
+
|
|
99
|
+
## Built-in stopgaps
|
|
100
|
+
|
|
101
|
+
dcode also ships a small maintainer-curated catalog for models upstream has not
|
|
102
|
+
priced yet. Your file wins over it on a conflicting `(provider id, model id)`
|
|
103
|
+
pair, and both are consulted only when genai-prices itself has no rates. See
|
|
104
|
+
[`deepagents_code/bundled_prices.README.md`](./deepagents_code/bundled_prices.README.md)
|
|
105
|
+
for that policy.
|
|
@@ -195,9 +195,11 @@ ASK_USER_CANCELLED_SUMMARY = "Question cancelled"
|
|
|
195
195
|
Rewording it changes that hook contract. Not rendered on any row: a live cancel
|
|
196
196
|
calls `set_rejected` (which records no output), and a transcript of `(cancelled)`
|
|
197
197
|
placeholders from a non-TUI client is summarized from the recorded status like
|
|
198
|
-
any other, so it reads as `ASK_USER_ANSWERED_SUMMARY`. The
|
|
199
|
-
`textual_adapter`
|
|
200
|
-
|
|
198
|
+
any other, so it reads as `ASK_USER_ANSWERED_SUMMARY`. The dismissal banner in
|
|
199
|
+
`textual_adapter` deliberately does not use this constant, and no longer even
|
|
200
|
+
shares its wording — the banner says "dismissed" where this says "cancelled".
|
|
201
|
+
That divergence is intentional: the banner is user-facing prose free to be
|
|
202
|
+
reworded, this is the hook contract. Do not "de-duplicate" them.
|
|
201
203
|
"""
|
|
202
204
|
|
|
203
205
|
ASK_USER_FAILED_SUMMARY: AskUserRowSummary = "Question failed"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# Keep the `x-release-please-version` annotation — release-please uses it to
|
|
4
4
|
# bump `__version__` in sync with `pyproject.toml` on every release PR.
|
|
5
|
-
__version__ = "0.1.
|
|
5
|
+
__version__ = "0.1.53" # x-release-please-version
|
|
6
6
|
|
|
7
7
|
DOCS_URL = "https://docs.langchain.com/oss/python/deepagents/code"
|
|
8
8
|
"""URL for `deepagents-code` documentation."""
|
|
@@ -354,6 +354,20 @@ def _coerce_provisional_cost_delta_usd(value: object) -> float | None:
|
|
|
354
354
|
return delta_usd
|
|
355
355
|
|
|
356
356
|
|
|
357
|
+
def _persisted_context_tokens(state_values: dict[str, Any]) -> int:
|
|
358
|
+
"""Read a checkpoint's `_context_tokens`, coercing absent or invalid to 0.
|
|
359
|
+
|
|
360
|
+
Args:
|
|
361
|
+
state_values: Thread state values from the checkpoint.
|
|
362
|
+
|
|
363
|
+
Returns:
|
|
364
|
+
The persisted context size, or 0 when it is missing or not a
|
|
365
|
+
non-negative `int`.
|
|
366
|
+
"""
|
|
367
|
+
raw = state_values.get("_context_tokens")
|
|
368
|
+
return raw if isinstance(raw, int) and raw >= 0 else 0
|
|
369
|
+
|
|
370
|
+
|
|
357
371
|
def _warn_discarded_goal_channels(state_values: dict[str, Any]) -> list[str]:
|
|
358
372
|
"""Report persisted goal/rubric channels that are present but malformed.
|
|
359
373
|
|
|
@@ -9337,6 +9351,8 @@ class DeepAgentsApp(App):
|
|
|
9337
9351
|
),
|
|
9338
9352
|
)
|
|
9339
9353
|
return
|
|
9354
|
+
if start_cause is SessionStartCause.RESUME:
|
|
9355
|
+
await self._restore_resumed_context_tokens()
|
|
9340
9356
|
|
|
9341
9357
|
if not await self._run_session_start_hook(start_cause):
|
|
9342
9358
|
self._initial_session_start_stopped = True
|
|
@@ -9349,6 +9365,9 @@ class DeepAgentsApp(App):
|
|
|
9349
9365
|
self._startup_cmd = None
|
|
9350
9366
|
await self._run_startup_command(cmd)
|
|
9351
9367
|
|
|
9368
|
+
if start_cause is SessionStartCause.RESUME:
|
|
9369
|
+
await self._maybe_compact_after_resume()
|
|
9370
|
+
|
|
9352
9371
|
if should_load_history:
|
|
9353
9372
|
await self._remount_pending_goal_rubric_review()
|
|
9354
9373
|
|
|
@@ -10173,6 +10192,7 @@ class DeepAgentsApp(App):
|
|
|
10173
10192
|
from deepagents_code.command_registry import (
|
|
10174
10193
|
BYPASS_WHEN_CONNECTING,
|
|
10175
10194
|
IMMEDIATE_UI,
|
|
10195
|
+
IMMEDIATE_UI_ARG_FORMS,
|
|
10176
10196
|
SIDE_EFFECT_FREE,
|
|
10177
10197
|
STARTUP_RECOVERY_COMMANDS,
|
|
10178
10198
|
)
|
|
@@ -10200,11 +10220,16 @@ class DeepAgentsApp(App):
|
|
|
10200
10220
|
or self._modal_command_running()
|
|
10201
10221
|
)
|
|
10202
10222
|
if cmd in IMMEDIATE_UI:
|
|
10203
|
-
# Only
|
|
10204
|
-
#
|
|
10205
|
-
#
|
|
10206
|
-
#
|
|
10207
|
-
|
|
10223
|
+
# Only UI-opening forms bypass: the bare command, or an argument
|
|
10224
|
+
# form whitelisted in IMMEDIATE_UI_ARG_FORMS (e.g. `/auto model`,
|
|
10225
|
+
# which opens the classifier picker). Other argument forms do a
|
|
10226
|
+
# direct action that shouldn't race the agent (e.g. `/model <name>`
|
|
10227
|
+
# switches models, `/threads -r <id>` resumes a thread,
|
|
10228
|
+
# `/auto model <spec>` mutates classifier state). Whitespace is
|
|
10229
|
+
# canonicalized for the whitelist check because `_handle_command`
|
|
10230
|
+
# strips and reparses the same way — `/auto model` (double space,
|
|
10231
|
+
# tab) reaches the selector branch once processed.
|
|
10232
|
+
return value == cmd or " ".join(value.split()) in IMMEDIATE_UI_ARG_FORMS
|
|
10208
10233
|
return cmd in SIDE_EFFECT_FREE
|
|
10209
10234
|
|
|
10210
10235
|
async def _submit_input(
|
|
@@ -15388,15 +15413,29 @@ class DeepAgentsApp(App):
|
|
|
15388
15413
|
if self._chat_input:
|
|
15389
15414
|
self._chat_input.set_cursor_active(active=False)
|
|
15390
15415
|
|
|
15416
|
+
from functools import partial
|
|
15417
|
+
|
|
15391
15418
|
# Use run_worker to avoid blocking the main event loop
|
|
15392
15419
|
# This allows the UI to remain responsive during agent execution
|
|
15393
|
-
|
|
15394
|
-
|
|
15395
|
-
|
|
15396
|
-
|
|
15397
|
-
|
|
15398
|
-
|
|
15399
|
-
|
|
15420
|
+
#
|
|
15421
|
+
# Passed as a callable rather than a coroutine: a worker
|
|
15422
|
+
# cancelled before its first event-loop step never runs its
|
|
15423
|
+
# work, and an already-built coroutine would then be finalized
|
|
15424
|
+
# unawaited (`RuntimeWarning`, plus an unraisable exception when
|
|
15425
|
+
# the interpreter is far enough into teardown). Building it
|
|
15426
|
+
# inside the worker means nothing exists to strand.
|
|
15427
|
+
turn: Callable[[], Coroutine[None, None, None]] = partial(
|
|
15428
|
+
self._run_agent_task,
|
|
15429
|
+
message,
|
|
15430
|
+
message_kwargs=message_kwargs,
|
|
15431
|
+
goal_notice_current=resuming_blocked,
|
|
15432
|
+
)
|
|
15433
|
+
# Cast because Textual's `WorkType` alias admits both a
|
|
15434
|
+
# coroutine factory and a plain callable, so the result type
|
|
15435
|
+
# infers as the union rather than the `None` the turn returns.
|
|
15436
|
+
self._agent_worker = cast(
|
|
15437
|
+
"Worker[None]",
|
|
15438
|
+
self.run_worker(turn, name="_run_agent_task", exclusive=False),
|
|
15400
15439
|
)
|
|
15401
15440
|
worker_started = True
|
|
15402
15441
|
finally:
|
|
@@ -16488,10 +16527,7 @@ class DeepAgentsApp(App):
|
|
|
16488
16527
|
context-token count, and the persisted model spec (if any).
|
|
16489
16528
|
"""
|
|
16490
16529
|
state_values = await self._get_thread_state_values(thread_id)
|
|
16491
|
-
|
|
16492
|
-
context_tokens = (
|
|
16493
|
-
raw_tokens if isinstance(raw_tokens, int) and raw_tokens >= 0 else 0
|
|
16494
|
-
)
|
|
16530
|
+
context_tokens = _persisted_context_tokens(state_values)
|
|
16495
16531
|
raw_spec = state_values.get("_model_spec")
|
|
16496
16532
|
model_spec = raw_spec if isinstance(raw_spec, str) else ""
|
|
16497
16533
|
raw_params = state_values.get("_model_params")
|
|
@@ -19049,9 +19085,9 @@ class DeepAgentsApp(App):
|
|
|
19049
19085
|
" /auto model <provider:model>\n"
|
|
19050
19086
|
" /auto model clear Reuse the main agent model\n\n"
|
|
19051
19087
|
"Auto reviews gated actions with a classifier model. It currently "
|
|
19052
|
-
f"uses {self._auto_classifier_model_label()}.
|
|
19053
|
-
"
|
|
19054
|
-
"
|
|
19088
|
+
f"uses {self._auto_classifier_model_label()}. Actions it cannot "
|
|
19089
|
+
"review are denied, and repeated review failures fall back to your "
|
|
19090
|
+
"approval.\n\n"
|
|
19055
19091
|
"Changes here apply to this session only. Set "
|
|
19056
19092
|
"`[models].auto_classifier` in config.toml for a persistent choice."
|
|
19057
19093
|
)
|
|
@@ -19142,6 +19178,43 @@ class DeepAgentsApp(App):
|
|
|
19142
19178
|
# removes the modal.
|
|
19143
19179
|
self.call_after_refresh(start_selection_worker)
|
|
19144
19180
|
|
|
19181
|
+
tail = ""
|
|
19182
|
+
if self._auto_classifier_display_spec() is not None:
|
|
19183
|
+
# The picker lists only recommended classifiers, so it offers no
|
|
19184
|
+
# entry that reverts to the main agent model. `_auto_usage_text`
|
|
19185
|
+
# carries the hint, but it is mounted only for an unrecognized
|
|
19186
|
+
# `/auto` subcommand, so no path that opens this modal shows it.
|
|
19187
|
+
tail = " Clear it with `/auto model clear`."
|
|
19188
|
+
|
|
19189
|
+
# Every branch hands the screen a `Content`: the description reaches a
|
|
19190
|
+
# `Static`, which parses a plain `str` as markup. The branches naming a
|
|
19191
|
+
# spec use `from_markup` with `$spec` per `AGENTS.md`, because the spec
|
|
19192
|
+
# is user-supplied: `/auto model <spec>` validates, but the startup seed
|
|
19193
|
+
# from `--auto-classifier-model` / `config.toml` does not. Interpolated
|
|
19194
|
+
# into a plain `str` instead,
|
|
19195
|
+
# a spec containing `[dim]` would render a truncated, dimmed name that is
|
|
19196
|
+
# not the model reviewing actions, and one containing `[/]` would raise
|
|
19197
|
+
# `MarkupError` when the modal opens. The first branch names no spec, so
|
|
19198
|
+
# the plain `Content` constructor — which parses nothing — suffices.
|
|
19199
|
+
active = self._auto_classifier_review_model_spec()
|
|
19200
|
+
if active is None:
|
|
19201
|
+
description = Content(
|
|
19202
|
+
"Auto currently reviews with the main agent model." + tail
|
|
19203
|
+
)
|
|
19204
|
+
elif not self._auto_classifier_is_distinct():
|
|
19205
|
+
# Not `display_spec() is None`: that asks where the spec came from,
|
|
19206
|
+
# but the sentence claims the spec *is* the main agent model. They
|
|
19207
|
+
# diverge when a configured classifier matches the main model, which
|
|
19208
|
+
# `_notify_auto_classifier_active` also treats as "not distinct".
|
|
19209
|
+
description = Content.from_markup(
|
|
19210
|
+
"Auto currently reviews with $spec, the main agent model." + tail,
|
|
19211
|
+
spec=active,
|
|
19212
|
+
)
|
|
19213
|
+
else:
|
|
19214
|
+
description = Content.from_markup(
|
|
19215
|
+
"Auto currently reviews with $spec." + tail, spec=active
|
|
19216
|
+
)
|
|
19217
|
+
|
|
19145
19218
|
screen = ModelSelectorScreen(
|
|
19146
19219
|
current_model=current_model,
|
|
19147
19220
|
current_provider=current_provider,
|
|
@@ -19149,12 +19222,7 @@ class DeepAgentsApp(App):
|
|
|
19149
19222
|
recommended_models=_AUTO_CLASSIFIER_RECOMMENDED_MODELS,
|
|
19150
19223
|
include_recent_models=False,
|
|
19151
19224
|
title="Choose the Auto classifier model",
|
|
19152
|
-
description=
|
|
19153
|
-
"Recommended models favor lower latency and cost for repeated "
|
|
19154
|
-
"reviews. A faster, cheaper model may review actions less "
|
|
19155
|
-
"carefully. Clear it with `/auto model clear` to reuse the main "
|
|
19156
|
-
"agent model."
|
|
19157
|
-
),
|
|
19225
|
+
description=description,
|
|
19158
19226
|
)
|
|
19159
19227
|
self.push_screen(screen, handle_result)
|
|
19160
19228
|
|
|
@@ -20923,6 +20991,9 @@ class DeepAgentsApp(App):
|
|
|
20923
20991
|
)
|
|
20924
20992
|
await self._mount_message(AppMessage(resume_hint))
|
|
20925
20993
|
|
|
20994
|
+
if resume_thread_id is not None:
|
|
20995
|
+
await self._maybe_compact_after_resume()
|
|
20996
|
+
|
|
20926
20997
|
# Drain any messages the user typed after we cleared the queue
|
|
20927
20998
|
# but before the new server was ready.
|
|
20928
20999
|
if self._pending_messages and not self._agent_running:
|
|
@@ -24205,18 +24276,44 @@ class DeepAgentsApp(App):
|
|
|
24205
24276
|
if target is None:
|
|
24206
24277
|
return
|
|
24207
24278
|
|
|
24208
|
-
active_agent = self._assistant_id or DEFAULT_ASSISTANT_ID
|
|
24209
|
-
if target.agent_name == active_agent:
|
|
24210
|
-
await self._resume_thread(target.thread_id)
|
|
24211
|
-
return
|
|
24212
|
-
|
|
24213
24279
|
# This command runs inline on Textual's message pump. Detach before
|
|
24214
|
-
# awaiting the
|
|
24280
|
+
# awaiting the cwd/compaction modals so Enter/Esc can reach them. Both
|
|
24281
|
+
# continuations mount their own failure messages.
|
|
24282
|
+
active_agent = self._assistant_id or DEFAULT_ASSISTANT_ID
|
|
24215
24283
|
self._schedule_off_message_pump(
|
|
24216
|
-
self.
|
|
24284
|
+
self._resume_same_agent_thread(target.thread_id)
|
|
24285
|
+
if target.agent_name == active_agent
|
|
24286
|
+
else self._confirm_then_resume_cross_agent_thread(target),
|
|
24217
24287
|
context=f"threads-resume:{target.thread_id}",
|
|
24218
24288
|
)
|
|
24219
24289
|
|
|
24290
|
+
async def _resume_same_agent_thread(self, thread_id: str) -> None:
|
|
24291
|
+
"""Resume a thread already owned by the active agent.
|
|
24292
|
+
|
|
24293
|
+
A thin reporting wrapper: `_resume_thread` handles its own failures once
|
|
24294
|
+
the switch is under way, but its pre-switch phase (the cwd prompt, the
|
|
24295
|
+
compaction prompt, and their modal setup) sits outside that boundary.
|
|
24296
|
+
Detached continuations only get logged, so without this a `/threads -r`
|
|
24297
|
+
would end with no visible outcome.
|
|
24298
|
+
|
|
24299
|
+
Args:
|
|
24300
|
+
thread_id: The thread to resume on the current agent.
|
|
24301
|
+
|
|
24302
|
+
Raises:
|
|
24303
|
+
asyncio.CancelledError: If app shutdown cancels the detached flow.
|
|
24304
|
+
"""
|
|
24305
|
+
try:
|
|
24306
|
+
await self._resume_thread(thread_id)
|
|
24307
|
+
except asyncio.CancelledError:
|
|
24308
|
+
raise
|
|
24309
|
+
except Exception:
|
|
24310
|
+
logger.exception("Same-agent resume failed for thread %s", thread_id)
|
|
24311
|
+
await self._mount_message(
|
|
24312
|
+
ErrorMessage(
|
|
24313
|
+
f"Could not resume thread {thread_id}. Use /threads to try again."
|
|
24314
|
+
)
|
|
24315
|
+
)
|
|
24316
|
+
|
|
24220
24317
|
async def _resolve_threads_resume_target(
|
|
24221
24318
|
self, requested_id: str | None
|
|
24222
24319
|
) -> _ThreadsResumeTarget | None:
|
|
@@ -24928,6 +25025,69 @@ class DeepAgentsApp(App):
|
|
|
24928
25025
|
return False
|
|
24929
25026
|
return bool(changes)
|
|
24930
25027
|
|
|
25028
|
+
async def _restore_resumed_context_tokens(self) -> None:
|
|
25029
|
+
"""Seed `_context_tokens` from the checkpoint without loading history.
|
|
25030
|
+
|
|
25031
|
+
A launch that resumes *and* carries an initial prompt skips the history
|
|
25032
|
+
load, so nothing would populate the context size — and that path is the
|
|
25033
|
+
one where it matters most, since the prompt is submitted against the
|
|
25034
|
+
full restored context moments later.
|
|
25035
|
+
"""
|
|
25036
|
+
if not self._lc_thread_id or not self._agent:
|
|
25037
|
+
return
|
|
25038
|
+
try:
|
|
25039
|
+
state_values = await self._get_thread_state_values(self._lc_thread_id)
|
|
25040
|
+
except Exception:
|
|
25041
|
+
logger.warning(
|
|
25042
|
+
"Could not read the context size for resumed thread %s; "
|
|
25043
|
+
"skipping the compaction suggestion",
|
|
25044
|
+
self._lc_thread_id,
|
|
25045
|
+
exc_info=True,
|
|
25046
|
+
)
|
|
25047
|
+
return
|
|
25048
|
+
tokens = _persisted_context_tokens(state_values)
|
|
25049
|
+
if tokens > 0:
|
|
25050
|
+
self._on_tokens_update(tokens)
|
|
25051
|
+
|
|
25052
|
+
async def _maybe_compact_after_resume(self) -> None:
|
|
25053
|
+
"""Offer to compact a just-resumed thread with an oversized context.
|
|
25054
|
+
|
|
25055
|
+
Resuming costs nothing on its own, so the prompt runs once the thread is
|
|
25056
|
+
live and before the user's next turn pays for the restored context.
|
|
25057
|
+
Declining is free: `/compact` remains available for the rest of the
|
|
25058
|
+
session.
|
|
25059
|
+
"""
|
|
25060
|
+
from deepagents_code.config_manifest import (
|
|
25061
|
+
COMPACT_ON_RESUME_THRESHOLD_DEFAULT,
|
|
25062
|
+
get_option,
|
|
25063
|
+
load_config_toml,
|
|
25064
|
+
resolve_scalar,
|
|
25065
|
+
)
|
|
25066
|
+
|
|
25067
|
+
threshold = COMPACT_ON_RESUME_THRESHOLD_DEFAULT
|
|
25068
|
+
option = get_option("threads.compact_on_resume_threshold")
|
|
25069
|
+
if option is not None:
|
|
25070
|
+
resolved, _ = resolve_scalar(option, toml_data=load_config_toml())
|
|
25071
|
+
if isinstance(resolved, int):
|
|
25072
|
+
threshold = resolved
|
|
25073
|
+
if threshold <= 0 or self._context_tokens <= threshold:
|
|
25074
|
+
return
|
|
25075
|
+
|
|
25076
|
+
from deepagents_code.tui.modals.resume_compact import ResumeCompactPromptScreen
|
|
25077
|
+
|
|
25078
|
+
try:
|
|
25079
|
+
compact = await self._push_screen_wait(
|
|
25080
|
+
ResumeCompactPromptScreen(
|
|
25081
|
+
context_tokens=self._context_tokens,
|
|
25082
|
+
threshold=threshold,
|
|
25083
|
+
)
|
|
25084
|
+
)
|
|
25085
|
+
except Exception:
|
|
25086
|
+
logger.exception("Failed to show the compact-on-resume prompt")
|
|
25087
|
+
return
|
|
25088
|
+
if compact:
|
|
25089
|
+
await self._handle_offload()
|
|
25090
|
+
|
|
24931
25091
|
async def _offer_thread_cwd_switch(
|
|
24932
25092
|
self,
|
|
24933
25093
|
thread_id: str,
|
|
@@ -25225,6 +25385,12 @@ class DeepAgentsApp(App):
|
|
|
25225
25385
|
# or failed load leaves the hint under something else.
|
|
25226
25386
|
await self._mount_previous_thread_hint(prev_session_thread)
|
|
25227
25387
|
|
|
25388
|
+
# Landing on a new thread re-arms the same-thread toast, so stepping
|
|
25389
|
+
# back to a thread and re-selecting it announces itself again.
|
|
25390
|
+
self._last_thread_unchanged = None
|
|
25391
|
+
if await self._run_session_start_hook(SessionStartCause.RESUME):
|
|
25392
|
+
await self._maybe_compact_after_resume()
|
|
25393
|
+
|
|
25228
25394
|
# Deferred above so it lands last, keeping the interactive prompt
|
|
25229
25395
|
# at the bottom of the transcript. Guarded because this runs inside
|
|
25230
25396
|
# the rollback handler's `try`: failing to restore a review must
|
|
@@ -25233,12 +25399,6 @@ class DeepAgentsApp(App):
|
|
|
25233
25399
|
await self._remount_pending_goal_rubric_review()
|
|
25234
25400
|
except Exception:
|
|
25235
25401
|
logger.exception("Failed to restore pending goal review")
|
|
25236
|
-
|
|
25237
|
-
# Landing on a new thread re-arms the same-thread toast, so stepping
|
|
25238
|
-
# back to a thread and re-selecting it announces itself again.
|
|
25239
|
-
self._last_thread_unchanged = None
|
|
25240
|
-
if not await self._run_session_start_hook(SessionStartCause.RESUME):
|
|
25241
|
-
return
|
|
25242
25402
|
except Exception as exc:
|
|
25243
25403
|
if prefetched_payload is None:
|
|
25244
25404
|
logger.exception("Failed to prefetch history for thread %s", thread_id)
|