deepagents-code 0.1.45__tar.gz → 0.1.47__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.45 → deepagents_code-0.1.47}/CHANGELOG.md +32 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/DEVELOPMENT.md +22 -1
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/PKG-INFO +18 -18
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/THREAT_MODEL.md +10 -2
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_ask_user_types.py +14 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_build_info.py +1 -1
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_cli_context.py +3 -8
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_constants.py +11 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_env_vars.py +49 -5
- deepagents_code-0.1.47/deepagents_code/_repository_bounds.py +462 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_server_config.py +26 -2
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/agent.py +622 -186
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/app.py +1128 -313
- deepagents_code-0.1.47/deepagents_code/approval_mode.py +584 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/ask_user.py +108 -13
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/auto_mode.py +429 -47
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +1 -1
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/client/commands/config.py +52 -3
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/client/launch/server.py +48 -4
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/client/launch/server_manager.py +25 -1
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/client/non_interactive.py +4 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/config.py +225 -20
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/config_manifest.py +140 -2
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/configurable_model.py +129 -60
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/doctor.py +7 -5
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/extras_info.py +269 -46
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/goal_rubric.py +201 -340
- deepagents_code-0.1.47/deepagents_code/goal_state_notice.py +442 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/goal_tools.py +170 -93
- deepagents_code-0.1.47/deepagents_code/hooks/capabilities.py +238 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/hooks/engine.py +25 -5
- deepagents_code-0.1.47/deepagents_code/hooks/env.py +29 -0
- deepagents_code-0.1.47/deepagents_code/hooks/loading.py +360 -0
- deepagents_code-0.1.47/deepagents_code/hooks/migration.py +90 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/hooks/models/config.py +11 -2
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/hooks/models/domain.py +1 -0
- deepagents_code-0.1.47/deepagents_code/hooks/projection.py +343 -0
- deepagents_code-0.1.47/deepagents_code/hooks/reducer.py +510 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/hooks/runner.py +33 -9
- deepagents_code-0.1.47/deepagents_code/hooks/runtime.py +163 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/hooks/snapshot.py +60 -31
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/hooks/tools.py +35 -4
- deepagents_code-0.1.47/deepagents_code/hooks/transcript.py +483 -0
- deepagents_code-0.1.47/deepagents_code/hooks/validate_terminal_sequence.py +30 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/main.py +65 -37
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/model_config.py +24 -2
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/offload.py +9 -2
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/offload_middleware.py +8 -13
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/onboarding.py +54 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/plugins/adapters/skills_middleware.py +8 -8
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/plugins/store.py +4 -1
- deepagents_code-0.1.47/deepagents_code/reliable_rubric.py +345 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/server_graph.py +9 -12
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/sessions.py +18 -6
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/system_prompt.md +0 -2
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tools.py +45 -57
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/__init__.py +1 -1
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/textual_adapter.py +3 -7
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/agent_selector.py +0 -1
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/approval.py +4 -5
- deepagents_code-0.1.47/deepagents_code/tui/widgets/auto_mode_notice.py +159 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/debug_console.py +52 -14
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/effort_selector.py +0 -1
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/launch_init.py +177 -2
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/messages.py +84 -19
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/notification_settings.py +0 -1
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/startup_tip.py +47 -7
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/welcome.py +4 -4
- deepagents_code-0.1.47/deepagents_code/tui/widgets/yolo_mode_notice.py +161 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/ui.py +5 -3
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/update_check.py +3 -1
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/examples/skills/skill-creator/scripts/quick_validate.py +1 -1
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/pyproject.toml +15 -14
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/scripts/install.sh +7 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/conftest.py +12 -1
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/hooks/models/test_models.py +67 -17
- deepagents_code-0.1.47/tests/unit_tests/hooks/test_configuration.py +326 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/hooks/test_engine.py +344 -19
- deepagents_code-0.1.47/tests/unit_tests/hooks/test_execution.py +247 -0
- deepagents_code-0.1.47/tests/unit_tests/hooks/test_transcript.py +273 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -118
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_agent.py +683 -196
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_app.py +2524 -267
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_approval_mode.py +190 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_args.py +32 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_ask_user_middleware.py +229 -6
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_auto_mode.py +2089 -529
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_compact_tool.py +1 -2
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_config.py +422 -17
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_config_manifest.py +301 -0
- deepagents_code-0.1.47/tests/unit_tests/test_config_recursion_limit.py +21 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_configurable_model.py +192 -45
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_debug_console.py +80 -1
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_doctor.py +65 -2
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_end_to_end.py +2 -2
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_extras_info.py +352 -17
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_goal_rubric.py +132 -8
- deepagents_code-0.1.47/tests/unit_tests/test_goal_state_notice.py +312 -0
- deepagents_code-0.1.47/tests/unit_tests/test_goal_state_persistence.py +290 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_goal_tools.py +265 -51
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_install_script.py +9 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_main.py +282 -16
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_main_acp_mode.py +43 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_main_args.py +59 -1
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_model_config.py +46 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_onboarding.py +38 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_reasoning_effort.py +22 -0
- deepagents_code-0.1.47/tests/unit_tests/test_reliable_rubric.py +505 -0
- deepagents_code-0.1.47/tests/unit_tests/test_repository_bounds.py +240 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_server.py +153 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_server_config.py +54 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_server_graph.py +3 -1
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_sessions.py +101 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_tool_catalog.py +5 -17
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_version.py +29 -18
- deepagents_code-0.1.47/tests/unit_tests/tools/test_tool_arg_schemas.py +149 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/test_textual_adapter.py +2 -65
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_agent_selector.py +20 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_launch_init.py +122 -1
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_messages.py +69 -9
- deepagents_code-0.1.47/tests/unit_tests/tui/widgets/test_notification_settings.py +29 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_startup_tip.py +47 -6
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_thread_selector.py +37 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_welcome.py +14 -14
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/uv.lock +180 -182
- deepagents_code-0.1.45/deepagents_code/approval_mode.py +0 -312
- deepagents_code-0.1.45/deepagents_code/hooks/projection.py +0 -229
- deepagents_code-0.1.45/deepagents_code/hooks/reducer.py +0 -331
- deepagents_code-0.1.45/deepagents_code/reliable_rubric.py +0 -97
- deepagents_code-0.1.45/tests/unit_tests/test_reliable_rubric.py +0 -167
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/.gitignore +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/AGENTS.md +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/ARCHITECTURE.md +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/COMMANDS.md +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/Makefile +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/README.md +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_debug_buffer.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_fake_models.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_paths.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/_tool_stream.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/auth_display.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/client/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/client/commands/auth.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/client/commands/mcp.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/client/commands/tools.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/client/launch/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/client/remote_client.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/command_registry.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/hooks/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/hooks/legacy.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/hooks/models/adapters.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/hooks/models/transport.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/hooks/models/wire.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/integrations/openai_codex.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/integrations/sandbox_factory.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/integrations/sandbox_registry.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/json_types.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/managed_tools.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/mcp_auth.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/mcp_config.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/mcp_tools.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/paste_collapse.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/plugins/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/plugins/_json.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/plugins/adapters/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/plugins/adapters/mcp.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/plugins/adapters/skills.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/plugins/commands_cli.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/plugins/discovery.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/plugins/manifest.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/plugins/marketplace.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/plugins/models.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/plugins/substitution.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/reasoning_effort.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/resume_state.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/skills/merge.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/skills/trust.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/todo_list_prompt.md +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tool_catalog.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/screens/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/_links.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/ask_user.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/auth.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/chat_input.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/codex_auth.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/diff.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/goal_review.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/goal_status.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/history.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/install_confirm.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/loading.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/message_store.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/model_selector.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/plugin_reload.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/skill_trust.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/status.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/thread_selector.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/update_available.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/update_confirm.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/tui/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/hatch_build.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/images/tui.png +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/README.md +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/integration_tests/test_auto_approve_remote.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/integration_tests/test_offload_server_side.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/client/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/client/commands/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/client/commands/test_auth.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/client/commands/test_mcp.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/client/commands/test_tools.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/hooks/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/hooks/models/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/plugins/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/plugins/test_marketplace.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/plugins/test_store.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_merge.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_skill_trust.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/smoke_tests/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/smoke_tests/conftest.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test__tool_stream.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_auth_display.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_cursor_blink.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_cursor_style.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_debug_buffer.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_goal_criteria_client.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_hatch_build.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_install_command.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_json_types.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_managed_tools.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_config.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_openai_codex_integration.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_paths.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_rubric_cli.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_sandbox_registry.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_startup_blocking.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_threads_resume.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_tracing_replicas.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_transcript_virtualization.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/modals/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/__init__.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_history.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_links.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_plugin_reload.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_status.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
- {deepagents_code-0.1.45 → deepagents_code-0.1.47}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
|
@@ -2,6 +2,38 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.1.47](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.46...deepagents-code==0.1.47) (2026-07-24)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- Added `yolo` mode to the `Shift+Tab` approval cycle ([#5035](https://github.com/langchain-ai/deepagents/issues/5035)).
|
|
10
|
+
- Show the changelog link before prompting to update via the install script ([#5034](https://github.com/langchain-ai/deepagents/issues/5034)).
|
|
11
|
+
|
|
12
|
+
## [0.1.46](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.45...deepagents-code==0.1.46) (2026-07-24)
|
|
13
|
+
|
|
14
|
+
### Highlights
|
|
15
|
+
|
|
16
|
+
- Auto mode is now generally available. [#4957](https://github.com/langchain-ai/deepagents/issues/4957)
|
|
17
|
+
- Added configurable Auto goal-criteria acceptance. [#4940](https://github.com/langchain-ai/deepagents/issues/4940)
|
|
18
|
+
- Improved Auto behavior by authorizing actions from active goal/rubric directives, avoiding redundant approval prompts, showing the enable notice only on first global enable, deduplicating classifier-unavailable transcript spam, logging underlying classifier failures, and reporting classifier timeout budgets. [#5017](https://github.com/langchain-ai/deepagents/issues/5017) [#4993](https://github.com/langchain-ai/deepagents/issues/4993) [#5012](https://github.com/langchain-ai/deepagents/issues/5012) [#5013](https://github.com/langchain-ai/deepagents/issues/5013) [#5011](https://github.com/langchain-ai/deepagents/issues/5011) [#5025](https://github.com/langchain-ai/deepagents/issues/5025)
|
|
19
|
+
- Added Hooks v2 capability snapshots and session transcripts, and hardened Hooks v2 command execution. [#4916](https://github.com/langchain-ai/deepagents/issues/4916) [#4918](https://github.com/langchain-ai/deepagents/issues/4918) [#4917](https://github.com/langchain-ai/deepagents/issues/4917)
|
|
20
|
+
- Raised the agent recursion limit to 2000 and made it configurable. [#4994](https://github.com/langchain-ai/deepagents/issues/4994)
|
|
21
|
+
|
|
22
|
+
### Improvements and fixes
|
|
23
|
+
|
|
24
|
+
- Let the rubric grader inspect working-directory files, show rubric grader defaults, and improved `/rubric` help and empty-state messaging. [#4835](https://github.com/langchain-ai/deepagents/issues/4835) [#4966](https://github.com/langchain-ai/deepagents/issues/4966) [#5015](https://github.com/langchain-ai/deepagents/issues/5015)
|
|
25
|
+
- Unified goal activation signaling. [#4980](https://github.com/langchain-ai/deepagents/issues/4980)
|
|
26
|
+
- Made Version, Model, and CWD copyable in the Debug Console. [#4975](https://github.com/langchain-ai/deepagents/issues/4975)
|
|
27
|
+
- Improved `config get` output when a key is missing. [#4976](https://github.com/langchain-ai/deepagents/issues/4976)
|
|
28
|
+
- Aborted YOLO launch on `Ctrl+C`/`Ctrl+D` and made the YOLO warning friendlier for new users. [#4953](https://github.com/langchain-ai/deepagents/issues/4953) [#4950](https://github.com/langchain-ai/deepagents/issues/4950)
|
|
29
|
+
- Updated LangSmith handling: secret redaction is disabled by default, `/trace` now flags empty env overrides that shadow the LangSmith key, and the default US endpoint is no longer treated as a custom target. [#4970](https://github.com/langchain-ai/deepagents/issues/4970) [#4996](https://github.com/langchain-ai/deepagents/issues/4996) [#5022](https://github.com/langchain-ai/deepagents/issues/5022)
|
|
30
|
+
- Injected OpenAI `prompt_cache_key` for any OpenAI-provider endpoint. [#4995](https://github.com/langchain-ai/deepagents/issues/4995)
|
|
31
|
+
- Improved tool and schema presentation: finished calls stay on the live tool-group line, first-party tool schemas now include field descriptions, and `web_search`/`fetch_url` tool descriptions were trimmed. [#4927](https://github.com/langchain-ai/deepagents/issues/4927) [#5019](https://github.com/langchain-ai/deepagents/issues/5019) [#5016](https://github.com/langchain-ai/deepagents/issues/5016)
|
|
32
|
+
- Omitted `plugins/` and `conversation_history/` from the `/agent` picker. [#4991](https://github.com/langchain-ai/deepagents/issues/4991)
|
|
33
|
+
- Made selector modal backdrop dimming consistent. [#4990](https://github.com/langchain-ai/deepagents/issues/4990)
|
|
34
|
+
- Restored the `"Server log preserved at:"` notice on exit. [#4999](https://github.com/langchain-ai/deepagents/issues/4999)
|
|
35
|
+
- Used the SDK pin as the effective editable version. [#4949](https://github.com/langchain-ai/deepagents/issues/4949)
|
|
36
|
+
|
|
5
37
|
## [0.1.45](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.44...deepagents-code==0.1.45) (2026-07-22)
|
|
6
38
|
|
|
7
39
|
### Features
|
|
@@ -5,6 +5,7 @@ New to the package? Start with [`ARCHITECTURE.md`](./ARCHITECTURE.md) for a high
|
|
|
5
5
|
## Contents
|
|
6
6
|
|
|
7
7
|
- [Quickstart](#quickstart) — get a local checkout running and run the checks CI enforces
|
|
8
|
+
- [LangSmith tracing projects](#langsmith-tracing-projects) — route dev traces away from the shared GA project
|
|
8
9
|
- [Local dev installs](#local-dev-installs) — keep an editable `dcode-dev` separate from a released install
|
|
9
10
|
- [Debugging](#debugging) — diagnose startup crashes and client-side issues
|
|
10
11
|
- [Live CSS development with Textual devtools](#live-css-development-with-textual-devtools) — UI/CSS hot-reload
|
|
@@ -68,6 +69,26 @@ make lint
|
|
|
68
69
|
|
|
69
70
|
Run `make help` to see every available target.
|
|
70
71
|
|
|
72
|
+
## LangSmith tracing projects
|
|
73
|
+
|
|
74
|
+
When LangSmith tracing is enabled and a `LANGSMITH_API_KEY` is available, `deepagents-code` traces its own agent runs to LangSmith. A key alone is not enough for environment-supplied keys — set `LANGSMITH_TRACING=true`. Keys stored via `/auth` auto- enable tracing unless you explicitly opt out (for example `DEEPAGENTS_CODE_LANGSMITH_TRACING=false`).
|
|
75
|
+
|
|
76
|
+
By default those runs land in the `deepagents-code` project, but the team routes shared runs to a GA project (`shared-deepagents-code`) that is monitored by LangSmith Engine, which raises high-priority Slack alerts on suspected issues.
|
|
77
|
+
|
|
78
|
+
**Do not point local development at the GA project.** Active development produces failures, half-finished branches, and experiments that Engine flags as issues — noise that buries the alerts that matter for the production project and costs the team triage time. Keep dev and prod runs in separate projects so Engine alerting on the GA project stays high-signal (this also mirrors LangSmith best practice of splitting dev and prod environments into distinct projects).
|
|
79
|
+
|
|
80
|
+
Route your local runs to a dev-scoped project via `DEEPAGENTS_CODE_LANGSMITH_PROJECT` (this overrides only the agent's own traces, leaving your shell's `LANGSMITH_PROJECT` for user code untouched):
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# A shared dev bucket, or your own personal project — anything but the GA project
|
|
84
|
+
export DEEPAGENTS_CODE_LANGSMITH_PROJECT=shared-deepagents-code-dev
|
|
85
|
+
uv run deepagents-code
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Set the same override for [local dev installs](#local-dev-installs) (`dcode-dev`), not only ad-hoc `uv run` sessions. You can also set it persistently under `[tracing]` in the config file (`tracing.langsmith_project`) or from the `/auth` screen. The startup splash and `/trace` show the project a run is writing to — confirm it is not the GA project before doing noisy work.
|
|
89
|
+
|
|
90
|
+
When onboarding a new tracing project to Engine, capture the nature of that project first: a production/GA app warrants high-priority alerts, while a staging or active-dev project should use looser thresholds (or stay off Engine) so it does not generate false positives.
|
|
91
|
+
|
|
71
92
|
## Debugging
|
|
72
93
|
|
|
73
94
|
Deep Agents Code runs as two processes: the **Textual TUI** you interact with, and a **`langgraph dev` subprocess** that hosts the agent graph. Each writes its own log, and a single switch turns both on:
|
|
@@ -94,7 +115,7 @@ Then pick the log you need by symptom:
|
|
|
94
115
|
|
|
95
116
|
The TUI only surfaces a one-line banner; the actual exception lives in the subprocess's combined stdout/stderr. To get it:
|
|
96
117
|
|
|
97
|
-
1. **Re-run with debugging on** (see above).
|
|
118
|
+
1. **Re-run with debugging on** (see above). After the app exits and the terminal is restored, the log is preserved and its path is printed to stderr as `Server log preserved at: ...`.
|
|
98
119
|
2. **Open the newest log.** On macOS, `tempfile` resolves to `$TMPDIR` (a path under `/var/folders/.../T/`):
|
|
99
120
|
|
|
100
121
|
```bash
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.47
|
|
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/
|
|
@@ -28,20 +28,20 @@ Requires-Python: <4.0,>=3.11
|
|
|
28
28
|
Requires-Dist: aiosqlite<1.0.0,>=0.22.1
|
|
29
29
|
Requires-Dist: anyio<5.0.0,>=4.14.2
|
|
30
30
|
Requires-Dist: deepagents-acp<1.0.0,>=0.0.9
|
|
31
|
-
Requires-Dist: deepagents==0.7.
|
|
31
|
+
Requires-Dist: deepagents==0.7.0b2
|
|
32
32
|
Requires-Dist: filelock<3.30,>=3.29.7
|
|
33
33
|
Requires-Dist: httpx<1.0.0,>=0.28.1
|
|
34
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.
|
|
34
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.1
|
|
35
35
|
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1
|
|
36
36
|
Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.0
|
|
37
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.4.
|
|
37
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.4.1
|
|
38
38
|
Requires-Dist: langchain-quickjs<0.4.0,>=0.3.3
|
|
39
39
|
Requires-Dist: langchain<2.0.0,>=1.3.14
|
|
40
40
|
Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
|
|
41
41
|
Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.31
|
|
42
42
|
Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.31.1
|
|
43
43
|
Requires-Dist: langgraph-sdk<1.0.0,>=0.4.2
|
|
44
|
-
Requires-Dist: langsmith[sandbox]>=0.10.
|
|
44
|
+
Requires-Dist: langsmith[sandbox]>=0.10.10
|
|
45
45
|
Requires-Dist: markdownify<2.0.0,>=1.2.3
|
|
46
46
|
Requires-Dist: mcp<2.0.0,>=1.28.1
|
|
47
47
|
Requires-Dist: packaging>=26.2
|
|
@@ -62,13 +62,13 @@ Requires-Dist: uuid-utils<1.0.0,>=0.17.0
|
|
|
62
62
|
Provides-Extra: agentcore
|
|
63
63
|
Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.5; extra == 'agentcore'
|
|
64
64
|
Provides-Extra: all-providers
|
|
65
|
-
Requires-Dist: aiohttp<3.15.0,>=3.14.
|
|
66
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.
|
|
67
|
-
Requires-Dist: langchain-aws<2.0.0,>=1.6.
|
|
65
|
+
Requires-Dist: aiohttp<3.15.0,>=3.14.3; extra == 'all-providers'
|
|
66
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.1; extra == 'all-providers'
|
|
67
|
+
Requires-Dist: langchain-aws<2.0.0,>=1.6.3; extra == 'all-providers'
|
|
68
68
|
Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'all-providers'
|
|
69
69
|
Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
|
|
70
70
|
Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
71
|
-
Requires-Dist: langchain-fireworks<2.0.0,>=1.5.
|
|
71
|
+
Requires-Dist: langchain-fireworks<2.0.0,>=1.5.1; extra == 'all-providers'
|
|
72
72
|
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1; extra == 'all-providers'
|
|
73
73
|
Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.4; extra == 'all-providers'
|
|
74
74
|
Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'all-providers'
|
|
@@ -79,8 +79,8 @@ Requires-Dist: langchain-meta<2.0.0,>=0.5.0; extra == 'all-providers'
|
|
|
79
79
|
Requires-Dist: langchain-mistralai<2.0.0,>=1.1.6; extra == 'all-providers'
|
|
80
80
|
Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'all-providers'
|
|
81
81
|
Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
82
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.4.
|
|
83
|
-
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.
|
|
82
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.4.1; extra == 'all-providers'
|
|
83
|
+
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.7; extra == 'all-providers'
|
|
84
84
|
Requires-Dist: langchain-perplexity<2.0.0,>=1.4.0; extra == 'all-providers'
|
|
85
85
|
Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'all-providers'
|
|
86
86
|
Requires-Dist: langchain-xai<2.0.0,>=1.3.0; extra == 'all-providers'
|
|
@@ -91,11 +91,11 @@ Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
|
|
|
91
91
|
Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
|
|
92
92
|
Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
|
|
93
93
|
Provides-Extra: anthropic
|
|
94
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.
|
|
94
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.5.1; extra == 'anthropic'
|
|
95
95
|
Provides-Extra: baseten
|
|
96
96
|
Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'baseten'
|
|
97
97
|
Provides-Extra: bedrock
|
|
98
|
-
Requires-Dist: langchain-aws<2.0.0,>=1.6.
|
|
98
|
+
Requires-Dist: langchain-aws<2.0.0,>=1.6.3; extra == 'bedrock'
|
|
99
99
|
Provides-Extra: cohere
|
|
100
100
|
Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'cohere'
|
|
101
101
|
Provides-Extra: daytona
|
|
@@ -103,7 +103,7 @@ Requires-Dist: langchain-daytona>=0.0.7; extra == 'daytona'
|
|
|
103
103
|
Provides-Extra: deepseek
|
|
104
104
|
Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'deepseek'
|
|
105
105
|
Provides-Extra: fireworks
|
|
106
|
-
Requires-Dist: langchain-fireworks<2.0.0,>=1.5.
|
|
106
|
+
Requires-Dist: langchain-fireworks<2.0.0,>=1.5.1; extra == 'fireworks'
|
|
107
107
|
Provides-Extra: google-genai
|
|
108
108
|
Requires-Dist: langchain-google-genai<5.0.0,>=4.3.1; extra == 'google-genai'
|
|
109
109
|
Provides-Extra: groq
|
|
@@ -115,7 +115,7 @@ Requires-Dist: langchain-ibm<2.0.0,>=1.1.0; extra == 'ibm'
|
|
|
115
115
|
Provides-Extra: litellm
|
|
116
116
|
Requires-Dist: langchain-litellm<2.0.0,>=0.7.0; extra == 'litellm'
|
|
117
117
|
Provides-Extra: media
|
|
118
|
-
Requires-Dist: av<
|
|
118
|
+
Requires-Dist: av<19.0.0,>=18.0.0; extra == 'media'
|
|
119
119
|
Requires-Dist: pillow<13.0.0,>=12.3.0; extra == 'media'
|
|
120
120
|
Provides-Extra: meta
|
|
121
121
|
Requires-Dist: langchain-meta<2.0.0,>=0.5.0; extra == 'meta'
|
|
@@ -124,14 +124,14 @@ Requires-Dist: langchain-mistralai<2.0.0,>=1.1.6; extra == 'mistralai'
|
|
|
124
124
|
Provides-Extra: modal
|
|
125
125
|
Requires-Dist: langchain-modal>=0.0.5; extra == 'modal'
|
|
126
126
|
Provides-Extra: nvidia
|
|
127
|
-
Requires-Dist: aiohttp<3.15.0,>=3.14.
|
|
127
|
+
Requires-Dist: aiohttp<3.15.0,>=3.14.3; extra == 'nvidia'
|
|
128
128
|
Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'nvidia'
|
|
129
129
|
Provides-Extra: ollama
|
|
130
130
|
Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'ollama'
|
|
131
131
|
Provides-Extra: openai
|
|
132
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.4.
|
|
132
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.4.1; extra == 'openai'
|
|
133
133
|
Provides-Extra: openrouter
|
|
134
|
-
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.
|
|
134
|
+
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.7; extra == 'openrouter'
|
|
135
135
|
Provides-Extra: perplexity
|
|
136
136
|
Requires-Dist: langchain-perplexity<2.0.0,>=1.4.0; extra == 'perplexity'
|
|
137
137
|
Provides-Extra: quickjs
|
|
@@ -348,6 +348,7 @@
|
|
|
348
348
|
| T9 | DF23 | — | `class_path` in config.toml triggers arbitrary Python code execution via `importlib.import_module()` | TB11 | Low | Verified | `config._create_model_from_class`, `model_config.ProviderConfig` |
|
|
349
349
|
| T10 | DF24 | DC1 | MCP stdio subprocess env dict accepts arbitrary keys including `PATH`, `LD_PRELOAD`, `PYTHONPATH` without filtering | TB4 | Low | Verified | `mcp_tools._validate_server_config`, `mcp_tools._load_tools_from_config` |
|
|
350
350
|
| T12 | DF10 | — | Project `.env` sets shell startup-hook variables (`BASH_ENV`, `ENV`) that run attacker-controlled scripts when `dcode` spawns Bash, before any HITL approval | TB11 | High | Verified | `config._load_dotenv`, `local_context.build_detect_script` |
|
|
351
|
+
| T13 | DF7 | — | Configured shell allow-list checks only the first token, so an allow-listed interpreter/wrapper (`python3`, `bash`, `env`, `xargs`, …) runs arbitrary code via its arguments without approval in non-interactive mode | TB2 | Medium | Verified | `config.is_shell_command_allowed`, `config.contains_dangerous_patterns` |
|
|
351
352
|
|
|
352
353
|
### Threat Details
|
|
353
354
|
|
|
@@ -360,7 +361,7 @@
|
|
|
360
361
|
#### T2: Shell Allow-List Bypass via `SHELL_ALLOW_ALL`
|
|
361
362
|
|
|
362
363
|
- **Flow**: DF7 (LLM tool call) → C4 Tools (execute)
|
|
363
|
-
- **Description**: When `--shell-allow-list all` (or `DEEPAGENTS_SHELL_ALLOW_LIST=all`) is set, `is_shell_command_allowed` returns `True` for any non-empty command without invoking `contains_dangerous_patterns`. In non-interactive mode, any shell command the LLM requests executes unconditionally. Combined with T1, an attacker-controlled page could cause arbitrary command execution.
|
|
364
|
+
- **Description**: When `--shell-allow-list all` (or `DEEPAGENTS_SHELL_ALLOW_LIST=all`) is set, `is_shell_command_allowed` returns `True` for any non-empty command without invoking `contains_dangerous_patterns`. In non-interactive mode, any shell command the LLM requests executes unconditionally. Combined with T1, an attacker-controlled page could cause arbitrary command execution. A configured (non-`all`) allow-list narrows this but is not a robust boundary either — see T13.
|
|
364
365
|
- **Preconditions**: (1) User has configured `--shell-allow-list all`; (2) Non-interactive mode; (3) Successful prompt injection via DF8/DF9.
|
|
365
366
|
|
|
366
367
|
#### T3: Unicode Homoglyph URL in Approval Dialog
|
|
@@ -424,6 +425,12 @@
|
|
|
424
425
|
- **Description**: `config._load_dotenv` discovers the nearest project `.env` by walking up from the working directory and applies its values to the process environment (`override=False`, so shell-exported values still win). Bash treats several environment variables as startup hooks — `BASH_ENV` and `ENV` name a file that is sourced when a non-interactive shell starts. Because Deep Agents Code runs its own local-context detection through Bash at startup (`local_context.build_detect_script`) and spawns shells for the `execute` tool, a project `.env` that sets one of these keys could run attacker-controlled scripts inside the `dcode` process *before* any model-requested tool call or HITL approval prompt. The broader trust boundary is that running `dcode` in a project directory lets that project influence the process environment.
|
|
425
426
|
- **Preconditions**: (1) User launches `dcode` in a directory containing an attacker-controlled `.env` (for example, a freshly cloned untrusted repository); (2) the `.env` sets a shell startup-hook key that is not already exported in the user's shell (dotenv uses `override=False`).
|
|
426
427
|
|
|
428
|
+
#### T13: First-Token Shell Allow-List Bypass via Interpreters/Wrappers
|
|
429
|
+
|
|
430
|
+
- **Flow**: DF7 (LLM tool call) → C4 Tools (execute)
|
|
431
|
+
- **Description**: `is_shell_command_allowed` splits a command on `|`, `;`, `&&`, and `||`, then validates only the *first token* (`tokens[0]`) of each segment against the configured allow-list, after rejecting a set of dangerous patterns (`contains_dangerous_patterns`: command substitution `$(`/backticks, redirects, `${`, bare `$VAR`, background `&`). Because only the executable name is checked, any allow-listed general-purpose interpreter or command wrapper carries arbitrary behavior in its arguments: `python3 -c '<code>'`, `bash script.sh`, `sh -c '<code>'`, `env <cmd>`, `xargs <cmd>`, `uv run <cmd>`, and similar. A user who allow-lists such a program — reasonably believing they have restricted the agent to a "safe" tool — has effectively allowed unrestricted execution, and in headless `-x`/Auto mode those commands run without an approval prompt. This is the same class of weakness as T2 but applies to *normal, non-`all`* allow-lists. The allow-list is an ergonomic auto-approve heuristic, not a security boundary; textual command classification cannot robustly constrain execution.
|
|
432
|
+
- **Preconditions**: (1) User configures a shell allow-list (`--shell-allow-list` / `DEEPAGENTS_SHELL_ALLOW_LIST`) that includes an interpreter or wrapper; (2) non-interactive or Auto mode (interactive Manual mode still shows the human the literal command before it runs); (3) for the injected-command variant, successful prompt injection via DF8/DF9. The intended control is HITL approval; OS-native execution sandboxing would be the robust boundary the string allow-list cannot provide.
|
|
433
|
+
|
|
427
434
|
---
|
|
428
435
|
|
|
429
436
|
## Input Source Coverage
|
|
@@ -431,7 +438,7 @@
|
|
|
431
438
|
| Input Source | Data Flows | Threats | Validation Points | Responsibility | Gaps |
|
|
432
439
|
|-----------------------|-----------------------|---------------|----------------------------------------------------------------------------|----------------|----------------------------------------------------------------------------------------------|
|
|
433
440
|
| User direct input | DF1, DF2 | None (TB1) | None — prompts accepted verbatim | User | No content filtering — intentional; HITL gates downstream tool calls |
|
|
434
|
-
| LLM output | DF6, DF7 | T1, T2, T3, T4| HITL gate; shell allow-list; Unicode/URL warnings on tool args
|
|
441
|
+
| LLM output | DF6, DF7 | T1, T2, T3, T4, T13| HITL gate; shell allow-list; Unicode/URL warnings on tool args | Project | LLM-generated tool args not scanned for injection beyond Unicode/URL; shell allow-list matches only the command's first token, so allow-listed interpreters/wrappers bypass it (T13) |
|
|
435
442
|
| Tool/function results | DF9, DF11 | T1 | Unicode warning on URL args; `markdownify` HTML conversion | Shared | Tool *results* pass to context without prompt-injection scan |
|
|
436
443
|
| URL-fetched content | DF8, DF9 | T1 | `check_url_safety` on URL arg; HTML→markdown conversion | Shared | Markup-embedded instructions survive markdownify; no LLM-layer guardrail |
|
|
437
444
|
| Configuration | DF10, DF12, DF15, DF23| T9, T10, T12 | Dotenv shell-env precedence; TOML schema; MCP schema + allow/deny lists; JSON structure check; `class_path` format check | User | Project `.env` can set shell startup-hook vars; `class_path` executes module code before type check; MCP env dict unfiltered |
|
|
@@ -495,3 +502,4 @@ Threats that appear valid in isolation but fall outside project responsibility b
|
|
|
495
502
|
| 2026-06-25 | manual update | Updated T6 and TB10 to reflect the dev server binding an OS-assigned ephemeral port by default (`server._EPHEMERAL_PORT`) instead of squatting the well-known `langgraph dev` port 2024; noted unpredictable-port-across-runs as added defense-in-depth in the port-discovery dismissal row |
|
|
496
503
|
| 2026-07-08 | manual update | Removed the SHA-256 config fingerprint trust store (`mcp_trust.py`, `~/.deepagents/.state/mcp_trust.json`, DC4). Project MCP trust is now the interactive approval prompt (allow-for-session / always-allow scoped to project root + server-definition fingerprint / deny), the `--trust-project-mcp` run flag, the `[mcp].enabled_project_server_approvals` and `[mcp].disabled_project_servers` lists, and the process-wide `DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS` name-based escape hatch. The legacy flat `[mcp].enabled_project_servers` key is ignored. Persisted approvals bind to a server definition's fingerprint rather than a whole-config fingerprint. Updated C5, TB4, T10, the configuration input-coverage row, and the malicious-MCP-server dismissal accordingly |
|
|
497
504
|
| 2026-07-21 | manual update | Clarified TB4 after process-wide MCP names and scoped remembered approvals changed from replacement semantics to independent grants. An empty process-wide allowlist no longer suppresses remembered approvals; disabled-server precedence is unchanged. |
|
|
505
|
+
| 2026-07-22 | manual update | Added T13 (first-token shell allow-list bypass via allow-listed interpreters/wrappers) under TB2, distinguishing it from T2's `--shell-allow-list all` sentinel; cross-referenced it from T2 and extended the "LLM output" input-coverage gap to note that allow-list matching only inspects the command's first token |
|
|
@@ -69,6 +69,20 @@ class AskUserRequest(TypedDict):
|
|
|
69
69
|
"""ID of the originating tool call, used to route the response back."""
|
|
70
70
|
|
|
71
71
|
|
|
72
|
+
ASK_USER_AUTHORIZATION_METADATA_KEY = "deepagents_code_ask_user_authorization"
|
|
73
|
+
MAX_ASK_USER_AUTHORIZATION_ANSWER_CHARS = 4000
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class AskUserAuthorizationReceipt(TypedDict):
|
|
77
|
+
"""Trusted same-turn authorization recorded after an ask_user response."""
|
|
78
|
+
|
|
79
|
+
version: Literal[1]
|
|
80
|
+
thread_id: str
|
|
81
|
+
turn_id: str
|
|
82
|
+
tool_call_id: str
|
|
83
|
+
answers: list[str]
|
|
84
|
+
|
|
85
|
+
|
|
72
86
|
class AskUserAnswered(TypedDict):
|
|
73
87
|
"""Widget result when the user submits answers."""
|
|
74
88
|
|
|
@@ -47,7 +47,7 @@ class CLIContextSchema:
|
|
|
47
47
|
|
|
48
48
|
thread_id: str | None = None
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
turn_id: str | None = None
|
|
51
51
|
|
|
52
52
|
offload_tool_call_id: str | None = None
|
|
53
53
|
|
|
@@ -98,13 +98,8 @@ class CLIContext(TypedDict, total=False):
|
|
|
98
98
|
session-affinity headers.
|
|
99
99
|
"""
|
|
100
100
|
|
|
101
|
-
|
|
102
|
-
"""
|
|
103
|
-
|
|
104
|
-
This is intentionally carried in runtime context instead of the user
|
|
105
|
-
message so it is not parsed as a file mention or checkpointed as human
|
|
106
|
-
input.
|
|
107
|
-
"""
|
|
101
|
+
turn_id: str | None
|
|
102
|
+
"""Current user-turn ID for binding trusted interactive responses."""
|
|
108
103
|
|
|
109
104
|
offload_tool_call_id: str | None
|
|
110
105
|
"""The sole tool-call ID authorized during a server-driven `/offload` run.
|
|
@@ -27,6 +27,17 @@ drift guards in `test_main_args` and `test_tool_catalog` pin it so a new or
|
|
|
27
27
|
renamed SDK filesystem tool fails a test instead of silently diverging.
|
|
28
28
|
"""
|
|
29
29
|
|
|
30
|
+
SDK_DEFAULT_RUBRIC_MAX_ITERATIONS: Final[int] = 3
|
|
31
|
+
"""Default `RubricMiddleware.max_iterations`, shown without importing the SDK.
|
|
32
|
+
|
|
33
|
+
Hardcoded rather than read from `deepagents.middleware.rubric.RubricMiddleware`
|
|
34
|
+
because this module is dependency-free and importing the SDK for a display
|
|
35
|
+
string would violate the startup-performance rule (see AGENTS.md). This is a
|
|
36
|
+
hand-maintained duplicate that can rot if the SDK bumps its default, so
|
|
37
|
+
`test_reliable_rubric.py::TestReliableRubricMiddleware::test_displayed_max_iterations_default_matches_sdk`
|
|
38
|
+
is the drift guard that fails when the two diverge.
|
|
39
|
+
"""
|
|
40
|
+
|
|
30
41
|
FIREWORKS_PROVIDER_ID_PREFIX: Final[str] = "accounts/fireworks/"
|
|
31
42
|
"""Prefix used to infer Fireworks from fully-qualified IDs."""
|
|
32
43
|
|
|
@@ -159,10 +159,8 @@ EXPERIMENTAL = "DEEPAGENTS_CODE_EXPERIMENTAL"
|
|
|
159
159
|
"""Opt into experimental, unstable dcode behavior.
|
|
160
160
|
|
|
161
161
|
Off by default; parsed by `is_env_truthy` (see there for the accepted truthy
|
|
162
|
-
values).
|
|
163
|
-
|
|
164
|
-
todo-list prompt guidance. Behavior behind this flag may change or be removed
|
|
165
|
-
without notice.
|
|
162
|
+
values). Marks experimental runs in UI/trace metadata. Behavior behind this
|
|
163
|
+
flag may change or be removed without notice.
|
|
166
164
|
"""
|
|
167
165
|
|
|
168
166
|
EXTERNAL_EVENT_SOCKET = "DEEPAGENTS_CODE_EXTERNAL_EVENT_SOCKET"
|
|
@@ -178,6 +176,16 @@ EXTERNAL_EVENT_SOCKET_PATH = "DEEPAGENTS_CODE_EXTERNAL_EVENT_SOCKET_PATH"
|
|
|
178
176
|
EXTRA_SKILLS_DIRS = "DEEPAGENTS_CODE_EXTRA_SKILLS_DIRS"
|
|
179
177
|
"""Colon-separated paths added to the skill containment allowlist."""
|
|
180
178
|
|
|
179
|
+
GOAL_AUTO_ACCEPT_CRITERIA = "DEEPAGENTS_CODE_GOAL_AUTO_ACCEPT_CRITERIA"
|
|
180
|
+
"""Apply generated goal criteria automatically in Auto mode.
|
|
181
|
+
|
|
182
|
+
Disabled by default so Auto continues to show the goal review prompt unless the
|
|
183
|
+
user opts in. Manual always reviews criteria and YOLO always applies them.
|
|
184
|
+
Set to a recognized truthy or falsy value; unrecognized values are ignored and
|
|
185
|
+
resolution falls through to `[goals].auto_accept_criteria` in config.toml, then
|
|
186
|
+
the built-in default (disabled).
|
|
187
|
+
"""
|
|
188
|
+
|
|
181
189
|
HIDE_CWD = "DEEPAGENTS_CODE_HIDE_CWD"
|
|
182
190
|
"""Hide local path displays in the TUI footer and the editable-install path in
|
|
183
191
|
the startup splash when enabled.
|
|
@@ -205,7 +213,7 @@ LANGSMITH_PROJECT = "DEEPAGENTS_CODE_LANGSMITH_PROJECT"
|
|
|
205
213
|
"""Override LangSmith project name for agent traces."""
|
|
206
214
|
|
|
207
215
|
LANGSMITH_REDACT = "DEEPAGENTS_CODE_LANGSMITH_REDACT"
|
|
208
|
-
"""Toggle LangSmith secret redaction for agent traces (defaults to
|
|
216
|
+
"""Toggle LangSmith secret redaction for agent traces (defaults to off)."""
|
|
209
217
|
|
|
210
218
|
LANGSMITH_REPLICA_PROJECTS = "DEEPAGENTS_CODE_LANGSMITH_REPLICA_PROJECTS"
|
|
211
219
|
"""Comma-separated LangSmith project names to *also* write agent traces to.
|
|
@@ -274,12 +282,37 @@ Set to a truthy value to bring the standalone integrations screen back into the
|
|
|
274
282
|
flow. Parsed by `is_env_truthy`: accepts `1`, `true`, `yes`, `on` as enabled.
|
|
275
283
|
"""
|
|
276
284
|
|
|
285
|
+
OPENAI_PROMPT_CACHE_KEY = "DEEPAGENTS_CODE_OPENAI_PROMPT_CACHE_KEY"
|
|
286
|
+
"""Toggle injecting a per-thread OpenAI `prompt_cache_key` (defaults to on).
|
|
287
|
+
|
|
288
|
+
When enabled, OpenAI-provider model calls receive the active thread ID as a
|
|
289
|
+
top-level `prompt_cache_key`, giving more reliable prompt-cache prefix routing
|
|
290
|
+
across turns. It is attempted for every model whose provider resolves to
|
|
291
|
+
`openai` regardless of base URL (official API, the LangSmith gateway, and other
|
|
292
|
+
OpenAI-compatible endpoints), because the field is optional and additive. Set to
|
|
293
|
+
a falsy value (`0`, `false`, `no`, `off`) to opt out for endpoints that reject
|
|
294
|
+
unknown request fields; an explicitly empty value also opts out because the
|
|
295
|
+
option declares `empty_env_is_false`. Other tokens are parsed by
|
|
296
|
+
`classify_env_bool`, and an unrecognized value falls through to
|
|
297
|
+
`[models].openai_prompt_cache_key` in config.toml, then the default. A
|
|
298
|
+
user-supplied key is always preserved.
|
|
299
|
+
"""
|
|
300
|
+
|
|
277
301
|
PLUGIN_CACHE_DIR = "DEEPAGENTS_CODE_PLUGIN_CACHE_DIR"
|
|
278
302
|
"""Override the plugin install/marketplace cache root.
|
|
279
303
|
|
|
280
304
|
When unset, plugins are stored under `DEFAULT_CONFIG_DIR / "plugins"`.
|
|
281
305
|
"""
|
|
282
306
|
|
|
307
|
+
RECURSION_LIMIT = "DEEPAGENTS_CODE_RECURSION_LIMIT"
|
|
308
|
+
"""Override the main agent's LangGraph `recursion_limit` (graph step budget).
|
|
309
|
+
|
|
310
|
+
Parsed as an integer by the config manifest. Values below the LangGraph floor
|
|
311
|
+
(`25`) or above the manifest ceiling are ignored with a logged warning, falling
|
|
312
|
+
back to `config.toml` then the default. See `[runtime].recursion_limit` and the
|
|
313
|
+
`--recursion-limit` CLI flag.
|
|
314
|
+
"""
|
|
315
|
+
|
|
283
316
|
RESTARTED_AFTER_UPDATE = "DEEPAGENTS_CODE_RESTARTED_AFTER_UPDATE"
|
|
284
317
|
"""Internal sentinel recording the target version immediately before the
|
|
285
318
|
startup auto-update re-execs the process.
|
|
@@ -368,6 +401,17 @@ THEME = "DEEPAGENTS_CODE_THEME"
|
|
|
368
401
|
USER_ID = "DEEPAGENTS_CODE_USER_ID"
|
|
369
402
|
"""Attach a user identifier to LangSmith trace metadata."""
|
|
370
403
|
|
|
404
|
+
YOLO_SWITCHER = "DEEPAGENTS_CODE_YOLO_SWITCHER"
|
|
405
|
+
"""Include YOLO in the Shift+Tab approval-mode cycle.
|
|
406
|
+
|
|
407
|
+
Enabled by default so an interactive session can cycle Manual → Auto → YOLO
|
|
408
|
+
without restarting with `--yolo`. Set to a falsy value (`0`, `false`, `no`,
|
|
409
|
+
`off`, or empty) to leave Shift+Tab limited to Manual/Auto. Also settable via
|
|
410
|
+
`[startup].yolo_switcher` in config.toml so orgs can distribute the opt-out.
|
|
411
|
+
Parsed by `classify_env_bool` through the config resolver (unrecognized values
|
|
412
|
+
fall through rather than forcing the default).
|
|
413
|
+
"""
|
|
414
|
+
|
|
371
415
|
_TRUTHY_VALUES = frozenset({"1", "true", "yes", "on"})
|
|
372
416
|
_FALSY_VALUES = frozenset({"0", "false", "no", "off", ""})
|
|
373
417
|
|