agent-cli 0.102.1__tar.gz → 0.102.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (452) hide show
  1. {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/workflows/release.yml +0 -14
  2. {agent_cli-0.102.1 → agent_cli-0.102.2}/.pre-commit-config.yaml +5 -2
  3. {agent_cli-0.102.1 → agent_cli-0.102.2}/PKG-INFO +2 -1
  4. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/diarization.txt +8 -8
  5. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/mlx-whisper.txt +3 -1
  6. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/nemo-whisper.txt +8 -8
  7. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/mlx.py +14 -1
  8. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/README.md +5 -2
  9. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/appcast.xml +27 -17
  10. {agent_cli-0.102.1 → agent_cli-0.102.2}/pyproject.toml +4 -0
  11. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/conftest.py +24 -4
  12. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_macos_app.py +5 -6
  13. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_mlx_backend.py +67 -1
  14. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_utils.py +42 -0
  15. {agent_cli-0.102.1 → agent_cli-0.102.2}/uv.lock +2 -0
  16. {agent_cli-0.102.1 → agent_cli-0.102.2}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  17. {agent_cli-0.102.1 → agent_cli-0.102.2}/.claude/skills/agent-cli-dev/examples.md +0 -0
  18. {agent_cli-0.102.1 → agent_cli-0.102.2}/.claude-plugin/README.md +0 -0
  19. {agent_cli-0.102.1 → agent_cli-0.102.2}/.claude-plugin/marketplace.json +0 -0
  20. {agent_cli-0.102.1 → agent_cli-0.102.2}/.claude-plugin/plugin.json +0 -0
  21. {agent_cli-0.102.1 → agent_cli-0.102.2}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  22. {agent_cli-0.102.1 → agent_cli-0.102.2}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  23. {agent_cli-0.102.1 → agent_cli-0.102.2}/.cursorrules +0 -0
  24. {agent_cli-0.102.1 → agent_cli-0.102.2}/.dockerignore +0 -0
  25. {agent_cli-0.102.1 → agent_cli-0.102.2}/.env.example +0 -0
  26. {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/logo.svg +0 -0
  27. {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/release-drafter.yml +0 -0
  28. {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/renovate.json +0 -0
  29. {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/scripts/check_extras_sync.py +0 -0
  30. {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/scripts/check_plugin_skill_sync.py +0 -0
  31. {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/scripts/normalize_appcast.py +0 -0
  32. {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/scripts/sync_extras.py +0 -0
  33. {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/scripts/sync_requirements.py +0 -0
  34. {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/workflows/automerge.yml +0 -0
  35. {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/workflows/docker.yml +0 -0
  36. {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/workflows/docs.yml +0 -0
  37. {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/workflows/markdown-code-runner.yml +0 -0
  38. {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/workflows/pytest.yml +0 -0
  39. {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/workflows/release-drafter.yml +0 -0
  40. {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/workflows/toc.yaml +0 -0
  41. {agent_cli-0.102.1 → agent_cli-0.102.2}/.gitignore +0 -0
  42. {agent_cli-0.102.1 → agent_cli-0.102.2}/.jscpd.json +0 -0
  43. {agent_cli-0.102.1 → agent_cli-0.102.2}/.prompts/docs-review.md +0 -0
  44. {agent_cli-0.102.1 → agent_cli-0.102.2}/.prompts/pr-review.md +0 -0
  45. {agent_cli-0.102.1 → agent_cli-0.102.2}/CLAUDE.md +0 -0
  46. {agent_cli-0.102.1 → agent_cli-0.102.2}/LICENSE +0 -0
  47. {agent_cli-0.102.1 → agent_cli-0.102.2}/LLAMA_SERVER_USAGE.md +0 -0
  48. {agent_cli-0.102.1 → agent_cli-0.102.2}/README.md +0 -0
  49. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/__init__.py +0 -0
  50. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/__main__.py +0 -0
  51. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_extras.json +0 -0
  52. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_overrides/nemo-whisper.txt +0 -0
  53. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/.gitkeep +0 -0
  54. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/audio.txt +0 -0
  55. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/faster-whisper.txt +0 -0
  56. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/kokoro.txt +0 -0
  57. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/llm.txt +0 -0
  58. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/memory.txt +0 -0
  59. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/piper.txt +0 -0
  60. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/rag.txt +0 -0
  61. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/server.txt +0 -0
  62. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/speed.txt +0 -0
  63. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/vad.txt +0 -0
  64. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/vectordb.txt +0 -0
  65. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  66. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/wyoming.txt +0 -0
  67. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_tools.py +0 -0
  68. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/__init__.py +0 -0
  69. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/_voice_agent_common.py +0 -0
  70. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/assistant.py +0 -0
  71. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/autocorrect.py +0 -0
  72. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/chat.py +0 -0
  73. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/diarize_live_session.py +0 -0
  74. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/memory/__init__.py +0 -0
  75. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/memory/add.py +0 -0
  76. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/memory/proxy.py +0 -0
  77. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/rag_proxy.py +0 -0
  78. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/speak.py +0 -0
  79. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/speakers.py +0 -0
  80. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/transcribe.py +0 -0
  81. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/transcribe_live.py +0 -0
  82. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/voice_edit.py +0 -0
  83. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/api.py +0 -0
  84. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/cli.py +0 -0
  85. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/config.py +0 -0
  86. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/config_cmd.py +0 -0
  87. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/constants.py +0 -0
  88. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/__init__.py +0 -0
  89. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/alignment.py +0 -0
  90. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/audio.py +0 -0
  91. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/audio_format.py +0 -0
  92. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/chroma.py +0 -0
  93. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/deps.py +0 -0
  94. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/diarization.py +0 -0
  95. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/openai_proxy.py +0 -0
  96. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/process.py +0 -0
  97. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/reranker.py +0 -0
  98. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/speaker_identity.py +0 -0
  99. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/sse.py +0 -0
  100. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/transcription_logger.py +0 -0
  101. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/utils.py +0 -0
  102. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/vad.py +0 -0
  103. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/watch.py +0 -0
  104. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/daemon/__init__.py +0 -0
  105. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/daemon/cli.py +0 -0
  106. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/__init__.py +0 -0
  107. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/_branch_name.py +0 -0
  108. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/_config.py +0 -0
  109. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/_output.py +0 -0
  110. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/cleanup.py +0 -0
  111. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/cli.py +0 -0
  112. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/__init__.py +0 -0
  113. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/aider.py +0 -0
  114. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/base.py +0 -0
  115. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/claude.py +0 -0
  116. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/codex.py +0 -0
  117. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  118. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/copilot.py +0 -0
  119. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  120. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/gemini.py +0 -0
  121. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/opencode.py +0 -0
  122. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/registry.py +0 -0
  123. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/__init__.py +0 -0
  124. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/base.py +0 -0
  125. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/cursor.py +0 -0
  126. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/emacs.py +0 -0
  127. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/jetbrains.py +0 -0
  128. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/nano.py +0 -0
  129. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/neovim.py +0 -0
  130. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/registry.py +0 -0
  131. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/sublime.py +0 -0
  132. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/vim.py +0 -0
  133. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/vscode.py +0 -0
  134. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/zed.py +0 -0
  135. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/hooks.py +0 -0
  136. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/launch.py +0 -0
  137. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/project.py +0 -0
  138. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/registry.py +0 -0
  139. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/skill/SKILL.md +0 -0
  140. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/skill/examples.md +0 -0
  141. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/__init__.py +0 -0
  142. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  143. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/base.py +0 -0
  144. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/cmux.py +0 -0
  145. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/gnome.py +0 -0
  146. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/iterm2.py +0 -0
  147. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/kitty.py +0 -0
  148. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/registry.py +0 -0
  149. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/tmux.py +0 -0
  150. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/warp.py +0 -0
  151. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/zellij.py +0 -0
  152. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/worktree.py +0 -0
  153. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/docs_gen.py +0 -0
  154. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/example-config.toml +0 -0
  155. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/install/__init__.py +0 -0
  156. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/install/common.py +0 -0
  157. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/install/extras.py +0 -0
  158. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/install/hotkeys.py +0 -0
  159. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/install/launchd.py +0 -0
  160. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/install/service_config.py +0 -0
  161. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/install/services.py +0 -0
  162. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/install/systemd.py +0 -0
  163. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/__init__.py +0 -0
  164. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_files.py +0 -0
  165. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_filters.py +0 -0
  166. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_git.py +0 -0
  167. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_indexer.py +0 -0
  168. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_ingest.py +0 -0
  169. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_persistence.py +0 -0
  170. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_prompt.py +0 -0
  171. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_retrieval.py +0 -0
  172. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_store.py +0 -0
  173. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_streaming.py +0 -0
  174. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_tasks.py +0 -0
  175. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/api.py +0 -0
  176. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/client.py +0 -0
  177. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/engine.py +0 -0
  178. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/entities.py +0 -0
  179. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/models.py +0 -0
  180. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/opts.py +0 -0
  181. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/py.typed +0 -0
  182. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/__init__.py +0 -0
  183. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/_indexer.py +0 -0
  184. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/_indexing.py +0 -0
  185. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/_prompt.py +0 -0
  186. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/_retriever.py +0 -0
  187. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/_store.py +0 -0
  188. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/_utils.py +0 -0
  189. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/api.py +0 -0
  190. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/client.py +0 -0
  191. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/engine.py +0 -0
  192. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/models.py +0 -0
  193. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  194. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/__init__.py +0 -0
  195. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  196. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  197. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  198. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  199. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  200. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  201. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  202. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  203. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  204. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  205. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  206. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  207. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  208. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  209. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/run-openwakeword.sh +0 -0
  210. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  211. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/setup-linux.sh +0 -0
  212. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  213. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/setup-macos.sh +0 -0
  214. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/setup-windows.ps1 +0 -0
  215. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  216. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/start-all-services.sh +0 -0
  217. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/__init__.py +0 -0
  218. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/cli.py +0 -0
  219. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/common.py +0 -0
  220. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/model_manager.py +0 -0
  221. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/model_registry.py +0 -0
  222. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/proxy/__init__.py +0 -0
  223. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/proxy/api.py +0 -0
  224. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/streaming.py +0 -0
  225. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/__init__.py +0 -0
  226. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/api.py +0 -0
  227. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/backends/__init__.py +0 -0
  228. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/backends/base.py +0 -0
  229. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/backends/kokoro.py +0 -0
  230. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/backends/piper.py +0 -0
  231. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/model_manager.py +0 -0
  232. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/model_registry.py +0 -0
  233. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/wyoming_handler.py +0 -0
  234. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/__init__.py +0 -0
  235. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/api.py +0 -0
  236. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/__init__.py +0 -0
  237. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/base.py +0 -0
  238. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  239. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/nemo.py +0 -0
  240. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/transformers.py +0 -0
  241. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/languages.py +0 -0
  242. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/model_manager.py +0 -0
  243. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/model_registry.py +0 -0
  244. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  245. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/services/__init__.py +0 -0
  246. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/services/_wyoming_utils.py +0 -0
  247. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/services/asr.py +0 -0
  248. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/services/llm.py +0 -0
  249. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/services/tts.py +0 -0
  250. {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/services/wake_word.py +0 -0
  251. {agent_cli-0.102.1 → agent_cli-0.102.2}/docker/docker-compose.yml +0 -0
  252. {agent_cli-0.102.1 → agent_cli-0.102.2}/docker/memory-proxy.Dockerfile +0 -0
  253. {agent_cli-0.102.1 → agent_cli-0.102.2}/docker/rag-proxy.Dockerfile +0 -0
  254. {agent_cli-0.102.1 → agent_cli-0.102.2}/docker/transcribe-proxy.Dockerfile +0 -0
  255. {agent_cli-0.102.1 → agent_cli-0.102.2}/docker/tts.Dockerfile +0 -0
  256. {agent_cli-0.102.1 → agent_cli-0.102.2}/docker/whisper.Dockerfile +0 -0
  257. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/CNAME +0 -0
  258. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/architecture/index.md +0 -0
  259. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/architecture/memory.md +0 -0
  260. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/architecture/rag.md +0 -0
  261. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/assistant.md +0 -0
  262. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/autocorrect.md +0 -0
  263. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/chat.md +0 -0
  264. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/config.md +0 -0
  265. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/daemon.md +0 -0
  266. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/dev.md +0 -0
  267. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/diarize-live-session.md +0 -0
  268. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/index.md +0 -0
  269. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/install-extras.md +0 -0
  270. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/install-hotkeys.md +0 -0
  271. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/install-services.md +0 -0
  272. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/memory.md +0 -0
  273. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/rag-proxy.md +0 -0
  274. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/server/index.md +0 -0
  275. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/server/transcribe-proxy.md +0 -0
  276. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/server/tts.md +0 -0
  277. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/server/whisper.md +0 -0
  278. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/speak.md +0 -0
  279. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/speakers.md +0 -0
  280. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/start-services.md +0 -0
  281. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/transcribe-live.md +0 -0
  282. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/transcribe.md +0 -0
  283. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/voice-edit.md +0 -0
  284. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/configuration.md +0 -0
  285. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/getting-started.md +0 -0
  286. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/iOS_Shortcut_Guide.md +0 -0
  287. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/index.md +0 -0
  288. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/installation/docker.md +0 -0
  289. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/installation/index.md +0 -0
  290. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/installation/linux.md +0 -0
  291. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/installation/macos-app.md +0 -0
  292. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/installation/macos.md +0 -0
  293. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/installation/nixos.md +0 -0
  294. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/installation/windows.md +0 -0
  295. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/logo-avatar.svg +0 -0
  296. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/logo-clean.svg +0 -0
  297. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  298. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/run_markdown_code_runner.py +0 -0
  299. {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/system-integration.md +0 -0
  300. {agent_cli-0.102.1 → agent_cli-0.102.2}/example.agent-cli-config.toml +0 -0
  301. {agent_cli-0.102.1 → agent_cli-0.102.2}/justfile +0 -0
  302. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Package.resolved +0 -0
  303. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Package.swift +0 -0
  304. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
  305. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Resources/Info.plist +0 -0
  306. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
  307. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
  308. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
  309. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +0 -0
  310. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +0 -0
  311. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
  312. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
  313. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
  314. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
  315. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
  316. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
  317. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  318. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/LiveTranscriptionPreview.swift +0 -0
  319. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
  320. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
  321. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +0 -0
  322. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +0 -0
  323. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
  324. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
  325. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
  326. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
  327. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
  328. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +0 -0
  329. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
  330. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +0 -0
  331. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
  332. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
  333. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
  334. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +0 -0
  335. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/ConfigurableHotkeyControllerTests.swift +0 -0
  336. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/LivePreviewSwiftTestingTests.swift +0 -0
  337. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/LiveTranscriptionPreviewTests.swift +0 -0
  338. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
  339. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
  340. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
  341. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
  342. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +0 -0
  343. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/build-macos-app.sh +0 -0
  344. {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/test-macos-app-e2e.sh +0 -0
  345. {agent_cli-0.102.1 → agent_cli-0.102.2}/reddit.md +0 -0
  346. {agent_cli-0.102.1 → agent_cli-0.102.2}/shell.nix +0 -0
  347. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/__init__.py +0 -0
  348. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/__init__.py +0 -0
  349. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_fix_my_text.py +0 -0
  350. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_interactive.py +0 -0
  351. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_interactive_extra.py +0 -0
  352. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_memory_add.py +0 -0
  353. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_speak.py +0 -0
  354. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_speak_e2e.py +0 -0
  355. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_speakers.py +0 -0
  356. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_transcribe.py +0 -0
  357. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_transcribe_agent.py +0 -0
  358. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_transcribe_e2e.py +0 -0
  359. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_transcribe_live.py +0 -0
  360. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_transcribe_recovery.py +0 -0
  361. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_tts_common.py +0 -0
  362. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_tts_common_extra.py +0 -0
  363. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_voice_agent_common.py +0 -0
  364. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_voice_edit.py +0 -0
  365. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_voice_edit_e2e.py +0 -0
  366. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_wake_word_assistant.py +0 -0
  367. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/core/__init__.py +0 -0
  368. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/core/test_audio.py +0 -0
  369. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/core/test_audio_format.py +0 -0
  370. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/core/test_audio_levels.py +0 -0
  371. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/core/test_chroma.py +0 -0
  372. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/core/test_sse.py +0 -0
  373. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/core/test_vad.py +0 -0
  374. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/core/test_watch.py +0 -0
  375. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/__init__.py +0 -0
  376. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_cleanup.py +0 -0
  377. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_cli.py +0 -0
  378. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_coding_agents.py +0 -0
  379. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_editors.py +0 -0
  380. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_hooks.py +0 -0
  381. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_launch.py +0 -0
  382. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_project.py +0 -0
  383. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_terminals.py +0 -0
  384. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_verification.py +0 -0
  385. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_worktree.py +0 -0
  386. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/install/__init__.py +0 -0
  387. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/install/test_extras.py +0 -0
  388. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/install/test_launchd.py +0 -0
  389. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/__init__.py +0 -0
  390. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_api_health.py +0 -0
  391. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_api_integration_liveish.py +0 -0
  392. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_client.py +0 -0
  393. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_engine.py +0 -0
  394. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_files.py +0 -0
  395. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_filters.py +0 -0
  396. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_git_integration.py +0 -0
  397. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_indexer.py +0 -0
  398. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_memory_integration.py +0 -0
  399. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_proxy_passthrough.py +0 -0
  400. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_store.py +0 -0
  401. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_utils.py +0 -0
  402. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/mocks/__init__.py +0 -0
  403. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/mocks/audio.py +0 -0
  404. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/mocks/llm.py +0 -0
  405. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/mocks/wyoming.py +0 -0
  406. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/__init__.py +0 -0
  407. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_api.py +0 -0
  408. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_engine.py +0 -0
  409. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_history.py +0 -0
  410. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_indexer.py +0 -0
  411. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_indexing.py +0 -0
  412. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_rag_client.py +0 -0
  413. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_rag_integration_liveish.py +0 -0
  414. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  415. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_retriever.py +0 -0
  416. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_store.py +0 -0
  417. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_utils.py +0 -0
  418. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_alignment.py +0 -0
  419. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_api.py +0 -0
  420. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_api_integration.py +0 -0
  421. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_asr.py +0 -0
  422. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_asr_recovery.py +0 -0
  423. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_audio_e2e.py +0 -0
  424. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_cli.py +0 -0
  425. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_config.py +0 -0
  426. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_config_cmd.py +0 -0
  427. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_daemon.py +0 -0
  428. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_diarization.py +0 -0
  429. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_diarize_live_session.py +0 -0
  430. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_docs_gen.py +0 -0
  431. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_env_vars.py +0 -0
  432. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_faster_whisper_backend.py +0 -0
  433. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_json_output.py +0 -0
  434. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_llm.py +0 -0
  435. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_llm_gemini.py +0 -0
  436. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_memory_tools.py +0 -0
  437. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_nemo_backend.py +0 -0
  438. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_normalize_appcast.py +0 -0
  439. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_process_manager.py +0 -0
  440. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_requires_extras.py +0 -0
  441. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_server_streaming.py +0 -0
  442. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_server_tts.py +0 -0
  443. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_server_tts_wyoming.py +0 -0
  444. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_server_whisper.py +0 -0
  445. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_services.py +0 -0
  446. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_speaker_identity.py +0 -0
  447. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_tools.py +0 -0
  448. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_transformers_backend.py +0 -0
  449. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_tts.py +0 -0
  450. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_wake_word.py +0 -0
  451. {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_wyoming_utils.py +0 -0
  452. {agent_cli-0.102.1 → agent_cli-0.102.2}/zensical.toml +0 -0
@@ -126,17 +126,3 @@ jobs:
126
126
  git commit -m "Update AgentCLI release metadata to ${TAG_NAME}"
127
127
  git pull --rebase origin main
128
128
  git push origin HEAD:main
129
- - name: Trigger Homebrew tap update
130
- env:
131
- GH_TOKEN: ${{ secrets.HOMEBREW_TAP_DISPATCH_TOKEN }}
132
- TAG_NAME: ${{ github.event.release.tag_name }}
133
- run: |
134
- if [[ -z "$GH_TOKEN" ]]; then
135
- echo "HOMEBREW_TAP_DISPATCH_TOKEN is required to update basnijholt/homebrew-tap." >&2
136
- exit 1
137
- fi
138
-
139
- gh api repos/basnijholt/homebrew-tap/dispatches \
140
- -f event_type=agent-cli-release \
141
- -F "client_payload[tag_name]=$TAG_NAME" \
142
- -F "client_payload[asset_url]=https://github.com/basnijholt/agent-cli/releases/download/${TAG_NAME}/AgentCLI.dmg"
@@ -48,14 +48,17 @@ repos:
48
48
  name: uv lock
49
49
  entry: uv lock
50
50
  language: python
51
- additional_dependencies: ["uv"]
51
+ # Pinned: uv export's marker output differs between releases, so an
52
+ # unpinned uv makes agent_cli/_requirements/*.txt depend on whoever's
53
+ # hook cache is freshest.
54
+ additional_dependencies: ["uv==0.11.32"]
52
55
  pass_filenames: false
53
56
  files: pyproject\.toml
54
57
  - id: sync-requirements
55
58
  name: sync extra requirements
56
59
  entry: python .github/scripts/sync_requirements.py
57
60
  language: python
58
- additional_dependencies: ["uv"]
61
+ additional_dependencies: ["uv==0.11.32"]
59
62
  pass_filenames: false
60
63
  files: (pyproject\.toml|uv\.lock)
61
64
  - id: check-extras-sync
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.102.1
3
+ Version: 0.102.2
4
4
  Summary: A suite of AI-powered command-line tools for text correction, audio transcription, and voice assistance.
5
5
  Project-URL: Homepage, https://github.com/basnijholt/agent-cli
6
6
  Author-email: Bas Nijholt <bas@nijho.lt>
@@ -61,6 +61,7 @@ Requires-Dist: watchfiles>=0.21.0; extra == 'memory'
61
61
  Provides-Extra: mlx-whisper
62
62
  Requires-Dist: fastapi[standard]; extra == 'mlx-whisper'
63
63
  Requires-Dist: mlx-whisper>=0.4.0; (sys_platform == 'darwin' and platform_machine == 'arm64') and extra == 'mlx-whisper'
64
+ Requires-Dist: mlx>=0.24; (sys_platform == 'darwin' and platform_machine == 'arm64') and extra == 'mlx-whisper'
64
65
  Provides-Extra: nemo-whisper
65
66
  Requires-Dist: fastapi[standard]; extra == 'nemo-whisper'
66
67
  Requires-Dist: nemo-toolkit[asr]>=2.2.0; (python_version < '3.14') and extra == 'nemo-whisper'
@@ -1,10 +1,10 @@
1
1
  # This file was autogenerated by uv via the following command:
2
2
  # uv export --extra diarization --no-dev --no-emit-project --no-hashes
3
- aiohappyeyeballs==2.6.2
3
+ aiohappyeyeballs==2.6.2 ; python_full_version < '3.13'
4
4
  # via aiohttp
5
- aiohttp==3.13.5
5
+ aiohttp==3.13.5 ; python_full_version < '3.13'
6
6
  # via fsspec
7
- aiosignal==1.4.0
7
+ aiosignal==1.4.0 ; python_full_version < '3.13'
8
8
  # via aiohttp
9
9
  alembic==1.18.4
10
10
  # via optuna
@@ -18,7 +18,7 @@ anyio==4.13.0
18
18
  # via httpx
19
19
  asteroid-filterbanks==0.4.0
20
20
  # via pyannote-audio
21
- attrs==26.1.0
21
+ attrs==26.1.0 ; python_full_version < '3.13'
22
22
  # via aiohttp
23
23
  certifi==2026.5.20
24
24
  # via
@@ -61,7 +61,7 @@ filelock==3.29.0
61
61
  # torch
62
62
  fonttools==4.63.0
63
63
  # via matplotlib
64
- frozenlist==1.8.0
64
+ frozenlist==1.8.0 ; python_full_version < '3.13'
65
65
  # via
66
66
  # aiohttp
67
67
  # aiosignal
@@ -136,7 +136,7 @@ mdurl==0.1.2
136
136
  # via markdown-it-py
137
137
  mpmath==1.3.0
138
138
  # via sympy
139
- multidict==6.7.1
139
+ multidict==6.7.1 ; python_full_version < '3.13'
140
140
  # via
141
141
  # aiohttp
142
142
  # yarl
@@ -267,7 +267,7 @@ pillow==12.2.0
267
267
  # via matplotlib
268
268
  primepy==1.3
269
269
  # via torch-pitch-shift
270
- propcache==0.5.2
270
+ propcache==0.5.2 ; python_full_version < '3.13'
271
271
  # via
272
272
  # aiohttp
273
273
  # yarl
@@ -480,5 +480,5 @@ tzdata==2026.2 ; sys_platform == 'emscripten' or sys_platform == 'win32'
480
480
  # via pandas
481
481
  urllib3==2.7.0
482
482
  # via requests
483
- yarl==1.24.2
483
+ yarl==1.24.2 ; python_full_version < '3.13'
484
484
  # via aiohttp
@@ -98,7 +98,9 @@ markupsafe==3.0.3
98
98
  mdurl==0.1.2
99
99
  # via markdown-it-py
100
100
  mlx==0.31.2 ; platform_machine == 'arm64' and sys_platform == 'darwin'
101
- # via mlx-whisper
101
+ # via
102
+ # agent-cli
103
+ # mlx-whisper
102
104
  mlx-metal==0.31.2 ; platform_machine == 'arm64' and sys_platform == 'darwin'
103
105
  # via mlx
104
106
  mlx-whisper==0.4.3 ; platform_machine == 'arm64' and sys_platform == 'darwin'
@@ -6,11 +6,11 @@ absl-py==2.4.0 ; python_full_version < '3.14'
6
6
  # tensorboard
7
7
  accelerate==1.13.0 ; python_full_version < '3.14'
8
8
  # via peft
9
- aiohappyeyeballs==2.6.2 ; python_full_version < '3.14'
9
+ aiohappyeyeballs==2.6.2 ; python_full_version < '3.13'
10
10
  # via aiohttp
11
- aiohttp==3.13.5 ; python_full_version < '3.14'
11
+ aiohttp==3.13.5 ; python_full_version < '3.13'
12
12
  # via fsspec
13
- aiosignal==1.4.0 ; python_full_version < '3.14'
13
+ aiosignal==1.4.0 ; python_full_version < '3.13'
14
14
  # via aiohttp
15
15
  alembic==1.18.4 ; python_full_version < '3.14'
16
16
  # via optuna
@@ -31,7 +31,7 @@ anyio==4.13.0
31
31
  # watchfiles
32
32
  asttokens==3.0.1 ; python_full_version < '3.14'
33
33
  # via stack-data
34
- attrs==26.1.0 ; python_full_version < '3.14'
34
+ attrs==26.1.0 ; python_full_version < '3.13'
35
35
  # via aiohttp
36
36
  audioop-lts==0.2.2 ; python_full_version == '3.13.*'
37
37
  # via
@@ -146,7 +146,7 @@ filelock==3.29.0 ; python_full_version < '3.14'
146
146
  # transformers
147
147
  fonttools==4.63.0 ; python_full_version < '3.14'
148
148
  # via matplotlib
149
- frozenlist==1.8.0 ; python_full_version < '3.14'
149
+ frozenlist==1.8.0 ; python_full_version < '3.13'
150
150
  # via
151
151
  # aiohttp
152
152
  # aiosignal
@@ -308,7 +308,7 @@ mpmath==1.3.0 ; python_full_version < '3.14'
308
308
  # via sympy
309
309
  msgpack==1.1.2 ; python_full_version < '3.14'
310
310
  # via librosa
311
- multidict==6.7.1 ; python_full_version < '3.14'
311
+ multidict==6.7.1 ; python_full_version < '3.13'
312
312
  # via
313
313
  # aiohttp
314
314
  # yarl
@@ -515,7 +515,7 @@ portalocker==3.2.0 ; python_full_version == '3.13.*'
515
515
  # via sacrebleu
516
516
  prompt-toolkit==3.0.52 ; python_full_version < '3.14'
517
517
  # via ipython
518
- propcache==0.5.2 ; python_full_version < '3.14'
518
+ propcache==0.5.2 ; python_full_version < '3.13'
519
519
  # via
520
520
  # aiohttp
521
521
  # yarl
@@ -888,5 +888,5 @@ wrapt==2.2.1 ; python_full_version < '3.14'
888
888
  # via nemo-toolkit
889
889
  xxhash==3.7.0 ; python_full_version < '3.14'
890
890
  # via datasets
891
- yarl==1.24.2 ; python_full_version < '3.14'
891
+ yarl==1.24.2 ; python_full_version < '3.13'
892
892
  # via aiohttp
@@ -135,11 +135,24 @@ def _transcribe_in_subprocess(
135
135
  kwargs: dict[str, Any],
136
136
  ) -> dict[str, Any]:
137
137
  """Run transcription in subprocess. Model stays loaded between calls."""
138
+ import mlx.core as mx # noqa: PLC0415
138
139
  import mlx_whisper # noqa: PLC0415
139
140
  import numpy as np # noqa: PLC0415
140
141
 
141
142
  audio_array = np.frombuffer(audio_bytes, dtype=audio_dtype).reshape(audio_shape)
142
- result = mlx_whisper.transcribe(audio_array, path_or_hf_repo=model_name, **kwargs)
143
+ try:
144
+ result = mlx_whisper.transcribe(audio_array, path_or_hf_repo=model_name, **kwargs)
145
+ finally:
146
+ # Release MLX's reusable Metal buffer cache after each request. With --ttl 0
147
+ # the subprocess is never recycled, so without this the cache grows to the
148
+ # largest working set ever seen and gets pushed to swap, degrading latency.
149
+ # clear_cache() frees only the cache, NOT live arrays, so the loaded model
150
+ # weights stay resident and inference stays hot (no cold reload).
151
+ # In finally so a failed transcription also releases the buffers it
152
+ # allocated; otherwise the long-lived worker would retain them.
153
+ # Top-level clear_cache() needs mlx>=0.24 (pinned in the mlx-whisper
154
+ # extra); older releases only expose mx.metal.clear_cache().
155
+ mx.clear_cache()
143
156
 
144
157
  return {
145
158
  "text": result.get("text", ""),
@@ -111,8 +111,11 @@ workflow expects these repository secrets:
111
111
  - `APPLE_APP_SPECIFIC_PASSWORD`: app-specific password for `notarytool`
112
112
  - `APPLE_TEAM_ID`: Apple Developer Team ID
113
113
  - `SPARKLE_PRIVATE_ED_KEY`: private Sparkle EdDSA key for signing updates
114
- - `HOMEBREW_TAP_DISPATCH_TOKEN`: fine-grained token with Contents write access
115
- to `basnijholt/homebrew-tap`, used to trigger the tap cask update workflow
114
+
115
+ The Homebrew cask is not published from here. `basnijholt/homebrew-tap` runs a
116
+ daily cron that reads the latest release and bumps `Casks/agent-cli.rb` itself;
117
+ run it on demand with
118
+ `gh workflow run update-agent-cli-cask.yml --repo basnijholt/homebrew-tap`.
116
119
 
117
120
  The workflow also expects the repository variable `SPARKLE_PUBLIC_ED_KEY`.
118
121
  Generate the key pair with Sparkle's `generate_keys` tool and store only the
@@ -4,6 +4,33 @@
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.102.1</title>
9
+ <pubDate>Sat, 25 Jul 2026 18:58:28 +0000</pubDate>
10
+ <link>https://github.com/basnijholt/agent-cli</link>
11
+ <sparkle:version>198</sparkle:version>
12
+ <sparkle:shortVersionString>0.102.1</sparkle:shortVersionString>
13
+ <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
14
+ <sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
15
+ <description sparkle:format="markdown"><![CDATA[## Bug fixes
16
+
17
+ * **Transcription now starts ~1.3s sooner after pressing the hotkey.** The macOS app spawned a login + interactive shell (`zsh -lic`) to discover `PATH` on *every* command it ran, costing 1.1–1.4s with a typical dotfiles setup. The recording pill appeared immediately but the microphone did not open until that shell finished, so speaking right away lost the first words. The login shell `PATH` is now resolved once per app launch, during the existing startup warm-up. Measured hotkey to first audio chunk: ~1.8s → ~0.4–0.6s. (#622)
18
+ * Only successful lookups are cached, so a login shell that fails once does not leave the app on a degraded `PATH` for the rest of the session.
19
+ * *Install or Update CLI* still re-probes, so a relocated `agent-cli` binary is picked up without restarting the app.
20
+
21
+ ## Performance
22
+
23
+ * `agent-cli` no longer reads its own distribution metadata on startup. `__version__` resolves lazily, saving ~29ms on every command. (#622)
24
+
25
+ ## Maintenance
26
+
27
+ * ⬆️ Update docker/login-action to v4.5.1 (#621, #619)
28
+ * ⬆️ Update actions/checkout to v7.0.1 (#617)
29
+ * ⬆️ Update release-drafter/release-drafter to v7.6.0 (#614)
30
+ * [pre-commit.ci] pre-commit autoupdate (#616)
31
+ ]]></description>
32
+ <enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.102.1/AgentCLI.zip" length="24329452" type="application/octet-stream" sparkle:edSignature="MQizz/9FfhxJGKQc6I/XXtIUBLVPh20yWi/kvfE7xBpoQGPF4yE4C0T1Ex1WpU3im/vRLrMIbZMv0+yHYTifBQ=="/>
33
+ </item>
7
34
  <item>
8
35
  <title>0.102.0</title>
9
36
  <pubDate>Tue, 14 Jul 2026 05:57:01 +0000</pubDate>
@@ -163,22 +190,5 @@
163
190
  ]]></description>
164
191
  <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=="/>
165
192
  </item>
166
- <item>
167
- <title>0.98.0</title>
168
- <pubDate>Thu, 04 Jun 2026 16:25:34 +0000</pubDate>
169
- <link>https://github.com/basnijholt/agent-cli</link>
170
- <sparkle:version>188</sparkle:version>
171
- <sparkle:shortVersionString>0.98.0</sparkle:shortVersionString>
172
- <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
173
- <sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
174
- <description sparkle:format="markdown"><![CDATA[## What’s Changed
175
-
176
- * Document NeMo Parakeet setup (#573) @basnijholt
177
- * Add macOS transcription backend picker (#574) @basnijholt
178
- * Reference upstream NeMo validation_ds fix (#577) @basnijholt
179
-
180
- ]]></description>
181
- <enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.98.0/AgentCLI.zip" length="22891739" type="application/octet-stream" sparkle:edSignature="tC7V5Z+r9fyFe5GvISxKB2ExZJoyx8G7Qt/Zqnb1ELJcU6lm+0KSN3tx7d/BBm1Dbl8eKRiCorOATkTKE2HSCw=="/>
182
- </item>
183
193
  </channel>
184
194
  </rss>
@@ -60,6 +60,10 @@ faster-whisper = ["agent-cli[server]", "faster-whisper>=1.0.0", "ctranslate2>=4.
60
60
  mlx-whisper = [
61
61
  "agent-cli[server]; sys_platform == 'darwin' and platform_machine == 'arm64'",
62
62
  "mlx-whisper>=0.4.0; sys_platform == 'darwin' and platform_machine == 'arm64'",
63
+ # mlx-whisper only requires mlx>=0.11, but the MLX backend calls the
64
+ # top-level mx.clear_cache(), which does not exist before mlx 0.24
65
+ # (0.23.2 and older only expose the deprecated mx.metal.clear_cache).
66
+ "mlx>=0.24; sys_platform == 'darwin' and platform_machine == 'arm64'",
63
67
  ]
64
68
  whisper-transformers = ["agent-cli[server]", "transformers>=4.30.0", "torch>=2.0.0"]
65
69
  nemo-whisper = [
@@ -55,11 +55,31 @@ def mock_console() -> Console:
55
55
  return Console(file=io.StringIO(), width=80, force_terminal=True)
56
56
 
57
57
 
58
+ def force_plain_console(console: Console) -> None:
59
+ """Make a console audible and strip every escape sequence from its output.
60
+
61
+ `no_color` alone still emits bold and dim, so the colour system is switched
62
+ off outright.
63
+ """
64
+ console.quiet = False
65
+ console.no_color = True
66
+ console._color_system = None
67
+
68
+
58
69
  @pytest.fixture(autouse=True)
59
- def reset_rich_console_quiet() -> None:
60
- """Prevent JSON-mode CLI tests from silencing later command output."""
61
- utils.console.quiet = False
62
- utils.err_console.quiet = False
70
+ def reset_rich_console_state() -> None:
71
+ """Keep the shared consoles audible and plain for every test.
72
+
73
+ `quiet` is reset so JSON-mode CLI tests cannot silence later command output.
74
+
75
+ Colour is disabled because Rich honours `FORCE_COLOR` even when stdout is
76
+ captured, so a developer shell exporting it makes 29 tests fail on ANSI
77
+ escapes interleaved into otherwise-matching output. The consoles are mutated
78
+ in place rather than rebound: 17 modules hold a direct
79
+ `from agent_cli.core.utils import console` reference.
80
+ """
81
+ for console in (utils.console, utils.err_console):
82
+ force_plain_console(console)
63
83
 
64
84
 
65
85
  @pytest.fixture
@@ -346,12 +346,11 @@ def test_release_workflow_publishes_macos_app_asset() -> None:
346
346
  assert "NOTARIZE=1" in workflow
347
347
  assert "gh release upload" in workflow
348
348
  assert "dist/macos/AgentCLI.dmg" in workflow
349
- assert "name: Trigger Homebrew tap update" in workflow
350
- assert "HOMEBREW_TAP_DISPATCH_TOKEN" in workflow
351
- assert "repos/basnijholt/homebrew-tap/dispatches" in workflow
352
- assert "event_type=agent-cli-release" in workflow
353
- assert "client_payload[tag_name]" in workflow
354
- assert "client_payload[asset_url]" in workflow
349
+ # The tap owns its own updates: basnijholt/homebrew-tap runs a daily cron that
350
+ # reads the latest release. Dispatching from here only duplicated that with an
351
+ # expiring cross-repo token, whose 401 turned every release run red.
352
+ assert "HOMEBREW_TAP_DISPATCH_TOKEN" not in workflow
353
+ assert "repos/basnijholt/homebrew-tap/dispatches" not in workflow
355
354
  assert "python3 .github/scripts/normalize_appcast.py macos/appcast.xml" in workflow
356
355
  assert workflow.index(
357
356
  "python3 .github/scripts/normalize_appcast.py macos/appcast.xml"
@@ -7,10 +7,14 @@ import wave
7
7
  from typing import Any
8
8
  from unittest.mock import MagicMock, patch
9
9
 
10
+ import numpy as np
10
11
  import pytest
11
12
 
12
13
  from agent_cli.server.whisper.backends.base import BackendConfig
13
- from agent_cli.server.whisper.backends.mlx import MLXWhisperBackend
14
+ from agent_cli.server.whisper.backends.mlx import (
15
+ MLXWhisperBackend,
16
+ _transcribe_in_subprocess,
17
+ )
14
18
 
15
19
 
16
20
  def _make_wav_bytes(
@@ -78,3 +82,65 @@ async def test_mlx_transcribe_accepts_matching_wav() -> None:
78
82
 
79
83
  mock_convert.assert_not_called()
80
84
  assert result.text == "hello"
85
+
86
+
87
+ def test_transcribe_in_subprocess_clears_metal_cache() -> None:
88
+ """_transcribe_in_subprocess must release MLX's Metal buffer cache.
89
+
90
+ Regression test for the --ttl 0 memory leak: without mx.clear_cache() the
91
+ long-lived subprocess never releases the Metal buffer cache, so it grows to
92
+ the largest working set ever seen and gets pushed to swap.
93
+ """
94
+ audio = np.zeros(160, dtype=np.float32)
95
+ fake_result = {"text": "hi", "language": "en", "segments": []}
96
+
97
+ fake_mx = MagicMock()
98
+ fake_mlx_whisper = MagicMock()
99
+ fake_mlx_whisper.transcribe.return_value = fake_result
100
+
101
+ with patch.dict(
102
+ "sys.modules",
103
+ {"mlx": MagicMock(core=fake_mx), "mlx.core": fake_mx, "mlx_whisper": fake_mlx_whisper},
104
+ ):
105
+ result = _transcribe_in_subprocess(
106
+ "mlx-community/whisper-large-v3-mlx",
107
+ audio.tobytes(),
108
+ audio.shape,
109
+ str(audio.dtype),
110
+ {"temperature": 0.0},
111
+ )
112
+
113
+ fake_mlx_whisper.transcribe.assert_called_once()
114
+ fake_mx.clear_cache.assert_called_once_with()
115
+ assert result["text"] == "hi"
116
+
117
+
118
+ def test_transcribe_in_subprocess_clears_cache_on_failure() -> None:
119
+ """A failed transcription must still release the Metal buffer cache.
120
+
121
+ The worker subprocess is long-lived under --ttl 0, so buffers allocated by a
122
+ transcription that raises would otherwise leak. clear_cache() runs in a
123
+ finally block, so it must fire even when mlx_whisper.transcribe raises.
124
+ """
125
+ audio = np.zeros(160, dtype=np.float32)
126
+
127
+ fake_mx = MagicMock()
128
+ fake_mlx_whisper = MagicMock()
129
+ fake_mlx_whisper.transcribe.side_effect = RuntimeError("boom")
130
+
131
+ with (
132
+ patch.dict(
133
+ "sys.modules",
134
+ {"mlx": MagicMock(core=fake_mx), "mlx.core": fake_mx, "mlx_whisper": fake_mlx_whisper},
135
+ ),
136
+ pytest.raises(RuntimeError, match="boom"),
137
+ ):
138
+ _transcribe_in_subprocess(
139
+ "mlx-community/whisper-large-v3-mlx",
140
+ audio.tobytes(),
141
+ audio.shape,
142
+ str(audio.dtype),
143
+ {"temperature": 0.0},
144
+ )
145
+
146
+ fake_mx.clear_cache.assert_called_once_with()
@@ -7,8 +7,10 @@ from datetime import timedelta
7
7
  from unittest.mock import Mock, patch
8
8
 
9
9
  import pytest
10
+ from rich.console import ColorSystem
10
11
 
11
12
  from agent_cli.core import process, utils
13
+ from tests.conftest import force_plain_console
12
14
 
13
15
 
14
16
  @pytest.mark.parametrize(
@@ -208,3 +210,43 @@ async def test_signal_handling_context_uses_sync_handlers_on_windows(
208
210
  assert signal.getsignal(signal.SIGINT) is prev_sigint
209
211
  assert signal.getsignal(signal.SIGTERM) is prev_sigterm
210
212
  logger.debug.assert_called()
213
+
214
+
215
+ def test_shared_consoles_render_without_ansi(capsys: pytest.CaptureFixture[str]) -> None:
216
+ """Rich honours FORCE_COLOR even into captured output, breaking substring asserts.
217
+
218
+ The autouse `reset_rich_console_state` fixture must keep both shared consoles
219
+ colourless so the suite passes regardless of the developer's shell.
220
+ """
221
+ assert utils.console.color_system is None
222
+ assert utils.err_console.color_system is None
223
+
224
+ utils.console.print("[bold red]stdout text[/bold red]")
225
+ utils.err_console.print("[dim]stderr text[/dim]")
226
+
227
+ captured = capsys.readouterr()
228
+ assert captured.out == "stdout text\n"
229
+ assert captured.err == "stderr text\n"
230
+
231
+
232
+ @pytest.mark.parametrize("stream", ["console", "err_console"])
233
+ def test_force_plain_console_strips_forced_colour(
234
+ stream: str,
235
+ capsys: pytest.CaptureFixture[str],
236
+ ) -> None:
237
+ """Reproduce a FORCE_COLOR shell rather than trusting the ambient environment.
238
+
239
+ Without this the coverage above is vacuous wherever Rich already detects a
240
+ colourless stream, which is every CI runner. Mutating the shared console is
241
+ safe: the autouse fixture restores it before the next test.
242
+ """
243
+ console = getattr(utils, stream)
244
+ console.no_color = False
245
+ console._color_system = ColorSystem.TRUECOLOR
246
+ assert console.color_system == "truecolor"
247
+
248
+ force_plain_console(console)
249
+
250
+ console.print("[bold red]coloured[/bold red]")
251
+ captured = capsys.readouterr()
252
+ assert (captured.err if stream == "err_console" else captured.out) == "coloured\n"
@@ -138,6 +138,7 @@ memory = [
138
138
  ]
139
139
  mlx-whisper = [
140
140
  { name = "fastapi", extra = ["standard"] },
141
+ { name = "mlx", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" },
141
142
  { name = "mlx-whisper", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" },
142
143
  ]
143
144
  nemo-whisper = [
@@ -246,6 +247,7 @@ requires-dist = [
246
247
  { name = "markdown-code-runner", marker = "extra == 'dev'", specifier = ">=2.7.0" },
247
248
  { name = "markdown-gfm-admonition", marker = "extra == 'dev'" },
248
249
  { name = "markitdown", extras = ["docx", "pdf", "pptx"], marker = "extra == 'rag'", specifier = ">=0.1.3" },
250
+ { name = "mlx", marker = "platform_machine == 'arm64' and sys_platform == 'darwin' and extra == 'mlx-whisper'", specifier = ">=0.24" },
249
251
  { name = "mlx-whisper", marker = "platform_machine == 'arm64' and sys_platform == 'darwin' and extra == 'mlx-whisper'", specifier = ">=0.4.0" },
250
252
  { name = "nemo-toolkit", extras = ["asr"], marker = "python_full_version < '3.14' and extra == 'nemo-whisper'", specifier = ">=2.2.0" },
251
253
  { name = "notebook", marker = "extra == 'dev'" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes