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.
Files changed (201) hide show
  1. {cade_cli-0.16.1 → cade_cli-0.16.3}/PKG-INFO +4 -4
  2. {cade_cli-0.16.1 → cade_cli-0.16.3}/README.md +3 -3
  3. {cade_cli-0.16.1 → cade_cli-0.16.3}/pyproject.toml +1 -1
  4. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/app.py +18 -12
  5. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/auth.py +6 -6
  6. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/mcp.py +115 -19
  7. cade_cli-0.16.3/src/cadecoder/cli/mcp_hosts.py +351 -0
  8. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/onboarding.py +189 -15
  9. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/manager/__init__.py +4 -0
  10. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/manager/config.py +32 -12
  11. {cade_cli-0.16.1 → cade_cli-0.16.3}/.gitignore +0 -0
  12. {cade_cli-0.16.1 → cade_cli-0.16.3}/LICENSE +0 -0
  13. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/__init__.py +0 -0
  14. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/__main__.py +0 -0
  15. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/_metadata.py +0 -0
  16. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/config.py +0 -0
  17. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/errors.py +0 -0
  18. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/grants.py +0 -0
  19. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/resources.py +0 -0
  20. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/sandbox.py +0 -0
  21. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/server.py +0 -0
  22. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/__init__.py +0 -0
  23. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/_read_cache.py +0 -0
  24. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/access.py +0 -0
  25. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/agents.py +0 -0
  26. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/context.py +0 -0
  27. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/filesystem.py +0 -0
  28. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/git.py +0 -0
  29. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/notifications.py +0 -0
  30. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/questions.py +0 -0
  31. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/results.py +0 -0
  32. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/schemas.py +0 -0
  33. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/search.py +0 -0
  34. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/shell.py +0 -0
  35. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/snippets.py +0 -0
  36. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/tasks.py +0 -0
  37. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/web_fetch.py +0 -0
  38. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/tools/web_search.py +0 -0
  39. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/utils.py +0 -0
  40. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/__init__.py +0 -0
  41. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/arcade_client.py +0 -0
  42. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/cache.py +0 -0
  43. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/extract.py +0 -0
  44. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/markdown.py +0 -0
  45. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/preapproved.py +0 -0
  46. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/prompts.py +0 -0
  47. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/scrape.py +0 -0
  48. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/search/__init__.py +0 -0
  49. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/search/arcade.py +0 -0
  50. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/search/base.py +0 -0
  51. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cade_mcp_local/web/search/http.py +0 -0
  52. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/__init__.py +0 -0
  53. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ai/__init__.py +0 -0
  54. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ai/prompts.py +0 -0
  55. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/__init__.py +0 -0
  56. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/auth.py +0 -0
  57. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/__init__.py +0 -0
  58. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/account.py +0 -0
  59. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/agents.py +0 -0
  60. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/chat.py +0 -0
  61. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/cron.py +0 -0
  62. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/daemon.py +0 -0
  63. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/grant.py +0 -0
  64. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/hooks.py +0 -0
  65. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/mem.py +0 -0
  66. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/tasks.py +0 -0
  67. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/thread.py +0 -0
  68. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/cli/commands/tools.py +0 -0
  69. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/__init__.py +0 -0
  70. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/agent.py +0 -0
  71. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/comms.py +0 -0
  72. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/config.py +0 -0
  73. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/constants.py +0 -0
  74. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/errors.py +0 -0
  75. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/frozen.py +0 -0
  76. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/git.py +0 -0
  77. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/inbox.py +0 -0
  78. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/logging.py +0 -0
  79. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/memory.py +0 -0
  80. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/model_specs.py +0 -0
  81. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/names.py +0 -0
  82. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/paths.py +0 -0
  83. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/runtime.py +0 -0
  84. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/secrets.py +0 -0
  85. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/spawn.py +0 -0
  86. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/core/types.py +0 -0
  87. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/__init__.py +0 -0
  88. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/adapters/__init__.py +0 -0
  89. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/adapters/base.py +0 -0
  90. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/adapters/factory.py +0 -0
  91. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/adapters/imessage.py +0 -0
  92. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/adapters/registry.py +0 -0
  93. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/adapters/stub.py +0 -0
  94. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/adapters/telegram.py +0 -0
  95. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/allowlist.py +0 -0
  96. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/attach.py +0 -0
  97. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/chunker.py +0 -0
  98. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/client.py +0 -0
  99. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/commands.py +0 -0
  100. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/config.py +0 -0
  101. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/control.py +0 -0
  102. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/cron.py +0 -0
  103. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/elicitation.py +0 -0
  104. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/ensure.py +0 -0
  105. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/format.py +0 -0
  106. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/__init__.py +0 -0
  107. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/app.py +0 -0
  108. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/arcade_export.py +0 -0
  109. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/auth.py +0 -0
  110. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/constants.py +0 -0
  111. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/elicitation.py +0 -0
  112. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/exposure.py +0 -0
  113. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/limits.py +0 -0
  114. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/middleware.py +0 -0
  115. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/resources.py +0 -0
  116. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/subscriptions.py +0 -0
  117. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/gateway/turn_bridge.py +0 -0
  118. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/grants.py +0 -0
  119. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/inbox_cron.py +0 -0
  120. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/install.py +0 -0
  121. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/live.py +0 -0
  122. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/lock.py +0 -0
  123. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/mesh.py +0 -0
  124. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/message_pump.py +0 -0
  125. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/observability.py +0 -0
  126. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/owner.py +0 -0
  127. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/progress_sink.py +0 -0
  128. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/registry.py +0 -0
  129. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/router.py +0 -0
  130. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/runner.py +0 -0
  131. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/runner_main.py +0 -0
  132. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/secrets.py +0 -0
  133. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/secrets_broker.py +0 -0
  134. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/server.py +0 -0
  135. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/services.py +0 -0
  136. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/shim.py +0 -0
  137. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/sinks.py +0 -0
  138. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/supervisor.py +0 -0
  139. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/tokens.py +0 -0
  140. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/traffic.py +0 -0
  141. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/turns.py +0 -0
  142. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/daemon/wake.py +0 -0
  143. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/execution/__init__.py +0 -0
  144. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/execution/context_window.py +0 -0
  145. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/execution/mcp_schema_index.py +0 -0
  146. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/execution/orchestrator.py +0 -0
  147. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/execution/parallel.py +0 -0
  148. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/execution/tool_result_store.py +0 -0
  149. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/execution/tool_schema_cache.py +0 -0
  150. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/__init__.py +0 -0
  151. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/config.py +0 -0
  152. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/engine.py +0 -0
  153. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/executors/__init__.py +0 -0
  154. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/executors/callback.py +0 -0
  155. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/executors/command.py +0 -0
  156. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/executors/http.py +0 -0
  157. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/executors/prompt.py +0 -0
  158. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/executors/ssrf_guard.py +0 -0
  159. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/matchers.py +0 -0
  160. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/registry.py +0 -0
  161. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/hooks/types.py +0 -0
  162. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/providers/__init__.py +0 -0
  163. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/providers/anthropic.py +0 -0
  164. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/providers/base.py +0 -0
  165. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/providers/ollama.py +0 -0
  166. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/providers/openai.py +0 -0
  167. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/serve/__init__.py +0 -0
  168. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/storage/__init__.py +0 -0
  169. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/storage/threads.py +0 -0
  170. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tasks/__init__.py +0 -0
  171. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tasks/scheduler.py +0 -0
  172. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tasks/store.py +0 -0
  173. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tasks/types.py +0 -0
  174. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/templates/login_failed.html +0 -0
  175. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/templates/login_success.html +0 -0
  176. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/templates/serve/launchd.plist.tmpl +0 -0
  177. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/templates/serve/serve.toml.example +0 -0
  178. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/templates/serve/systemd.service.tmpl +0 -0
  179. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/templates/styles.css +0 -0
  180. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/__init__.py +0 -0
  181. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/manager/_request_ctx.py +0 -0
  182. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/manager/base.py +0 -0
  183. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/manager/composite.py +0 -0
  184. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/manager/mcp.py +0 -0
  185. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/search/__init__.py +0 -0
  186. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/search/discovered.py +0 -0
  187. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/search/scoring.py +0 -0
  188. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/tools/search/service.py +0 -0
  189. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ui/__init__.py +0 -0
  190. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ui/completion.py +0 -0
  191. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ui/display.py +0 -0
  192. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ui/elicitation.py +0 -0
  193. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ui/input.py +0 -0
  194. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ui/session.py +0 -0
  195. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/ui/slash.py +0 -0
  196. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/voice/__init__.py +0 -0
  197. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/voice/audio.py +0 -0
  198. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/voice/cleanup.py +0 -0
  199. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/voice/session.py +0 -0
  200. {cade_cli-0.16.1 → cade_cli-0.16.3}/src/cadecoder/voice/stt.py +0 -0
  201. {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.1
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. Re-run the same command to upgrade.
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.1 CADE_INSTALL_DIR=/usr/local/bin \
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. Re-run the same command to upgrade.
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.1 CADE_INSTALL_DIR=/usr/local/bin \
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
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cade-cli"
3
- version = "0.16.1"
3
+ version = "0.16.3"
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"
@@ -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 needs_onboarding, run_onboarding
488
-
489
- did_onboard = False
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
- did_onboard = run_onboarding(console)
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
- # Right after first-run setup (runtime now available), offer to connect
500
- # Arcade Omni so external tools work out of the box. No-op otherwise.
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
- from cadecoder.cli.commands.mcp import offer_connect_omni
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 Omni so the agent can use external tools
90
- # (Gmail, Slack, web search, …) without a separate API key. No-op when
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 offer_connect_omni
93
+ from cadecoder.cli.commands.mcp import offer_connect_hub
94
94
 
95
- offer_connect_omni(console)
95
+ offer_connect_hub(console)
96
96
  except Exception as e: # noqa: BLE001
97
- log.debug(f"omni connect offer skipped: {e}")
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
- ``omni``), it's added in a disabled state first and only enabled once
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
- server = store.get(name)
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 = known_server_config(name)
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 'omni'.[/dim]"
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 offer_connect_omni(target_console: Console | None = None) -> None:
519
- """Offer to connect Arcade Omni (external tools) if not already authorized.
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 Omni is already authorized, so it never
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] Arcade [cyan]Omni[/cyan] lets Cade use "
546
- "Gmail, Slack, GitHub, web search and more — authorized with your Arcade login "
547
- "(no API key needed)."
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("Authorize Omni now? (opens your browser)", default=True, console=con)
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("[dim]Skipped. Connect anytime with [bold]cade mcp authorize omni[/bold].[/dim]")
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("omni"):
560
- con.print("[dim]You can retry later with [bold]cade mcp authorize omni[/bold].[/dim]")
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 omni`` to connect Arcade's external tools).
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")],