deepagents-code 0.1.67__tar.gz → 0.1.68__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.67 → deepagents_code-0.1.68}/CHANGELOG.md +14 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/PKG-INFO +2 -2
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_build_info.py +1 -1
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_env_vars.py +3 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/app.py +106 -51
- deepagents_code-0.1.68/deepagents_code/bundled_prices.json +39 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/remote_client.py +20 -7
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/cold_cache.py +103 -40
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configurable_model.py +18 -5
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/offload_api.py +46 -23
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/sessions.py +11 -9
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/theme.py +2 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/cwd_switch.py +28 -2
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/model_selector.py +6 -5
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/thread_selector.py +2 -2
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/pyproject.toml +2 -2
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_app.py +358 -27
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_cold_cache.py +110 -1
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_configurable_model.py +107 -4
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_offload_api.py +35 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_theme.py +9 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_cwd_switch.py +36 -1
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/uv.lock +6 -6
- deepagents_code-0.1.67/deepagents_code/bundled_prices.json +0 -21
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/.gitignore +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/AGENTS.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/ARCHITECTURE.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/COMMANDS.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/DEVELOPMENT.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/EXTENSIONS.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/HOOKS.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/LICENSE +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/Makefile +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/PRICING.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/README.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/THREAT_MODEL.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_content_blocks.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_debug_buffer.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_dep_floor_check.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_fake_models.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_home_error.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_invocation.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_markdown.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_paths.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_repository_bounds.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_reserved_names.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_server_config.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_terminal_stderr.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_tool_stream.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_tracing.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/acp.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/agent.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/approval_mode.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/auto_mode.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/bundled_prices.README.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/commands/auth.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/commands/config.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/commands/extras.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/commands/mcp.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/commands/tools.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/launch/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/launch/server.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/launch/server_manager.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/non_interactive.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/command_registry.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/config.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/config_manifest.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/interpreter.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/paths.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/provider.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/providers.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/resolver.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/service.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/theme_resolution.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/types.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/writer.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/context_doctor.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/cost_tracking.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/diff_utils.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/doctor.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/api.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/discovery.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/hosting.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/loader.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/registry.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/runtime.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/settings.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/trust.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extras_info.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/goal_rubric.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/goal_state_limits.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/goal_state_notice.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/goal_tools.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/capabilities.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/client.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/client_lifecycle.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/context.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/engine.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/env.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/envelope.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/interrupt.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/legacy.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/loading.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/manager.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/migration.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/models/adapters.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/models/config.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/models/domain.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/models/transport.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/models/wire.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/permissions.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/presenter.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/projection.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/reducer.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/runner.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/runtime.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/server_middleware.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/snapshot.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/tools.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/transcript.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/trust.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/integrations/sandbox_factory.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/json_types.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/main.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/managed_tools.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_auth.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_config.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_tools.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/model_config.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/model_retry.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/offload.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/offload_middleware.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/paste_collapse.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/_json.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/adapters/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/adapters/hooks.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/adapters/mcp.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/adapters/skills.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/commands_cli.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/discovery.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/manifest.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/marketplace.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/models.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/store.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/substitution.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/reasoning_effort.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/reliable_rubric.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/server_graph.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/skills/merge.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/skills/trust.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/system_prompt.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tool_catalog.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/key_hints.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/cold_cache.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/model_switch.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/prompt_clipboard.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/prompt_clipboard.tcss +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/resume_blocked.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/resume_compact.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/screens/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/textual_adapter.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/_links.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/approval.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/ask_user.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/auth.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/chat_input.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/codex_auth.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/context_usage.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/debug_console.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/diff.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/effort_selector.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/goal_review.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/goal_status.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/history.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/install_confirm.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/loading.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/message_store.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/messages.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/prompt_search.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/skill_trust.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/startup_tip.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/status.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/update_available.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/update_confirm.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/welcome.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/ui.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/update_check.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/workspace.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/examples/extensions/memory_store.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/hatch_build.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/images/model-stream-retry.png +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/images/tui.png +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/scripts/check_process_cwd.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/scripts/install.sh +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/README.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/test_auto_approve_remote.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/test_offload_server_side.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/test_pending_work_recovery.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/client/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/client/commands/test_auth.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/client/commands/test_extras.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/client/commands/test_mcp.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/client/commands/test_tools.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/conftest.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/models/test_models.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_configuration.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_engine.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_execution.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_manager.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_presenter.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_server_lifecycle.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_transcript.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_trust.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/plugins/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/plugins/test_marketplace.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/skills/test_merge.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/skills/test_skill_trust.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/smoke_tests/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/smoke_tests/conftest.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test__tool_stream.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_acp.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_agent.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_approval_mode.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_args.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_ask_user_types.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_auto_mode.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_cli_provider.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_config.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_config_manifest.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_configuration.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_configuration_resolution.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_configuration_resolver.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_context_doctor.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_cost_tracking.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_cursor_style.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_debug_buffer.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_debug_console.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_dep_floor_check.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_diff_utils.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_doctor.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extension_api.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extension_cli_trust.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extension_config_manifest.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extension_discovery.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extension_display.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extension_host_runtime.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extension_hosting.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extension_runtime.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extra_skills_dirs.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_goal_criteria_client.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_goal_rubric.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_goal_state_limits.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_goal_state_notice.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_goal_state_persistence.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_goal_tools.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_hatch_build.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_install_command.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_install_script.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_invocation.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_json_types.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_main.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_managed_tools.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_mcp_config.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_model_config.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_model_retry.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_paths.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_process_cwd_check.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_reasoning_effort.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_reliable_rubric.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_repository_bounds.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_resume_compaction_recovery.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_rubric_cli.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_sandbox_registry.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_server.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_server_tracing.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_terminal_stderr.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_threads_resume.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_tool_catalog.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_tracing.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_tracing_replicas.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_transcript_virtualization.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_uninstall_command.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_workspace.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tools/test_web_search.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/modals/test_cold_cache.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/modals/test_model_switch.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/modals/test_prompt_clipboard.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/modals/test_resume_blocked.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/test_key_hints.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/test_modal_footer_layout.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_history.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_links.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_prompt_search.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_status.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
- {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.1.68](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.67...deepagents-code==0.1.68) (2026-09-10)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- Recommended GLM 5.3 models are now available in code workflows ([#6211](https://github.com/langchain-ai/deepagents/pull/6211)).
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
- Added pricing support for Fireworks GLM-5.3 and GLM-5.3 Flash usage ([#6221](https://github.com/langchain-ai/deepagents/pull/6221), [#6223](https://github.com/langchain-ai/deepagents/pull/6223)).
|
|
14
|
+
- Workspace switches now ask for confirmation before restarting the server ([#6178](https://github.com/langchain-ai/deepagents/pull/6178)).
|
|
15
|
+
- Effort changes are now included in cache identity for OpenAI and Anthropic requests ([#6196](https://github.com/langchain-ai/deepagents/pull/6196)).
|
|
16
|
+
- Standardized the recent-thread environment variable ([#6205](https://github.com/langchain-ai/deepagents/pull/6205)).
|
|
17
|
+
- Silenced warnings when the themes config is absent ([#6220](https://github.com/langchain-ai/deepagents/pull/6220)).
|
|
18
|
+
|
|
5
19
|
## [0.1.67](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.66...deepagents-code==0.1.67) (2026-09-09)
|
|
6
20
|
|
|
7
21
|
### Features
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.68
|
|
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://www.langchain.com/dcode
|
|
6
6
|
Project-URL: Documentation, https://docs.langchain.com/oss/deepagents/code/overview
|
|
@@ -44,7 +44,7 @@ Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.1
|
|
|
44
44
|
Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.31
|
|
45
45
|
Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.34.0
|
|
46
46
|
Requires-Dist: langgraph-sdk<1.0.0,>=0.4.4
|
|
47
|
-
Requires-Dist: langsmith[sandbox]>=0.12.
|
|
47
|
+
Requires-Dist: langsmith[sandbox]>=0.12.3
|
|
48
48
|
Requires-Dist: markdownify<2.0.0,>=1.2.3
|
|
49
49
|
Requires-Dist: mcp<2.0.0,>=1.28.1
|
|
50
50
|
Requires-Dist: packaging>=26.2
|
|
@@ -506,6 +506,9 @@ hostile values the dotenv denylist does not yet enumerate. The global
|
|
|
506
506
|
repo file, so a project `.env` cannot disable itself.
|
|
507
507
|
"""
|
|
508
508
|
|
|
509
|
+
RECENT_THREADS = "DEEPAGENTS_CODE_RECENT_THREADS"
|
|
510
|
+
"""Maximum number of recent threads loaded and displayed (default: 20)."""
|
|
511
|
+
|
|
509
512
|
RECURSION_LIMIT = "DEEPAGENTS_CODE_RECURSION_LIMIT"
|
|
510
513
|
"""Override the main agent's LangGraph `recursion_limit` (graph step budget).
|
|
511
514
|
|
|
@@ -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.68" # 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."""
|
|
@@ -873,6 +873,14 @@ class _ServerRespawnResult:
|
|
|
873
873
|
"""
|
|
874
874
|
|
|
875
875
|
|
|
876
|
+
@dataclass(frozen=True)
|
|
877
|
+
class _CwdServerReuseResult:
|
|
878
|
+
"""Server decision for a destination workspace."""
|
|
879
|
+
|
|
880
|
+
outcome: Literal["continue", "abort", "restart"]
|
|
881
|
+
workspace_snapshot: tuple[str | None, dict[str, dict[str, Any]]] | None = None
|
|
882
|
+
|
|
883
|
+
|
|
876
884
|
def _format_mcp_server_changes(
|
|
877
885
|
previous: list[MCPServerInfo] | None,
|
|
878
886
|
current: list[MCPServerInfo] | None,
|
|
@@ -9218,7 +9226,7 @@ class DeepAgentsApp(App):
|
|
|
9218
9226
|
type(raw_endpoint).__name__,
|
|
9219
9227
|
)
|
|
9220
9228
|
|
|
9221
|
-
def _stamp_cache_identity_locally(self) -> None:
|
|
9229
|
+
async def _stamp_cache_identity_locally(self) -> None:
|
|
9222
9230
|
"""Record the just-run model as the cache identity, without a checkpoint.
|
|
9223
9231
|
|
|
9224
9232
|
Used when a turn reached the model but ended without a readable
|
|
@@ -9231,16 +9239,14 @@ class DeepAgentsApp(App):
|
|
|
9231
9239
|
"""
|
|
9232
9240
|
from datetime import UTC, datetime
|
|
9233
9241
|
|
|
9234
|
-
from deepagents_code.
|
|
9242
|
+
from deepagents_code.configurable_model import _effective_cache_params
|
|
9235
9243
|
|
|
9236
9244
|
self._last_model_request_at = datetime.now(UTC).isoformat()
|
|
9237
9245
|
self._last_cache_model_spec = self._effective_model_spec() or ""
|
|
9238
|
-
|
|
9239
|
-
|
|
9240
|
-
|
|
9241
|
-
|
|
9242
|
-
self._last_cache_model_params = (
|
|
9243
|
-
cache_identity_params(self._model_params_override) or None
|
|
9246
|
+
self._last_cache_model_params = await asyncio.to_thread(
|
|
9247
|
+
_effective_cache_params,
|
|
9248
|
+
self._last_cache_model_spec,
|
|
9249
|
+
self._model_params_override,
|
|
9244
9250
|
)
|
|
9245
9251
|
|
|
9246
9252
|
async def _sync_session_cost_from_checkpoint(self) -> None:
|
|
@@ -11911,6 +11917,7 @@ class DeepAgentsApp(App):
|
|
|
11911
11917
|
parse_cache_timestamp,
|
|
11912
11918
|
resolve_prompt_cache_policy,
|
|
11913
11919
|
)
|
|
11920
|
+
from deepagents_code.config import _compose_openai_reasoning_effort
|
|
11914
11921
|
from deepagents_code.model_config import (
|
|
11915
11922
|
ModelConfig,
|
|
11916
11923
|
is_warning_suppressed,
|
|
@@ -11941,6 +11948,14 @@ class DeepAgentsApp(App):
|
|
|
11941
11948
|
fallback_base_url = config.get_base_url(provider)
|
|
11942
11949
|
if isinstance(fallback_base_url, str):
|
|
11943
11950
|
current_params["base_url"] = fallback_base_url
|
|
11951
|
+
# Match model construction before projecting the cache identity.
|
|
11952
|
+
overrides = self._model_params_override or {}
|
|
11953
|
+
current_params = _compose_openai_reasoning_effort(
|
|
11954
|
+
provider,
|
|
11955
|
+
current_params,
|
|
11956
|
+
overrides.get("reasoning_effort"),
|
|
11957
|
+
overrides.get("reasoning"),
|
|
11958
|
+
)
|
|
11944
11959
|
# Endpoint changes have their own normalized identity. Keeping
|
|
11945
11960
|
# `base_url` out of this mapping avoids treating the same endpoint
|
|
11946
11961
|
# as two independent identity changes.
|
|
@@ -12042,11 +12057,13 @@ class DeepAgentsApp(App):
|
|
|
12042
12057
|
age_seconds = max(elapsed or 0.0, 0.0)
|
|
12043
12058
|
if (
|
|
12044
12059
|
model_spec != last_spec
|
|
12045
|
-
# Only cache-participating params are compared
|
|
12046
|
-
#
|
|
12047
|
-
#
|
|
12048
|
-
|
|
12049
|
-
|
|
12060
|
+
# Only cache-participating params are compared. OpenAI and
|
|
12061
|
+
# Anthropic reasoning-effort settings participate because
|
|
12062
|
+
# both providers render effort into the prefix: OpenAI may
|
|
12063
|
+
# rewrite model-side instructions, Anthropic always renders
|
|
12064
|
+
# the thinking config into the prompt.
|
|
12065
|
+
or cache_identity_params(current_params, model_spec=model_spec)
|
|
12066
|
+
!= cache_identity_params(last_params, model_spec=last_spec)
|
|
12050
12067
|
# `None` means no endpoint was ever recorded -- e.g. a
|
|
12051
12068
|
# thread checkpointed before this field existed, or one
|
|
12052
12069
|
# whose stored value was unreadable and discarded on load.
|
|
@@ -18777,7 +18794,7 @@ class DeepAgentsApp(App):
|
|
|
18777
18794
|
# the in-memory request time. Leaving it stale would make the
|
|
18778
18795
|
# very next send report "no record of when this thread last
|
|
18779
18796
|
# reached the model" seconds after a turn that plainly did.
|
|
18780
|
-
self._stamp_cache_identity_locally()
|
|
18797
|
+
await self._stamp_cache_identity_locally()
|
|
18781
18798
|
# Finalize any subagent rows left "running" — an interrupt cancels
|
|
18782
18799
|
# the worker before the bridge emits terminal events (a cancel is a
|
|
18783
18800
|
# BaseException, which the bridge's `except Exception` skips), so the
|
|
@@ -29109,23 +29126,18 @@ class DeepAgentsApp(App):
|
|
|
29109
29126
|
|
|
29110
29127
|
async def _reuse_server_after_cwd_switch(
|
|
29111
29128
|
self, cwd: Path, thread_id: str
|
|
29112
|
-
) ->
|
|
29129
|
+
) -> _CwdServerReuseResult:
|
|
29113
29130
|
remote = self._remote_agent()
|
|
29114
|
-
if remote is None
|
|
29115
|
-
return "restart"
|
|
29131
|
+
if remote is None:
|
|
29132
|
+
return _CwdServerReuseResult("restart")
|
|
29116
29133
|
from langgraph_sdk.errors import ConflictError
|
|
29117
29134
|
|
|
29118
|
-
previous_cwd = Path(self._cwd)
|
|
29119
|
-
previous_server_cwd = (
|
|
29120
|
-
self._server_kwargs.get("cwd") if self._server_kwargs is not None else None
|
|
29121
|
-
)
|
|
29122
|
-
previous_mcp_info = self._mcp_server_info
|
|
29123
29135
|
workspace_snapshot = remote._snapshot_workspace()
|
|
29124
29136
|
config: RunnableConfig = {"configurable": {"thread_id": thread_id}}
|
|
29125
29137
|
try:
|
|
29126
|
-
|
|
29138
|
+
await remote.aswitch_workspace(config, str(cwd), validate_only=True)
|
|
29127
29139
|
except ConflictError:
|
|
29128
|
-
return "restart"
|
|
29140
|
+
return _CwdServerReuseResult("restart")
|
|
29129
29141
|
except Exception as exc:
|
|
29130
29142
|
logger.exception("Server could not validate the destination workspace")
|
|
29131
29143
|
self.notify(
|
|
@@ -29135,21 +29147,33 @@ class DeepAgentsApp(App):
|
|
|
29135
29147
|
timeout=10,
|
|
29136
29148
|
markup=False,
|
|
29137
29149
|
)
|
|
29138
|
-
return "abort"
|
|
29150
|
+
return _CwdServerReuseResult("abort")
|
|
29151
|
+
return _CwdServerReuseResult(
|
|
29152
|
+
"continue",
|
|
29153
|
+
workspace_snapshot=workspace_snapshot,
|
|
29154
|
+
)
|
|
29155
|
+
|
|
29156
|
+
async def _apply_reused_server_cwd_switch(
|
|
29157
|
+
self, cwd: Path, thread_id: str, reuse: _CwdServerReuseResult
|
|
29158
|
+
) -> None:
|
|
29159
|
+
remote = self._remote_agent()
|
|
29160
|
+
if remote is None or reuse.workspace_snapshot is None:
|
|
29161
|
+
msg = "A validated workspace switch has no remote workspace snapshot."
|
|
29162
|
+
raise RuntimeError(msg)
|
|
29163
|
+
previous_cwd = Path(self._cwd)
|
|
29164
|
+
previous_server_cwd = (
|
|
29165
|
+
self._server_kwargs.get("cwd") if self._server_kwargs is not None else None
|
|
29166
|
+
)
|
|
29167
|
+
previous_mcp_info = self._mcp_server_info
|
|
29168
|
+
config: RunnableConfig = {"configurable": {"thread_id": thread_id}}
|
|
29139
29169
|
try:
|
|
29140
29170
|
self._preserve_launch_relative_server_paths(previous_cwd)
|
|
29141
29171
|
await self._switch_process_cwd(cwd)
|
|
29142
29172
|
if self._server_kwargs is not None:
|
|
29143
29173
|
self._server_kwargs["cwd"] = self._cwd
|
|
29144
|
-
|
|
29145
|
-
self._mcp_optimistic_original_server_info.clear()
|
|
29146
|
-
self._pending_mcp_login_reconnect = False
|
|
29147
|
-
self._pending_mcp_disable_reconnect_servers.clear()
|
|
29148
|
-
self._mcp_viewer_disable_toggled = False
|
|
29149
|
-
self._sync_pending_mcp_reconnect()
|
|
29150
|
-
self._refresh_mcp_client_state()
|
|
29174
|
+
mcp_server_info = await remote.aswitch_workspace(config, str(cwd))
|
|
29151
29175
|
except BaseException:
|
|
29152
|
-
remote._restore_workspace(workspace_snapshot)
|
|
29176
|
+
remote._restore_workspace(reuse.workspace_snapshot)
|
|
29153
29177
|
self._mcp_server_info = previous_mcp_info
|
|
29154
29178
|
if self._server_kwargs is not None:
|
|
29155
29179
|
self._server_kwargs["cwd"] = previous_server_cwd
|
|
@@ -29159,8 +29183,16 @@ class DeepAgentsApp(App):
|
|
|
29159
29183
|
await self._switch_process_cwd(previous_cwd)
|
|
29160
29184
|
self._refresh_mcp_client_state()
|
|
29161
29185
|
raise
|
|
29162
|
-
|
|
29163
|
-
|
|
29186
|
+
self._mcp_server_info = mcp_server_info
|
|
29187
|
+
self._mcp_optimistic_original_server_info.clear()
|
|
29188
|
+
self._pending_mcp_login_reconnect = False
|
|
29189
|
+
self._pending_mcp_disable_reconnect_servers.clear()
|
|
29190
|
+
self._mcp_viewer_disable_toggled = False
|
|
29191
|
+
self._sync_pending_mcp_reconnect()
|
|
29192
|
+
try:
|
|
29193
|
+
self._refresh_mcp_client_state()
|
|
29194
|
+
except Exception:
|
|
29195
|
+
logger.exception("Failed to refresh MCP state after cwd switch")
|
|
29164
29196
|
|
|
29165
29197
|
@staticmethod
|
|
29166
29198
|
async def _preview_project_settings_change(cwd: Path) -> bool:
|
|
@@ -29345,6 +29377,9 @@ class DeepAgentsApp(App):
|
|
|
29345
29377
|
failed (the caller should stop the resume). The user-declined
|
|
29346
29378
|
abort fires only when `abort` is set, and the switch-failed
|
|
29347
29379
|
abort only when `restart_server` is True.
|
|
29380
|
+
|
|
29381
|
+
Raises:
|
|
29382
|
+
RuntimeError: If an in-session switch has no server decision.
|
|
29348
29383
|
"""
|
|
29349
29384
|
target = await self._thread_cwd_mismatch(thread_id)
|
|
29350
29385
|
if target is None:
|
|
@@ -29352,8 +29387,21 @@ class DeepAgentsApp(App):
|
|
|
29352
29387
|
|
|
29353
29388
|
from deepagents_code.tui.widgets.cwd_switch import CwdSwitchPromptScreen
|
|
29354
29389
|
|
|
29355
|
-
|
|
29356
|
-
target
|
|
29390
|
+
reuse = (
|
|
29391
|
+
await self._reuse_server_after_cwd_switch(target, thread_id)
|
|
29392
|
+
if restart_server
|
|
29393
|
+
else None
|
|
29394
|
+
)
|
|
29395
|
+
if reuse is not None and reuse.outcome == "abort":
|
|
29396
|
+
return "abort"
|
|
29397
|
+
owns_server = self._server_kwargs is not None and self._server_proc is not None
|
|
29398
|
+
server_refusal: Literal["restart", "unavailable"] | None = None
|
|
29399
|
+
if reuse is not None and reuse.outcome == "restart":
|
|
29400
|
+
server_refusal = "restart" if owns_server else "unavailable"
|
|
29401
|
+
project_settings_change_detected = (
|
|
29402
|
+
await self._preview_project_settings_change(target)
|
|
29403
|
+
if server_refusal is None
|
|
29404
|
+
else False
|
|
29357
29405
|
)
|
|
29358
29406
|
choice = await self._push_screen_wait(
|
|
29359
29407
|
CwdSwitchPromptScreen(
|
|
@@ -29361,27 +29409,30 @@ class DeepAgentsApp(App):
|
|
|
29361
29409
|
thread_cwd=str(target),
|
|
29362
29410
|
project_settings_change_detected=project_settings_change_detected,
|
|
29363
29411
|
abort=abort,
|
|
29412
|
+
server_refusal=server_refusal,
|
|
29364
29413
|
)
|
|
29365
29414
|
)
|
|
29415
|
+
if server_refusal == "unavailable":
|
|
29416
|
+
return "abort"
|
|
29417
|
+
if server_refusal == "restart" and choice != "switch":
|
|
29418
|
+
return "abort"
|
|
29366
29419
|
if choice == "abort":
|
|
29420
|
+
if reuse is not None and reuse.workspace_snapshot is not None:
|
|
29421
|
+
remote = self._remote_agent()
|
|
29422
|
+
if remote is not None:
|
|
29423
|
+
remote._restore_workspace(reuse.workspace_snapshot)
|
|
29367
29424
|
return "abort"
|
|
29368
29425
|
if choice == "switch":
|
|
29369
29426
|
if restart_server:
|
|
29370
|
-
|
|
29371
|
-
|
|
29372
|
-
|
|
29373
|
-
outcome =
|
|
29374
|
-
|
|
29375
|
-
|
|
29376
|
-
|
|
29377
|
-
|
|
29427
|
+
if reuse is None:
|
|
29428
|
+
msg = "An in-session cwd switch has no server decision."
|
|
29429
|
+
raise RuntimeError(msg)
|
|
29430
|
+
outcome = reuse.outcome
|
|
29431
|
+
if outcome == "restart":
|
|
29432
|
+
outcome = await self._replace_server_after_cwd_switch(target)
|
|
29433
|
+
elif outcome == "continue":
|
|
29434
|
+
await self._apply_reused_server_cwd_switch(target, thread_id, reuse)
|
|
29378
29435
|
if outcome == "abort":
|
|
29379
|
-
# A failed restart returns "abort" just like a user-declined
|
|
29380
|
-
# abort, so the caller cannot tell them apart.
|
|
29381
|
-
# `_replace_server_after_cwd_switch` already rolled back and
|
|
29382
|
-
# notified, but that toast is transient -- leave a persistent
|
|
29383
|
-
# in-chat record so a failed switch is not mistaken for a
|
|
29384
|
-
# deliberate cancel.
|
|
29385
29436
|
await self._mount_message(
|
|
29386
29437
|
AppMessage(
|
|
29387
29438
|
"Could not switch to the thread's directory; staying "
|
|
@@ -29399,6 +29450,10 @@ class DeepAgentsApp(App):
|
|
|
29399
29450
|
)
|
|
29400
29451
|
return "continue"
|
|
29401
29452
|
|
|
29453
|
+
if reuse is not None and reuse.workspace_snapshot is not None:
|
|
29454
|
+
remote = self._remote_agent()
|
|
29455
|
+
if remote is not None:
|
|
29456
|
+
remote._restore_workspace(reuse.workspace_snapshot)
|
|
29402
29457
|
self.notify(
|
|
29403
29458
|
"Continuing in the current directory. Cached local context may be "
|
|
29404
29459
|
"stale and tools may operate in the wrong project.",
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "openai",
|
|
4
|
+
"name": "OpenAI",
|
|
5
|
+
"api_pattern": "https://api\\.openai\\.com",
|
|
6
|
+
"models": [
|
|
7
|
+
{
|
|
8
|
+
"id": "gpt-6-astra",
|
|
9
|
+
"match": { "or": [{ "equals": "gpt-6-astra" }, { "regex": "^gpt-6-astra-\\d{4}-\\d{2}-\\d{2}$" }] },
|
|
10
|
+
"price_comments": "Stopgap pending release of merged pydantic/genai-prices#680",
|
|
11
|
+
"prices": {
|
|
12
|
+
"input_mtok": { "base": 10.0, "tiers": [{ "start": 271999, "price": 20.0 }] },
|
|
13
|
+
"cache_write_mtok": { "base": 12.5, "tiers": [{ "start": 271999, "price": 25.0 }] },
|
|
14
|
+
"cache_read_mtok": { "base": 1.0, "tiers": [{ "start": 271999, "price": 2.0 }] },
|
|
15
|
+
"output_mtok": { "base": 50.0, "tiers": [{ "start": 271999, "price": 75.0 }] }
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "baseten",
|
|
22
|
+
"name": "Baseten",
|
|
23
|
+
"api_pattern": "https://inference\\.baseten\\.co",
|
|
24
|
+
"models": [
|
|
25
|
+
{ "id": "zai-org/GLM-4.7", "match": { "equals": "glm-4-7" }, "price_comments": "Bare alias omitted from pydantic/genai-prices#660", "prices": { "input_mtok": 0.6, "cache_read_mtok": 0.12, "output_mtok": 2.2 } },
|
|
26
|
+
{ "id": "thinkingmachines/inkling", "match": { "equals": "inkling" }, "price_comments": "Bare alias omitted from pydantic/genai-prices#660", "prices": { "input_mtok": 1.0, "cache_read_mtok": 0.17, "output_mtok": 4.05 } },
|
|
27
|
+
{ "id": "thinkingmachines/inkling-small", "match": { "equals": "inkling-small" }, "price_comments": "Bare alias omitted from pydantic/genai-prices#660", "prices": { "input_mtok": 0.5, "cache_read_mtok": 0.1, "output_mtok": 1.2 } }
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "fireworks",
|
|
32
|
+
"name": "Fireworks",
|
|
33
|
+
"api_pattern": "https://api\\.fireworks\\.ai",
|
|
34
|
+
"models": [
|
|
35
|
+
{ "id": "glm-5p3", "match": { "equals": "accounts/fireworks/models/glm-5p3" }, "price_comments": "Fireworks deployment omitted from pydantic/genai-prices#617", "prices": { "input_mtok": 1.4, "cache_read_mtok": 0.26, "output_mtok": 4.4 } },
|
|
36
|
+
{ "id": "glm-5p3-flash", "match": { "equals": "accounts/fireworks/models/glm-5p3-flash" }, "price_comments": "Fireworks deployment omitted from pydantic/genai-prices#617", "prices": { "input_mtok": 0.15, "cache_read_mtok": 0.03, "output_mtok": 0.5 } }
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
]
|
|
@@ -803,10 +803,16 @@ class RemoteAgent:
|
|
|
803
803
|
return await self.abind_workspace(config, self._workspace_cwd)
|
|
804
804
|
|
|
805
805
|
async def _request_workspace(
|
|
806
|
-
self,
|
|
806
|
+
self,
|
|
807
|
+
config: Mapping[str, Any],
|
|
808
|
+
cwd: str,
|
|
809
|
+
*,
|
|
810
|
+
validate_only: bool = False,
|
|
807
811
|
) -> tuple[dict[str, Any], list[MCPServerInfo] | None]:
|
|
808
812
|
thread_id = _require_thread_id(config)
|
|
809
813
|
payload: dict[str, Any] = {"cwd": cwd}
|
|
814
|
+
if validate_only:
|
|
815
|
+
payload["validate_only"] = True
|
|
810
816
|
if self._workspace_config is not None:
|
|
811
817
|
payload["workspace_config"] = self._workspace_config
|
|
812
818
|
payload["config_fingerprint"] = self._workspace_config_fingerprint
|
|
@@ -874,18 +880,25 @@ class RemoteAgent:
|
|
|
874
880
|
self._workspaces.update(workspaces)
|
|
875
881
|
|
|
876
882
|
async def aswitch_workspace(
|
|
877
|
-
self,
|
|
883
|
+
self,
|
|
884
|
+
config: Mapping[str, Any],
|
|
885
|
+
cwd: str,
|
|
886
|
+
*,
|
|
887
|
+
validate_only: bool = False,
|
|
878
888
|
) -> list[MCPServerInfo] | None:
|
|
879
|
-
"""Bind one thread
|
|
889
|
+
"""Bind or validate one thread's workspace and return MCP metadata.
|
|
880
890
|
|
|
881
891
|
Returns:
|
|
882
892
|
MCP metadata for the server runtime selected by the binding.
|
|
883
893
|
"""
|
|
884
894
|
thread_id = _require_thread_id(config)
|
|
885
|
-
workspace, mcp_server_info = await self._request_workspace(
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
895
|
+
workspace, mcp_server_info = await self._request_workspace(
|
|
896
|
+
config, cwd, validate_only=validate_only
|
|
897
|
+
)
|
|
898
|
+
if not validate_only:
|
|
899
|
+
self._workspace_cwd = cwd
|
|
900
|
+
self._workspaces.clear()
|
|
901
|
+
self._workspaces[thread_id] = workspace
|
|
889
902
|
return mcp_server_info
|
|
890
903
|
|
|
891
904
|
def set_workspace(
|
|
@@ -76,12 +76,14 @@ CACHE_IDENTITY_PARAM_KEYS = frozenset(
|
|
|
76
76
|
)
|
|
77
77
|
"""Invocation params that select or invalidate a provider cache entry.
|
|
78
78
|
|
|
79
|
-
The identity check compares only these
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
79
|
+
The identity check compares only these, plus the provider's reasoning-effort
|
|
80
|
+
settings where a change is documented to move the cached prefix (see
|
|
81
|
+
`_EFFORT_CACHE_IDENTITY_PROVIDERS`). Comparing whole `model_params` maps
|
|
82
|
+
instead would report a model change for every unrelated knob -- `temperature`
|
|
83
|
+
or `max_tokens`, for example -- and the modal would then assert that "the
|
|
84
|
+
previous cached prefix cannot be reused" when nothing about the prefix moved.
|
|
85
|
+
A modal that fires on a false premise trains users into the permanent
|
|
86
|
+
suppression.
|
|
85
87
|
|
|
86
88
|
`cache_control` is deliberately absent: `AnthropicPromptCachingMiddleware`
|
|
87
89
|
overwrites `model_settings["cache_control"]` with its own TTL on every
|
|
@@ -90,6 +92,28 @@ user-supplied value never reaches the wire. Comparing it would report an
|
|
|
90
92
|
identity change for a setting the effective requests never differed on.
|
|
91
93
|
"""
|
|
92
94
|
|
|
95
|
+
_EFFORT_CACHE_IDENTITY_PROVIDERS = frozenset({"openai", "openai_codex", "anthropic"})
|
|
96
|
+
"""Providers whose reasoning-effort settings participate in cache identity.
|
|
97
|
+
|
|
98
|
+
OpenAI documents `reasoning.effort` as a setting that "can change model-side
|
|
99
|
+
reasoning instructions" for its models generally -- the GPT-6 Astra
|
|
100
|
+
`configuration_update` escape hatch exists precisely because the top-level
|
|
101
|
+
knob rewrites the hidden prefix -- and pre-GPT-5.6 minimum cacheable lengths
|
|
102
|
+
vary with request settings including reasoning effort:
|
|
103
|
+
https://developers.openai.com/api/docs/guides/prompt-caching
|
|
104
|
+
|
|
105
|
+
Anthropic is stricter: the thinking/effort configuration is rendered into the
|
|
106
|
+
prompt, so changing it always invalidates message blocks:
|
|
107
|
+
https://platform.claude.com/docs/en/build-with-claude/prompt-caching
|
|
108
|
+
|
|
109
|
+
Other providers (`google_genai`, `fireworks`, `xai`, ...) document no link
|
|
110
|
+
between effort and cache identity, so their effort settings stay out of the
|
|
111
|
+
projection: including them would fire the modal on a false premise.
|
|
112
|
+
`openai_codex` resolves no cache policy today (`resolve_prompt_cache_policy`
|
|
113
|
+
gates on the `openai` provider), so its entries matter only for checkpointed
|
|
114
|
+
storage until that changes.
|
|
115
|
+
"""
|
|
116
|
+
|
|
93
117
|
_OPENAI_MODEL_VERSION = re.compile(r"^gpt-(?P<major>\d+)(?:\.(?P<minor>\d+))?")
|
|
94
118
|
_DEFAULT_ENDPOINT_PORTS = {"http": 80, "https": 443}
|
|
95
119
|
|
|
@@ -865,23 +889,24 @@ def resolve_prompt_cache_policy(
|
|
|
865
889
|
if provider != "openai" or not endpoint_ok("api.openai.com"):
|
|
866
890
|
return None
|
|
867
891
|
|
|
868
|
-
#
|
|
869
|
-
#
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
892
|
+
# GPT-5.6+ uses `prompt_cache_options.ttl = "30m"`; the legacy
|
|
893
|
+
# `prompt_cache_retention` knob does not extend that family to one or 24
|
|
894
|
+
# hours. OpenAI documents 30 minutes as a guaranteed minimum, so the prefix
|
|
895
|
+
# may still be warm after this window.
|
|
896
|
+
# https://developers.openai.com/api/docs/guides/prompt-caching
|
|
897
|
+
if _openai_uses_thirty_minute_cache(model_name):
|
|
898
|
+
return PromptCachePolicy(
|
|
899
|
+
provider_name="OpenAI",
|
|
900
|
+
window_seconds=1800,
|
|
901
|
+
confidence="may_be_cold",
|
|
902
|
+
minimum_tokens=_OPENAI_MINIMUM_TOKENS,
|
|
903
|
+
write_bucket="generic_write",
|
|
904
|
+
)
|
|
873
905
|
|
|
874
906
|
# `in_memory` and `24h` are documented *maximums* ("up to one hour", "a
|
|
875
907
|
# maximum, not a guarantee"): entries may be evicted earlier, so a warning
|
|
876
908
|
# is only defensible once the maximum has passed -- at which point the
|
|
877
909
|
# entry is gone rather than merely doubtful.
|
|
878
|
-
#
|
|
879
|
-
# Checked before the GPT-5.6+ minimum because the two knobs are
|
|
880
|
-
# independent: `prompt_cache_retention` states a maximum lifetime while the
|
|
881
|
-
# 5.6+ guarantee states a minimum one, and an explicitly configured
|
|
882
|
-
# retention is the later, firmer bound. Warning a user who asked for `24h`
|
|
883
|
-
# at the 30-minute mark would contradict their own configuration.
|
|
884
|
-
# https://platform.openai.com/docs/guides/prompt-caching
|
|
885
910
|
retention = params.get("prompt_cache_retention")
|
|
886
911
|
retention_windows = {"in_memory": 3600, "24h": 86400}
|
|
887
912
|
window = retention_windows.get(retention) if isinstance(retention, str) else None
|
|
@@ -891,41 +916,79 @@ def resolve_prompt_cache_policy(
|
|
|
891
916
|
window_seconds=window,
|
|
892
917
|
confidence="expired",
|
|
893
918
|
minimum_tokens=_OPENAI_MINIMUM_TOKENS,
|
|
894
|
-
write_bucket=
|
|
895
|
-
)
|
|
896
|
-
|
|
897
|
-
if write_bucket == "generic_write":
|
|
898
|
-
# 30 minutes is the documented guaranteed *minimum* for GPT-5.6+ with
|
|
899
|
-
# no explicit retention configured, but OpenAI may retain the prefix
|
|
900
|
-
# longer, so past the window it can only be treated as possibly cold.
|
|
901
|
-
# https://platform.openai.com/docs/guides/prompt-caching
|
|
902
|
-
return PromptCachePolicy(
|
|
903
|
-
provider_name="OpenAI",
|
|
904
|
-
window_seconds=1800,
|
|
905
|
-
confidence="may_be_cold",
|
|
906
|
-
minimum_tokens=_OPENAI_MINIMUM_TOKENS,
|
|
907
|
-
write_bucket=write_bucket,
|
|
919
|
+
write_bucket="generic",
|
|
908
920
|
)
|
|
909
921
|
return None
|
|
910
922
|
|
|
911
923
|
|
|
912
|
-
|
|
924
|
+
_EFFORT_IDENTITY_KEY = "reasoning_effort"
|
|
925
|
+
"""Checkpoint key the effective effort value is projected under.
|
|
926
|
+
|
|
927
|
+
Canonical rather than request-shaped: the identity question is whether the
|
|
928
|
+
effort value changed, not which request shape carried it. Storing the native
|
|
929
|
+
shape would report an identity change for a flat-to-nested representation
|
|
930
|
+
swap that leaves the prefix untouched.
|
|
931
|
+
"""
|
|
932
|
+
|
|
933
|
+
|
|
934
|
+
def _effort_identity_entries(
|
|
935
|
+
model_params: Mapping[str, Any], provider: str
|
|
936
|
+
) -> dict[str, Any]:
|
|
937
|
+
"""Project the provider's effective reasoning effort from `model_params`.
|
|
938
|
+
|
|
939
|
+
Uses the same path resolution and precedence as `/effort`
|
|
940
|
+
(`reasoning_effort._effort_paths`), so native request shapes -- OpenAI's
|
|
941
|
+
nested `reasoning: {"effort": ...}`, Anthropic's `output_config.effort`
|
|
942
|
+
-- participate alongside the canonical flat `reasoning_effort`. Sibling
|
|
943
|
+
keys in nested containers (`reasoning.summary`, say) stay out: they are
|
|
944
|
+
not documented to move the prefix, and including them would fire the
|
|
945
|
+
modal on a false premise.
|
|
946
|
+
|
|
947
|
+
Args:
|
|
948
|
+
model_params: Full invocation params.
|
|
949
|
+
provider: Lowercase provider name from the model spec.
|
|
950
|
+
|
|
951
|
+
Returns:
|
|
952
|
+
`{_EFFORT_IDENTITY_KEY: value}` when an effort setting is present and
|
|
953
|
+
non-`None`, or `{}` when the provider has none configured.
|
|
954
|
+
"""
|
|
955
|
+
from deepagents_code.reasoning_effort import _effort_paths
|
|
956
|
+
|
|
957
|
+
for path in _effort_paths(provider):
|
|
958
|
+
if len(path) == 1:
|
|
959
|
+
if path[0] in model_params and model_params[path[0]] is not None:
|
|
960
|
+
return {_EFFORT_IDENTITY_KEY: model_params[path[0]]}
|
|
961
|
+
else:
|
|
962
|
+
nested = model_params.get(path[0])
|
|
963
|
+
if isinstance(nested, dict) and nested.get(path[1]) is not None:
|
|
964
|
+
return {_EFFORT_IDENTITY_KEY: nested[path[1]]}
|
|
965
|
+
return {}
|
|
966
|
+
|
|
967
|
+
|
|
968
|
+
def cache_identity_params(
|
|
969
|
+
model_params: Mapping[str, Any] | None,
|
|
970
|
+
*,
|
|
971
|
+
model_spec: str | None = None,
|
|
972
|
+
) -> dict[str, Any]:
|
|
913
973
|
"""Project the params that participate in prompt-cache identity.
|
|
914
974
|
|
|
915
975
|
Args:
|
|
916
976
|
model_params: Full invocation params, or `None`.
|
|
977
|
+
model_spec: Optional `provider:model` spec used for model-specific keys.
|
|
917
978
|
|
|
918
979
|
Returns:
|
|
919
|
-
|
|
920
|
-
be compared without unrelated knobs reading as a cache change.
|
|
980
|
+
Cache-identity entries, excluding unrelated invocation knobs.
|
|
921
981
|
"""
|
|
922
982
|
if not model_params:
|
|
923
983
|
return {}
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
if
|
|
928
|
-
|
|
984
|
+
keys = CACHE_IDENTITY_PARAM_KEYS
|
|
985
|
+
if model_spec:
|
|
986
|
+
provider = model_spec.partition(":")[0].strip().lower()
|
|
987
|
+
if provider in _EFFORT_CACHE_IDENTITY_PROVIDERS:
|
|
988
|
+
result = {key: value for key, value in model_params.items() if key in keys}
|
|
989
|
+
result.update(_effort_identity_entries(model_params, provider))
|
|
990
|
+
return result
|
|
991
|
+
return {key: value for key, value in model_params.items() if key in keys}
|
|
929
992
|
|
|
930
993
|
|
|
931
994
|
def estimate_rewarm_cost(
|