deepagents-code 0.1.57__tar.gz → 0.1.58__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/CHANGELOG.md +24 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/DEVELOPMENT.md +5 -1
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/PKG-INFO +23 -22
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_build_info.py +1 -1
- deepagents_code-0.1.58/deepagents_code/_debug.py +371 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_env_vars.py +44 -0
- deepagents_code-0.1.58/deepagents_code/_tracing.py +58 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/agent.py +17 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/app.py +185 -227
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/client/commands/config.py +23 -1
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/client/launch/server_manager.py +1 -1
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/client/non_interactive.py +2 -1
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/config.py +24 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/config_manifest.py +347 -24
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/goal_rubric.py +2 -2
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/goal_tools.py +3 -7
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/capabilities.py +2 -2
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/interrupt.py +2 -2
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/loading.py +1 -2
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/models/config.py +5 -2
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/models/domain.py +4 -4
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/models/wire.py +4 -4
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/presenter.py +3 -3
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/runner.py +21 -1
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/server_middleware.py +7 -20
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/input.py +1 -1
- deepagents_code-0.1.58/deepagents_code/json_types.py +16 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/main.py +45 -25
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/managed_tools.py +1 -46
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/mcp_auth.py +42 -8
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/mcp_tools.py +370 -14
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/plugins/adapters/skills.py +10 -7
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/project_utils.py +2 -2
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/skills/merge.py +9 -7
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/system_prompt.md +1 -14
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tool_catalog.py +1 -1
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/textual_adapter.py +2 -1
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/_inline_prompt.py +8 -14
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/_paste_textarea.py +268 -85
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/chat_input.py +267 -91
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/mcp_viewer.py +92 -45
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/messages.py +97 -33
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/model_selector.py +1 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/startup_tip.py +1 -1
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/status.py +157 -7
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/pyproject.toml +19 -18
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/scripts/install.sh +17 -7
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/hooks/test_execution.py +41 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -13
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/smoke_tests/test_system_prompt.py +1 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_agent.py +26 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_app.py +175 -54
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_config_manifest.py +496 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_cursor_blink.py +39 -3
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_debug.py +95 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_input_parsing.py +1 -2
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_install_script.py +9 -4
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_main.py +133 -24
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_managed_tools.py +3 -66
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_mcp_auth.py +75 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_mcp_tools.py +382 -91
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_non_interactive.py +51 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_offload.py +309 -20
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_remote_client.py +12 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_terminal_progress_preference.py +39 -3
- deepagents_code-0.1.58/tests/unit_tests/test_tracing.py +72 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +63 -12
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/test_textual_adapter.py +24 -6
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_chat_input.py +1066 -13
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_inline_prompt.py +63 -5
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +206 -14
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_messages.py +178 -22
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_model_selector.py +1 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_status.py +402 -3
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/uv.lock +66 -803
- deepagents_code-0.1.57/deepagents_code/_debug.py +0 -148
- deepagents_code-0.1.57/deepagents_code/json_types.py +0 -12
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/.gitignore +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/AGENTS.md +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/ARCHITECTURE.md +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/COMMANDS.md +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/HOOKS.md +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/LICENSE +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/Makefile +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/PRICING.md +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/README.md +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/THREAT_MODEL.md +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_cli_context.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_debug_buffer.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_dep_floor_check.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_fake_models.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_invocation.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_markdown.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_paths.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_repository_bounds.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_server_config.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/_tool_stream.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/acp.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/approval_mode.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/auto_mode.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/bundled_prices.README.md +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/bundled_prices.json +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/client/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/client/commands/auth.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/client/commands/extras.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/client/commands/mcp.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/client/commands/tools.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/client/launch/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/client/launch/server.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/client/remote_client.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/cold_cache.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/command_registry.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/configurable_model.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/cost_tracking.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/diff_utils.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/doctor.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/extras_info.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/goal_state_notice.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/client.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/client_lifecycle.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/context.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/engine.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/env.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/envelope.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/legacy.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/manager.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/migration.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/models/adapters.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/models/transport.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/permissions.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/projection.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/reducer.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/runtime.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/snapshot.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/tools.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/transcript.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/trust.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/integrations/sandbox_factory.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/mcp_config.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/model_config.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/offload.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/offload_middleware.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/paste_collapse.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/plugins/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/plugins/_json.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/plugins/adapters/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/plugins/adapters/hooks.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/plugins/adapters/mcp.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/plugins/commands_cli.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/plugins/discovery.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/plugins/manifest.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/plugins/marketplace.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/plugins/models.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/plugins/store.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/plugins/substitution.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/reasoning_effort.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/reliable_rubric.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/server_graph.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/sessions.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/skills/trust.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/modals/cold_cache.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/modals/resume_compact.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/screens/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/_links.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/approval.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/ask_user.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/auth.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/codex_auth.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/context_usage.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/debug_console.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/diff.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/effort_selector.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/goal_review.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/goal_status.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/history.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/install_confirm.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/loading.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/message_store.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/skill_trust.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/thread_selector.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/update_available.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/update_confirm.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/welcome.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/ui.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/deepagents_code/update_check.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/hatch_build.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/images/tui.png +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/README.md +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/integration_tests/test_auto_approve_remote.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/integration_tests/test_offload_server_side.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/client/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/client/commands/test_auth.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/client/commands/test_extras.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/client/commands/test_mcp.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/client/commands/test_tools.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/conftest.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/hooks/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/hooks/models/test_models.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/hooks/test_configuration.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/hooks/test_engine.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/hooks/test_manager.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/hooks/test_presenter.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/hooks/test_server_lifecycle.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/hooks/test_transcript.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/hooks/test_trust.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/plugins/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/plugins/test_marketplace.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/plugins/test_store.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/skills/test_merge.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/skills/test_skill_trust.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/smoke_tests/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/smoke_tests/conftest.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test__tool_stream.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_acp.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_approval_mode.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_args.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_ask_user_types.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_auto_mode.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_cold_cache.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_config.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_config_recursion_limit.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_cost_tracking.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_cursor_style.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_debug_buffer.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_debug_console.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_dep_floor_check.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_diff_utils.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_doctor.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_goal_criteria_client.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_goal_rubric.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_goal_state_notice.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_goal_state_persistence.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_goal_tools.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_hatch_build.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_install_command.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_invocation.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_json_types.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_mcp_config.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_model_config.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_paths.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_reasoning_effort.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_reliable_rubric.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_repository_bounds.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_rubric_cli.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_sandbox_registry.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_server.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_startup_blocking.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_threads_resume.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_tool_catalog.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_tracing_replicas.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_transcript_virtualization.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/modals/test_cold_cache.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_history.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_links.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
- {deepagents_code-0.1.57 → deepagents_code-0.1.58}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
|
@@ -2,6 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.1.58](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.57...deepagents-code==0.1.58) (2026-08-19)
|
|
6
|
+
|
|
7
|
+
### Breaking Changes
|
|
8
|
+
|
|
9
|
+
- `deepagents-code` now requires Python 3.12 or newer. ([#5603](https://github.com/langchain-ai/deepagents/issues/5603))
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
- Added OpenRouter `z-ai/glm-5.3` to the model switcher. ([#5641](https://github.com/langchain-ai/deepagents/issues/5641))
|
|
14
|
+
- Added support for re-authenticating MCP servers from the viewer. ([#5637](https://github.com/langchain-ai/deepagents/issues/5637))
|
|
15
|
+
- Footer pickers can now be opened with `ctrl+click`. ([#5611](https://github.com/langchain-ai/deepagents/issues/5611))
|
|
16
|
+
- Resume hints now account for `TERM_PROGRAM` support before showing terminal-specific guidance. ([#5580](https://github.com/langchain-ai/deepagents/issues/5580))
|
|
17
|
+
|
|
18
|
+
### Fixes
|
|
19
|
+
|
|
20
|
+
- Completed the `dcode config` command surface. ([#5581](https://github.com/langchain-ai/deepagents/issues/5581))
|
|
21
|
+
- Made `/offload` interruptible. ([#5590](https://github.com/langchain-ai/deepagents/issues/5590))
|
|
22
|
+
- Improved chat and footer UI behavior: rapid typing stays visible, double-click collapses a resized chat input, and the MCP footer wraps on narrow windows. ([#5424](https://github.com/langchain-ai/deepagents/issues/5424), [#5578](https://github.com/langchain-ai/deepagents/issues/5578), [#5651](https://github.com/langchain-ai/deepagents/issues/5651))
|
|
23
|
+
- Captured stdio MCP server stderr in the logger. ([#5610](https://github.com/langchain-ai/deepagents/issues/5610))
|
|
24
|
+
- Drained hook pipes after timeout. ([#5606](https://github.com/langchain-ai/deepagents/issues/5606))
|
|
25
|
+
- Grouped resume trace rounds. ([#5593](https://github.com/langchain-ai/deepagents/issues/5593))
|
|
26
|
+
- Omitted web-search prompt guidance when web search is unavailable. ([#5602](https://github.com/langchain-ai/deepagents/issues/5602))
|
|
27
|
+
- Resolved message pointer shapes per cell. ([#5592](https://github.com/langchain-ai/deepagents/issues/5592))
|
|
28
|
+
|
|
5
29
|
## [0.1.57](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.56...deepagents-code==0.1.57) (2026-08-18)
|
|
6
30
|
|
|
7
31
|
### Features
|
|
@@ -138,6 +138,10 @@ tail -f /tmp/deepagents_debug.log
|
|
|
138
138
|
|
|
139
139
|
To send it elsewhere, also `export DEEPAGENTS_CODE_DEBUG_FILE=<path>`. The handler appends across runs, so a single file accumulates every session.
|
|
140
140
|
|
|
141
|
+
The file is created or tightened to user-only access. A symlink at the path is refused. If the file cannot be secured, no file handler is attached and a warning goes to stderr. Use the in-app Debug Console in that case.
|
|
142
|
+
|
|
143
|
+
Stdio MCP server stderr is captured here at `DEBUG`. This keeps server-side failures visible when the TUI cannot show process stderr. Each record is one line, capped at 4096 characters. Characters in the Unicode `C` categories are removed, which includes control and format characters. The ESC byte of an ANSI sequence is removed but the rest stays as literal text, so the log is not free of escape-sequence residue. The text comes from the server. It can contain credentials or other sensitive values. Enable `DEBUG` logging only if you accept that risk, and do not share the log file.
|
|
144
|
+
|
|
141
145
|
### In-app Debug Console (`Ctrl+\`)
|
|
142
146
|
|
|
143
147
|
Press `Ctrl+\` (or run the hidden `/debug` command) inside a session to toggle a read-only Debug Console overlay. It shows a point-in-time session/runtime snapshot (version, model, thread, cwd, auto-approve, sandbox, MCP servers, token usage, debug-log path) plus a live tail of recent `deepagents_code.*` log records.
|
|
@@ -168,7 +172,7 @@ uv pip install --python ~/.local/share/dcode-dev/bin/python -e <repo>/libs/code
|
|
|
168
172
|
ln -sf ~/.local/share/dcode-dev/bin/dcode ~/.local/bin/dcode-dev
|
|
169
173
|
```
|
|
170
174
|
|
|
171
|
-
The `--python 3.13` is illustrative — any interpreter satisfying the package's `requires-python` (currently `>=3.
|
|
175
|
+
The `--python 3.13` is illustrative — any interpreter satisfying the package's `requires-python` (currently `>=3.12`) works; omit the flag to let `uv` pick.
|
|
172
176
|
|
|
173
177
|
> **Why `uv venv` + `uv pip install -e` rather than `uv sync` or `uv tool install --editable`?** This builds an isolated venv *outside* the workspace's locked environment, so the dev binary can be re-resolved on demand without disturbing the released tool or the repo's `uv.lock`. (`uv pip` and `uv venv` are first-class `uv` subcommands here, not bare `pip`.)
|
|
174
178
|
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.58
|
|
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
|
-
Project-URL: Homepage, https://
|
|
6
|
-
Project-URL: Documentation, https://
|
|
5
|
+
Project-URL: Homepage, https://www.langchain.com/dcode
|
|
6
|
+
Project-URL: Documentation, https://docs.langchain.com/oss/deepagents/code/overview
|
|
7
7
|
Project-URL: Repository, https://github.com/langchain-ai/deepagents
|
|
8
8
|
Project-URL: Issues, https://github.com/langchain-ai/deepagents/issues
|
|
9
9
|
Project-URL: Changelog, https://github.com/langchain-ai/deepagents/blob/main/libs/code/CHANGELOG.md
|
|
10
10
|
Project-URL: Twitter, https://x.com/langchain_oss
|
|
11
11
|
Project-URL: Slack, https://www.langchain.com/join-community
|
|
12
12
|
Project-URL: Reddit, https://www.reddit.com/r/LangChain/
|
|
13
|
+
Author: LangChain
|
|
14
|
+
Maintainer: LangChain
|
|
13
15
|
License: MIT
|
|
14
16
|
License-File: LICENSE
|
|
15
17
|
Keywords: agents,ai,cli,deep-agent,langchain,langgraph,llm,terminal
|
|
@@ -18,32 +20,31 @@ Classifier: Environment :: Console
|
|
|
18
20
|
Classifier: Intended Audience :: Developers
|
|
19
21
|
Classifier: License :: OSI Approved :: MIT License
|
|
20
22
|
Classifier: Programming Language :: Python :: 3
|
|
21
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
22
23
|
Classifier: Programming Language :: Python :: 3.12
|
|
23
24
|
Classifier: Programming Language :: Python :: 3.13
|
|
24
25
|
Classifier: Programming Language :: Python :: 3.14
|
|
25
26
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
26
27
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
27
28
|
Classifier: Topic :: Terminals
|
|
28
|
-
Requires-Python: <4.0,>=3.
|
|
29
|
+
Requires-Python: <4.0,>=3.12
|
|
29
30
|
Requires-Dist: aiosqlite<1.0.0,>=0.22.1
|
|
30
31
|
Requires-Dist: anyio<5.0.0,>=4.14.2
|
|
31
32
|
Requires-Dist: deepagents-acp<1.0.0,>=0.0.10
|
|
32
|
-
Requires-Dist: deepagents==0.7.
|
|
33
|
+
Requires-Dist: deepagents==0.7.7
|
|
33
34
|
Requires-Dist: filelock<3.30,>=3.29.7
|
|
34
35
|
Requires-Dist: genai-prices<0.2.0,>=0.1.3
|
|
35
36
|
Requires-Dist: httpx<1.0.0,>=0.28.1
|
|
36
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.
|
|
37
|
-
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.
|
|
37
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.6.0
|
|
38
|
+
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.4
|
|
38
39
|
Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.2
|
|
39
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.
|
|
40
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.6.0
|
|
40
41
|
Requires-Dist: langchain-quickjs<0.4.0,>=0.3.4
|
|
41
42
|
Requires-Dist: langchain<2.0.0,>=1.3.15
|
|
42
43
|
Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.1
|
|
43
44
|
Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.31
|
|
44
|
-
Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.32.
|
|
45
|
-
Requires-Dist: langgraph-sdk<1.0.0,>=0.4.
|
|
46
|
-
Requires-Dist: langsmith[sandbox]>=0.
|
|
45
|
+
Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.32.6
|
|
46
|
+
Requires-Dist: langgraph-sdk<1.0.0,>=0.4.3
|
|
47
|
+
Requires-Dist: langsmith[sandbox]>=0.11.1
|
|
47
48
|
Requires-Dist: markdownify<2.0.0,>=1.2.3
|
|
48
49
|
Requires-Dist: mcp<2.0.0,>=1.28.1
|
|
49
50
|
Requires-Dist: packaging>=26.2
|
|
@@ -65,13 +66,13 @@ Provides-Extra: agentcore
|
|
|
65
66
|
Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.5; extra == 'agentcore'
|
|
66
67
|
Provides-Extra: all-providers
|
|
67
68
|
Requires-Dist: aiohttp<3.15.0,>=3.14.3; extra == 'all-providers'
|
|
68
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.
|
|
69
|
-
Requires-Dist: langchain-aws<2.0.0,>=1.7.
|
|
69
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.6.0; extra == 'all-providers'
|
|
70
|
+
Requires-Dist: langchain-aws<2.0.0,>=1.7.2; extra == 'all-providers'
|
|
70
71
|
Requires-Dist: langchain-baseten<1.0.0,>=0.2.3; extra == 'all-providers'
|
|
71
72
|
Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
|
|
72
73
|
Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
73
74
|
Requires-Dist: langchain-fireworks<2.0.0,>=1.5.2; extra == 'all-providers'
|
|
74
|
-
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.
|
|
75
|
+
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.4; extra == 'all-providers'
|
|
75
76
|
Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.4; extra == 'all-providers'
|
|
76
77
|
Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'all-providers'
|
|
77
78
|
Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'all-providers'
|
|
@@ -81,8 +82,8 @@ Requires-Dist: langchain-meta<2.0.0,>=0.5.0; extra == 'all-providers'
|
|
|
81
82
|
Requires-Dist: langchain-mistralai<2.0.0,>=1.1.6; extra == 'all-providers'
|
|
82
83
|
Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'all-providers'
|
|
83
84
|
Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
84
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.
|
|
85
|
-
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.
|
|
85
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.6.0; extra == 'all-providers'
|
|
86
|
+
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.8; extra == 'all-providers'
|
|
86
87
|
Requires-Dist: langchain-perplexity<2.0.0,>=1.4.0; extra == 'all-providers'
|
|
87
88
|
Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'all-providers'
|
|
88
89
|
Requires-Dist: langchain-xai<2.0.0,>=1.3.0; extra == 'all-providers'
|
|
@@ -93,11 +94,11 @@ Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
|
|
|
93
94
|
Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
|
|
94
95
|
Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
|
|
95
96
|
Provides-Extra: anthropic
|
|
96
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.
|
|
97
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.6.0; extra == 'anthropic'
|
|
97
98
|
Provides-Extra: baseten
|
|
98
99
|
Requires-Dist: langchain-baseten<1.0.0,>=0.2.3; extra == 'baseten'
|
|
99
100
|
Provides-Extra: bedrock
|
|
100
|
-
Requires-Dist: langchain-aws<2.0.0,>=1.7.
|
|
101
|
+
Requires-Dist: langchain-aws<2.0.0,>=1.7.2; extra == 'bedrock'
|
|
101
102
|
Provides-Extra: cohere
|
|
102
103
|
Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'cohere'
|
|
103
104
|
Provides-Extra: daytona
|
|
@@ -107,7 +108,7 @@ Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'deepseek'
|
|
|
107
108
|
Provides-Extra: fireworks
|
|
108
109
|
Requires-Dist: langchain-fireworks<2.0.0,>=1.5.2; extra == 'fireworks'
|
|
109
110
|
Provides-Extra: google-genai
|
|
110
|
-
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.
|
|
111
|
+
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.4; extra == 'google-genai'
|
|
111
112
|
Provides-Extra: groq
|
|
112
113
|
Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'groq'
|
|
113
114
|
Provides-Extra: huggingface
|
|
@@ -131,9 +132,9 @@ Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'nvidia'
|
|
|
131
132
|
Provides-Extra: ollama
|
|
132
133
|
Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'ollama'
|
|
133
134
|
Provides-Extra: openai
|
|
134
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.
|
|
135
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.6.0; extra == 'openai'
|
|
135
136
|
Provides-Extra: openrouter
|
|
136
|
-
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.
|
|
137
|
+
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.8; extra == 'openrouter'
|
|
137
138
|
Provides-Extra: perplexity
|
|
138
139
|
Requires-Dist: langchain-perplexity<2.0.0,>=1.4.0; extra == 'perplexity'
|
|
139
140
|
Provides-Extra: quickjs
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
"""Shared debug-logging configuration for runtime and file-based tracing.
|
|
2
|
+
|
|
3
|
+
When the `DEEPAGENTS_CODE_DEBUG` environment variable is set, modules that handle
|
|
4
|
+
streaming or remote communication can enable detailed file-based logging. This
|
|
5
|
+
helper centralizes the setup so the env-var names, file path, log level, and
|
|
6
|
+
format are defined in one place.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import logging
|
|
12
|
+
import os
|
|
13
|
+
import sys
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
# Windows-only ACL plumbing; see `_apply_windows_owner_only_dacl`. Imported
|
|
17
|
+
# under the guard because `_debug` is on the startup path for every command and
|
|
18
|
+
# `ctypes` costs a few milliseconds it can never repay on POSIX.
|
|
19
|
+
if os.name == "nt":
|
|
20
|
+
import ctypes
|
|
21
|
+
from ctypes import wintypes
|
|
22
|
+
|
|
23
|
+
from deepagents_code._env_vars import (
|
|
24
|
+
DEBUG,
|
|
25
|
+
DEBUG_FILE,
|
|
26
|
+
DEFAULT_DEBUG_FILE,
|
|
27
|
+
LOG_LEVEL,
|
|
28
|
+
is_env_truthy,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
logger = logging.getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
_DEBUG_HANDLER_ATTR = "_deepagents_code_debug_handler"
|
|
34
|
+
LOG_LEVELS = {
|
|
35
|
+
"DEBUG": logging.DEBUG,
|
|
36
|
+
"INFO": logging.INFO,
|
|
37
|
+
"WARNING": logging.WARNING,
|
|
38
|
+
"ERROR": logging.ERROR,
|
|
39
|
+
"CRITICAL": logging.CRITICAL,
|
|
40
|
+
}
|
|
41
|
+
"""Canonical level-name to `logging` level mapping.
|
|
42
|
+
|
|
43
|
+
The single source of truth for level names and their numeric values, shared with
|
|
44
|
+
the Debug Console's level filter so severity ordering is never re-derived from
|
|
45
|
+
hardcoded integers.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _prepare_debug_file(path: Path) -> None:
|
|
50
|
+
"""Create or tighten a debug file before attaching the logging handler.
|
|
51
|
+
|
|
52
|
+
On POSIX the file is created or tightened to mode `0o600`. On Windows,
|
|
53
|
+
where `os.open` mode bits and `chmod` do not tighten the DACL, the DACL is
|
|
54
|
+
replaced with one granting read and write access to the current user only.
|
|
55
|
+
|
|
56
|
+
`O_NOFOLLOW` refuses a symlink at `path`. The default location is a
|
|
57
|
+
world-writable temp directory, so without it a planted symlink could
|
|
58
|
+
redirect captured MCP server stderr into a file of the attacker's choosing.
|
|
59
|
+
|
|
60
|
+
Raises:
|
|
61
|
+
OSError: If the file cannot be created, opened, or tightened. The
|
|
62
|
+
caller must treat this as fatal to file logging.
|
|
63
|
+
""" # noqa: DOC502 - raised by os.open/fchmod, not by an explicit raise
|
|
64
|
+
flags = os.O_APPEND | os.O_CREAT | os.O_WRONLY | getattr(os, "O_NOFOLLOW", 0)
|
|
65
|
+
fd = os.open(path, flags, 0o600)
|
|
66
|
+
try:
|
|
67
|
+
if os.name == "nt":
|
|
68
|
+
_set_windows_owner_only_dacl(path)
|
|
69
|
+
return
|
|
70
|
+
fchmod = getattr(os, "fchmod", None)
|
|
71
|
+
if fchmod is None:
|
|
72
|
+
path.chmod(0o600)
|
|
73
|
+
else:
|
|
74
|
+
fchmod(fd, 0o600)
|
|
75
|
+
finally:
|
|
76
|
+
os.close(fd)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _set_windows_owner_only_dacl(path: Path) -> None:
|
|
80
|
+
"""Restrict `path` to the current user on Windows.
|
|
81
|
+
|
|
82
|
+
This is a no-op on POSIX, where `_prepare_debug_file` uses mode `0o600`
|
|
83
|
+
instead. The Windows implementation (defined only when `os.name == "nt"`)
|
|
84
|
+
replaces the file's DACL with one granting read and write access to the
|
|
85
|
+
current user and no one else.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
path: Debug log file to lock down.
|
|
89
|
+
|
|
90
|
+
Raises:
|
|
91
|
+
OSError: If the DACL cannot be built or applied. `_prepare_debug_file`
|
|
92
|
+
propagates it; `configure_debug_logging` catches it and disables
|
|
93
|
+
file logging.
|
|
94
|
+
""" # noqa: DOC502 - raised by the callee, not by an explicit raise
|
|
95
|
+
if os.name != "nt":
|
|
96
|
+
return
|
|
97
|
+
_apply_windows_owner_only_dacl(path)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
if os.name == "nt":
|
|
101
|
+
# --- Windows user-only DACL ---------------------------------------------
|
|
102
|
+
# Structures and helpers mirroring the advapi32 API used to build and apply
|
|
103
|
+
# a DACL granting the current user read and write access, and no one else
|
|
104
|
+
# any access. `DELETE` and `WRITE_DAC` are deliberately not granted; the
|
|
105
|
+
# file owner retains them implicitly.
|
|
106
|
+
|
|
107
|
+
_SE_FILE_OBJECT = 1
|
|
108
|
+
_DACL_SECURITY_INFORMATION = 0x00000004
|
|
109
|
+
_PROTECTED_DACL_SECURITY_INFORMATION = 0x80000000
|
|
110
|
+
_TOKEN_QUERY = 0x0008
|
|
111
|
+
_TOKEN_USER_INFORMATION_CLASS = 1
|
|
112
|
+
_FILE_GENERIC_READ = 0x120089
|
|
113
|
+
_FILE_GENERIC_WRITE = 0x120116
|
|
114
|
+
# `TRUSTEE_FORM` / `TRUSTEE_TYPE` / `ACCESS_MODE` from `accctrl.h`. Named
|
|
115
|
+
# rather than inlined because all three enums start at 0 with unrelated
|
|
116
|
+
# meanings, so a transposed literal still compiles and is rejected only at
|
|
117
|
+
# runtime by `SetEntriesInAclW`.
|
|
118
|
+
_NO_MULTIPLE_TRUSTEE = 0
|
|
119
|
+
_TRUSTEE_IS_SID = 0
|
|
120
|
+
_TRUSTEE_IS_USER = 1
|
|
121
|
+
_SET_ACCESS = 2
|
|
122
|
+
_NO_INHERITANCE = 0
|
|
123
|
+
|
|
124
|
+
class _TRUSTEE_W(ctypes.Structure): # noqa: N801 # mirrors Win32 TRUSTEE_W
|
|
125
|
+
"""`TRUSTEE_W` identifying the current-user SID to `SetEntriesInAclW`."""
|
|
126
|
+
|
|
127
|
+
_fields_ = [
|
|
128
|
+
("pMultipleTrustee", ctypes.c_void_p),
|
|
129
|
+
("MultipleTrusteeOperation", ctypes.c_int),
|
|
130
|
+
("TrusteeForm", ctypes.c_int),
|
|
131
|
+
("TrusteeType", ctypes.c_int),
|
|
132
|
+
("ptstrName", ctypes.c_void_p),
|
|
133
|
+
]
|
|
134
|
+
|
|
135
|
+
class _EXPLICIT_ACCESS_W(ctypes.Structure): # noqa: N801 # mirrors Win32 type
|
|
136
|
+
"""`EXPLICIT_ACCESS_W` describing one access-control entry."""
|
|
137
|
+
|
|
138
|
+
_fields_ = [
|
|
139
|
+
("grfAccessPermissions", wintypes.DWORD),
|
|
140
|
+
("grfAccessMode", ctypes.c_int),
|
|
141
|
+
("grfInheritance", wintypes.DWORD),
|
|
142
|
+
("Trustee", _TRUSTEE_W),
|
|
143
|
+
]
|
|
144
|
+
|
|
145
|
+
def _get_current_user_sid() -> ctypes.c_void_p:
|
|
146
|
+
"""Return a pointer to the current user's SID.
|
|
147
|
+
|
|
148
|
+
The `TOKEN_USER` buffer the SID points into is attached to the returned
|
|
149
|
+
pointer as `_buffer`, so it stays alive for the DACL construction.
|
|
150
|
+
`ctypes` already retains it through `.contents`; the attribute makes
|
|
151
|
+
that guarantee explicit rather than incidental.
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
A pointer to the current user's SID.
|
|
155
|
+
|
|
156
|
+
Raises:
|
|
157
|
+
OSError: If the process token or user SID cannot be read. Raised
|
|
158
|
+
via `ctypes.WinError`, which is a factory returning `OSError`.
|
|
159
|
+
""" # noqa: DOC501, DOC502 - `ctypes.WinError` returns an `OSError`
|
|
160
|
+
advapi32 = ctypes.windll.advapi32
|
|
161
|
+
token = wintypes.HANDLE()
|
|
162
|
+
if not advapi32.OpenProcessToken(
|
|
163
|
+
ctypes.windll.kernel32.GetCurrentProcess(),
|
|
164
|
+
_TOKEN_QUERY,
|
|
165
|
+
ctypes.byref(token),
|
|
166
|
+
):
|
|
167
|
+
raise ctypes.WinError() # surface the raw OS error
|
|
168
|
+
try:
|
|
169
|
+
needed = wintypes.DWORD(0)
|
|
170
|
+
advapi32.GetTokenInformation(
|
|
171
|
+
token, _TOKEN_USER_INFORMATION_CLASS, None, 0, ctypes.byref(needed)
|
|
172
|
+
)
|
|
173
|
+
if not needed.value:
|
|
174
|
+
raise ctypes.WinError()
|
|
175
|
+
buffer = (ctypes.c_byte * needed.value)()
|
|
176
|
+
if not advapi32.GetTokenInformation(
|
|
177
|
+
token,
|
|
178
|
+
_TOKEN_USER_INFORMATION_CLASS,
|
|
179
|
+
buffer,
|
|
180
|
+
needed,
|
|
181
|
+
ctypes.byref(needed),
|
|
182
|
+
):
|
|
183
|
+
raise ctypes.WinError()
|
|
184
|
+
# TOKEN_USER begins with a single pointer to the user's SID.
|
|
185
|
+
sid = ctypes.cast(buffer, ctypes.POINTER(ctypes.c_void_p)).contents
|
|
186
|
+
# Keep the backing buffer alive by attaching it to the pointer object.
|
|
187
|
+
sid._buffer = buffer # type: ignore[attr-defined]
|
|
188
|
+
return sid
|
|
189
|
+
finally:
|
|
190
|
+
ctypes.windll.kernel32.CloseHandle(token)
|
|
191
|
+
|
|
192
|
+
def _apply_windows_owner_only_dacl(path: Path) -> None:
|
|
193
|
+
"""Replace `path`'s DACL with a single read/write entry for this user.
|
|
194
|
+
|
|
195
|
+
The DACL is marked protected, so entries inherited from the parent
|
|
196
|
+
directory are dropped rather than merged.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
path: Debug log file to lock down.
|
|
200
|
+
|
|
201
|
+
Raises:
|
|
202
|
+
OSError: If the DACL cannot be built or applied. Raised via
|
|
203
|
+
`ctypes.WinError`, which is a factory returning `OSError`.
|
|
204
|
+
""" # noqa: DOC501, DOC502 - `ctypes.WinError` returns an `OSError`
|
|
205
|
+
advapi32 = ctypes.windll.advapi32
|
|
206
|
+
sid = _get_current_user_sid()
|
|
207
|
+
|
|
208
|
+
trustee = _TRUSTEE_W(
|
|
209
|
+
pMultipleTrustee=None,
|
|
210
|
+
MultipleTrusteeOperation=_NO_MULTIPLE_TRUSTEE,
|
|
211
|
+
TrusteeForm=_TRUSTEE_IS_SID,
|
|
212
|
+
TrusteeType=_TRUSTEE_IS_USER,
|
|
213
|
+
ptstrName=ctypes.cast(sid, ctypes.c_void_p).value,
|
|
214
|
+
)
|
|
215
|
+
explicit = _EXPLICIT_ACCESS_W(
|
|
216
|
+
grfAccessPermissions=_FILE_GENERIC_READ | _FILE_GENERIC_WRITE,
|
|
217
|
+
grfAccessMode=_SET_ACCESS,
|
|
218
|
+
grfInheritance=_NO_INHERITANCE,
|
|
219
|
+
Trustee=trustee,
|
|
220
|
+
)
|
|
221
|
+
new_acl = ctypes.c_void_p()
|
|
222
|
+
result = advapi32.SetEntriesInAclW(
|
|
223
|
+
1, ctypes.byref(explicit), None, ctypes.byref(new_acl)
|
|
224
|
+
)
|
|
225
|
+
if result != 0: # ERROR_SUCCESS
|
|
226
|
+
raise ctypes.WinError(result)
|
|
227
|
+
try:
|
|
228
|
+
apply_result = advapi32.SetNamedSecurityInfoW(
|
|
229
|
+
str(path),
|
|
230
|
+
_SE_FILE_OBJECT,
|
|
231
|
+
_DACL_SECURITY_INFORMATION | _PROTECTED_DACL_SECURITY_INFORMATION,
|
|
232
|
+
None,
|
|
233
|
+
None,
|
|
234
|
+
new_acl,
|
|
235
|
+
None,
|
|
236
|
+
)
|
|
237
|
+
if apply_result != 0: # ERROR_SUCCESS
|
|
238
|
+
raise ctypes.WinError(apply_result)
|
|
239
|
+
finally:
|
|
240
|
+
ctypes.windll.kernel32.LocalFree(new_acl)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def resolve_log_level(*, debug_enabled: bool | None = None) -> int:
|
|
244
|
+
"""Resolve the configured runtime logging level.
|
|
245
|
+
|
|
246
|
+
Args:
|
|
247
|
+
debug_enabled: Whether `DEEPAGENTS_CODE_DEBUG` is truthy. When omitted,
|
|
248
|
+
the current environment is checked.
|
|
249
|
+
|
|
250
|
+
Returns:
|
|
251
|
+
A standard `logging` level integer. Defaults to `DEBUG` when debug file
|
|
252
|
+
logging is enabled and `INFO` otherwise.
|
|
253
|
+
"""
|
|
254
|
+
if debug_enabled is None:
|
|
255
|
+
debug_enabled = is_env_truthy(DEBUG)
|
|
256
|
+
fallback = logging.DEBUG if debug_enabled else logging.INFO
|
|
257
|
+
raw = os.environ.get(LOG_LEVEL)
|
|
258
|
+
if raw is None or not raw.strip():
|
|
259
|
+
return fallback
|
|
260
|
+
level = LOG_LEVELS.get(raw.strip().upper())
|
|
261
|
+
if level is not None:
|
|
262
|
+
return level
|
|
263
|
+
valid = ", ".join(LOG_LEVELS)
|
|
264
|
+
message = f"ignoring invalid {LOG_LEVEL}={raw!r}; expected one of {valid}"
|
|
265
|
+
# stderr for headless / pre-TUI visibility; the logger so it also lands in
|
|
266
|
+
# the always-on in-memory buffer and surfaces in the Debug Console (the
|
|
267
|
+
# buffer is installed before this runs; see __init__.py).
|
|
268
|
+
print(f"Warning: {message}", file=sys.stderr) # noqa: T201
|
|
269
|
+
logger.warning("%s", message)
|
|
270
|
+
return fallback
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
def configure_debug_logging(target: logging.Logger) -> None:
|
|
274
|
+
"""Configure runtime log level and optional file logging for *target*.
|
|
275
|
+
|
|
276
|
+
Intended to be called once on the `deepagents_code` package logger; child
|
|
277
|
+
module loggers reach the same handlers via propagation, so individual modules
|
|
278
|
+
do not configure logging themselves.
|
|
279
|
+
|
|
280
|
+
`DEEPAGENTS_CODE_LOG_LEVEL` controls the package logger level independently of
|
|
281
|
+
file logging. If it is unset, `DEEPAGENTS_CODE_DEBUG=1` defaults to `DEBUG`;
|
|
282
|
+
otherwise the runtime level defaults to `INFO`.
|
|
283
|
+
|
|
284
|
+
When `DEEPAGENTS_CODE_DEBUG` is truthy, a file handler is attached. The log
|
|
285
|
+
file defaults to `DEFAULT_DEBUG_FILE` but can be overridden with
|
|
286
|
+
`DEEPAGENTS_CODE_DEBUG_FILE`. The handler appends (`mode='a'`) so logs are
|
|
287
|
+
preserved across separate process runs. Calling this again with the same
|
|
288
|
+
resolved path does not stack duplicate handlers: the existing tagged handler
|
|
289
|
+
is reused and its level re-applied. If the resolved path changes, the stale
|
|
290
|
+
handler is closed and replaced.
|
|
291
|
+
|
|
292
|
+
The file is created or tightened to user-only access first. If that fails,
|
|
293
|
+
no file handler is attached: captured MCP server stderr can carry
|
|
294
|
+
credentials, so no file log is safer than one that could not be secured.
|
|
295
|
+
|
|
296
|
+
Args:
|
|
297
|
+
target: Logger to configure.
|
|
298
|
+
"""
|
|
299
|
+
debug_enabled = is_env_truthy(DEBUG)
|
|
300
|
+
level = resolve_log_level(debug_enabled=debug_enabled)
|
|
301
|
+
target.setLevel(level)
|
|
302
|
+
|
|
303
|
+
if not debug_enabled:
|
|
304
|
+
return
|
|
305
|
+
|
|
306
|
+
debug_path = Path(os.environ.get(DEBUG_FILE, DEFAULT_DEBUG_FILE))
|
|
307
|
+
for existing in list(target.handlers):
|
|
308
|
+
if not (
|
|
309
|
+
isinstance(existing, logging.FileHandler)
|
|
310
|
+
and getattr(existing, _DEBUG_HANDLER_ATTR, False)
|
|
311
|
+
):
|
|
312
|
+
continue
|
|
313
|
+
if Path(existing.baseFilename) == debug_path:
|
|
314
|
+
existing.setLevel(level)
|
|
315
|
+
return
|
|
316
|
+
# The debug path changed; drop the stale handler before re-attaching so
|
|
317
|
+
# we don't leak its file descriptor or fan logs out to two files.
|
|
318
|
+
target.removeHandler(existing)
|
|
319
|
+
existing.close()
|
|
320
|
+
|
|
321
|
+
try:
|
|
322
|
+
_prepare_debug_file(debug_path)
|
|
323
|
+
except OSError as exc:
|
|
324
|
+
# Fail closed. `_prepare_debug_file` opens with `O_NOFOLLOW`, so this
|
|
325
|
+
# also fires for a symlink planted at `debug_path` — and the
|
|
326
|
+
# `FileHandler` below would happily follow it, turning a blocked
|
|
327
|
+
# redirect into a successful one. Captured MCP server stderr can carry
|
|
328
|
+
# credentials, so skip file logging entirely; the in-memory buffer
|
|
329
|
+
# still backs the Debug Console.
|
|
330
|
+
message = (
|
|
331
|
+
f"could not restrict debug log file {debug_path} to the current "
|
|
332
|
+
f"user: {exc}. File logging is disabled because captured MCP "
|
|
333
|
+
f"server stderr may contain credentials. Set "
|
|
334
|
+
f"{DEBUG_FILE} to a path you own to enable it."
|
|
335
|
+
)
|
|
336
|
+
print(f"Warning: {message}", file=sys.stderr) # noqa: T201
|
|
337
|
+
logger.warning("%s", message)
|
|
338
|
+
return
|
|
339
|
+
try:
|
|
340
|
+
handler = logging.FileHandler(str(debug_path), mode="a")
|
|
341
|
+
except OSError as exc:
|
|
342
|
+
message = f"could not open debug log file {debug_path}: {exc}"
|
|
343
|
+
# stderr for headless / pre-TUI visibility; the logger so it also lands
|
|
344
|
+
# in the always-on in-memory buffer and surfaces in the Debug Console.
|
|
345
|
+
print(f"Warning: {message}", file=sys.stderr) # noqa: T201
|
|
346
|
+
logger.warning("%s", message)
|
|
347
|
+
return
|
|
348
|
+
setattr(handler, _DEBUG_HANDLER_ATTR, True)
|
|
349
|
+
handler.setLevel(level)
|
|
350
|
+
handler.setFormatter(logging.Formatter("%(asctime)s %(name)s %(message)s"))
|
|
351
|
+
target.addHandler(handler)
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
def installed_debug_log_path() -> Path | None:
|
|
355
|
+
"""Return the path of the active debug log file, or `None` if not logging.
|
|
356
|
+
|
|
357
|
+
Reflects the file handler actually attached by `configure_debug_logging`,
|
|
358
|
+
not the current `DEEPAGENTS_CODE_DEBUG` env value. The two diverge when the
|
|
359
|
+
variable is set after import — e.g. via a project/global `.env` loaded during
|
|
360
|
+
settings bootstrap — in which case the variable reads truthy but no handler
|
|
361
|
+
was installed and no log file exists. Callers that surface "full error in
|
|
362
|
+
<path>" hints must use this rather than the env var to avoid pointing users
|
|
363
|
+
at a file that was never created.
|
|
364
|
+
"""
|
|
365
|
+
package_logger = logging.getLogger(__package__ or "deepagents_code")
|
|
366
|
+
for handler in package_logger.handlers:
|
|
367
|
+
if isinstance(handler, logging.FileHandler) and getattr(
|
|
368
|
+
handler, _DEBUG_HANDLER_ATTR, False
|
|
369
|
+
):
|
|
370
|
+
return Path(handler.baseFilename)
|
|
371
|
+
return None
|
|
@@ -80,6 +80,17 @@ rather than forcing the default). Also settable via `[ui].collapse_pastes` in
|
|
|
80
80
|
config.toml.
|
|
81
81
|
"""
|
|
82
82
|
|
|
83
|
+
CURSOR_BLINK = "DEEPAGENTS_CODE_CURSOR_BLINK"
|
|
84
|
+
"""Blink the chat input cursor.
|
|
85
|
+
|
|
86
|
+
Enabled by default; set to a falsy value (`0`, `false`, `no`, `off`, or blank)
|
|
87
|
+
for a steady cursor. Parsed by `classify_env_bool` (an unrecognized value falls
|
|
88
|
+
through to the config value rather than forcing the default). A blank value —
|
|
89
|
+
empty or whitespace-only — counts as `false` because the option declares
|
|
90
|
+
`empty_env_is_false`, so it overrides `config.toml` instead of falling through.
|
|
91
|
+
Also settable via `[ui].cursor_blink` in config.toml.
|
|
92
|
+
"""
|
|
93
|
+
|
|
83
94
|
CURSOR_STYLE = "DEEPAGENTS_CODE_CURSOR_STYLE"
|
|
84
95
|
"""Chat input cursor style (`block` or `underline`).
|
|
85
96
|
|
|
@@ -452,6 +463,15 @@ version), skips auto-updating to break out of an otherwise endless
|
|
|
452
463
|
upgrade/restart loop. Set and read internally across `os.execv`.
|
|
453
464
|
"""
|
|
454
465
|
|
|
466
|
+
RESUME_TERM_PROGRAM = "DEEPAGENTS_CODE_RESUME_TERM_PROGRAM"
|
|
467
|
+
"""Include launch-time `TERM_PROGRAM` in teardown resume commands.
|
|
468
|
+
|
|
469
|
+
Disabled by default and enabled by default in experimental or debug mode. An
|
|
470
|
+
explicit boolean (`1`/`true`/`yes`/`on`, or `0`/`false`/`no`/`off`) overrides
|
|
471
|
+
that mode-dependent default, as does an empty value, which reads as false. Also
|
|
472
|
+
settable as `[features].resume_term_program` in config.toml.
|
|
473
|
+
"""
|
|
474
|
+
|
|
455
475
|
RIPGREP_INSTALLER = "DEEPAGENTS_CODE_RIPGREP_INSTALLER"
|
|
456
476
|
"""Select how ripgrep is provisioned: `managed` (default) or `system`.
|
|
457
477
|
|
|
@@ -478,6 +498,17 @@ Defaults to enabled; set to a falsy value (`0`, `false`, `no`, `off`, or empty)
|
|
|
478
498
|
to hide replica tracing details from the splash while leaving tracing active.
|
|
479
499
|
"""
|
|
480
500
|
|
|
501
|
+
SHOW_MESSAGE_TIMESTAMPS = "DEEPAGENTS_CODE_SHOW_MESSAGE_TIMESTAMPS"
|
|
502
|
+
"""Show the timestamp footer under each chat message when enabled.
|
|
503
|
+
|
|
504
|
+
Off by default; use the `/timestamps` slash command or
|
|
505
|
+
`[ui].show_message_timestamps` in config.toml to toggle. Parsed by
|
|
506
|
+
`classify_env_bool` (an unrecognized or empty value falls through to the config
|
|
507
|
+
value rather than forcing the default). While this env var is set it outranks
|
|
508
|
+
the persisted value, so a `/timestamps` toggle will not appear to "stick"
|
|
509
|
+
across restarts.
|
|
510
|
+
"""
|
|
511
|
+
|
|
481
512
|
SHOW_SCROLLBAR = "DEEPAGENTS_CODE_SHOW_SCROLLBAR"
|
|
482
513
|
"""Show the vertical scrollbar in the chat area when enabled.
|
|
483
514
|
|
|
@@ -524,6 +555,19 @@ Off by default; set to a truthy value (`1`, `true`, `yes`, `on`) to suppress
|
|
|
524
555
|
the warning when this coexistence is expected. Parsed by `is_env_truthy`.
|
|
525
556
|
"""
|
|
526
557
|
|
|
558
|
+
TERMINAL_PROGRESS = "DEEPAGENTS_CODE_TERMINAL_PROGRESS"
|
|
559
|
+
"""Report agent activity as `OSC 9;4` taskbar/dock/tab progress.
|
|
560
|
+
|
|
561
|
+
Enabled by default; set to a falsy value (`0`, `false`, `no`, `off`, or blank)
|
|
562
|
+
to stop emitting the sequence on terminals that render it poorly. Parsed by
|
|
563
|
+
`classify_env_bool` (an unrecognized value falls through to the config value
|
|
564
|
+
rather than forcing the default). A blank value — empty or whitespace-only —
|
|
565
|
+
counts as `false` because the option declares `empty_env_is_false`, so it
|
|
566
|
+
overrides `config.toml` instead of falling through. Also settable via
|
|
567
|
+
`[ui].terminal_progress` in config.toml. `NO_TERMINAL_ESCAPE` suppresses the
|
|
568
|
+
sequence regardless.
|
|
569
|
+
"""
|
|
570
|
+
|
|
527
571
|
THEME = "DEEPAGENTS_CODE_THEME"
|
|
528
572
|
"""Force the CLI to launch with this theme name when set."""
|
|
529
573
|
|