deepagents-code 0.1.14__tar.gz → 0.1.16__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.14 → deepagents_code-0.1.16}/CHANGELOG.md +13 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/PKG-INFO +14 -9
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/README.md +2 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_cli_context.py +10 -2
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_env_vars.py +0 -1
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_version.py +1 -1
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/agent.py +3 -1
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/auth_display.py +50 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/config.py +76 -4
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/configurable_model.py +115 -39
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/extras_info.py +3 -1
- deepagents_code-0.1.16/deepagents_code/integrations/openai_codex.py +551 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/integrations/sandbox_factory.py +221 -3
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/integrations/sandbox_registry.py +9 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/main.py +5 -6
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/model_config.py +130 -1
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/resume_state.py +7 -2
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/ui.py +2 -4
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/auth.py +179 -1
- deepagents_code-0.1.16/deepagents_code/widgets/codex_auth.py +443 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/model_selector.py +119 -8
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/welcome.py +0 -1
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/pyproject.toml +11 -8
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_agent.py +5 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_args.py +10 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_auth_display.py +44 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_auth_widgets.py +313 -3
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_config.py +149 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_configurable_model.py +42 -5
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_extras_info.py +1 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_main_args.py +17 -2
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_model_config.py +114 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_model_selector.py +250 -0
- deepagents_code-0.1.16/tests/unit_tests/test_openai_codex_integration.py +669 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_sandbox_factory.py +618 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_sandbox_registry.py +8 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_textual_adapter.py +40 -2
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/uv.lock +98 -31
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/.gitignore +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/AGENTS.md +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/COMMANDS.md +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/DEV.md +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/Makefile +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/THREAT_MODEL.md +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/__init__.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/__main__.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_ask_user_types.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_constants.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_debug.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_git.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_server_config.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_session_stats.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_startup_error.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_testing_models.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_textual_patches.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/app.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/app.tcss +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/ask_user.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/auth_store.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/built_in_skills/__init__.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/clipboard.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/command_registry.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/config_commands.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/config_manifest.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/default_agent_prompt.md +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/editor.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/event_bus.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/file_ops.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/filesystem_empty_result.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/formatting.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/hooks.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/input.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/integrations/__init__.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/integrations/sandbox_config.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/integrations/sandbox_provider.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/local_context.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/managed_tools.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_auth.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_commands.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_disabled.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_login_service.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_providers/__init__.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_providers/_registry.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_providers/base.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_providers/github.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_providers/slack.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_tools.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_trust.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/media_utils.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/memory_guard.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/non_interactive.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/notifications.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/offload.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/onboarding.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/output.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/project_utils.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/py.typed +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/remote_client.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/server.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/server_graph.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/server_manager.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/sessions.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/skills/__init__.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/skills/commands.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/skills/invocation.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/skills/load.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/state_migration.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/subagents.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/system_prompt.md +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/terminal_capabilities.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/terminal_escape.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/textual_adapter.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/theme.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/tool_display.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/tools.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/unicode_security.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/update_check.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/__init__.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/_links.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/agent_selector.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/approval.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/ask_user.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/autocomplete.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/chat_input.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/cwd_switch.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/diff.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/history.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/install_confirm.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/launch_init.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/loading.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/mcp_login.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/mcp_reconnect.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/mcp_viewer.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/message_store.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/messages.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/notification_center.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/notification_detail.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/notification_settings.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/restart_prompt.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/status.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/theme_selector.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/thread_selector.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/tool_renderers.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/tool_widgets.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/update_available.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/update_progress.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/images/tui.png +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/scripts/check_imports.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/scripts/debug_server.sh +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/scripts/generate_commands_catalog.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/scripts/install.sh +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/README.md +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/__init__.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/conftest.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/__init__.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/conftest.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_agent_selector.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_app.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_approval.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_ask_user.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_auth_store.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_autocomplete.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_chat_input.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_clipboard.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_config_manifest.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_cursor_blink.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_cwd_switch.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_event_bus.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_filesystem_empty_result.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_git.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_history.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_install_command.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_install_confirm.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_launch_init.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_links.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_loading.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_main.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_managed_tools.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_auth.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_commands.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_disabled.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_login_modal.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_login_service.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_reconnect.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_trust.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_viewer.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_memory_guard.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_message_store.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_messages.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_notification_center.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_notification_detail.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_offload_dict_messages.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_onboarding.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_output.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_restart_prompt.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_resume_state.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_sandbox_config.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_sandbox_provider.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_server.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_startup_fast_paths.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_state_migration.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_status.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_terminal_escape.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_thread_selector.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_update_available.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_update_progress.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_version.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_welcome.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/tools/test_current_thread.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/tools/test_fetch_url.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/widgets/__init__.py +0 -0
- {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/widgets/test_diff.py +0 -0
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
# Deep Agents Code Changelog
|
|
4
4
|
|
|
5
|
+
## [0.1.16](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.15...deepagents-code==0.1.16) (2026-06-13)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* ChatGPT OAuth sign-in for Codex models ([#3532](https://github.com/langchain-ai/deepagents/issues/3532)) ([202e0bd](https://github.com/langchain-ai/deepagents/commit/202e0bd3e5b8b874a69656815489308d75a77d05))
|
|
10
|
+
* Add Vercel Sandbox provider ([#3588](https://github.com/langchain-ai/deepagents/issues/3588)) ([e5e4748](https://github.com/langchain-ai/deepagents/commit/e5e4748cb6c66ddaa9444ab464990c1a5d10854d))
|
|
11
|
+
|
|
12
|
+
## [0.1.15](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.14...deepagents-code==0.1.15) (2026-06-12)
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
* Add Deep Agents client version metadata ([#3934](https://github.com/langchain-ai/deepagents/issues/3934)) ([058cec6](https://github.com/langchain-ai/deepagents/commit/058cec654645dd1a504408d712ab678edc48273d))
|
|
17
|
+
|
|
5
18
|
## [0.1.14](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.13...deepagents-code==0.1.14) (2026-06-12)
|
|
6
19
|
|
|
7
20
|
### Features
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.16
|
|
4
4
|
Summary: Terminal interface for Deep Agents - interactive AI agent with file operations, shell access, and sub-agent capabilities.
|
|
5
5
|
Project-URL: Homepage, https://docs.langchain.com/oss/python/deepagents/overview
|
|
6
6
|
Project-URL: Documentation, https://reference.langchain.com/python/deepagents/
|
|
@@ -27,13 +27,13 @@ Classifier: Topic :: Terminals
|
|
|
27
27
|
Requires-Python: <4.0,>=3.11
|
|
28
28
|
Requires-Dist: aiosqlite<1.0.0,>=0.22.1
|
|
29
29
|
Requires-Dist: deepagents-acp<1.0.0,>=0.0.8
|
|
30
|
-
Requires-Dist: deepagents==0.6.
|
|
30
|
+
Requires-Dist: deepagents==0.6.10
|
|
31
31
|
Requires-Dist: httpx<1.0.0,>=0.28.1
|
|
32
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.
|
|
32
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.6
|
|
33
33
|
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.5
|
|
34
34
|
Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.0
|
|
35
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.3.
|
|
36
|
-
Requires-Dist: langchain<2.0.0,>=1.3.
|
|
35
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.3.2
|
|
36
|
+
Requires-Dist: langchain<2.0.0,>=1.3.9
|
|
37
37
|
Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
|
|
38
38
|
Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.29
|
|
39
39
|
Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.30.0
|
|
@@ -57,7 +57,7 @@ Requires-Dist: uuid-utils<1.0.0,>=0.16.0
|
|
|
57
57
|
Provides-Extra: agentcore
|
|
58
58
|
Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.4; extra == 'agentcore'
|
|
59
59
|
Provides-Extra: all-providers
|
|
60
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.
|
|
60
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.6; extra == 'all-providers'
|
|
61
61
|
Requires-Dist: langchain-aws<2.0.0,>=1.5.1; extra == 'all-providers'
|
|
62
62
|
Requires-Dist: langchain-baseten<1.0.0,>=0.2.0; extra == 'all-providers'
|
|
63
63
|
Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
|
|
@@ -72,7 +72,7 @@ Requires-Dist: langchain-litellm<2.0.0,>=0.6.6; extra == 'all-providers'
|
|
|
72
72
|
Requires-Dist: langchain-mistralai<2.0.0,>=1.1.5; extra == 'all-providers'
|
|
73
73
|
Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.1; extra == 'all-providers'
|
|
74
74
|
Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
75
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.3.
|
|
75
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.3.2; extra == 'all-providers'
|
|
76
76
|
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.3; extra == 'all-providers'
|
|
77
77
|
Requires-Dist: langchain-perplexity<2.0.0,>=1.4.0; extra == 'all-providers'
|
|
78
78
|
Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'all-providers'
|
|
@@ -82,8 +82,9 @@ Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.4; extra == 'all-
|
|
|
82
82
|
Requires-Dist: langchain-daytona>=0.0.7; extra == 'all-sandboxes'
|
|
83
83
|
Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
|
|
84
84
|
Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
|
|
85
|
+
Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
|
|
85
86
|
Provides-Extra: anthropic
|
|
86
|
-
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.
|
|
87
|
+
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.6; extra == 'anthropic'
|
|
87
88
|
Provides-Extra: baseten
|
|
88
89
|
Requires-Dist: langchain-baseten<1.0.0,>=0.2.0; extra == 'baseten'
|
|
89
90
|
Provides-Extra: bedrock
|
|
@@ -115,7 +116,7 @@ Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.1; extra == 'nvidia'
|
|
|
115
116
|
Provides-Extra: ollama
|
|
116
117
|
Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'ollama'
|
|
117
118
|
Provides-Extra: openai
|
|
118
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.3.
|
|
119
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.3.2; extra == 'openai'
|
|
119
120
|
Provides-Extra: openrouter
|
|
120
121
|
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.3; extra == 'openrouter'
|
|
121
122
|
Provides-Extra: perplexity
|
|
@@ -126,6 +127,8 @@ Provides-Extra: runloop
|
|
|
126
127
|
Requires-Dist: langchain-runloop>=0.0.6; extra == 'runloop'
|
|
127
128
|
Provides-Extra: together
|
|
128
129
|
Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'together'
|
|
130
|
+
Provides-Extra: vercel
|
|
131
|
+
Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'vercel'
|
|
129
132
|
Provides-Extra: vertex
|
|
130
133
|
Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.4; extra == 'vertex'
|
|
131
134
|
Provides-Extra: xai
|
|
@@ -182,6 +185,8 @@ The fastest way to start using Deep Agents. `deepagents-code` is a pre-built cod
|
|
|
182
185
|
- **[Changelog](https://github.com/langchain-ai/deepagents/blob/main/libs/code/CHANGELOG.md)**
|
|
183
186
|
- **[Source code](https://github.com/langchain-ai/deepagents/tree/main/libs/code)**
|
|
184
187
|
- **[Deep Agents SDK](https://github.com/langchain-ai/deepagents)** — underlying agent harness
|
|
188
|
+
- [LangChain Academy](https://academy.langchain.com/) — Comprehensive, free courses on LangChain libraries and products, made by the LangChain team.
|
|
189
|
+
- [Code of Conduct](https://github.com/langchain-ai/langchain/?tab=coc-ov-file) — community guidelines and standards
|
|
185
190
|
|
|
186
191
|
## 📕 Releases & Versioning
|
|
187
192
|
|
|
@@ -48,6 +48,8 @@ The fastest way to start using Deep Agents. `deepagents-code` is a pre-built cod
|
|
|
48
48
|
- **[Changelog](https://github.com/langchain-ai/deepagents/blob/main/libs/code/CHANGELOG.md)**
|
|
49
49
|
- **[Source code](https://github.com/langchain-ai/deepagents/tree/main/libs/code)**
|
|
50
50
|
- **[Deep Agents SDK](https://github.com/langchain-ai/deepagents)** — underlying agent harness
|
|
51
|
+
- [LangChain Academy](https://academy.langchain.com/) — Comprehensive, free courses on LangChain libraries and products, made by the LangChain team.
|
|
52
|
+
- [Code of Conduct](https://github.com/langchain-ai/langchain/?tab=coc-ov-file) — community guidelines and standards
|
|
51
53
|
|
|
52
54
|
## 📕 Releases & Versioning
|
|
53
55
|
|
|
@@ -7,9 +7,17 @@ middleware stack.
|
|
|
7
7
|
|
|
8
8
|
from __future__ import annotations
|
|
9
9
|
|
|
10
|
-
from
|
|
10
|
+
from dataclasses import dataclass, field
|
|
11
|
+
from typing import Any, TypedDict
|
|
11
12
|
|
|
12
|
-
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
class CLIContextSchema:
|
|
16
|
+
"""Server-side schema for run-scoped CLI context."""
|
|
17
|
+
|
|
18
|
+
model: str | None = None
|
|
19
|
+
model_params: dict[str, Any] = field(default_factory=dict)
|
|
20
|
+
effective_model: str | None = None
|
|
13
21
|
|
|
14
22
|
|
|
15
23
|
class CLIContext(TypedDict, total=False):
|
|
@@ -170,7 +170,6 @@ THEME = "DEEPAGENTS_CODE_THEME"
|
|
|
170
170
|
USER_ID = "DEEPAGENTS_CODE_USER_ID"
|
|
171
171
|
"""Attach a user identifier to LangSmith trace metadata."""
|
|
172
172
|
|
|
173
|
-
|
|
174
173
|
_TRUTHY_VALUES = frozenset({"1", "true", "yes", "on"})
|
|
175
174
|
_FALSY_VALUES = frozenset({"0", "false", "no", "off", ""})
|
|
176
175
|
|
|
@@ -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.16" # 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."""
|
|
@@ -52,6 +52,7 @@ if TYPE_CHECKING:
|
|
|
52
52
|
from langchain.agents.middleware.types import AgentMiddleware
|
|
53
53
|
|
|
54
54
|
from deepagents_code import theme
|
|
55
|
+
from deepagents_code._cli_context import CLIContextSchema
|
|
55
56
|
from deepagents_code._constants import DEFAULT_AGENT_NAME
|
|
56
57
|
from deepagents_code.config import (
|
|
57
58
|
_INHERITED_PYTHONPATH_ENV,
|
|
@@ -1118,7 +1119,7 @@ def create_cli_agent(
|
|
|
1118
1119
|
cwd: str | Path | None = None,
|
|
1119
1120
|
project_context: ProjectContext | None = None,
|
|
1120
1121
|
async_subagents: list[AsyncSubAgent] | None = None,
|
|
1121
|
-
) -> tuple[Pregel, CompositeBackend]:
|
|
1122
|
+
) -> tuple[Pregel[Any, Any, Any, Any], CompositeBackend]:
|
|
1122
1123
|
"""Create a CLI-configured agent with flexible options.
|
|
1123
1124
|
|
|
1124
1125
|
This is the main entry point for creating a Deep Agents Code agent, usable
|
|
@@ -1578,6 +1579,7 @@ def create_cli_agent(
|
|
|
1578
1579
|
backend=composite_backend,
|
|
1579
1580
|
middleware=agent_middleware,
|
|
1580
1581
|
interrupt_on=interrupt_on,
|
|
1582
|
+
context_schema=CLIContextSchema,
|
|
1581
1583
|
checkpointer=checkpointer,
|
|
1582
1584
|
subagents=all_subagents or None,
|
|
1583
1585
|
name=_sanitize_agent_message_name(assistant_id),
|
|
@@ -7,6 +7,7 @@ from typing import TYPE_CHECKING, assert_never
|
|
|
7
7
|
from textual.content import Content
|
|
8
8
|
|
|
9
9
|
from deepagents_code.model_config import (
|
|
10
|
+
CODEX_PROVIDER,
|
|
10
11
|
ProviderAuthSource,
|
|
11
12
|
ProviderAuthState,
|
|
12
13
|
ProviderAuthStatus,
|
|
@@ -29,6 +30,13 @@ def format_auth_badge(status: ProviderAuthStatus) -> Content:
|
|
|
29
30
|
Returns:
|
|
30
31
|
A styled badge `Content` for the auth manager surface.
|
|
31
32
|
"""
|
|
33
|
+
# The ChatGPT-OAuth codex provider has no API key, so its credential is a
|
|
34
|
+
# file-backed OAuth token rather than a stored key. Give it distinctive
|
|
35
|
+
# badges (`[chatgpt]` / `[sign in to chatgpt]`) so users don't read the
|
|
36
|
+
# generic `[stored]`/`[missing]` as a literal API key on disk.
|
|
37
|
+
if status.provider == CODEX_PROVIDER:
|
|
38
|
+
return _format_codex_badge(status)
|
|
39
|
+
|
|
32
40
|
state = status.state
|
|
33
41
|
match state:
|
|
34
42
|
case ProviderAuthState.CONFIGURED:
|
|
@@ -103,6 +111,48 @@ def _auth_badge(detail: str, *, prefix: str = "") -> Content:
|
|
|
103
111
|
)
|
|
104
112
|
|
|
105
113
|
|
|
114
|
+
def _format_codex_badge(status: ProviderAuthStatus) -> Content:
|
|
115
|
+
"""Format the auth manager badge for the ChatGPT-OAuth codex provider.
|
|
116
|
+
|
|
117
|
+
Codex signs in through ChatGPT OAuth rather than an API key, so a
|
|
118
|
+
`CONFIGURED` status renders as `[chatgpt]` (carrying the plan name when the
|
|
119
|
+
status detail includes one) and any other state renders as a
|
|
120
|
+
`[sign in to chatgpt]` prompt.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
status: The codex provider's auth status.
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
A styled badge reflecting ChatGPT sign-in state.
|
|
127
|
+
"""
|
|
128
|
+
if status.state is ProviderAuthState.CONFIGURED:
|
|
129
|
+
badge_text = "[chatgpt]"
|
|
130
|
+
# `_get_codex_auth_status` encodes the plan as a trailing "(plan)" in
|
|
131
|
+
# the detail string (e.g. "signed in to ChatGPT (pro)").
|
|
132
|
+
if status.detail and (plan := _codex_plan_from_detail(status.detail)):
|
|
133
|
+
badge_text = f"[chatgpt: {plan}]"
|
|
134
|
+
return Content.styled(badge_text, "bold $success")
|
|
135
|
+
return Content.styled("[sign in to chatgpt]", "bold $warning")
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def _codex_plan_from_detail(detail: str) -> str | None:
|
|
139
|
+
"""Extract the ChatGPT plan from a codex auth detail string.
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
detail: Human-readable codex auth status detail.
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
The ChatGPT plan text, or `None` when no bounded plan is present.
|
|
146
|
+
"""
|
|
147
|
+
_, marker, plan_tail = detail.partition("(")
|
|
148
|
+
if not marker:
|
|
149
|
+
return None
|
|
150
|
+
plan, marker, _ = plan_tail.partition(")")
|
|
151
|
+
if not marker or not plan:
|
|
152
|
+
return None
|
|
153
|
+
return plan
|
|
154
|
+
|
|
155
|
+
|
|
106
156
|
def _format_configured_badge(status: ProviderAuthStatus) -> Content:
|
|
107
157
|
"""Format the auth manager badge for a `CONFIGURED` provider.
|
|
108
158
|
|
|
@@ -13,7 +13,7 @@ import sys
|
|
|
13
13
|
import threading
|
|
14
14
|
from dataclasses import dataclass
|
|
15
15
|
from enum import StrEnum
|
|
16
|
-
from importlib.metadata import PackageNotFoundError, distribution
|
|
16
|
+
from importlib.metadata import PackageNotFoundError, distribution, version
|
|
17
17
|
from pathlib import Path
|
|
18
18
|
from typing import TYPE_CHECKING, Any
|
|
19
19
|
from urllib.parse import unquote, urlparse
|
|
@@ -568,6 +568,23 @@ Kept short so tracing metadata can never stall app flows.
|
|
|
568
568
|
"""
|
|
569
569
|
|
|
570
570
|
|
|
571
|
+
def _get_deepagents_version() -> str | None:
|
|
572
|
+
"""Read the installed Deep Agents SDK version from package metadata.
|
|
573
|
+
|
|
574
|
+
Returns:
|
|
575
|
+
The installed Deep Agents SDK version, or `None` when package metadata
|
|
576
|
+
is unavailable.
|
|
577
|
+
"""
|
|
578
|
+
try:
|
|
579
|
+
return version("deepagents")
|
|
580
|
+
except PackageNotFoundError:
|
|
581
|
+
logger.debug(
|
|
582
|
+
"Failed to read deepagents version from package metadata",
|
|
583
|
+
exc_info=True,
|
|
584
|
+
)
|
|
585
|
+
return None
|
|
586
|
+
|
|
587
|
+
|
|
571
588
|
def _resolve_editable_info() -> tuple[bool, str | None]:
|
|
572
589
|
"""Parse PEP 610 `direct_url.json` once and cache both results.
|
|
573
590
|
|
|
@@ -826,11 +843,15 @@ def build_stream_config(
|
|
|
826
843
|
) -> RunnableConfig:
|
|
827
844
|
"""Build the LangGraph stream config dict.
|
|
828
845
|
|
|
829
|
-
Injects the dcode version into `metadata["
|
|
846
|
+
Injects the dcode version into `metadata["lc_versions"]` so LangSmith traces
|
|
830
847
|
can be correlated with specific releases. `create_deep_agent` supplies the
|
|
831
848
|
SDK version through the compiled graph config, and LangChain merges nested
|
|
832
849
|
metadata dictionaries so both versions survive at stream time.
|
|
833
850
|
|
|
851
|
+
Also records `dcode_client_deepagents_version` as a dcode-client diagnostic.
|
|
852
|
+
This describes the Deep Agents package installed alongside the TUI, which
|
|
853
|
+
can differ from a remote graph's Deep Agents runtime version.
|
|
854
|
+
|
|
834
855
|
Includes `ls_integration` metadata so LangSmith traces originating from
|
|
835
856
|
the app are distinguishable from bare SDK usage.
|
|
836
857
|
|
|
@@ -854,9 +875,13 @@ def build_stream_config(
|
|
|
854
875
|
cwd = ""
|
|
855
876
|
|
|
856
877
|
metadata: dict[str, Any] = {
|
|
857
|
-
"
|
|
878
|
+
"lc_versions": {"deepagents-code": __version__},
|
|
858
879
|
"ls_integration": "deepagents-code",
|
|
859
880
|
}
|
|
881
|
+
deepagents_version = _get_deepagents_version()
|
|
882
|
+
if deepagents_version is not None:
|
|
883
|
+
metadata["dcode_client_deepagents_version"] = deepagents_version
|
|
884
|
+
|
|
860
885
|
from deepagents_code._env_vars import USER_ID
|
|
861
886
|
|
|
862
887
|
user_id = os.environ.get(USER_ID)
|
|
@@ -3045,6 +3070,8 @@ def create_model(
|
|
|
3045
3070
|
warn_on_split_credential_source(provider)
|
|
3046
3071
|
apply_stored_credentials(provider)
|
|
3047
3072
|
|
|
3073
|
+
from deepagents_code.model_config import CODEX_PROVIDER
|
|
3074
|
+
|
|
3048
3075
|
# Early credential check — fail fast with an actionable message instead of
|
|
3049
3076
|
# letting the provider SDK raise an opaque auth error on first invocation.
|
|
3050
3077
|
# Providers that support implicit auth (e.g., Vertex AI ADC) are excluded
|
|
@@ -3054,6 +3081,13 @@ def create_model(
|
|
|
3054
3081
|
if cred_status is False:
|
|
3055
3082
|
from deepagents_code.model_config import MissingCredentialsError
|
|
3056
3083
|
|
|
3084
|
+
if provider == CODEX_PROVIDER:
|
|
3085
|
+
# No env var to set; point the user at `/auth` instead.
|
|
3086
|
+
msg = (
|
|
3087
|
+
"Not signed in to ChatGPT. Run `/auth` and select "
|
|
3088
|
+
"openai_codex to sign in with your ChatGPT account."
|
|
3089
|
+
)
|
|
3090
|
+
raise MissingCredentialsError(msg, provider=provider, env_var=None)
|
|
3057
3091
|
env_var = get_credential_env_var(provider)
|
|
3058
3092
|
display_env = env_var or f"<{provider} API key>"
|
|
3059
3093
|
msg = (
|
|
@@ -3117,7 +3151,45 @@ def create_model(
|
|
|
3117
3151
|
config = ModelConfig.load()
|
|
3118
3152
|
class_path = config.get_class_path(provider) if provider else None
|
|
3119
3153
|
|
|
3120
|
-
if
|
|
3154
|
+
if provider == CODEX_PROVIDER:
|
|
3155
|
+
# Codex models are constructed directly via `_ChatOpenAICodex` so the
|
|
3156
|
+
# `token_provider=` kwarg is wired to the on-disk OAuth token store
|
|
3157
|
+
# before any request goes out. `init_chat_model` does not know about
|
|
3158
|
+
# this class and would route through API-key `ChatOpenAI` instead.
|
|
3159
|
+
from deepagents_code.integrations import openai_codex as _codex
|
|
3160
|
+
from deepagents_code.model_config import (
|
|
3161
|
+
MissingCredentialsError,
|
|
3162
|
+
ModelConfigError,
|
|
3163
|
+
)
|
|
3164
|
+
|
|
3165
|
+
# Drop any `api_key` left in kwargs (e.g. from a config-level
|
|
3166
|
+
# `api_key_env` set on the codex provider, or a `--model-params
|
|
3167
|
+
# api_key=...`) so the bearer always comes from the OAuth
|
|
3168
|
+
# `token_provider` rather than a static key.
|
|
3169
|
+
kwargs.pop("api_key", None)
|
|
3170
|
+
try:
|
|
3171
|
+
model = _codex.build_chat_model(model_name, **kwargs)
|
|
3172
|
+
except FileNotFoundError as exc:
|
|
3173
|
+
msg = (
|
|
3174
|
+
"Not signed in to ChatGPT. Run `/auth` and select "
|
|
3175
|
+
"openai_codex to sign in with your ChatGPT account."
|
|
3176
|
+
)
|
|
3177
|
+
raise MissingCredentialsError(msg, provider=provider, env_var=None) from exc
|
|
3178
|
+
except _codex.CodexAuthExpiredError as exc:
|
|
3179
|
+
# A token exists but its refresh token is dead. Route through the
|
|
3180
|
+
# same `MissingCredentialsError` recovery path as a missing token
|
|
3181
|
+
# (which the retry flow re-attempts after `/auth`) instead of the
|
|
3182
|
+
# generic `ModelConfigError` below, which would not offer sign-in.
|
|
3183
|
+
msg = (
|
|
3184
|
+
"ChatGPT session expired. Run `/auth` and select openai_codex "
|
|
3185
|
+
"to sign in again."
|
|
3186
|
+
)
|
|
3187
|
+
raise MissingCredentialsError(msg, provider=provider, env_var=None) from exc
|
|
3188
|
+
except Exception as exc:
|
|
3189
|
+
spec = f"{provider}:{model_name}"
|
|
3190
|
+
msg = f"Failed to initialize Codex model '{spec}': {exc}"
|
|
3191
|
+
raise ModelConfigError(msg) from exc
|
|
3192
|
+
elif class_path:
|
|
3121
3193
|
model = _create_model_from_class(class_path, model_name, provider, kwargs)
|
|
3122
3194
|
else:
|
|
3123
3195
|
model = _create_model_via_init(model_name, provider, kwargs)
|
|
@@ -7,6 +7,7 @@ the graph.
|
|
|
7
7
|
|
|
8
8
|
from __future__ import annotations
|
|
9
9
|
|
|
10
|
+
import asyncio
|
|
10
11
|
import logging
|
|
11
12
|
from typing import TYPE_CHECKING, Any
|
|
12
13
|
|
|
@@ -17,9 +18,13 @@ from langchain.agents.middleware.types import (
|
|
|
17
18
|
ModelResponse,
|
|
18
19
|
)
|
|
19
20
|
|
|
21
|
+
from deepagents_code._cli_context import CLIContextSchema
|
|
22
|
+
|
|
20
23
|
if TYPE_CHECKING:
|
|
21
24
|
from collections.abc import Awaitable, Callable
|
|
22
25
|
|
|
26
|
+
from deepagents_code.config import ModelResult
|
|
27
|
+
|
|
23
28
|
|
|
24
29
|
logger = logging.getLogger(__name__)
|
|
25
30
|
|
|
@@ -56,55 +61,54 @@ _ANTHROPIC_ONLY_SETTINGS: set[str] = {"cache_control"}
|
|
|
56
61
|
must be stripped on cross-provider swap."""
|
|
57
62
|
|
|
58
63
|
|
|
59
|
-
def
|
|
60
|
-
"""
|
|
64
|
+
def _get_context(request: ModelRequest) -> CLIContextSchema | None:
|
|
65
|
+
"""Return runtime context when it matches the CLI context shape."""
|
|
66
|
+
runtime = request.runtime
|
|
67
|
+
if runtime is None:
|
|
68
|
+
return None
|
|
61
69
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
(
|
|
66
|
-
|
|
70
|
+
ctx = runtime.context
|
|
71
|
+
if isinstance(ctx, CLIContextSchema):
|
|
72
|
+
return ctx
|
|
73
|
+
if isinstance(ctx, dict):
|
|
74
|
+
return CLIContextSchema(
|
|
75
|
+
model=ctx.get("model"),
|
|
76
|
+
model_params=ctx.get("model_params") or {},
|
|
77
|
+
effective_model=ctx.get("effective_model"),
|
|
78
|
+
)
|
|
79
|
+
return None
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _build_overrides(
|
|
83
|
+
request: ModelRequest, ctx: CLIContextSchema, model_result: ModelResult | None
|
|
84
|
+
) -> ModelRequest:
|
|
85
|
+
"""Build the overridden request from a (possibly resolved) model result.
|
|
86
|
+
|
|
87
|
+
Holds the post-construction logic shared by the sync and async override
|
|
88
|
+
paths: applying the model swap, merging `model_params`, stripping
|
|
89
|
+
Anthropic-only settings on a cross-provider swap, and patching the
|
|
90
|
+
`### Model Identity` system-prompt section. The only thing that differs
|
|
91
|
+
between the two callers is how `model_result` is produced (a direct
|
|
92
|
+
`create_model` call vs. an `asyncio.to_thread` offload).
|
|
67
93
|
|
|
68
94
|
Args:
|
|
69
95
|
request: The incoming model request from the middleware chain.
|
|
96
|
+
ctx: Runtime CLI context carrying the requested overrides.
|
|
97
|
+
model_result: The resolved model result from `create_model`, or `None`
|
|
98
|
+
when no model swap was requested.
|
|
70
99
|
|
|
71
100
|
Returns:
|
|
72
|
-
The original request
|
|
73
|
-
|
|
74
|
-
applied via `request.override()`.
|
|
101
|
+
The original request when no overrides apply, otherwise a new request
|
|
102
|
+
with overrides applied via `request.override()`.
|
|
75
103
|
"""
|
|
76
|
-
runtime = request.runtime
|
|
77
|
-
if runtime is None:
|
|
78
|
-
return request
|
|
79
|
-
|
|
80
|
-
ctx = runtime.context
|
|
81
|
-
if not isinstance(ctx, dict):
|
|
82
|
-
return request
|
|
83
|
-
|
|
84
104
|
overrides: dict[str, Any] = {}
|
|
85
105
|
|
|
86
|
-
|
|
87
|
-
new_model
|
|
88
|
-
model = ctx.get("model")
|
|
89
|
-
if model and not model_matches_spec(request.model, model):
|
|
90
|
-
from deepagents_code.config import create_model
|
|
91
|
-
from deepagents_code.model_config import ModelConfigError
|
|
92
|
-
|
|
93
|
-
logger.debug("Overriding model to %s", model)
|
|
94
|
-
try:
|
|
95
|
-
model_result = create_model(model)
|
|
96
|
-
new_model = model_result.model
|
|
97
|
-
except ModelConfigError:
|
|
98
|
-
logger.exception(
|
|
99
|
-
"Failed to resolve runtime model override '%s'; "
|
|
100
|
-
"continuing with current model",
|
|
101
|
-
model,
|
|
102
|
-
)
|
|
103
|
-
return request
|
|
106
|
+
new_model = model_result.model if model_result is not None else None
|
|
107
|
+
if new_model is not None:
|
|
104
108
|
overrides["model"] = new_model
|
|
105
109
|
|
|
106
110
|
# Param merge
|
|
107
|
-
model_params = ctx.
|
|
111
|
+
model_params = ctx.model_params
|
|
108
112
|
if model_params:
|
|
109
113
|
overrides["model_settings"] = {**request.model_settings, **model_params}
|
|
110
114
|
|
|
@@ -131,7 +135,7 @@ def _apply_overrides(request: ModelRequest) -> ModelRequest:
|
|
|
131
135
|
# We read metadata from model_result (not the app's settings singleton)
|
|
132
136
|
# because the middleware runs in the server subprocess where settings
|
|
133
137
|
# are never updated by /model.
|
|
134
|
-
if
|
|
138
|
+
if model_result is not None and request.system_prompt:
|
|
135
139
|
from deepagents_code.agent import (
|
|
136
140
|
MODEL_IDENTITY_RE,
|
|
137
141
|
build_model_identity_section,
|
|
@@ -159,6 +163,78 @@ def _apply_overrides(request: ModelRequest) -> ModelRequest:
|
|
|
159
163
|
return request.override(**overrides)
|
|
160
164
|
|
|
161
165
|
|
|
166
|
+
def _apply_overrides(request: ModelRequest) -> ModelRequest:
|
|
167
|
+
"""Apply model/param overrides from `CLIContext` on the runtime.
|
|
168
|
+
|
|
169
|
+
Reads `'model'` and `'model_params'` from `runtime.context` and, when
|
|
170
|
+
present, swaps the model and/or merges extra settings into the request.
|
|
171
|
+
On a cross-provider swap away from Anthropic, Anthropic-only settings
|
|
172
|
+
(e.g. `cache_control`) are stripped. The `### Model Identity` section
|
|
173
|
+
in the system prompt is also patched to reflect the new model.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
request: The incoming model request from the middleware chain.
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
The original request unchanged when no `CLIContext` is present or it
|
|
180
|
+
contains no overrides, otherwise a new request with overrides
|
|
181
|
+
applied via `request.override()`.
|
|
182
|
+
"""
|
|
183
|
+
ctx = _get_context(request)
|
|
184
|
+
if ctx is None:
|
|
185
|
+
return request
|
|
186
|
+
|
|
187
|
+
model_result = None
|
|
188
|
+
model = ctx.model
|
|
189
|
+
if model and not model_matches_spec(request.model, model):
|
|
190
|
+
from deepagents_code.config import create_model
|
|
191
|
+
from deepagents_code.model_config import ModelConfigError
|
|
192
|
+
|
|
193
|
+
logger.debug("Overriding model to %s", model)
|
|
194
|
+
try:
|
|
195
|
+
model_result = create_model(model)
|
|
196
|
+
except ModelConfigError:
|
|
197
|
+
logger.exception(
|
|
198
|
+
"Failed to resolve runtime model override '%s'; "
|
|
199
|
+
"continuing with current model",
|
|
200
|
+
model,
|
|
201
|
+
)
|
|
202
|
+
return request
|
|
203
|
+
|
|
204
|
+
return _build_overrides(request, ctx, model_result)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
async def _apply_overrides_async(request: ModelRequest) -> ModelRequest:
|
|
208
|
+
"""Async variant of `_apply_overrides` that offloads model construction.
|
|
209
|
+
|
|
210
|
+
Returns:
|
|
211
|
+
The original request when no async override applies, otherwise a request
|
|
212
|
+
with the runtime model or settings override applied.
|
|
213
|
+
"""
|
|
214
|
+
ctx = _get_context(request)
|
|
215
|
+
if ctx is None:
|
|
216
|
+
return request
|
|
217
|
+
|
|
218
|
+
model_result = None
|
|
219
|
+
model = ctx.model
|
|
220
|
+
if model and not model_matches_spec(request.model, model):
|
|
221
|
+
from deepagents_code.config import create_model
|
|
222
|
+
from deepagents_code.model_config import ModelConfigError
|
|
223
|
+
|
|
224
|
+
logger.debug("Overriding model to %s", model)
|
|
225
|
+
try:
|
|
226
|
+
model_result = await asyncio.to_thread(create_model, model)
|
|
227
|
+
except ModelConfigError:
|
|
228
|
+
logger.exception(
|
|
229
|
+
"Failed to resolve runtime model override '%s'; "
|
|
230
|
+
"continuing with current model",
|
|
231
|
+
model,
|
|
232
|
+
)
|
|
233
|
+
return request
|
|
234
|
+
|
|
235
|
+
return _build_overrides(request, ctx, model_result)
|
|
236
|
+
|
|
237
|
+
|
|
162
238
|
class ConfigurableModelMiddleware(AgentMiddleware):
|
|
163
239
|
"""Swap the model or per-call settings from `runtime.context`.
|
|
164
240
|
|
|
@@ -198,4 +274,4 @@ class ConfigurableModelMiddleware(AgentMiddleware):
|
|
|
198
274
|
Returns:
|
|
199
275
|
The `ModelResponse` produced by the downstream handler.
|
|
200
276
|
"""
|
|
201
|
-
return await handler(
|
|
277
|
+
return await handler(await _apply_overrides_async(request))
|
|
@@ -66,7 +66,9 @@ MODEL_PROVIDER_EXTRAS: frozenset[str] = frozenset(
|
|
|
66
66
|
Keep in sync with `[project.optional-dependencies]` in `pyproject.toml`.
|
|
67
67
|
"""
|
|
68
68
|
|
|
69
|
-
SANDBOX_EXTRAS: frozenset[str] = frozenset(
|
|
69
|
+
SANDBOX_EXTRAS: frozenset[str] = frozenset(
|
|
70
|
+
{"agentcore", "daytona", "modal", "runloop", "vercel"}
|
|
71
|
+
)
|
|
70
72
|
"""Optional extras that add sandbox integrations."""
|
|
71
73
|
|
|
72
74
|
STANDALONE_EXTRAS: frozenset[str] = frozenset({"quickjs"})
|