cade-cli 0.18.0__tar.gz → 0.19.0__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 (220) hide show
  1. {cade_cli-0.18.0 → cade_cli-0.19.0}/.gitignore +1 -0
  2. {cade_cli-0.18.0 → cade_cli-0.19.0}/PKG-INFO +1 -1
  3. {cade_cli-0.18.0 → cade_cli-0.19.0}/pyproject.toml +1 -1
  4. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/allowlist.py +24 -17
  5. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/gateway/constants.py +0 -17
  6. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/gateway/exposure.py +0 -6
  7. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/gateway/resources.py +0 -26
  8. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/gateway/subscriptions.py +1 -9
  9. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/assets/.claude-plugin/plugin.json +1 -1
  10. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/assets/.cursor-plugin/plugin.json +1 -1
  11. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/doctor.py +3 -1
  12. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/templates/serve/serve.toml.example +7 -8
  13. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/voice/__init__.py +21 -1
  14. {cade_cli-0.18.0 → cade_cli-0.19.0}/LICENSE +0 -0
  15. {cade_cli-0.18.0 → cade_cli-0.19.0}/README.md +0 -0
  16. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/__init__.py +0 -0
  17. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/__main__.py +0 -0
  18. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/_metadata.py +0 -0
  19. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/config.py +0 -0
  20. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/errors.py +0 -0
  21. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/grants.py +0 -0
  22. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/resources.py +0 -0
  23. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/sandbox.py +0 -0
  24. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/server.py +0 -0
  25. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/tools/__init__.py +0 -0
  26. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/tools/_read_cache.py +0 -0
  27. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/tools/access.py +0 -0
  28. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/tools/agents.py +0 -0
  29. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/tools/filesystem.py +0 -0
  30. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/tools/git.py +0 -0
  31. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/tools/notifications.py +0 -0
  32. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/tools/questions.py +0 -0
  33. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/tools/results.py +0 -0
  34. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/tools/schemas.py +0 -0
  35. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/tools/search.py +0 -0
  36. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/tools/shell.py +0 -0
  37. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/tools/tasks.py +0 -0
  38. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/tools/web_fetch.py +0 -0
  39. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/tools/web_search.py +0 -0
  40. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/utils.py +0 -0
  41. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/web/__init__.py +0 -0
  42. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/web/arcade_client.py +0 -0
  43. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/web/cache.py +0 -0
  44. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/web/extract.py +0 -0
  45. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/web/markdown.py +0 -0
  46. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/web/preapproved.py +0 -0
  47. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/web/prompts.py +0 -0
  48. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/web/scrape.py +0 -0
  49. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/web/search/__init__.py +0 -0
  50. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/web/search/arcade.py +0 -0
  51. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/web/search/base.py +0 -0
  52. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cade_mcp_local/web/search/http.py +0 -0
  53. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/__init__.py +0 -0
  54. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/ai/__init__.py +0 -0
  55. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/ai/prompts.py +0 -0
  56. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/__init__.py +0 -0
  57. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/app.py +0 -0
  58. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/auth.py +0 -0
  59. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/commands/__init__.py +0 -0
  60. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/commands/account.py +0 -0
  61. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/commands/agent_group.py +0 -0
  62. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/commands/agents.py +0 -0
  63. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/commands/auth.py +0 -0
  64. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/commands/chat.py +0 -0
  65. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/commands/cron.py +0 -0
  66. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/commands/daemon.py +0 -0
  67. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/commands/grant.py +0 -0
  68. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/commands/hooks.py +0 -0
  69. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/commands/mcp.py +0 -0
  70. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/commands/mem.py +0 -0
  71. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/commands/tasks.py +0 -0
  72. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/commands/thread.py +0 -0
  73. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/commands/tools.py +0 -0
  74. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/mcp_hosts.py +0 -0
  75. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/onboarding.py +0 -0
  76. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/cli/ui.py +0 -0
  77. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/__init__.py +0 -0
  78. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/agent.py +0 -0
  79. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/binary.py +0 -0
  80. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/comms.py +0 -0
  81. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/config.py +0 -0
  82. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/constants.py +0 -0
  83. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/errors.py +0 -0
  84. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/frozen.py +0 -0
  85. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/git.py +0 -0
  86. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/inbox.py +0 -0
  87. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/logging.py +0 -0
  88. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/memory.py +0 -0
  89. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/model_specs.py +0 -0
  90. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/names.py +0 -0
  91. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/paths.py +0 -0
  92. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/runtime.py +0 -0
  93. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/secrets.py +0 -0
  94. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/spawn.py +0 -0
  95. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/text.py +0 -0
  96. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/core/types.py +0 -0
  97. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/__init__.py +0 -0
  98. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/adapters/__init__.py +0 -0
  99. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/adapters/base.py +0 -0
  100. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/adapters/factory.py +0 -0
  101. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/adapters/imessage.py +0 -0
  102. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/adapters/registry.py +0 -0
  103. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/adapters/stub.py +0 -0
  104. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/adapters/telegram.py +0 -0
  105. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/attach.py +0 -0
  106. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/chunker.py +0 -0
  107. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/client.py +0 -0
  108. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/commands.py +0 -0
  109. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/config.py +0 -0
  110. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/control.py +0 -0
  111. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/cron.py +0 -0
  112. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/elicitation.py +0 -0
  113. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/ensure.py +0 -0
  114. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/format.py +0 -0
  115. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/gateway/__init__.py +0 -0
  116. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/gateway/app.py +0 -0
  117. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/gateway/auth.py +0 -0
  118. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/gateway/elicitation.py +0 -0
  119. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/gateway/host_agent.py +0 -0
  120. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/gateway/limits.py +0 -0
  121. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/gateway/middleware.py +0 -0
  122. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/gateway/turn_bridge.py +0 -0
  123. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/grants.py +0 -0
  124. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/inbox.py +0 -0
  125. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/inbox_cron.py +0 -0
  126. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/install.py +0 -0
  127. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/lock.py +0 -0
  128. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/mesh.py +0 -0
  129. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/message_pump.py +0 -0
  130. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/observability.py +0 -0
  131. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/owner.py +0 -0
  132. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/progress_sink.py +0 -0
  133. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/registry.py +0 -0
  134. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/router.py +0 -0
  135. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/runner.py +0 -0
  136. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/runner_main.py +0 -0
  137. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/secrets.py +0 -0
  138. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/secrets_broker.py +0 -0
  139. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/server.py +0 -0
  140. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/services.py +0 -0
  141. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/sinks.py +0 -0
  142. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/supervisor.py +0 -0
  143. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/tokens.py +0 -0
  144. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/traffic.py +0 -0
  145. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/turns.py +0 -0
  146. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/daemon/wake.py +0 -0
  147. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/execution/__init__.py +0 -0
  148. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/execution/context_window.py +0 -0
  149. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/execution/mcp_schema_index.py +0 -0
  150. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/execution/orchestrator.py +0 -0
  151. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/execution/parallel.py +0 -0
  152. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/execution/tool_result_store.py +0 -0
  153. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/execution/tool_schema_cache.py +0 -0
  154. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/hooks/__init__.py +0 -0
  155. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/hooks/config.py +0 -0
  156. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/hooks/engine.py +0 -0
  157. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/hooks/executors/__init__.py +0 -0
  158. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/hooks/executors/callback.py +0 -0
  159. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/hooks/executors/command.py +0 -0
  160. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/hooks/executors/http.py +0 -0
  161. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/hooks/executors/prompt.py +0 -0
  162. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/hooks/executors/ssrf_guard.py +0 -0
  163. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/hooks/matchers.py +0 -0
  164. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/hooks/registry.py +0 -0
  165. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/hooks/types.py +0 -0
  166. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/__init__.py +0 -0
  167. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/assets/.claude-plugin/marketplace.json +0 -0
  168. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/assets/.cursor-plugin/marketplace.json +0 -0
  169. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/assets/agents/operator.md +0 -0
  170. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/assets/commands/ask.md +0 -0
  171. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/assets/commands/memory.md +0 -0
  172. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/assets/commands/tasks.md +0 -0
  173. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/assets/mcp.json +0 -0
  174. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/assets/rules/gateway.mdc +0 -0
  175. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/assets/skills/ask/SKILL.md +0 -0
  176. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/assets/skills/memory/SKILL.md +0 -0
  177. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/assets/skills/tasks/SKILL.md +0 -0
  178. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/install.py +0 -0
  179. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/paths.py +0 -0
  180. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/host_plugin/state.py +0 -0
  181. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/providers/__init__.py +0 -0
  182. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/providers/anthropic.py +0 -0
  183. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/providers/base.py +0 -0
  184. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/providers/http_client.py +0 -0
  185. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/providers/ollama.py +0 -0
  186. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/providers/openai.py +0 -0
  187. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/storage/__init__.py +0 -0
  188. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/storage/threads.py +0 -0
  189. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/tasks/__init__.py +0 -0
  190. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/tasks/scheduler.py +0 -0
  191. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/tasks/store.py +0 -0
  192. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/tasks/types.py +0 -0
  193. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/templates/login_failed.html +0 -0
  194. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/templates/login_success.html +0 -0
  195. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/templates/serve/launchd.plist.tmpl +0 -0
  196. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/templates/serve/systemd.service.tmpl +0 -0
  197. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/templates/styles.css +0 -0
  198. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/tools/__init__.py +0 -0
  199. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/tools/manager/__init__.py +0 -0
  200. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/tools/manager/_request_ctx.py +0 -0
  201. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/tools/manager/base.py +0 -0
  202. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/tools/manager/composite.py +0 -0
  203. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/tools/manager/config.py +0 -0
  204. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/tools/manager/mcp.py +0 -0
  205. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/tools/search/__init__.py +0 -0
  206. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/tools/search/discovered.py +0 -0
  207. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/tools/search/scoring.py +0 -0
  208. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/tools/search/service.py +0 -0
  209. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/ui/__init__.py +0 -0
  210. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/ui/completion.py +0 -0
  211. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/ui/display.py +0 -0
  212. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/ui/elicitation.py +0 -0
  213. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/ui/input.py +0 -0
  214. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/ui/session.py +0 -0
  215. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/ui/slash.py +0 -0
  216. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/voice/audio.py +0 -0
  217. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/voice/cleanup.py +0 -0
  218. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/voice/session.py +0 -0
  219. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/voice/stt.py +0 -0
  220. {cade_cli-0.18.0 → cade_cli-0.19.0}/src/cadecoder/voice/tts.py +0 -0
@@ -47,3 +47,4 @@ activate.sh
47
47
 
48
48
  # uv
49
49
  uv.lock
50
+ .venv-docs/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cade-cli
3
- Version: 0.18.0
3
+ Version: 0.19.0
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cade-cli"
3
- version = "0.18.0"
3
+ version = "0.19.0"
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"
@@ -9,8 +9,8 @@ Policy:
9
9
  * `deny` wins over `allow` (explicit block beats any permit).
10
10
  * If `allow` is non-empty, only tools matching one of its patterns may run.
11
11
  * If BOTH `allow` and `deny` are empty, everything is allowed (unrestricted).
12
- * The shipped default (`DEFAULT_TOOL_ALLOW` / `DEFAULT_TOOL_DENY`) is an
13
- empty `allow` plus `deny = ["Local_Bash"]` — every tool except Bash.
12
+ * The shipped default (`DEFAULT_TOOL_ALLOW` / `DEFAULT_TOOL_DENY`) is empty
13
+ on both sides — every tool is allowed.
14
14
  * When `sandbox_root` is set, every Local_* tool call whose arguments carry
15
15
  a filesystem path is rejected if that path resolves outside the root —
16
16
  unless path restrictions are globally disabled via
@@ -37,23 +37,29 @@ HOOK_NAME = "cadecoder.daemon.allowlist"
37
37
  # The shipped default tool policy, and the only definition of it. Everything
38
38
  # that seeds a policy for a new agent reads these — never the literals.
39
39
  #
40
- # An empty allow list means "no allow-restriction", so the pair below reads as
41
- # "every tool except Local_Bash". Bash is the sole exclusion because a script
42
- # can always `cd` out of any sandbox root, so it cannot be contained the way
43
- # the typed file tools are (see _PATH_ARGS).
40
+ # Empty on both sides: no allow-restriction and nothing denied by name. Bash
41
+ # used to be denied here on the grounds that a script can `cd` out of any
42
+ # sandbox root, but containment is now the OS sandbox's job — Local_Bash runs
43
+ # under sandbox-exec/bwrap with only the live GrantSet mounted, and refuses to
44
+ # run at all when no backend is available. Denying it by name only cost
45
+ # capability; it was never what kept it contained.
46
+ #
47
+ # Both lists are still written (empty, not absent), so a seeded agent stays
48
+ # distinguishable from one whose policy was never configured — see
49
+ # ToolsSettings.is_configured.
44
50
  #
45
51
  # Tuples, not lists: a module-level mutable default is one `.append()` away
46
52
  # from leaking into every config that shares it.
47
53
  DEFAULT_TOOL_ALLOW: Final[tuple[str, ...]] = ()
48
- DEFAULT_TOOL_DENY: Final[tuple[str, ...]] = ("Local_Bash",)
54
+ DEFAULT_TOOL_DENY: Final[tuple[str, ...]] = ()
49
55
 
50
56
  # Path-bearing argument name per tool. Keys are the runtime tool names the
51
57
  # composite manager exposes (Local_* prefix). Values are the JSON input key
52
58
  # whose value is a filesystem path. Tools not in this map are not path-checked.
53
59
  #
54
- # Bash takes a `cwd` but we don't sandbox it here — the script itself can
55
- # always `cd` out of any configured cwd, so the correct policy is to keep
56
- # Bash denied. This map intentionally omits it.
60
+ # Bash takes a `cwd` but is not path-checked here — a script can `cd` anywhere,
61
+ # so a pre-flight argument check proves nothing. Its containment is the OS
62
+ # sandbox in cade_mcp_local.tools.shell. This map intentionally omits it.
57
63
  _PATH_ARGS: dict[str, str] = {
58
64
  "Local_ReadFile": "file_path",
59
65
  "Local_WriteFile": "file_path",
@@ -178,11 +184,11 @@ def default_tool_settings() -> ToolsSettings:
178
184
  policy another agent was seeded with.
179
185
 
180
186
  Returns:
181
- Settings permitting every tool except ``Local_Bash``.
187
+ Settings permitting every tool.
182
188
 
183
189
  Example:
184
190
  >>> settings = default_tool_settings()
185
- >>> is_tool_allowed("Slack_SendMessage", settings.allow or [], settings.deny or [])
191
+ >>> is_tool_allowed("Local_Bash", settings.allow or [], settings.deny or [])
186
192
  True
187
193
  """
188
194
  return ToolsSettings(allow=list(DEFAULT_TOOL_ALLOW), deny=list(DEFAULT_TOOL_DENY))
@@ -237,11 +243,12 @@ def install_allowlist_hook(
237
243
  log.debug(f"Replaced {removed} existing {HOOK_NAME!r} hook(s)")
238
244
 
239
245
  if not tools.allow and not tools.deny:
240
- log.warning(
241
- "serve tool allow and deny are BOTH empty — bot has access to every "
242
- "configured tool, including Local_Bash. Add patterns to [tools].deny "
243
- "(or [tools].allow) in the agent's config file, then run: "
244
- "cade daemon restart"
246
+ log.info(
247
+ "serve tool policy is unrestricted (the shipped default) — every "
248
+ "configured tool is reachable, including Local_Bash, which runs "
249
+ "OS-sandboxed against the agent's granted paths. To narrow it, add "
250
+ "patterns to [tools].allow or [tools].deny in the agent's config "
251
+ "file, then run: cade daemon restart"
245
252
  )
246
253
 
247
254
  hook = CallbackHook(
@@ -29,16 +29,6 @@ TASKS_URI = "tasks://"
29
29
  TASK_TEMPLATE = "tasks://{task_id}"
30
30
  FILESYSTEM_URI = "filesystem://"
31
31
 
32
- # Pre-0.16.21 branded URIs. Still registered + accepted so hosts that have not
33
- # re-run ``cade mcp install-hosts`` keep working after upgrade.
34
- LEGACY_THREADS_URI = "cade://threads"
35
- LEGACY_THREAD_TEMPLATE = "cade://thread/{thread_id}"
36
- LEGACY_MEMORY_URI = "cade://memory"
37
- LEGACY_MEMORY_SOURCES_URI = "cade://memory/sources"
38
- LEGACY_TASKS_URI = "cade://tasks"
39
- LEGACY_TASK_TEMPLATE = "cade://tasks/{task_id}"
40
- LEGACY_FILESYSTEM_URI = "cade://filesystem"
41
-
42
32
 
43
33
  def thread_uri(thread_id: str) -> str:
44
34
  """The concrete ``thread://{id}`` URI for one thread."""
@@ -48,13 +38,6 @@ def thread_uri(thread_id: str) -> str:
48
38
  __all__ = [
49
39
  "CANONICAL_ASK",
50
40
  "FILESYSTEM_URI",
51
- "LEGACY_FILESYSTEM_URI",
52
- "LEGACY_MEMORY_SOURCES_URI",
53
- "LEGACY_MEMORY_URI",
54
- "LEGACY_TASKS_URI",
55
- "LEGACY_TASK_TEMPLATE",
56
- "LEGACY_THREADS_URI",
57
- "LEGACY_THREAD_TEMPLATE",
58
41
  "MCP_SURFACE",
59
42
  "MEMORY_SOURCES_URI",
60
43
  "MEMORY_URI",
@@ -44,12 +44,6 @@ _RESOURCE_GROUP: list[tuple[str, str]] = [
44
44
  ("memory://", GROUP_RESOURCES),
45
45
  ("filesystem://", GROUP_RESOURCES),
46
46
  ("file://", GROUP_RESOURCES),
47
- # Pre-0.16.21 branded URIs (still accepted for upgrade compatibility).
48
- ("cade://threads", GROUP_RESOURCES),
49
- ("cade://thread/", GROUP_RESOURCES),
50
- ("cade://tasks", GROUP_RESOURCES),
51
- ("cade://memory", GROUP_RESOURCES),
52
- ("cade://filesystem", GROUP_RESOURCES),
53
47
  ]
54
48
 
55
49
 
@@ -21,13 +21,6 @@ from arcade_mcp_server.context import get_current_model_context
21
21
  from cadecoder.core.logging import log
22
22
  from cadecoder.daemon.gateway.constants import (
23
23
  FILESYSTEM_URI,
24
- LEGACY_FILESYSTEM_URI,
25
- LEGACY_MEMORY_SOURCES_URI,
26
- LEGACY_MEMORY_URI,
27
- LEGACY_TASK_TEMPLATE,
28
- LEGACY_TASKS_URI,
29
- LEGACY_THREAD_TEMPLATE,
30
- LEGACY_THREADS_URI,
31
24
  MCP_SURFACE,
32
25
  MEMORY_SOURCES_URI,
33
26
  MEMORY_URI,
@@ -311,25 +304,6 @@ def register_gateway_resources(app: Any) -> None:
311
304
  mime_type="application/json",
312
305
  handler=lambda _uri: filesystem_payload(),
313
306
  )
314
- # Legacy cade:// aliases — same handlers so hosts that have not refreshed
315
- # skills/rules after upgrade keep working.
316
- for legacy_uri, name, handler in (
317
- (LEGACY_THREADS_URI, "threads-legacy", lambda _uri: threads_payload()),
318
- (LEGACY_THREAD_TEMPLATE, "thread-legacy", thread_payload),
319
- (LEGACY_MEMORY_URI, "memory-legacy", lambda _uri: memory_payload()),
320
- (LEGACY_MEMORY_SOURCES_URI, "memory-sources-legacy", lambda _uri: memory_sources_payload()),
321
- (LEGACY_TASKS_URI, "tasks-legacy", lambda _uri: tasks_payload()),
322
- (LEGACY_TASK_TEMPLATE, "task-legacy", task_payload),
323
- (LEGACY_FILESYSTEM_URI, "filesystem-legacy", lambda _uri: filesystem_payload()),
324
- ):
325
- app.add_resource(
326
- legacy_uri,
327
- name=name,
328
- title=name,
329
- description="Legacy cade:// alias; prefer the plain-named URI.",
330
- mime_type="application/json",
331
- handler=handler,
332
- )
333
307
  log.debug("registered gateway thread/memory/tasks/filesystem resources")
334
308
 
335
309
 
@@ -26,7 +26,6 @@ from collections.abc import Awaitable, Callable
26
26
 
27
27
  from cadecoder.core.logging import log
28
28
  from cadecoder.daemon.gateway.constants import (
29
- LEGACY_THREADS_URI,
30
29
  THREADS_URI,
31
30
  thread_uri,
32
31
  )
@@ -115,14 +114,7 @@ class ThreadUpdateBus:
115
114
  registry, emit, loop = self._registry, self._emit, self._loop
116
115
  if registry is None or emit is None or loop is None:
117
116
  return
118
- # Legacy cade:// URIs stay in the fan-out so hosts subscribed before
119
- # the 0.16.21 rename keep receiving updates until they reinstall.
120
- uris = (
121
- thread_uri(thread_id),
122
- THREADS_URI,
123
- f"cade://thread/{thread_id}",
124
- LEGACY_THREADS_URI,
125
- )
117
+ uris = (thread_uri(thread_id), THREADS_URI)
126
118
  targets: list[tuple[str, str]] = []
127
119
  for uri in uris:
128
120
  for session_id in registry.sessions_for(uri):
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cade",
3
3
  "description": "Your persistent on-device agent: notes memory, durable tasks, and connected tools via Ask.",
4
- "version": "0.18.0",
4
+ "version": "0.19.0",
5
5
  "author": {
6
6
  "name": "Arcade.dev",
7
7
  "url": "https://docs.cade.dev"
@@ -2,7 +2,7 @@
2
2
  "name": "cade",
3
3
  "displayName": "Cade",
4
4
  "description": "Your persistent on-device agent: notes memory, durable tasks, and connected tools via Ask.",
5
- "version": "0.18.0",
5
+ "version": "0.19.0",
6
6
  "author": {
7
7
  "name": "Arcade.dev",
8
8
  "email": "support@arcade.dev"
@@ -30,7 +30,9 @@ def _mcp_servers_from_file(path: Path) -> dict[str, Any] | None:
30
30
  return None
31
31
  if not isinstance(data, dict):
32
32
  return None
33
- servers = data.get("mcpServers") or data.get("mcp")
33
+ # "servers" is VS Code's spelling; without it the doctor skips that host
34
+ # silently, so neither a missing entry nor a stale endpoint is ever caught.
35
+ servers = data.get("mcpServers") or data.get("mcp") or data.get("servers")
34
36
  return servers if isinstance(servers, dict) else None
35
37
 
36
38
 
@@ -16,20 +16,19 @@
16
16
  # support globs (`Local_*`), regex (`/^Local_Task/`), and pipe lists
17
17
  # (`Local_ReadFile|Local_ListFiles`).
18
18
  #
19
- # The shipped default below is "every tool except Local_Bash". Narrow it by
20
- # adding patterns to `allow` (e.g. ["Local_*", "Memory_*"]) if you want this
21
- # agent restricted to a subset.
19
+ # The shipped default below allows every tool. Narrow it by adding patterns to
20
+ # `allow` (e.g. ["Local_*", "Memory_*"]) if you want this agent restricted to a
21
+ # subset, or to `deny` to block specific tools.
22
22
  #
23
23
  # Every Local_* call that takes a filesystem path is also sandboxed to the
24
24
  # agent's workspace. Absolute paths, `..` traversal, and symlinks that resolve
25
- # outside it are rejected before the tool runs. Local_ScratchBash is always
26
- # safe (isolated scratch dir); workspace Local_Bash stays opt-in here.
25
+ # outside it are rejected before the tool runs. Both shell tools are contained
26
+ # by the OS sandbox instead: Local_ScratchBash sees only an isolated scratch
27
+ # dir (network off), and Local_Bash mounts just the agent's granted paths.
27
28
  #
28
29
  # Removing this whole table restores the default on the next `cade daemon init`.
29
- # Leaving it here with both lists empty is a deliberate "no restrictions at
30
- # all" and is preserved as-is.
31
30
  allow = []
32
- deny = ["Local_Bash"]
31
+ deny = []
33
32
 
34
33
  [adapters.telegram]
35
34
  enabled = false
@@ -26,11 +26,31 @@ warnings.filterwarnings(
26
26
  category=DeprecationWarning,
27
27
  )
28
28
 
29
+ from typing import TYPE_CHECKING, Any # noqa: E402
30
+
29
31
  from cadecoder.voice.cleanup import strip_for_speech # noqa: E402
30
- from cadecoder.voice.session import VoiceChatSession, run_voice_session # noqa: E402
32
+
33
+ if TYPE_CHECKING:
34
+ from cadecoder.voice.session import VoiceChatSession, run_voice_session
31
35
 
32
36
  __all__ = [
33
37
  "VoiceChatSession",
34
38
  "run_voice_session",
35
39
  "strip_for_speech",
36
40
  ]
41
+
42
+ # The session module pulls in sounddevice and the MLX stack, which only ship
43
+ # with the optional ``voice`` extra. Importing it here made the whole package
44
+ # unimportable without them — including ``cleanup``, which is pure text and
45
+ # needs nothing. Resolve the heavy names on first access instead, so
46
+ # ``from cadecoder.voice import run_voice_session`` still works unchanged.
47
+ _LAZY = frozenset({"VoiceChatSession", "run_voice_session"})
48
+
49
+
50
+ def __getattr__(name: str) -> Any:
51
+ """Import the audio-dependent exports on demand (PEP 562)."""
52
+ if name in _LAZY:
53
+ from cadecoder.voice import session
54
+
55
+ return getattr(session, name)
56
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
File without changes
File without changes