deepagents-code 0.1.38__tar.gz → 0.1.39__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.38 → deepagents_code-0.1.39}/AGENTS.md +1 -1
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/CHANGELOG.md +7 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/PKG-INFO +1 -1
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/_build_info.py +1 -1
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/_cli_context.py +19 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/_debug_buffer.py +68 -22
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/agent.py +4 -6
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/app.py +749 -148
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/app.tcss +21 -51
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/configurable_model.py +2 -0
- deepagents_code-0.1.39/deepagents_code/offload.py +146 -0
- deepagents_code-0.1.39/deepagents_code/offload_middleware.py +643 -0
- deepagents_code-0.1.39/deepagents_code/tui/widgets/_inline_prompt.py +223 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/ask_user.py +47 -102
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/debug_console.py +30 -5
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/goal_review.py +50 -38
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/status.py +1 -1
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/pyproject.toml +1 -1
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/integration_tests/test_compact_resume.py +91 -23
- deepagents_code-0.1.39/tests/integration_tests/test_offload_server_side.py +256 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +1 -1
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/smoke_tests/test_system_prompt.py +9 -4
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_agent.py +53 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_app.py +53 -5
- deepagents_code-0.1.39/tests/unit_tests/test_compact_tool.py +660 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_debug_buffer.py +109 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_debug_console.py +93 -0
- deepagents_code-0.1.39/tests/unit_tests/test_offload.py +2065 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_ask_user.py +2 -2
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_goal_review.py +83 -15
- deepagents_code-0.1.39/tests/unit_tests/tui/widgets/test_inline_prompt.py +43 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/uv.lock +1 -1
- deepagents_code-0.1.38/deepagents_code/offload.py +0 -402
- deepagents_code-0.1.38/tests/unit_tests/test_compact_tool.py +0 -40
- deepagents_code-0.1.38/tests/unit_tests/test_offload.py +0 -1513
- deepagents_code-0.1.38/tests/unit_tests/test_offload_dict_messages.py +0 -335
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/.gitignore +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/ARCHITECTURE.md +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/COMMANDS.md +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/DEVELOPMENT.md +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/Makefile +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/README.md +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/THREAT_MODEL.md +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/_env_vars.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/_fake_models.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/_paths.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/_server_config.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/_tool_stream.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/approval_mode.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/client/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/client/commands/auth.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/client/commands/config.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/client/commands/mcp.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/client/commands/tools.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/client/launch/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/client/launch/server.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/client/launch/server_manager.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/client/non_interactive.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/client/remote_client.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/command_registry.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/config.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/config_manifest.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/doctor.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/extras_info.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/goal_rubric.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/goal_tools.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/hooks.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/integrations/sandbox_factory.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/main.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/managed_tools.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/mcp_auth.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/mcp_config.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/mcp_tools.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/mcp_trust.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/model_config.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/paste_collapse.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/reasoning_effort.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/reliable_rubric.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/server_graph.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/sessions.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/skills/trust.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/system_prompt.md +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/todo_list_prompt.md +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tool_catalog.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/textual_adapter.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/_links.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/approval.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/auth.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/chat_input.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/codex_auth.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/diff.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/effort_selector.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/goal_status.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/history.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/install_confirm.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/loading.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/message_store.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/messages.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/model_selector.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/skill_trust.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/startup_tip.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/thread_selector.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/update_available.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/update_confirm.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/tui/widgets/welcome.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/ui.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/deepagents_code/update_check.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/hatch_build.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/images/tui.png +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/scripts/install.sh +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/README.md +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/integration_tests/test_auto_approve_remote.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/client/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/client/commands/test_auth.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/client/commands/test_mcp.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/client/commands/test_tools.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/conftest.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/skills/test_skill_trust.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/smoke_tests/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/smoke_tests/conftest.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test__tool_stream.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_approval_mode.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_args.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_config.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_config_manifest.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_cursor_blink.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_cursor_style.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_doctor.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_goal_rubric.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_goal_tools.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_hatch_build.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_install_command.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_install_script.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_main.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_managed_tools.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_mcp_config.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_mcp_trust.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_model_config.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_paths.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_reasoning_effort.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_reliable_rubric.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_rubric_cli.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_sandbox_registry.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_server.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_threads_resume.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_tool_catalog.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_tracing_replicas.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_transcript_virtualization.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_history.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_links.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_status.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
- {deepagents_code-0.1.38 → deepagents_code-0.1.39}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
|
@@ -92,7 +92,7 @@ Debug logging is configured **once**, on the `deepagents_code` package logger, b
|
|
|
92
92
|
- Do **not** add per-module `configure_debug_logging(logger)` calls. They are redundant now that the package logger is configured at import, and they reintroduce the duplicate-handler problem the single-config approach solves.
|
|
93
93
|
- Every module should create its logger with `logging.getLogger(__name__)` so it stays inside the `deepagents_code.*` hierarchy and inherits the package handler. Don't set `logger.propagate = False` or attach your own handlers.
|
|
94
94
|
- The **file** handler only attaches when `DEEPAGENTS_CODE_DEBUG` is truthy; that path is a single env-var read, so it's safe on the startup hot path. See `DEVELOPMENT.md` for the `DEEPAGENTS_CODE_DEBUG` / `DEEPAGENTS_CODE_DEBUG_FILE` / `DEEPAGENTS_CODE_LOG_LEVEL` env vars.
|
|
95
|
-
- Separately, an **always-on in-memory ring buffer** (`_debug_buffer.install_log_buffer`, called from `__init__.py` right before `configure_debug_logging`) attaches unconditionally at import so the in-app Debug Console (`Ctrl+\`) can tail recent `deepagents_code.*` records without file logging. It captures `INFO` and above by default (or `DEEPAGENTS_CODE_LOG_LEVEL`), and may lower the package logger to `INFO` for the process lifetime. It never spills to the terminal (a handler is always found, so `lastResort` is skipped) and is bounded (a `deque` of 1000 records), so it's cheap enough to keep on. Because it installs *before* `configure_debug_logging`, warnings that helper emits at startup are captured and visible in the console.
|
|
95
|
+
- Separately, an **always-on in-memory ring buffer** (`_debug_buffer.install_log_buffer`, called from `__init__.py` right before `configure_debug_logging`) attaches unconditionally at import so the in-app Debug Console (`Ctrl+\`) can tail recent `deepagents_code.*` records without file logging. It captures `INFO` and above by default (or `DEEPAGENTS_CODE_LOG_LEVEL`), and may lower the package logger to `INFO` for the process lifetime. It never spills to the terminal (a handler is always found, so `lastResort` is skipped) and is bounded (a `deque` of 1000 records *per log level*), so it's cheap enough to keep on. Because it installs *before* `configure_debug_logging`, warnings that helper emits at startup are captured and visible in the console.
|
|
96
96
|
|
|
97
97
|
## CLI help screen
|
|
98
98
|
|
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.1.39](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.38...deepagents-code==0.1.39) (2026-07-14)
|
|
6
|
+
|
|
7
|
+
### Bug fixes
|
|
8
|
+
|
|
9
|
+
- Improved Debug Console log retention by partitioning retained logs by level ([#4718](https://github.com/langchain-ai/deepagents/issues/4718)) ([c6e3b35](https://github.com/langchain-ai/deepagents/commit/c6e3b351f1826aa6ea97be244acd867950a032ee)).
|
|
10
|
+
- Fixed `/offload` to run server-side ([#4696](https://github.com/langchain-ai/deepagents/issues/4696)) ([564e5a0](https://github.com/langchain-ai/deepagents/commit/564e5a05bca5236ae33ce1147865111f931d257c)).
|
|
11
|
+
|
|
5
12
|
## [0.1.38](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.37...deepagents-code==0.1.38) (2026-07-14)
|
|
6
13
|
|
|
7
14
|
### Features
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.39
|
|
4
4
|
Summary: Terminal coding agent built on the Deep Agents SDK - works with any model, with persistent memory, customizable skills, subagents, and approval controls.
|
|
5
5
|
Project-URL: Homepage, https://docs.langchain.com/oss/python/deepagents/overview
|
|
6
6
|
Project-URL: Documentation, https://reference.langchain.com/python/deepagents/
|
|
@@ -35,6 +35,10 @@ class CLIContextSchema:
|
|
|
35
35
|
|
|
36
36
|
model_params: dict[str, Any] = field(default_factory=dict)
|
|
37
37
|
|
|
38
|
+
profile_overrides: dict[str, Any] = field(default_factory=dict)
|
|
39
|
+
|
|
40
|
+
model_context_limit: int | None = None
|
|
41
|
+
|
|
38
42
|
auto_approve: bool = False
|
|
39
43
|
|
|
40
44
|
approval_mode_key: str | None = None
|
|
@@ -43,6 +47,8 @@ class CLIContextSchema:
|
|
|
43
47
|
|
|
44
48
|
blocked_goal_retry_context: str | None = None
|
|
45
49
|
|
|
50
|
+
offload_tool_call_id: str | None = None
|
|
51
|
+
|
|
46
52
|
|
|
47
53
|
class CLIContext(TypedDict, total=False):
|
|
48
54
|
"""Client-facing builder for the per-run graph context payload.
|
|
@@ -61,6 +67,12 @@ class CLIContext(TypedDict, total=False):
|
|
|
61
67
|
"""Invocation params (e.g. `temperature`, `max_tokens`) to merge
|
|
62
68
|
into `model_settings`."""
|
|
63
69
|
|
|
70
|
+
profile_overrides: dict[str, Any]
|
|
71
|
+
"""Model profile metadata supplied by `--profile-override`."""
|
|
72
|
+
|
|
73
|
+
model_context_limit: int | None
|
|
74
|
+
"""Effective context-window limit for profile-aware middleware."""
|
|
75
|
+
|
|
64
76
|
auto_approve: bool
|
|
65
77
|
"""Whether gated tool calls should skip the human-approval interrupt.
|
|
66
78
|
|
|
@@ -94,3 +106,10 @@ class CLIContext(TypedDict, total=False):
|
|
|
94
106
|
message so it is not parsed as a file mention or checkpointed as human
|
|
95
107
|
input.
|
|
96
108
|
"""
|
|
109
|
+
|
|
110
|
+
offload_tool_call_id: str | None
|
|
111
|
+
"""The sole tool-call ID authorized during a server-driven `/offload` run.
|
|
112
|
+
|
|
113
|
+
This is set by the client, not graph state, so model-generated calls cannot
|
|
114
|
+
grant themselves permission to execute during the hidden compaction turn.
|
|
115
|
+
"""
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
r"""In-memory ring buffer of recent log records for the in-app Debug Console.
|
|
2
2
|
|
|
3
|
-
A lightweight `logging.Handler` keeps the most recent structured log records in
|
|
4
|
-
bounded `deque` so the Debug Console (`Ctrl+\`) can show a live tail
|
|
5
|
-
requiring the opt-in file logging from `_debug.configure_debug_logging`.
|
|
6
|
-
|
|
7
|
-
`
|
|
3
|
+
A lightweight `logging.Handler` keeps the most recent structured log records in
|
|
4
|
+
bounded per-level `deque`s so the Debug Console (`Ctrl+\`) can show a live tail
|
|
5
|
+
without requiring the opt-in file logging from `_debug.configure_debug_logging`.
|
|
6
|
+
Partitioning retention by level means a burst of `DEBUG` output cannot evict the
|
|
7
|
+
rarer `INFO`/`WARNING`/`ERROR` records the level filter needs. The handler is
|
|
8
|
+
installed once on the `deepagents_code` package logger (see `__init__.py`); child
|
|
9
|
+
module loggers reach it via propagation.
|
|
8
10
|
|
|
9
11
|
Installation is negligible, and each emitted record only appends a structured
|
|
10
12
|
record to a bounded `deque`, so the buffer is cheap enough to keep always on.
|
|
@@ -12,21 +14,37 @@ record to a bounded `deque`, so the buffer is cheap enough to keep always on.
|
|
|
12
14
|
|
|
13
15
|
from __future__ import annotations
|
|
14
16
|
|
|
15
|
-
import itertools
|
|
16
17
|
import logging
|
|
18
|
+
import operator
|
|
17
19
|
import os
|
|
18
20
|
from collections import deque
|
|
19
21
|
from dataclasses import dataclass
|
|
20
22
|
|
|
23
|
+
from deepagents_code._debug import LOG_LEVELS
|
|
21
24
|
from deepagents_code._env_vars import LOG_LEVEL
|
|
22
25
|
|
|
23
26
|
DEFAULT_CAPACITY = 1000
|
|
24
|
-
"""Maximum number of records retained in the ring buffer."""
|
|
27
|
+
"""Maximum number of records retained per level in the ring buffer."""
|
|
28
|
+
|
|
29
|
+
_FALLBACK_LEVEL_BUCKET = "_other"
|
|
30
|
+
"""Retention bucket for records whose level name is not in `LOG_LEVELS`.
|
|
31
|
+
|
|
32
|
+
Non-standard level names are retained here rather than discarded at
|
|
33
|
+
classification time, and sharing one bucket keeps the number of per-level deques
|
|
34
|
+
bounded no matter how many distinct custom names appear. Like every bucket, this
|
|
35
|
+
one is bounded to *capacity* and evicts oldest-first, so — unlike the standard
|
|
36
|
+
levels, which each get isolated retention — distinct custom levels compete for a
|
|
37
|
+
single budget and can evict one another."""
|
|
25
38
|
|
|
26
39
|
_DATE_FORMAT = "%H:%M:%S"
|
|
27
40
|
_FORMATTER = logging.Formatter(datefmt=_DATE_FORMAT)
|
|
28
41
|
|
|
29
42
|
|
|
43
|
+
def retention_bucket_for_level(level: str) -> str:
|
|
44
|
+
"""Return the bounded retention bucket key for a log level name."""
|
|
45
|
+
return level if level in LOG_LEVELS else _FALLBACK_LEVEL_BUCKET
|
|
46
|
+
|
|
47
|
+
|
|
30
48
|
@dataclass(frozen=True, slots=True)
|
|
31
49
|
class InMemoryLogRecord:
|
|
32
50
|
"""Structured log record retained by the in-memory debug buffer."""
|
|
@@ -44,13 +62,24 @@ class InMemoryLogRecord:
|
|
|
44
62
|
|
|
45
63
|
|
|
46
64
|
class InMemoryLogBuffer(logging.Handler):
|
|
47
|
-
"""Logging handler retaining the most recent structured records in memory.
|
|
65
|
+
"""Logging handler retaining the most recent structured records in memory.
|
|
66
|
+
|
|
67
|
+
Retention is partitioned by level: each recognized level name (see
|
|
68
|
+
`LOG_LEVELS`) keeps its own bounded `deque` of *capacity* records, while
|
|
69
|
+
unrecognized names share the `_FALLBACK_LEVEL_BUCKET` deque. A burst of
|
|
70
|
+
high-volume records at one recognized level (typically `DEBUG`) therefore
|
|
71
|
+
cannot evict the rarer, higher-severity records at other recognized levels,
|
|
72
|
+
so the Debug Console's level filter can still surface them. Each retained
|
|
73
|
+
record is tagged with its monotonic emission sequence number so snapshots
|
|
74
|
+
stay chronologically ordered across levels.
|
|
75
|
+
"""
|
|
48
76
|
|
|
49
77
|
def __init__(self, capacity: int = DEFAULT_CAPACITY) -> None:
|
|
50
|
-
"""Create the handler with a bounded backing `deque
|
|
78
|
+
"""Create the handler with a bounded backing `deque` per level.
|
|
51
79
|
|
|
52
80
|
Args:
|
|
53
|
-
capacity: Maximum records to retain; oldest are dropped
|
|
81
|
+
capacity: Maximum records to retain per level; oldest are dropped
|
|
82
|
+
first.
|
|
54
83
|
|
|
55
84
|
Raises:
|
|
56
85
|
ValueError: If *capacity* is less than 1. A zero-capacity buffer
|
|
@@ -61,20 +90,32 @@ class InMemoryLogBuffer(logging.Handler):
|
|
|
61
90
|
msg = f"capacity must be >= 1, got {capacity}"
|
|
62
91
|
raise ValueError(msg)
|
|
63
92
|
super().__init__()
|
|
64
|
-
self.
|
|
93
|
+
self._capacity = capacity
|
|
94
|
+
self._levels: dict[str, deque[tuple[int, InMemoryLogRecord]]] = {}
|
|
65
95
|
self._total = 0
|
|
66
96
|
|
|
67
97
|
def emit(self, record: logging.LogRecord) -> None:
|
|
68
|
-
"""Append the structured *record* to
|
|
98
|
+
"""Append the structured *record* to its level's ring buffer."""
|
|
69
99
|
self.acquire()
|
|
70
100
|
try:
|
|
71
|
-
self.
|
|
101
|
+
structured = self._make_record(record)
|
|
102
|
+
bucket = self._level_bucket(structured.level)
|
|
103
|
+
bucket.append((self._total, structured))
|
|
72
104
|
self._total += 1
|
|
73
105
|
except Exception: # noqa: BLE001 # never let logging crash the app
|
|
74
106
|
self.handleError(record)
|
|
75
107
|
finally:
|
|
76
108
|
self.release()
|
|
77
109
|
|
|
110
|
+
def _level_bucket(self, level: str) -> deque[tuple[int, InMemoryLogRecord]]:
|
|
111
|
+
"""Return the retention deque for *level*, creating it on first use."""
|
|
112
|
+
key = retention_bucket_for_level(level)
|
|
113
|
+
bucket = self._levels.get(key)
|
|
114
|
+
if bucket is None:
|
|
115
|
+
bucket = deque(maxlen=self._capacity)
|
|
116
|
+
self._levels[key] = bucket
|
|
117
|
+
return bucket
|
|
118
|
+
|
|
78
119
|
@property
|
|
79
120
|
def total_emitted(self) -> int:
|
|
80
121
|
"""Total records ever emitted (monotonic; survives buffer eviction)."""
|
|
@@ -107,15 +148,20 @@ class InMemoryLogBuffer(logging.Handler):
|
|
|
107
148
|
self.release()
|
|
108
149
|
|
|
109
150
|
def _records_since_unlocked(self, index: int) -> list[InMemoryLogRecord]:
|
|
110
|
-
"""Return retained records from *index* while the handler lock is held.
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
151
|
+
"""Return retained records from *index* while the handler lock is held.
|
|
152
|
+
|
|
153
|
+
Merges the per-level deques and restores chronological order using each
|
|
154
|
+
record's emission sequence number, so callers see one ordered tail even
|
|
155
|
+
though retention is partitioned by level.
|
|
156
|
+
"""
|
|
157
|
+
tagged = [
|
|
158
|
+
entry
|
|
159
|
+
for bucket in self._levels.values()
|
|
160
|
+
for entry in bucket
|
|
161
|
+
if entry[0] >= index
|
|
162
|
+
]
|
|
163
|
+
tagged.sort(key=operator.itemgetter(0))
|
|
164
|
+
return [record for _seq, record in tagged]
|
|
119
165
|
|
|
120
166
|
@staticmethod
|
|
121
167
|
def _make_record(record: logging.LogRecord) -> InMemoryLogRecord:
|
|
@@ -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.39" # 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."""
|
|
@@ -86,6 +86,8 @@ from deepagents_code.local_context import (
|
|
|
86
86
|
_AsyncExecutableBackend,
|
|
87
87
|
_ExecutableBackend,
|
|
88
88
|
)
|
|
89
|
+
from deepagents_code.offload import _offload_fallback_root
|
|
90
|
+
from deepagents_code.offload_middleware import _create_cli_compaction_middleware
|
|
89
91
|
from deepagents_code.project_utils import ProjectContext, get_server_project_context
|
|
90
92
|
from deepagents_code.reliable_rubric import ReliableRubricMiddleware
|
|
91
93
|
from deepagents_code.subagents import list_subagents
|
|
@@ -1916,7 +1918,7 @@ def create_cli_agent(
|
|
|
1916
1918
|
virtual_mode=True,
|
|
1917
1919
|
)
|
|
1918
1920
|
conversation_history_backend = FilesystemBackend(
|
|
1919
|
-
root_dir=
|
|
1921
|
+
root_dir=_offload_fallback_root() / "conversation_history",
|
|
1920
1922
|
virtual_mode=True,
|
|
1921
1923
|
)
|
|
1922
1924
|
composite_backend = CompositeBackend(
|
|
@@ -1933,11 +1935,7 @@ def create_cli_agent(
|
|
|
1933
1935
|
routes={},
|
|
1934
1936
|
)
|
|
1935
1937
|
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
agent_middleware.append(
|
|
1939
|
-
create_summarization_tool_middleware(model, composite_backend)
|
|
1940
|
-
)
|
|
1938
|
+
agent_middleware.append(_create_cli_compaction_middleware(model, composite_backend))
|
|
1941
1939
|
|
|
1942
1940
|
# Rubric-driven self-evaluation. The middleware is a no-op until a
|
|
1943
1941
|
# `rubric` is supplied on invocation state, so installing it is safe.
|