agent-cli 0.101.0__tar.gz → 0.102.1__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 (453) hide show
  1. {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/workflows/docker.yml +10 -10
  2. {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/workflows/docs.yml +2 -2
  3. {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/workflows/markdown-code-runner.yml +3 -3
  4. {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/workflows/pytest.yml +3 -3
  5. {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/workflows/release-drafter.yml +1 -1
  6. {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/workflows/release.yml +4 -4
  7. {agent_cli-0.101.0 → agent_cli-0.102.1}/.pre-commit-config.yaml +2 -2
  8. {agent_cli-0.101.0 → agent_cli-0.102.1}/PKG-INFO +1 -1
  9. agent_cli-0.102.1/agent_cli/__init__.py +16 -0
  10. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/cli.py +2 -1
  11. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/project.py +49 -15
  12. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/cli.py +10 -1
  13. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/backends/__init__.py +3 -1
  14. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/model_manager.py +12 -1
  15. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/wyoming_handler.py +59 -13
  16. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Package.resolved +2 -2
  17. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Package.swift +1 -1
  18. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +36 -8
  19. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +82 -0
  20. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/appcast.xml +48 -31
  21. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_project.py +114 -5
  22. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_api_integration.py +27 -0
  23. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_server_tts.py +22 -0
  24. agent_cli-0.102.1/tests/test_server_tts_wyoming.py +107 -0
  25. agent_cli-0.101.0/agent_cli/__init__.py +0 -5
  26. {agent_cli-0.101.0 → agent_cli-0.102.1}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  27. {agent_cli-0.101.0 → agent_cli-0.102.1}/.claude/skills/agent-cli-dev/examples.md +0 -0
  28. {agent_cli-0.101.0 → agent_cli-0.102.1}/.claude-plugin/README.md +0 -0
  29. {agent_cli-0.101.0 → agent_cli-0.102.1}/.claude-plugin/marketplace.json +0 -0
  30. {agent_cli-0.101.0 → agent_cli-0.102.1}/.claude-plugin/plugin.json +0 -0
  31. {agent_cli-0.101.0 → agent_cli-0.102.1}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  32. {agent_cli-0.101.0 → agent_cli-0.102.1}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  33. {agent_cli-0.101.0 → agent_cli-0.102.1}/.cursorrules +0 -0
  34. {agent_cli-0.101.0 → agent_cli-0.102.1}/.dockerignore +0 -0
  35. {agent_cli-0.101.0 → agent_cli-0.102.1}/.env.example +0 -0
  36. {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/logo.svg +0 -0
  37. {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/release-drafter.yml +0 -0
  38. {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/renovate.json +0 -0
  39. {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/scripts/check_extras_sync.py +0 -0
  40. {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/scripts/check_plugin_skill_sync.py +0 -0
  41. {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/scripts/normalize_appcast.py +0 -0
  42. {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/scripts/sync_extras.py +0 -0
  43. {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/scripts/sync_requirements.py +0 -0
  44. {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/workflows/automerge.yml +0 -0
  45. {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/workflows/toc.yaml +0 -0
  46. {agent_cli-0.101.0 → agent_cli-0.102.1}/.gitignore +0 -0
  47. {agent_cli-0.101.0 → agent_cli-0.102.1}/.jscpd.json +0 -0
  48. {agent_cli-0.101.0 → agent_cli-0.102.1}/.prompts/docs-review.md +0 -0
  49. {agent_cli-0.101.0 → agent_cli-0.102.1}/.prompts/pr-review.md +0 -0
  50. {agent_cli-0.101.0 → agent_cli-0.102.1}/CLAUDE.md +0 -0
  51. {agent_cli-0.101.0 → agent_cli-0.102.1}/LICENSE +0 -0
  52. {agent_cli-0.101.0 → agent_cli-0.102.1}/LLAMA_SERVER_USAGE.md +0 -0
  53. {agent_cli-0.101.0 → agent_cli-0.102.1}/README.md +0 -0
  54. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/__main__.py +0 -0
  55. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_extras.json +0 -0
  56. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_overrides/nemo-whisper.txt +0 -0
  57. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/.gitkeep +0 -0
  58. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/audio.txt +0 -0
  59. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/diarization.txt +0 -0
  60. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/faster-whisper.txt +0 -0
  61. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/kokoro.txt +0 -0
  62. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/llm.txt +0 -0
  63. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/memory.txt +0 -0
  64. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  65. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/nemo-whisper.txt +0 -0
  66. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/piper.txt +0 -0
  67. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/rag.txt +0 -0
  68. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/server.txt +0 -0
  69. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/speed.txt +0 -0
  70. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/vad.txt +0 -0
  71. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/vectordb.txt +0 -0
  72. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  73. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/wyoming.txt +0 -0
  74. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_tools.py +0 -0
  75. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/__init__.py +0 -0
  76. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/_voice_agent_common.py +0 -0
  77. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/assistant.py +0 -0
  78. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/autocorrect.py +0 -0
  79. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/chat.py +0 -0
  80. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/diarize_live_session.py +0 -0
  81. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/memory/__init__.py +0 -0
  82. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/memory/add.py +0 -0
  83. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/memory/proxy.py +0 -0
  84. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/rag_proxy.py +0 -0
  85. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/speak.py +0 -0
  86. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/speakers.py +0 -0
  87. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/transcribe.py +0 -0
  88. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/transcribe_live.py +0 -0
  89. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/voice_edit.py +0 -0
  90. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/api.py +0 -0
  91. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/config.py +0 -0
  92. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/config_cmd.py +0 -0
  93. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/constants.py +0 -0
  94. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/__init__.py +0 -0
  95. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/alignment.py +0 -0
  96. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/audio.py +0 -0
  97. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/audio_format.py +0 -0
  98. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/chroma.py +0 -0
  99. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/deps.py +0 -0
  100. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/diarization.py +0 -0
  101. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/openai_proxy.py +0 -0
  102. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/process.py +0 -0
  103. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/reranker.py +0 -0
  104. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/speaker_identity.py +0 -0
  105. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/sse.py +0 -0
  106. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/transcription_logger.py +0 -0
  107. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/utils.py +0 -0
  108. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/vad.py +0 -0
  109. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/watch.py +0 -0
  110. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/daemon/__init__.py +0 -0
  111. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/daemon/cli.py +0 -0
  112. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/__init__.py +0 -0
  113. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/_branch_name.py +0 -0
  114. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/_config.py +0 -0
  115. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/_output.py +0 -0
  116. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/cleanup.py +0 -0
  117. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/cli.py +0 -0
  118. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/__init__.py +0 -0
  119. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/aider.py +0 -0
  120. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/base.py +0 -0
  121. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/claude.py +0 -0
  122. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/codex.py +0 -0
  123. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  124. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/copilot.py +0 -0
  125. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  126. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/gemini.py +0 -0
  127. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/opencode.py +0 -0
  128. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/registry.py +0 -0
  129. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/__init__.py +0 -0
  130. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/base.py +0 -0
  131. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/cursor.py +0 -0
  132. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/emacs.py +0 -0
  133. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/jetbrains.py +0 -0
  134. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/nano.py +0 -0
  135. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/neovim.py +0 -0
  136. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/registry.py +0 -0
  137. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/sublime.py +0 -0
  138. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/vim.py +0 -0
  139. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/vscode.py +0 -0
  140. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/zed.py +0 -0
  141. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/hooks.py +0 -0
  142. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/launch.py +0 -0
  143. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/registry.py +0 -0
  144. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/skill/SKILL.md +0 -0
  145. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/skill/examples.md +0 -0
  146. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/__init__.py +0 -0
  147. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  148. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/base.py +0 -0
  149. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/cmux.py +0 -0
  150. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/gnome.py +0 -0
  151. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/iterm2.py +0 -0
  152. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/kitty.py +0 -0
  153. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/registry.py +0 -0
  154. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/tmux.py +0 -0
  155. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/warp.py +0 -0
  156. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/zellij.py +0 -0
  157. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/worktree.py +0 -0
  158. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/docs_gen.py +0 -0
  159. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/example-config.toml +0 -0
  160. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/install/__init__.py +0 -0
  161. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/install/common.py +0 -0
  162. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/install/extras.py +0 -0
  163. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/install/hotkeys.py +0 -0
  164. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/install/launchd.py +0 -0
  165. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/install/service_config.py +0 -0
  166. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/install/services.py +0 -0
  167. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/install/systemd.py +0 -0
  168. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/__init__.py +0 -0
  169. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_files.py +0 -0
  170. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_filters.py +0 -0
  171. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_git.py +0 -0
  172. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_indexer.py +0 -0
  173. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_ingest.py +0 -0
  174. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_persistence.py +0 -0
  175. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_prompt.py +0 -0
  176. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_retrieval.py +0 -0
  177. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_store.py +0 -0
  178. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_streaming.py +0 -0
  179. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_tasks.py +0 -0
  180. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/api.py +0 -0
  181. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/client.py +0 -0
  182. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/engine.py +0 -0
  183. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/entities.py +0 -0
  184. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/models.py +0 -0
  185. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/opts.py +0 -0
  186. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/py.typed +0 -0
  187. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/__init__.py +0 -0
  188. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/_indexer.py +0 -0
  189. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/_indexing.py +0 -0
  190. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/_prompt.py +0 -0
  191. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/_retriever.py +0 -0
  192. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/_store.py +0 -0
  193. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/_utils.py +0 -0
  194. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/api.py +0 -0
  195. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/client.py +0 -0
  196. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/engine.py +0 -0
  197. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/models.py +0 -0
  198. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  199. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/__init__.py +0 -0
  200. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  201. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  202. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  203. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  204. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  205. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  206. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  207. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  208. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  209. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  210. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  211. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  212. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  213. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  214. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/run-openwakeword.sh +0 -0
  215. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  216. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/setup-linux.sh +0 -0
  217. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  218. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/setup-macos.sh +0 -0
  219. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/setup-windows.ps1 +0 -0
  220. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  221. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/start-all-services.sh +0 -0
  222. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/__init__.py +0 -0
  223. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/common.py +0 -0
  224. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/model_manager.py +0 -0
  225. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/model_registry.py +0 -0
  226. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/proxy/__init__.py +0 -0
  227. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/proxy/api.py +0 -0
  228. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/streaming.py +0 -0
  229. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/__init__.py +0 -0
  230. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/api.py +0 -0
  231. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/backends/base.py +0 -0
  232. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/backends/kokoro.py +0 -0
  233. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/backends/piper.py +0 -0
  234. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/model_registry.py +0 -0
  235. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/__init__.py +0 -0
  236. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/api.py +0 -0
  237. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/backends/__init__.py +0 -0
  238. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/backends/base.py +0 -0
  239. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  240. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/backends/mlx.py +0 -0
  241. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/backends/nemo.py +0 -0
  242. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/backends/transformers.py +0 -0
  243. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/languages.py +0 -0
  244. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/model_manager.py +0 -0
  245. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/model_registry.py +0 -0
  246. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  247. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/services/__init__.py +0 -0
  248. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/services/_wyoming_utils.py +0 -0
  249. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/services/asr.py +0 -0
  250. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/services/llm.py +0 -0
  251. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/services/tts.py +0 -0
  252. {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/services/wake_word.py +0 -0
  253. {agent_cli-0.101.0 → agent_cli-0.102.1}/docker/docker-compose.yml +0 -0
  254. {agent_cli-0.101.0 → agent_cli-0.102.1}/docker/memory-proxy.Dockerfile +0 -0
  255. {agent_cli-0.101.0 → agent_cli-0.102.1}/docker/rag-proxy.Dockerfile +0 -0
  256. {agent_cli-0.101.0 → agent_cli-0.102.1}/docker/transcribe-proxy.Dockerfile +0 -0
  257. {agent_cli-0.101.0 → agent_cli-0.102.1}/docker/tts.Dockerfile +0 -0
  258. {agent_cli-0.101.0 → agent_cli-0.102.1}/docker/whisper.Dockerfile +0 -0
  259. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/CNAME +0 -0
  260. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/architecture/index.md +0 -0
  261. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/architecture/memory.md +0 -0
  262. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/architecture/rag.md +0 -0
  263. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/assistant.md +0 -0
  264. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/autocorrect.md +0 -0
  265. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/chat.md +0 -0
  266. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/config.md +0 -0
  267. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/daemon.md +0 -0
  268. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/dev.md +0 -0
  269. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/diarize-live-session.md +0 -0
  270. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/index.md +0 -0
  271. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/install-extras.md +0 -0
  272. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/install-hotkeys.md +0 -0
  273. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/install-services.md +0 -0
  274. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/memory.md +0 -0
  275. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/rag-proxy.md +0 -0
  276. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/server/index.md +0 -0
  277. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/server/transcribe-proxy.md +0 -0
  278. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/server/tts.md +0 -0
  279. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/server/whisper.md +0 -0
  280. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/speak.md +0 -0
  281. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/speakers.md +0 -0
  282. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/start-services.md +0 -0
  283. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/transcribe-live.md +0 -0
  284. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/transcribe.md +0 -0
  285. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/voice-edit.md +0 -0
  286. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/configuration.md +0 -0
  287. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/getting-started.md +0 -0
  288. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/iOS_Shortcut_Guide.md +0 -0
  289. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/index.md +0 -0
  290. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/installation/docker.md +0 -0
  291. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/installation/index.md +0 -0
  292. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/installation/linux.md +0 -0
  293. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/installation/macos-app.md +0 -0
  294. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/installation/macos.md +0 -0
  295. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/installation/nixos.md +0 -0
  296. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/installation/windows.md +0 -0
  297. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/logo-avatar.svg +0 -0
  298. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/logo-clean.svg +0 -0
  299. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  300. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/run_markdown_code_runner.py +0 -0
  301. {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/system-integration.md +0 -0
  302. {agent_cli-0.101.0 → agent_cli-0.102.1}/example.agent-cli-config.toml +0 -0
  303. {agent_cli-0.101.0 → agent_cli-0.102.1}/justfile +0 -0
  304. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/README.md +0 -0
  305. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
  306. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Resources/Info.plist +0 -0
  307. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
  308. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
  309. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
  310. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +0 -0
  311. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
  312. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
  313. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
  314. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
  315. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
  316. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
  317. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  318. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/LiveTranscriptionPreview.swift +0 -0
  319. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
  320. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
  321. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +0 -0
  322. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +0 -0
  323. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
  324. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
  325. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
  326. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
  327. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
  328. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +0 -0
  329. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
  330. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +0 -0
  331. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
  332. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
  333. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
  334. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/ConfigurableHotkeyControllerTests.swift +0 -0
  335. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/LivePreviewSwiftTestingTests.swift +0 -0
  336. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/LiveTranscriptionPreviewTests.swift +0 -0
  337. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
  338. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
  339. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
  340. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
  341. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +0 -0
  342. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/build-macos-app.sh +0 -0
  343. {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/test-macos-app-e2e.sh +0 -0
  344. {agent_cli-0.101.0 → agent_cli-0.102.1}/pyproject.toml +0 -0
  345. {agent_cli-0.101.0 → agent_cli-0.102.1}/reddit.md +0 -0
  346. {agent_cli-0.101.0 → agent_cli-0.102.1}/shell.nix +0 -0
  347. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/__init__.py +0 -0
  348. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/__init__.py +0 -0
  349. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_fix_my_text.py +0 -0
  350. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_interactive.py +0 -0
  351. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_interactive_extra.py +0 -0
  352. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_memory_add.py +0 -0
  353. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_speak.py +0 -0
  354. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_speak_e2e.py +0 -0
  355. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_speakers.py +0 -0
  356. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_transcribe.py +0 -0
  357. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_transcribe_agent.py +0 -0
  358. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_transcribe_e2e.py +0 -0
  359. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_transcribe_live.py +0 -0
  360. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_transcribe_recovery.py +0 -0
  361. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_tts_common.py +0 -0
  362. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_tts_common_extra.py +0 -0
  363. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_voice_agent_common.py +0 -0
  364. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_voice_edit.py +0 -0
  365. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_voice_edit_e2e.py +0 -0
  366. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_wake_word_assistant.py +0 -0
  367. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/conftest.py +0 -0
  368. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/core/__init__.py +0 -0
  369. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/core/test_audio.py +0 -0
  370. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/core/test_audio_format.py +0 -0
  371. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/core/test_audio_levels.py +0 -0
  372. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/core/test_chroma.py +0 -0
  373. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/core/test_sse.py +0 -0
  374. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/core/test_vad.py +0 -0
  375. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/core/test_watch.py +0 -0
  376. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/__init__.py +0 -0
  377. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_cleanup.py +0 -0
  378. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_cli.py +0 -0
  379. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_coding_agents.py +0 -0
  380. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_editors.py +0 -0
  381. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_hooks.py +0 -0
  382. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_launch.py +0 -0
  383. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_terminals.py +0 -0
  384. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_verification.py +0 -0
  385. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_worktree.py +0 -0
  386. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/install/__init__.py +0 -0
  387. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/install/test_extras.py +0 -0
  388. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/install/test_launchd.py +0 -0
  389. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/__init__.py +0 -0
  390. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_api_health.py +0 -0
  391. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_api_integration_liveish.py +0 -0
  392. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_client.py +0 -0
  393. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_engine.py +0 -0
  394. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_files.py +0 -0
  395. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_filters.py +0 -0
  396. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_git_integration.py +0 -0
  397. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_indexer.py +0 -0
  398. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_memory_integration.py +0 -0
  399. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_proxy_passthrough.py +0 -0
  400. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_store.py +0 -0
  401. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_utils.py +0 -0
  402. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/mocks/__init__.py +0 -0
  403. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/mocks/audio.py +0 -0
  404. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/mocks/llm.py +0 -0
  405. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/mocks/wyoming.py +0 -0
  406. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/__init__.py +0 -0
  407. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_api.py +0 -0
  408. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_engine.py +0 -0
  409. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_history.py +0 -0
  410. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_indexer.py +0 -0
  411. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_indexing.py +0 -0
  412. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_rag_client.py +0 -0
  413. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_rag_integration_liveish.py +0 -0
  414. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  415. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_retriever.py +0 -0
  416. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_store.py +0 -0
  417. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_utils.py +0 -0
  418. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_alignment.py +0 -0
  419. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_api.py +0 -0
  420. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_asr.py +0 -0
  421. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_asr_recovery.py +0 -0
  422. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_audio_e2e.py +0 -0
  423. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_cli.py +0 -0
  424. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_config.py +0 -0
  425. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_config_cmd.py +0 -0
  426. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_daemon.py +0 -0
  427. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_diarization.py +0 -0
  428. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_diarize_live_session.py +0 -0
  429. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_docs_gen.py +0 -0
  430. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_env_vars.py +0 -0
  431. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_faster_whisper_backend.py +0 -0
  432. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_json_output.py +0 -0
  433. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_llm.py +0 -0
  434. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_llm_gemini.py +0 -0
  435. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_macos_app.py +0 -0
  436. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_memory_tools.py +0 -0
  437. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_mlx_backend.py +0 -0
  438. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_nemo_backend.py +0 -0
  439. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_normalize_appcast.py +0 -0
  440. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_process_manager.py +0 -0
  441. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_requires_extras.py +0 -0
  442. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_server_streaming.py +0 -0
  443. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_server_whisper.py +0 -0
  444. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_services.py +0 -0
  445. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_speaker_identity.py +0 -0
  446. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_tools.py +0 -0
  447. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_transformers_backend.py +0 -0
  448. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_tts.py +0 -0
  449. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_utils.py +0 -0
  450. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_wake_word.py +0 -0
  451. {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_wyoming_utils.py +0 -0
  452. {agent_cli-0.101.0 → agent_cli-0.102.1}/uv.lock +0 -0
  453. {agent_cli-0.101.0 → agent_cli-0.102.1}/zensical.toml +0 -0
@@ -46,15 +46,15 @@ jobs:
46
46
  df -h
47
47
 
48
48
  - name: Checkout repository
49
- uses: actions/checkout@v6.0.3
49
+ uses: actions/checkout@v7.0.1
50
50
  with:
51
51
  fetch-depth: 0 # Full history for version detection
52
52
 
53
53
  - name: Set up Docker Buildx
54
- uses: docker/setup-buildx-action@v4.1.0
54
+ uses: docker/setup-buildx-action@v4.2.0
55
55
 
56
56
  - name: Log in to Container Registry
57
- uses: docker/login-action@v4.2.0
57
+ uses: docker/login-action@v4.5.1
58
58
  with:
59
59
  registry: ${{ env.REGISTRY }}
60
60
  username: ${{ github.actor }}
@@ -71,7 +71,7 @@ jobs:
71
71
 
72
72
  - name: Extract metadata
73
73
  id: meta
74
- uses: docker/metadata-action@v6.1.0
74
+ uses: docker/metadata-action@v6.2.0
75
75
  with:
76
76
  images: ${{ env.REGISTRY }}/${{ github.repository }}-${{ matrix.image }}
77
77
  tags: |
@@ -80,7 +80,7 @@ jobs:
80
80
  type=sha,suffix=-${{ matrix.suffix }}
81
81
 
82
82
  - name: Build and push
83
- uses: docker/build-push-action@v7.2.0
83
+ uses: docker/build-push-action@v7.3.0
84
84
  with:
85
85
  context: .
86
86
  file: ${{ matrix.dockerfile }}
@@ -111,15 +111,15 @@ jobs:
111
111
 
112
112
  steps:
113
113
  - name: Checkout repository
114
- uses: actions/checkout@v6.0.3
114
+ uses: actions/checkout@v7.0.1
115
115
  with:
116
116
  fetch-depth: 0 # Full history for version detection
117
117
 
118
118
  - name: Set up Docker Buildx
119
- uses: docker/setup-buildx-action@v4.1.0
119
+ uses: docker/setup-buildx-action@v4.2.0
120
120
 
121
121
  - name: Log in to Container Registry
122
- uses: docker/login-action@v4.2.0
122
+ uses: docker/login-action@v4.5.1
123
123
  with:
124
124
  registry: ${{ env.REGISTRY }}
125
125
  username: ${{ github.actor }}
@@ -136,7 +136,7 @@ jobs:
136
136
 
137
137
  - name: Extract metadata
138
138
  id: meta
139
- uses: docker/metadata-action@v6.1.0
139
+ uses: docker/metadata-action@v6.2.0
140
140
  with:
141
141
  images: ${{ env.REGISTRY }}/${{ github.repository }}-${{ matrix.image }}
142
142
  tags: |
@@ -145,7 +145,7 @@ jobs:
145
145
  type=sha
146
146
 
147
147
  - name: Build and push
148
- uses: docker/build-push-action@v7.2.0
148
+ uses: docker/build-push-action@v7.3.0
149
149
  with:
150
150
  context: .
151
151
  file: ${{ matrix.dockerfile }}
@@ -27,12 +27,12 @@ jobs:
27
27
  build:
28
28
  runs-on: ubuntu-latest
29
29
  steps:
30
- - uses: actions/checkout@v6.0.3
30
+ - uses: actions/checkout@v7.0.1
31
31
  with:
32
32
  lfs: true
33
33
 
34
34
  - name: Install uv
35
- uses: astral-sh/setup-uv@v8.2.0
35
+ uses: astral-sh/setup-uv@v8.3.2
36
36
 
37
37
  - name: Set up Python
38
38
  run: uv python install 3.12
@@ -11,18 +11,18 @@ jobs:
11
11
  runs-on: ubuntu-latest
12
12
  steps:
13
13
  - name: Check out repository
14
- uses: actions/checkout@v6.0.3
14
+ uses: actions/checkout@v7.0.1
15
15
  with:
16
16
  persist-credentials: false
17
17
  fetch-depth: 0
18
18
 
19
19
  - name: Set up Python
20
- uses: actions/setup-python@v6.2.0
20
+ uses: actions/setup-python@v6.3.0
21
21
  with:
22
22
  python-version: "3.13.11"
23
23
 
24
24
  - name: Install uv
25
- uses: astral-sh/setup-uv@v8.2.0
25
+ uses: astral-sh/setup-uv@v8.3.2
26
26
 
27
27
  - name: Run markdown-code-runner
28
28
  env:
@@ -18,16 +18,16 @@ jobs:
18
18
  python-version: ["3.11", "3.13"]
19
19
 
20
20
  steps:
21
- - uses: actions/checkout@v6.0.3
21
+ - uses: actions/checkout@v7.0.1
22
22
  - name: Set up Python ${{ matrix.python-version }}
23
- uses: actions/setup-python@v6.2.0
23
+ uses: actions/setup-python@v6.3.0
24
24
  with:
25
25
  python-version: ${{ matrix.python-version }}
26
26
  - name: Install portaudio (Linux only)
27
27
  if: matrix.os == 'ubuntu-latest'
28
28
  run: sudo apt-get update && sudo apt-get install -y portaudio19-dev
29
29
  - name: Install uv
30
- uses: astral-sh/setup-uv@v8.2.0
30
+ uses: astral-sh/setup-uv@v8.3.2
31
31
  - name: Run macOS app Swift tests
32
32
  if: matrix.os == 'macos-latest' && matrix.python-version == '3.13'
33
33
  run: swift test --package-path macos/AgentCLI --enable-xctest
@@ -9,6 +9,6 @@ jobs:
9
9
  update_release_draft:
10
10
  runs-on: ubuntu-latest
11
11
  steps:
12
- - uses: release-drafter/release-drafter@v7.3.1
12
+ - uses: release-drafter/release-drafter@v7.6.0
13
13
  env:
14
14
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -14,9 +14,9 @@ jobs:
14
14
  permissions:
15
15
  id-token: write
16
16
  steps:
17
- - uses: actions/checkout@v6.0.3
17
+ - uses: actions/checkout@v7.0.1
18
18
  - name: Install uv
19
- uses: astral-sh/setup-uv@v8.2.0
19
+ uses: astral-sh/setup-uv@v8.3.2
20
20
  - name: Build
21
21
  run: uv build
22
22
  - name: Publish package distributions to PyPI
@@ -29,9 +29,9 @@ jobs:
29
29
  permissions:
30
30
  contents: write
31
31
  steps:
32
- - uses: actions/checkout@v6.0.3
32
+ - uses: actions/checkout@v7.0.1
33
33
  - name: Install uv
34
- uses: astral-sh/setup-uv@v8.2.0
34
+ uses: astral-sh/setup-uv@v8.3.2
35
35
  - name: Import Developer ID certificate
36
36
  uses: apple-actions/import-codesign-certs@v7.0.0
37
37
  with:
@@ -11,13 +11,13 @@ repos:
11
11
  - id: end-of-file-fixer
12
12
  - id: mixed-line-ending
13
13
  - repo: https://github.com/astral-sh/ruff-pre-commit
14
- rev: "v0.15.16"
14
+ rev: "v0.15.22"
15
15
  hooks:
16
16
  - id: ruff
17
17
  args: ["--fix"]
18
18
  - id: ruff-format
19
19
  - repo: https://github.com/pre-commit/mirrors-mypy
20
- rev: "v2.1.0"
20
+ rev: "v2.3.0"
21
21
  hooks:
22
22
  - id: mypy
23
23
  additional_dependencies: ["types-PyYAML"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.101.0
3
+ Version: 0.102.1
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>
@@ -0,0 +1,16 @@
1
+ """A suite of AI-powered command-line tools for text correction, audio transcription, and voice assistance."""
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ if TYPE_CHECKING:
6
+ __version__: str
7
+
8
+
9
+ def __getattr__(name: str) -> str:
10
+ """Resolve `__version__` lazily; reading distribution metadata costs ~29ms."""
11
+ if name == "__version__":
12
+ from importlib.metadata import version # noqa: PLC0415
13
+
14
+ return version("agent-cli")
15
+ msg = f"module {__name__!r} has no attribute {name!r}"
16
+ raise AttributeError(msg)
@@ -9,7 +9,6 @@ from typing import Annotated, Any
9
9
  import typer
10
10
  from rich.table import Table
11
11
 
12
- from . import __version__
13
12
  from .config import load_config, normalize_provider_defaults
14
13
  from .core.process import set_process_title
15
14
  from .core.utils import console
@@ -49,6 +48,8 @@ app = typer.Typer(
49
48
 
50
49
  def _version_callback(value: bool) -> None:
51
50
  if value:
51
+ from . import __version__ # noqa: PLC0415
52
+
52
53
  path = Path(__file__).parent
53
54
  data = [
54
55
  ("agent-cli version", __version__),
@@ -89,6 +89,28 @@ def _unidep_cmd(subcommand: str) -> str | None:
89
89
  return None
90
90
 
91
91
 
92
+ def _python_install_commands(install_args: str) -> list[str] | None:
93
+ """Build install commands using the best available Python installer.
94
+
95
+ Prefers uv (``uv venv`` creates ./.venv, which ``uv pip install`` then
96
+ targets from the working directory), then pip, then pip3. Returns None
97
+ when no installer is available.
98
+
99
+ Evidence: https://docs.astral.sh/uv/pip/environments/ - ``uv venv``
100
+ creates a virtual environment at .venv and ``uv pip install`` installs
101
+ into the .venv in the working directory. Note ``uv pip`` prefers an
102
+ activated environment (VIRTUAL_ENV) over ./.venv, which run_setup()
103
+ handles by clearing VIRTUAL_ENV from the subprocess environment.
104
+ """
105
+ if shutil.which("uv"):
106
+ return ["uv venv", f"uv pip install {install_args}"]
107
+ if shutil.which("pip"):
108
+ return [f"pip install {install_args}"]
109
+ if shutil.which("pip3"):
110
+ return [f"pip3 install {install_args}"]
111
+ return None
112
+
113
+
92
114
  def _detect_unidep_project(path: Path) -> ProjectType | None:
93
115
  """Detect unidep project and determine the appropriate install command.
94
116
 
@@ -143,6 +165,29 @@ def _detect_unidep_project(path: Path) -> ProjectType | None:
143
165
  return None
144
166
 
145
167
 
168
+ def _detect_pip_install_project(path: Path) -> ProjectType | None:
169
+ """Detect pip-installable Python projects, skipped when no installer is available."""
170
+ if (path / "requirements.txt").exists():
171
+ commands = _python_install_commands("-r requirements.txt")
172
+ if commands is not None:
173
+ return ProjectType(
174
+ name="python-pip",
175
+ setup_commands=commands,
176
+ description="Python project with pip",
177
+ )
178
+
179
+ if (path / "pyproject.toml").exists():
180
+ commands = _python_install_commands("-e .")
181
+ if commands is not None:
182
+ return ProjectType(
183
+ name="python",
184
+ setup_commands=commands,
185
+ description="Python project",
186
+ )
187
+
188
+ return None
189
+
190
+
146
191
  def detect_project_type(path: Path) -> ProjectType | None: # noqa: PLR0911
147
192
  """Detect the project type based on files present.
148
193
 
@@ -181,21 +226,10 @@ def detect_project_type(path: Path) -> ProjectType | None: # noqa: PLR0911
181
226
  description="Python project with Poetry",
182
227
  )
183
228
 
184
- # Python with pip/requirements.txt
185
- if (path / "requirements.txt").exists():
186
- return ProjectType(
187
- name="python-pip",
188
- setup_commands=["pip install -r requirements.txt"],
189
- description="Python project with pip",
190
- )
191
-
192
- # Python with pyproject.toml (generic)
193
- if (path / "pyproject.toml").exists():
194
- return ProjectType(
195
- name="python",
196
- setup_commands=["pip install -e ."],
197
- description="Python project",
198
- )
229
+ # Python with pip/requirements.txt or generic pyproject.toml
230
+ pip_project = _detect_pip_install_project(path)
231
+ if pip_project is not None:
232
+ return pip_project
199
233
 
200
234
  # Node.js with pnpm
201
235
  if (path / "pnpm-lock.yaml").exists():
@@ -178,6 +178,15 @@ def _download_tts_models(
178
178
  console.print("[bold green]Download complete![/bold green]")
179
179
 
180
180
 
181
+ def _default_tts_model(backend: str) -> str:
182
+ """Get the default model or voice for a resolved TTS backend."""
183
+ if backend == "kokoro":
184
+ from agent_cli.server.tts.backends.kokoro import DEFAULT_VOICE # noqa: PLC0415
185
+
186
+ return DEFAULT_VOICE
187
+ return "en_US-lessac-medium"
188
+
189
+
181
190
  def _check_whisper_deps(backend: str, *, download_only: bool = False) -> None:
182
191
  """Check that Whisper dependencies are available."""
183
192
  _check_server_deps()
@@ -911,7 +920,7 @@ def tts_cmd( # noqa: PLR0915
911
920
 
912
921
  # Default model based on backend (Kokoro auto-downloads from HuggingFace)
913
922
  if model is None:
914
- model = ["kokoro"] if resolved_backend == "kokoro" else ["en_US-lessac-medium"]
923
+ model = [_default_tts_model(resolved_backend)]
915
924
 
916
925
  # Validate default model against model list
917
926
  if default_model is not None and default_model not in model:
@@ -17,9 +17,10 @@ from agent_cli.server.tts.backends.base import (
17
17
  logger = logging.getLogger(__name__)
18
18
 
19
19
  BackendType = Literal["piper", "kokoro", "auto"]
20
+ ResolvedBackendType = Literal["piper", "kokoro"]
20
21
 
21
22
 
22
- def detect_backend() -> Literal["piper", "kokoro"]:
23
+ def detect_backend() -> ResolvedBackendType:
23
24
  """Detect the best backend for the current platform.
24
25
 
25
26
  Returns:
@@ -76,6 +77,7 @@ def create_backend(
76
77
  __all__ = [
77
78
  "BackendConfig",
78
79
  "BackendType",
80
+ "ResolvedBackendType",
79
81
  "SynthesisResult",
80
82
  "create_backend",
81
83
  "detect_backend",
@@ -12,8 +12,10 @@ from agent_cli.server.model_manager import ModelConfig, ModelManager, ModelStats
12
12
  from agent_cli.server.tts.backends import (
13
13
  BackendConfig,
14
14
  BackendType,
15
+ ResolvedBackendType,
15
16
  SynthesisResult,
16
17
  create_backend,
18
+ detect_backend,
17
19
  )
18
20
 
19
21
  if TYPE_CHECKING:
@@ -40,16 +42,25 @@ class TTSModelManager:
40
42
  def __init__(self, config: TTSModelConfig) -> None:
41
43
  """Initialize the TTS model manager."""
42
44
  self.config = config
45
+ backend_type: ResolvedBackendType = (
46
+ detect_backend() if config.backend_type == "auto" else config.backend_type
47
+ )
48
+ self._backend_type = backend_type
43
49
  backend = create_backend(
44
50
  BackendConfig(
45
51
  model_name=config.model_name,
46
52
  device=config.device,
47
53
  cache_dir=config.cache_dir,
48
54
  ),
49
- backend_type=config.backend_type,
55
+ backend_type=backend_type,
50
56
  )
51
57
  self._manager = ModelManager(backend, config)
52
58
 
59
+ @property
60
+ def backend_type(self) -> ResolvedBackendType:
61
+ """Get the resolved backend type."""
62
+ return self._backend_type
63
+
53
64
  @property
54
65
  def stats(self) -> ModelStats:
55
66
  """Get the model statistics."""
@@ -21,6 +21,59 @@ if TYPE_CHECKING:
21
21
 
22
22
  logger = logging.getLogger(__name__)
23
23
 
24
+ _KOKORO_LANGUAGE_TAGS = {
25
+ "a": "en-US",
26
+ "b": "en-GB",
27
+ "e": "es",
28
+ "f": "fr",
29
+ "h": "hi",
30
+ "i": "it",
31
+ "j": "ja",
32
+ "p": "pt-BR",
33
+ "z": "zh",
34
+ }
35
+
36
+
37
+ def _tts_voice(name: str, backend_type: str) -> TtsVoice:
38
+ """Build Wyoming voice metadata for a registered TTS model."""
39
+ if backend_type == "kokoro":
40
+ prefix, separator, voice_name = name.partition("_")
41
+ is_voice = (
42
+ separator == "_"
43
+ and prefix[:1] in _KOKORO_LANGUAGE_TAGS
44
+ and prefix[1:] in {"f", "m"}
45
+ and bool(voice_name)
46
+ )
47
+ if not is_voice:
48
+ from agent_cli.server.tts.backends.kokoro import DEFAULT_VOICE # noqa: PLC0415
49
+
50
+ name = DEFAULT_VOICE
51
+ language = _KOKORO_LANGUAGE_TAGS[name[0]]
52
+ return TtsVoice(
53
+ name=name,
54
+ description=f"Kokoro TTS {name}",
55
+ attribution=Attribution(
56
+ name="Kokoro",
57
+ url="https://huggingface.co/hexgrad/Kokoro-82M",
58
+ ),
59
+ installed=True,
60
+ languages=[language],
61
+ version="1.0",
62
+ )
63
+
64
+ return TtsVoice(
65
+ name=name,
66
+ description=f"Piper TTS {name}",
67
+ attribution=Attribution(
68
+ name="Piper",
69
+ url="https://github.com/rhasspy/piper",
70
+ ),
71
+ installed=True,
72
+ # Extract language from model name (e.g., "en_US-lessac-medium" -> "en")
73
+ languages=[name.split("_", maxsplit=1)[0] if "_" in name else "en"],
74
+ version="1.0",
75
+ )
76
+
24
77
 
25
78
  class WyomingTTSHandler(AsyncEventHandler):
26
79
  """Wyoming event handler for TTS.
@@ -88,11 +141,12 @@ class WyomingTTSHandler(AsyncEventHandler):
88
141
 
89
142
  try:
90
143
  manager = self._registry.get_manager()
144
+ voice = synthesize.voice.name if synthesize.voice else None
91
145
 
92
146
  if manager.supports_streaming:
93
- await self._synthesize_streaming(manager, text, synthesize.voice)
147
+ await self._synthesize_streaming(manager, text, voice)
94
148
  else:
95
- await self._synthesize_complete(manager, text, synthesize.voice)
149
+ await self._synthesize_complete(manager, text, voice)
96
150
 
97
151
  except Exception:
98
152
  logger.exception("Wyoming synthesis failed")
@@ -194,17 +248,9 @@ class WyomingTTSHandler(AsyncEventHandler):
194
248
 
195
249
  # Get list of available models as voices
196
250
  voices = [
197
- TtsVoice(
198
- name=status.name,
199
- description=f"Piper TTS {status.name}",
200
- attribution=Attribution(
201
- name="Piper",
202
- url="https://github.com/rhasspy/piper",
203
- ),
204
- installed=True,
205
- # Extract language from model name (e.g., "en_US-lessac-medium" -> "en")
206
- languages=[status.name.split("_")[0] if "_" in status.name else "en"],
207
- version="1.0",
251
+ _tts_voice(
252
+ status.name,
253
+ self._registry.get_manager(status.name).backend_type,
208
254
  )
209
255
  for status in self._registry.list_status()
210
256
  ]
@@ -14,8 +14,8 @@
14
14
  "kind" : "remoteSourceControl",
15
15
  "location" : "https://github.com/sparkle-project/Sparkle",
16
16
  "state" : {
17
- "revision" : "d46d456107feacc80711b21847b82b07bd9fb46e",
18
- "version" : "2.9.3"
17
+ "revision" : "b6496a74a087257ef5e6da1c5b29a447a60f5bd7",
18
+ "version" : "2.9.4"
19
19
  }
20
20
  }
21
21
  ],
@@ -12,7 +12,7 @@ let package = Package(
12
12
  ],
13
13
  dependencies: [
14
14
  .package(url: "https://github.com/sindresorhus/KeyboardShortcuts", exact: "1.10.0"),
15
- .package(url: "https://github.com/sparkle-project/Sparkle", exact: "2.9.3"),
15
+ .package(url: "https://github.com/sparkle-project/Sparkle", exact: "2.9.4"),
16
16
  ],
17
17
  targets: [
18
18
  .executableTarget(
@@ -27,6 +27,29 @@ private final class UserInstalledCLICheckCache {
27
27
  }
28
28
  }
29
29
 
30
+ /// Caches the login shell PATH lookup, which costs a full `zsh -lic` startup
31
+ /// (~1s with a typical dotfiles setup) and would otherwise run on every command.
32
+ /// Only successful lookups are cached, so a shell that fails once does not
33
+ /// degrade PATH for the rest of the session.
34
+ private final class LoginShellPATHCache {
35
+ private let lock = NSLock()
36
+ private var resolved: String?
37
+
38
+ func value(compute: () -> String?) -> String? {
39
+ lock.lock()
40
+ defer { lock.unlock() }
41
+ if let resolved {
42
+ return resolved
43
+ }
44
+ resolved = compute()
45
+ return resolved
46
+ }
47
+
48
+ func invalidate() {
49
+ lock.withLock { resolved = nil }
50
+ }
51
+ }
52
+
30
53
  typealias AgentProcessRunner = (URL, [String], [String: String]) -> CommandResult
31
54
  typealias LocalhostConnector = (UInt16) -> Bool
32
55
 
@@ -58,6 +81,7 @@ struct AgentRuntime {
58
81
  private let processRunner: AgentProcessRunner
59
82
  private let localhostConnector: LocalhostConnector
60
83
  private let userInstalledCLICheckCache: UserInstalledCLICheckCache
84
+ private let loginShellPATHCache: LoginShellPATHCache
61
85
  private let whisperReadyTimeout: TimeInterval
62
86
  let appSupportURL: URL
63
87
  let bundledUVURL: URL
@@ -90,6 +114,7 @@ struct AgentRuntime {
90
114
  self.processRunner = processRunner
91
115
  self.localhostConnector = localhostConnector
92
116
  self.userInstalledCLICheckCache = UserInstalledCLICheckCache()
117
+ self.loginShellPATHCache = LoginShellPATHCache()
93
118
  self.whisperReadyTimeout = whisperReadyTimeout
94
119
 
95
120
  if let override = environment["AGENTCLI_APP_SUPPORT_DIR"], !override.isEmpty {
@@ -343,6 +368,9 @@ struct AgentRuntime {
343
368
  progress: AgentBootstrapProgress = { _ in }
344
369
  ) -> CommandResult {
345
370
  let mode = runtimeMode
371
+ if force {
372
+ loginShellPATHCache.invalidate()
373
+ }
346
374
  do {
347
375
  try prepareDirectories(for: mode)
348
376
  } catch {
@@ -647,7 +675,7 @@ struct AgentRuntime {
647
675
  let existingPATH = environment["PATH"] ?? "/usr/bin:/bin:/usr/sbin:/sbin"
648
676
  environment["PATH"] = userInstalledCLIPath(
649
677
  existingPATH: existingPATH,
650
- loginShellPATH: Self.loginShellPATH(environment: baseEnvironment)
678
+ loginShellPATH: loginShellPATHCache.value { loginShellPATH() }
651
679
  )
652
680
  return environment
653
681
  }
@@ -708,14 +736,14 @@ struct AgentRuntime {
708
736
  .joined(separator: ":")
709
737
  }
710
738
 
711
- private static func loginShellPATH(environment: [String: String]) -> String? {
712
- let shellPath = environment["SHELL"].flatMap { $0.isEmpty ? nil : $0 } ?? "/bin/zsh"
713
- guard FileManager.default.isExecutableFile(atPath: shellPath) else { return nil }
739
+ private func loginShellPATH() -> String? {
740
+ let shellPath = baseEnvironment["SHELL"].flatMap { $0.isEmpty ? nil : $0 } ?? "/bin/zsh"
741
+ guard fileManager.isExecutableFile(atPath: shellPath) else { return nil }
714
742
 
715
- let result = runProcess(
716
- executableURL: URL(fileURLWithPath: shellPath),
717
- arguments: ["-lic", "printf '%s\\n' \"$PATH\""],
718
- environment: environment
743
+ let result = processRunner(
744
+ URL(fileURLWithPath: shellPath),
745
+ ["-lic", "printf '%s\\n' \"$PATH\""],
746
+ baseEnvironment
719
747
  )
720
748
  guard result.exitCode == 0 else { return nil }
721
749