deepagents-cli 0.0.42__tar.gz → 0.0.44__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_cli-0.0.42 → deepagents_cli-0.0.44}/.gitignore +6 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/CHANGELOG.md +12 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/PKG-INFO +50 -50
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/README.md +1 -1
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/_version.py +1 -1
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/app.py +70 -1
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/deploy/bundler.py +135 -9
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/deploy/commands.py +45 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/deploy/config.py +116 -7
- deepagents_cli-0.0.44/deepagents_cli/deploy/frontend_dist/assets/anonymous-B9UzAXQd.js +1 -0
- deepagents_cli-0.0.44/deepagents_cli/deploy/frontend_dist/assets/clerk-5xHgyQyG.js +23 -0
- deepagents_cli-0.0.44/deepagents_cli/deploy/frontend_dist/assets/highlighted-body-OFNGDK62-rX-7qT8o.js +1 -0
- deepagents_cli-0.0.44/deepagents_cli/deploy/frontend_dist/assets/index-DM3gptpu.js +205 -0
- deepagents_cli-0.0.44/deepagents_cli/deploy/frontend_dist/assets/index-Ddy7F6KI.css +1 -0
- deepagents_cli-0.0.44/deepagents_cli/deploy/frontend_dist/assets/supabase-S6NACDgm.js +44 -0
- deepagents_cli-0.0.44/deepagents_cli/deploy/frontend_dist/index.html +16 -0
- deepagents_cli-0.0.44/deepagents_cli/deploy/frontend_dist/logo-dark.svg +12 -0
- deepagents_cli-0.0.44/deepagents_cli/deploy/frontend_dist/logo-light.svg +12 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/deploy/templates.py +112 -0
- deepagents_cli-0.0.44/frontend/.nvmrc +1 -0
- deepagents_cli-0.0.44/frontend/index.html +15 -0
- deepagents_cli-0.0.44/frontend/package-lock.json +6207 -0
- deepagents_cli-0.0.44/frontend/package.json +34 -0
- deepagents_cli-0.0.44/frontend/postcss.config.js +5 -0
- deepagents_cli-0.0.44/frontend/public/logo-dark.svg +12 -0
- deepagents_cli-0.0.44/frontend/public/logo-light.svg +12 -0
- deepagents_cli-0.0.44/frontend/src/App.tsx +342 -0
- deepagents_cli-0.0.44/frontend/src/ThemeProvider.tsx +66 -0
- deepagents_cli-0.0.44/frontend/src/auth/anonymous.tsx +45 -0
- deepagents_cli-0.0.44/frontend/src/auth/clerk.tsx +138 -0
- deepagents_cli-0.0.44/frontend/src/auth/loader.tsx +26 -0
- deepagents_cli-0.0.44/frontend/src/auth/supabase.tsx +236 -0
- deepagents_cli-0.0.44/frontend/src/auth/types.ts +22 -0
- deepagents_cli-0.0.44/frontend/src/components/AppHeader.tsx +70 -0
- deepagents_cli-0.0.44/frontend/src/components/FilePanels.tsx +148 -0
- deepagents_cli-0.0.44/frontend/src/components/MessageList.tsx +177 -0
- deepagents_cli-0.0.44/frontend/src/components/SubagentActivity.tsx +262 -0
- deepagents_cli-0.0.44/frontend/src/components/ThreadPicker.tsx +162 -0
- deepagents_cli-0.0.44/frontend/src/components/TodosPanel.tsx +54 -0
- deepagents_cli-0.0.44/frontend/src/components/ToolCallCard.tsx +136 -0
- deepagents_cli-0.0.44/frontend/src/components/toolcalls/FileToolCard.tsx +126 -0
- deepagents_cli-0.0.44/frontend/src/components/toolcalls/SearchCard.tsx +107 -0
- deepagents_cli-0.0.44/frontend/src/components/toolcalls/ThinkCard.tsx +60 -0
- deepagents_cli-0.0.44/frontend/src/components/toolcalls/TodosCard.tsx +63 -0
- deepagents_cli-0.0.44/frontend/src/components/toolcalls/index.ts +51 -0
- deepagents_cli-0.0.44/frontend/src/constants.ts +15 -0
- deepagents_cli-0.0.44/frontend/src/index.css +220 -0
- deepagents_cli-0.0.44/frontend/src/main.tsx +20 -0
- deepagents_cli-0.0.44/frontend/src/runtimeConfig.ts +75 -0
- deepagents_cli-0.0.44/frontend/src/types.ts +22 -0
- deepagents_cli-0.0.44/frontend/src/vite-env.d.ts +1 -0
- deepagents_cli-0.0.44/frontend/tsconfig.json +19 -0
- deepagents_cli-0.0.44/frontend/vite.config.ts +25 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/pyproject.toml +33 -27
- deepagents_cli-0.0.44/tests/unit_tests/deploy/test_frontend_bundle.py +427 -0
- deepagents_cli-0.0.44/tests/unit_tests/deploy/test_frontend_config.py +181 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_app.py +185 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/uv.lock +169 -93
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/DEV.md +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/Makefile +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/THREAT_MODEL.md +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/__init__.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/__main__.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/_ask_user_types.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/_cli_context.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/_debug.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/_env_vars.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/_git.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/_server_config.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/_session_stats.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/_testing_models.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/_textual_patches.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/agent.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/app.tcss +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/ask_user.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/built_in_skills/__init__.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/built_in_skills/remember/SKILL.md +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/built_in_skills/skill-creator/SKILL.md +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/clipboard.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/command_registry.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/config.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/configurable_model.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/default_agent_prompt.md +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/deploy/__init__.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/editor.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/extras_info.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/file_ops.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/formatting.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/hooks.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/input.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/integrations/__init__.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/integrations/sandbox_factory.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/integrations/sandbox_provider.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/local_context.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/main.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/mcp_tools.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/mcp_trust.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/media_utils.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/model_config.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/non_interactive.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/notifications.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/offload.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/output.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/project_utils.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/py.typed +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/remote_client.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/server.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/server_graph.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/server_manager.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/sessions.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/skills/__init__.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/skills/commands.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/skills/invocation.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/skills/load.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/subagents.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/system_prompt.md +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/terminal_capabilities.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/textual_adapter.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/theme.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/token_state.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/tool_display.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/tools.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/ui.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/unicode_security.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/update_check.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/__init__.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/_links.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/agent_selector.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/approval.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/ask_user.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/autocomplete.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/chat_input.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/diff.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/history.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/loading.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/mcp_viewer.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/message_store.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/messages.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/model_selector.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/notification_center.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/notification_detail.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/notification_settings.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/status.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/theme_selector.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/thread_selector.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/tool_renderers.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/tool_widgets.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/update_available.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/deepagents_cli/widgets/welcome.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/examples/deploy-content-writer/.env.example +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/examples/deploy-content-writer/skills/blog-post/SKILL.md +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/examples/deploy-content-writer/skills/social-media/SKILL.md +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/examples/deploy-content-writer/user/context.md +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/examples/deploy-content-writer/user/preferences.md +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/examples/skills/arxiv-search/SKILL.md +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/examples/skills/arxiv-search/arxiv_search.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/examples/skills/langgraph-docs/SKILL.md +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/examples/skills/skill-creator/SKILL.md +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/examples/skills/web-research/SKILL.md +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/images/cli.png +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/scripts/check_imports.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/scripts/debug_server.sh +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/scripts/install.sh +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/README.md +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/integration_tests/__init__.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/integration_tests/benchmarks/__init__.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/integration_tests/conftest.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/integration_tests/test_acp_mode.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/integration_tests/test_compact_resume.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/integration_tests/test_sandbox_factory.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/integration_tests/test_sandbox_operations.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/__init__.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/conftest.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/deploy/__init__.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/deploy/test_bundler.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/deploy/test_commands.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/deploy/test_config.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/skills/__init__.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/skills/test_commands.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/skills/test_load.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/skills/test_skills_json.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_agent.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_agent_friendly.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_agent_selector.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_approval.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_args.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_ask_user.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_ask_user_middleware.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_autocomplete.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_charset.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_chat_input.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_command_registry.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_compact_tool.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_config.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_configurable_model.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_debug.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_editor.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_end_to_end.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_env_vars.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_exception_handling.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_extras_info.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_file_ops.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_formatting.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_git.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_history.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_hooks.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_imports.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_input_parsing.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_links.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_loading.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_local_context.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_main.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_main_acp_mode.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_main_args.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_mcp_tools.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_mcp_trust.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_mcp_viewer.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_media_utils.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_message_store.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_messages.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_model_config.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_model_selector.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_model_switch.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_non_interactive.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_notification_center.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_notification_detail.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_notifications.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_offload.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_offload_dict_messages.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_output.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_reload.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_remote_client.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_sandbox_factory.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_server.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_server_config.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_server_graph.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_server_helpers.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_server_manager.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_session_stats.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_sessions.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_shell_allow_list.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_skill_invocation.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_status.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_subagents.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_terminal_capabilities.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_textual_adapter.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_textual_patches.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_theme.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_thread_selector.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_token_tracker.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_tool_display.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_ui.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_unicode_security.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_update_available.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_update_check.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_version.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/test_welcome.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/tools/__init__.py +0 -0
- {deepagents_cli-0.0.42 → deepagents_cli-0.0.44}/tests/unit_tests/tools/test_fetch_url.py +0 -0
|
@@ -15,6 +15,7 @@ downloads/
|
|
|
15
15
|
eggs/
|
|
16
16
|
.eggs/
|
|
17
17
|
lib/
|
|
18
|
+
!libs/cli/frontend/src/lib/
|
|
18
19
|
lib64/
|
|
19
20
|
parts/
|
|
20
21
|
sdist/
|
|
@@ -227,3 +228,8 @@ libs/cli/TEXTUAL_PROGRESS.md
|
|
|
227
228
|
|
|
228
229
|
CLAUDE.md
|
|
229
230
|
.worktrees/
|
|
231
|
+
|
|
232
|
+
# Frontend build artifacts (source tree; package data under libs/cli/deepagents_cli/deploy/frontend_dist/ is tracked)
|
|
233
|
+
libs/cli/frontend/node_modules/
|
|
234
|
+
libs/cli/frontend/dist/
|
|
235
|
+
node_modules/
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.0.44](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.43...deepagents-cli==0.0.44) (2026-04-29)
|
|
4
|
+
|
|
5
|
+
### Bug Fixes
|
|
6
|
+
|
|
7
|
+
* Startup import deadlock ([#3017](https://github.com/langchain-ai/deepagents/issues/3017)) ([d40ab57](https://github.com/langchain-ai/deepagents/commit/d40ab57800a6ad12b0c9a5e249753702ec0832c8))
|
|
8
|
+
|
|
9
|
+
## [0.0.43](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.42...deepagents-cli==0.0.43) (2026-04-29)
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* Bundled chat frontend for deepagent deploy ([#2940](https://github.com/langchain-ai/deepagents/issues/2940)) ([9bde0c7](https://github.com/langchain-ai/deepagents/commit/9bde0c7835ded20e80466d8361f40784141d68d8))
|
|
14
|
+
|
|
3
15
|
## [0.0.42](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.41...deepagents-cli==0.0.42) (2026-04-29)
|
|
4
16
|
|
|
5
17
|
### Features
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagents-cli
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.44
|
|
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/
|
|
7
7
|
Project-URL: Repository, https://github.com/langchain-ai/deepagents
|
|
8
8
|
Project-URL: Issues, https://github.com/langchain-ai/deepagents/issues
|
|
9
9
|
Project-URL: Changelog, https://github.com/langchain-ai/deepagents/blob/main/libs/cli/CHANGELOG.md
|
|
10
|
-
Project-URL: Twitter, https://x.com/
|
|
10
|
+
Project-URL: Twitter, https://x.com/langchain_oss
|
|
11
11
|
Project-URL: Slack, https://www.langchain.com/join-community
|
|
12
12
|
Project-URL: Reddit, https://www.reddit.com/r/LangChain/
|
|
13
13
|
License: MIT
|
|
@@ -30,9 +30,9 @@ Requires-Dist: deepagents-acp>=0.0.4
|
|
|
30
30
|
Requires-Dist: deepagents==0.5.4
|
|
31
31
|
Requires-Dist: httpx<1.0.0,>=0.28.1
|
|
32
32
|
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.2
|
|
33
|
-
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.
|
|
34
|
-
Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.2.
|
|
35
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.1
|
|
33
|
+
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.2
|
|
34
|
+
Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.2.2
|
|
35
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.2.1
|
|
36
36
|
Requires-Dist: langchain<2.0.0,>=1.2.15
|
|
37
37
|
Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.0.0
|
|
38
38
|
Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.15
|
|
@@ -55,76 +55,76 @@ Requires-Dist: textual<9.0.0,>=8.0.0
|
|
|
55
55
|
Requires-Dist: tomli-w<2.0.0,>=1.0.0
|
|
56
56
|
Requires-Dist: uuid-utils<1.0.0,>=0.10.0
|
|
57
57
|
Provides-Extra: agentcore
|
|
58
|
-
Requires-Dist: langchain-agentcore-codeinterpreter>=0.0.
|
|
58
|
+
Requires-Dist: langchain-agentcore-codeinterpreter>=0.0.2; extra == 'agentcore'
|
|
59
59
|
Provides-Extra: all-providers
|
|
60
60
|
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.2; extra == 'all-providers'
|
|
61
|
-
Requires-Dist: langchain-aws<2.0.0,>=1.
|
|
62
|
-
Requires-Dist: langchain-baseten<1.0.0,>=0.
|
|
63
|
-
Requires-Dist: langchain-cohere<1.0.0,>=0.5.
|
|
64
|
-
Requires-Dist: langchain-deepseek<2.0.0,>=1.0.
|
|
65
|
-
Requires-Dist: langchain-fireworks<2.0.0,>=1.
|
|
66
|
-
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.
|
|
67
|
-
Requires-Dist: langchain-google-vertexai<4.0.0,>=3.
|
|
68
|
-
Requires-Dist: langchain-groq<2.0.0,>=1.
|
|
69
|
-
Requires-Dist: langchain-huggingface<2.0.0,>=1.
|
|
70
|
-
Requires-Dist: langchain-ibm<2.0.0,>=1.0.
|
|
71
|
-
Requires-Dist: langchain-litellm<2.0.0,>=0.6.
|
|
72
|
-
Requires-Dist: langchain-mistralai<2.0.0,>=1.
|
|
73
|
-
Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.
|
|
74
|
-
Requires-Dist: langchain-ollama<2.0.0,>=1.
|
|
75
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.1
|
|
76
|
-
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.
|
|
77
|
-
Requires-Dist: langchain-perplexity<2.0.0,>=1.
|
|
78
|
-
Requires-Dist: langchain-xai<2.0.0,>=1.
|
|
61
|
+
Requires-Dist: langchain-aws<2.0.0,>=1.4.5; extra == 'all-providers'
|
|
62
|
+
Requires-Dist: langchain-baseten<1.0.0,>=0.2.0; extra == 'all-providers'
|
|
63
|
+
Requires-Dist: langchain-cohere<1.0.0,>=0.5.1; extra == 'all-providers'
|
|
64
|
+
Requires-Dist: langchain-deepseek<2.0.0,>=1.0.1; extra == 'all-providers'
|
|
65
|
+
Requires-Dist: langchain-fireworks<2.0.0,>=1.2.0; extra == 'all-providers'
|
|
66
|
+
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.2; extra == 'all-providers'
|
|
67
|
+
Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.2; extra == 'all-providers'
|
|
68
|
+
Requires-Dist: langchain-groq<2.0.0,>=1.1.2; extra == 'all-providers'
|
|
69
|
+
Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'all-providers'
|
|
70
|
+
Requires-Dist: langchain-ibm<2.0.0,>=1.0.7; extra == 'all-providers'
|
|
71
|
+
Requires-Dist: langchain-litellm<2.0.0,>=0.6.4; extra == 'all-providers'
|
|
72
|
+
Requires-Dist: langchain-mistralai<2.0.0,>=1.1.2; extra == 'all-providers'
|
|
73
|
+
Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.2.1; extra == 'all-providers'
|
|
74
|
+
Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
75
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.2.1; extra == 'all-providers'
|
|
76
|
+
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.1; extra == 'all-providers'
|
|
77
|
+
Requires-Dist: langchain-perplexity<2.0.0,>=1.1.0; extra == 'all-providers'
|
|
78
|
+
Requires-Dist: langchain-xai<2.0.0,>=1.2.2; extra == 'all-providers'
|
|
79
79
|
Provides-Extra: all-sandboxes
|
|
80
|
-
Requires-Dist: langchain-agentcore-codeinterpreter>=0.0.
|
|
81
|
-
Requires-Dist: langchain-daytona>=0.0.
|
|
82
|
-
Requires-Dist: langchain-modal>=0.0.
|
|
83
|
-
Requires-Dist: langchain-runloop>=0.0.
|
|
80
|
+
Requires-Dist: langchain-agentcore-codeinterpreter>=0.0.2; extra == 'all-sandboxes'
|
|
81
|
+
Requires-Dist: langchain-daytona>=0.0.5; extra == 'all-sandboxes'
|
|
82
|
+
Requires-Dist: langchain-modal>=0.0.3; extra == 'all-sandboxes'
|
|
83
|
+
Requires-Dist: langchain-runloop>=0.0.4; extra == 'all-sandboxes'
|
|
84
84
|
Provides-Extra: anthropic
|
|
85
85
|
Requires-Dist: langchain-anthropic<2.0.0,>=1.4.2; extra == 'anthropic'
|
|
86
86
|
Provides-Extra: baseten
|
|
87
|
-
Requires-Dist: langchain-baseten<1.0.0,>=0.
|
|
87
|
+
Requires-Dist: langchain-baseten<1.0.0,>=0.2.0; extra == 'baseten'
|
|
88
88
|
Provides-Extra: bedrock
|
|
89
|
-
Requires-Dist: langchain-aws<2.0.0,>=1.
|
|
89
|
+
Requires-Dist: langchain-aws<2.0.0,>=1.4.5; extra == 'bedrock'
|
|
90
90
|
Provides-Extra: cohere
|
|
91
|
-
Requires-Dist: langchain-cohere<1.0.0,>=0.5.
|
|
91
|
+
Requires-Dist: langchain-cohere<1.0.0,>=0.5.1; extra == 'cohere'
|
|
92
92
|
Provides-Extra: daytona
|
|
93
|
-
Requires-Dist: langchain-daytona>=0.0.
|
|
93
|
+
Requires-Dist: langchain-daytona>=0.0.5; extra == 'daytona'
|
|
94
94
|
Provides-Extra: deepseek
|
|
95
|
-
Requires-Dist: langchain-deepseek<2.0.0,>=1.0.
|
|
95
|
+
Requires-Dist: langchain-deepseek<2.0.0,>=1.0.1; extra == 'deepseek'
|
|
96
96
|
Provides-Extra: fireworks
|
|
97
|
-
Requires-Dist: langchain-fireworks<2.0.0,>=1.
|
|
97
|
+
Requires-Dist: langchain-fireworks<2.0.0,>=1.2.0; extra == 'fireworks'
|
|
98
98
|
Provides-Extra: google-genai
|
|
99
|
-
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.
|
|
99
|
+
Requires-Dist: langchain-google-genai<5.0.0,>=4.2.2; extra == 'google-genai'
|
|
100
100
|
Provides-Extra: groq
|
|
101
|
-
Requires-Dist: langchain-groq<2.0.0,>=1.
|
|
101
|
+
Requires-Dist: langchain-groq<2.0.0,>=1.1.2; extra == 'groq'
|
|
102
102
|
Provides-Extra: huggingface
|
|
103
|
-
Requires-Dist: langchain-huggingface<2.0.0,>=1.
|
|
103
|
+
Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'huggingface'
|
|
104
104
|
Provides-Extra: ibm
|
|
105
|
-
Requires-Dist: langchain-ibm<2.0.0,>=1.0.
|
|
105
|
+
Requires-Dist: langchain-ibm<2.0.0,>=1.0.7; extra == 'ibm'
|
|
106
106
|
Provides-Extra: litellm
|
|
107
|
-
Requires-Dist: langchain-litellm<2.0.0,>=0.6.
|
|
107
|
+
Requires-Dist: langchain-litellm<2.0.0,>=0.6.4; extra == 'litellm'
|
|
108
108
|
Provides-Extra: mistralai
|
|
109
|
-
Requires-Dist: langchain-mistralai<2.0.0,>=1.
|
|
109
|
+
Requires-Dist: langchain-mistralai<2.0.0,>=1.1.2; extra == 'mistralai'
|
|
110
110
|
Provides-Extra: modal
|
|
111
|
-
Requires-Dist: langchain-modal>=0.0.
|
|
111
|
+
Requires-Dist: langchain-modal>=0.0.3; extra == 'modal'
|
|
112
112
|
Provides-Extra: nvidia
|
|
113
|
-
Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.
|
|
113
|
+
Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.2.1; extra == 'nvidia'
|
|
114
114
|
Provides-Extra: ollama
|
|
115
|
-
Requires-Dist: langchain-ollama<2.0.0,>=1.
|
|
115
|
+
Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'ollama'
|
|
116
116
|
Provides-Extra: openai
|
|
117
|
-
Requires-Dist: langchain-openai<2.0.0,>=1.1
|
|
117
|
+
Requires-Dist: langchain-openai<2.0.0,>=1.2.1; extra == 'openai'
|
|
118
118
|
Provides-Extra: openrouter
|
|
119
|
-
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.
|
|
119
|
+
Requires-Dist: langchain-openrouter<2.0.0,>=0.2.1; extra == 'openrouter'
|
|
120
120
|
Provides-Extra: perplexity
|
|
121
|
-
Requires-Dist: langchain-perplexity<2.0.0,>=1.
|
|
121
|
+
Requires-Dist: langchain-perplexity<2.0.0,>=1.1.0; extra == 'perplexity'
|
|
122
122
|
Provides-Extra: runloop
|
|
123
|
-
Requires-Dist: langchain-runloop>=0.0.
|
|
123
|
+
Requires-Dist: langchain-runloop>=0.0.4; extra == 'runloop'
|
|
124
124
|
Provides-Extra: vertexai
|
|
125
|
-
Requires-Dist: langchain-google-vertexai<4.0.0,>=3.
|
|
125
|
+
Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.2; extra == 'vertexai'
|
|
126
126
|
Provides-Extra: xai
|
|
127
|
-
Requires-Dist: langchain-xai<2.0.0,>=1.
|
|
127
|
+
Requires-Dist: langchain-xai<2.0.0,>=1.2.2; extra == 'xai'
|
|
128
128
|
Description-Content-Type: text/markdown
|
|
129
129
|
|
|
130
130
|
# 🧠🤖 Deep Agents CLI
|
|
@@ -132,7 +132,7 @@ Description-Content-Type: text/markdown
|
|
|
132
132
|
[](https://pypi.org/project/deepagents-cli/#history)
|
|
133
133
|
[](https://opensource.org/licenses/MIT)
|
|
134
134
|
[](https://pypistats.org/packages/deepagents-cli)
|
|
135
|
-
[](https://x.com/langchain_oss)
|
|
136
136
|
|
|
137
137
|
<p align="center">
|
|
138
138
|
<img src="https://raw.githubusercontent.com/langchain-ai/deepagents/main/libs/cli/images/cli.png" alt="Deep Agents CLI" width="600"/>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://pypi.org/project/deepagents-cli/#history)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
[](https://pypistats.org/packages/deepagents-cli)
|
|
6
|
-
[](https://x.com/langchain_oss)
|
|
7
7
|
|
|
8
8
|
<p align="center">
|
|
9
9
|
<img src="https://raw.githubusercontent.com/langchain-ai/deepagents/main/libs/cli/images/cli.png" alt="Deep Agents CLI" width="600"/>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Version information and lightweight constants for `deepagents-cli`."""
|
|
2
2
|
|
|
3
|
-
__version__ = "0.0.
|
|
3
|
+
__version__ = "0.0.44" # x-release-please-version
|
|
4
4
|
|
|
5
5
|
DOCS_URL = "https://docs.langchain.com/oss/python/deepagents/cli"
|
|
6
6
|
"""URL for `deepagents-cli` documentation."""
|
|
@@ -849,6 +849,13 @@ class DeepAgentsApp(App):
|
|
|
849
849
|
self._shell_running = False
|
|
850
850
|
"""True while a `!` shell command is executing."""
|
|
851
851
|
|
|
852
|
+
self._prewarm_worker: Worker[None] | None = None
|
|
853
|
+
"""Background worker that prewarms `deepagents`/LangChain imports.
|
|
854
|
+
|
|
855
|
+
Awaited via `_await_prewarm_imports` before any caller on the event
|
|
856
|
+
loop re-enters the same module graph (see that method for why).
|
|
857
|
+
"""
|
|
858
|
+
|
|
852
859
|
# Lifecycle flags & re-entry guards
|
|
853
860
|
self._connecting = server_kwargs is not None
|
|
854
861
|
"""True while the backing server is being started or restarted.
|
|
@@ -1038,6 +1045,39 @@ class DeepAgentsApp(App):
|
|
|
1038
1045
|
colors = theme.get_theme_colors(self)
|
|
1039
1046
|
return theme.get_css_variable_defaults(colors=colors)
|
|
1040
1047
|
|
|
1048
|
+
def _fatal_error(self) -> None:
|
|
1049
|
+
"""Render an unhandled-exception traceback without leaking secrets.
|
|
1050
|
+
|
|
1051
|
+
Textual's default `_fatal_error` renders with `show_locals=True`,
|
|
1052
|
+
which prints local variables — including resolved API keys carried
|
|
1053
|
+
in `kwargs` dicts on the call path through `create_model`. Locals
|
|
1054
|
+
are only re-enabled when `DEEPAGENTS_CLI_DEBUG` matches a truthy
|
|
1055
|
+
token (`"1"`, `"true"`, `"yes"`); any other value, including `"0"`
|
|
1056
|
+
and `"false"`, leaves them disabled.
|
|
1057
|
+
"""
|
|
1058
|
+
try:
|
|
1059
|
+
import rich
|
|
1060
|
+
from rich.segment import Segments
|
|
1061
|
+
from rich.traceback import Traceback
|
|
1062
|
+
|
|
1063
|
+
from deepagents_cli._env_vars import DEBUG
|
|
1064
|
+
except Exception: # noqa: BLE001 # mid-teardown import errors fall through to Textual's default rather than double-fault and swallow the original crash
|
|
1065
|
+
super()._fatal_error()
|
|
1066
|
+
return
|
|
1067
|
+
|
|
1068
|
+
self.bell()
|
|
1069
|
+
show_locals = os.environ.get(DEBUG, "").lower() in {"1", "true", "yes"}
|
|
1070
|
+
traceback = Traceback(
|
|
1071
|
+
show_locals=show_locals,
|
|
1072
|
+
width=None,
|
|
1073
|
+
locals_max_length=5,
|
|
1074
|
+
suppress=[rich],
|
|
1075
|
+
)
|
|
1076
|
+
self._exit_renderables.append(
|
|
1077
|
+
Segments(self.console.render(traceback, self.console.options))
|
|
1078
|
+
)
|
|
1079
|
+
self._close_messages_no_wait()
|
|
1080
|
+
|
|
1041
1081
|
def compose(self) -> ComposeResult:
|
|
1042
1082
|
"""Compose the application layout.
|
|
1043
1083
|
|
|
@@ -1108,7 +1148,8 @@ class DeepAgentsApp(App):
|
|
|
1108
1148
|
# Prewarm heavy imports in a thread while the first frame renders.
|
|
1109
1149
|
# The user can't type yet, so GIL contention is harmless. By the
|
|
1110
1150
|
# time _post_paint_init fires its inline imports are dict lookups.
|
|
1111
|
-
|
|
1151
|
+
# Handle is captured so `_await_prewarm_imports` can block on it.
|
|
1152
|
+
self._prewarm_worker = self.run_worker(
|
|
1112
1153
|
asyncio.to_thread(self._prewarm_deferred_imports),
|
|
1113
1154
|
exclusive=True,
|
|
1114
1155
|
group="startup-import-prewarm",
|
|
@@ -1580,6 +1621,10 @@ class DeepAgentsApp(App):
|
|
|
1580
1621
|
# does the heavy langchain import + SDK init and may refine them
|
|
1581
1622
|
# (e.g., context_limit from the model profile).
|
|
1582
1623
|
if self._model_kwargs is not None:
|
|
1624
|
+
# Block on prewarm before re-entering the import graph; see
|
|
1625
|
+
# `_await_prewarm_imports` for the deadlock rationale.
|
|
1626
|
+
await self._await_prewarm_imports()
|
|
1627
|
+
|
|
1583
1628
|
from deepagents_cli.config import create_model
|
|
1584
1629
|
from deepagents_cli.model_config import ModelConfigError, save_recent_model
|
|
1585
1630
|
|
|
@@ -1719,6 +1764,30 @@ class DeepAgentsApp(App):
|
|
|
1719
1764
|
self._queued_widgets.clear()
|
|
1720
1765
|
self._deferred_actions.clear()
|
|
1721
1766
|
|
|
1767
|
+
async def _await_prewarm_imports(self) -> None:
|
|
1768
|
+
"""Wait for prewarm imports before re-entering their module graph.
|
|
1769
|
+
|
|
1770
|
+
Prevents a multi-threaded import deadlock: the prewarm worker runs in
|
|
1771
|
+
`asyncio.to_thread`, and any caller that imports `deepagents` or
|
|
1772
|
+
LangChain from the event-loop thread while it's still running can
|
|
1773
|
+
race on partially-initialized module locks.
|
|
1774
|
+
|
|
1775
|
+
`CancelledError` propagates so app shutdown isn't silently absorbed.
|
|
1776
|
+
"""
|
|
1777
|
+
from textual.worker import WorkerFailed
|
|
1778
|
+
|
|
1779
|
+
worker = self._prewarm_worker
|
|
1780
|
+
if worker is None:
|
|
1781
|
+
return
|
|
1782
|
+
try:
|
|
1783
|
+
await worker.wait()
|
|
1784
|
+
except WorkerFailed:
|
|
1785
|
+
# Prewarm body best-efforts third-party imports and already
|
|
1786
|
+
# warns; logging at WARNING here surfaces unexpected failures
|
|
1787
|
+
# (e.g. a regression that breaks a non-optional import) that
|
|
1788
|
+
# the body itself didn't catch.
|
|
1789
|
+
logger.warning("Import prewarm worker failed", exc_info=True)
|
|
1790
|
+
|
|
1722
1791
|
@staticmethod
|
|
1723
1792
|
def _prewarm_deferred_imports() -> None:
|
|
1724
1793
|
"""Background-load modules deferred from the startup path.
|
|
@@ -25,6 +25,8 @@ from __future__ import annotations
|
|
|
25
25
|
|
|
26
26
|
import json
|
|
27
27
|
import logging
|
|
28
|
+
import os
|
|
29
|
+
import re
|
|
28
30
|
import shutil
|
|
29
31
|
from pathlib import Path
|
|
30
32
|
from typing import Any
|
|
@@ -39,6 +41,7 @@ from deepagents_cli.deploy.config import (
|
|
|
39
41
|
load_subagents,
|
|
40
42
|
)
|
|
41
43
|
from deepagents_cli.deploy.templates import (
|
|
44
|
+
APP_PY_TEMPLATE,
|
|
42
45
|
AUTH_BLOCKS,
|
|
43
46
|
AUTH_ON_HANDLER,
|
|
44
47
|
DEPLOY_GRAPH_TEMPLATE,
|
|
@@ -69,6 +72,97 @@ _MODEL_PROVIDER_DEPS: dict[str, str] = {
|
|
|
69
72
|
}
|
|
70
73
|
"""Dependencies inferred from a provider: prefix on the model string."""
|
|
71
74
|
|
|
75
|
+
_FRONTEND_DIST_SRC = Path(__file__).parent / "frontend_dist"
|
|
76
|
+
"""Location of the shipped pre-built frontend, inside this Python package."""
|
|
77
|
+
|
|
78
|
+
_FRONTEND_PLACEHOLDER_RE = re.compile(
|
|
79
|
+
r"window\.__DEEPAGENTS_CONFIG__\s*=\s*\{[^<]*?\};",
|
|
80
|
+
re.DOTALL,
|
|
81
|
+
)
|
|
82
|
+
"""Matches the placeholder script we injected into index.html at build time."""
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _build_runtime_config_json(config: DeployConfig) -> str:
|
|
86
|
+
"""Build the JSON value injected into `window.__DEEPAGENTS_CONFIG__`.
|
|
87
|
+
|
|
88
|
+
Only reached when `[frontend].enabled` and `[auth]` is set —
|
|
89
|
+
validation guarantees both. The `is None` guards below exist so
|
|
90
|
+
the optional fields narrow for type-checkers.
|
|
91
|
+
"""
|
|
92
|
+
if config.frontend is None:
|
|
93
|
+
msg = "runtime config requires [frontend] to be configured"
|
|
94
|
+
raise ValueError(msg)
|
|
95
|
+
if config.auth is None:
|
|
96
|
+
msg = "runtime config requires [auth] to be configured"
|
|
97
|
+
raise ValueError(msg)
|
|
98
|
+
|
|
99
|
+
app_name = config.frontend.app_name or config.agent.name
|
|
100
|
+
payload: dict[str, Any] = {
|
|
101
|
+
"appName": app_name,
|
|
102
|
+
"assistantId": "agent",
|
|
103
|
+
}
|
|
104
|
+
# Optional UI-customization fields — only injected when the user
|
|
105
|
+
# set them, so the default-bundle case stays small.
|
|
106
|
+
if config.frontend.subtitle is not None:
|
|
107
|
+
payload["subtitle"] = config.frontend.subtitle
|
|
108
|
+
if config.frontend.prompts is not None:
|
|
109
|
+
payload["prompts"] = list(config.frontend.prompts)
|
|
110
|
+
|
|
111
|
+
provider = config.auth.provider
|
|
112
|
+
payload["auth"] = provider
|
|
113
|
+
if provider == "supabase":
|
|
114
|
+
payload["supabaseUrl"] = os.environ["SUPABASE_URL"]
|
|
115
|
+
payload["supabaseAnonKey"] = os.environ["SUPABASE_PUBLISHABLE_DEFAULT_KEY"]
|
|
116
|
+
elif provider == "clerk":
|
|
117
|
+
payload["clerkPublishableKey"] = os.environ["CLERK_PUBLISHABLE_KEY"]
|
|
118
|
+
elif provider == "anonymous":
|
|
119
|
+
# No env vars; payload["auth"] = "anonymous" is enough.
|
|
120
|
+
pass
|
|
121
|
+
else:
|
|
122
|
+
msg = f"Unknown auth provider for frontend: {provider}"
|
|
123
|
+
raise ValueError(msg)
|
|
124
|
+
|
|
125
|
+
# Escape `<` so a hostile or accidental `</script>` inside a string value
|
|
126
|
+
# can't break out of the inline <script> tag.
|
|
127
|
+
return json.dumps(payload, separators=(",", ":")).replace("<", "\\u003c")
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def _copy_frontend_dist(config: DeployConfig, build_dir: Path) -> None:
|
|
131
|
+
"""Copy the pre-built bundle into build_dir and rewrite the config placeholder."""
|
|
132
|
+
if not _FRONTEND_DIST_SRC.is_dir():
|
|
133
|
+
msg = (
|
|
134
|
+
f"Shipped frontend bundle not found at {_FRONTEND_DIST_SRC}. "
|
|
135
|
+
"Did you run `make build-frontends`?"
|
|
136
|
+
)
|
|
137
|
+
raise RuntimeError(msg)
|
|
138
|
+
|
|
139
|
+
dest = build_dir / "frontend_dist"
|
|
140
|
+
if dest.exists():
|
|
141
|
+
shutil.rmtree(dest)
|
|
142
|
+
shutil.copytree(_FRONTEND_DIST_SRC, dest)
|
|
143
|
+
|
|
144
|
+
index_html = dest / "index.html"
|
|
145
|
+
if not index_html.is_file():
|
|
146
|
+
msg = f"expected index.html inside {_FRONTEND_DIST_SRC}"
|
|
147
|
+
raise RuntimeError(msg)
|
|
148
|
+
|
|
149
|
+
html = index_html.read_text(encoding="utf-8")
|
|
150
|
+
payload = _build_runtime_config_json(config)
|
|
151
|
+
replacement = f"window.__DEEPAGENTS_CONFIG__ = {payload};"
|
|
152
|
+
new_html, count = _FRONTEND_PLACEHOLDER_RE.subn(
|
|
153
|
+
lambda _m: replacement,
|
|
154
|
+
html,
|
|
155
|
+
count=1,
|
|
156
|
+
)
|
|
157
|
+
if count == 0:
|
|
158
|
+
msg = (
|
|
159
|
+
"Could not find window.__DEEPAGENTS_CONFIG__ placeholder in the "
|
|
160
|
+
"shipped index.html. The frontend bundle is out of sync with the "
|
|
161
|
+
"bundler — rebuild with `make build-frontends`."
|
|
162
|
+
)
|
|
163
|
+
raise RuntimeError(msg)
|
|
164
|
+
index_html.write_text(new_html, encoding="utf-8")
|
|
165
|
+
|
|
72
166
|
|
|
73
167
|
def bundle(
|
|
74
168
|
config: DeployConfig,
|
|
@@ -127,18 +221,38 @@ def bundle(
|
|
|
127
221
|
)
|
|
128
222
|
logger.info("Generated deploy_graph.py")
|
|
129
223
|
|
|
130
|
-
# 6. Generate auth.py
|
|
131
|
-
|
|
132
|
-
|
|
224
|
+
# 6. Generate auth.py from the [auth] provider, if any. Skipped
|
|
225
|
+
# entirely when [auth] is omitted — in that case LangSmith Cloud's
|
|
226
|
+
# default x-api-key auth applies. Validation guarantees [auth] is
|
|
227
|
+
# set whenever [frontend].enabled, so auth.py is always present
|
|
228
|
+
# for frontend deploys (including the "anonymous" provider, whose
|
|
229
|
+
# permissive handler lets the bundled UI reach /threads).
|
|
230
|
+
frontend_enabled = config.frontend is not None and config.frontend.enabled
|
|
231
|
+
auth_provider: str | None = (
|
|
232
|
+
config.auth.provider if config.auth is not None else None
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
auth_present = auth_provider is not None
|
|
236
|
+
if auth_provider is not None:
|
|
133
237
|
(build_dir / "auth.py").write_text(
|
|
134
|
-
_render_auth_py(
|
|
238
|
+
_render_auth_py(auth_provider),
|
|
135
239
|
encoding="utf-8",
|
|
136
240
|
)
|
|
137
|
-
logger.info("Generated auth.py (%s)",
|
|
241
|
+
logger.info("Generated auth.py (%s)", auth_provider)
|
|
242
|
+
|
|
243
|
+
# 6b. Copy frontend bundle when enabled.
|
|
244
|
+
if frontend_enabled:
|
|
245
|
+
_copy_frontend_dist(config, build_dir)
|
|
246
|
+
(build_dir / "app.py").write_text(APP_PY_TEMPLATE, encoding="utf-8")
|
|
247
|
+
logger.info("Copied frontend bundle and wrote app.py (%s)", auth_provider)
|
|
138
248
|
|
|
139
249
|
# 7. Render langgraph.json.
|
|
140
250
|
(build_dir / "langgraph.json").write_text(
|
|
141
|
-
_render_langgraph_json(
|
|
251
|
+
_render_langgraph_json(
|
|
252
|
+
env_present=env_present,
|
|
253
|
+
auth_present=auth_present,
|
|
254
|
+
frontend_present=frontend_enabled,
|
|
255
|
+
),
|
|
142
256
|
encoding="utf-8",
|
|
143
257
|
)
|
|
144
258
|
|
|
@@ -312,8 +426,13 @@ def _render_auth_py(provider: str) -> str:
|
|
|
312
426
|
return auth_block + AUTH_ON_HANDLER
|
|
313
427
|
|
|
314
428
|
|
|
315
|
-
def _render_langgraph_json(
|
|
316
|
-
|
|
429
|
+
def _render_langgraph_json(
|
|
430
|
+
*,
|
|
431
|
+
env_present: bool,
|
|
432
|
+
auth_present: bool = False,
|
|
433
|
+
frontend_present: bool = False,
|
|
434
|
+
) -> str:
|
|
435
|
+
"""Render `langgraph.json` — adds `"env"`, `"auth"`, `"http"` when applicable."""
|
|
317
436
|
data: dict = {
|
|
318
437
|
"dependencies": ["."],
|
|
319
438
|
"graphs": {"agent": "./deploy_graph.py:make_graph"},
|
|
@@ -323,6 +442,8 @@ def _render_langgraph_json(*, env_present: bool, auth_present: bool = False) ->
|
|
|
323
442
|
data["env"] = ".env"
|
|
324
443
|
if auth_present:
|
|
325
444
|
data["auth"] = {"path": "./auth.py:auth"}
|
|
445
|
+
if frontend_present:
|
|
446
|
+
data["http"] = {"app": "./app.py:app"}
|
|
326
447
|
return json.dumps(data, indent=2) + "\n"
|
|
327
448
|
|
|
328
449
|
|
|
@@ -392,7 +513,12 @@ def print_bundle_summary(config: DeployConfig, build_dir: Path) -> None:
|
|
|
392
513
|
print(f"\n Agent: {config.agent.name}")
|
|
393
514
|
print(f" Model: {config.agent.model}")
|
|
394
515
|
if config.auth is not None:
|
|
395
|
-
|
|
516
|
+
if config.auth.provider == "anonymous":
|
|
517
|
+
print(" Auth: anonymous (API open to anyone)")
|
|
518
|
+
else:
|
|
519
|
+
print(f" Auth: {config.auth.provider}")
|
|
520
|
+
else:
|
|
521
|
+
print(" Auth: none (LangSmith API key required to call the API)")
|
|
396
522
|
|
|
397
523
|
memory_files = sorted(seed.get("memories", {}).keys())
|
|
398
524
|
if memory_files:
|
|
@@ -265,6 +265,51 @@ def _deploy(
|
|
|
265
265
|
print(f" - {err}")
|
|
266
266
|
raise SystemExit(1)
|
|
267
267
|
|
|
268
|
+
# Warn + confirm if the frontend was set to anonymous mode. The
|
|
269
|
+
# generated auth.py for this case is permissive (overrides the
|
|
270
|
+
# LangSmith default x-api-key requirement) so the API is reachable
|
|
271
|
+
# by anyone with the deploy URL.
|
|
272
|
+
is_anonymous = (
|
|
273
|
+
config.frontend is not None
|
|
274
|
+
and config.frontend.enabled
|
|
275
|
+
and config.auth is not None
|
|
276
|
+
and config.auth.provider == "anonymous"
|
|
277
|
+
)
|
|
278
|
+
if is_anonymous:
|
|
279
|
+
# ANSI bold-red header + red bullets so this warning is visually
|
|
280
|
+
# distinct from the yellow beta-warning that prints above it
|
|
281
|
+
# (otherwise the "Continue? [y/N]" prompt looks like it's
|
|
282
|
+
# confirming the beta line rather than the anonymous-auth line).
|
|
283
|
+
print(
|
|
284
|
+
"\033[1;31m⚠ This deploy will use ANONYMOUS auth. "
|
|
285
|
+
"The API is open to anyone with the deploy URL.\033[0m"
|
|
286
|
+
)
|
|
287
|
+
print(
|
|
288
|
+
"\033[31m • Browser UI shows per-browser threads "
|
|
289
|
+
"(cookie-scoped UX, not security).\033[0m"
|
|
290
|
+
)
|
|
291
|
+
print(
|
|
292
|
+
"\033[31m • Anyone with the URL can call the API directly "
|
|
293
|
+
"(curl /threads, /runs, etc.) — no auth.\033[0m"
|
|
294
|
+
)
|
|
295
|
+
print(
|
|
296
|
+
"\033[31m • For real per-user auth, add an [auth] section "
|
|
297
|
+
'(provider = "supabase" or "clerk").\033[0m'
|
|
298
|
+
)
|
|
299
|
+
# Skip the interactive confirm on dry-run (no real push happens).
|
|
300
|
+
if not dry_run:
|
|
301
|
+
try:
|
|
302
|
+
answer = (
|
|
303
|
+
input("Continue with anonymous deploy? [y/N]: ").strip().lower()
|
|
304
|
+
)
|
|
305
|
+
except (EOFError, KeyboardInterrupt):
|
|
306
|
+
print()
|
|
307
|
+
print("Aborted.")
|
|
308
|
+
raise SystemExit(1) from None
|
|
309
|
+
if answer not in {"y", "yes"}:
|
|
310
|
+
print("Aborted.")
|
|
311
|
+
raise SystemExit(1)
|
|
312
|
+
|
|
268
313
|
# Bundle
|
|
269
314
|
build_dir = Path(tempfile.mkdtemp(prefix="deepagents-deploy-"))
|
|
270
315
|
|