cade-cli 0.17.0__tar.gz → 0.18.0__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.
- {cade_cli-0.17.0 → cade_cli-0.18.0}/PKG-INFO +2 -2
- {cade_cli-0.17.0 → cade_cli-0.18.0}/README.md +1 -1
- {cade_cli-0.17.0 → cade_cli-0.18.0}/pyproject.toml +1 -1
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/commands/daemon.py +17 -9
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/commands/mcp.py +45 -7
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/mcp_hosts.py +140 -1
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/onboarding.py +1 -1
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/server.py +1 -1
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/assets/.claude-plugin/plugin.json +1 -1
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/assets/.cursor-plugin/plugin.json +1 -1
- {cade_cli-0.17.0 → cade_cli-0.18.0}/.gitignore +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/LICENSE +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/__main__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/_metadata.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/config.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/errors.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/grants.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/resources.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/sandbox.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/server.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/tools/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/tools/_read_cache.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/tools/access.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/tools/agents.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/tools/filesystem.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/tools/git.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/tools/notifications.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/tools/questions.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/tools/results.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/tools/schemas.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/tools/search.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/tools/shell.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/tools/tasks.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/tools/web_fetch.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/tools/web_search.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/utils.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/web/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/web/arcade_client.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/web/cache.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/web/extract.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/web/markdown.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/web/preapproved.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/web/prompts.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/web/scrape.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/web/search/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/web/search/arcade.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/web/search/base.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cade_mcp_local/web/search/http.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/ai/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/ai/prompts.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/app.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/auth.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/commands/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/commands/account.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/commands/agent_group.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/commands/agents.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/commands/auth.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/commands/chat.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/commands/cron.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/commands/grant.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/commands/hooks.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/commands/mem.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/commands/tasks.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/commands/thread.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/commands/tools.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/cli/ui.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/agent.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/binary.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/comms.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/config.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/constants.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/errors.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/frozen.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/git.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/inbox.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/logging.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/memory.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/model_specs.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/names.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/paths.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/runtime.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/secrets.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/spawn.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/text.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/core/types.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/adapters/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/adapters/base.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/adapters/factory.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/adapters/imessage.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/adapters/registry.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/adapters/stub.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/adapters/telegram.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/allowlist.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/attach.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/chunker.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/client.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/commands.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/config.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/control.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/cron.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/elicitation.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/ensure.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/format.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/gateway/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/gateway/app.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/gateway/auth.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/gateway/constants.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/gateway/elicitation.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/gateway/exposure.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/gateway/host_agent.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/gateway/limits.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/gateway/middleware.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/gateway/resources.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/gateway/subscriptions.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/gateway/turn_bridge.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/grants.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/inbox.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/inbox_cron.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/install.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/lock.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/mesh.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/message_pump.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/observability.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/owner.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/progress_sink.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/registry.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/router.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/runner.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/runner_main.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/secrets.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/secrets_broker.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/services.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/sinks.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/supervisor.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/tokens.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/traffic.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/turns.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/daemon/wake.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/execution/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/execution/context_window.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/execution/mcp_schema_index.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/execution/orchestrator.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/execution/parallel.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/execution/tool_result_store.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/execution/tool_schema_cache.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/hooks/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/hooks/config.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/hooks/engine.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/hooks/executors/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/hooks/executors/callback.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/hooks/executors/command.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/hooks/executors/http.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/hooks/executors/prompt.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/hooks/executors/ssrf_guard.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/hooks/matchers.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/hooks/registry.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/hooks/types.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/assets/.claude-plugin/marketplace.json +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/assets/.cursor-plugin/marketplace.json +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/assets/agents/operator.md +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/assets/commands/ask.md +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/assets/commands/memory.md +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/assets/commands/tasks.md +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/assets/mcp.json +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/assets/rules/gateway.mdc +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/assets/skills/ask/SKILL.md +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/assets/skills/memory/SKILL.md +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/assets/skills/tasks/SKILL.md +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/doctor.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/install.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/paths.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/state.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/providers/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/providers/anthropic.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/providers/base.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/providers/http_client.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/providers/ollama.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/providers/openai.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/storage/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/storage/threads.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/tasks/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/tasks/scheduler.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/tasks/store.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/tasks/types.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/templates/login_failed.html +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/templates/login_success.html +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/templates/serve/launchd.plist.tmpl +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/templates/serve/serve.toml.example +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/templates/serve/systemd.service.tmpl +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/templates/styles.css +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/tools/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/tools/manager/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/tools/manager/_request_ctx.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/tools/manager/base.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/tools/manager/composite.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/tools/manager/config.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/tools/manager/mcp.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/tools/search/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/tools/search/discovered.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/tools/search/scoring.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/tools/search/service.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/ui/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/ui/completion.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/ui/display.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/ui/elicitation.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/ui/input.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/ui/session.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/ui/slash.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/voice/__init__.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/voice/audio.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/voice/cleanup.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/voice/session.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/voice/stt.py +0 -0
- {cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/voice/tts.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cade-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.18.0
|
|
4
4
|
Summary: Cade - The CLI Agent from Arcade.dev (install: curl -fsSL https://arcadeagent.dev/install | sh)
|
|
5
5
|
Project-URL: Homepage, https://arcade.dev
|
|
6
6
|
Project-URL: Documentation, https://arcadeagent.dev/docs
|
|
@@ -104,7 +104,7 @@ toolchain. First `cade` walks you through model setup, Arcade login, and
|
|
|
104
104
|
Arcade cloud tools. Re-run the same curl to upgrade.
|
|
105
105
|
|
|
106
106
|
New here? The [Quickstart](docs/quickstart.md) is the shortest path to a
|
|
107
|
-
working session; [
|
|
107
|
+
working session; [Connect Cade to your AI app](docs/use-in-cursor.md) is the same thing
|
|
108
108
|
without a terminal. Everything else is in [docs/](docs/index.md).
|
|
109
109
|
|
|
110
110
|
---
|
|
@@ -13,7 +13,7 @@ toolchain. First `cade` walks you through model setup, Arcade login, and
|
|
|
13
13
|
Arcade cloud tools. Re-run the same curl to upgrade.
|
|
14
14
|
|
|
15
15
|
New here? The [Quickstart](docs/quickstart.md) is the shortest path to a
|
|
16
|
-
working session; [
|
|
16
|
+
working session; [Connect Cade to your AI app](docs/use-in-cursor.md) is the same thing
|
|
17
17
|
without a terminal. Everything else is in [docs/](docs/index.md).
|
|
18
18
|
|
|
19
19
|
---
|
|
@@ -6,7 +6,6 @@ One process serves every agent to MCP hosts and messaging adapters.
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
8
|
import asyncio
|
|
9
|
-
import json
|
|
10
9
|
import os
|
|
11
10
|
import signal
|
|
12
11
|
import sys
|
|
@@ -110,7 +109,7 @@ def start(
|
|
|
110
109
|
typer.Option(
|
|
111
110
|
"--auth/--no-auth",
|
|
112
111
|
help=(
|
|
113
|
-
"Require bearer tokens. Default: off on loopback (
|
|
112
|
+
"Require bearer tokens. Default: off on loopback (local MCP hosts / "
|
|
114
113
|
"CLI attach), on for non-loopback binds. --no-auth is refused off-loopback."
|
|
115
114
|
),
|
|
116
115
|
),
|
|
@@ -175,7 +174,15 @@ def status(
|
|
|
175
174
|
if prewarm:
|
|
176
175
|
console.print(f" prewarmed agents: {', '.join(prewarm)}")
|
|
177
176
|
else:
|
|
178
|
-
|
|
177
|
+
# Someone checking status is usually here because an MCP host could not
|
|
178
|
+
# reach Cade, and hosts cannot start it — so name the fix that keeps it
|
|
179
|
+
# up rather than `start`, which only holds the current terminal. With a
|
|
180
|
+
# unit already installed, `start` would also spawn a second daemon
|
|
181
|
+
# outside the service manager; restart drives the unit instead.
|
|
182
|
+
from cadecoder.daemon.install import service_install_hint, service_installed
|
|
183
|
+
|
|
184
|
+
fix = "cade daemon restart" if service_installed() else service_install_hint()
|
|
185
|
+
console.print(f"[dim]○ cade daemon NOT RUNNING[/dim] (start: {fix})")
|
|
179
186
|
|
|
180
187
|
store = TokenStore()
|
|
181
188
|
try:
|
|
@@ -354,17 +361,18 @@ def init(
|
|
|
354
361
|
|
|
355
362
|
def _host_config_json() -> str:
|
|
356
363
|
"""Return the MCP-host JSON snippet for a manually configured host."""
|
|
357
|
-
from cadecoder.cli.mcp_hosts import
|
|
364
|
+
from cadecoder.cli.mcp_hosts import client_recipe
|
|
358
365
|
|
|
359
|
-
return
|
|
366
|
+
return client_recipe("generic").to_json()
|
|
360
367
|
|
|
361
368
|
|
|
362
369
|
def _report_mcp_hosts(*, print_config: bool) -> None:
|
|
363
370
|
"""Tell the user how their MCP hosts get configured.
|
|
364
371
|
|
|
365
|
-
Autodetection handles Cursor, Claude Desktop, Claude Code, OpenCode,
|
|
366
|
-
Windsurf, so the JSON snippet is a fallback for hosts we
|
|
367
|
-
for anyone who explicitly asked for it), not the headline
|
|
372
|
+
Autodetection handles Cursor, Claude Desktop, Claude Code, OpenCode,
|
|
373
|
+
Windsurf, and VS Code, so the JSON snippet is a fallback for hosts we
|
|
374
|
+
cannot find (or for anyone who explicitly asked for it), not the headline
|
|
375
|
+
instruction. ``cade mcp config <app>`` gives per-app variants.
|
|
368
376
|
|
|
369
377
|
Args:
|
|
370
378
|
print_config: Force the raw JSON snippet to be shown.
|
|
@@ -396,7 +404,7 @@ def _report_mcp_hosts(*, print_config: bool) -> None:
|
|
|
396
404
|
else:
|
|
397
405
|
console.print(
|
|
398
406
|
"\n[yellow]No MCP hosts detected[/yellow] "
|
|
399
|
-
"(looked for Cursor, Claude Desktop, Claude Code, OpenCode, Windsurf)."
|
|
407
|
+
"(looked for Cursor, Claude Desktop, Claude Code, OpenCode, Windsurf, VS Code)."
|
|
400
408
|
)
|
|
401
409
|
console.print(
|
|
402
410
|
"Install one and run [bold]cade mcp install-hosts[/bold], or add this "
|
|
@@ -694,9 +694,10 @@ def install_hosts_cmd(
|
|
|
694
694
|
) -> None:
|
|
695
695
|
"""Register Cade as an MCP server and install the host plugin.
|
|
696
696
|
|
|
697
|
-
Points Cursor, Claude Code, OpenCode, and
|
|
698
|
-
endpoint; Claude Desktop gets an ``npx mcp-remote``
|
|
699
|
-
config file only accepts stdio entries.
|
|
697
|
+
Points Cursor, Claude Code, OpenCode, Windsurf, and VS Code (Copilot) at
|
|
698
|
+
the daemon's HTTP endpoint; Claude Desktop gets an ``npx mcp-remote``
|
|
699
|
+
bridge because its config file only accepts stdio entries. For an app that
|
|
700
|
+
is not detected, ``cade mcp config <app>`` prints what to paste. Also materializes a
|
|
700
701
|
marketplace-shaped plugin at ``~/.cade/host-plugin`` and
|
|
701
702
|
``~/.cursor/plugins/local/cade`` (plus Claude Code user skills).
|
|
702
703
|
|
|
@@ -721,12 +722,12 @@ def install_hosts_cmd(
|
|
|
721
722
|
if not updates and all(u.status == "skipped" for u in plugin_updates):
|
|
722
723
|
console.print(
|
|
723
724
|
"[dim]No MCP hosts detected (looked for Cursor, Claude Desktop, "
|
|
724
|
-
"Claude Code, OpenCode, Windsurf).[/dim]"
|
|
725
|
+
"Claude Code, OpenCode, Windsurf, VS Code).[/dim]"
|
|
725
726
|
)
|
|
726
727
|
console.print(
|
|
727
728
|
"[dim]After installing a host, re-run [bold]cade mcp install-hosts[/bold] — "
|
|
728
|
-
"it writes each host's config for you. For
|
|
729
|
-
"[bold]cade
|
|
729
|
+
"it writes each host's config for you. For an app Cade cannot detect "
|
|
730
|
+
"(Cowork, for one), [bold]cade mcp config <app>[/bold] prints what to paste.[/dim]"
|
|
730
731
|
)
|
|
731
732
|
return
|
|
732
733
|
|
|
@@ -768,11 +769,48 @@ def install_hosts_cmd(
|
|
|
768
769
|
console.print(" 2. Reload Cursor/Claude (quit and reopen, or Developer: Reload Window)")
|
|
769
770
|
console.print(" 3. In chat: [bold]Ask Cade to say hello[/bold]")
|
|
770
771
|
console.print(" 4. Check: [bold]cade doctor[/bold]")
|
|
771
|
-
console.print("[dim]Guide: docs
|
|
772
|
+
console.print("[dim]Guide: https://arcadeagent.dev/docs/use-in-cursor/[/dim]")
|
|
772
773
|
else:
|
|
773
774
|
console.print(f"\n[dim]Dry run — {changed} change(s) would apply.[/dim]")
|
|
774
775
|
|
|
775
776
|
|
|
777
|
+
@mcp_app.command("config", rich_help_panel=PANEL_HOSTS)
|
|
778
|
+
def config_cmd(
|
|
779
|
+
client: Annotated[
|
|
780
|
+
str,
|
|
781
|
+
typer.Argument(
|
|
782
|
+
help="Which app: generic, cowork, vscode (or copilot), claude-desktop.",
|
|
783
|
+
),
|
|
784
|
+
] = "generic",
|
|
785
|
+
) -> None:
|
|
786
|
+
"""Print the config to paste into an AI app Cade cannot set up itself.
|
|
787
|
+
|
|
788
|
+
`cade mcp install-hosts` handles Cursor, Claude Code, Claude Desktop,
|
|
789
|
+
OpenCode, Windsurf, and VS Code. Use this for anything else — Cowork, whose
|
|
790
|
+
config is per-project, or an app that was not detected.
|
|
791
|
+
"""
|
|
792
|
+
from cadecoder.cli.mcp_hosts import CLIENT_NAMES, client_recipe
|
|
793
|
+
from cadecoder.daemon.services import gateway_endpoint, read_gateway_manifest
|
|
794
|
+
|
|
795
|
+
try:
|
|
796
|
+
recipe = client_recipe(client, endpoint=gateway_endpoint())
|
|
797
|
+
except KeyError:
|
|
798
|
+
fail(f"Unknown app '{client}'. Try one of: {', '.join(CLIENT_NAMES)}")
|
|
799
|
+
return
|
|
800
|
+
|
|
801
|
+
console.print(f"[bold]{recipe.label}[/bold] [dim]— add to {recipe.where}[/dim]\n")
|
|
802
|
+
console.print(recipe.to_json())
|
|
803
|
+
if recipe.note:
|
|
804
|
+
console.print(f"\n[dim]{recipe.note}[/dim]")
|
|
805
|
+
# The URL above is only reachable if something is serving it, and no app
|
|
806
|
+
# starts Cade on its own — so a snippet without a daemon is a dead end.
|
|
807
|
+
if read_gateway_manifest() is None:
|
|
808
|
+
from cadecoder.daemon.install import service_install_hint, service_installed
|
|
809
|
+
|
|
810
|
+
fix = "cade daemon restart" if service_installed() else service_install_hint()
|
|
811
|
+
console.print(f"\n[yellow]Cade is not running[/yellow] [dim]— start it with: {fix}[/dim]")
|
|
812
|
+
|
|
813
|
+
|
|
776
814
|
@mcp_app.command("token-info", rich_help_panel=PANEL_HOSTS)
|
|
777
815
|
def token_info(
|
|
778
816
|
name: Annotated[str, typer.Argument(help="Name of the server")],
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Register Cade as an MCP server in detected AI host apps.
|
|
2
2
|
|
|
3
3
|
Scans typical home-directory config locations for Claude Desktop, Cursor,
|
|
4
|
-
Claude Code, OpenCode, and
|
|
4
|
+
Claude Code, OpenCode, Windsurf, and VS Code (Copilot). When a host's config dir (or file)
|
|
5
5
|
already exists, merges a ``cade`` entry pointing at the daemon's Streamable
|
|
6
6
|
HTTP endpoint, so no per-host process is involved.
|
|
7
7
|
|
|
@@ -45,6 +45,7 @@ class HostKind(str, Enum):
|
|
|
45
45
|
CLAUDE_DESKTOP = "claudeDesktop" # mcpServers, but stdio-only — needs a bridge
|
|
46
46
|
OPENCODE = "opencode" # OpenCode ``mcp`` map with type/url
|
|
47
47
|
WINDSURF = "windsurf" # Windsurf mcp_config.json
|
|
48
|
+
VSCODE = "vscode" # VS Code / Copilot — root key ``servers``, explicit ``type``
|
|
48
49
|
|
|
49
50
|
|
|
50
51
|
@dataclass(frozen=True)
|
|
@@ -139,6 +140,100 @@ def opencode_entry(*, endpoint: str | None = None) -> dict[str, Any]:
|
|
|
139
140
|
}
|
|
140
141
|
|
|
141
142
|
|
|
143
|
+
def vscode_entry(*, endpoint: str | None = None) -> dict[str, Any]:
|
|
144
|
+
"""VS Code / Copilot ``servers.<name>`` entry.
|
|
145
|
+
|
|
146
|
+
Unlike every other host here, VS Code will not infer the transport: a block
|
|
147
|
+
without an explicit ``type`` is invalid and Copilot drops it with only a
|
|
148
|
+
line in an output channel, so the tool silently never appears.
|
|
149
|
+
"""
|
|
150
|
+
return {"type": "http", "url": endpoint or gateway_endpoint()}
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
@dataclass(frozen=True)
|
|
154
|
+
class ClientRecipe:
|
|
155
|
+
"""A paste-ready MCP config for a client Cade cannot configure itself."""
|
|
156
|
+
|
|
157
|
+
label: str
|
|
158
|
+
config: dict[str, Any]
|
|
159
|
+
where: str
|
|
160
|
+
note: str = ""
|
|
161
|
+
|
|
162
|
+
def to_json(self) -> str:
|
|
163
|
+
"""The snippet, formatted the way it should appear in the file."""
|
|
164
|
+
return json.dumps(self.config, indent=2)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def client_recipe(client: str, *, endpoint: str | None = None) -> ClientRecipe:
|
|
168
|
+
"""Config snippet plus where it goes, for one MCP client.
|
|
169
|
+
|
|
170
|
+
Covers the clients that ``install-hosts`` cannot write for itself — either
|
|
171
|
+
because their config is per-project (Cowork) or because the user is pasting
|
|
172
|
+
into an app we do not detect.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
client: One of ``cowork``, ``vscode``/``copilot``, ``claude-desktop``,
|
|
176
|
+
or ``generic``.
|
|
177
|
+
endpoint: Gateway URL to embed. Defaults to the running daemon's.
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
The recipe for that client.
|
|
181
|
+
|
|
182
|
+
Raises:
|
|
183
|
+
KeyError: If ``client`` is not a known name.
|
|
184
|
+
|
|
185
|
+
Example:
|
|
186
|
+
>>> client_recipe("cowork").config["mcpServers"]["cade"]["type"]
|
|
187
|
+
'streamable-http'
|
|
188
|
+
"""
|
|
189
|
+
url = endpoint or gateway_endpoint()
|
|
190
|
+
key = client.strip().lower()
|
|
191
|
+
if key in ("vscode", "copilot", "vs-code"):
|
|
192
|
+
return ClientRecipe(
|
|
193
|
+
label="VS Code / GitHub Copilot",
|
|
194
|
+
config={"servers": {SERVER_KEY: vscode_entry(endpoint=url)}},
|
|
195
|
+
where="Command Palette → 'MCP: Open User Configuration', "
|
|
196
|
+
"or .vscode/mcp.json in your project",
|
|
197
|
+
note="VS Code keys this 'servers', not 'mcpServers', and needs the "
|
|
198
|
+
"explicit 'type'. Copilot must be in Agent mode to use tools.",
|
|
199
|
+
)
|
|
200
|
+
if key == "cowork":
|
|
201
|
+
# Cowork's sandbox reaches tools only over HTTP, which is what the
|
|
202
|
+
# gateway already speaks — so unlike a stdio server it needs no bridge.
|
|
203
|
+
return ClientRecipe(
|
|
204
|
+
label="Claude Cowork",
|
|
205
|
+
config={
|
|
206
|
+
"mcpServers": {
|
|
207
|
+
SERVER_KEY: {"type": "streamable-http", "url": url},
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
where=".mcp.json in your project directory",
|
|
211
|
+
note="Start a new Cowork session afterwards. If it cannot reach "
|
|
212
|
+
"this address, its sandbox is isolated from your machine — bind "
|
|
213
|
+
"Cade to a reachable address with a token instead.",
|
|
214
|
+
)
|
|
215
|
+
if key in ("claude-desktop", "claudedesktop"):
|
|
216
|
+
return ClientRecipe(
|
|
217
|
+
label="Claude Desktop",
|
|
218
|
+
config={"mcpServers": {SERVER_KEY: mcp_remote_entry(endpoint=url)}},
|
|
219
|
+
where="claude_desktop_config.json",
|
|
220
|
+
note="Claude Desktop accepts stdio entries only, so this goes "
|
|
221
|
+
"through a bridge and needs Node.js 18+. 'cade mcp install-hosts' "
|
|
222
|
+
"writes it for you.",
|
|
223
|
+
)
|
|
224
|
+
if key == "generic":
|
|
225
|
+
return ClientRecipe(
|
|
226
|
+
label="Most MCP clients",
|
|
227
|
+
config={"mcpServers": {SERVER_KEY: {"type": "http", "url": url}}},
|
|
228
|
+
where="your app's MCP config file",
|
|
229
|
+
note="Restart the app afterwards — most read their config only at startup.",
|
|
230
|
+
)
|
|
231
|
+
raise KeyError(client)
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
CLIENT_NAMES = ("generic", "cowork", "vscode", "claude-desktop")
|
|
235
|
+
|
|
236
|
+
|
|
142
237
|
def discover_hosts(home: Path | None = None) -> list[HostTarget]:
|
|
143
238
|
"""Return host configs that look installed (marker path exists)."""
|
|
144
239
|
home = home or Path.home()
|
|
@@ -223,6 +318,25 @@ def discover_hosts(home: Path | None = None) -> list[HostTarget]:
|
|
|
223
318
|
)
|
|
224
319
|
)
|
|
225
320
|
|
|
321
|
+
# VS Code (GitHub Copilot). User-profile config, so it applies to every
|
|
322
|
+
# workspace; the per-workspace `.vscode/mcp.json` is the user's to manage.
|
|
323
|
+
for label, folder in (("VS Code", "Code"), ("VS Code Insiders", "Code - Insiders")):
|
|
324
|
+
if system == "Darwin":
|
|
325
|
+
user_dir = home / "Library" / "Application Support" / folder / "User"
|
|
326
|
+
elif system == "Windows":
|
|
327
|
+
appdata = os.environ.get("APPDATA", str(home / "AppData" / "Roaming"))
|
|
328
|
+
user_dir = Path(appdata) / folder / "User"
|
|
329
|
+
else:
|
|
330
|
+
user_dir = home / ".config" / folder / "User"
|
|
331
|
+
targets.append(
|
|
332
|
+
HostTarget(
|
|
333
|
+
name=label,
|
|
334
|
+
path=user_dir / "mcp.json",
|
|
335
|
+
kind=HostKind.VSCODE,
|
|
336
|
+
marker=user_dir,
|
|
337
|
+
)
|
|
338
|
+
)
|
|
339
|
+
|
|
226
340
|
return [t for t in targets if t.marker.exists()]
|
|
227
341
|
|
|
228
342
|
|
|
@@ -322,6 +436,27 @@ def _merge_opencode(
|
|
|
322
436
|
return data, "added" if existing is None else "updated"
|
|
323
437
|
|
|
324
438
|
|
|
439
|
+
def _merge_vscode(
|
|
440
|
+
data: dict[str, Any],
|
|
441
|
+
entry: dict[str, Any],
|
|
442
|
+
*,
|
|
443
|
+
force: bool,
|
|
444
|
+
) -> tuple[dict[str, Any], str]:
|
|
445
|
+
"""Merge into VS Code's ``servers`` map (not ``mcpServers``)."""
|
|
446
|
+
del force # same reasoning as _merge_mcp_servers: always take the new entry
|
|
447
|
+
servers = data.get("servers")
|
|
448
|
+
if servers is None:
|
|
449
|
+
servers = {}
|
|
450
|
+
data["servers"] = servers
|
|
451
|
+
if not isinstance(servers, dict):
|
|
452
|
+
raise ValueError("servers must be an object")
|
|
453
|
+
existing = servers.get(SERVER_KEY)
|
|
454
|
+
if existing == entry:
|
|
455
|
+
return data, "unchanged"
|
|
456
|
+
servers[SERVER_KEY] = entry
|
|
457
|
+
return data, "added" if existing is None else "updated"
|
|
458
|
+
|
|
459
|
+
|
|
325
460
|
def _merge_windsurf(
|
|
326
461
|
data: dict[str, Any],
|
|
327
462
|
entry: dict[str, Any],
|
|
@@ -346,6 +481,9 @@ def register_host(
|
|
|
346
481
|
if target.kind == HostKind.OPENCODE:
|
|
347
482
|
entry = opencode_entry(endpoint=url)
|
|
348
483
|
data, status = _merge_opencode(data, entry, force=force)
|
|
484
|
+
elif target.kind == HostKind.VSCODE:
|
|
485
|
+
entry = vscode_entry(endpoint=url)
|
|
486
|
+
data, status = _merge_vscode(data, entry, force=force)
|
|
349
487
|
elif target.kind == HostKind.CLAUDE_DESKTOP:
|
|
350
488
|
entry = mcp_remote_entry(endpoint=url)
|
|
351
489
|
data, status = _merge_mcp_servers(data, entry, force=force)
|
|
@@ -395,4 +533,5 @@ __all__ = [
|
|
|
395
533
|
"mcp_remote_entry",
|
|
396
534
|
"opencode_entry",
|
|
397
535
|
"register_host",
|
|
536
|
+
"vscode_entry",
|
|
398
537
|
]
|
|
@@ -337,7 +337,7 @@ def finish_first_run_cloud(console: Console, *, prefer_skip_login: bool = False)
|
|
|
337
337
|
console.print(
|
|
338
338
|
f"\n[yellow]Could not update:[/yellow] {names}\n"
|
|
339
339
|
"[dim]Retry with [bold]cade mcp install-hosts --force[/bold], or see the "
|
|
340
|
-
"config to add by hand with [bold]cade
|
|
340
|
+
"config to add by hand with [bold]cade mcp config <app>[/bold].[/dim]"
|
|
341
341
|
)
|
|
342
342
|
if plugin_touched:
|
|
343
343
|
migrated_n = sum(1 for u in plugin_touched if u.status == "migrated")
|
|
@@ -46,7 +46,7 @@ def resolve_require_auth(*, bind: str, auth: bool | None) -> bool:
|
|
|
46
46
|
"""Decide whether the gateway should require bearer tokens.
|
|
47
47
|
|
|
48
48
|
When ``auth`` is ``None`` (CLI default), loopback binds run unauthenticated
|
|
49
|
-
so
|
|
49
|
+
so local MCP hosts and CLI attach work without a token; non-loopback binds
|
|
50
50
|
require auth. Explicit ``--auth`` / ``--no-auth`` always win (subject to
|
|
51
51
|
:func:`_guard_auth_bind`).
|
|
52
52
|
"""
|
{cade_cli-0.17.0 → cade_cli-0.18.0}/src/cadecoder/host_plugin/assets/.cursor-plugin/plugin.json
RENAMED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "cade",
|
|
3
3
|
"displayName": "Cade",
|
|
4
4
|
"description": "Your persistent on-device agent: notes memory, durable tasks, and connected tools via Ask.",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.18.0",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Arcade.dev",
|
|
8
8
|
"email": "support@arcade.dev"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|