agent-cli 0.67.1__tar.gz → 0.68.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 (363) hide show
  1. {agent_cli-0.67.1 → agent_cli-0.68.0}/PKG-INFO +11 -4
  2. {agent_cli-0.67.1 → agent_cli-0.68.0}/README.md +8 -1
  3. agent_cli-0.68.0/agent_cli/_requirements/mlx-whisper.txt +215 -0
  4. agent_cli-0.68.0/agent_cli/core/deps.py +191 -0
  5. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/utils.py +2 -2
  6. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/install/extras.py +38 -20
  7. {agent_cli-0.67.1 → agent_cli-0.68.0}/pyproject.toml +2 -2
  8. agent_cli-0.68.0/tests/test_requires_extras.py +285 -0
  9. {agent_cli-0.67.1 → agent_cli-0.68.0}/uv.lock +16 -72
  10. agent_cli-0.67.1/agent_cli/_requirements/mlx-whisper.txt +0 -256
  11. agent_cli-0.67.1/agent_cli/core/deps.py +0 -139
  12. agent_cli-0.67.1/tests/test_requires_extras.py +0 -62
  13. {agent_cli-0.67.1 → agent_cli-0.68.0}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  14. {agent_cli-0.67.1 → agent_cli-0.68.0}/.claude/skills/agent-cli-dev/examples.md +0 -0
  15. {agent_cli-0.67.1 → agent_cli-0.68.0}/.claude-plugin/README.md +0 -0
  16. {agent_cli-0.67.1 → agent_cli-0.68.0}/.claude-plugin/marketplace.json +0 -0
  17. {agent_cli-0.67.1 → agent_cli-0.68.0}/.claude-plugin/plugin.json +0 -0
  18. {agent_cli-0.67.1 → agent_cli-0.68.0}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  19. {agent_cli-0.67.1 → agent_cli-0.68.0}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  20. {agent_cli-0.67.1 → agent_cli-0.68.0}/.cursorrules +0 -0
  21. {agent_cli-0.67.1 → agent_cli-0.68.0}/.env.example +0 -0
  22. {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/logo.svg +0 -0
  23. {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/release-drafter.yml +0 -0
  24. {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/renovate.json +0 -0
  25. {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/scripts/check_extras_sync.py +0 -0
  26. {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/scripts/sync_requirements.py +0 -0
  27. {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/workflows/automerge.yml +0 -0
  28. {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/workflows/docker.yml +0 -0
  29. {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/workflows/docs.yml +0 -0
  30. {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/workflows/markdown-code-runner.yml +0 -0
  31. {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/workflows/pytest.yml +0 -0
  32. {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/workflows/release-drafter.yml +0 -0
  33. {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/workflows/release.yml +0 -0
  34. {agent_cli-0.67.1 → agent_cli-0.68.0}/.github/workflows/toc.yaml +0 -0
  35. {agent_cli-0.67.1 → agent_cli-0.68.0}/.gitignore +0 -0
  36. {agent_cli-0.67.1 → agent_cli-0.68.0}/.jscpd.json +0 -0
  37. {agent_cli-0.67.1 → agent_cli-0.68.0}/.pre-commit-config.yaml +0 -0
  38. {agent_cli-0.67.1 → agent_cli-0.68.0}/.prompts/docs-review.md +0 -0
  39. {agent_cli-0.67.1 → agent_cli-0.68.0}/.prompts/pr-review.md +0 -0
  40. {agent_cli-0.67.1 → agent_cli-0.68.0}/CLAUDE.md +0 -0
  41. {agent_cli-0.67.1 → agent_cli-0.68.0}/LICENSE +0 -0
  42. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/__init__.py +0 -0
  43. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/__main__.py +0 -0
  44. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_extras.json +0 -0
  45. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/.gitkeep +0 -0
  46. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/audio.txt +0 -0
  47. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/faster-whisper.txt +0 -0
  48. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/kokoro.txt +0 -0
  49. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/llm.txt +0 -0
  50. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/memory.txt +0 -0
  51. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/piper.txt +0 -0
  52. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/rag.txt +0 -0
  53. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/server.txt +0 -0
  54. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/speed.txt +0 -0
  55. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_requirements/vad.txt +0 -0
  56. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/_tools.py +0 -0
  57. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/__init__.py +0 -0
  58. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/_voice_agent_common.py +0 -0
  59. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/assistant.py +0 -0
  60. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/autocorrect.py +0 -0
  61. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/chat.py +0 -0
  62. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/memory/__init__.py +0 -0
  63. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/memory/add.py +0 -0
  64. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/memory/proxy.py +0 -0
  65. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/rag_proxy.py +0 -0
  66. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/speak.py +0 -0
  67. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/transcribe.py +0 -0
  68. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/transcribe_daemon.py +0 -0
  69. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/agents/voice_edit.py +0 -0
  70. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/api.py +0 -0
  71. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/cli.py +0 -0
  72. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/config.py +0 -0
  73. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/config_cmd.py +0 -0
  74. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/constants.py +0 -0
  75. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/__init__.py +0 -0
  76. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/audio.py +0 -0
  77. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/audio_format.py +0 -0
  78. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/chroma.py +0 -0
  79. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/openai_proxy.py +0 -0
  80. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/process.py +0 -0
  81. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/reranker.py +0 -0
  82. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/sse.py +0 -0
  83. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/transcription_logger.py +0 -0
  84. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/vad.py +0 -0
  85. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/core/watch.py +0 -0
  86. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/__init__.py +0 -0
  87. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/cli.py +0 -0
  88. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/__init__.py +0 -0
  89. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/aider.py +0 -0
  90. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/base.py +0 -0
  91. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/claude.py +0 -0
  92. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/codex.py +0 -0
  93. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  94. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/copilot.py +0 -0
  95. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  96. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/gemini.py +0 -0
  97. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/opencode.py +0 -0
  98. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/coding_agents/registry.py +0 -0
  99. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/__init__.py +0 -0
  100. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/base.py +0 -0
  101. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/cursor.py +0 -0
  102. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/emacs.py +0 -0
  103. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/jetbrains.py +0 -0
  104. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/nano.py +0 -0
  105. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/neovim.py +0 -0
  106. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/registry.py +0 -0
  107. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/sublime.py +0 -0
  108. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/vim.py +0 -0
  109. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/vscode.py +0 -0
  110. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/editors/zed.py +0 -0
  111. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/project.py +0 -0
  112. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/registry.py +0 -0
  113. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/skill/SKILL.md +0 -0
  114. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/skill/examples.md +0 -0
  115. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/__init__.py +0 -0
  116. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  117. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/base.py +0 -0
  118. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/gnome.py +0 -0
  119. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/iterm2.py +0 -0
  120. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/kitty.py +0 -0
  121. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/registry.py +0 -0
  122. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/tmux.py +0 -0
  123. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/warp.py +0 -0
  124. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/terminals/zellij.py +0 -0
  125. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/dev/worktree.py +0 -0
  126. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/docs_gen.py +0 -0
  127. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/example-config.toml +0 -0
  128. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/install/__init__.py +0 -0
  129. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/install/common.py +0 -0
  130. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/install/hotkeys.py +0 -0
  131. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/install/services.py +0 -0
  132. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/__init__.py +0 -0
  133. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_files.py +0 -0
  134. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_filters.py +0 -0
  135. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_git.py +0 -0
  136. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_indexer.py +0 -0
  137. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_ingest.py +0 -0
  138. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_persistence.py +0 -0
  139. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_prompt.py +0 -0
  140. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_retrieval.py +0 -0
  141. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_store.py +0 -0
  142. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_streaming.py +0 -0
  143. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/_tasks.py +0 -0
  144. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/api.py +0 -0
  145. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/client.py +0 -0
  146. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/engine.py +0 -0
  147. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/entities.py +0 -0
  148. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/memory/models.py +0 -0
  149. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/opts.py +0 -0
  150. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/py.typed +0 -0
  151. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/__init__.py +0 -0
  152. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/_indexer.py +0 -0
  153. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/_indexing.py +0 -0
  154. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/_prompt.py +0 -0
  155. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/_retriever.py +0 -0
  156. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/_store.py +0 -0
  157. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/_utils.py +0 -0
  158. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/api.py +0 -0
  159. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/client.py +0 -0
  160. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/engine.py +0 -0
  161. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/rag/models.py +0 -0
  162. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  163. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/__init__.py +0 -0
  164. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/check_plugin_skill_sync.py +0 -0
  165. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  166. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  167. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  168. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  169. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  170. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  171. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  172. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  173. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  174. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  175. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  176. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  177. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  178. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  179. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/run-openwakeword.sh +0 -0
  180. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/run-piper-windows.ps1 +0 -0
  181. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/run-piper.sh +0 -0
  182. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/run-whisper-linux.sh +0 -0
  183. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/run-whisper-macos.sh +0 -0
  184. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/run-whisper-windows.ps1 +0 -0
  185. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/run-whisper.sh +0 -0
  186. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/run_faster_whisper_server.py +0 -0
  187. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  188. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/setup-linux.sh +0 -0
  189. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  190. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/setup-macos.sh +0 -0
  191. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/setup-windows.ps1 +0 -0
  192. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  193. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/start-all-services.sh +0 -0
  194. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/scripts/sync_extras.py +0 -0
  195. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/__init__.py +0 -0
  196. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/cli.py +0 -0
  197. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/common.py +0 -0
  198. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/model_manager.py +0 -0
  199. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/model_registry.py +0 -0
  200. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/proxy/__init__.py +0 -0
  201. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/proxy/api.py +0 -0
  202. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/streaming.py +0 -0
  203. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/__init__.py +0 -0
  204. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/api.py +0 -0
  205. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/backends/__init__.py +0 -0
  206. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/backends/base.py +0 -0
  207. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/backends/kokoro.py +0 -0
  208. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/backends/piper.py +0 -0
  209. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/model_manager.py +0 -0
  210. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/model_registry.py +0 -0
  211. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/tts/wyoming_handler.py +0 -0
  212. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/__init__.py +0 -0
  213. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/api.py +0 -0
  214. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/backends/__init__.py +0 -0
  215. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/backends/base.py +0 -0
  216. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  217. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/backends/mlx.py +0 -0
  218. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/languages.py +0 -0
  219. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/model_manager.py +0 -0
  220. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/model_registry.py +0 -0
  221. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  222. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/services/__init__.py +0 -0
  223. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/services/_wyoming_utils.py +0 -0
  224. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/services/asr.py +0 -0
  225. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/services/llm.py +0 -0
  226. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/services/tts.py +0 -0
  227. {agent_cli-0.67.1 → agent_cli-0.68.0}/agent_cli/services/wake_word.py +0 -0
  228. {agent_cli-0.67.1 → agent_cli-0.68.0}/docker/docker-compose.yml +0 -0
  229. {agent_cli-0.67.1 → agent_cli-0.68.0}/docker/transcription-proxy.Dockerfile +0 -0
  230. {agent_cli-0.67.1 → agent_cli-0.68.0}/docker/tts.Dockerfile +0 -0
  231. {agent_cli-0.67.1 → agent_cli-0.68.0}/docker/whisper.Dockerfile +0 -0
  232. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/CNAME +0 -0
  233. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/architecture/index.md +0 -0
  234. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/architecture/memory.md +0 -0
  235. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/architecture/rag.md +0 -0
  236. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/assistant.md +0 -0
  237. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/autocorrect.md +0 -0
  238. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/chat.md +0 -0
  239. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/config.md +0 -0
  240. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/dev.md +0 -0
  241. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/index.md +0 -0
  242. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/install-extras.md +0 -0
  243. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/install-hotkeys.md +0 -0
  244. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/install-services.md +0 -0
  245. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/memory.md +0 -0
  246. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/rag-proxy.md +0 -0
  247. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/server/index.md +0 -0
  248. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/server/transcription-proxy.md +0 -0
  249. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/server/tts.md +0 -0
  250. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/server/whisper.md +0 -0
  251. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/speak.md +0 -0
  252. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/start-services.md +0 -0
  253. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/transcribe-daemon.md +0 -0
  254. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/transcribe.md +0 -0
  255. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/commands/voice-edit.md +0 -0
  256. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/configuration.md +0 -0
  257. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/getting-started.md +0 -0
  258. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/iOS_Shortcut_Guide.md +0 -0
  259. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/index.md +0 -0
  260. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/installation/docker.md +0 -0
  261. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/installation/index.md +0 -0
  262. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/installation/linux.md +0 -0
  263. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/installation/macos.md +0 -0
  264. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/installation/nixos.md +0 -0
  265. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/installation/windows.md +0 -0
  266. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/logo-clean.svg +0 -0
  267. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  268. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/run_markdown_code_runner.py +0 -0
  269. {agent_cli-0.67.1 → agent_cli-0.68.0}/docs/system-integration.md +0 -0
  270. {agent_cli-0.67.1 → agent_cli-0.68.0}/example.agent-cli-config.toml +0 -0
  271. {agent_cli-0.67.1 → agent_cli-0.68.0}/justfile +0 -0
  272. {agent_cli-0.67.1 → agent_cli-0.68.0}/shell.nix +0 -0
  273. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/__init__.py +0 -0
  274. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/__init__.py +0 -0
  275. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_fix_my_text.py +0 -0
  276. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_interactive.py +0 -0
  277. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_interactive_extra.py +0 -0
  278. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_memory_add.py +0 -0
  279. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_speak.py +0 -0
  280. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_speak_e2e.py +0 -0
  281. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_transcribe.py +0 -0
  282. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_transcribe_agent.py +0 -0
  283. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_transcribe_daemon.py +0 -0
  284. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_transcribe_e2e.py +0 -0
  285. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_transcribe_recovery.py +0 -0
  286. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_tts_common.py +0 -0
  287. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_tts_common_extra.py +0 -0
  288. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_voice_agent_common.py +0 -0
  289. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_voice_edit.py +0 -0
  290. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_voice_edit_e2e.py +0 -0
  291. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/agents/test_wake_word_assistant.py +0 -0
  292. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/conftest.py +0 -0
  293. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/core/__init__.py +0 -0
  294. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/core/test_audio_format.py +0 -0
  295. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/core/test_chroma.py +0 -0
  296. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/core/test_sse.py +0 -0
  297. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/core/test_vad.py +0 -0
  298. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/core/test_watch.py +0 -0
  299. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/dev/__init__.py +0 -0
  300. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/dev/test_cli.py +0 -0
  301. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/dev/test_coding_agents.py +0 -0
  302. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/dev/test_editors.py +0 -0
  303. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/dev/test_project.py +0 -0
  304. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/dev/test_terminals.py +0 -0
  305. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/dev/test_verification.py +0 -0
  306. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/dev/test_worktree.py +0 -0
  307. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/install/__init__.py +0 -0
  308. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/install/test_extras.py +0 -0
  309. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/__init__.py +0 -0
  310. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_api_health.py +0 -0
  311. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_api_integration_liveish.py +0 -0
  312. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_client.py +0 -0
  313. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_engine.py +0 -0
  314. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_files.py +0 -0
  315. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_filters.py +0 -0
  316. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_git_integration.py +0 -0
  317. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_indexer.py +0 -0
  318. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_memory_integration.py +0 -0
  319. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_proxy_passthrough.py +0 -0
  320. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_store.py +0 -0
  321. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/memory/test_utils.py +0 -0
  322. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/mocks/__init__.py +0 -0
  323. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/mocks/audio.py +0 -0
  324. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/mocks/llm.py +0 -0
  325. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/mocks/wyoming.py +0 -0
  326. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/__init__.py +0 -0
  327. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_api.py +0 -0
  328. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_engine.py +0 -0
  329. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_history.py +0 -0
  330. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_indexer.py +0 -0
  331. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_indexing.py +0 -0
  332. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_rag_client.py +0 -0
  333. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_rag_integration_liveish.py +0 -0
  334. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  335. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_retriever.py +0 -0
  336. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_store.py +0 -0
  337. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/rag/test_utils.py +0 -0
  338. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_api.py +0 -0
  339. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_api_integration.py +0 -0
  340. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_asr.py +0 -0
  341. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_asr_recovery.py +0 -0
  342. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_audio_e2e.py +0 -0
  343. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_cli.py +0 -0
  344. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_config.py +0 -0
  345. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_config_cmd.py +0 -0
  346. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_docs_gen.py +0 -0
  347. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_env_vars.py +0 -0
  348. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_json_output.py +0 -0
  349. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_llm.py +0 -0
  350. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_llm_gemini.py +0 -0
  351. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_memory_tools.py +0 -0
  352. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_mlx_backend.py +0 -0
  353. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_process_manager.py +0 -0
  354. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_server_streaming.py +0 -0
  355. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_server_tts.py +0 -0
  356. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_server_whisper.py +0 -0
  357. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_services.py +0 -0
  358. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_tools.py +0 -0
  359. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_tts.py +0 -0
  360. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_utils.py +0 -0
  361. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_wake_word.py +0 -0
  362. {agent_cli-0.67.1 → agent_cli-0.68.0}/tests/test_wyoming_utils.py +0 -0
  363. {agent_cli-0.67.1 → agent_cli-0.68.0}/zensical.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.67.1
3
+ Version: 0.68.0
4
4
  Summary: A suite of AI-powered command-line tools for text correction, audio transcription, and voice assistance.
5
5
  Project-URL: Homepage, https://github.com/basnijholt/agent-cli
6
6
  Author-email: Bas Nijholt <bas@nijho.lt>
@@ -52,8 +52,8 @@ Requires-Dist: pyyaml>=6.0.0; extra == 'memory'
52
52
  Requires-Dist: transformers>=4.30.0; extra == 'memory'
53
53
  Requires-Dist: watchfiles>=0.21.0; extra == 'memory'
54
54
  Provides-Extra: mlx-whisper
55
- Requires-Dist: fastapi[standard]; extra == 'mlx-whisper'
56
- Requires-Dist: mlx-whisper>=0.4.0; extra == 'mlx-whisper'
55
+ Requires-Dist: fastapi[standard]; (sys_platform == 'darwin' and platform_machine == 'arm64') and extra == 'mlx-whisper'
56
+ Requires-Dist: mlx-whisper>=0.4.0; (sys_platform == 'darwin' and platform_machine == 'arm64') and extra == 'mlx-whisper'
57
57
  Provides-Extra: piper
58
58
  Requires-Dist: fastapi[standard]; extra == 'piper'
59
59
  Requires-Dist: piper-tts>=1.2.0; extra == 'piper'
@@ -459,7 +459,14 @@ All necessary scripts are bundled with the package, so you can run these command
459
459
 
460
460
  #### Installing Optional Extras
461
461
 
462
- Some features require additional Python dependencies. Use `install-extras` to install them with pinned versions:
462
+ Some features require additional Python dependencies. By default, **agent-cli will auto-install missing extras** when you run a command that needs them. To disable this, set `AGENT_CLI_NO_AUTO_INSTALL=1` or add to your config file:
463
+
464
+ ```toml
465
+ [settings]
466
+ auto_install_extras = false
467
+ ```
468
+
469
+ You can also manually install extras with `install-extras`:
463
470
 
464
471
  ```bash
465
472
  # List available extras
@@ -377,7 +377,14 @@ All necessary scripts are bundled with the package, so you can run these command
377
377
 
378
378
  #### Installing Optional Extras
379
379
 
380
- Some features require additional Python dependencies. Use `install-extras` to install them with pinned versions:
380
+ Some features require additional Python dependencies. By default, **agent-cli will auto-install missing extras** when you run a command that needs them. To disable this, set `AGENT_CLI_NO_AUTO_INSTALL=1` or add to your config file:
381
+
382
+ ```toml
383
+ [settings]
384
+ auto_install_extras = false
385
+ ```
386
+
387
+ You can also manually install extras with `install-extras`:
381
388
 
382
389
  ```bash
383
390
  # List available extras
@@ -0,0 +1,215 @@
1
+ # This file was autogenerated by uv via the following command:
2
+ # uv export --extra mlx-whisper --no-dev --no-emit-project --no-hashes
3
+ annotated-doc==0.0.4 ; platform_machine == 'arm64' and sys_platform == 'darwin'
4
+ # via fastapi
5
+ annotated-types==0.7.0
6
+ # via pydantic
7
+ anyio==4.12.1
8
+ # via
9
+ # httpx
10
+ # starlette
11
+ # watchfiles
12
+ certifi==2026.1.4
13
+ # via
14
+ # httpcore
15
+ # httpx
16
+ # requests
17
+ # sentry-sdk
18
+ charset-normalizer==3.4.4 ; platform_machine == 'arm64' and sys_platform == 'darwin'
19
+ # via requests
20
+ click==8.3.1
21
+ # via
22
+ # rich-toolkit
23
+ # typer
24
+ # uvicorn
25
+ colorama==0.4.6 ; sys_platform == 'win32'
26
+ # via
27
+ # click
28
+ # tqdm
29
+ # uvicorn
30
+ dnspython==2.8.0
31
+ # via email-validator
32
+ dotenv==0.9.9
33
+ # via agent-cli
34
+ email-validator==2.3.0
35
+ # via
36
+ # fastapi
37
+ # pydantic
38
+ fastapi==0.128.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
39
+ # via agent-cli
40
+ fastapi-cli==0.0.20 ; platform_machine == 'arm64' and sys_platform == 'darwin'
41
+ # via fastapi
42
+ fastapi-cloud-cli==0.10.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
43
+ # via fastapi-cli
44
+ fastar==0.8.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
45
+ # via fastapi-cloud-cli
46
+ filelock==3.20.3 ; platform_machine == 'arm64' and sys_platform == 'darwin'
47
+ # via
48
+ # huggingface-hub
49
+ # torch
50
+ fsspec==2026.1.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
51
+ # via
52
+ # huggingface-hub
53
+ # torch
54
+ h11==0.16.0
55
+ # via
56
+ # httpcore
57
+ # uvicorn
58
+ hf-xet==1.2.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
59
+ # via huggingface-hub
60
+ httpcore==1.0.9
61
+ # via httpx
62
+ httptools==0.7.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
63
+ # via uvicorn
64
+ httpx==0.28.1
65
+ # via
66
+ # agent-cli
67
+ # fastapi
68
+ # fastapi-cloud-cli
69
+ huggingface-hub==0.36.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
70
+ # via mlx-whisper
71
+ idna==3.11
72
+ # via
73
+ # anyio
74
+ # email-validator
75
+ # httpx
76
+ # requests
77
+ jinja2==3.1.6 ; platform_machine == 'arm64' and sys_platform == 'darwin'
78
+ # via
79
+ # fastapi
80
+ # torch
81
+ llvmlite==0.46.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
82
+ # via numba
83
+ markdown-it-py==4.0.0
84
+ # via rich
85
+ markupsafe==3.0.3 ; platform_machine == 'arm64' and sys_platform == 'darwin'
86
+ # via jinja2
87
+ mdurl==0.1.2
88
+ # via markdown-it-py
89
+ mlx==0.30.3 ; platform_machine == 'arm64' and sys_platform == 'darwin'
90
+ # via mlx-whisper
91
+ mlx-metal==0.30.3 ; platform_machine == 'arm64' and sys_platform == 'darwin'
92
+ # via mlx
93
+ mlx-whisper==0.4.3 ; platform_machine == 'arm64' and sys_platform == 'darwin'
94
+ # via agent-cli
95
+ more-itertools==10.8.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
96
+ # via mlx-whisper
97
+ mpmath==1.3.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
98
+ # via sympy
99
+ networkx==3.6.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
100
+ # via torch
101
+ numba==0.63.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
102
+ # via mlx-whisper
103
+ numpy==2.3.5 ; platform_machine == 'arm64' and sys_platform == 'darwin'
104
+ # via
105
+ # mlx-whisper
106
+ # numba
107
+ # scipy
108
+ packaging==25.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
109
+ # via huggingface-hub
110
+ psutil==7.2.1 ; sys_platform == 'win32'
111
+ # via agent-cli
112
+ pydantic==2.12.5
113
+ # via
114
+ # agent-cli
115
+ # fastapi
116
+ # fastapi-cloud-cli
117
+ # pydantic-extra-types
118
+ # pydantic-settings
119
+ pydantic-core==2.41.5
120
+ # via pydantic
121
+ pydantic-extra-types==2.11.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
122
+ # via fastapi
123
+ pydantic-settings==2.12.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
124
+ # via fastapi
125
+ pygments==2.19.2
126
+ # via rich
127
+ pyperclip==1.11.0
128
+ # via agent-cli
129
+ python-dotenv==1.2.1
130
+ # via
131
+ # dotenv
132
+ # pydantic-settings
133
+ # uvicorn
134
+ python-multipart==0.0.21 ; platform_machine == 'arm64' and sys_platform == 'darwin'
135
+ # via fastapi
136
+ pyyaml==6.0.3 ; platform_machine == 'arm64' and sys_platform == 'darwin'
137
+ # via
138
+ # huggingface-hub
139
+ # uvicorn
140
+ regex==2026.1.15 ; platform_machine == 'arm64' and sys_platform == 'darwin'
141
+ # via tiktoken
142
+ requests==2.32.5 ; platform_machine == 'arm64' and sys_platform == 'darwin'
143
+ # via
144
+ # huggingface-hub
145
+ # tiktoken
146
+ rich==14.2.0
147
+ # via
148
+ # agent-cli
149
+ # rich-toolkit
150
+ # typer
151
+ rich-toolkit==0.17.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
152
+ # via
153
+ # fastapi-cli
154
+ # fastapi-cloud-cli
155
+ rignore==0.7.6 ; platform_machine == 'arm64' and sys_platform == 'darwin'
156
+ # via fastapi-cloud-cli
157
+ scipy==1.17.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
158
+ # via mlx-whisper
159
+ sentry-sdk==2.49.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
160
+ # via fastapi-cloud-cli
161
+ setproctitle==1.3.7
162
+ # via agent-cli
163
+ setuptools==80.9.0 ; python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin'
164
+ # via torch
165
+ shellingham==1.5.4
166
+ # via typer
167
+ starlette==0.50.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
168
+ # via fastapi
169
+ sympy==1.14.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
170
+ # via torch
171
+ tiktoken==0.12.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
172
+ # via mlx-whisper
173
+ torch==2.9.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
174
+ # via mlx-whisper
175
+ tqdm==4.67.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
176
+ # via
177
+ # huggingface-hub
178
+ # mlx-whisper
179
+ typer==0.21.1
180
+ # via
181
+ # agent-cli
182
+ # fastapi-cli
183
+ # fastapi-cloud-cli
184
+ typing-extensions==4.15.0
185
+ # via
186
+ # anyio
187
+ # fastapi
188
+ # huggingface-hub
189
+ # pydantic
190
+ # pydantic-core
191
+ # pydantic-extra-types
192
+ # rich-toolkit
193
+ # starlette
194
+ # torch
195
+ # typer
196
+ # typing-inspection
197
+ typing-inspection==0.4.2
198
+ # via
199
+ # pydantic
200
+ # pydantic-settings
201
+ urllib3==2.3.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
202
+ # via
203
+ # requests
204
+ # sentry-sdk
205
+ uvicorn==0.40.0 ; platform_machine == 'arm64' and sys_platform == 'darwin'
206
+ # via
207
+ # fastapi
208
+ # fastapi-cli
209
+ # fastapi-cloud-cli
210
+ uvloop==0.22.1 ; platform_machine == 'arm64' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'
211
+ # via uvicorn
212
+ watchfiles==1.1.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
213
+ # via uvicorn
214
+ websockets==15.0.1 ; platform_machine == 'arm64' and sys_platform == 'darwin'
215
+ # via uvicorn
@@ -0,0 +1,191 @@
1
+ """Helpers for optional dependency checks."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import functools
6
+ import json
7
+ import os
8
+ from importlib.util import find_spec
9
+ from pathlib import Path
10
+ from typing import TYPE_CHECKING, TypeVar
11
+
12
+ import typer
13
+
14
+ from agent_cli.config import load_config
15
+ from agent_cli.core.utils import console, print_error_message
16
+
17
+ if TYPE_CHECKING:
18
+ from collections.abc import Callable
19
+
20
+ F = TypeVar("F", bound="Callable[..., object]")
21
+
22
+
23
+ def _get_auto_install_setting() -> bool:
24
+ """Check if auto-install is enabled (default: True)."""
25
+ if os.environ.get("AGENT_CLI_NO_AUTO_INSTALL", "").lower() in ("1", "true", "yes"):
26
+ return False
27
+ return load_config().get("settings", {}).get("auto_install_extras", True)
28
+
29
+
30
+ # Load extras from JSON file
31
+ _EXTRAS_FILE = Path(__file__).parent.parent / "_extras.json"
32
+ EXTRAS: dict[str, tuple[str, list[str]]] = {
33
+ k: (v[0], v[1]) for k, v in json.loads(_EXTRAS_FILE.read_text()).items()
34
+ }
35
+
36
+
37
+ def _check_package_installed(pkg: str) -> bool:
38
+ """Check if a single package is installed."""
39
+ top_module = pkg.split(".")[0]
40
+ try:
41
+ return find_spec(top_module) is not None
42
+ except (ValueError, ModuleNotFoundError):
43
+ return False
44
+
45
+
46
+ def check_extra_installed(extra: str) -> bool:
47
+ """Check if packages for an extra are installed using find_spec (no actual import).
48
+
49
+ Supports `|` syntax for alternatives: "piper|kokoro" means ANY of these extras.
50
+ For regular extras, ALL packages must be installed.
51
+ """
52
+ # Handle "extra1|extra2" syntax - any of these extras is sufficient
53
+ if "|" in extra:
54
+ return any(check_extra_installed(e) for e in extra.split("|"))
55
+
56
+ if extra not in EXTRAS:
57
+ return False # Unknown extra, trigger install attempt to surface error
58
+ _, packages = EXTRAS[extra]
59
+
60
+ # All packages must be installed
61
+ return all(_check_package_installed(pkg) for pkg in packages)
62
+
63
+
64
+ def _format_extra_item(extra: str) -> str:
65
+ """Format a single extra as a list item with description."""
66
+ desc, _ = EXTRAS.get(extra, ("", []))
67
+ if desc:
68
+ return f" - '{extra}' ({desc})"
69
+ return f" - '{extra}'"
70
+
71
+
72
+ def _format_install_commands(extras: list[str]) -> list[str]:
73
+ """Format install commands for one or more extras."""
74
+ combined = ",".join(extras)
75
+ extras_args = " ".join(extras)
76
+ return [
77
+ "Install with:",
78
+ f' [bold cyan]uv tool install -p 3.13 "agent-cli\\[{combined}]"[/bold cyan]',
79
+ " # or",
80
+ f" [bold cyan]agent-cli install-extras {extras_args}[/bold cyan]",
81
+ ]
82
+
83
+
84
+ def get_install_hint(extra: str) -> str:
85
+ """Get install command hint for a single extra.
86
+
87
+ Supports `|` syntax for alternatives: "piper|kokoro" shows both options.
88
+ """
89
+ # Handle "extra1|extra2" syntax - show all options
90
+ if "|" in extra:
91
+ alternatives = extra.split("|")
92
+ lines = ["This command requires one of:"]
93
+ lines.extend(_format_extra_item(alt) for alt in alternatives)
94
+ lines.append("")
95
+ lines.append("Install one with:")
96
+ lines.extend(
97
+ f' [bold cyan]uv tool install -p 3.13 "agent-cli\\[{alt}]"[/bold cyan]'
98
+ for alt in alternatives
99
+ )
100
+ lines.append(" # or")
101
+ lines.extend(
102
+ f" [bold cyan]agent-cli install-extras {alt}[/bold cyan]" for alt in alternatives
103
+ )
104
+ return "\n".join(lines)
105
+
106
+ desc, _ = EXTRAS.get(extra, ("", []))
107
+ header = f"This command requires the '{extra}' extra"
108
+ if desc:
109
+ header += f" ({desc})"
110
+ header += "."
111
+
112
+ lines = [header, ""]
113
+ lines.extend(_format_install_commands([extra]))
114
+ return "\n".join(lines)
115
+
116
+
117
+ def get_combined_install_hint(extras: list[str]) -> str:
118
+ """Get a combined install hint for multiple missing extras."""
119
+ if len(extras) == 1:
120
+ return get_install_hint(extras[0])
121
+
122
+ lines = ["This command requires the following extras:"]
123
+ lines.extend(_format_extra_item(extra) for extra in extras)
124
+ lines.append("")
125
+ lines.extend(_format_install_commands(extras))
126
+ return "\n".join(lines)
127
+
128
+
129
+ def _try_auto_install(missing: list[str]) -> bool:
130
+ """Attempt to auto-install missing extras. Returns True if successful."""
131
+ from agent_cli.install.extras import install_extras_programmatic # noqa: PLC0415
132
+
133
+ # Flatten alternatives (e.g., "piper|kokoro" -> just pick the first one)
134
+ extras_to_install = []
135
+ for extra in missing:
136
+ if "|" in extra:
137
+ # For alternatives, install the first option
138
+ extras_to_install.append(extra.split("|")[0])
139
+ else:
140
+ extras_to_install.append(extra)
141
+
142
+ console.print(
143
+ f"[yellow]Auto-installing missing extras: {', '.join(extras_to_install)}[/]",
144
+ )
145
+ return install_extras_programmatic(extras_to_install)
146
+
147
+
148
+ def _check_and_install_extras(extras: tuple[str, ...]) -> list[str]:
149
+ """Check for missing extras and attempt auto-install. Returns list of still-missing."""
150
+ missing = [e for e in extras if not check_extra_installed(e)]
151
+ if not missing:
152
+ return []
153
+
154
+ if not _get_auto_install_setting():
155
+ print_error_message(get_combined_install_hint(missing))
156
+ return missing
157
+
158
+ if not _try_auto_install(missing):
159
+ print_error_message("Auto-install failed.\n" + get_combined_install_hint(missing))
160
+ return missing
161
+
162
+ console.print("[green]Installation complete![/]")
163
+ still_missing = [e for e in extras if not check_extra_installed(e)]
164
+ if still_missing:
165
+ print_error_message(
166
+ "Auto-install completed but some dependencies are still missing.\n"
167
+ + get_combined_install_hint(still_missing),
168
+ )
169
+ return still_missing
170
+
171
+
172
+ def requires_extras(*extras: str) -> Callable[[F], F]:
173
+ """Decorator to declare required extras for a command.
174
+
175
+ Auto-installs missing extras by default. Disable via AGENT_CLI_NO_AUTO_INSTALL=1
176
+ or config [settings] auto_install_extras = false.
177
+ """
178
+
179
+ def decorator(func: F) -> F:
180
+ func._required_extras = extras # type: ignore[attr-defined]
181
+
182
+ @functools.wraps(func)
183
+ def wrapper(*args: object, **kwargs: object) -> object:
184
+ if _check_and_install_extras(extras):
185
+ raise typer.Exit(1)
186
+ return func(*args, **kwargs)
187
+
188
+ wrapper._required_extras = extras # type: ignore[attr-defined]
189
+ return wrapper # type: ignore[return-value]
190
+
191
+ return decorator
@@ -211,8 +211,8 @@ def print_output_panel(
211
211
 
212
212
 
213
213
  def print_error_message(message: str, suggestion: str | None = None) -> None:
214
- """Prints an error message in a panel."""
215
- error_text = Text(message)
214
+ """Prints an error message in a panel with rich markup support."""
215
+ error_text = Text.from_markup(message)
216
216
  if suggestion:
217
217
  error_text.append("\n\n")
218
218
  error_text.append(suggestion)
@@ -86,6 +86,38 @@ def _install_cmd() -> list[str]:
86
86
  return cmd
87
87
 
88
88
 
89
+ def _install_extras_impl(extras: list[str], *, quiet: bool = False) -> bool:
90
+ """Install extras. Returns True on success, False on failure."""
91
+ if _is_uv_tool_install():
92
+ current_extras = _get_current_uv_tool_extras()
93
+ new_extras = sorted(set(current_extras) | set(extras))
94
+ return _install_via_uv_tool(new_extras)
95
+
96
+ cmd = _install_cmd()
97
+ for extra in extras:
98
+ req_file = _requirements_path(extra)
99
+ if not quiet:
100
+ console.print(f"Installing [cyan]{extra}[/]...")
101
+ result = subprocess.run(
102
+ [*cmd, "-r", str(req_file)],
103
+ check=False,
104
+ capture_output=quiet,
105
+ )
106
+ if result.returncode != 0:
107
+ return False
108
+ return True
109
+
110
+
111
+ def install_extras_programmatic(extras: list[str], *, quiet: bool = False) -> bool:
112
+ """Install extras programmatically (for auto-install feature)."""
113
+ available = _available_extras()
114
+ valid = [e for e in extras if e in available]
115
+ invalid = [e for e in extras if e not in available]
116
+ if invalid:
117
+ console.print(f"[yellow]Unknown extras (skipped): {', '.join(invalid)}[/]")
118
+ return bool(valid) and _install_extras_impl(valid, quiet=quiet)
119
+
120
+
89
121
  @app.command("install-extras", rich_help_panel="Installation")
90
122
  def install_extras(
91
123
  extras: Annotated[list[str] | None, typer.Argument(help="Extras to install")] = None,
@@ -128,25 +160,11 @@ def install_extras(
128
160
  print_error_message(f"Unknown extras: {invalid}. Use --list to see available.")
129
161
  raise typer.Exit(1)
130
162
 
131
- # If running from uv tool install, reinstall with extras to persist them
163
+ if not _install_extras_impl(extras):
164
+ print_error_message("Failed to install extras")
165
+ raise typer.Exit(1)
166
+
132
167
  if _is_uv_tool_install():
133
- current_extras = _get_current_uv_tool_extras()
134
- new_extras = sorted(set(current_extras) | set(extras))
135
- if not _install_via_uv_tool(new_extras):
136
- print_error_message("Failed to reinstall via uv tool")
137
- raise typer.Exit(1)
138
168
  console.print("[green]Done! Extras will persist across uv tool upgrade.[/]")
139
- return
140
-
141
- # Standard pip/uv pip install for non-tool environments
142
- cmd = _install_cmd()
143
-
144
- for extra in extras:
145
- req_file = _requirements_path(extra)
146
- console.print(f"Installing [cyan]{extra}[/]...")
147
- result = subprocess.run([*cmd, "-r", str(req_file)], check=False)
148
- if result.returncode != 0:
149
- print_error_message(f"Failed to install '{extra}'")
150
- raise typer.Exit(1)
151
-
152
- console.print("[green]Done![/]")
169
+ else:
170
+ console.print("[green]Done![/]")
@@ -65,8 +65,8 @@ faster-whisper = [
65
65
  "faster-whisper>=1.0.0",
66
66
  ]
67
67
  mlx-whisper = [
68
- "fastapi[standard]",
69
- "mlx-whisper>=0.4.0",
68
+ "fastapi[standard]; sys_platform == 'darwin' and platform_machine == 'arm64'",
69
+ "mlx-whisper>=0.4.0; sys_platform == 'darwin' and platform_machine == 'arm64'",
70
70
  ]
71
71
  piper = [
72
72
  "fastapi[standard]",