agent-cli 0.98.1__tar.gz → 0.98.3__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 (446) hide show
  1. {agent_cli-0.98.1 → agent_cli-0.98.3}/PKG-INFO +1 -1
  2. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/cli.py +1 -1
  3. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/whisper/backends/nemo.py +20 -1
  4. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/server/whisper.md +8 -1
  5. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +125 -42
  6. agent_cli-0.98.3/macos/AgentCLI/Tests/AgentCLITests/ConfigurableHotkeyControllerTests.swift +36 -0
  7. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/appcast.xml +15 -18
  8. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_nemo_backend.py +38 -4
  9. {agent_cli-0.98.1 → agent_cli-0.98.3}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  10. {agent_cli-0.98.1 → agent_cli-0.98.3}/.claude/skills/agent-cli-dev/examples.md +0 -0
  11. {agent_cli-0.98.1 → agent_cli-0.98.3}/.claude-plugin/README.md +0 -0
  12. {agent_cli-0.98.1 → agent_cli-0.98.3}/.claude-plugin/marketplace.json +0 -0
  13. {agent_cli-0.98.1 → agent_cli-0.98.3}/.claude-plugin/plugin.json +0 -0
  14. {agent_cli-0.98.1 → agent_cli-0.98.3}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  15. {agent_cli-0.98.1 → agent_cli-0.98.3}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  16. {agent_cli-0.98.1 → agent_cli-0.98.3}/.cursorrules +0 -0
  17. {agent_cli-0.98.1 → agent_cli-0.98.3}/.dockerignore +0 -0
  18. {agent_cli-0.98.1 → agent_cli-0.98.3}/.env.example +0 -0
  19. {agent_cli-0.98.1 → agent_cli-0.98.3}/.github/logo.svg +0 -0
  20. {agent_cli-0.98.1 → agent_cli-0.98.3}/.github/release-drafter.yml +0 -0
  21. {agent_cli-0.98.1 → agent_cli-0.98.3}/.github/renovate.json +0 -0
  22. {agent_cli-0.98.1 → agent_cli-0.98.3}/.github/scripts/check_extras_sync.py +0 -0
  23. {agent_cli-0.98.1 → agent_cli-0.98.3}/.github/scripts/check_plugin_skill_sync.py +0 -0
  24. {agent_cli-0.98.1 → agent_cli-0.98.3}/.github/scripts/normalize_appcast.py +0 -0
  25. {agent_cli-0.98.1 → agent_cli-0.98.3}/.github/scripts/sync_extras.py +0 -0
  26. {agent_cli-0.98.1 → agent_cli-0.98.3}/.github/scripts/sync_requirements.py +0 -0
  27. {agent_cli-0.98.1 → agent_cli-0.98.3}/.github/workflows/automerge.yml +0 -0
  28. {agent_cli-0.98.1 → agent_cli-0.98.3}/.github/workflows/docker.yml +0 -0
  29. {agent_cli-0.98.1 → agent_cli-0.98.3}/.github/workflows/docs.yml +0 -0
  30. {agent_cli-0.98.1 → agent_cli-0.98.3}/.github/workflows/markdown-code-runner.yml +0 -0
  31. {agent_cli-0.98.1 → agent_cli-0.98.3}/.github/workflows/pytest.yml +0 -0
  32. {agent_cli-0.98.1 → agent_cli-0.98.3}/.github/workflows/release-drafter.yml +0 -0
  33. {agent_cli-0.98.1 → agent_cli-0.98.3}/.github/workflows/release.yml +0 -0
  34. {agent_cli-0.98.1 → agent_cli-0.98.3}/.github/workflows/toc.yaml +0 -0
  35. {agent_cli-0.98.1 → agent_cli-0.98.3}/.gitignore +0 -0
  36. {agent_cli-0.98.1 → agent_cli-0.98.3}/.jscpd.json +0 -0
  37. {agent_cli-0.98.1 → agent_cli-0.98.3}/.pre-commit-config.yaml +0 -0
  38. {agent_cli-0.98.1 → agent_cli-0.98.3}/.prompts/docs-review.md +0 -0
  39. {agent_cli-0.98.1 → agent_cli-0.98.3}/.prompts/pr-review.md +0 -0
  40. {agent_cli-0.98.1 → agent_cli-0.98.3}/CLAUDE.md +0 -0
  41. {agent_cli-0.98.1 → agent_cli-0.98.3}/LICENSE +0 -0
  42. {agent_cli-0.98.1 → agent_cli-0.98.3}/LLAMA_SERVER_USAGE.md +0 -0
  43. {agent_cli-0.98.1 → agent_cli-0.98.3}/README.md +0 -0
  44. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/__init__.py +0 -0
  45. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/__main__.py +0 -0
  46. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_extras.json +0 -0
  47. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_overrides/nemo-whisper.txt +0 -0
  48. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_requirements/.gitkeep +0 -0
  49. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_requirements/audio.txt +0 -0
  50. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_requirements/diarization.txt +0 -0
  51. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_requirements/faster-whisper.txt +0 -0
  52. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_requirements/kokoro.txt +0 -0
  53. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_requirements/llm.txt +0 -0
  54. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_requirements/memory.txt +0 -0
  55. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  56. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_requirements/nemo-whisper.txt +0 -0
  57. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_requirements/piper.txt +0 -0
  58. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_requirements/rag.txt +0 -0
  59. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_requirements/server.txt +0 -0
  60. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_requirements/speed.txt +0 -0
  61. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_requirements/vad.txt +0 -0
  62. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_requirements/vectordb.txt +0 -0
  63. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  64. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_requirements/wyoming.txt +0 -0
  65. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/_tools.py +0 -0
  66. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/agents/__init__.py +0 -0
  67. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/agents/_voice_agent_common.py +0 -0
  68. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/agents/assistant.py +0 -0
  69. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/agents/autocorrect.py +0 -0
  70. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/agents/chat.py +0 -0
  71. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/agents/diarize_live_session.py +0 -0
  72. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/agents/memory/__init__.py +0 -0
  73. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/agents/memory/add.py +0 -0
  74. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/agents/memory/proxy.py +0 -0
  75. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/agents/rag_proxy.py +0 -0
  76. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/agents/speak.py +0 -0
  77. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/agents/speakers.py +0 -0
  78. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/agents/transcribe.py +0 -0
  79. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/agents/transcribe_live.py +0 -0
  80. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/agents/voice_edit.py +0 -0
  81. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/api.py +0 -0
  82. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/cli.py +0 -0
  83. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/config.py +0 -0
  84. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/config_cmd.py +0 -0
  85. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/constants.py +0 -0
  86. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/core/__init__.py +0 -0
  87. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/core/alignment.py +0 -0
  88. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/core/audio.py +0 -0
  89. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/core/audio_format.py +0 -0
  90. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/core/chroma.py +0 -0
  91. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/core/deps.py +0 -0
  92. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/core/diarization.py +0 -0
  93. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/core/openai_proxy.py +0 -0
  94. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/core/process.py +0 -0
  95. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/core/reranker.py +0 -0
  96. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/core/speaker_identity.py +0 -0
  97. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/core/sse.py +0 -0
  98. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/core/transcription_logger.py +0 -0
  99. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/core/utils.py +0 -0
  100. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/core/vad.py +0 -0
  101. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/core/watch.py +0 -0
  102. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/daemon/__init__.py +0 -0
  103. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/daemon/cli.py +0 -0
  104. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/__init__.py +0 -0
  105. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/_branch_name.py +0 -0
  106. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/_config.py +0 -0
  107. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/_output.py +0 -0
  108. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/cleanup.py +0 -0
  109. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/cli.py +0 -0
  110. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/coding_agents/__init__.py +0 -0
  111. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/coding_agents/aider.py +0 -0
  112. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/coding_agents/base.py +0 -0
  113. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/coding_agents/claude.py +0 -0
  114. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/coding_agents/codex.py +0 -0
  115. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  116. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/coding_agents/copilot.py +0 -0
  117. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  118. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/coding_agents/gemini.py +0 -0
  119. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/coding_agents/opencode.py +0 -0
  120. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/coding_agents/registry.py +0 -0
  121. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/editors/__init__.py +0 -0
  122. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/editors/base.py +0 -0
  123. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/editors/cursor.py +0 -0
  124. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/editors/emacs.py +0 -0
  125. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/editors/jetbrains.py +0 -0
  126. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/editors/nano.py +0 -0
  127. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/editors/neovim.py +0 -0
  128. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/editors/registry.py +0 -0
  129. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/editors/sublime.py +0 -0
  130. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/editors/vim.py +0 -0
  131. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/editors/vscode.py +0 -0
  132. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/editors/zed.py +0 -0
  133. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/hooks.py +0 -0
  134. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/launch.py +0 -0
  135. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/project.py +0 -0
  136. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/registry.py +0 -0
  137. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/skill/SKILL.md +0 -0
  138. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/skill/examples.md +0 -0
  139. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/terminals/__init__.py +0 -0
  140. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  141. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/terminals/base.py +0 -0
  142. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/terminals/gnome.py +0 -0
  143. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/terminals/iterm2.py +0 -0
  144. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/terminals/kitty.py +0 -0
  145. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/terminals/registry.py +0 -0
  146. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/terminals/tmux.py +0 -0
  147. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/terminals/warp.py +0 -0
  148. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/terminals/zellij.py +0 -0
  149. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/dev/worktree.py +0 -0
  150. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/docs_gen.py +0 -0
  151. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/example-config.toml +0 -0
  152. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/install/__init__.py +0 -0
  153. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/install/common.py +0 -0
  154. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/install/extras.py +0 -0
  155. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/install/hotkeys.py +0 -0
  156. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/install/launchd.py +0 -0
  157. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/install/service_config.py +0 -0
  158. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/install/services.py +0 -0
  159. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/install/systemd.py +0 -0
  160. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/memory/__init__.py +0 -0
  161. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/memory/_files.py +0 -0
  162. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/memory/_filters.py +0 -0
  163. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/memory/_git.py +0 -0
  164. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/memory/_indexer.py +0 -0
  165. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/memory/_ingest.py +0 -0
  166. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/memory/_persistence.py +0 -0
  167. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/memory/_prompt.py +0 -0
  168. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/memory/_retrieval.py +0 -0
  169. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/memory/_store.py +0 -0
  170. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/memory/_streaming.py +0 -0
  171. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/memory/_tasks.py +0 -0
  172. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/memory/api.py +0 -0
  173. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/memory/client.py +0 -0
  174. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/memory/engine.py +0 -0
  175. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/memory/entities.py +0 -0
  176. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/memory/models.py +0 -0
  177. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/opts.py +0 -0
  178. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/py.typed +0 -0
  179. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/rag/__init__.py +0 -0
  180. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/rag/_indexer.py +0 -0
  181. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/rag/_indexing.py +0 -0
  182. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/rag/_prompt.py +0 -0
  183. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/rag/_retriever.py +0 -0
  184. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/rag/_store.py +0 -0
  185. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/rag/_utils.py +0 -0
  186. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/rag/api.py +0 -0
  187. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/rag/client.py +0 -0
  188. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/rag/engine.py +0 -0
  189. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/rag/models.py +0 -0
  190. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  191. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/__init__.py +0 -0
  192. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  193. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  194. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  195. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  196. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  197. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  198. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  199. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  200. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  201. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  202. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  203. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  204. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  205. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  206. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/run-openwakeword.sh +0 -0
  207. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  208. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/setup-linux.sh +0 -0
  209. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  210. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/setup-macos.sh +0 -0
  211. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/setup-windows.ps1 +0 -0
  212. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  213. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/scripts/start-all-services.sh +0 -0
  214. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/__init__.py +0 -0
  215. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/common.py +0 -0
  216. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/model_manager.py +0 -0
  217. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/model_registry.py +0 -0
  218. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/proxy/__init__.py +0 -0
  219. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/proxy/api.py +0 -0
  220. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/streaming.py +0 -0
  221. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/tts/__init__.py +0 -0
  222. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/tts/api.py +0 -0
  223. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/tts/backends/__init__.py +0 -0
  224. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/tts/backends/base.py +0 -0
  225. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/tts/backends/kokoro.py +0 -0
  226. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/tts/backends/piper.py +0 -0
  227. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/tts/model_manager.py +0 -0
  228. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/tts/model_registry.py +0 -0
  229. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/tts/wyoming_handler.py +0 -0
  230. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/whisper/__init__.py +0 -0
  231. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/whisper/api.py +0 -0
  232. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/whisper/backends/__init__.py +0 -0
  233. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/whisper/backends/base.py +0 -0
  234. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  235. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/whisper/backends/mlx.py +0 -0
  236. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/whisper/backends/transformers.py +0 -0
  237. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/whisper/languages.py +0 -0
  238. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/whisper/model_manager.py +0 -0
  239. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/whisper/model_registry.py +0 -0
  240. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  241. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/services/__init__.py +0 -0
  242. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/services/_wyoming_utils.py +0 -0
  243. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/services/asr.py +0 -0
  244. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/services/llm.py +0 -0
  245. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/services/tts.py +0 -0
  246. {agent_cli-0.98.1 → agent_cli-0.98.3}/agent_cli/services/wake_word.py +0 -0
  247. {agent_cli-0.98.1 → agent_cli-0.98.3}/docker/docker-compose.yml +0 -0
  248. {agent_cli-0.98.1 → agent_cli-0.98.3}/docker/memory-proxy.Dockerfile +0 -0
  249. {agent_cli-0.98.1 → agent_cli-0.98.3}/docker/rag-proxy.Dockerfile +0 -0
  250. {agent_cli-0.98.1 → agent_cli-0.98.3}/docker/transcribe-proxy.Dockerfile +0 -0
  251. {agent_cli-0.98.1 → agent_cli-0.98.3}/docker/tts.Dockerfile +0 -0
  252. {agent_cli-0.98.1 → agent_cli-0.98.3}/docker/whisper.Dockerfile +0 -0
  253. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/CNAME +0 -0
  254. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/architecture/index.md +0 -0
  255. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/architecture/memory.md +0 -0
  256. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/architecture/rag.md +0 -0
  257. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/assistant.md +0 -0
  258. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/autocorrect.md +0 -0
  259. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/chat.md +0 -0
  260. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/config.md +0 -0
  261. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/daemon.md +0 -0
  262. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/dev.md +0 -0
  263. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/diarize-live-session.md +0 -0
  264. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/index.md +0 -0
  265. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/install-extras.md +0 -0
  266. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/install-hotkeys.md +0 -0
  267. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/install-services.md +0 -0
  268. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/memory.md +0 -0
  269. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/rag-proxy.md +0 -0
  270. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/server/index.md +0 -0
  271. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/server/transcribe-proxy.md +0 -0
  272. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/server/tts.md +0 -0
  273. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/speak.md +0 -0
  274. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/speakers.md +0 -0
  275. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/start-services.md +0 -0
  276. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/transcribe-live.md +0 -0
  277. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/transcribe.md +0 -0
  278. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/commands/voice-edit.md +0 -0
  279. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/configuration.md +0 -0
  280. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/getting-started.md +0 -0
  281. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/iOS_Shortcut_Guide.md +0 -0
  282. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/index.md +0 -0
  283. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/installation/docker.md +0 -0
  284. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/installation/index.md +0 -0
  285. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/installation/linux.md +0 -0
  286. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/installation/macos-app.md +0 -0
  287. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/installation/macos.md +0 -0
  288. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/installation/nixos.md +0 -0
  289. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/installation/windows.md +0 -0
  290. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/logo-avatar.svg +0 -0
  291. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/logo-clean.svg +0 -0
  292. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  293. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/run_markdown_code_runner.py +0 -0
  294. {agent_cli-0.98.1 → agent_cli-0.98.3}/docs/system-integration.md +0 -0
  295. {agent_cli-0.98.1 → agent_cli-0.98.3}/example.agent-cli-config.toml +0 -0
  296. {agent_cli-0.98.1 → agent_cli-0.98.3}/justfile +0 -0
  297. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Package.resolved +0 -0
  298. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Package.swift +0 -0
  299. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/README.md +0 -0
  300. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
  301. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Resources/Info.plist +0 -0
  302. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
  303. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
  304. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
  305. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +0 -0
  306. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +0 -0
  307. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
  308. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
  309. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
  310. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
  311. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
  312. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  313. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
  314. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
  315. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +0 -0
  316. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +0 -0
  317. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
  318. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
  319. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
  320. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
  321. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
  322. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +0 -0
  323. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
  324. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +0 -0
  325. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
  326. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
  327. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
  328. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +0 -0
  329. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
  330. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
  331. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
  332. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
  333. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +0 -0
  334. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/build-macos-app.sh +0 -0
  335. {agent_cli-0.98.1 → agent_cli-0.98.3}/macos/test-macos-app-e2e.sh +0 -0
  336. {agent_cli-0.98.1 → agent_cli-0.98.3}/pyproject.toml +0 -0
  337. {agent_cli-0.98.1 → agent_cli-0.98.3}/reddit.md +0 -0
  338. {agent_cli-0.98.1 → agent_cli-0.98.3}/shell.nix +0 -0
  339. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/__init__.py +0 -0
  340. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/__init__.py +0 -0
  341. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_fix_my_text.py +0 -0
  342. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_interactive.py +0 -0
  343. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_interactive_extra.py +0 -0
  344. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_memory_add.py +0 -0
  345. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_speak.py +0 -0
  346. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_speak_e2e.py +0 -0
  347. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_speakers.py +0 -0
  348. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_transcribe.py +0 -0
  349. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_transcribe_agent.py +0 -0
  350. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_transcribe_e2e.py +0 -0
  351. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_transcribe_live.py +0 -0
  352. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_transcribe_recovery.py +0 -0
  353. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_tts_common.py +0 -0
  354. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_tts_common_extra.py +0 -0
  355. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_voice_agent_common.py +0 -0
  356. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_voice_edit.py +0 -0
  357. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_voice_edit_e2e.py +0 -0
  358. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/agents/test_wake_word_assistant.py +0 -0
  359. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/conftest.py +0 -0
  360. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/core/__init__.py +0 -0
  361. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/core/test_audio.py +0 -0
  362. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/core/test_audio_format.py +0 -0
  363. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/core/test_chroma.py +0 -0
  364. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/core/test_sse.py +0 -0
  365. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/core/test_vad.py +0 -0
  366. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/core/test_watch.py +0 -0
  367. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/dev/__init__.py +0 -0
  368. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/dev/test_cleanup.py +0 -0
  369. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/dev/test_cli.py +0 -0
  370. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/dev/test_coding_agents.py +0 -0
  371. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/dev/test_editors.py +0 -0
  372. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/dev/test_hooks.py +0 -0
  373. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/dev/test_launch.py +0 -0
  374. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/dev/test_project.py +0 -0
  375. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/dev/test_terminals.py +0 -0
  376. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/dev/test_verification.py +0 -0
  377. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/dev/test_worktree.py +0 -0
  378. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/install/__init__.py +0 -0
  379. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/install/test_extras.py +0 -0
  380. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/install/test_launchd.py +0 -0
  381. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/memory/__init__.py +0 -0
  382. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/memory/test_api_health.py +0 -0
  383. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/memory/test_api_integration_liveish.py +0 -0
  384. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/memory/test_client.py +0 -0
  385. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/memory/test_engine.py +0 -0
  386. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/memory/test_files.py +0 -0
  387. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/memory/test_filters.py +0 -0
  388. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/memory/test_git_integration.py +0 -0
  389. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/memory/test_indexer.py +0 -0
  390. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/memory/test_memory_integration.py +0 -0
  391. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/memory/test_proxy_passthrough.py +0 -0
  392. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/memory/test_store.py +0 -0
  393. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/memory/test_utils.py +0 -0
  394. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/mocks/__init__.py +0 -0
  395. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/mocks/audio.py +0 -0
  396. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/mocks/llm.py +0 -0
  397. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/mocks/wyoming.py +0 -0
  398. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/rag/__init__.py +0 -0
  399. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/rag/test_api.py +0 -0
  400. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/rag/test_engine.py +0 -0
  401. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/rag/test_history.py +0 -0
  402. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/rag/test_indexer.py +0 -0
  403. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/rag/test_indexing.py +0 -0
  404. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/rag/test_rag_client.py +0 -0
  405. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/rag/test_rag_integration_liveish.py +0 -0
  406. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  407. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/rag/test_retriever.py +0 -0
  408. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/rag/test_store.py +0 -0
  409. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/rag/test_utils.py +0 -0
  410. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_alignment.py +0 -0
  411. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_api.py +0 -0
  412. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_api_integration.py +0 -0
  413. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_asr.py +0 -0
  414. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_asr_recovery.py +0 -0
  415. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_audio_e2e.py +0 -0
  416. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_cli.py +0 -0
  417. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_config.py +0 -0
  418. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_config_cmd.py +0 -0
  419. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_daemon.py +0 -0
  420. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_diarization.py +0 -0
  421. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_diarize_live_session.py +0 -0
  422. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_docs_gen.py +0 -0
  423. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_env_vars.py +0 -0
  424. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_faster_whisper_backend.py +0 -0
  425. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_json_output.py +0 -0
  426. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_llm.py +0 -0
  427. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_llm_gemini.py +0 -0
  428. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_macos_app.py +0 -0
  429. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_memory_tools.py +0 -0
  430. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_mlx_backend.py +0 -0
  431. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_normalize_appcast.py +0 -0
  432. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_process_manager.py +0 -0
  433. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_requires_extras.py +0 -0
  434. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_server_streaming.py +0 -0
  435. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_server_tts.py +0 -0
  436. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_server_whisper.py +0 -0
  437. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_services.py +0 -0
  438. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_speaker_identity.py +0 -0
  439. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_tools.py +0 -0
  440. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_transformers_backend.py +0 -0
  441. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_tts.py +0 -0
  442. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_utils.py +0 -0
  443. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_wake_word.py +0 -0
  444. {agent_cli-0.98.1 → agent_cli-0.98.3}/tests/test_wyoming_utils.py +0 -0
  445. {agent_cli-0.98.1 → agent_cli-0.98.3}/uv.lock +0 -0
  446. {agent_cli-0.98.1 → agent_cli-0.98.3}/zensical.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.98.1
3
+ Version: 0.98.3
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>
@@ -351,7 +351,7 @@ def whisper_cmd( # noqa: C901, PLR0912, PLR0915
351
351
  "--device",
352
352
  "-d",
353
353
  help=(
354
- "Compute device: `auto` (detect GPU), `cuda`, `cuda:0`, `cpu`. "
354
+ "Compute device: `auto` (detect GPU), `cuda`, `cuda:0`, `mps`, `cpu`. "
355
355
  "MLX backend always uses Apple Silicon"
356
356
  ),
357
357
  ),
@@ -6,6 +6,8 @@ import asyncio
6
6
  import inspect
7
7
  import io
8
8
  import logging
9
+ import os
10
+ import sys
9
11
  import tempfile
10
12
  import time
11
13
  import wave
@@ -89,18 +91,35 @@ _state = _SubprocessState()
89
91
 
90
92
  def _resolve_device(device: str) -> str:
91
93
  """Resolve the runtime device for NeMo inference."""
94
+ if device in {"auto", "mps"} and sys.platform == "darwin":
95
+ os.environ.setdefault("PYTORCH_ENABLE_MPS_FALLBACK", "1")
96
+
92
97
  import torch # noqa: PLC0415
93
98
 
94
99
  if device == "auto":
95
- return "cuda" if torch.cuda.is_available() else "cpu"
100
+ if torch.cuda.is_available():
101
+ return "cuda"
102
+ if _mps_available(torch):
103
+ return "mps"
104
+ return "cpu"
96
105
 
97
106
  if device.startswith("cuda") and not torch.cuda.is_available():
98
107
  msg = f"CUDA device requested ({device}) but CUDA is not available"
99
108
  raise RuntimeError(msg)
100
109
 
110
+ if device == "mps" and not _mps_available(torch):
111
+ msg = "MPS device requested (mps) but MPS is not available"
112
+ raise RuntimeError(msg)
113
+
101
114
  return device
102
115
 
103
116
 
117
+ def _mps_available(torch: Any) -> bool:
118
+ """Return True when PyTorch exposes an available MPS backend."""
119
+ mps = getattr(getattr(torch, "backends", None), "mps", None)
120
+ return bool(mps is not None and mps.is_available())
121
+
122
+
104
123
  def _extract_text(hypothesis: Any) -> str:
105
124
  """Extract a transcript string from a NeMo hypothesis-like object."""
106
125
  if isinstance(hypothesis, str):
@@ -112,7 +112,7 @@ agent-cli server whisper \
112
112
  |--------|---------|-------------|
113
113
  | `--model, -m` | - | Whisper model(s) to load. Common models: `tiny`, `base`, `small`, `medium`, `large-v3`, `distil-large-v3`, `parakeet-tdt-0.6b-v3`, `parakeet-unified-en-0.6b` (NeMo backend). Can specify multiple for different accuracy/speed tradeoffs. Default: `large-v3` (`parakeet-unified-en-0.6b` with `--backend nemo`) |
114
114
  | `--default-model` | - | Model to use when client doesn't specify one. Must be in the `--model` list |
115
- | `--device, -d` | `auto` | Compute device: `auto` (detect GPU), `cuda`, `cuda:0`, `cpu`. MLX backend always uses Apple Silicon |
115
+ | `--device, -d` | `auto` | Compute device: `auto` (detect GPU), `cuda`, `cuda:0`, `mps`, `cpu`. MLX backend always uses Apple Silicon |
116
116
  | `--compute-type` | `auto` | Precision for faster-whisper: `auto`, `float16`, `int8`, `int8_float16`. Lower precision = faster + less VRAM |
117
117
  | `--cache-dir` | - | Custom directory for downloaded models (default: HuggingFace cache) |
118
118
  | `--default-language` | - | Fallback language code for requests that omit `language`. Required for models that do not support language auto-detection (for example Cohere Transcribe). |
@@ -269,6 +269,13 @@ pip install "agent-cli[mlx-whisper]"
269
269
 
270
270
  The server will automatically detect and use the MLX backend when available.
271
271
 
272
+ For NeMo/Parakeet models on Apple Silicon, `--device auto` uses PyTorch MPS when
273
+ available. You can also request it explicitly:
274
+
275
+ ```bash
276
+ agent-cli server whisper --backend nemo --model parakeet-unified-en-0.6b --device mps
277
+ ```
278
+
272
279
  ### HuggingFace Transformers
273
280
 
274
281
  For loading models in safetensors format (instead of CTranslate2 `.bin` files):
@@ -3,6 +3,70 @@ import Carbon.HIToolbox
3
3
  import Foundation
4
4
  import KeyboardShortcuts
5
5
 
6
+ enum HoldToTranscribeStopDecision: Equatable {
7
+ case none
8
+ case deferUntilStartCompletes
9
+ case stopNow
10
+ }
11
+
12
+ struct HoldToTranscribeKeyState {
13
+ private enum State {
14
+ case idle
15
+ case startPending(releaseRequested: Bool)
16
+ case recording
17
+ }
18
+
19
+ private var state: State = .idle
20
+
21
+ var isStartPendingOrRecording: Bool {
22
+ switch state {
23
+ case .idle:
24
+ return false
25
+ case .startPending, .recording:
26
+ return true
27
+ }
28
+ }
29
+
30
+ mutating func requestStart() -> Bool {
31
+ guard case .idle = state else { return false }
32
+ state = .startPending(releaseRequested: false)
33
+ return true
34
+ }
35
+
36
+ mutating func releaseKey() -> HoldToTranscribeStopDecision {
37
+ switch state {
38
+ case .idle:
39
+ return .none
40
+ case .startPending:
41
+ state = .startPending(releaseRequested: true)
42
+ return .deferUntilStartCompletes
43
+ case .recording:
44
+ state = .idle
45
+ return .stopNow
46
+ }
47
+ }
48
+
49
+ mutating func completeStart(started: Bool) -> HoldToTranscribeStopDecision {
50
+ guard case let .startPending(releaseRequested) = state else { return .none }
51
+ guard started else {
52
+ state = .idle
53
+ return .none
54
+ }
55
+
56
+ if releaseRequested {
57
+ state = .idle
58
+ return .stopNow
59
+ }
60
+
61
+ state = .recording
62
+ return .none
63
+ }
64
+
65
+ mutating func reset() {
66
+ state = .idle
67
+ }
68
+ }
69
+
6
70
  final class ConfigurableHotkeyController {
7
71
  static let shared = ConfigurableHotkeyController()
8
72
 
@@ -12,7 +76,7 @@ final class ConfigurableHotkeyController {
12
76
  private var runLoopSource: CFRunLoopSource?
13
77
  private var functionKeyIsDown = false
14
78
  private var suppressNextFunctionKeyRelease = false
15
- private var holdToTranscribeIsRecording = false
79
+ private var holdToTranscribeKeyState = HoldToTranscribeKeyState()
16
80
  private var pendingHoldToTranscribeWorkItem: DispatchWorkItem?
17
81
  private let holdToTranscribeDelay: TimeInterval = 0.16
18
82
 
@@ -52,9 +116,7 @@ final class ConfigurableHotkeyController {
52
116
  !self.usesFunctionShortcut(shortcut) else {
53
117
  return
54
118
  }
55
- Task { @MainActor in
56
- _ = runner.beginHoldToTranscribe()
57
- }
119
+ self.requestHoldToTranscribeStart(preferredRunner: runner)
58
120
  }
59
121
  KeyboardShortcuts.onKeyUp(for: .holdToTranscribe) {
60
122
  guard !ShortcutRecordingState.shared.isRecording,
@@ -62,7 +124,7 @@ final class ConfigurableHotkeyController {
62
124
  !self.usesFunctionShortcut(shortcut) else {
63
125
  return
64
126
  }
65
- Task { @MainActor in runner.endHoldToTranscribe() }
127
+ self.releaseHoldToTranscribeKey()
66
128
  }
67
129
  }
68
130
 
@@ -120,7 +182,7 @@ final class ConfigurableHotkeyController {
120
182
  runLoopSource = nil
121
183
  functionKeyIsDown = false
122
184
  suppressNextFunctionKeyRelease = false
123
- holdToTranscribeIsRecording = false
185
+ holdToTranscribeKeyState.reset()
124
186
  }
125
187
 
126
188
  func resumeFunctionAwareHotkeysAfterAccessibilityReset(runner: AgentCommandRunner) {
@@ -169,7 +231,7 @@ final class ConfigurableHotkeyController {
169
231
  cancelPendingHoldToTranscribe()
170
232
  suppressNextFunctionKeyRelease = usesFunctionShortcut(shortcut)
171
233
 
172
- if !isAutorepeat(event) && !holdToTranscribeIsRecording {
234
+ if !isAutorepeat(event) && !holdToTranscribeKeyState.isStartPendingOrRecording {
173
235
  Task { @MainActor in
174
236
  self.runner?.run(.toggleTranscription)
175
237
  }
@@ -190,25 +252,14 @@ final class ConfigurableHotkeyController {
190
252
  }
191
253
 
192
254
  if type == .keyDown {
193
- if !isAutorepeat(event) && !holdToTranscribeIsRecording {
194
- Task { @MainActor in
195
- guard let runner = self.runner else { return }
196
- if runner.beginHoldToTranscribe() {
197
- self.holdToTranscribeIsRecording = true
198
- }
199
- }
255
+ if !isAutorepeat(event) {
256
+ requestHoldToTranscribeStart()
200
257
  }
201
258
  return true
202
259
  }
203
260
 
204
261
  if type == .keyUp {
205
- if holdToTranscribeIsRecording {
206
- holdToTranscribeIsRecording = false
207
- Task { @MainActor in
208
- guard let runner = self.runner else { return }
209
- runner.endHoldToTranscribe()
210
- }
211
- }
262
+ releaseHoldToTranscribeKey()
212
263
  return true
213
264
  }
214
265
 
@@ -238,17 +289,7 @@ final class ConfigurableHotkeyController {
238
289
  return true
239
290
  }
240
291
 
241
- if holdToTranscribeIsRecording {
242
- holdToTranscribeIsRecording = false
243
- Task { @MainActor in
244
- guard let runner = self.runner else { return }
245
- runner.endHoldToTranscribe()
246
- }
247
- } else {
248
- Task { @MainActor in
249
- _ = self.runner?.stopTranscriptionFromFunctionKeyIfNeeded()
250
- }
251
- }
292
+ releaseHoldToTranscribeKey(stopExistingFunctionRecordingIfIdle: true)
252
293
 
253
294
  return true
254
295
  }
@@ -264,16 +305,7 @@ final class ConfigurableHotkeyController {
264
305
  }
265
306
 
266
307
  self.pendingHoldToTranscribeWorkItem = nil
267
- Task { @MainActor in
268
- if self.runner?.stopTranscriptionFromFunctionKeyIfNeeded() == true {
269
- return
270
- }
271
-
272
- guard let runner = self.runner else { return }
273
- if runner.beginHoldToTranscribe() {
274
- self.holdToTranscribeIsRecording = true
275
- }
276
- }
308
+ self.requestHoldToTranscribeStart(stopExistingFunctionRecordingFirst: true)
277
309
  }
278
310
 
279
311
  pendingHoldToTranscribeWorkItem = workItem
@@ -287,6 +319,57 @@ final class ConfigurableHotkeyController {
287
319
  pendingHoldToTranscribeWorkItem = nil
288
320
  }
289
321
 
322
+ private func requestHoldToTranscribeStart(
323
+ preferredRunner: AgentCommandRunner? = nil,
324
+ stopExistingFunctionRecordingFirst: Bool = false
325
+ ) {
326
+ guard holdToTranscribeKeyState.requestStart() else { return }
327
+ Task { @MainActor in
328
+ if stopExistingFunctionRecordingFirst,
329
+ self.runner?.stopTranscriptionFromFunctionKeyIfNeeded() == true {
330
+ _ = self.holdToTranscribeKeyState.completeStart(started: false)
331
+ return
332
+ }
333
+
334
+ guard let runner = preferredRunner ?? self.runner else {
335
+ _ = self.holdToTranscribeKeyState.completeStart(started: false)
336
+ return
337
+ }
338
+ self.finishHoldToTranscribeStart(runner: runner)
339
+ }
340
+ }
341
+
342
+ @MainActor
343
+ private func finishHoldToTranscribeStart(runner: AgentCommandRunner) {
344
+ let started = runner.beginHoldToTranscribe()
345
+ let action = holdToTranscribeKeyState.completeStart(started: started)
346
+ if action == .stopNow {
347
+ runner.endHoldToTranscribe()
348
+ }
349
+ }
350
+
351
+ private func releaseHoldToTranscribeKey(stopExistingFunctionRecordingIfIdle: Bool = false) {
352
+ switch holdToTranscribeKeyState.releaseKey() {
353
+ case .stopNow:
354
+ stopHoldToTranscribe()
355
+ case .none:
356
+ if stopExistingFunctionRecordingIfIdle {
357
+ Task { @MainActor in
358
+ _ = self.runner?.stopTranscriptionFromFunctionKeyIfNeeded()
359
+ }
360
+ }
361
+ case .deferUntilStartCompletes:
362
+ break
363
+ }
364
+ }
365
+
366
+ private func stopHoldToTranscribe() {
367
+ Task { @MainActor in
368
+ guard let runner = self.runner else { return }
369
+ runner.endHoldToTranscribe()
370
+ }
371
+ }
372
+
290
373
  private func shortcutMatches(type: CGEventType, event: CGEvent, shortcut: KeyboardShortcuts.Shortcut) -> Bool {
291
374
  guard type == .keyDown || type == .keyUp else {
292
375
  return false
@@ -0,0 +1,36 @@
1
+ #if canImport(XCTest)
2
+ import XCTest
3
+ @testable import AgentCLI
4
+
5
+ final class ConfigurableHotkeyControllerTests: XCTestCase {
6
+ func testReleaseBeforeHoldStartCompletesStopsAfterSuccessfulStart() {
7
+ var state = HoldToTranscribeKeyState()
8
+
9
+ XCTAssertTrue(state.requestStart())
10
+ XCTAssertEqual(state.releaseKey(), .deferUntilStartCompletes)
11
+
12
+ XCTAssertEqual(state.completeStart(started: true), .stopNow)
13
+ XCTAssertFalse(state.isStartPendingOrRecording)
14
+ }
15
+
16
+ func testReleaseAfterHoldStartStopsImmediately() {
17
+ var state = HoldToTranscribeKeyState()
18
+
19
+ XCTAssertTrue(state.requestStart())
20
+ XCTAssertEqual(state.completeStart(started: true), .none)
21
+
22
+ XCTAssertEqual(state.releaseKey(), .stopNow)
23
+ XCTAssertFalse(state.isStartPendingOrRecording)
24
+ }
25
+
26
+ func testFailedHoldStartAfterReleaseClearsPendingStateWithoutStop() {
27
+ var state = HoldToTranscribeKeyState()
28
+
29
+ XCTAssertTrue(state.requestStart())
30
+ XCTAssertEqual(state.releaseKey(), .deferUntilStartCompletes)
31
+
32
+ XCTAssertEqual(state.completeStart(started: false), .none)
33
+ XCTAssertFalse(state.isStartPendingOrRecording)
34
+ }
35
+ }
36
+ #endif
@@ -4,6 +4,21 @@
4
4
  <title>Agent CLI Updates</title>
5
5
  <link>https://github.com/basnijholt/agent-cli</link>
6
6
  <description>Signed Agent CLI macOS app updates.</description>
7
+ <item>
8
+ <title>0.98.1</title>
9
+ <pubDate>Thu, 04 Jun 2026 16:50:48 +0000</pubDate>
10
+ <link>https://github.com/basnijholt/agent-cli</link>
11
+ <sparkle:version>189</sparkle:version>
12
+ <sparkle:shortVersionString>0.98.1</sparkle:shortVersionString>
13
+ <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
14
+ <sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
15
+ <description sparkle:format="markdown"><![CDATA[## What’s Changed
16
+
17
+ * Add macOS transcription TTL setting (#578) @basnijholt
18
+
19
+ ]]></description>
20
+ <enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.98.1/AgentCLI.zip" length="22896191" type="application/octet-stream" sparkle:edSignature="4g9PD/is1i4Htq5eM2TfAUjxEaXSb7xJJDjnliSfX5TQfqeLLsItUcaCLbhpXaOKqzq0YByVg5SLSpqHK08vAw=="/>
21
+ </item>
7
22
  <item>
8
23
  <title>0.98.0</title>
9
24
  <pubDate>Thu, 04 Jun 2026 16:25:34 +0000</pubDate>
@@ -154,23 +169,5 @@
154
169
  ]]></description>
155
170
  <enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.96.6/AgentCLI.zip" length="22742441" type="application/octet-stream" sparkle:edSignature="DriNk09uSrq9l20Pu7S+y34r4LvO+rfTHGOm1gsPDOd94FQZXqgDZxbVYYfTGgJ6eWSb0l3ljQokW6VQhJ97DQ=="/>
156
171
  </item>
157
- <item>
158
- <title>0.96.5</title>
159
- <pubDate>Fri, 29 May 2026 16:40:33 +0000</pubDate>
160
- <link>https://github.com/basnijholt/agent-cli</link>
161
- <sparkle:version>179</sparkle:version>
162
- <sparkle:shortVersionString>0.96.5</sparkle:shortVersionString>
163
- <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
164
- <sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
165
- <description sparkle:format="markdown"><![CDATA[## What’s Changed
166
-
167
- * Fix bare Fn shortcut detection on macOS (#554) @marcellaholm
168
- * Fix macOS setup menu bar icon (#555) @marcellaholm
169
- * Use purr for recording release sound (#556) @basnijholt
170
- * Boost quiet waveform levels (#553) @basnijholt
171
-
172
- ]]></description>
173
- <enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.96.5/AgentCLI.zip" length="22738995" type="application/octet-stream" sparkle:edSignature="Jf0aoWxUGvOR6idZhELnlGf61IHrf8Kw92tcH5Xk4wC8chn3mO3OgeE+8+P2orbHC0VhszHgjMNzsGN3bZPwCg=="/>
174
- </item>
175
172
  </channel>
176
173
  </rss>
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import io
6
+ import os
6
7
  import sys
7
8
  import wave
8
9
  from concurrent.futures import ThreadPoolExecutor
@@ -47,16 +48,27 @@ def _install_mock_nemo(
47
48
  monkeypatch.setitem(sys.modules, "nemo.collections.asr", asr_module)
48
49
 
49
50
 
50
- def _install_mock_torch(monkeypatch: pytest.MonkeyPatch, *, cuda_available: bool) -> None:
51
- """Install a minimal mock torch module exposing cuda.is_available()."""
51
+ def _install_mock_torch(
52
+ monkeypatch: pytest.MonkeyPatch,
53
+ *,
54
+ cuda_available: bool,
55
+ mps_available: bool = False,
56
+ ) -> None:
57
+ """Install a minimal mock torch module exposing device availability."""
52
58
 
53
59
  class _Cuda:
54
60
  @staticmethod
55
61
  def is_available() -> bool:
56
62
  return cuda_available
57
63
 
64
+ class _Mps:
65
+ @staticmethod
66
+ def is_available() -> bool:
67
+ return mps_available
68
+
58
69
  torch_module: Any = ModuleType("torch")
59
70
  torch_module.cuda = _Cuda()
71
+ torch_module.backends = SimpleNamespace(mps=_Mps())
60
72
  monkeypatch.setitem(sys.modules, "torch", torch_module)
61
73
 
62
74
 
@@ -207,15 +219,27 @@ def test_resolve_device_auto_uses_cuda_when_available(
207
219
  monkeypatch: pytest.MonkeyPatch,
208
220
  ) -> None:
209
221
  """Ensure auto device selection prefers CUDA when available."""
210
- _install_mock_torch(monkeypatch, cuda_available=True)
222
+ _install_mock_torch(monkeypatch, cuda_available=True, mps_available=True)
211
223
  assert backend._resolve_device("auto") == "cuda"
212
224
 
213
225
 
226
+ def test_resolve_device_auto_uses_mps_when_cuda_unavailable(
227
+ monkeypatch: pytest.MonkeyPatch,
228
+ ) -> None:
229
+ """Ensure auto device selection uses Apple GPU when CUDA is unavailable."""
230
+ monkeypatch.delenv("PYTORCH_ENABLE_MPS_FALLBACK", raising=False)
231
+ monkeypatch.setattr(backend.sys, "platform", "darwin")
232
+ _install_mock_torch(monkeypatch, cuda_available=False, mps_available=True)
233
+
234
+ assert backend._resolve_device("auto") == "mps"
235
+ assert os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] == "1"
236
+
237
+
214
238
  def test_resolve_device_auto_falls_back_to_cpu(
215
239
  monkeypatch: pytest.MonkeyPatch,
216
240
  ) -> None:
217
241
  """Ensure auto device selection falls back to CPU."""
218
- _install_mock_torch(monkeypatch, cuda_available=False)
242
+ _install_mock_torch(monkeypatch, cuda_available=False, mps_available=False)
219
243
  assert backend._resolve_device("auto") == "cpu"
220
244
 
221
245
 
@@ -229,6 +253,16 @@ def test_resolve_device_explicit_cuda_requires_available_cuda(
229
253
  backend._resolve_device("cuda:0")
230
254
 
231
255
 
256
+ def test_resolve_device_explicit_mps_requires_available_mps(
257
+ monkeypatch: pytest.MonkeyPatch,
258
+ ) -> None:
259
+ """Ensure explicit MPS requests fail fast when MPS is unavailable."""
260
+ _install_mock_torch(monkeypatch, cuda_available=False, mps_available=False)
261
+
262
+ with pytest.raises(RuntimeError, match="MPS device requested"):
263
+ backend._resolve_device("mps")
264
+
265
+
232
266
  def test_resolve_device_preserves_explicit_cpu(
233
267
  monkeypatch: pytest.MonkeyPatch,
234
268
  ) -> None:
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