agent-cli 0.76.1__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.1 → agent_cli-0.76.2}/PKG-INFO +1 -1
  2. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/core/deps.py +95 -12
  3. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_requires_extras.py +3 -0
  4. {agent_cli-0.76.1 → agent_cli-0.76.2}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  5. {agent_cli-0.76.1 → agent_cli-0.76.2}/.claude/skills/agent-cli-dev/examples.md +0 -0
  6. {agent_cli-0.76.1 → agent_cli-0.76.2}/.claude-plugin/README.md +0 -0
  7. {agent_cli-0.76.1 → agent_cli-0.76.2}/.claude-plugin/marketplace.json +0 -0
  8. {agent_cli-0.76.1 → agent_cli-0.76.2}/.claude-plugin/plugin.json +0 -0
  9. {agent_cli-0.76.1 → agent_cli-0.76.2}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  10. {agent_cli-0.76.1 → agent_cli-0.76.2}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  11. {agent_cli-0.76.1 → agent_cli-0.76.2}/.cursorrules +0 -0
  12. {agent_cli-0.76.1 → agent_cli-0.76.2}/.dockerignore +0 -0
  13. {agent_cli-0.76.1 → agent_cli-0.76.2}/.env.example +0 -0
  14. {agent_cli-0.76.1 → agent_cli-0.76.2}/.github/logo.svg +0 -0
  15. {agent_cli-0.76.1 → agent_cli-0.76.2}/.github/release-drafter.yml +0 -0
  16. {agent_cli-0.76.1 → agent_cli-0.76.2}/.github/renovate.json +0 -0
  17. {agent_cli-0.76.1 → agent_cli-0.76.2}/.github/scripts/check_extras_sync.py +0 -0
  18. {agent_cli-0.76.1 → agent_cli-0.76.2}/.github/scripts/sync_requirements.py +0 -0
  19. {agent_cli-0.76.1 → agent_cli-0.76.2}/.github/workflows/automerge.yml +0 -0
  20. {agent_cli-0.76.1 → agent_cli-0.76.2}/.github/workflows/docker.yml +0 -0
  21. {agent_cli-0.76.1 → agent_cli-0.76.2}/.github/workflows/docs.yml +0 -0
  22. {agent_cli-0.76.1 → agent_cli-0.76.2}/.github/workflows/markdown-code-runner.yml +0 -0
  23. {agent_cli-0.76.1 → agent_cli-0.76.2}/.github/workflows/pytest.yml +0 -0
  24. {agent_cli-0.76.1 → agent_cli-0.76.2}/.github/workflows/release-drafter.yml +0 -0
  25. {agent_cli-0.76.1 → agent_cli-0.76.2}/.github/workflows/release.yml +0 -0
  26. {agent_cli-0.76.1 → agent_cli-0.76.2}/.github/workflows/toc.yaml +0 -0
  27. {agent_cli-0.76.1 → agent_cli-0.76.2}/.gitignore +0 -0
  28. {agent_cli-0.76.1 → agent_cli-0.76.2}/.jscpd.json +0 -0
  29. {agent_cli-0.76.1 → agent_cli-0.76.2}/.pre-commit-config.yaml +0 -0
  30. {agent_cli-0.76.1 → agent_cli-0.76.2}/.prompts/docs-review.md +0 -0
  31. {agent_cli-0.76.1 → agent_cli-0.76.2}/.prompts/pr-review.md +0 -0
  32. {agent_cli-0.76.1 → agent_cli-0.76.2}/CLAUDE.md +0 -0
  33. {agent_cli-0.76.1 → agent_cli-0.76.2}/LICENSE +0 -0
  34. {agent_cli-0.76.1 → agent_cli-0.76.2}/README.md +0 -0
  35. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/__init__.py +0 -0
  36. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/__main__.py +0 -0
  37. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/_extras.json +0 -0
  38. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/_requirements/.gitkeep +0 -0
  39. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/_requirements/audio.txt +0 -0
  40. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/_requirements/faster-whisper.txt +0 -0
  41. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/_requirements/kokoro.txt +0 -0
  42. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/_requirements/llm.txt +0 -0
  43. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/_requirements/memory.txt +0 -0
  44. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  45. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/_requirements/piper.txt +0 -0
  46. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/_requirements/rag.txt +0 -0
  47. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/_requirements/server.txt +0 -0
  48. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/_requirements/speed.txt +0 -0
  49. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/_requirements/vad.txt +0 -0
  50. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  51. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/_requirements/wyoming.txt +0 -0
  52. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/_tools.py +0 -0
  53. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/agents/__init__.py +0 -0
  54. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/agents/_voice_agent_common.py +0 -0
  55. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/agents/assistant.py +0 -0
  56. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/agents/autocorrect.py +0 -0
  57. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/agents/chat.py +0 -0
  58. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/agents/memory/__init__.py +0 -0
  59. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/agents/memory/add.py +0 -0
  60. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/agents/memory/proxy.py +0 -0
  61. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/agents/rag_proxy.py +0 -0
  62. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/agents/speak.py +0 -0
  63. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/agents/transcribe.py +0 -0
  64. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/agents/transcribe_daemon.py +0 -0
  65. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/agents/voice_edit.py +0 -0
  66. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/api.py +0 -0
  67. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/cli.py +0 -0
  68. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/config.py +0 -0
  69. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/config_cmd.py +0 -0
  70. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/constants.py +0 -0
  71. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/core/__init__.py +0 -0
  72. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/core/audio.py +0 -0
  73. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/core/audio_format.py +0 -0
  74. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/core/chroma.py +0 -0
  75. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/core/openai_proxy.py +0 -0
  76. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/core/process.py +0 -0
  77. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/core/reranker.py +0 -0
  78. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/core/sse.py +0 -0
  79. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/core/transcription_logger.py +0 -0
  80. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/core/utils.py +0 -0
  81. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/core/vad.py +0 -0
  82. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/core/watch.py +0 -0
  83. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/__init__.py +0 -0
  84. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/cli.py +0 -0
  85. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/__init__.py +0 -0
  86. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/aider.py +0 -0
  87. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/base.py +0 -0
  88. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/claude.py +0 -0
  89. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/codex.py +0 -0
  90. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  91. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/copilot.py +0 -0
  92. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  93. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/gemini.py +0 -0
  94. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/opencode.py +0 -0
  95. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/coding_agents/registry.py +0 -0
  96. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/editors/__init__.py +0 -0
  97. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/editors/base.py +0 -0
  98. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/editors/cursor.py +0 -0
  99. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/editors/emacs.py +0 -0
  100. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/editors/jetbrains.py +0 -0
  101. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/editors/nano.py +0 -0
  102. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/editors/neovim.py +0 -0
  103. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/editors/registry.py +0 -0
  104. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/editors/sublime.py +0 -0
  105. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/editors/vim.py +0 -0
  106. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/editors/vscode.py +0 -0
  107. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/editors/zed.py +0 -0
  108. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/project.py +0 -0
  109. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/registry.py +0 -0
  110. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/skill/SKILL.md +0 -0
  111. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/skill/examples.md +0 -0
  112. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/terminals/__init__.py +0 -0
  113. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  114. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/terminals/base.py +0 -0
  115. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/terminals/gnome.py +0 -0
  116. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/terminals/iterm2.py +0 -0
  117. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/terminals/kitty.py +0 -0
  118. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/terminals/registry.py +0 -0
  119. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/terminals/tmux.py +0 -0
  120. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/terminals/warp.py +0 -0
  121. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/terminals/zellij.py +0 -0
  122. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/dev/worktree.py +0 -0
  123. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/docs_gen.py +0 -0
  124. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/example-config.toml +0 -0
  125. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/install/__init__.py +0 -0
  126. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/install/common.py +0 -0
  127. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/install/extras.py +0 -0
  128. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/install/hotkeys.py +0 -0
  129. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/install/services.py +0 -0
  130. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/memory/__init__.py +0 -0
  131. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/memory/_files.py +0 -0
  132. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/memory/_filters.py +0 -0
  133. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/memory/_git.py +0 -0
  134. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/memory/_indexer.py +0 -0
  135. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/memory/_ingest.py +0 -0
  136. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/memory/_persistence.py +0 -0
  137. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/memory/_prompt.py +0 -0
  138. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/memory/_retrieval.py +0 -0
  139. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/memory/_store.py +0 -0
  140. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/memory/_streaming.py +0 -0
  141. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/memory/_tasks.py +0 -0
  142. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/memory/api.py +0 -0
  143. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/memory/client.py +0 -0
  144. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/memory/engine.py +0 -0
  145. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/memory/entities.py +0 -0
  146. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/memory/models.py +0 -0
  147. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/opts.py +0 -0
  148. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/py.typed +0 -0
  149. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/rag/__init__.py +0 -0
  150. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/rag/_indexer.py +0 -0
  151. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/rag/_indexing.py +0 -0
  152. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/rag/_prompt.py +0 -0
  153. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/rag/_retriever.py +0 -0
  154. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/rag/_store.py +0 -0
  155. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/rag/_utils.py +0 -0
  156. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/rag/api.py +0 -0
  157. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/rag/client.py +0 -0
  158. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/rag/engine.py +0 -0
  159. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/rag/models.py +0 -0
  160. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  161. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/__init__.py +0 -0
  162. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/check_plugin_skill_sync.py +0 -0
  163. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  164. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  165. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  166. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  167. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  168. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  169. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  170. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  171. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  172. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  173. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  174. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  175. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  176. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  177. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/run-openwakeword.sh +0 -0
  178. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/run-piper-windows.ps1 +0 -0
  179. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/run-piper.sh +0 -0
  180. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/run-whisper-linux.sh +0 -0
  181. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/run-whisper-macos.sh +0 -0
  182. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/run-whisper-windows.ps1 +0 -0
  183. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/run-whisper.sh +0 -0
  184. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/run_faster_whisper_server.py +0 -0
  185. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  186. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/setup-linux.sh +0 -0
  187. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  188. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/setup-macos.sh +0 -0
  189. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/setup-windows.ps1 +0 -0
  190. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  191. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/start-all-services.sh +0 -0
  192. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/scripts/sync_extras.py +0 -0
  193. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/__init__.py +0 -0
  194. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/cli.py +0 -0
  195. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/common.py +0 -0
  196. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/model_manager.py +0 -0
  197. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/model_registry.py +0 -0
  198. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/proxy/__init__.py +0 -0
  199. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/proxy/api.py +0 -0
  200. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/streaming.py +0 -0
  201. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/tts/__init__.py +0 -0
  202. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/tts/api.py +0 -0
  203. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/tts/backends/__init__.py +0 -0
  204. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/tts/backends/base.py +0 -0
  205. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/tts/backends/kokoro.py +0 -0
  206. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/tts/backends/piper.py +0 -0
  207. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/tts/model_manager.py +0 -0
  208. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/tts/model_registry.py +0 -0
  209. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/tts/wyoming_handler.py +0 -0
  210. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/whisper/__init__.py +0 -0
  211. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/whisper/api.py +0 -0
  212. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/whisper/backends/__init__.py +0 -0
  213. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/whisper/backends/base.py +0 -0
  214. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  215. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/whisper/backends/mlx.py +0 -0
  216. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/whisper/backends/transformers.py +0 -0
  217. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/whisper/languages.py +0 -0
  218. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/whisper/model_manager.py +0 -0
  219. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/whisper/model_registry.py +0 -0
  220. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  221. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/services/__init__.py +0 -0
  222. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/services/_wyoming_utils.py +0 -0
  223. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/services/asr.py +0 -0
  224. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/services/llm.py +0 -0
  225. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/services/tts.py +0 -0
  226. {agent_cli-0.76.1 → agent_cli-0.76.2}/agent_cli/services/wake_word.py +0 -0
  227. {agent_cli-0.76.1 → agent_cli-0.76.2}/docker/docker-compose.yml +0 -0
  228. {agent_cli-0.76.1 → agent_cli-0.76.2}/docker/memory-proxy.Dockerfile +0 -0
  229. {agent_cli-0.76.1 → agent_cli-0.76.2}/docker/rag-proxy.Dockerfile +0 -0
  230. {agent_cli-0.76.1 → agent_cli-0.76.2}/docker/transcribe-proxy.Dockerfile +0 -0
  231. {agent_cli-0.76.1 → agent_cli-0.76.2}/docker/tts.Dockerfile +0 -0
  232. {agent_cli-0.76.1 → agent_cli-0.76.2}/docker/whisper.Dockerfile +0 -0
  233. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/CNAME +0 -0
  234. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/architecture/index.md +0 -0
  235. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/architecture/memory.md +0 -0
  236. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/architecture/rag.md +0 -0
  237. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/assistant.md +0 -0
  238. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/autocorrect.md +0 -0
  239. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/chat.md +0 -0
  240. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/config.md +0 -0
  241. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/dev.md +0 -0
  242. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/index.md +0 -0
  243. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/install-extras.md +0 -0
  244. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/install-hotkeys.md +0 -0
  245. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/install-services.md +0 -0
  246. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/memory.md +0 -0
  247. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/rag-proxy.md +0 -0
  248. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/server/index.md +0 -0
  249. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/server/transcribe-proxy.md +0 -0
  250. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/server/tts.md +0 -0
  251. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/server/whisper.md +0 -0
  252. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/speak.md +0 -0
  253. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/start-services.md +0 -0
  254. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/transcribe-daemon.md +0 -0
  255. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/transcribe.md +0 -0
  256. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/commands/voice-edit.md +0 -0
  257. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/configuration.md +0 -0
  258. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/getting-started.md +0 -0
  259. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/iOS_Shortcut_Guide.md +0 -0
  260. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/index.md +0 -0
  261. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/installation/docker.md +0 -0
  262. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/installation/index.md +0 -0
  263. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/installation/linux.md +0 -0
  264. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/installation/macos.md +0 -0
  265. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/installation/nixos.md +0 -0
  266. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/installation/windows.md +0 -0
  267. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/logo-clean.svg +0 -0
  268. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  269. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/run_markdown_code_runner.py +0 -0
  270. {agent_cli-0.76.1 → agent_cli-0.76.2}/docs/system-integration.md +0 -0
  271. {agent_cli-0.76.1 → agent_cli-0.76.2}/example.agent-cli-config.toml +0 -0
  272. {agent_cli-0.76.1 → agent_cli-0.76.2}/justfile +0 -0
  273. {agent_cli-0.76.1 → agent_cli-0.76.2}/pyproject.toml +0 -0
  274. {agent_cli-0.76.1 → agent_cli-0.76.2}/shell.nix +0 -0
  275. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/__init__.py +0 -0
  276. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/__init__.py +0 -0
  277. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/test_fix_my_text.py +0 -0
  278. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/test_interactive.py +0 -0
  279. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/test_interactive_extra.py +0 -0
  280. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/test_memory_add.py +0 -0
  281. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/test_speak.py +0 -0
  282. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/test_speak_e2e.py +0 -0
  283. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/test_transcribe.py +0 -0
  284. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/test_transcribe_agent.py +0 -0
  285. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/test_transcribe_daemon.py +0 -0
  286. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/test_transcribe_e2e.py +0 -0
  287. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/test_transcribe_recovery.py +0 -0
  288. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/test_tts_common.py +0 -0
  289. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/test_tts_common_extra.py +0 -0
  290. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/test_voice_agent_common.py +0 -0
  291. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/test_voice_edit.py +0 -0
  292. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/test_voice_edit_e2e.py +0 -0
  293. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/agents/test_wake_word_assistant.py +0 -0
  294. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/conftest.py +0 -0
  295. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/core/__init__.py +0 -0
  296. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/core/test_audio_format.py +0 -0
  297. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/core/test_chroma.py +0 -0
  298. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/core/test_sse.py +0 -0
  299. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/core/test_vad.py +0 -0
  300. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/core/test_watch.py +0 -0
  301. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/dev/__init__.py +0 -0
  302. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/dev/test_cli.py +0 -0
  303. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/dev/test_coding_agents.py +0 -0
  304. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/dev/test_editors.py +0 -0
  305. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/dev/test_project.py +0 -0
  306. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/dev/test_terminals.py +0 -0
  307. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/dev/test_verification.py +0 -0
  308. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/dev/test_worktree.py +0 -0
  309. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/install/__init__.py +0 -0
  310. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/install/test_extras.py +0 -0
  311. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/memory/__init__.py +0 -0
  312. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/memory/test_api_health.py +0 -0
  313. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/memory/test_api_integration_liveish.py +0 -0
  314. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/memory/test_client.py +0 -0
  315. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/memory/test_engine.py +0 -0
  316. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/memory/test_files.py +0 -0
  317. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/memory/test_filters.py +0 -0
  318. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/memory/test_git_integration.py +0 -0
  319. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/memory/test_indexer.py +0 -0
  320. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/memory/test_memory_integration.py +0 -0
  321. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/memory/test_proxy_passthrough.py +0 -0
  322. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/memory/test_store.py +0 -0
  323. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/memory/test_utils.py +0 -0
  324. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/mocks/__init__.py +0 -0
  325. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/mocks/audio.py +0 -0
  326. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/mocks/llm.py +0 -0
  327. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/mocks/wyoming.py +0 -0
  328. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/rag/__init__.py +0 -0
  329. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/rag/test_api.py +0 -0
  330. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/rag/test_engine.py +0 -0
  331. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/rag/test_history.py +0 -0
  332. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/rag/test_indexer.py +0 -0
  333. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/rag/test_indexing.py +0 -0
  334. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/rag/test_rag_client.py +0 -0
  335. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/rag/test_rag_integration_liveish.py +0 -0
  336. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  337. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/rag/test_retriever.py +0 -0
  338. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/rag/test_store.py +0 -0
  339. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/rag/test_utils.py +0 -0
  340. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_api.py +0 -0
  341. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_api_integration.py +0 -0
  342. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_asr.py +0 -0
  343. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_asr_recovery.py +0 -0
  344. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_audio_e2e.py +0 -0
  345. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_cli.py +0 -0
  346. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_config.py +0 -0
  347. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_config_cmd.py +0 -0
  348. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_docs_gen.py +0 -0
  349. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_env_vars.py +0 -0
  350. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_json_output.py +0 -0
  351. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_llm.py +0 -0
  352. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_llm_gemini.py +0 -0
  353. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_memory_tools.py +0 -0
  354. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_mlx_backend.py +0 -0
  355. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_process_manager.py +0 -0
  356. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_server_streaming.py +0 -0
  357. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_server_tts.py +0 -0
  358. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_server_whisper.py +0 -0
  359. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_services.py +0 -0
  360. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_tools.py +0 -0
  361. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_transformers_backend.py +0 -0
  362. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_tts.py +0 -0
  363. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_utils.py +0 -0
  364. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_wake_word.py +0 -0
  365. {agent_cli-0.76.1 → agent_cli-0.76.2}/tests/test_wyoming_utils.py +0 -0
  366. {agent_cli-0.76.1 → agent_cli-0.76.2}/uv.lock +0 -0
  367. {agent_cli-0.76.1 → 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.1
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:
@@ -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
File without changes