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.
Files changed (202) hide show
  1. {cade_cli-0.16.3 → cade_cli-0.16.4}/PKG-INFO +2 -2
  2. {cade_cli-0.16.3 → cade_cli-0.16.4}/README.md +1 -1
  3. {cade_cli-0.16.3 → cade_cli-0.16.4}/pyproject.toml +1 -1
  4. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/providers/anthropic.py +20 -2
  5. cade_cli-0.16.4/src/cadecoder/providers/http_client.py +52 -0
  6. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/providers/openai.py +25 -2
  7. {cade_cli-0.16.3 → cade_cli-0.16.4}/.gitignore +0 -0
  8. {cade_cli-0.16.3 → cade_cli-0.16.4}/LICENSE +0 -0
  9. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/__init__.py +0 -0
  10. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/__main__.py +0 -0
  11. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/_metadata.py +0 -0
  12. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/config.py +0 -0
  13. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/errors.py +0 -0
  14. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/grants.py +0 -0
  15. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/resources.py +0 -0
  16. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/sandbox.py +0 -0
  17. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/server.py +0 -0
  18. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/__init__.py +0 -0
  19. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/_read_cache.py +0 -0
  20. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/access.py +0 -0
  21. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/agents.py +0 -0
  22. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/context.py +0 -0
  23. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/filesystem.py +0 -0
  24. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/git.py +0 -0
  25. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/notifications.py +0 -0
  26. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/questions.py +0 -0
  27. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/results.py +0 -0
  28. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/schemas.py +0 -0
  29. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/search.py +0 -0
  30. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/shell.py +0 -0
  31. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/snippets.py +0 -0
  32. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/tasks.py +0 -0
  33. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/web_fetch.py +0 -0
  34. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/tools/web_search.py +0 -0
  35. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/utils.py +0 -0
  36. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/__init__.py +0 -0
  37. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/arcade_client.py +0 -0
  38. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/cache.py +0 -0
  39. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/extract.py +0 -0
  40. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/markdown.py +0 -0
  41. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/preapproved.py +0 -0
  42. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/prompts.py +0 -0
  43. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/scrape.py +0 -0
  44. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/search/__init__.py +0 -0
  45. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/search/arcade.py +0 -0
  46. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/search/base.py +0 -0
  47. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cade_mcp_local/web/search/http.py +0 -0
  48. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/__init__.py +0 -0
  49. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ai/__init__.py +0 -0
  50. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ai/prompts.py +0 -0
  51. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/__init__.py +0 -0
  52. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/app.py +0 -0
  53. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/auth.py +0 -0
  54. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/__init__.py +0 -0
  55. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/account.py +0 -0
  56. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/agents.py +0 -0
  57. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/auth.py +0 -0
  58. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/chat.py +0 -0
  59. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/cron.py +0 -0
  60. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/daemon.py +0 -0
  61. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/grant.py +0 -0
  62. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/hooks.py +0 -0
  63. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/mcp.py +0 -0
  64. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/mem.py +0 -0
  65. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/tasks.py +0 -0
  66. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/thread.py +0 -0
  67. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/commands/tools.py +0 -0
  68. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/mcp_hosts.py +0 -0
  69. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/cli/onboarding.py +0 -0
  70. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/__init__.py +0 -0
  71. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/agent.py +0 -0
  72. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/comms.py +0 -0
  73. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/config.py +0 -0
  74. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/constants.py +0 -0
  75. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/errors.py +0 -0
  76. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/frozen.py +0 -0
  77. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/git.py +0 -0
  78. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/inbox.py +0 -0
  79. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/logging.py +0 -0
  80. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/memory.py +0 -0
  81. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/model_specs.py +0 -0
  82. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/names.py +0 -0
  83. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/paths.py +0 -0
  84. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/runtime.py +0 -0
  85. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/secrets.py +0 -0
  86. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/spawn.py +0 -0
  87. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/core/types.py +0 -0
  88. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/__init__.py +0 -0
  89. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/adapters/__init__.py +0 -0
  90. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/adapters/base.py +0 -0
  91. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/adapters/factory.py +0 -0
  92. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/adapters/imessage.py +0 -0
  93. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/adapters/registry.py +0 -0
  94. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/adapters/stub.py +0 -0
  95. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/adapters/telegram.py +0 -0
  96. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/allowlist.py +0 -0
  97. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/attach.py +0 -0
  98. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/chunker.py +0 -0
  99. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/client.py +0 -0
  100. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/commands.py +0 -0
  101. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/config.py +0 -0
  102. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/control.py +0 -0
  103. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/cron.py +0 -0
  104. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/elicitation.py +0 -0
  105. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/ensure.py +0 -0
  106. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/format.py +0 -0
  107. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/__init__.py +0 -0
  108. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/app.py +0 -0
  109. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/arcade_export.py +0 -0
  110. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/auth.py +0 -0
  111. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/constants.py +0 -0
  112. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/elicitation.py +0 -0
  113. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/exposure.py +0 -0
  114. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/limits.py +0 -0
  115. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/middleware.py +0 -0
  116. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/resources.py +0 -0
  117. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/subscriptions.py +0 -0
  118. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/gateway/turn_bridge.py +0 -0
  119. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/grants.py +0 -0
  120. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/inbox_cron.py +0 -0
  121. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/install.py +0 -0
  122. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/live.py +0 -0
  123. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/lock.py +0 -0
  124. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/mesh.py +0 -0
  125. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/message_pump.py +0 -0
  126. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/observability.py +0 -0
  127. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/owner.py +0 -0
  128. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/progress_sink.py +0 -0
  129. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/registry.py +0 -0
  130. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/router.py +0 -0
  131. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/runner.py +0 -0
  132. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/runner_main.py +0 -0
  133. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/secrets.py +0 -0
  134. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/secrets_broker.py +0 -0
  135. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/server.py +0 -0
  136. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/services.py +0 -0
  137. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/shim.py +0 -0
  138. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/sinks.py +0 -0
  139. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/supervisor.py +0 -0
  140. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/tokens.py +0 -0
  141. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/traffic.py +0 -0
  142. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/turns.py +0 -0
  143. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/daemon/wake.py +0 -0
  144. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/execution/__init__.py +0 -0
  145. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/execution/context_window.py +0 -0
  146. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/execution/mcp_schema_index.py +0 -0
  147. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/execution/orchestrator.py +0 -0
  148. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/execution/parallel.py +0 -0
  149. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/execution/tool_result_store.py +0 -0
  150. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/execution/tool_schema_cache.py +0 -0
  151. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/__init__.py +0 -0
  152. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/config.py +0 -0
  153. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/engine.py +0 -0
  154. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/executors/__init__.py +0 -0
  155. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/executors/callback.py +0 -0
  156. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/executors/command.py +0 -0
  157. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/executors/http.py +0 -0
  158. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/executors/prompt.py +0 -0
  159. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/executors/ssrf_guard.py +0 -0
  160. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/matchers.py +0 -0
  161. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/registry.py +0 -0
  162. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/hooks/types.py +0 -0
  163. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/providers/__init__.py +0 -0
  164. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/providers/base.py +0 -0
  165. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/providers/ollama.py +0 -0
  166. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/serve/__init__.py +0 -0
  167. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/storage/__init__.py +0 -0
  168. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/storage/threads.py +0 -0
  169. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tasks/__init__.py +0 -0
  170. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tasks/scheduler.py +0 -0
  171. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tasks/store.py +0 -0
  172. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tasks/types.py +0 -0
  173. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/templates/login_failed.html +0 -0
  174. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/templates/login_success.html +0 -0
  175. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/templates/serve/launchd.plist.tmpl +0 -0
  176. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/templates/serve/serve.toml.example +0 -0
  177. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/templates/serve/systemd.service.tmpl +0 -0
  178. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/templates/styles.css +0 -0
  179. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/__init__.py +0 -0
  180. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/manager/__init__.py +0 -0
  181. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/manager/_request_ctx.py +0 -0
  182. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/manager/base.py +0 -0
  183. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/manager/composite.py +0 -0
  184. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/manager/config.py +0 -0
  185. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/manager/mcp.py +0 -0
  186. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/search/__init__.py +0 -0
  187. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/search/discovered.py +0 -0
  188. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/search/scoring.py +0 -0
  189. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/tools/search/service.py +0 -0
  190. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ui/__init__.py +0 -0
  191. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ui/completion.py +0 -0
  192. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ui/display.py +0 -0
  193. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ui/elicitation.py +0 -0
  194. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ui/input.py +0 -0
  195. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ui/session.py +0 -0
  196. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/ui/slash.py +0 -0
  197. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/voice/__init__.py +0 -0
  198. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/voice/audio.py +0 -0
  199. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/voice/cleanup.py +0 -0
  200. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/voice/session.py +0 -0
  201. {cade_cli-0.16.3 → cade_cli-0.16.4}/src/cadecoder/voice/stt.py +0 -0
  202. {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
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.3 CADE_INSTALL_DIR=/usr/local/bin \
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.3 CADE_INSTALL_DIR=/usr/local/bin \
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
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cade-cli"
3
- version = "0.16.3"
3
+ version = "0.16.4"
4
4
  description = "Cade - The CLI Agent from Arcade.dev (install: curl -fsSL https://arcadeagent.dev/install | sh)"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -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
- self.client = AsyncAnthropic(api_key=self.api_key)
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._sync_client = Anthropic(api_key=self.api_key)
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.client = AsyncOpenAI(api_key=self.api_key, base_url=self.base_url)
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._sync_client = OpenAI(api_key=self.api_key, base_url=self.base_url)
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