cade-cli 0.16.1__tar.gz → 0.16.3__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.16.1 → cade_cli-0.16.3}/PKG-INFO +4 -4
- {cade_cli-0.16.1 → cade_cli-0.16.3}/README.md +3 -3
- {cade_cli-0.16.1 → cade_cli-0.16.3}/pyproject.toml +1 -1
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/app.py +18 -12
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/auth.py +6 -6
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/mcp.py +115 -19
- cade_cli-0.16.3/src/cadecoder/cli/mcp_hosts.py +351 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/onboarding.py +189 -15
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/manager/__init__.py +4 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/manager/config.py +32 -12
- {cade_cli-0.16.1 → cade_cli-0.16.3}/.gitignore +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/LICENSE +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/__main__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/_metadata.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/config.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/errors.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/grants.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/resources.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/sandbox.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/server.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/_read_cache.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/access.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/agents.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/context.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/filesystem.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/git.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/notifications.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/questions.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/results.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/schemas.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/search.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/shell.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/snippets.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/tasks.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/web_fetch.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/web_search.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/utils.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/arcade_client.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/cache.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/extract.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/markdown.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/preapproved.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/prompts.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/scrape.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/search/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/search/arcade.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/search/base.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/search/http.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ai/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ai/prompts.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/auth.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/account.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/agents.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/chat.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/cron.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/daemon.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/grant.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/hooks.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/mem.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/tasks.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/thread.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/tools.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/agent.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/comms.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/config.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/constants.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/errors.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/frozen.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/git.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/inbox.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/logging.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/memory.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/model_specs.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/names.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/paths.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/runtime.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/secrets.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/spawn.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/types.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/adapters/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/adapters/base.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/adapters/factory.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/adapters/imessage.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/adapters/registry.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/adapters/stub.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/adapters/telegram.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/allowlist.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/attach.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/chunker.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/client.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/commands.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/config.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/control.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/cron.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/elicitation.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/ensure.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/format.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/app.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/arcade_export.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/auth.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/constants.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/elicitation.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/exposure.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/limits.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/middleware.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/resources.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/subscriptions.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/turn_bridge.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/grants.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/inbox_cron.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/install.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/live.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/lock.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/mesh.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/message_pump.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/observability.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/owner.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/progress_sink.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/registry.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/router.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/runner.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/runner_main.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/secrets.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/secrets_broker.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/server.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/services.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/shim.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/sinks.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/supervisor.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/tokens.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/traffic.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/turns.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/wake.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/execution/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/execution/context_window.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/execution/mcp_schema_index.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/execution/orchestrator.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/execution/parallel.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/execution/tool_result_store.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/execution/tool_schema_cache.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/config.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/engine.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/executors/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/executors/callback.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/executors/command.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/executors/http.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/executors/prompt.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/executors/ssrf_guard.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/matchers.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/registry.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/types.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/providers/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/providers/anthropic.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/providers/base.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/providers/ollama.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/providers/openai.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/serve/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/storage/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/storage/threads.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tasks/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tasks/scheduler.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tasks/store.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tasks/types.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/templates/login_failed.html +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/templates/login_success.html +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/templates/serve/launchd.plist.tmpl +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/templates/serve/serve.toml.example +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/templates/serve/systemd.service.tmpl +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/templates/styles.css +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/manager/_request_ctx.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/manager/base.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/manager/composite.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/manager/mcp.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/search/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/search/discovered.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/search/scoring.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/search/service.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ui/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ui/completion.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ui/display.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ui/elicitation.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ui/input.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ui/session.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ui/slash.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/voice/__init__.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/voice/audio.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/voice/cleanup.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/voice/session.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/voice/stt.py +0 -0
- {cade_cli-0.16.1 → cade_cli-0.16.3}/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.16.
|
|
3
|
+
Version: 0.16.3
|
|
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
|
|
@@ -95,13 +95,13 @@ The CLI agent from [Arcade.dev](https://arcade.dev). Coding, research, and every
|
|
|
95
95
|
|
|
96
96
|
```bash
|
|
97
97
|
curl -fsSL https://arcadeagent.dev/install | sh
|
|
98
|
-
cade login
|
|
99
98
|
cade
|
|
100
99
|
```
|
|
101
100
|
|
|
102
101
|
That is the **recommended install** — a prebuilt binary from
|
|
103
102
|
[arcadeagent.dev](https://arcadeagent.dev/install). No GitHub token, no Python
|
|
104
|
-
toolchain.
|
|
103
|
+
toolchain. First `cade` walks you through model setup, Arcade login, and the
|
|
104
|
+
[Arcade Agent Hub](https://hub.arcade.dev). Re-run the same curl to upgrade.
|
|
105
105
|
|
|
106
106
|
---
|
|
107
107
|
|
|
@@ -129,7 +129,7 @@ The script detects your OS/arch, downloads the matching prebuilt binary
|
|
|
129
129
|
`~/.local/bin`. Pin a version or install location:
|
|
130
130
|
|
|
131
131
|
```bash
|
|
132
|
-
CADE_VERSION=0.16.
|
|
132
|
+
CADE_VERSION=0.16.3 CADE_INSTALL_DIR=/usr/local/bin \
|
|
133
133
|
sh -c "$(curl -fsSL https://arcadeagent.dev/install)"
|
|
134
134
|
```
|
|
135
135
|
|
|
@@ -4,13 +4,13 @@ The CLI agent from [Arcade.dev](https://arcade.dev). Coding, research, and every
|
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
6
|
curl -fsSL https://arcadeagent.dev/install | sh
|
|
7
|
-
cade login
|
|
8
7
|
cade
|
|
9
8
|
```
|
|
10
9
|
|
|
11
10
|
That is the **recommended install** — a prebuilt binary from
|
|
12
11
|
[arcadeagent.dev](https://arcadeagent.dev/install). No GitHub token, no Python
|
|
13
|
-
toolchain.
|
|
12
|
+
toolchain. First `cade` walks you through model setup, Arcade login, and the
|
|
13
|
+
[Arcade Agent Hub](https://hub.arcade.dev). Re-run the same curl to upgrade.
|
|
14
14
|
|
|
15
15
|
---
|
|
16
16
|
|
|
@@ -38,7 +38,7 @@ The script detects your OS/arch, downloads the matching prebuilt binary
|
|
|
38
38
|
`~/.local/bin`. Pin a version or install location:
|
|
39
39
|
|
|
40
40
|
```bash
|
|
41
|
-
CADE_VERSION=0.16.
|
|
41
|
+
CADE_VERSION=0.16.3 CADE_INSTALL_DIR=/usr/local/bin \
|
|
42
42
|
sh -c "$(curl -fsSL https://arcadeagent.dev/install)"
|
|
43
43
|
```
|
|
44
44
|
|
|
@@ -304,7 +304,7 @@ def _doctor_paths(runtime: Any) -> dict[str, Any]:
|
|
|
304
304
|
rich_help_panel=PANEL_SETUP,
|
|
305
305
|
)
|
|
306
306
|
def init_cmd() -> None:
|
|
307
|
-
from cadecoder.cli.onboarding import can_prompt, run_onboarding
|
|
307
|
+
from cadecoder.cli.onboarding import can_prompt, finish_first_run_cloud, run_onboarding
|
|
308
308
|
|
|
309
309
|
if not can_prompt():
|
|
310
310
|
console.print(
|
|
@@ -312,7 +312,11 @@ def init_cmd() -> None:
|
|
|
312
312
|
"Set OPENAI_API_KEY or ANTHROPIC_API_KEY instead."
|
|
313
313
|
)
|
|
314
314
|
raise typer.Exit(1)
|
|
315
|
-
run_onboarding(console, force=True)
|
|
315
|
+
result = run_onboarding(console, force=True)
|
|
316
|
+
if result:
|
|
317
|
+
runtime = build_runtime()
|
|
318
|
+
set_runtime(runtime)
|
|
319
|
+
finish_first_run_cloud(console, prefer_skip_login=result.chose_local)
|
|
316
320
|
|
|
317
321
|
|
|
318
322
|
@app.command(
|
|
@@ -484,11 +488,16 @@ def main_callback(
|
|
|
484
488
|
# provider + model before we build the runtime, so the first session uses
|
|
485
489
|
# what they chose (not the hardcoded default). No-ops when already set up or
|
|
486
490
|
# when not attached to an interactive terminal (piped/CI).
|
|
487
|
-
from cadecoder.cli.onboarding import
|
|
488
|
-
|
|
489
|
-
|
|
491
|
+
from cadecoder.cli.onboarding import (
|
|
492
|
+
finish_first_run_cloud,
|
|
493
|
+
needs_onboarding,
|
|
494
|
+
run_onboarding,
|
|
495
|
+
)
|
|
496
|
+
from cadecoder.cli.onboarding import OnboardingResult
|
|
497
|
+
|
|
498
|
+
onboard_result = OnboardingResult()
|
|
490
499
|
if needs_onboarding():
|
|
491
|
-
|
|
500
|
+
onboard_result = run_onboarding(console)
|
|
492
501
|
|
|
493
502
|
# Interaction + runtime-backed commands run as the current agent, auto-creating
|
|
494
503
|
# a `default` agent on first run via build_runtime → ensure_current_agent.
|
|
@@ -496,13 +505,10 @@ def main_callback(
|
|
|
496
505
|
set_runtime(runtime)
|
|
497
506
|
ctx.obj["runtime"] = runtime
|
|
498
507
|
|
|
499
|
-
#
|
|
500
|
-
|
|
501
|
-
if did_onboard:
|
|
508
|
+
# After runtime is up: Arcade login (if needed) + Arcade Agent Hub connect.
|
|
509
|
+
if onboard_result:
|
|
502
510
|
try:
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
offer_connect_omni(console)
|
|
511
|
+
finish_first_run_cloud(console, prefer_skip_login=onboard_result.chose_local)
|
|
506
512
|
except Exception: # noqa: BLE001
|
|
507
513
|
pass
|
|
508
514
|
|
|
@@ -86,15 +86,15 @@ def login(
|
|
|
86
86
|
|
|
87
87
|
log.info(f"User {whoami.email} logged in via OAuth.")
|
|
88
88
|
|
|
89
|
-
# Offer to connect Arcade
|
|
90
|
-
# (Gmail, Slack, web search, …) without a separate API key.
|
|
91
|
-
# non-interactive or already authorized.
|
|
89
|
+
# Offer to connect the Arcade Agent Hub so the agent can use external
|
|
90
|
+
# tools (Gmail, Slack, web search, …) without a separate API key.
|
|
91
|
+
# No-op when non-interactive or already authorized.
|
|
92
92
|
try:
|
|
93
|
-
from cadecoder.cli.commands.mcp import
|
|
93
|
+
from cadecoder.cli.commands.mcp import offer_connect_hub
|
|
94
94
|
|
|
95
|
-
|
|
95
|
+
offer_connect_hub(console)
|
|
96
96
|
except Exception as e: # noqa: BLE001
|
|
97
|
-
log.debug(f"
|
|
97
|
+
log.debug(f"hub connect offer skipped: {e}")
|
|
98
98
|
|
|
99
99
|
except OAuthLoginError as e:
|
|
100
100
|
console.print(f"\n[red]✗ Login failed:[/red] {escape(str(e))}")
|
|
@@ -372,22 +372,26 @@ def run_mcp_authorization(
|
|
|
372
372
|
"""Run the MCP OAuth authorization flow for a server. Returns success.
|
|
373
373
|
|
|
374
374
|
If ``name`` isn't configured yet but is a built-in known server (e.g.
|
|
375
|
-
``
|
|
375
|
+
``hub``), it's added in a disabled state first and only enabled once
|
|
376
376
|
authorization succeeds — so a cancelled/failed flow never leaves a broken
|
|
377
|
-
server that would error during chat.
|
|
377
|
+
server that would error during chat. The legacy name ``omni`` resolves to
|
|
378
|
+
the Arcade Agent Hub.
|
|
378
379
|
"""
|
|
379
380
|
global _oauth_result
|
|
380
381
|
_oauth_result = {"code": None, "error": None}
|
|
381
382
|
|
|
382
383
|
store = MCPServerStore()
|
|
383
|
-
|
|
384
|
+
# Resolve aliases (omni → hub) before looking up a stored config.
|
|
385
|
+
known = known_server_config(name)
|
|
386
|
+
lookup_name = known.name if known is not None else name
|
|
387
|
+
server = store.get(lookup_name) or store.get(name)
|
|
384
388
|
if server is None:
|
|
385
|
-
server =
|
|
389
|
+
server = known
|
|
386
390
|
if server is None:
|
|
387
391
|
console.print(f"[red]Server '{name}' not found.[/red]")
|
|
388
392
|
console.print(
|
|
389
393
|
"[dim]Add it with 'cade mcp add <name> <url>', "
|
|
390
|
-
"or authorize a known server like '
|
|
394
|
+
"or authorize a known server like 'hub'.[/dim]"
|
|
391
395
|
)
|
|
392
396
|
return False
|
|
393
397
|
store.add(server) # persisted disabled; enabled on success
|
|
@@ -515,16 +519,17 @@ def run_mcp_authorization(
|
|
|
515
519
|
return asyncio.run(run_oauth_flow())
|
|
516
520
|
|
|
517
521
|
|
|
518
|
-
def
|
|
519
|
-
"""Offer to connect Arcade
|
|
522
|
+
def offer_connect_hub(target_console: Console | None = None) -> None:
|
|
523
|
+
"""Offer to connect the Arcade Agent Hub if not already authorized.
|
|
520
524
|
|
|
521
525
|
Called after ``cade login`` and after first-run onboarding. No-op when the
|
|
522
|
-
terminal isn't interactive or when
|
|
523
|
-
blocks scripted/CI use.
|
|
526
|
+
terminal isn't interactive or when the Hub is already authorized, so it
|
|
527
|
+
never blocks scripted/CI use.
|
|
524
528
|
"""
|
|
525
529
|
con = target_console or console
|
|
526
530
|
|
|
527
|
-
from cadecoder.cli.onboarding import can_prompt
|
|
531
|
+
from cadecoder.cli.onboarding import can_prompt, is_arcade_logged_in, offer_arcade_login
|
|
532
|
+
from cadecoder.tools.manager.config import HUB_SERVER_NAME
|
|
528
533
|
|
|
529
534
|
if not can_prompt():
|
|
530
535
|
return
|
|
@@ -534,30 +539,57 @@ def offer_connect_omni(target_console: Console | None = None) -> None:
|
|
|
534
539
|
except Exception: # noqa: BLE001
|
|
535
540
|
return
|
|
536
541
|
|
|
537
|
-
existing = store.get("omni")
|
|
542
|
+
existing = store.get(HUB_SERVER_NAME) or store.get("omni")
|
|
538
543
|
if existing is not None and existing.oauth_tokens is not None:
|
|
539
544
|
return # already connected
|
|
540
545
|
|
|
546
|
+
if not is_arcade_logged_in():
|
|
547
|
+
con.print()
|
|
548
|
+
con.print(
|
|
549
|
+
"[bold]Arcade login required[/bold] before connecting the "
|
|
550
|
+
"[cyan]Arcade Agent Hub[/cyan]."
|
|
551
|
+
)
|
|
552
|
+
if not offer_arcade_login(con, prefer_skip=False):
|
|
553
|
+
con.print(
|
|
554
|
+
"[dim]Skipped. Log in later with [bold]cade login[/bold], then "
|
|
555
|
+
"[bold]cade mcp authorize hub[/bold].[/dim]"
|
|
556
|
+
)
|
|
557
|
+
return
|
|
558
|
+
|
|
541
559
|
from rich.prompt import Confirm
|
|
542
560
|
|
|
543
561
|
con.print()
|
|
544
562
|
con.print(
|
|
545
|
-
"[bold]Connect external tools?[/bold]
|
|
546
|
-
"
|
|
547
|
-
"
|
|
563
|
+
"[bold]Connect external tools?[/bold] The [cyan]Arcade Agent Hub[/cyan] "
|
|
564
|
+
"([link=https://hub.arcade.dev]hub.arcade.dev[/link]) lets Cade use "
|
|
565
|
+
"Gmail, Slack, GitHub, web search and more — authorized with your Arcade "
|
|
566
|
+
"login (no API key needed)."
|
|
548
567
|
)
|
|
549
568
|
try:
|
|
550
|
-
proceed = Confirm.ask(
|
|
569
|
+
proceed = Confirm.ask(
|
|
570
|
+
"Authorize Arcade Agent Hub now? (opens your browser)",
|
|
571
|
+
default=True,
|
|
572
|
+
console=con,
|
|
573
|
+
)
|
|
551
574
|
except (KeyboardInterrupt, EOFError):
|
|
552
575
|
con.print()
|
|
553
576
|
return
|
|
554
577
|
|
|
555
578
|
if not proceed:
|
|
556
|
-
con.print(
|
|
579
|
+
con.print(
|
|
580
|
+
"[dim]Skipped. Connect anytime with [bold]cade mcp authorize hub[/bold].[/dim]"
|
|
581
|
+
)
|
|
557
582
|
return
|
|
558
583
|
|
|
559
|
-
if not run_mcp_authorization(
|
|
560
|
-
con.print(
|
|
584
|
+
if not run_mcp_authorization(HUB_SERVER_NAME):
|
|
585
|
+
con.print(
|
|
586
|
+
"[dim]You can retry later with [bold]cade mcp authorize hub[/bold].[/dim]"
|
|
587
|
+
)
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
def offer_connect_omni(target_console: Console | None = None) -> None:
|
|
591
|
+
"""Deprecated alias for :func:`offer_connect_hub`."""
|
|
592
|
+
offer_connect_hub(target_console)
|
|
561
593
|
|
|
562
594
|
|
|
563
595
|
@mcp_app.command("authorize")
|
|
@@ -579,12 +611,76 @@ def authorize_server(
|
|
|
579
611
|
"""Authorize an MCP server over OAuth (browser flow).
|
|
580
612
|
|
|
581
613
|
Works with any configured server, or a built-in known server by name
|
|
582
|
-
(e.g. ``cade mcp authorize
|
|
614
|
+
(e.g. ``cade mcp authorize hub`` to connect the Arcade Agent Hub).
|
|
583
615
|
"""
|
|
584
616
|
if not run_mcp_authorization(name, client_id=client_id, scope=scope, skip_dcr=skip_dcr):
|
|
585
617
|
raise typer.Exit(1)
|
|
586
618
|
|
|
587
619
|
|
|
620
|
+
@mcp_app.command("install-hosts")
|
|
621
|
+
def install_hosts_cmd(
|
|
622
|
+
agent: Annotated[
|
|
623
|
+
str,
|
|
624
|
+
typer.Option("--agent", "-a", help="Agent the stdio shim targets."),
|
|
625
|
+
] = "default",
|
|
626
|
+
force: Annotated[
|
|
627
|
+
bool,
|
|
628
|
+
typer.Option("--force", "-f", help="Overwrite an existing cade MCP entry."),
|
|
629
|
+
] = False,
|
|
630
|
+
dry_run: Annotated[
|
|
631
|
+
bool,
|
|
632
|
+
typer.Option("--dry-run", help="Show what would change without writing."),
|
|
633
|
+
] = False,
|
|
634
|
+
) -> None:
|
|
635
|
+
"""Register Cade as an MCP server in Claude Desktop, Cursor, Claude Code, etc.
|
|
636
|
+
|
|
637
|
+
Only touches hosts that already look installed (their config dir/file exists
|
|
638
|
+
under your home directory). Safe to re-run — updates the command path after
|
|
639
|
+
upgrades. The curl installer runs this automatically unless
|
|
640
|
+
``CADE_SKIP_MCP_HOSTS=1``.
|
|
641
|
+
"""
|
|
642
|
+
from cadecoder.cli.mcp_hosts import install_into_hosts, resolve_cade_command
|
|
643
|
+
|
|
644
|
+
command = resolve_cade_command()
|
|
645
|
+
updates = install_into_hosts(command=command, agent=agent, force=force, dry_run=dry_run)
|
|
646
|
+
if not updates:
|
|
647
|
+
console.print(
|
|
648
|
+
"[dim]No MCP hosts detected (looked for Cursor, Claude Desktop, "
|
|
649
|
+
"Claude Code, OpenCode, Windsurf).[/dim]"
|
|
650
|
+
)
|
|
651
|
+
console.print(
|
|
652
|
+
"[dim]After installing a host, re-run [bold]cade mcp install-hosts[/bold].[/dim]"
|
|
653
|
+
)
|
|
654
|
+
return
|
|
655
|
+
|
|
656
|
+
console.print(f"[dim]Using binary:[/dim] {command}")
|
|
657
|
+
changed = 0
|
|
658
|
+
for u in updates:
|
|
659
|
+
style = {
|
|
660
|
+
"added": "green",
|
|
661
|
+
"updated": "cyan",
|
|
662
|
+
"unchanged": "dim",
|
|
663
|
+
"would-added": "yellow",
|
|
664
|
+
"would-updated": "yellow",
|
|
665
|
+
"error": "red",
|
|
666
|
+
"skipped": "dim",
|
|
667
|
+
}.get(u.status, "white")
|
|
668
|
+
msg = f"[{style}]{u.status}[/{style}] {u.name} [dim]{u.path}[/dim]"
|
|
669
|
+
if u.detail:
|
|
670
|
+
msg += f" ({u.detail})"
|
|
671
|
+
console.print(msg)
|
|
672
|
+
if u.status in ("added", "updated", "would-added", "would-updated"):
|
|
673
|
+
changed += 1
|
|
674
|
+
|
|
675
|
+
if changed and not dry_run:
|
|
676
|
+
console.print(
|
|
677
|
+
"\n[green]Done.[/green] Restart those apps, then run "
|
|
678
|
+
"[bold]cade daemon start[/bold] (or just [bold]cade[/bold] — it autostarts)."
|
|
679
|
+
)
|
|
680
|
+
elif dry_run:
|
|
681
|
+
console.print(f"\n[dim]Dry run — {changed} host(s) would change.[/dim]")
|
|
682
|
+
|
|
683
|
+
|
|
588
684
|
@mcp_app.command("token-info")
|
|
589
685
|
def token_info(
|
|
590
686
|
name: Annotated[str, typer.Argument(help="Name of the server")],
|