cade-cli 0.16.3__tar.gz → 0.16.5__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.5}/PKG-INFO +2 -2
  2. {cade_cli-0.16.3 → cade_cli-0.16.5}/README.md +1 -1
  3. {cade_cli-0.16.3 → cade_cli-0.16.5}/pyproject.toml +1 -1
  4. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/commands/daemon.py +13 -5
  5. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/server.py +15 -1
  6. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/providers/anthropic.py +20 -2
  7. cade_cli-0.16.5/src/cadecoder/providers/http_client.py +52 -0
  8. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/providers/openai.py +25 -2
  9. {cade_cli-0.16.3 → cade_cli-0.16.5}/.gitignore +0 -0
  10. {cade_cli-0.16.3 → cade_cli-0.16.5}/LICENSE +0 -0
  11. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/__init__.py +0 -0
  12. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/__main__.py +0 -0
  13. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/_metadata.py +0 -0
  14. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/config.py +0 -0
  15. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/errors.py +0 -0
  16. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/grants.py +0 -0
  17. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/resources.py +0 -0
  18. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/sandbox.py +0 -0
  19. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/server.py +0 -0
  20. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/tools/__init__.py +0 -0
  21. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/tools/_read_cache.py +0 -0
  22. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/tools/access.py +0 -0
  23. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/tools/agents.py +0 -0
  24. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/tools/context.py +0 -0
  25. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/tools/filesystem.py +0 -0
  26. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/tools/git.py +0 -0
  27. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/tools/notifications.py +0 -0
  28. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/tools/questions.py +0 -0
  29. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/tools/results.py +0 -0
  30. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/tools/schemas.py +0 -0
  31. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/tools/search.py +0 -0
  32. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/tools/shell.py +0 -0
  33. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/tools/snippets.py +0 -0
  34. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/tools/tasks.py +0 -0
  35. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/tools/web_fetch.py +0 -0
  36. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/tools/web_search.py +0 -0
  37. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/utils.py +0 -0
  38. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/web/__init__.py +0 -0
  39. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/web/arcade_client.py +0 -0
  40. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/web/cache.py +0 -0
  41. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/web/extract.py +0 -0
  42. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/web/markdown.py +0 -0
  43. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/web/preapproved.py +0 -0
  44. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/web/prompts.py +0 -0
  45. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/web/scrape.py +0 -0
  46. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/web/search/__init__.py +0 -0
  47. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/web/search/arcade.py +0 -0
  48. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/web/search/base.py +0 -0
  49. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cade_mcp_local/web/search/http.py +0 -0
  50. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/__init__.py +0 -0
  51. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/ai/__init__.py +0 -0
  52. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/ai/prompts.py +0 -0
  53. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/__init__.py +0 -0
  54. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/app.py +0 -0
  55. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/auth.py +0 -0
  56. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/commands/__init__.py +0 -0
  57. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/commands/account.py +0 -0
  58. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/commands/agents.py +0 -0
  59. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/commands/auth.py +0 -0
  60. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/commands/chat.py +0 -0
  61. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/commands/cron.py +0 -0
  62. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/commands/grant.py +0 -0
  63. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/commands/hooks.py +0 -0
  64. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/commands/mcp.py +0 -0
  65. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/commands/mem.py +0 -0
  66. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/commands/tasks.py +0 -0
  67. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/commands/thread.py +0 -0
  68. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/commands/tools.py +0 -0
  69. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/mcp_hosts.py +0 -0
  70. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/cli/onboarding.py +0 -0
  71. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/__init__.py +0 -0
  72. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/agent.py +0 -0
  73. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/comms.py +0 -0
  74. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/config.py +0 -0
  75. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/constants.py +0 -0
  76. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/errors.py +0 -0
  77. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/frozen.py +0 -0
  78. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/git.py +0 -0
  79. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/inbox.py +0 -0
  80. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/logging.py +0 -0
  81. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/memory.py +0 -0
  82. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/model_specs.py +0 -0
  83. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/names.py +0 -0
  84. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/paths.py +0 -0
  85. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/runtime.py +0 -0
  86. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/secrets.py +0 -0
  87. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/spawn.py +0 -0
  88. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/core/types.py +0 -0
  89. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/__init__.py +0 -0
  90. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/adapters/__init__.py +0 -0
  91. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/adapters/base.py +0 -0
  92. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/adapters/factory.py +0 -0
  93. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/adapters/imessage.py +0 -0
  94. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/adapters/registry.py +0 -0
  95. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/adapters/stub.py +0 -0
  96. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/adapters/telegram.py +0 -0
  97. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/allowlist.py +0 -0
  98. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/attach.py +0 -0
  99. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/chunker.py +0 -0
  100. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/client.py +0 -0
  101. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/commands.py +0 -0
  102. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/config.py +0 -0
  103. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/control.py +0 -0
  104. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/cron.py +0 -0
  105. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/elicitation.py +0 -0
  106. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/ensure.py +0 -0
  107. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/format.py +0 -0
  108. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/gateway/__init__.py +0 -0
  109. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/gateway/app.py +0 -0
  110. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/gateway/arcade_export.py +0 -0
  111. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/gateway/auth.py +0 -0
  112. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/gateway/constants.py +0 -0
  113. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/gateway/elicitation.py +0 -0
  114. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/gateway/exposure.py +0 -0
  115. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/gateway/limits.py +0 -0
  116. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/gateway/middleware.py +0 -0
  117. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/gateway/resources.py +0 -0
  118. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/gateway/subscriptions.py +0 -0
  119. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/gateway/turn_bridge.py +0 -0
  120. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/grants.py +0 -0
  121. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/inbox_cron.py +0 -0
  122. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/install.py +0 -0
  123. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/live.py +0 -0
  124. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/lock.py +0 -0
  125. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/mesh.py +0 -0
  126. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/message_pump.py +0 -0
  127. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/observability.py +0 -0
  128. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/owner.py +0 -0
  129. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/progress_sink.py +0 -0
  130. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/registry.py +0 -0
  131. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/router.py +0 -0
  132. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/runner.py +0 -0
  133. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/runner_main.py +0 -0
  134. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/secrets.py +0 -0
  135. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/secrets_broker.py +0 -0
  136. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/services.py +0 -0
  137. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/shim.py +0 -0
  138. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/sinks.py +0 -0
  139. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/supervisor.py +0 -0
  140. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/tokens.py +0 -0
  141. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/traffic.py +0 -0
  142. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/turns.py +0 -0
  143. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/daemon/wake.py +0 -0
  144. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/execution/__init__.py +0 -0
  145. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/execution/context_window.py +0 -0
  146. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/execution/mcp_schema_index.py +0 -0
  147. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/execution/orchestrator.py +0 -0
  148. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/execution/parallel.py +0 -0
  149. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/execution/tool_result_store.py +0 -0
  150. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/execution/tool_schema_cache.py +0 -0
  151. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/hooks/__init__.py +0 -0
  152. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/hooks/config.py +0 -0
  153. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/hooks/engine.py +0 -0
  154. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/hooks/executors/__init__.py +0 -0
  155. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/hooks/executors/callback.py +0 -0
  156. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/hooks/executors/command.py +0 -0
  157. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/hooks/executors/http.py +0 -0
  158. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/hooks/executors/prompt.py +0 -0
  159. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/hooks/executors/ssrf_guard.py +0 -0
  160. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/hooks/matchers.py +0 -0
  161. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/hooks/registry.py +0 -0
  162. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/hooks/types.py +0 -0
  163. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/providers/__init__.py +0 -0
  164. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/providers/base.py +0 -0
  165. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/providers/ollama.py +0 -0
  166. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/serve/__init__.py +0 -0
  167. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/storage/__init__.py +0 -0
  168. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/storage/threads.py +0 -0
  169. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/tasks/__init__.py +0 -0
  170. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/tasks/scheduler.py +0 -0
  171. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/tasks/store.py +0 -0
  172. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/tasks/types.py +0 -0
  173. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/templates/login_failed.html +0 -0
  174. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/templates/login_success.html +0 -0
  175. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/templates/serve/launchd.plist.tmpl +0 -0
  176. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/templates/serve/serve.toml.example +0 -0
  177. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/templates/serve/systemd.service.tmpl +0 -0
  178. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/templates/styles.css +0 -0
  179. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/tools/__init__.py +0 -0
  180. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/tools/manager/__init__.py +0 -0
  181. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/tools/manager/_request_ctx.py +0 -0
  182. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/tools/manager/base.py +0 -0
  183. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/tools/manager/composite.py +0 -0
  184. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/tools/manager/config.py +0 -0
  185. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/tools/manager/mcp.py +0 -0
  186. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/tools/search/__init__.py +0 -0
  187. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/tools/search/discovered.py +0 -0
  188. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/tools/search/scoring.py +0 -0
  189. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/tools/search/service.py +0 -0
  190. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/ui/__init__.py +0 -0
  191. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/ui/completion.py +0 -0
  192. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/ui/display.py +0 -0
  193. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/ui/elicitation.py +0 -0
  194. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/ui/input.py +0 -0
  195. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/ui/session.py +0 -0
  196. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/ui/slash.py +0 -0
  197. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/voice/__init__.py +0 -0
  198. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/voice/audio.py +0 -0
  199. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/voice/cleanup.py +0 -0
  200. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/voice/session.py +0 -0
  201. {cade_cli-0.16.3 → cade_cli-0.16.5}/src/cadecoder/voice/stt.py +0 -0
  202. {cade_cli-0.16.3 → cade_cli-0.16.5}/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.5
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.5 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.5 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.5"
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"
@@ -103,9 +103,16 @@ def start(
103
103
  prewarm: list[str] = typer.Option(
104
104
  None, "--prewarm", help="Agent to start at boot (repeatable)."
105
105
  ),
106
- no_auth: bool = typer.Option(
107
- False, "--no-auth", help="Loopback only: treat every caller as the local principal."
108
- ),
106
+ auth: Annotated[
107
+ bool | None,
108
+ typer.Option(
109
+ "--auth/--no-auth",
110
+ help=(
111
+ "Require bearer tokens. Default: off on loopback (stdio MCP hosts / "
112
+ "CLI attach), on for non-loopback binds. --no-auth is refused off-loopback."
113
+ ),
114
+ ),
115
+ ] = None,
109
116
  verbose: Annotated[
110
117
  bool,
111
118
  typer.Option(
@@ -117,7 +124,7 @@ def start(
117
124
  ) -> None:
118
125
  """Run the gateway supervisor in the foreground (serves all agents)."""
119
126
  from cadecoder.daemon.lock import DaemonAlreadyRunningError
120
- from cadecoder.daemon.server import UnsafeBindError, run_daemon
127
+ from cadecoder.daemon.server import UnsafeBindError, resolve_require_auth, run_daemon
121
128
 
122
129
  if verbose:
123
130
  from cadecoder.core.logging import setup_logging
@@ -130,9 +137,10 @@ def start(
130
137
  "(recv/send/turn/tool/cron/wake/reject) to stdout[/dim]"
131
138
  )
132
139
 
140
+ require_auth = resolve_require_auth(bind=bind, auth=auth)
133
141
  try:
134
142
  code = asyncio.run(
135
- run_daemon(bind=bind, prewarm=list(prewarm or []), require_auth=not no_auth)
143
+ run_daemon(bind=bind, prewarm=list(prewarm or []), require_auth=require_auth)
136
144
  )
137
145
  except DaemonAlreadyRunningError as e:
138
146
  console.print(f"[red]{e}[/red]")
@@ -42,6 +42,20 @@ class UnsafeBindError(RuntimeError):
42
42
  """Refused: auth is off but the bind is reachable off-box."""
43
43
 
44
44
 
45
+ def resolve_require_auth(*, bind: str, auth: bool | None) -> bool:
46
+ """Decide whether the gateway should require bearer tokens.
47
+
48
+ When ``auth`` is ``None`` (CLI default), loopback binds run unauthenticated
49
+ so stdio MCP hosts and CLI attach work without a token; non-loopback binds
50
+ require auth. Explicit ``--auth`` / ``--no-auth`` always win (subject to
51
+ :func:`_guard_auth_bind`).
52
+ """
53
+ host, _ = _parse_bind(bind)
54
+ if auth is not None:
55
+ return auth
56
+ return host not in _LOOPBACK_HOSTS
57
+
58
+
45
59
  def _guard_auth_bind(host: str, require_auth: bool) -> None:
46
60
  """Refuse to run unauthenticated on a non-loopback bind.
47
61
 
@@ -52,7 +66,7 @@ def _guard_auth_bind(host: str, require_auth: bool) -> None:
52
66
  if not require_auth and host not in _LOOPBACK_HOSTS:
53
67
  raise UnsafeBindError(
54
68
  f"refusing to run with auth disabled on non-loopback bind {host!r}; "
55
- "mint a token and drop --no-auth, or bind 127.0.0.1"
69
+ "mint a token and pass --auth, or bind 127.0.0.1"
56
70
  )
57
71
 
58
72
 
@@ -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