agent-cli 0.76.0__tar.gz → 0.76.2__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 (367) hide show
  1. {agent_cli-0.76.0 → agent_cli-0.76.2}/PKG-INFO +1 -1
  2. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/core/deps.py +95 -12
  3. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/cli.py +15 -7
  4. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/core/test_vad.py +9 -1
  5. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_requires_extras.py +3 -0
  6. {agent_cli-0.76.0 → agent_cli-0.76.2}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  7. {agent_cli-0.76.0 → agent_cli-0.76.2}/.claude/skills/agent-cli-dev/examples.md +0 -0
  8. {agent_cli-0.76.0 → agent_cli-0.76.2}/.claude-plugin/README.md +0 -0
  9. {agent_cli-0.76.0 → agent_cli-0.76.2}/.claude-plugin/marketplace.json +0 -0
  10. {agent_cli-0.76.0 → agent_cli-0.76.2}/.claude-plugin/plugin.json +0 -0
  11. {agent_cli-0.76.0 → agent_cli-0.76.2}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  12. {agent_cli-0.76.0 → agent_cli-0.76.2}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  13. {agent_cli-0.76.0 → agent_cli-0.76.2}/.cursorrules +0 -0
  14. {agent_cli-0.76.0 → agent_cli-0.76.2}/.dockerignore +0 -0
  15. {agent_cli-0.76.0 → agent_cli-0.76.2}/.env.example +0 -0
  16. {agent_cli-0.76.0 → agent_cli-0.76.2}/.github/logo.svg +0 -0
  17. {agent_cli-0.76.0 → agent_cli-0.76.2}/.github/release-drafter.yml +0 -0
  18. {agent_cli-0.76.0 → agent_cli-0.76.2}/.github/renovate.json +0 -0
  19. {agent_cli-0.76.0 → agent_cli-0.76.2}/.github/scripts/check_extras_sync.py +0 -0
  20. {agent_cli-0.76.0 → agent_cli-0.76.2}/.github/scripts/sync_requirements.py +0 -0
  21. {agent_cli-0.76.0 → agent_cli-0.76.2}/.github/workflows/automerge.yml +0 -0
  22. {agent_cli-0.76.0 → agent_cli-0.76.2}/.github/workflows/docker.yml +0 -0
  23. {agent_cli-0.76.0 → agent_cli-0.76.2}/.github/workflows/docs.yml +0 -0
  24. {agent_cli-0.76.0 → agent_cli-0.76.2}/.github/workflows/markdown-code-runner.yml +0 -0
  25. {agent_cli-0.76.0 → agent_cli-0.76.2}/.github/workflows/pytest.yml +0 -0
  26. {agent_cli-0.76.0 → agent_cli-0.76.2}/.github/workflows/release-drafter.yml +0 -0
  27. {agent_cli-0.76.0 → agent_cli-0.76.2}/.github/workflows/release.yml +0 -0
  28. {agent_cli-0.76.0 → agent_cli-0.76.2}/.github/workflows/toc.yaml +0 -0
  29. {agent_cli-0.76.0 → agent_cli-0.76.2}/.gitignore +0 -0
  30. {agent_cli-0.76.0 → agent_cli-0.76.2}/.jscpd.json +0 -0
  31. {agent_cli-0.76.0 → agent_cli-0.76.2}/.pre-commit-config.yaml +0 -0
  32. {agent_cli-0.76.0 → agent_cli-0.76.2}/.prompts/docs-review.md +0 -0
  33. {agent_cli-0.76.0 → agent_cli-0.76.2}/.prompts/pr-review.md +0 -0
  34. {agent_cli-0.76.0 → agent_cli-0.76.2}/CLAUDE.md +0 -0
  35. {agent_cli-0.76.0 → agent_cli-0.76.2}/LICENSE +0 -0
  36. {agent_cli-0.76.0 → agent_cli-0.76.2}/README.md +0 -0
  37. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/__init__.py +0 -0
  38. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/__main__.py +0 -0
  39. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/_extras.json +0 -0
  40. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/_requirements/.gitkeep +0 -0
  41. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/_requirements/audio.txt +0 -0
  42. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/_requirements/faster-whisper.txt +0 -0
  43. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/_requirements/kokoro.txt +0 -0
  44. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/_requirements/llm.txt +0 -0
  45. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/_requirements/memory.txt +0 -0
  46. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  47. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/_requirements/piper.txt +0 -0
  48. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/_requirements/rag.txt +0 -0
  49. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/_requirements/server.txt +0 -0
  50. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/_requirements/speed.txt +0 -0
  51. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/_requirements/vad.txt +0 -0
  52. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  53. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/_requirements/wyoming.txt +0 -0
  54. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/_tools.py +0 -0
  55. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/agents/__init__.py +0 -0
  56. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/agents/_voice_agent_common.py +0 -0
  57. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/agents/assistant.py +0 -0
  58. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/agents/autocorrect.py +0 -0
  59. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/agents/chat.py +0 -0
  60. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/agents/memory/__init__.py +0 -0
  61. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/agents/memory/add.py +0 -0
  62. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/agents/memory/proxy.py +0 -0
  63. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/agents/rag_proxy.py +0 -0
  64. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/agents/speak.py +0 -0
  65. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/agents/transcribe.py +0 -0
  66. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/agents/transcribe_daemon.py +0 -0
  67. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/agents/voice_edit.py +0 -0
  68. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/api.py +0 -0
  69. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/cli.py +0 -0
  70. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/config.py +0 -0
  71. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/config_cmd.py +0 -0
  72. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/constants.py +0 -0
  73. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/core/__init__.py +0 -0
  74. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/core/audio.py +0 -0
  75. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/core/audio_format.py +0 -0
  76. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/core/chroma.py +0 -0
  77. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/core/openai_proxy.py +0 -0
  78. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/core/process.py +0 -0
  79. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/core/reranker.py +0 -0
  80. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/core/sse.py +0 -0
  81. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/core/transcription_logger.py +0 -0
  82. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/core/utils.py +0 -0
  83. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/core/vad.py +0 -0
  84. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/core/watch.py +0 -0
  85. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/__init__.py +0 -0
  86. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/cli.py +0 -0
  87. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/__init__.py +0 -0
  88. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/aider.py +0 -0
  89. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/base.py +0 -0
  90. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/claude.py +0 -0
  91. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/codex.py +0 -0
  92. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  93. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/copilot.py +0 -0
  94. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  95. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/gemini.py +0 -0
  96. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/opencode.py +0 -0
  97. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/registry.py +0 -0
  98. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/editors/__init__.py +0 -0
  99. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/editors/base.py +0 -0
  100. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/editors/cursor.py +0 -0
  101. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/editors/emacs.py +0 -0
  102. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/editors/jetbrains.py +0 -0
  103. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/editors/nano.py +0 -0
  104. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/editors/neovim.py +0 -0
  105. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/editors/registry.py +0 -0
  106. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/editors/sublime.py +0 -0
  107. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/editors/vim.py +0 -0
  108. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/editors/vscode.py +0 -0
  109. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/editors/zed.py +0 -0
  110. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/project.py +0 -0
  111. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/registry.py +0 -0
  112. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/skill/SKILL.md +0 -0
  113. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/skill/examples.md +0 -0
  114. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/terminals/__init__.py +0 -0
  115. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  116. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/terminals/base.py +0 -0
  117. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/terminals/gnome.py +0 -0
  118. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/terminals/iterm2.py +0 -0
  119. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/terminals/kitty.py +0 -0
  120. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/terminals/registry.py +0 -0
  121. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/terminals/tmux.py +0 -0
  122. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/terminals/warp.py +0 -0
  123. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/terminals/zellij.py +0 -0
  124. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/dev/worktree.py +0 -0
  125. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/docs_gen.py +0 -0
  126. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/example-config.toml +0 -0
  127. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/install/__init__.py +0 -0
  128. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/install/common.py +0 -0
  129. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/install/extras.py +0 -0
  130. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/install/hotkeys.py +0 -0
  131. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/install/services.py +0 -0
  132. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/memory/__init__.py +0 -0
  133. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/memory/_files.py +0 -0
  134. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/memory/_filters.py +0 -0
  135. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/memory/_git.py +0 -0
  136. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/memory/_indexer.py +0 -0
  137. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/memory/_ingest.py +0 -0
  138. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/memory/_persistence.py +0 -0
  139. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/memory/_prompt.py +0 -0
  140. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/memory/_retrieval.py +0 -0
  141. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/memory/_store.py +0 -0
  142. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/memory/_streaming.py +0 -0
  143. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/memory/_tasks.py +0 -0
  144. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/memory/api.py +0 -0
  145. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/memory/client.py +0 -0
  146. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/memory/engine.py +0 -0
  147. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/memory/entities.py +0 -0
  148. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/memory/models.py +0 -0
  149. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/opts.py +0 -0
  150. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/py.typed +0 -0
  151. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/rag/__init__.py +0 -0
  152. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/rag/_indexer.py +0 -0
  153. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/rag/_indexing.py +0 -0
  154. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/rag/_prompt.py +0 -0
  155. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/rag/_retriever.py +0 -0
  156. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/rag/_store.py +0 -0
  157. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/rag/_utils.py +0 -0
  158. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/rag/api.py +0 -0
  159. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/rag/client.py +0 -0
  160. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/rag/engine.py +0 -0
  161. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/rag/models.py +0 -0
  162. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  163. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/__init__.py +0 -0
  164. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/check_plugin_skill_sync.py +0 -0
  165. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  166. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  167. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  168. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  169. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  170. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  171. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  172. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  173. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  174. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  175. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  176. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  177. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  178. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  179. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/run-openwakeword.sh +0 -0
  180. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/run-piper-windows.ps1 +0 -0
  181. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/run-piper.sh +0 -0
  182. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/run-whisper-linux.sh +0 -0
  183. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/run-whisper-macos.sh +0 -0
  184. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/run-whisper-windows.ps1 +0 -0
  185. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/run-whisper.sh +0 -0
  186. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/run_faster_whisper_server.py +0 -0
  187. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  188. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/setup-linux.sh +0 -0
  189. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  190. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/setup-macos.sh +0 -0
  191. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/setup-windows.ps1 +0 -0
  192. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  193. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/start-all-services.sh +0 -0
  194. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/scripts/sync_extras.py +0 -0
  195. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/__init__.py +0 -0
  196. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/common.py +0 -0
  197. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/model_manager.py +0 -0
  198. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/model_registry.py +0 -0
  199. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/proxy/__init__.py +0 -0
  200. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/proxy/api.py +0 -0
  201. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/streaming.py +0 -0
  202. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/tts/__init__.py +0 -0
  203. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/tts/api.py +0 -0
  204. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/tts/backends/__init__.py +0 -0
  205. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/tts/backends/base.py +0 -0
  206. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/tts/backends/kokoro.py +0 -0
  207. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/tts/backends/piper.py +0 -0
  208. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/tts/model_manager.py +0 -0
  209. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/tts/model_registry.py +0 -0
  210. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/tts/wyoming_handler.py +0 -0
  211. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/whisper/__init__.py +0 -0
  212. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/whisper/api.py +0 -0
  213. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/whisper/backends/__init__.py +0 -0
  214. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/whisper/backends/base.py +0 -0
  215. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  216. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/whisper/backends/mlx.py +0 -0
  217. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/whisper/backends/transformers.py +0 -0
  218. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/whisper/languages.py +0 -0
  219. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/whisper/model_manager.py +0 -0
  220. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/whisper/model_registry.py +0 -0
  221. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  222. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/services/__init__.py +0 -0
  223. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/services/_wyoming_utils.py +0 -0
  224. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/services/asr.py +0 -0
  225. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/services/llm.py +0 -0
  226. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/services/tts.py +0 -0
  227. {agent_cli-0.76.0 → agent_cli-0.76.2}/agent_cli/services/wake_word.py +0 -0
  228. {agent_cli-0.76.0 → agent_cli-0.76.2}/docker/docker-compose.yml +0 -0
  229. {agent_cli-0.76.0 → agent_cli-0.76.2}/docker/memory-proxy.Dockerfile +0 -0
  230. {agent_cli-0.76.0 → agent_cli-0.76.2}/docker/rag-proxy.Dockerfile +0 -0
  231. {agent_cli-0.76.0 → agent_cli-0.76.2}/docker/transcribe-proxy.Dockerfile +0 -0
  232. {agent_cli-0.76.0 → agent_cli-0.76.2}/docker/tts.Dockerfile +0 -0
  233. {agent_cli-0.76.0 → agent_cli-0.76.2}/docker/whisper.Dockerfile +0 -0
  234. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/CNAME +0 -0
  235. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/architecture/index.md +0 -0
  236. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/architecture/memory.md +0 -0
  237. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/architecture/rag.md +0 -0
  238. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/assistant.md +0 -0
  239. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/autocorrect.md +0 -0
  240. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/chat.md +0 -0
  241. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/config.md +0 -0
  242. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/dev.md +0 -0
  243. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/index.md +0 -0
  244. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/install-extras.md +0 -0
  245. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/install-hotkeys.md +0 -0
  246. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/install-services.md +0 -0
  247. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/memory.md +0 -0
  248. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/rag-proxy.md +0 -0
  249. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/server/index.md +0 -0
  250. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/server/transcribe-proxy.md +0 -0
  251. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/server/tts.md +0 -0
  252. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/server/whisper.md +0 -0
  253. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/speak.md +0 -0
  254. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/start-services.md +0 -0
  255. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/transcribe-daemon.md +0 -0
  256. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/transcribe.md +0 -0
  257. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/commands/voice-edit.md +0 -0
  258. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/configuration.md +0 -0
  259. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/getting-started.md +0 -0
  260. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/iOS_Shortcut_Guide.md +0 -0
  261. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/index.md +0 -0
  262. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/installation/docker.md +0 -0
  263. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/installation/index.md +0 -0
  264. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/installation/linux.md +0 -0
  265. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/installation/macos.md +0 -0
  266. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/installation/nixos.md +0 -0
  267. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/installation/windows.md +0 -0
  268. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/logo-clean.svg +0 -0
  269. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  270. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/run_markdown_code_runner.py +0 -0
  271. {agent_cli-0.76.0 → agent_cli-0.76.2}/docs/system-integration.md +0 -0
  272. {agent_cli-0.76.0 → agent_cli-0.76.2}/example.agent-cli-config.toml +0 -0
  273. {agent_cli-0.76.0 → agent_cli-0.76.2}/justfile +0 -0
  274. {agent_cli-0.76.0 → agent_cli-0.76.2}/pyproject.toml +0 -0
  275. {agent_cli-0.76.0 → agent_cli-0.76.2}/shell.nix +0 -0
  276. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/__init__.py +0 -0
  277. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/__init__.py +0 -0
  278. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/test_fix_my_text.py +0 -0
  279. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/test_interactive.py +0 -0
  280. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/test_interactive_extra.py +0 -0
  281. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/test_memory_add.py +0 -0
  282. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/test_speak.py +0 -0
  283. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/test_speak_e2e.py +0 -0
  284. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/test_transcribe.py +0 -0
  285. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/test_transcribe_agent.py +0 -0
  286. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/test_transcribe_daemon.py +0 -0
  287. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/test_transcribe_e2e.py +0 -0
  288. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/test_transcribe_recovery.py +0 -0
  289. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/test_tts_common.py +0 -0
  290. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/test_tts_common_extra.py +0 -0
  291. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/test_voice_agent_common.py +0 -0
  292. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/test_voice_edit.py +0 -0
  293. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/test_voice_edit_e2e.py +0 -0
  294. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/agents/test_wake_word_assistant.py +0 -0
  295. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/conftest.py +0 -0
  296. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/core/__init__.py +0 -0
  297. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/core/test_audio_format.py +0 -0
  298. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/core/test_chroma.py +0 -0
  299. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/core/test_sse.py +0 -0
  300. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/core/test_watch.py +0 -0
  301. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/dev/__init__.py +0 -0
  302. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/dev/test_cli.py +0 -0
  303. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/dev/test_coding_agents.py +0 -0
  304. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/dev/test_editors.py +0 -0
  305. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/dev/test_project.py +0 -0
  306. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/dev/test_terminals.py +0 -0
  307. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/dev/test_verification.py +0 -0
  308. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/dev/test_worktree.py +0 -0
  309. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/install/__init__.py +0 -0
  310. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/install/test_extras.py +0 -0
  311. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/memory/__init__.py +0 -0
  312. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/memory/test_api_health.py +0 -0
  313. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/memory/test_api_integration_liveish.py +0 -0
  314. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/memory/test_client.py +0 -0
  315. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/memory/test_engine.py +0 -0
  316. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/memory/test_files.py +0 -0
  317. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/memory/test_filters.py +0 -0
  318. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/memory/test_git_integration.py +0 -0
  319. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/memory/test_indexer.py +0 -0
  320. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/memory/test_memory_integration.py +0 -0
  321. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/memory/test_proxy_passthrough.py +0 -0
  322. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/memory/test_store.py +0 -0
  323. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/memory/test_utils.py +0 -0
  324. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/mocks/__init__.py +0 -0
  325. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/mocks/audio.py +0 -0
  326. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/mocks/llm.py +0 -0
  327. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/mocks/wyoming.py +0 -0
  328. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/rag/__init__.py +0 -0
  329. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/rag/test_api.py +0 -0
  330. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/rag/test_engine.py +0 -0
  331. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/rag/test_history.py +0 -0
  332. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/rag/test_indexer.py +0 -0
  333. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/rag/test_indexing.py +0 -0
  334. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/rag/test_rag_client.py +0 -0
  335. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/rag/test_rag_integration_liveish.py +0 -0
  336. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  337. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/rag/test_retriever.py +0 -0
  338. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/rag/test_store.py +0 -0
  339. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/rag/test_utils.py +0 -0
  340. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_api.py +0 -0
  341. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_api_integration.py +0 -0
  342. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_asr.py +0 -0
  343. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_asr_recovery.py +0 -0
  344. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_audio_e2e.py +0 -0
  345. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_cli.py +0 -0
  346. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_config.py +0 -0
  347. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_config_cmd.py +0 -0
  348. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_docs_gen.py +0 -0
  349. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_env_vars.py +0 -0
  350. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_json_output.py +0 -0
  351. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_llm.py +0 -0
  352. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_llm_gemini.py +0 -0
  353. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_memory_tools.py +0 -0
  354. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_mlx_backend.py +0 -0
  355. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_process_manager.py +0 -0
  356. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_server_streaming.py +0 -0
  357. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_server_tts.py +0 -0
  358. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_server_whisper.py +0 -0
  359. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_services.py +0 -0
  360. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_tools.py +0 -0
  361. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_transformers_backend.py +0 -0
  362. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_tts.py +0 -0
  363. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_utils.py +0 -0
  364. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_wake_word.py +0 -0
  365. {agent_cli-0.76.0 → agent_cli-0.76.2}/tests/test_wyoming_utils.py +0 -0
  366. {agent_cli-0.76.0 → agent_cli-0.76.2}/uv.lock +0 -0
  367. {agent_cli-0.76.0 → agent_cli-0.76.2}/zensical.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.76.0
3
+ Version: 0.76.2
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>
@@ -6,6 +6,8 @@ import functools
6
6
  import importlib
7
7
  import json
8
8
  import os
9
+ import shutil
10
+ import sys
9
11
  from importlib.util import find_spec
10
12
  from pathlib import Path
11
13
  from typing import TYPE_CHECKING, TypeVar
@@ -20,6 +22,9 @@ if TYPE_CHECKING:
20
22
 
21
23
  F = TypeVar("F", bound="Callable[..., object]")
22
24
 
25
+ # Marker to prevent infinite re-exec loops
26
+ _REEXEC_MARKER = "_AGENT_CLI_REEXEC"
27
+
23
28
 
24
29
  def _get_auto_install_setting() -> bool:
25
30
  """Check if auto-install is enabled (default: True)."""
@@ -28,6 +33,44 @@ def _get_auto_install_setting() -> bool:
28
33
  return load_config().get("settings", {}).get("auto_install_extras", True)
29
34
 
30
35
 
36
+ def _is_uvx_cache() -> bool:
37
+ """Check if running from uvx cache (ephemeral) vs uv tool (persistent)."""
38
+ # uvx uses ~/.cache/uv/archive-v0/... (or AppData\Local\uv\cache on Windows)
39
+ # uv tool uses ~/.local/share/uv/tools/... (or AppData\Local\uv\tools on Windows)
40
+ # Use as_posix() for cross-platform forward-slash paths
41
+ prefix_str = Path(sys.prefix).resolve().as_posix()
42
+ return "/cache/uv/" in prefix_str or "/archive-v" in prefix_str
43
+
44
+
45
+ def _reexec(cmd: list[str], message: str) -> None:
46
+ """Re-execute with a new command, preventing infinite loops."""
47
+ if os.environ.get(_REEXEC_MARKER):
48
+ return
49
+ err_console.print(f"[yellow]{message}[/]")
50
+ new_env = os.environ.copy()
51
+ new_env[_REEXEC_MARKER] = "1"
52
+ os.execvpe(cmd[0], cmd, new_env) # noqa: S606
53
+
54
+
55
+ def _reexec_with_uvx_extras(extras: list[str]) -> bool:
56
+ """Re-execute with uvx --with for extras. Returns False if not applicable."""
57
+ if os.environ.get(_REEXEC_MARKER) or not _is_uvx_cache():
58
+ return False
59
+ uvx_path = shutil.which("uvx")
60
+ if not uvx_path:
61
+ return False
62
+ extras_str = ",".join(extras)
63
+ cmd = [uvx_path, "--with", f"agent-cli[{extras_str}]", "agent-cli", *sys.argv[1:]]
64
+ _reexec(cmd, f"Re-running with extras: {extras_str}")
65
+ return True # Never reached
66
+
67
+
68
+ def _reexec_self() -> None:
69
+ """Re-execute after auto-install so new packages are visible."""
70
+ executable = shutil.which("agent-cli") or sys.executable
71
+ _reexec([executable, *sys.argv[1:]], "Re-running with installed extras...")
72
+
73
+
31
74
  # Load extras from JSON file
32
75
  _EXTRAS_FILE = Path(__file__).parent.parent / "_extras.json"
33
76
  EXTRAS: dict[str, tuple[str, list[str]]] = {
@@ -127,21 +170,46 @@ def get_combined_install_hint(extras: list[str]) -> str:
127
170
  return "\n".join(lines)
128
171
 
129
172
 
130
- def _try_auto_install(missing: list[str]) -> bool:
131
- """Attempt to auto-install missing extras. Returns True if successful."""
173
+ def _resolve_alternative(extra: str) -> str | None:
174
+ """For an alternative extra like 'a|b|c', return the installed one or first option."""
175
+ if "|" not in extra:
176
+ return extra
177
+ alternatives = extra.split("|")
178
+ # Check if any alternative is already installed - use that one
179
+ for alt in alternatives:
180
+ if check_extra_installed(alt):
181
+ return alt
182
+ # None installed, return first option for installation
183
+ return alternatives[0]
184
+
185
+
186
+ def _try_auto_install(
187
+ missing: list[str],
188
+ all_required: tuple[str, ...] | None = None,
189
+ ) -> bool:
190
+ """Attempt to auto-install missing extras. Returns True if successful.
191
+
192
+ If all_required is provided, ensures all those extras are installed
193
+ (not just the missing ones) to handle uv tool reinstall properly.
194
+ With --force, uv replaces the entire install, so we must include
195
+ ALL required extras to avoid losing ones that were already installed.
196
+ """
132
197
  from agent_cli.install.extras import install_extras_programmatic # noqa: PLC0415
133
198
 
134
- # Flatten alternatives (e.g., "piper|kokoro" -> just pick the first one)
199
+ # Use all required extras if provided, otherwise just missing
200
+ extras_source = all_required if all_required is not None else missing
201
+
202
+ # Resolve alternatives: use installed one if present, otherwise first option
135
203
  extras_to_install = []
136
- for extra in missing:
137
- if "|" in extra:
138
- # For alternatives, install the first option
139
- extras_to_install.append(extra.split("|")[0])
140
- else:
141
- extras_to_install.append(extra)
204
+ for extra in extras_source:
205
+ resolved = _resolve_alternative(extra)
206
+ if resolved:
207
+ extras_to_install.append(resolved)
142
208
 
209
+ # Show only the missing ones in the message (resolved)
210
+ missing_display = [_resolve_alternative(e) or e.split("|")[0] for e in missing]
143
211
  err_console.print(
144
- f"[yellow]Auto-installing missing extras: {', '.join(extras_to_install)}[/]",
212
+ f"[yellow]Auto-installing missing extras: {', '.join(missing_display)}[/]",
145
213
  )
146
214
  return install_extras_programmatic(extras_to_install, quiet=True)
147
215
 
@@ -156,12 +224,27 @@ def _check_and_install_extras(extras: tuple[str, ...]) -> list[str]:
156
224
  print_error_message(get_combined_install_hint(missing))
157
225
  return missing
158
226
 
159
- if not _try_auto_install(missing):
227
+ # Resolve alternatives: use installed one if present, otherwise first option
228
+ extras_to_install = [_resolve_alternative(e) or e.split("|")[0] for e in extras]
229
+
230
+ # For uvx cache environments, re-exec with --with flag
231
+ # This replaces the current process if successful (never returns)
232
+ _reexec_with_uvx_extras(extras_to_install)
233
+
234
+ # Not in uvx (or re-exec failed), try normal auto-install
235
+ if not _try_auto_install(missing, all_required=extras):
160
236
  print_error_message("Auto-install failed.\n" + get_combined_install_hint(missing))
161
237
  return missing
162
238
 
163
239
  err_console.print("[green]Installation complete![/]")
164
- # Invalidate import caches so find_spec() can see newly installed packages
240
+
241
+ # Re-exec ourselves so the new packages are visible
242
+ # The newly installed version will run with all extras available
243
+ # If re-exec succeeds, this never returns
244
+ _reexec_self()
245
+
246
+ # If we get here, re-exec was skipped (loop prevention) or failed
247
+ # Check if extras are now available in this process
165
248
  importlib.invalidate_caches()
166
249
  still_missing = [e for e in extras if not check_extra_installed(e)]
167
250
  if still_missing:
@@ -29,15 +29,23 @@ def _has(package: str) -> bool:
29
29
 
30
30
  app = typer.Typer(
31
31
  name="server",
32
- help="""Run local ASR/TTS servers with OpenAI-compatible APIs.
32
+ help="""Local ASR/TTS servers with dual-protocol support and smart memory management.
33
+
34
+ **Key features:**
35
+
36
+ - **Dual protocol:** OpenAI-compatible HTTP API and Wyoming protocol (Home Assistant)
37
+ - **Multiple backends:** Choose the right engine for your hardware
38
+ - **Automatic memory management:** Models unload after idle timeout, freeing VRAM/RAM
33
39
 
34
40
  **Available servers:**
35
41
 
36
- - `whisper` - Local speech-to-text using Whisper models (faster-whisper or MLX)
37
- - `tts` - Local text-to-speech using Piper (CPU) or Kokoro (GPU)
38
- - `transcribe-proxy` - Proxy to external ASR providers (OpenAI, Gemini, Wyoming)
42
+ | Server | Backends | Default Ports |
43
+ |--------|----------|---------------|
44
+ | `whisper` | faster-whisper, MLX, transformers | HTTP: 10301, Wyoming: 10300 |
45
+ | `tts` | Piper (CPU), Kokoro (GPU) | HTTP: 10201, Wyoming: 10200 |
46
+ | `transcribe-proxy` | OpenAI-compatible, Gemini, Wyoming | HTTP: 61337 |
39
47
 
40
- **Common workflows:**
48
+ **Examples:**
41
49
 
42
50
  ```bash
43
51
  # Run local Whisper server (lazy loads large-v3 by default)
@@ -50,8 +58,8 @@ agent-cli server tts --backend kokoro
50
58
  agent-cli server transcribe-proxy
51
59
  ```
52
60
 
53
- All servers support Home Assistant via Wyoming protocol and can be used as
54
- drop-in replacements for OpenAI's audio APIs.
61
+ Models load on first request and automatically unload after 5 minutes of inactivity
62
+ (configurable via `--ttl`), so VRAM isn't wasted when the server is idle.
55
63
  """,
56
64
  add_completion=True,
57
65
  rich_markup_mode="markdown",
@@ -17,13 +17,21 @@ if TYPE_CHECKING:
17
17
  @pytest.fixture(scope="module", autouse=True)
18
18
  def ensure_model_cached() -> None:
19
19
  """Ensure Silero VAD model is cached before running tests."""
20
+ import shutil # noqa: PLC0415
20
21
  import urllib.request # noqa: PLC0415
21
22
 
22
23
  from agent_cli.core.vad import SILERO_VAD_CACHE, SILERO_VAD_URL # noqa: PLC0415
23
24
 
24
25
  if not SILERO_VAD_CACHE.exists():
25
26
  SILERO_VAD_CACHE.parent.mkdir(parents=True, exist_ok=True)
26
- urllib.request.urlretrieve(SILERO_VAD_URL, SILERO_VAD_CACHE) # noqa: S310
27
+ try:
28
+ with (
29
+ urllib.request.urlopen(SILERO_VAD_URL, timeout=30) as response, # noqa: S310
30
+ SILERO_VAD_CACHE.open("wb") as f,
31
+ ):
32
+ shutil.copyfileobj(response, f)
33
+ except Exception as e:
34
+ pytest.skip(f"Failed to download VAD model: {e}")
27
35
 
28
36
 
29
37
  def test_import_error_without_onnxruntime() -> None:
@@ -201,6 +201,7 @@ class TestCheckAndInstallExtras:
201
201
  ),
202
202
  patch("agent_cli.core.deps._get_auto_install_setting", return_value=True),
203
203
  patch("agent_cli.core.deps._try_auto_install", return_value=True),
204
+ patch("agent_cli.core.deps._reexec_self"), # Prevent actual re-exec
204
205
  ):
205
206
  result = _check_and_install_extras(("fake-extra",))
206
207
  assert result == []
@@ -212,6 +213,7 @@ class TestCheckAndInstallExtras:
212
213
  patch("agent_cli.core.deps.check_extra_installed", return_value=False),
213
214
  patch("agent_cli.core.deps._get_auto_install_setting", return_value=True),
214
215
  patch("agent_cli.core.deps._try_auto_install", return_value=True),
216
+ patch("agent_cli.core.deps._reexec_self"), # Prevent actual re-exec
215
217
  patch("agent_cli.core.deps.print_error_message") as mock_error,
216
218
  ):
217
219
  result = _check_and_install_extras(("fake-extra",))
@@ -259,6 +261,7 @@ class TestDecoratorIntegration:
259
261
  ),
260
262
  patch("agent_cli.core.deps._get_auto_install_setting", return_value=True),
261
263
  patch("agent_cli.core.deps._try_auto_install", return_value=True),
264
+ patch("agent_cli.core.deps._reexec_self"), # Prevent actual re-exec
262
265
  ):
263
266
 
264
267
  @requires_extras("fake-extra")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes