deepagents-code 0.1.62__tar.gz → 0.1.63__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.62 → deepagents_code-0.1.63}/AGENTS.md +2 -2
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/CHANGELOG.md +16 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/COMMANDS.md +2 -2
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/PKG-INFO +1 -1
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/THREAT_MODEL.md +8 -2
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_build_info.py +1 -1
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_server_config.py +16 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_session_stats.py +109 -11
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/agent.py +122 -12
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/app.py +625 -142
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/auto_mode.py +74 -32
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/launch/server.py +112 -27
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/launch/server_manager.py +6 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/non_interactive.py +39 -3
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/command_registry.py +2 -2
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/config.py +474 -203
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/config_manifest.py +2 -2
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configurable_model.py +38 -14
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/providers.py +757 -1
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/resolver.py +87 -21
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/service.py +228 -43
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/types.py +87 -1
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/writer.py +8 -7
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/cost_tracking.py +83 -9
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/doctor.py +67 -17
- deepagents_code-0.1.63/deepagents_code/extensions/__init__.py +5 -0
- deepagents_code-0.1.63/deepagents_code/extensions/api.py +188 -0
- deepagents_code-0.1.63/deepagents_code/extensions/discovery.py +205 -0
- deepagents_code-0.1.63/deepagents_code/extensions/registry.py +228 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/goal_rubric.py +27 -2
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/main.py +95 -10
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/model_config.py +64 -36
- deepagents_code-0.1.63/deepagents_code/model_retry.py +886 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/offload_api.py +90 -2
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/offload_middleware.py +94 -2
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/manifest.py +56 -6
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/models.py +3 -0
- deepagents_code-0.1.63/deepagents_code/reliable_rubric.py +136 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/server_graph.py +7 -1
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/textual_adapter.py +61 -15
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/auth.py +18 -3
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/diff.py +433 -11
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/model_selector.py +1 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/ui.py +1 -1
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/pyproject.toml +5 -2
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/test_offload_server_side.py +87 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_agent.py +276 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_app.py +1154 -15
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_auto_mode.py +137 -1
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_charset.py +22 -16
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_compact_tool.py +101 -3
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_config.py +380 -250
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_configurable_model.py +65 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_configuration.py +4465 -1991
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_configuration_resolver.py +275 -1
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_cost_tracking.py +98 -2
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_debug_console.py +35 -0
- deepagents_code-0.1.63/tests/unit_tests/test_extension_api.py +198 -0
- deepagents_code-0.1.63/tests/unit_tests/test_extension_discovery.py +180 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_goal_rubric.py +29 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_main_acp_mode.py +13 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_main_args.py +134 -29
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_model_config.py +3 -3
- deepagents_code-0.1.63/tests/unit_tests/test_model_retry.py +1482 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_model_switch.py +7 -3
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_non_interactive.py +58 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_offload_api.py +190 -1
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_reliable_rubric.py +140 -127
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_reload.py +110 -3
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_server.py +125 -19
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_server_config.py +40 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_server_graph.py +38 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_session_stats.py +115 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_startup_fast_paths.py +23 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_tool_catalog.py +5 -2
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/test_textual_adapter.py +181 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_auth_widgets.py +112 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_autocomplete.py +3 -3
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_diff.py +360 -17
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/uv.lock +1 -1
- deepagents_code-0.1.62/deepagents_code/reliable_rubric.py +0 -238
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/.gitignore +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/ARCHITECTURE.md +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/DEVELOPMENT.md +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/HOOKS.md +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/LICENSE +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/Makefile +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/PRICING.md +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/README.md +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_debug_buffer.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_dep_floor_check.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_env_vars.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_fake_models.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_home_error.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_invocation.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_markdown.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_paths.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_repository_bounds.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_reserved_names.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_terminal_stderr.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_tool_stream.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_tracing.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/acp.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/approval_mode.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/bundled_prices.README.md +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/bundled_prices.json +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/commands/auth.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/commands/config.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/commands/extras.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/commands/mcp.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/commands/tools.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/launch/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/remote_client.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/cold_cache.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/paths.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/provider.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/theme_resolution.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/context_doctor.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/diff_utils.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/extras_info.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/goal_state_limits.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/goal_state_notice.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/goal_tools.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/capabilities.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/client.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/client_lifecycle.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/context.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/engine.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/env.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/envelope.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/interrupt.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/legacy.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/loading.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/manager.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/migration.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/models/adapters.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/models/config.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/models/domain.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/models/transport.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/models/wire.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/permissions.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/presenter.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/projection.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/reducer.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/runner.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/runtime.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/server_middleware.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/snapshot.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/tools.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/transcript.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/trust.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/integrations/sandbox_factory.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/json_types.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/managed_tools.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_auth.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_config.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_tools.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/offload.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/paste_collapse.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/_json.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/adapters/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/adapters/hooks.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/adapters/mcp.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/adapters/skills.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/commands_cli.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/discovery.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/marketplace.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/store.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/substitution.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/reasoning_effort.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/sessions.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/skills/merge.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/skills/trust.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/system_prompt.md +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tool_catalog.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/key_hints.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/cold_cache.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/model_switch.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/prompt_clipboard.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/prompt_clipboard.tcss +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/resume_compact.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/screens/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/_links.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/approval.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/ask_user.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/chat_input.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/codex_auth.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/context_usage.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/debug_console.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/effort_selector.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/goal_review.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/goal_status.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/history.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/install_confirm.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/loading.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/message_store.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/messages.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/prompt_search.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/skill_trust.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/startup_tip.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/status.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/thread_selector.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/update_available.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/update_confirm.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/welcome.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/update_check.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/hatch_build.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/images/tui.png +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/scripts/install.sh +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/README.md +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/test_auto_approve_remote.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/client/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/client/commands/test_auth.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/client/commands/test_extras.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/client/commands/test_mcp.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/client/commands/test_tools.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/conftest.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/models/test_models.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_configuration.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_engine.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_execution.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_manager.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_presenter.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_server_lifecycle.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_transcript.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_trust.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/plugins/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/plugins/test_marketplace.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/plugins/test_store.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/skills/test_merge.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/skills/test_skill_trust.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/smoke_tests/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/smoke_tests/conftest.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test__tool_stream.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_acp.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_approval_mode.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_args.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_ask_user_types.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_cli_provider.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_cold_cache.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_config_manifest.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_configuration_resolution.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_context_doctor.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_cursor_blink.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_cursor_style.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_debug_buffer.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_dep_floor_check.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_diff_utils.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_doctor.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_goal_criteria_client.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_goal_state_limits.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_goal_state_notice.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_goal_state_persistence.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_goal_tools.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_hatch_build.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_install_command.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_install_script.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_invocation.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_json_types.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_main.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_managed_tools.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_mcp_config.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_middleware_trace_policy.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_paths.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_reasoning_effort.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_repository_bounds.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_rubric_cli.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_sandbox_registry.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_startup_blocking.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_terminal_stderr.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_threads_resume.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_tracing.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_tracing_replicas.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_transcript_virtualization.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/modals/test_cold_cache.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/modals/test_model_switch.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/modals/test_prompt_clipboard.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/test_key_hints.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/test_modal_footer_layout.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_history.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_links.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_prompt_search.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_status.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
- {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
|
@@ -153,8 +153,8 @@ To add a new slash command: (1) add a `SlashCommand` entry to `COMMANDS`, (2) se
|
|
|
153
153
|
|
|
154
154
|
1. `deepagents_code/model_config.py` — add `"provider_name": "ENV_VAR_NAME"` to `PROVIDER_API_KEY_ENV`
|
|
155
155
|
2. `deepagents_code/model_config.py` — if the provider reads a *dedicated* endpoint env var, add `"provider_name": ("CANONICAL_BASE_URL", "ALTERNATE", ...)` to `PROVIDER_BASE_URL_ENV` (see guidelines below); omit the provider entirely when it has no provider-specific endpoint variable
|
|
156
|
-
3. `
|
|
157
|
-
4. `
|
|
156
|
+
3. `deepagents_code/model_config.py` — add `"provider_name": "max_retries"` (or the provider's actual retry-count constructor kwarg) to `RETRY_PARAM_BY_PROVIDER`. dcode's model-node middleware owns the retry budget, so this entry is the disable-list that forces the provider's own SDK retry loop off; omitting it lets the SDK retries multiply the middleware's attempts. Verify the kwarg name against the integration's constructor — leave the provider out only when it exposes no integer retry-count kwarg. Check what the kwarg counts: retries are disabled with the default zero, but a kwarg counting *total attempts* needs an entry in `RETRY_DISABLE_VALUE_BY_PROVIDER` (see `google_genai`), because zero attempts either restores the SDK default or is coerced back to one
|
|
157
|
+
4. `pyproject.toml` — add `provider = ["langchain-provider>=X.Y.Z,<N.0.0"]` to `[project.optional-dependencies]` and include it in the `all-providers` composite extra
|
|
158
158
|
5. `deepagents_code/tui/widgets/auth.py` — add `"provider_name": "Display Name"` to `PROVIDER_DISPLAY_NAMES` so the `/auth` UI shows a branded label instead of the title-cased key, and (if the provider issues API keys from a self-serve page) `"provider_name": "https://…"` to `PROVIDER_API_KEY_URLS` so the prompt links straight to the key page
|
|
159
159
|
6. `tests/unit_tests/test_model_config.py` — add `assert PROVIDER_API_KEY_ENV["provider_name"] == "ENV_VAR_NAME"` to `TestProviderApiKeyEnv.test_contains_major_providers`, and pin any `PROVIDER_BASE_URL_ENV` entry with a matching assertion
|
|
160
160
|
|
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.1.63](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.62...deepagents-code==0.1.63) (2026-08-26)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- Added Baseten `zai-org/GLM-5.3-Flash` to the model switcher ([#5844](https://github.com/langchain-ai/deepagents/issues/5844)).
|
|
10
|
+
- Added support for loading managed config from a remote source ([#5776](https://github.com/langchain-ai/deepagents/issues/5776)).
|
|
11
|
+
- Added retry middleware for transient model errors in model nodes ([#4569](https://github.com/langchain-ai/deepagents/issues/4569)).
|
|
12
|
+
|
|
13
|
+
### Fixes
|
|
14
|
+
|
|
15
|
+
- Fixed live cost tracking for dynamic subagents ([#5833](https://github.com/langchain-ai/deepagents/issues/5833)).
|
|
16
|
+
- Improved `clear` command descriptions ([#5841](https://github.com/langchain-ai/deepagents/issues/5841)).
|
|
17
|
+
- Allowed instrumental Auto actions ([#5832](https://github.com/langchain-ai/deepagents/issues/5832)).
|
|
18
|
+
- Ensured traces are flushed before server shutdown ([#5837](https://github.com/langchain-ai/deepagents/issues/5837)).
|
|
19
|
+
- Made the debug log path click-to-copy ([#5845](https://github.com/langchain-ai/deepagents/issues/5845)).
|
|
20
|
+
|
|
5
21
|
## [0.1.62](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.61...deepagents-code==0.1.62) (2026-08-26)
|
|
6
22
|
|
|
7
23
|
### Features
|
|
@@ -17,7 +17,7 @@ aliases, descriptions, visibility, or hidden-command metadata.
|
|
|
17
17
|
| `/auto` | | Switch to Auto approval mode or manage its classifier model |
|
|
18
18
|
| `/auto-update` | | Turn automatic updates on or off |
|
|
19
19
|
| `/changelog` | | Open the changelog in a browser |
|
|
20
|
-
| `/clear` | |
|
|
20
|
+
| `/clear` | | Start a fresh thread |
|
|
21
21
|
| `/context` | | Show current context window usage |
|
|
22
22
|
| `/context-doctor` | | Audit what a session injects and its estimated token cost |
|
|
23
23
|
| `/copy` | | Copy the latest assistant message to clipboard |
|
|
@@ -26,7 +26,7 @@ aliases, descriptions, visibility, or hidden-command metadata.
|
|
|
26
26
|
| `/editor` | | Open prompt in an external editor ($EDITOR) |
|
|
27
27
|
| `/effort` | | Set reasoning effort for the current model |
|
|
28
28
|
| `/feedback` | | Send feedback or report an issue |
|
|
29
|
-
| `/force-clear` | |
|
|
29
|
+
| `/force-clear` | | Recover a stuck session with a fresh thread |
|
|
30
30
|
| `/goal` | | Set and manage a persistent objective with acceptance criteria |
|
|
31
31
|
| `/help` | | Show help and available commands |
|
|
32
32
|
| `/install` | | Install an optional integration |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.63
|
|
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
|
|
@@ -333,11 +333,17 @@
|
|
|
333
333
|
- A missing file is accepted and applies no policy.
|
|
334
334
|
- A present unreadable, undecodable, or syntactically corrupt file blocks every command except `--help`, `--version`, `help`, `config`, `doctor`, and `auth path`. It also blocks `/reload`.
|
|
335
335
|
- On Windows, a ProgramData directory that cannot be read from the registry blocks the same commands. The path would be a guess, and an empty read at a guessed path does not prove that no policy is deployed. Reporting it as a missing file made every managed setting silently inert on a host whose ProgramData is relocated.
|
|
336
|
-
- A failed `/reload` keeps the last snapshot
|
|
336
|
+
- A failed `/reload` keeps the last enforceable snapshot, so policy is never dropped mid-session. A snapshot that parses but cannot be enforced is not cached either, so a rejected edit cannot become the generation later readers observe.
|
|
337
337
|
- An unusable user `config.toml` drops only the user layer, so managed policy still applies.
|
|
338
338
|
- A deny list that cannot be read is treated as denying everything, never as empty. This covers a managed `[mcp].disabled_servers` that is neither an array of names nor a comma-separated string, and a `[mcp]` section that is not a table. A managed `[mcp].enabled_project_server_approvals` that is not an array is treated the same way: the key is present, so policy means to narrow access, and reading its presence as absence would keep both the user's approvals and the `DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS` bypass in force.
|
|
339
339
|
- **Outside**: Ownership, permission-mode validation, privileged installation, and `sudo` policy are deployment responsibilities. Anyone who can replace the administrator-managed file can control model, sandbox, interpreter, MCP trust, and other supported runtime settings. Model policy constrains official dcode selection and construction paths; it does not stop a hostile local user from replacing the package, modifying the process, or calling a provider SDK directly. On macOS, note that stock `/Library/Application Support` is group-writable by `admin`, so any admin-group member can create the file and grant themselves policy. Deployments that rely on this boundary must tighten ownership and mode on the `dcode` directory.
|
|
340
|
-
- **
|
|
340
|
+
- **Remote source**: The fixed local file may contain only `[managed_config].source`. Its administrator-owned HTTPS URL is then the explicit destination allowlist. The remote document becomes the whole managed policy. It cannot chain to another source. URLs with userinfo, query strings, or fragments are rejected. So are URLs carrying whitespace, control characters, or any non-ASCII character: confusable host text must not reach operator output, and `urllib` does not encode a non-ASCII request target consistently.
|
|
341
|
+
- Requests validate the certificate against Python's default TLS trust store, bypass environment proxies, and refuse redirects. One five-second budget covers the whole fetch: the connection, the TLS handshake, the headers, and the body. The fetch is abandoned once that budget is spent. At most 1 MiB is accepted.
|
|
342
|
+
- Only a complete document is accepted. The status must be 200. The media type must be `application/toml`, `text/plain`, or `application/octet-stream`, and the body must not be compressed. A captive portal or gateway error page that answers 200 with `text/html` is rejected before it is parsed. This is not a complete guard, and it is not relied on as one: a response with no `Content-Type`, or one claiming `application/octet-stream`, is read, because a bare object store answers that way. Such a body still has to parse as TOML and satisfy every rule below. Framing must show the body arrived whole: one matching `Content-Length`, or chunked encoding. A response that sends both, or that repeats `Content-Length` with different values, is rejected — the first value wins in `http.client`, so a duplicate header would otherwise let a prefix pass as a whole document. A keyless document is rejected as a failed publish. Truncated TOML often still parses, so a partial document would otherwise enforce a policy with entries silently missing, and would replace the last enforceable generation.
|
|
343
|
+
- The proxy bypass stops a local user redirecting the fetch through `HTTPS_PROXY`. The trust store itself is not pinned. `SSL_CERT_FILE` and `SSL_CERT_DIR` still select the certificate authorities, so the same actor can substitute the CA set for this request. This is the same deployment responsibility as the local file ownership in the **Outside** bullet above. This boundary does not apply on a host where an unprivileged user controls the `dcode` process environment.
|
|
344
|
+
- No disk cache or authentication material is stored. Private enterprise hosts remain reachable because the local trust anchor, not user input, selects the host. A fetch failure stops startup. A failed reload keeps the process's last enforceable snapshot, and `dcode doctor` reports that the refresh failed so a host that stopped answering is not silent.
|
|
345
|
+
|
|
346
|
+
- **Crossing mechanism**: Synchronous local file read through `configuration.TomlFileProvider`, optionally followed by one bounded HTTPS fetch through `configuration.RemoteTomlProvider`, then typed resolution and CLI/server startup gates.
|
|
341
347
|
|
|
342
348
|
#### TB14: Launch Environment → User Trust Root
|
|
343
349
|
|
|
@@ -254,6 +254,9 @@ class ServerConfig:
|
|
|
254
254
|
"""Extra kwargs forwarded to the chat model constructor (temperature,
|
|
255
255
|
max_tokens, etc.)."""
|
|
256
256
|
|
|
257
|
+
cli_max_retries: int | None = None
|
|
258
|
+
"""Explicit `--max-retries` value, separate from provider model kwargs."""
|
|
259
|
+
|
|
257
260
|
profile_overrides: dict[str, Any] | None = None
|
|
258
261
|
"""Model profile metadata overrides resolved by the client."""
|
|
259
262
|
|
|
@@ -424,6 +427,12 @@ class ServerConfig:
|
|
|
424
427
|
if self.rubric_max_iterations is not None and self.rubric_max_iterations <= 0:
|
|
425
428
|
msg = "rubric_max_iterations must be None or a positive integer"
|
|
426
429
|
raise ValueError(msg)
|
|
430
|
+
if isinstance(self.cli_max_retries, bool):
|
|
431
|
+
msg = "cli_max_retries must be None or a non-negative integer"
|
|
432
|
+
raise TypeError(msg)
|
|
433
|
+
if self.cli_max_retries is not None and self.cli_max_retries < 0:
|
|
434
|
+
msg = "cli_max_retries must be None or a non-negative integer"
|
|
435
|
+
raise ValueError(msg)
|
|
427
436
|
if isinstance(self.recursion_limit, bool):
|
|
428
437
|
msg = "recursion_limit must be None or a positive integer"
|
|
429
438
|
raise TypeError(msg)
|
|
@@ -451,6 +460,9 @@ class ServerConfig:
|
|
|
451
460
|
"MODEL_PARAMS": (
|
|
452
461
|
json.dumps(self.model_params) if self.model_params is not None else None
|
|
453
462
|
),
|
|
463
|
+
"MAX_RETRIES": (
|
|
464
|
+
str(self.cli_max_retries) if self.cli_max_retries is not None else None
|
|
465
|
+
),
|
|
454
466
|
"PROFILE_OVERRIDES": (
|
|
455
467
|
json.dumps(self.profile_overrides)
|
|
456
468
|
if self.profile_overrides is not None
|
|
@@ -522,6 +534,7 @@ class ServerConfig:
|
|
|
522
534
|
return cls(
|
|
523
535
|
model=_read_env_str("MODEL"),
|
|
524
536
|
model_params=_read_env_json("MODEL_PARAMS"),
|
|
537
|
+
cli_max_retries=_read_env_int("MAX_RETRIES", default=None),
|
|
525
538
|
profile_overrides=_read_env_json("PROFILE_OVERRIDES"),
|
|
526
539
|
assistant_id=_read_env_str("ASSISTANT_ID") or DEFAULT_ASSISTANT_ID,
|
|
527
540
|
system_prompt=_read_env_str("SYSTEM_PROMPT"),
|
|
@@ -570,6 +583,7 @@ class ServerConfig:
|
|
|
570
583
|
project_context: ProjectContext | None,
|
|
571
584
|
model_name: str | None,
|
|
572
585
|
model_params: dict[str, Any] | None,
|
|
586
|
+
cli_max_retries: int | None = None,
|
|
573
587
|
profile_overrides: dict[str, Any] | None = None,
|
|
574
588
|
assistant_id: str,
|
|
575
589
|
auto_approve: bool,
|
|
@@ -604,6 +618,7 @@ class ServerConfig:
|
|
|
604
618
|
project_context: Explicit user/project path context.
|
|
605
619
|
model_name: Model spec string.
|
|
606
620
|
model_params: Extra model kwargs.
|
|
621
|
+
cli_max_retries: Explicit `--max-retries` value.
|
|
607
622
|
profile_overrides: Model profile metadata overrides.
|
|
608
623
|
assistant_id: Agent identifier.
|
|
609
624
|
auto_approve: Auto-approve all tools.
|
|
@@ -650,6 +665,7 @@ class ServerConfig:
|
|
|
650
665
|
return cls(
|
|
651
666
|
model=model_name,
|
|
652
667
|
model_params=model_params,
|
|
668
|
+
cli_max_retries=cli_max_retries,
|
|
653
669
|
profile_overrides=profile_overrides,
|
|
654
670
|
assistant_id=assistant_id,
|
|
655
671
|
auto_approve=auto_approve,
|
|
@@ -30,17 +30,13 @@ logger = logging.getLogger(__name__)
|
|
|
30
30
|
_warned_usage_stats_rejections: set[str] = set()
|
|
31
31
|
"""Rejection reasons already reported by `_warn_rejected_usage_stats_value`."""
|
|
32
32
|
|
|
33
|
-
SpinnerStatus =
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
]
|
|
41
|
-
| None
|
|
42
|
-
)
|
|
43
|
-
"""Valid spinner display states, or `None` to hide."""
|
|
33
|
+
SpinnerStatus = str | None
|
|
34
|
+
"""Spinner display text, or `None` to hide.
|
|
35
|
+
|
|
36
|
+
Deliberately unconstrained rather than the closed `Literal` set it replaced:
|
|
37
|
+
retry status text is generated per attempt by `model_retry.format_retry_status`.
|
|
38
|
+
Narrowing this back to a `Literal` union would break the retry spinner.
|
|
39
|
+
"""
|
|
44
40
|
|
|
45
41
|
UsageKind = Literal["assistant", "subagent", "offload", "auto"]
|
|
46
42
|
"""Billing/display class for a model request."""
|
|
@@ -892,6 +888,108 @@ def record_message_usage(
|
|
|
892
888
|
)
|
|
893
889
|
|
|
894
890
|
|
|
891
|
+
def is_model_usage_event(data: object) -> bool:
|
|
892
|
+
"""Report whether a custom-stream payload is a nested model-usage event.
|
|
893
|
+
|
|
894
|
+
Lets a client consume its own event whatever `record_model_usage_event` made
|
|
895
|
+
of it. A duplicate of a request the message stream already recorded is still
|
|
896
|
+
this client's event, not a payload for the unrelated handlers downstream.
|
|
897
|
+
|
|
898
|
+
Args:
|
|
899
|
+
data: A `custom` stream payload.
|
|
900
|
+
|
|
901
|
+
Returns:
|
|
902
|
+
`True` when the payload claims to be a nested model-usage event.
|
|
903
|
+
"""
|
|
904
|
+
from deepagents_code.cost_tracking import MODEL_USAGE_EVENT_TYPE
|
|
905
|
+
|
|
906
|
+
return isinstance(data, Mapping) and data.get("type") == MODEL_USAGE_EVENT_TYPE
|
|
907
|
+
|
|
908
|
+
|
|
909
|
+
def record_model_usage_event(
|
|
910
|
+
stats: SessionStats,
|
|
911
|
+
data: object,
|
|
912
|
+
*,
|
|
913
|
+
active_thread_id: str = "",
|
|
914
|
+
fallback_model: str = "",
|
|
915
|
+
fallback_provider: str = "",
|
|
916
|
+
recorded_requests: dict[str, RecordedRequest] | None = None,
|
|
917
|
+
) -> RecordedUsage | None:
|
|
918
|
+
"""Record a validated provisional usage event from a nested model call.
|
|
919
|
+
|
|
920
|
+
Returns:
|
|
921
|
+
The recorded usage delta, or `None` when the event is invalid or duplicate.
|
|
922
|
+
"""
|
|
923
|
+
from deepagents_code.cost_tracking import (
|
|
924
|
+
MODEL_USAGE_EVENT_TYPE,
|
|
925
|
+
MODEL_USAGE_EVENT_VERSION,
|
|
926
|
+
)
|
|
927
|
+
|
|
928
|
+
if not isinstance(data, Mapping) or data.get("type") != MODEL_USAGE_EVENT_TYPE:
|
|
929
|
+
return None
|
|
930
|
+
version = data.get("version")
|
|
931
|
+
if (
|
|
932
|
+
not isinstance(version, int)
|
|
933
|
+
or isinstance(version, bool)
|
|
934
|
+
or version != MODEL_USAGE_EVENT_VERSION
|
|
935
|
+
):
|
|
936
|
+
# A newer graph process can stream a shape this client cannot read. The
|
|
937
|
+
# spend is still charged and streamed as the thread total, so only the
|
|
938
|
+
# provisional display is lost -- but silence would make that look like
|
|
939
|
+
# the graph never emitted anything.
|
|
940
|
+
logger.debug(
|
|
941
|
+
"Ignoring a nested usage event of version %r; this client reads %d.",
|
|
942
|
+
version,
|
|
943
|
+
MODEL_USAGE_EVENT_VERSION,
|
|
944
|
+
)
|
|
945
|
+
return None
|
|
946
|
+
request_id = data.get("request_id")
|
|
947
|
+
thread_id = data.get("thread_id")
|
|
948
|
+
scope = data.get("scope")
|
|
949
|
+
usage = data.get("usage_metadata")
|
|
950
|
+
model_name, provider = data.get("model_name"), data.get("provider")
|
|
951
|
+
if (
|
|
952
|
+
not isinstance(request_id, str)
|
|
953
|
+
or not request_id
|
|
954
|
+
or not isinstance(thread_id, str)
|
|
955
|
+
or not thread_id
|
|
956
|
+
or not isinstance(scope, str)
|
|
957
|
+
or not scope
|
|
958
|
+
or not isinstance(usage, Mapping)
|
|
959
|
+
or not usage
|
|
960
|
+
or not isinstance(model_name, str)
|
|
961
|
+
or not isinstance(provider, str)
|
|
962
|
+
):
|
|
963
|
+
logger.debug("Ignoring a malformed nested usage event")
|
|
964
|
+
return None
|
|
965
|
+
if active_thread_id and thread_id != active_thread_id:
|
|
966
|
+
# Ordinary: a stream for a thread the user has since switched away from.
|
|
967
|
+
return None
|
|
968
|
+
try:
|
|
969
|
+
from langchain_core.messages import AIMessage
|
|
970
|
+
|
|
971
|
+
message = AIMessage(
|
|
972
|
+
content="",
|
|
973
|
+
id=request_id,
|
|
974
|
+
usage_metadata=cast("Any", dict(usage)),
|
|
975
|
+
response_metadata={
|
|
976
|
+
"model_name": model_name,
|
|
977
|
+
"model_provider": provider,
|
|
978
|
+
},
|
|
979
|
+
)
|
|
980
|
+
except (TypeError, ValueError):
|
|
981
|
+
logger.debug("Rejected malformed nested model usage", exc_info=True)
|
|
982
|
+
return None
|
|
983
|
+
return record_message_usage(
|
|
984
|
+
stats,
|
|
985
|
+
message,
|
|
986
|
+
fallback_model=fallback_model,
|
|
987
|
+
fallback_provider=fallback_provider,
|
|
988
|
+
kind="subagent",
|
|
989
|
+
recorded_requests=recorded_requests,
|
|
990
|
+
)
|
|
991
|
+
|
|
992
|
+
|
|
895
993
|
def format_token_count(count: int) -> str:
|
|
896
994
|
"""Format a token count into a human-readable short string.
|
|
897
995
|
|
|
@@ -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.63" # 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."""
|
|
@@ -83,6 +83,7 @@ from deepagents_code.approval_mode import (
|
|
|
83
83
|
)
|
|
84
84
|
from deepagents_code.config import (
|
|
85
85
|
_INHERITED_PYTHONPATH_ENV,
|
|
86
|
+
DEFAULT_MODEL_RETRIES,
|
|
86
87
|
_ShellAllowAll,
|
|
87
88
|
config,
|
|
88
89
|
console,
|
|
@@ -2204,6 +2205,52 @@ def _apply_inherited_pythonpath(env: dict[str, str]) -> None:
|
|
|
2204
2205
|
env["PYTHONPATH"] = inherited
|
|
2205
2206
|
|
|
2206
2207
|
|
|
2208
|
+
def _resolve_retry_owned_model(
|
|
2209
|
+
model_spec: str, cli_max_retries: int | None
|
|
2210
|
+
) -> BaseChatModel | None:
|
|
2211
|
+
"""Resolve a string model with provider retries disabled and metadata tagged.
|
|
2212
|
+
|
|
2213
|
+
Only an explicit `--max-retries` is forwarded. Passing the caller's already
|
|
2214
|
+
resolved budget instead would take precedence over
|
|
2215
|
+
`[retries.<provider>].max_retries`, so a model on a different provider could
|
|
2216
|
+
never use its own configured budget.
|
|
2217
|
+
|
|
2218
|
+
Args:
|
|
2219
|
+
model_spec: The subagent's declared model string.
|
|
2220
|
+
cli_max_retries: The `--max-retries` flag value, or `None` when unset.
|
|
2221
|
+
|
|
2222
|
+
Returns:
|
|
2223
|
+
The concrete model prepared by dcode's model factory, or `None` when it
|
|
2224
|
+
cannot be built here and the caller should pass the spec through.
|
|
2225
|
+
"""
|
|
2226
|
+
from deepagents_code.config import create_model
|
|
2227
|
+
from deepagents_code.model_config import MissingCredentialsError
|
|
2228
|
+
|
|
2229
|
+
try:
|
|
2230
|
+
return create_model(model_spec, cli_max_retries=cli_max_retries).model
|
|
2231
|
+
except MissingCredentialsError:
|
|
2232
|
+
# Taking ownership of retries is an optimization, not a precondition for
|
|
2233
|
+
# launching. A subagent declaring a provider the user has not
|
|
2234
|
+
# authenticated must not abort the whole CLI: pass the spec through so
|
|
2235
|
+
# the credential error surfaces if and when that subagent runs.
|
|
2236
|
+
logger.debug(
|
|
2237
|
+
"Deferring model resolution for %r: no provider credentials yet",
|
|
2238
|
+
model_spec,
|
|
2239
|
+
)
|
|
2240
|
+
return None
|
|
2241
|
+
|
|
2242
|
+
|
|
2243
|
+
def _has_resolvable_model_provider(model_spec: str) -> bool:
|
|
2244
|
+
"""Return whether dcode can resolve the provider before graph construction."""
|
|
2245
|
+
from deepagents_code.config import detect_provider
|
|
2246
|
+
from deepagents_code.model_config import ModelSpec
|
|
2247
|
+
|
|
2248
|
+
return (
|
|
2249
|
+
ModelSpec.try_parse(model_spec) is not None
|
|
2250
|
+
or detect_provider(model_spec) is not None
|
|
2251
|
+
)
|
|
2252
|
+
|
|
2253
|
+
|
|
2207
2254
|
def get_skill_sources(
|
|
2208
2255
|
assistant_id: str = DEFAULT_AGENT_NAME,
|
|
2209
2256
|
project_context: ProjectContext | None = None,
|
|
@@ -2299,6 +2346,8 @@ def create_cli_agent(
|
|
|
2299
2346
|
async_subagents: list[AsyncSubAgent] | None = None,
|
|
2300
2347
|
goal_criteria_tools: Sequence[BaseTool | Callable[..., Any]] | None = None,
|
|
2301
2348
|
rubric_grader_tools: Sequence[BaseTool | Callable[..., Any]] | None = None,
|
|
2349
|
+
model_retries: int = DEFAULT_MODEL_RETRIES,
|
|
2350
|
+
cli_max_retries: int | None = None,
|
|
2302
2351
|
enforce_model_policy: bool = True,
|
|
2303
2352
|
) -> tuple[Pregel[Any, Any, Any, Any], CompositeBackend]:
|
|
2304
2353
|
"""Create a CLI-configured agent with flexible options.
|
|
@@ -2448,6 +2497,12 @@ def create_cli_agent(
|
|
|
2448
2497
|
rubric_grader_tools: External read-only context tools available to rubric
|
|
2449
2498
|
grading for verifying work completed in MCP-backed or web-accessible
|
|
2450
2499
|
systems.
|
|
2500
|
+
model_retries: Model-node retry attempts after the first call. `0`
|
|
2501
|
+
disables retries. Resolved upstream from config/CLI.
|
|
2502
|
+
cli_max_retries: The `--max-retries` flag value, or `None` when unset.
|
|
2503
|
+
Forwarded to subagent, Auto classifier, and runtime offload models
|
|
2504
|
+
so each one resolves its own provider's configured budget unless the
|
|
2505
|
+
user overrode it globally.
|
|
2451
2506
|
enforce_model_policy: Check every model string against `models.allowed`.
|
|
2452
2507
|
Pass `False` **only** from callers that compile a graph they never
|
|
2453
2508
|
invoke (tool enumeration), so a blocked subagent model degrades the
|
|
@@ -2468,10 +2523,9 @@ def create_cli_agent(
|
|
|
2468
2523
|
without `auto_approve` or `interpreter_ptc_acknowledge_unsafe`.
|
|
2469
2524
|
ModelNotAllowedError: When `model`, `auto_classifier_model`,
|
|
2470
2525
|
`rubric_model`, or a subagent's frontmatter `model` is a string
|
|
2471
|
-
outside the effective `models.allowed` policy. Model
|
|
2472
|
-
checked
|
|
2473
|
-
|
|
2474
|
-
`BaseChatModel` came from a path that already checked.
|
|
2526
|
+
outside the effective `models.allowed` policy. Model strings are
|
|
2527
|
+
checked before dcode resolves them with provider retries disabled;
|
|
2528
|
+
a prebuilt `BaseChatModel` came from a path that already checked.
|
|
2475
2529
|
""" # noqa: DOC502 - propagates from `ModelConfig.require_model_allowed`
|
|
2476
2530
|
tools = tools or []
|
|
2477
2531
|
mcp_tools = tuple(mcp_tools or ())
|
|
@@ -2542,7 +2596,12 @@ def create_cli_agent(
|
|
|
2542
2596
|
if resolved_interrupt_on is not None:
|
|
2543
2597
|
middleware.append(AsyncApprovalHITLMiddleware(resolved_interrupt_on))
|
|
2544
2598
|
if not has_explicit_model:
|
|
2545
|
-
middleware.append(
|
|
2599
|
+
middleware.append(
|
|
2600
|
+
ConfigurableModelMiddleware(
|
|
2601
|
+
persist_model_state=False,
|
|
2602
|
+
cli_max_retries=cli_max_retries,
|
|
2603
|
+
)
|
|
2604
|
+
)
|
|
2546
2605
|
# Checkpoint nested spend before HITL can pause the subgraph, then hand
|
|
2547
2606
|
# the completed delta back through owner-scoped state for the parent
|
|
2548
2607
|
# graph to add to its durable total.
|
|
@@ -2552,6 +2611,9 @@ def create_cli_agent(
|
|
|
2552
2611
|
# activates only for the measured Fireworks GLM-5.2 endpoint.
|
|
2553
2612
|
if not interactive:
|
|
2554
2613
|
middleware.append(_GlmTerminalStallRecovery())
|
|
2614
|
+
from deepagents_code.model_retry import CodeModelRetryMiddleware
|
|
2615
|
+
|
|
2616
|
+
middleware.append(CodeModelRetryMiddleware(max_retries=model_retries))
|
|
2555
2617
|
if restrictive_shell_allow_list is not None:
|
|
2556
2618
|
middleware.append(ShellAllowListMiddleware(restrictive_shell_allow_list))
|
|
2557
2619
|
# Server-owned hooks must wrap subagent tools too; otherwise Pre/Post
|
|
@@ -2585,9 +2647,12 @@ def create_cli_agent(
|
|
|
2585
2647
|
from deepagents_code._cli_context import INHERIT_CLASSIFIER_MODEL
|
|
2586
2648
|
from deepagents_code.model_config import ModelConfig
|
|
2587
2649
|
|
|
2588
|
-
# Every model
|
|
2589
|
-
#
|
|
2590
|
-
#
|
|
2650
|
+
# Every runtime model string is checked before it is resolved. Known providers
|
|
2651
|
+
# go through `create_model` here so the SDK retry loop is disabled before Deep
|
|
2652
|
+
# Agents builds the graph and every request carries dcode's retry metadata.
|
|
2653
|
+
# Graph-only tool enumeration leaves all strings to SDK assembly because it
|
|
2654
|
+
# never invokes them. Provider-less placeholders also remain strings because
|
|
2655
|
+
# dcode cannot identify a retry constructor parameter for them. A
|
|
2591
2656
|
# `BaseChatModel` was already built by a checked path, so it is exempt.
|
|
2592
2657
|
model_policy = ModelConfig.load()
|
|
2593
2658
|
if not enforce_model_policy:
|
|
@@ -2601,6 +2666,12 @@ def create_cli_agent(
|
|
|
2601
2666
|
)
|
|
2602
2667
|
if isinstance(model, str):
|
|
2603
2668
|
model_policy.require_model_allowed(model)
|
|
2669
|
+
if enforce_model_policy and _has_resolvable_model_provider(model):
|
|
2670
|
+
# `None` means credentials are absent: keep the spec so graph
|
|
2671
|
+
# construction resolves it later instead of failing the launch.
|
|
2672
|
+
resolved = _resolve_retry_owned_model(model, cli_max_retries)
|
|
2673
|
+
if resolved is not None:
|
|
2674
|
+
model = resolved
|
|
2604
2675
|
if (
|
|
2605
2676
|
isinstance(auto_classifier_model, str)
|
|
2606
2677
|
and auto_classifier_model.strip()
|
|
@@ -2637,7 +2708,14 @@ def create_cli_agent(
|
|
|
2637
2708
|
else f"subagent {name!r}"
|
|
2638
2709
|
),
|
|
2639
2710
|
)
|
|
2640
|
-
|
|
2711
|
+
resolved_model = (
|
|
2712
|
+
_resolve_retry_owned_model(model_spec, cli_max_retries)
|
|
2713
|
+
if enforce_model_policy and _has_resolvable_model_provider(model_spec)
|
|
2714
|
+
else None
|
|
2715
|
+
)
|
|
2716
|
+
subagent["model"] = (
|
|
2717
|
+
resolved_model if resolved_model is not None else model_spec
|
|
2718
|
+
)
|
|
2641
2719
|
subagent_middleware = _subagent_cli_middleware(
|
|
2642
2720
|
has_explicit_model=has_explicit_model,
|
|
2643
2721
|
)
|
|
@@ -2673,7 +2751,7 @@ def create_cli_agent(
|
|
|
2673
2751
|
|
|
2674
2752
|
# Build middleware stack based on enabled features
|
|
2675
2753
|
agent_middleware: list[AgentMiddleware[Any, Any]] = [
|
|
2676
|
-
ConfigurableModelMiddleware(),
|
|
2754
|
+
ConfigurableModelMiddleware(cli_max_retries=cli_max_retries),
|
|
2677
2755
|
]
|
|
2678
2756
|
if not interactive:
|
|
2679
2757
|
agent_middleware.append(_GlmTerminalStallRecovery())
|
|
@@ -2935,7 +3013,11 @@ def create_cli_agent(
|
|
|
2935
3013
|
routes={},
|
|
2936
3014
|
)
|
|
2937
3015
|
|
|
2938
|
-
compaction_middleware = _create_cli_compaction_middleware(
|
|
3016
|
+
compaction_middleware = _create_cli_compaction_middleware(
|
|
3017
|
+
model,
|
|
3018
|
+
composite_backend,
|
|
3019
|
+
cli_max_retries=cli_max_retries,
|
|
3020
|
+
)
|
|
2939
3021
|
if auto_mode_config is not None and resolved_interrupt_on is not None:
|
|
2940
3022
|
from deepagents_code.auto_mode import AutoModeHITLMiddleware
|
|
2941
3023
|
from deepagents_code.config import resolve_auto_classifier_model
|
|
@@ -2956,6 +3038,7 @@ def create_cli_agent(
|
|
|
2956
3038
|
worktree_root=trusted_root,
|
|
2957
3039
|
shell_allow_list=narrow_allow_list,
|
|
2958
3040
|
classifier_model=classifier_model,
|
|
3041
|
+
cli_max_retries=cli_max_retries,
|
|
2959
3042
|
classifier_timeout_seconds=resolve_auto_classifier_timeout(),
|
|
2960
3043
|
trusted_ask_user_tool=trusted_ask_user_tool,
|
|
2961
3044
|
trusted_compaction_tool=compaction_middleware.tools[0],
|
|
@@ -3049,14 +3132,29 @@ def create_cli_agent(
|
|
|
3049
3132
|
context_tools=goal_criteria_tools,
|
|
3050
3133
|
auto_mode_enabled=auto_mode_enabled,
|
|
3051
3134
|
fs_tools=fs_tools,
|
|
3135
|
+
model_retries=model_retries,
|
|
3136
|
+
cli_max_retries=cli_max_retries,
|
|
3137
|
+
)
|
|
3138
|
+
criteria_fallback_agent = create_goal_criteria_fallback_agent(
|
|
3139
|
+
model=model,
|
|
3140
|
+
model_retries=model_retries,
|
|
3141
|
+
cli_max_retries=cli_max_retries,
|
|
3052
3142
|
)
|
|
3053
|
-
criteria_fallback_agent = create_goal_criteria_fallback_agent(model=model)
|
|
3054
3143
|
agent_middleware.append(
|
|
3055
3144
|
GoalCriteriaMiddleware(criteria_agent, criteria_fallback_agent)
|
|
3056
3145
|
)
|
|
3057
3146
|
|
|
3058
3147
|
agent_middleware.append(compaction_middleware)
|
|
3059
3148
|
|
|
3149
|
+
# Model-node retry sits inside side-effecting automatic compaction so a
|
|
3150
|
+
# failed provider attempt repeats only the final model handler, not summary
|
|
3151
|
+
# generation or the archive append. Keep it in the stack when the startup
|
|
3152
|
+
# budget is zero because a runtime `/model` switch may select a provider
|
|
3153
|
+
# with a non-zero request-time budget.
|
|
3154
|
+
from deepagents_code.model_retry import CodeModelRetryMiddleware
|
|
3155
|
+
|
|
3156
|
+
agent_middleware.append(CodeModelRetryMiddleware(max_retries=model_retries))
|
|
3157
|
+
|
|
3060
3158
|
grader_context_tools = _normalize_rubric_grader_context_tools(
|
|
3061
3159
|
rubric_grader_tools or ()
|
|
3062
3160
|
)
|
|
@@ -3097,6 +3195,12 @@ def create_cli_agent(
|
|
|
3097
3195
|
)
|
|
3098
3196
|
|
|
3099
3197
|
grader_middleware: list[AgentMiddleware[Any, Any]] = [
|
|
3198
|
+
# Both clients filter this nested message stream. A transient fault can
|
|
3199
|
+
# safely retry the failed model node without replaying grader tools.
|
|
3200
|
+
CodeModelRetryMiddleware(
|
|
3201
|
+
max_retries=model_retries,
|
|
3202
|
+
stream_output_is_visible=False,
|
|
3203
|
+
),
|
|
3100
3204
|
_ContextToolCallBudgetMiddleware(
|
|
3101
3205
|
# `read_file` is bounded separately by the grader's in-tool
|
|
3102
3206
|
# working-directory counter, which excludes offloaded-result reads.
|
|
@@ -3131,6 +3235,12 @@ def create_cli_agent(
|
|
|
3131
3235
|
# a policy check here would instead advise a fully qualified spec.
|
|
3132
3236
|
if isinstance(rubric_model, str) and rubric_model.strip():
|
|
3133
3237
|
model_policy.require_model_allowed(rubric_model)
|
|
3238
|
+
if enforce_model_policy and _has_resolvable_model_provider(rubric_model):
|
|
3239
|
+
resolved_rubric_model = _resolve_retry_owned_model(
|
|
3240
|
+
rubric_model, cli_max_retries
|
|
3241
|
+
)
|
|
3242
|
+
if resolved_rubric_model is not None:
|
|
3243
|
+
rubric_model = resolved_rubric_model
|
|
3134
3244
|
|
|
3135
3245
|
# Rubric-driven self-evaluation. The middleware is a no-op until a
|
|
3136
3246
|
# `rubric` is supplied on invocation state, so installing it is safe.
|