deepagents-code 0.1.86__tar.gz → 0.1.87__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.86 → deepagents_code-0.1.87}/CHANGELOG.md +15 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/DEVELOPMENT.md +51 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/PKG-INFO +5 -5
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_build_info.py +1 -1
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_constants.py +1 -1
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_env_vars.py +8 -1
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/app.py +109 -119
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/commands/mcp.py +6 -2
- deepagents_code-0.1.87/deepagents_code/client/headless_resume.py +133 -0
- deepagents_code-0.1.87/deepagents_code/client/launch/_server_bootstrap.py +88 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/launch/server.py +76 -25
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/non_interactive.py +209 -2
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/config_manifest.py +15 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/input.py +31 -12
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/main.py +50 -6
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_auth.py +33 -8
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_config.py +44 -3
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_providers/_registry.py +14 -1
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_providers/slack.py +41 -30
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_tools.py +3 -1
- deepagents_code-0.1.87/deepagents_code/resume_policy.py +161 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/sessions.py +315 -147
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/autocomplete.py +10 -5
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/status.py +2 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/thread_selector.py +551 -159
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/ui.py +1 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/unicode_security.py +13 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/pyproject.toml +5 -5
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/scripts/check_process_cwd.py +3 -0
- deepagents_code-0.1.87/tests/integration_tests/test_headless_resume.py +316 -0
- deepagents_code-0.1.87/tests/integration_tests/test_server_owner_lifetime.py +234 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_app.py +8 -2
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_cache_expiry.py +32 -6
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_config_manifest.py +13 -0
- deepagents_code-0.1.87/tests/unit_tests/test_headless_resume.py +91 -0
- deepagents_code-0.1.87/tests/unit_tests/test_idle_compaction.py +166 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_input_parsing.py +68 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_main_args.py +60 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_auth.py +59 -1
- deepagents_code-0.1.87/tests/unit_tests/test_mcp_config.py +115 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_non_interactive.py +219 -1
- deepagents_code-0.1.87/tests/unit_tests/test_server_pipe.py +148 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_sessions.py +140 -12
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_autocomplete.py +81 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_thread_selector.py +364 -2
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/uv.lock +321 -213
- deepagents_code-0.1.86/tests/unit_tests/test_mcp_config.py +0 -56
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/.gitignore +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/AGENTS.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/ARCHITECTURE.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/COMMANDS.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/EXTENSIONS.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/HOOKS.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/LICENSE +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/Makefile +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/PRICING.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/README.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/THREAT_MODEL.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_async.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_content_blocks.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_debug_buffer.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_dep_floor_check.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_fake_models.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_home_error.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_invocation.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_js_cost.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_markdown.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_paths.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_repository_bounds.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_reserved_names.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_server_config.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_terminal_stderr.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_tool_free.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_tool_stream.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_tracing.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/acp.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/agent.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/approval_mode.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/auto_mode.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/btw.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/btw_api.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/btw_cost.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/built_in_skills/deepagents-plugin-discovery/SKILL.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/bundled_prices.README.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/bundled_prices.json +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/commands/auth.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/commands/config.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/commands/extras.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/commands/tools.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/launch/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/launch/server_manager.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/remote_client.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/session_cost.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/cold_cache.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/command_registry.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/config.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configurable_model.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/interpreter.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/paths.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/provider.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/providers.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/resolver.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/service.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/theme_resolution.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/types.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/writer.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/context_doctor.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/cost_tracking.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/diff_utils.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/doctor.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/api.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/discovery.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/hosting.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/loader.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/registry.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/runtime.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/settings.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/trust.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extras_info.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/goal_rubric.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/goal_state_limits.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/goal_state_notice.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/goal_tools.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/capabilities.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/client.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/client_lifecycle.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/context.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/engine.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/env.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/envelope.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/interrupt.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/legacy.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/loading.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/manager.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/migration.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/models/adapters.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/models/config.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/models/domain.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/models/transport.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/models/wire.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/permissions.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/presenter.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/projection.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/reducer.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/runner.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/runtime.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/server_middleware.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/snapshot.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/tools.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/transcript.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/trust.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/integrations/sandbox_factory.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/json_types.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/managed_tools.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_middleware.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_proxy.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/model_api.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/model_catalog.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/model_config.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/model_metadata.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/model_retry.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/offload.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/offload_api.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/offload_middleware.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/paste_collapse.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/_json.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/adapters/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/adapters/hooks.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/adapters/mcp.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/adapters/skills.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/commands_cli.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/discovery.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/manifest.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/marketplace.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/models.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/store.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/substitution.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/reasoning_effort.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/reliable_rubric.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/server_graph.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/skills/load_errors.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/skills/merge.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/skills/trust.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/system_prompt.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/terminal_title.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/thread_ownership.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/thread_titles.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tool_catalog.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/key_hints.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/_cost_breakdown.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/btw.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/btw.tcss +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/cold_cache.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/cost_breakdown.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/mcp_servers.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/mcp_servers.tcss +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/model_switch.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/prompt_clipboard.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/prompt_clipboard.tcss +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/resume_blocked.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/resume_compact.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/session_cost.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/session_cost.tcss +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/thread_name.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/thread_name.tcss +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/screens/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/textual_adapter.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/_condense_path.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/_links.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/approval.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/ask_user.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/auth.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/chat_input.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/codex_auth.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/context_usage.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/debug_console.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/diff.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/effort_selector.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/goal_review.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/goal_status.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/history.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/install_confirm.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/loading.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/message_store.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/messages.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/model_selector.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/prompt_search.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/skill_trust.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/startup_tip.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/update_available.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/update_confirm.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/welcome.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/update_check.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/workspace.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/workspace_diagnostics.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/examples/extensions/memory_store.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/hatch_build.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/images/debug-console-cost-breakdown.png +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/images/model-stream-retry.png +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/images/tui.png +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/scripts/install.sh +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/README.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/benchmarks/test_thread_loading_benchmarks.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/test_auto_approve_remote.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/test_offload_server_side.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/test_pending_work_recovery.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/client/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/client/commands/test_auth.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/client/commands/test_extras.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/client/commands/test_mcp.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/client/commands/test_tools.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/conftest.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/models/test_models.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_configuration.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_engine.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_execution.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_manager.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_presenter.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_server_lifecycle.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_transcript.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_trust.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/plugins/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/plugins/test_marketplace.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/skills/test_merge.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/skills/test_pinned_skills.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/skills/test_skill_trust.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/smoke_tests/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/smoke_tests/conftest.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/smoke_tests/snapshots/system_prompt_headless_local.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test__tool_stream.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_acp.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_agent.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_agent_mcp_timeout.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_app_thread_ownership.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_approval_mode.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_args.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_ask_user_types.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_auto_mode.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_btw.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_btw_api.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_cli_provider.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_cold_cache.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_config.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_configuration.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_configuration_resolution.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_configuration_resolver.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_context_doctor.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_cost_breakdown.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_cost_tracking.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_cursor_style.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_debug_buffer.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_debug_console.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_dep_floor_check.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_diff_utils.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_doctor.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extension_api.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extension_cli_trust.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extension_config_manifest.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extension_discovery.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extension_display.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extension_host_runtime.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extension_hosting.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extension_runtime.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extra_skills_dirs.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_fork_goal_notice.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_goal_criteria_client.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_goal_rubric.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_goal_state_limits.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_goal_state_notice.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_goal_state_persistence.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_goal_tools.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_groq_tool_limit.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_hatch_build.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_install_command.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_install_script.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_interpreter_workspace_policy.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_invocation.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_js_cost_sync.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_js_cost_tracking.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_json_types.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_main.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_managed_tools.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_lifecycle.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_middleware.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_proxy.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_schema.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_model_catalog.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_model_config.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_model_metadata.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_model_retry.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_offload_api.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_paths.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_process_cwd_check.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_reasoning_effort.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_reliable_rubric.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_repository_bounds.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_resume_compaction_recovery.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_resume_workspace_errors.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_rubric_cli.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_sandbox_registry.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_server.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_server_tracing.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_terminal_stderr.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_terminal_title.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_text_encoding.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_thread_naming_app.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_thread_ownership.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_thread_ownership_transitions.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_thread_titles.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_threads_resume.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_tool_catalog.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_tracing.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_tracing_replicas.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_transcript_virtualization.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_uninstall_command.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_workspace.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_workspace_diagnostics.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tools/test_web_search.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/plugin_manager/test_inspection.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/test_cold_cache.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/test_model_switch.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/test_prompt_clipboard.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/test_resume_blocked.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/test_session_cost.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/test_key_hints.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/test_modal_footer_layout.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_condense_path.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_history.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_links.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_prompt_search.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_status.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
- {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.1.87](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.86...deepagents-code==0.1.87) (2026-10-20)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- Resume threads in non-interactive mode ([#7011](https://github.com/langchain-ai/deepagents/pull/7011)).
|
|
10
|
+
- Compact large idle sessions before the prompt cache expires ([#6956](https://github.com/langchain-ai/deepagents/pull/6956)) and show the prompt-cache expiration time ([#7005](https://github.com/langchain-ai/deepagents/pull/7005)).
|
|
11
|
+
- Support custom Slack OAuth app identity ([#7061](https://github.com/langchain-ai/deepagents/pull/7061)).
|
|
12
|
+
- Load older threads from the thread switcher ([#7051](https://github.com/langchain-ai/deepagents/pull/7051)).
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
- Stop the local server when its owner dies ([#7038](https://github.com/langchain-ai/deepagents/pull/7038)).
|
|
17
|
+
- Support non-ASCII file names in `@` mentions ([#7023](https://github.com/langchain-ai/deepagents/pull/7023)).
|
|
18
|
+
- Correct misleading `/reload` change summaries ([#7063](https://github.com/langchain-ai/deepagents/pull/7063)).
|
|
19
|
+
|
|
5
20
|
## [0.1.86](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.85...deepagents-code==0.1.86) (2026-10-16)
|
|
6
21
|
|
|
7
22
|
### Features
|
|
@@ -69,6 +69,30 @@ make lint
|
|
|
69
69
|
|
|
70
70
|
Run `make help` to see every available target.
|
|
71
71
|
|
|
72
|
+
## Custom Slack MCP app identity
|
|
73
|
+
|
|
74
|
+
Slack's hosted MCP server attributes sent messages to the OAuth app used to connect. To use your own registered Slack app instead of Deep Agents Code, add an `oauth` object to its `.mcp.json` server entry:
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
{
|
|
78
|
+
"mcpServers": {
|
|
79
|
+
"slack": {
|
|
80
|
+
"type": "http",
|
|
81
|
+
"url": "https://mcp.slack.com/mcp",
|
|
82
|
+
"auth": "oauth",
|
|
83
|
+
"oauth": {
|
|
84
|
+
"client_id": "${SLACK_CLIENT_ID}",
|
|
85
|
+
"client_secret": "${SLACK_CLIENT_SECRET}"
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Enable MCP access for your Slack app and register `http://localhost:3118/callback` as its redirect URL. Set the environment variables and run `dcode mcp login slack` to authorize it. Confidential apps use `client_secret_post`; omit `client_secret` only for an app registered as a public client. Keep secrets in environment variables, not committed config. The registration, including any secret, is saved in the existing restricted local token store.
|
|
93
|
+
|
|
94
|
+
Credentials are isolated by server name, URL, and configured client ID, so changing apps requires a separate login and never reuses the default app's grant. Re-run login after rotating a client secret. Omitting `oauth` preserves the existing app and credentials. This selects the authenticated app; it does not let a message supply arbitrary attribution or suppress Slack's footer. These settings apply to dcode; Talon's separate OAuth implementation is unchanged.
|
|
95
|
+
|
|
72
96
|
## LangSmith tracing projects
|
|
73
97
|
|
|
74
98
|
When LangSmith tracing is enabled and a `LANGSMITH_API_KEY` is available, `deepagents-code` traces its own agent runs to LangSmith. A key alone is not enough for environment-supplied keys — set `LANGSMITH_TRACING=true`. Keys stored via `/auth` auto- enable tracing unless you explicitly opt out (for example `DEEPAGENTS_CODE_LANGSMITH_TRACING=false`).
|
|
@@ -91,6 +115,33 @@ When onboarding a new tracing project to Engine, capture the nature of that proj
|
|
|
91
115
|
|
|
92
116
|
A server keeps the first workspace's tracing configuration for its lifetime. Workspaces sharing that server must use matching tracing credentials, projects, endpoints, profile selectors, tracing flags, and redaction policy. A conflicting workspace is refused before its settings can affect cached or concurrent runs; start a separate server for that workspace. Restart the server to change its tracing configuration.
|
|
93
117
|
|
|
118
|
+
## Idle context compaction
|
|
119
|
+
|
|
120
|
+
Idle compaction is disabled by default. When enabled, the interactive client
|
|
121
|
+
automatically uses the existing `/offload` operation for contexts at or above
|
|
122
|
+
the configured token threshold during the final 20% of a known prompt-cache
|
|
123
|
+
retention window, capped at 120 seconds (60 seconds for a 5-minute window). This keeps the same thread and archives older
|
|
124
|
+
messages; it does not create a handoff thread. The configured offload model is
|
|
125
|
+
used, so summarization can incur costs and cache reuse is not guaranteed.
|
|
126
|
+
|
|
127
|
+
Opt in with a token threshold through the normal layered config:
|
|
128
|
+
|
|
129
|
+
```toml
|
|
130
|
+
[history]
|
|
131
|
+
idle_compaction_tokens = 100000
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Alternatively, set `DEEPAGENTS_CODE_IDLE_COMPACTION_TOKENS=100000` before
|
|
135
|
+
launching dcode.
|
|
136
|
+
|
|
137
|
+
Set `idle_compaction_tokens = 0` to disable it again. File edits take effect after
|
|
138
|
+
`/reload`. This setting is independent of cold-cache warning preferences.
|
|
139
|
+
Compaction skips busy sessions, queued input, active typing, modals, lifecycle
|
|
140
|
+
transitions, and approximate token counts. It attempts at most once per thread
|
|
141
|
+
and cache window, announces the operation, and supports Escape cancellation.
|
|
142
|
+
Input arriving before the worker starts skips compaction; input arriving after
|
|
143
|
+
it starts uses the normal offload queue and runs once compaction finishes.
|
|
144
|
+
|
|
94
145
|
## Debugging
|
|
95
146
|
|
|
96
147
|
Deep Agents Code runs as two processes: the **Textual TUI** you interact with, and a **`langgraph dev` subprocess** that hosts the agent graph. Each writes its own log, and a single switch turns both on:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.87
|
|
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
|
|
@@ -30,7 +30,7 @@ Requires-Python: <4.0,>=3.12
|
|
|
30
30
|
Requires-Dist: aiosqlite<1.0.0,>=0.22.1
|
|
31
31
|
Requires-Dist: anyio<5.0.0,>=4.14.2
|
|
32
32
|
Requires-Dist: deepagents-acp<1.0.0,>=0.0.10
|
|
33
|
-
Requires-Dist: deepagents==0.7.
|
|
33
|
+
Requires-Dist: deepagents==0.7.29
|
|
34
34
|
Requires-Dist: fastmcp<5.0.0,>=4.0.0b4
|
|
35
35
|
Requires-Dist: filelock<3.30,>=3.29.7
|
|
36
36
|
Requires-Dist: genai-prices<0.2.0,>=0.1.13
|
|
@@ -41,9 +41,9 @@ Requires-Dist: langchain-openai<2.0.0,>=1.7.2
|
|
|
41
41
|
Requires-Dist: langchain-quickjs<0.4.0,>=0.3.4
|
|
42
42
|
Requires-Dist: langchain<2.0.0,>=1.4.6
|
|
43
43
|
Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.2
|
|
44
|
-
Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.
|
|
45
|
-
Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.36.
|
|
46
|
-
Requires-Dist: langgraph-sdk<1.0.0,>=0.4.
|
|
44
|
+
Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.37
|
|
45
|
+
Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.36.2
|
|
46
|
+
Requires-Dist: langgraph-sdk<1.0.0,>=0.4.8
|
|
47
47
|
Requires-Dist: langsmith[sandbox]>=0.14.11
|
|
48
48
|
Requires-Dist: markdownify<2.0.0,>=1.2.3
|
|
49
49
|
Requires-Dist: mcp<3.0.0,>=2.0.0
|
|
@@ -14,7 +14,7 @@ DEFAULT_AGENT_NAME: Final[str] = "agent"
|
|
|
14
14
|
"""Default agent / assistant identifier when no `-a` flag is given."""
|
|
15
15
|
|
|
16
16
|
DEFAULT_THREAD_LIMIT: Final[int] = 100
|
|
17
|
-
"""Fallback
|
|
17
|
+
"""Fallback for `get_thread_limit()`, the thread switcher batch size."""
|
|
18
18
|
|
|
19
19
|
FS_TOOL_NAMES: Final[frozenset[str]] = frozenset(
|
|
20
20
|
{"ls", "read_file", "write_file", "edit_file", "delete", "glob", "grep", "execute"}
|
|
@@ -328,6 +328,9 @@ HIDE_SPLASH_TIPS = "DEEPAGENTS_CODE_HIDE_SPLASH_TIPS"
|
|
|
328
328
|
HIDE_SPLASH_VERSION = "DEEPAGENTS_CODE_HIDE_SPLASH_VERSION"
|
|
329
329
|
"""Hide version and local-install details in the splash screen when enabled."""
|
|
330
330
|
|
|
331
|
+
IDLE_COMPACTION_TOKENS = "DEEPAGENTS_CODE_IDLE_COMPACTION_TOKENS"
|
|
332
|
+
"""Minimum context tokens for opt-in idle compaction; 0 disables it."""
|
|
333
|
+
|
|
331
334
|
HISTORY_RETENTION_DAYS = "DEEPAGENTS_CODE_HISTORY_RETENTION_DAYS"
|
|
332
335
|
"""Days an offloaded conversation-history archive is kept before the startup
|
|
333
336
|
sweep deletes it.
|
|
@@ -514,7 +517,11 @@ repo file, so a project `.env` cannot disable itself.
|
|
|
514
517
|
"""
|
|
515
518
|
|
|
516
519
|
RECENT_THREADS = "DEEPAGENTS_CODE_RECENT_THREADS"
|
|
517
|
-
"""
|
|
520
|
+
"""Recent threads per batch (default: 100, `_constants.DEFAULT_THREAD_LIMIT`).
|
|
521
|
+
|
|
522
|
+
The thread switcher loads this many at a time. It is also the default row
|
|
523
|
+
limit for `threads list` (override with `-n`) and `@@` thread completion.
|
|
524
|
+
"""
|
|
518
525
|
|
|
519
526
|
RECURSION_LIMIT = "DEEPAGENTS_CODE_RECURSION_LIMIT"
|
|
520
527
|
"""Override the main agent's LangGraph `recursion_limit` (graph step budget).
|
|
@@ -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.87" # 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."""
|
|
@@ -2111,6 +2111,9 @@ Two seconds balances responsiveness with avoiding accidental approval
|
|
|
2111
2111
|
key presses.
|
|
2112
2112
|
"""
|
|
2113
2113
|
|
|
2114
|
+
_IDLE_COMPACTION_LEAD_SECONDS = 120
|
|
2115
|
+
"""Lead time for automatic idle context compaction."""
|
|
2116
|
+
|
|
2114
2117
|
_CACHE_EXPIRING_LEAD_SECONDS = 60
|
|
2115
2118
|
"""Lead time for the prompt-cache retention notification."""
|
|
2116
2119
|
|
|
@@ -4579,6 +4582,7 @@ class DeepAgentsApp(App):
|
|
|
4579
4582
|
)
|
|
4580
4583
|
"""Minimum estimated cold-versus-warm cost delta that opens the modal."""
|
|
4581
4584
|
|
|
4585
|
+
self._idle_compaction_seen: dict[str, datetime] = {}
|
|
4582
4586
|
self._cache_expiring_seen: dict[str, datetime] = {}
|
|
4583
4587
|
self._cache_expiring_worker: Worker[None] | None = None
|
|
4584
4588
|
|
|
@@ -6016,16 +6020,9 @@ class DeepAgentsApp(App):
|
|
|
6016
6020
|
Returns:
|
|
6017
6021
|
A short user-facing provenance and rationale sentence.
|
|
6018
6022
|
"""
|
|
6019
|
-
|
|
6020
|
-
|
|
6021
|
-
|
|
6022
|
-
owner = "This policy was set in your config.toml"
|
|
6023
|
-
else:
|
|
6024
|
-
owner = "This policy was set by active configuration"
|
|
6025
|
-
return (
|
|
6026
|
-
f"{owner} to keep older threads from restoring stale context after "
|
|
6027
|
-
"model or policy changes."
|
|
6028
|
-
)
|
|
6023
|
+
from deepagents_code.resume_policy import resume_cutoff_explanation
|
|
6024
|
+
|
|
6025
|
+
return resume_cutoff_explanation(source)
|
|
6029
6026
|
|
|
6030
6027
|
@staticmethod
|
|
6031
6028
|
def _resume_cutoff() -> tuple[datetime, str, bool] | None:
|
|
@@ -6034,69 +6031,16 @@ class DeepAgentsApp(App):
|
|
|
6034
6031
|
Returns:
|
|
6035
6032
|
The cutoff, its source, and whether it is rolling, or `None`.
|
|
6036
6033
|
"""
|
|
6037
|
-
from deepagents_code.
|
|
6038
|
-
_emit_ranked_diagnostics,
|
|
6039
|
-
_ranked_source,
|
|
6040
|
-
get_option,
|
|
6041
|
-
parse_duration_seconds,
|
|
6042
|
-
)
|
|
6043
|
-
from deepagents_code.configuration.resolver import get_config_resolver
|
|
6034
|
+
from deepagents_code.resume_policy import resume_cutoff
|
|
6044
6035
|
|
|
6045
|
-
|
|
6046
|
-
cutoffs: list[tuple[datetime, str, bool]] = []
|
|
6047
|
-
for key in ("threads.resume_after", "threads.max_resume_age"):
|
|
6048
|
-
option = get_option(key)
|
|
6049
|
-
if option is None:
|
|
6050
|
-
continue
|
|
6051
|
-
resolved = resolver.get(option)
|
|
6052
|
-
_emit_ranked_diagnostics(option, resolved)
|
|
6053
|
-
value = resolved.value
|
|
6054
|
-
if key.endswith("resume_after") and isinstance(value, str):
|
|
6055
|
-
cutoffs.append(
|
|
6056
|
-
(datetime.fromisoformat(value), _ranked_source(resolved), False)
|
|
6057
|
-
)
|
|
6058
|
-
elif key.endswith("max_resume_age") and isinstance(value, str):
|
|
6059
|
-
seconds = parse_duration_seconds(value)
|
|
6060
|
-
if seconds is not None:
|
|
6061
|
-
cutoff = datetime.min.replace(tzinfo=UTC)
|
|
6062
|
-
with suppress(OverflowError):
|
|
6063
|
-
cutoff = datetime.now(UTC) - timedelta(seconds=seconds)
|
|
6064
|
-
cutoffs.append((cutoff, _ranked_source(resolved), True))
|
|
6065
|
-
return max(cutoffs, default=None)
|
|
6036
|
+
return resume_cutoff()
|
|
6066
6037
|
|
|
6067
6038
|
@staticmethod
|
|
6068
6039
|
async def _thread_resume_block(thread_id: str) -> str | None:
|
|
6069
6040
|
"""Return why configured policy blocks resuming a thread, if applicable."""
|
|
6070
|
-
from deepagents_code.
|
|
6071
|
-
from deepagents_code.sessions import get_thread_updated_at
|
|
6041
|
+
from deepagents_code.resume_policy import thread_resume_block
|
|
6072
6042
|
|
|
6073
|
-
|
|
6074
|
-
if policy is None:
|
|
6075
|
-
return None
|
|
6076
|
-
cutoff, source, rolling = policy
|
|
6077
|
-
explanation = DeepAgentsApp._resume_cutoff_explanation(source)
|
|
6078
|
-
updated_value = await get_thread_updated_at(thread_id)
|
|
6079
|
-
normalized = normalize_iso_datetime(updated_value)
|
|
6080
|
-
if normalized is None:
|
|
6081
|
-
logger.warning(
|
|
6082
|
-
"Blocking resume for thread %s: missing or invalid updated_at %r",
|
|
6083
|
-
thread_id,
|
|
6084
|
-
updated_value,
|
|
6085
|
-
)
|
|
6086
|
-
return (
|
|
6087
|
-
f"Thread {thread_id} cannot be resumed because its last-updated "
|
|
6088
|
-
f"time could not be verified.\n\n{explanation}"
|
|
6089
|
-
)
|
|
6090
|
-
if datetime.fromisoformat(normalized) >= cutoff:
|
|
6091
|
-
return None
|
|
6092
|
-
reason = (
|
|
6093
|
-
"it is older than the configured maximum age"
|
|
6094
|
-
if rolling
|
|
6095
|
-
else f"it was last updated before {cutoff.isoformat()}"
|
|
6096
|
-
)
|
|
6097
|
-
return (
|
|
6098
|
-
f"Thread {thread_id} cannot be resumed because {reason}.\n\n{explanation}"
|
|
6099
|
-
)
|
|
6043
|
+
return await thread_resume_block(thread_id, DeepAgentsApp._resume_cutoff())
|
|
6100
6044
|
|
|
6101
6045
|
def _reserve_thread(self, thread_id: str) -> None:
|
|
6102
6046
|
"""Reserve a locally managed thread before reading or adopting it."""
|
|
@@ -9758,29 +9702,72 @@ class DeepAgentsApp(App):
|
|
|
9758
9702
|
banners = self.screen_stack[0].query("#cache-expired-banner")
|
|
9759
9703
|
if banners:
|
|
9760
9704
|
expires_at = self._status_bar.cache_expires_at if self._status_bar else None
|
|
9761
|
-
banners.first()
|
|
9705
|
+
banner = banners.first(Static)
|
|
9706
|
+
banner.display = (
|
|
9762
9707
|
not self._cache_reconciliation_pending
|
|
9763
9708
|
and expires_at is not None
|
|
9764
9709
|
and datetime.now(UTC) >= expires_at
|
|
9765
9710
|
)
|
|
9711
|
+
if banner.display and expires_at is not None:
|
|
9712
|
+
expired_at = expires_at.astimezone().strftime("%H:%M:%S")
|
|
9713
|
+
elapsed = datetime.now(UTC) - expires_at
|
|
9714
|
+
age = "just now"
|
|
9715
|
+
for unit in ("day", "hour", "minute"):
|
|
9716
|
+
count = elapsed // timedelta(**{f"{unit}s": 1})
|
|
9717
|
+
if count:
|
|
9718
|
+
age = f"{count} {unit}{'s' if count != 1 else ''} ago"
|
|
9719
|
+
break
|
|
9720
|
+
banner.update(f"Prompt cache expired at {expired_at} ({age})")
|
|
9766
9721
|
|
|
9767
|
-
def
|
|
9768
|
-
"""
|
|
9722
|
+
def _check_idle_compaction(self) -> None:
|
|
9723
|
+
"""Reserve one offload per warm cache window, without yielding to input."""
|
|
9724
|
+
from deepagents_code.config_manifest import get_option
|
|
9725
|
+
from deepagents_code.configuration.resolver import get_config_resolver
|
|
9769
9726
|
|
|
9770
|
-
|
|
9771
|
-
|
|
9772
|
-
"""
|
|
9773
|
-
self._refresh_cache_expiry_banner()
|
|
9727
|
+
option = get_option("history.idle_compaction_tokens")
|
|
9728
|
+
threshold = get_config_resolver().get(option).value if option else 0
|
|
9774
9729
|
expires_at = self._status_bar.cache_expires_at if self._status_bar else None
|
|
9730
|
+
window = self._status_bar.cache_window_seconds if self._status_bar else None
|
|
9731
|
+
lead = min(window * 0.2, _IDLE_COMPACTION_LEAD_SECONDS) if window else 0
|
|
9775
9732
|
thread_id = self._lc_thread_id
|
|
9776
9733
|
if (
|
|
9777
|
-
|
|
9734
|
+
not isinstance(threshold, int)
|
|
9735
|
+
or threshold <= 0
|
|
9736
|
+
or self._tokens_approximate
|
|
9737
|
+
or self._context_tokens < threshold
|
|
9778
9738
|
or not thread_id
|
|
9779
|
-
or
|
|
9780
|
-
or self.
|
|
9781
|
-
or not
|
|
9739
|
+
or expires_at is None
|
|
9740
|
+
or self._idle_compaction_seen.get(thread_id) == expires_at
|
|
9741
|
+
or not 0 < (expires_at - datetime.now(UTC)).total_seconds() <= lead
|
|
9742
|
+
or not self._cache_maintenance_idle()
|
|
9743
|
+
or self._remote_agent() is None
|
|
9744
|
+
):
|
|
9745
|
+
return
|
|
9746
|
+
self._idle_compaction_seen[thread_id] = expires_at
|
|
9747
|
+
self._set_agent_running(True)
|
|
9748
|
+
try:
|
|
9749
|
+
self._offload_worker = self.run_worker(
|
|
9750
|
+
self._run_offload_task(idle_window=(thread_id, expires_at)),
|
|
9751
|
+
group="offload",
|
|
9752
|
+
exit_on_error=False,
|
|
9753
|
+
)
|
|
9754
|
+
except Exception:
|
|
9755
|
+
self._set_agent_running(False)
|
|
9756
|
+
logger.exception("Failed to schedule idle compaction")
|
|
9757
|
+
|
|
9758
|
+
def _cache_maintenance_idle(self, *, reserved: bool = False) -> bool:
|
|
9759
|
+
"""Require a quiescent UI before automatic cache maintenance.
|
|
9760
|
+
|
|
9761
|
+
Args:
|
|
9762
|
+
reserved: Ignore the automatic offload's own busy reservation.
|
|
9763
|
+
|
|
9764
|
+
Returns:
|
|
9765
|
+
Whether no UI activity competes with cache maintenance.
|
|
9766
|
+
"""
|
|
9767
|
+
return not (
|
|
9768
|
+
not self._agent
|
|
9782
9769
|
or not self._session_state
|
|
9783
|
-
or self._agent_running
|
|
9770
|
+
or (self._agent_running and not reserved)
|
|
9784
9771
|
or self._agent_reconciling
|
|
9785
9772
|
or self._goal_state_mutating
|
|
9786
9773
|
or self._shell_running
|
|
@@ -9796,6 +9783,25 @@ class DeepAgentsApp(App):
|
|
|
9796
9783
|
or self._reloading
|
|
9797
9784
|
or self._exiting
|
|
9798
9785
|
or isinstance(self.screen, ModalScreen)
|
|
9786
|
+
or self._cache_reconciliation_pending
|
|
9787
|
+
)
|
|
9788
|
+
|
|
9789
|
+
def _check_cache_expiry(self) -> None:
|
|
9790
|
+
"""Offer a handoff once per expired cache window, only when idle.
|
|
9791
|
+
|
|
9792
|
+
Polled every second from `on_mount`. Acts only when
|
|
9793
|
+
`warnings.cache_prompt` is `expiry` and no cold-cache opt-out applies.
|
|
9794
|
+
"""
|
|
9795
|
+
self._refresh_cache_expiry_banner()
|
|
9796
|
+
self._check_idle_compaction()
|
|
9797
|
+
expires_at = self._status_bar.cache_expires_at if self._status_bar else None
|
|
9798
|
+
thread_id = self._lc_thread_id
|
|
9799
|
+
if (
|
|
9800
|
+
expires_at is None
|
|
9801
|
+
or not thread_id
|
|
9802
|
+
or datetime.now(UTC) < expires_at
|
|
9803
|
+
or self._cache_expiry_seen.get(thread_id) == expires_at
|
|
9804
|
+
or not self._cache_maintenance_idle()
|
|
9799
9805
|
):
|
|
9800
9806
|
return
|
|
9801
9807
|
if (
|
|
@@ -18310,7 +18316,7 @@ class DeepAgentsApp(App):
|
|
|
18310
18316
|
f" - {change}" for change in changes
|
|
18311
18317
|
)
|
|
18312
18318
|
else:
|
|
18313
|
-
report = "Configuration reloaded.
|
|
18319
|
+
report = "Configuration reloaded."
|
|
18314
18320
|
report += "\nModel config caches cleared."
|
|
18315
18321
|
if theme_reload_ok:
|
|
18316
18322
|
report += "\nTheme registry reloaded."
|
|
@@ -18803,10 +18809,26 @@ class DeepAgentsApp(App):
|
|
|
18803
18809
|
ErrorMessage(f"Offload failed: {format_agent_exception(exc)}")
|
|
18804
18810
|
)
|
|
18805
18811
|
|
|
18806
|
-
async def _run_offload_task(
|
|
18812
|
+
async def _run_offload_task(
|
|
18813
|
+
self, *, idle_window: tuple[str, datetime] | None = None
|
|
18814
|
+
) -> None:
|
|
18807
18815
|
"""Run a synchronously reserved `/offload` outside the App message pump."""
|
|
18808
18816
|
self._offload_task_started = True
|
|
18809
18817
|
try:
|
|
18818
|
+
if idle_window is not None:
|
|
18819
|
+
if (
|
|
18820
|
+
self._lc_thread_id != idle_window[0]
|
|
18821
|
+
or not self._status_bar
|
|
18822
|
+
or self._status_bar.cache_expires_at != idle_window[1]
|
|
18823
|
+
or datetime.now(UTC) >= idle_window[1]
|
|
18824
|
+
or not self._cache_maintenance_idle(reserved=True)
|
|
18825
|
+
):
|
|
18826
|
+
self._set_agent_running(False)
|
|
18827
|
+
return
|
|
18828
|
+
self.notify(
|
|
18829
|
+
"Compacting idle context before cache expiry.",
|
|
18830
|
+
markup=False,
|
|
18831
|
+
)
|
|
18810
18832
|
await self._handle_offload(reserved=True)
|
|
18811
18833
|
finally:
|
|
18812
18834
|
self._offload_task_started = False
|
|
@@ -30632,46 +30654,14 @@ class DeepAgentsApp(App):
|
|
|
30632
30654
|
) -> tuple[Literal["match", "unavailable", "mismatch"], Path | None]:
|
|
30633
30655
|
"""Classify a stored thread cwd against the current app cwd.
|
|
30634
30656
|
|
|
30635
|
-
|
|
30636
|
-
raw: The cwd recorded in the thread's checkpoint metadata. May be
|
|
30637
|
-
relative or use `~`; both are normalized here.
|
|
30638
|
-
current_cwd: The app's current working directory.
|
|
30657
|
+
See `resume_policy.classify_thread_cwd`.
|
|
30639
30658
|
|
|
30640
30659
|
Returns:
|
|
30641
|
-
A `(status, path)` pair
|
|
30642
|
-
|
|
30643
|
-
|
|
30644
|
-
|
|
30645
|
-
|
|
30646
|
-
absolute directory that no longer exists — it cannot be honored,
|
|
30647
|
-
so the caller should warn and stay put.
|
|
30648
|
-
- `"mismatch"`: the stored cwd is a real directory that differs from
|
|
30649
|
-
the current cwd — the caller should offer to switch.
|
|
30650
|
-
"""
|
|
30651
|
-
target = Path(raw).expanduser()
|
|
30652
|
-
if not target.is_absolute() or not target.is_dir():
|
|
30653
|
-
# Relative/malformed or missing directory: cannot be honored.
|
|
30654
|
-
return "unavailable", None
|
|
30655
|
-
try:
|
|
30656
|
-
current = Path(current_cwd).expanduser().resolve()
|
|
30657
|
-
resolved = target.resolve()
|
|
30658
|
-
except OSError:
|
|
30659
|
-
# Symlink resolution failed (e.g. ELOOP, permission on a path
|
|
30660
|
-
# component). Fall back to a non-resolving comparison, which can
|
|
30661
|
-
# report a spurious mismatch for symlinked-but-equal paths; log so
|
|
30662
|
-
# the degraded comparison is traceable.
|
|
30663
|
-
logger.debug(
|
|
30664
|
-
"Could not resolve cwd paths for mismatch check (%r vs %r); "
|
|
30665
|
-
"falling back to non-resolving comparison",
|
|
30666
|
-
current_cwd,
|
|
30667
|
-
raw,
|
|
30668
|
-
exc_info=True,
|
|
30669
|
-
)
|
|
30670
|
-
current = Path(current_cwd).expanduser().absolute()
|
|
30671
|
-
resolved = target.absolute()
|
|
30672
|
-
if current == resolved:
|
|
30673
|
-
return "match", None
|
|
30674
|
-
return "mismatch", resolved
|
|
30660
|
+
A `(status, path)` pair; `path` is set only for `"mismatch"`.
|
|
30661
|
+
"""
|
|
30662
|
+
from deepagents_code.resume_policy import classify_thread_cwd
|
|
30663
|
+
|
|
30664
|
+
return classify_thread_cwd(raw, current_cwd)
|
|
30675
30665
|
|
|
30676
30666
|
async def _thread_cwd_mismatch(self, thread_id: str) -> Path | None:
|
|
30677
30667
|
"""Return the thread cwd when it differs from the current app cwd."""
|
|
@@ -152,14 +152,18 @@ async def run_mcp_login_list(*, config_path: str | None) -> int:
|
|
|
152
152
|
continue
|
|
153
153
|
try:
|
|
154
154
|
resolved_config = resolve_mcp_server_env(server_name, server_config)
|
|
155
|
-
except (RuntimeError, TypeError) as exc:
|
|
155
|
+
except (RuntimeError, TypeError, ValueError) as exc:
|
|
156
156
|
print( # noqa: T201
|
|
157
157
|
f"Invalid MCP server config for {server_name!r}: {exc}",
|
|
158
158
|
file=sys.stderr,
|
|
159
159
|
)
|
|
160
160
|
unreadable += 1
|
|
161
161
|
continue
|
|
162
|
-
storage = FileTokenStorage(
|
|
162
|
+
storage = FileTokenStorage(
|
|
163
|
+
server_name,
|
|
164
|
+
server_url=resolved_config["url"],
|
|
165
|
+
oauth_client_id=(resolved_config.get("oauth") or {}).get("client_id"),
|
|
166
|
+
)
|
|
163
167
|
try:
|
|
164
168
|
tokens = await storage.get_tokens()
|
|
165
169
|
except (OSError, RuntimeError, ValueError) as exc:
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"""Resolve `dcode -r <id> -n ...` into a thread the headless run may continue.
|
|
2
|
+
|
|
3
|
+
Headless resume never falls back to a new thread. Threads stay bound to the
|
|
4
|
+
workspace policy they were created with, so only threads started headless from
|
|
5
|
+
the same directory with the same flags can be resumed here.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from collections.abc import Mapping
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class ResumeRequest:
|
|
19
|
+
"""An explicit `-r <id>` resume request from the command line."""
|
|
20
|
+
|
|
21
|
+
thread_id: str
|
|
22
|
+
|
|
23
|
+
adopt_agent: bool
|
|
24
|
+
"""Use the thread's agent; `False` when `-a` was given."""
|
|
25
|
+
|
|
26
|
+
adopt_model: bool
|
|
27
|
+
"""Use the thread's last model; `False` when `-M` was given."""
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass(frozen=True)
|
|
31
|
+
class ResumeTarget:
|
|
32
|
+
"""A thread that exists and passes the resume-age policy."""
|
|
33
|
+
|
|
34
|
+
thread_id: str
|
|
35
|
+
agent_name: str | None
|
|
36
|
+
cwd: str | None
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class ResumeError(Exception):
|
|
40
|
+
"""A user-facing reason the requested thread cannot be resumed."""
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
WORKSPACE_CONFLICT_MESSAGE = (
|
|
44
|
+
"Couldn't resume this thread because it was created with different "
|
|
45
|
+
"settings. A thread keeps the directory, agent, approval, shell, sandbox, "
|
|
46
|
+
"and MCP settings it started with, so threads from the interactive UI "
|
|
47
|
+
"can't be resumed with -n. Rerun from the same directory with the same "
|
|
48
|
+
"flags as the run that created it."
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
async def resolve_resume_target(thread_id: str) -> ResumeTarget:
|
|
53
|
+
"""Look up a thread to resume and enforce the resume-age policy.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
thread_id: The exact thread ID given to `-r`.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
The thread's persisted agent and directory.
|
|
60
|
+
|
|
61
|
+
Raises:
|
|
62
|
+
ResumeError: The thread is missing or blocked by policy.
|
|
63
|
+
"""
|
|
64
|
+
from deepagents_code.resume_policy import resume_cutoff, thread_resume_block
|
|
65
|
+
from deepagents_code.sessions import (
|
|
66
|
+
find_similar_threads,
|
|
67
|
+
get_thread_agent,
|
|
68
|
+
get_thread_cwd,
|
|
69
|
+
thread_exists,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
if not await thread_exists(thread_id):
|
|
73
|
+
similar = await find_similar_threads(thread_id)
|
|
74
|
+
msg = f"Thread '{thread_id}' not found."
|
|
75
|
+
if similar:
|
|
76
|
+
msg += f" Did you mean: {', '.join(similar)}?"
|
|
77
|
+
raise ResumeError(msg)
|
|
78
|
+
if blocked := await thread_resume_block(thread_id, resume_cutoff()):
|
|
79
|
+
raise ResumeError(blocked)
|
|
80
|
+
return ResumeTarget(
|
|
81
|
+
thread_id=thread_id,
|
|
82
|
+
agent_name=await get_thread_agent(thread_id),
|
|
83
|
+
cwd=await get_thread_cwd(thread_id),
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def cwd_conflict(target: ResumeTarget, current_cwd: str) -> str | None:
|
|
88
|
+
"""Explain why `target` cannot be resumed from `current_cwd`.
|
|
89
|
+
|
|
90
|
+
The server refuses a directory change through the thread's workspace
|
|
91
|
+
binding; checking first turns that generic refusal into a specific message.
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
A user-facing message, or `None` when the directories match.
|
|
95
|
+
"""
|
|
96
|
+
from deepagents_code.resume_policy import classify_thread_cwd
|
|
97
|
+
|
|
98
|
+
if not target.cwd:
|
|
99
|
+
return None
|
|
100
|
+
status, path = classify_thread_cwd(target.cwd, current_cwd)
|
|
101
|
+
if status == "mismatch":
|
|
102
|
+
return (
|
|
103
|
+
f"Thread {target.thread_id} belongs to {path}. "
|
|
104
|
+
"Run from that directory to resume it."
|
|
105
|
+
)
|
|
106
|
+
if status == "unavailable":
|
|
107
|
+
return (
|
|
108
|
+
f"Thread {target.thread_id} was last used in {target.cwd!r}, "
|
|
109
|
+
"which is no longer available, so it can't be resumed."
|
|
110
|
+
)
|
|
111
|
+
return None
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def persisted_model(
|
|
115
|
+
values: Mapping[str, object],
|
|
116
|
+
) -> tuple[str, dict[str, Any] | None] | None:
|
|
117
|
+
"""Read the model a thread last ran with from its checkpoint values.
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
The `(spec, params)` pair, or `None` when no model is recorded.
|
|
121
|
+
"""
|
|
122
|
+
from deepagents_code.resume_state import coerce_model_spec
|
|
123
|
+
|
|
124
|
+
spec = coerce_model_spec(values.get("_model_spec"))
|
|
125
|
+
if spec is None:
|
|
126
|
+
return None
|
|
127
|
+
raw_params = values.get("_model_params")
|
|
128
|
+
params = (
|
|
129
|
+
dict(cast("dict[str, Any]", raw_params))
|
|
130
|
+
if isinstance(raw_params, dict)
|
|
131
|
+
else None
|
|
132
|
+
)
|
|
133
|
+
return spec, params
|