cade-cli 0.16.3__tar.gz → 0.16.4__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.3 → cade_cli-0.16.4}/PKG-INFO +2 -2
- {cade_cli-0.16.3 → cade_cli-0.16.4}/README.md +1 -1
- {cade_cli-0.16.3 → cade_cli-0.16.4}/pyproject.toml +1 -1
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/providers/anthropic.py +20 -2
- cade_cli-0.16.4/src/cadecoder/providers/http_client.py +52 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/providers/openai.py +25 -2
- {cade_cli-0.16.3 → cade_cli-0.16.4}/.gitignore +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/LICENSE +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/__main__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/_metadata.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/config.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/errors.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/grants.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/resources.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/sandbox.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/server.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/_read_cache.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/access.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/agents.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/context.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/filesystem.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/git.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/notifications.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/questions.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/results.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/schemas.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/search.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/shell.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/snippets.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/tasks.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/web_fetch.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/web_search.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/utils.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/arcade_client.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/cache.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/extract.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/markdown.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/preapproved.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/prompts.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/scrape.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/search/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/search/arcade.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/search/base.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/search/http.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ai/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ai/prompts.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/app.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/auth.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/account.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/agents.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/auth.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/chat.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/cron.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/daemon.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/grant.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/hooks.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/mcp.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/mem.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/tasks.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/thread.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/tools.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/mcp_hosts.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/onboarding.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/agent.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/comms.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/config.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/constants.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/errors.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/frozen.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/git.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/inbox.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/logging.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/memory.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/model_specs.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/names.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/paths.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/runtime.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/secrets.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/spawn.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/types.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/adapters/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/adapters/base.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/adapters/factory.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/adapters/imessage.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/adapters/registry.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/adapters/stub.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/adapters/telegram.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/allowlist.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/attach.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/chunker.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/client.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/commands.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/config.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/control.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/cron.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/elicitation.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/ensure.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/format.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/app.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/arcade_export.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/auth.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/constants.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/elicitation.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/exposure.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/limits.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/middleware.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/resources.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/subscriptions.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/turn_bridge.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/grants.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/inbox_cron.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/install.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/live.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/lock.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/mesh.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/message_pump.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/observability.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/owner.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/progress_sink.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/registry.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/router.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/runner.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/runner_main.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/secrets.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/secrets_broker.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/server.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/services.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/shim.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/sinks.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/supervisor.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/tokens.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/traffic.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/turns.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/wake.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/execution/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/execution/context_window.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/execution/mcp_schema_index.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/execution/orchestrator.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/execution/parallel.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/execution/tool_result_store.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/execution/tool_schema_cache.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/config.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/engine.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/executors/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/executors/callback.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/executors/command.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/executors/http.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/executors/prompt.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/executors/ssrf_guard.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/matchers.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/registry.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/types.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/providers/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/providers/base.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/providers/ollama.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/serve/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/storage/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/storage/threads.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tasks/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tasks/scheduler.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tasks/store.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tasks/types.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/templates/login_failed.html +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/templates/login_success.html +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/templates/serve/launchd.plist.tmpl +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/templates/serve/serve.toml.example +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/templates/serve/systemd.service.tmpl +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/templates/styles.css +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/manager/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/manager/_request_ctx.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/manager/base.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/manager/composite.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/manager/config.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/manager/mcp.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/search/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/search/discovered.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/search/scoring.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/search/service.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ui/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ui/completion.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ui/display.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ui/elicitation.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ui/input.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ui/session.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ui/slash.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/voice/__init__.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/voice/audio.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/voice/cleanup.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/voice/session.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/voice/stt.py +0 -0
- {cade_cli-0.16.3 → cade_cli-0.16.4}/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.4
|
|
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
|
|
@@ -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.4 CADE_INSTALL_DIR=/usr/local/bin \
|
|
133
133
|
sh -c "$(curl -fsSL https://arcadeagent.dev/install)"
|
|
134
134
|
```
|
|
135
135
|
|
|
@@ -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.4 CADE_INSTALL_DIR=/usr/local/bin \
|
|
42
42
|
sh -c "$(curl -fsSL https://arcadeagent.dev/install)"
|
|
43
43
|
```
|
|
44
44
|
|
|
@@ -31,6 +31,11 @@ from cadecoder.providers.base import (
|
|
|
31
31
|
StreamEvent,
|
|
32
32
|
stream_with_retry,
|
|
33
33
|
)
|
|
34
|
+
from cadecoder.providers.http_client import (
|
|
35
|
+
is_decompress_error,
|
|
36
|
+
make_async_http_client,
|
|
37
|
+
make_sync_http_client,
|
|
38
|
+
)
|
|
34
39
|
|
|
35
40
|
# HTTP statuses from Anthropic that indicate a transient server-side issue
|
|
36
41
|
# and are safe to retry. 529 is Anthropic's "Overloaded" code; 408/429/5xx
|
|
@@ -87,13 +92,18 @@ class AnthropicProvider(Provider):
|
|
|
87
92
|
if not self.api_key:
|
|
88
93
|
raise ProviderError("Anthropic API key not configured", ProviderType.ANTHROPIC)
|
|
89
94
|
|
|
90
|
-
|
|
95
|
+
# Own the httpx client so we can pin Accept-Encoding (avoids brotli /
|
|
96
|
+
# zlib "incorrect header check" failures in frozen PyInstaller builds).
|
|
97
|
+
self._http_client = make_async_http_client()
|
|
98
|
+
self.client = AsyncAnthropic(api_key=self.api_key, http_client=self._http_client)
|
|
99
|
+
self._sync_http_client = None
|
|
91
100
|
self._sync_client: Anthropic | None = None
|
|
92
101
|
|
|
93
102
|
def _get_sync_client(self) -> Anthropic:
|
|
94
103
|
"""Get or create synchronous client for model fetching."""
|
|
95
104
|
if self._sync_client is None:
|
|
96
|
-
self.
|
|
105
|
+
self._sync_http_client = make_sync_http_client()
|
|
106
|
+
self._sync_client = Anthropic(api_key=self.api_key, http_client=self._sync_http_client)
|
|
97
107
|
return self._sync_client
|
|
98
108
|
|
|
99
109
|
@property
|
|
@@ -220,6 +230,9 @@ class AnthropicProvider(Provider):
|
|
|
220
230
|
return ErrorClass.TRANSIENT
|
|
221
231
|
if isinstance(exc, APIStatusError) and exc.status_code in _RETRIABLE_STATUSES:
|
|
222
232
|
return ErrorClass.TRANSIENT
|
|
233
|
+
# Broken Content-Encoding on SSE streams (seen in frozen builds).
|
|
234
|
+
if is_decompress_error(exc):
|
|
235
|
+
return ErrorClass.TRANSIENT
|
|
223
236
|
return ErrorClass.PERMANENT
|
|
224
237
|
|
|
225
238
|
def format_error_for_user(self, exc: BaseException) -> str:
|
|
@@ -233,6 +246,11 @@ class AnthropicProvider(Provider):
|
|
|
233
246
|
return f"Anthropic service error ({exc.status_code}) — please retry."
|
|
234
247
|
if isinstance(exc, APITimeoutError | APIConnectionError):
|
|
235
248
|
return "Network error talking to Anthropic — please retry."
|
|
249
|
+
if is_decompress_error(exc):
|
|
250
|
+
return (
|
|
251
|
+
"Network/encoding error talking to Anthropic (response decompress failed) — "
|
|
252
|
+
"please retry."
|
|
253
|
+
)
|
|
236
254
|
return str(exc)
|
|
237
255
|
|
|
238
256
|
def stream(self, request: ProviderRequest) -> AsyncIterator[StreamEvent]:
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Shared httpx client helpers for LLM providers.
|
|
2
|
+
|
|
3
|
+
Frozen/PyInstaller builds have hit ``zlib.error: Error -3 while decompressing
|
|
4
|
+
data: incorrect header check`` on Anthropic SSE streams when httpx negotiates
|
|
5
|
+
brotli (``br``) or otherwise mishandles ``Content-Encoding``. Pinning
|
|
6
|
+
``Accept-Encoding`` to gzip/deflate avoids that path while keeping compression.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import httpx
|
|
12
|
+
|
|
13
|
+
# Do not advertise ``br`` / ``zstd`` — those decoders are fragile in frozen
|
|
14
|
+
# binaries and have produced "incorrect header check" failures on streams.
|
|
15
|
+
_SAFE_ACCEPT_ENCODING = "gzip, deflate"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def make_async_http_client(*, timeout: float = 600.0) -> httpx.AsyncClient:
|
|
19
|
+
"""Return an AsyncClient safe for Anthropic/OpenAI streaming in frozen apps."""
|
|
20
|
+
return httpx.AsyncClient(
|
|
21
|
+
headers={"Accept-Encoding": _SAFE_ACCEPT_ENCODING},
|
|
22
|
+
timeout=httpx.Timeout(timeout, connect=10.0),
|
|
23
|
+
follow_redirects=True,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def make_sync_http_client(*, timeout: float = 60.0) -> httpx.Client:
|
|
28
|
+
"""Return a sync Client with the same encoding constraints."""
|
|
29
|
+
return httpx.Client(
|
|
30
|
+
headers={"Accept-Encoding": _SAFE_ACCEPT_ENCODING},
|
|
31
|
+
timeout=httpx.Timeout(timeout, connect=10.0),
|
|
32
|
+
follow_redirects=True,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def is_decompress_error(exc: BaseException) -> bool:
|
|
37
|
+
"""True when ``exc`` looks like a broken Content-Encoding decode."""
|
|
38
|
+
import zlib
|
|
39
|
+
|
|
40
|
+
if isinstance(exc, zlib.error):
|
|
41
|
+
return True
|
|
42
|
+
if isinstance(exc, httpx.DecodingError):
|
|
43
|
+
return True
|
|
44
|
+
msg = str(exc).lower()
|
|
45
|
+
return "incorrect header check" in msg or "while decompressing" in msg
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
__all__ = [
|
|
49
|
+
"is_decompress_error",
|
|
50
|
+
"make_async_http_client",
|
|
51
|
+
"make_sync_http_client",
|
|
52
|
+
]
|
|
@@ -30,6 +30,11 @@ from cadecoder.providers.base import (
|
|
|
30
30
|
StreamEvent,
|
|
31
31
|
stream_with_retry,
|
|
32
32
|
)
|
|
33
|
+
from cadecoder.providers.http_client import (
|
|
34
|
+
is_decompress_error,
|
|
35
|
+
make_async_http_client,
|
|
36
|
+
make_sync_http_client,
|
|
37
|
+
)
|
|
33
38
|
|
|
34
39
|
# Retriable HTTP statuses — 408 timeout, 429 rate limit, 500/502/503/504 5xx,
|
|
35
40
|
# 529 seen occasionally behind OpenAI-compatible proxies (Anthropic's code).
|
|
@@ -57,7 +62,13 @@ class OpenAIProvider(Provider):
|
|
|
57
62
|
if not self.api_key:
|
|
58
63
|
raise ProviderError("OpenAI API key not configured", ProviderType.OPENAI)
|
|
59
64
|
|
|
60
|
-
self.
|
|
65
|
+
self._http_client = make_async_http_client()
|
|
66
|
+
self.client = AsyncOpenAI(
|
|
67
|
+
api_key=self.api_key,
|
|
68
|
+
base_url=self.base_url,
|
|
69
|
+
http_client=self._http_client,
|
|
70
|
+
)
|
|
71
|
+
self._sync_http_client = None
|
|
61
72
|
self._sync_client: OpenAI | None = None
|
|
62
73
|
|
|
63
74
|
# Curated fallback list of OpenAI cloud chat models, used when the live API
|
|
@@ -83,7 +94,12 @@ class OpenAIProvider(Provider):
|
|
|
83
94
|
def _get_sync_client(self) -> OpenAI:
|
|
84
95
|
"""Get or create a synchronous client for model listing."""
|
|
85
96
|
if self._sync_client is None:
|
|
86
|
-
self.
|
|
97
|
+
self._sync_http_client = make_sync_http_client()
|
|
98
|
+
self._sync_client = OpenAI(
|
|
99
|
+
api_key=self.api_key,
|
|
100
|
+
base_url=self.base_url,
|
|
101
|
+
http_client=self._sync_http_client,
|
|
102
|
+
)
|
|
87
103
|
return self._sync_client
|
|
88
104
|
|
|
89
105
|
@property
|
|
@@ -173,6 +189,8 @@ class OpenAIProvider(Provider):
|
|
|
173
189
|
return ErrorClass.TRANSIENT
|
|
174
190
|
if isinstance(exc, APIStatusError) and exc.status_code in _RETRIABLE_STATUSES:
|
|
175
191
|
return ErrorClass.TRANSIENT
|
|
192
|
+
if is_decompress_error(exc):
|
|
193
|
+
return ErrorClass.TRANSIENT
|
|
176
194
|
return ErrorClass.PERMANENT
|
|
177
195
|
|
|
178
196
|
def format_error_for_user(self, exc: BaseException) -> str:
|
|
@@ -184,6 +202,11 @@ class OpenAIProvider(Provider):
|
|
|
184
202
|
return f"OpenAI service error ({exc.status_code}) — please retry."
|
|
185
203
|
if isinstance(exc, APITimeoutError | APIConnectionError):
|
|
186
204
|
return "Network error talking to OpenAI — please retry."
|
|
205
|
+
if is_decompress_error(exc):
|
|
206
|
+
return (
|
|
207
|
+
"Network/encoding error talking to OpenAI (response decompress failed) — "
|
|
208
|
+
"please retry."
|
|
209
|
+
)
|
|
187
210
|
return str(exc)
|
|
188
211
|
|
|
189
212
|
def stream(self, request: ProviderRequest) -> AsyncIterator[StreamEvent]:
|
|
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
|
|
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
|
|
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
|