agent-cli 0.98.0__tar.gz → 0.98.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 (445) hide show
  1. {agent_cli-0.98.0 → agent_cli-0.98.2}/PKG-INFO +1 -1
  2. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/core/deps.py +35 -1
  3. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/install/launchd.py +6 -4
  4. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/cli.py +1 -1
  5. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/whisper/backends/nemo.py +20 -1
  6. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/server/whisper.md +8 -1
  7. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +2 -0
  8. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +1 -1
  9. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +41 -1
  10. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +11 -0
  11. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +48 -4
  12. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/appcast.xml +32 -34
  13. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_daemon.py +45 -0
  14. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_nemo_backend.py +38 -4
  15. {agent_cli-0.98.0 → agent_cli-0.98.2}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  16. {agent_cli-0.98.0 → agent_cli-0.98.2}/.claude/skills/agent-cli-dev/examples.md +0 -0
  17. {agent_cli-0.98.0 → agent_cli-0.98.2}/.claude-plugin/README.md +0 -0
  18. {agent_cli-0.98.0 → agent_cli-0.98.2}/.claude-plugin/marketplace.json +0 -0
  19. {agent_cli-0.98.0 → agent_cli-0.98.2}/.claude-plugin/plugin.json +0 -0
  20. {agent_cli-0.98.0 → agent_cli-0.98.2}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  21. {agent_cli-0.98.0 → agent_cli-0.98.2}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  22. {agent_cli-0.98.0 → agent_cli-0.98.2}/.cursorrules +0 -0
  23. {agent_cli-0.98.0 → agent_cli-0.98.2}/.dockerignore +0 -0
  24. {agent_cli-0.98.0 → agent_cli-0.98.2}/.env.example +0 -0
  25. {agent_cli-0.98.0 → agent_cli-0.98.2}/.github/logo.svg +0 -0
  26. {agent_cli-0.98.0 → agent_cli-0.98.2}/.github/release-drafter.yml +0 -0
  27. {agent_cli-0.98.0 → agent_cli-0.98.2}/.github/renovate.json +0 -0
  28. {agent_cli-0.98.0 → agent_cli-0.98.2}/.github/scripts/check_extras_sync.py +0 -0
  29. {agent_cli-0.98.0 → agent_cli-0.98.2}/.github/scripts/check_plugin_skill_sync.py +0 -0
  30. {agent_cli-0.98.0 → agent_cli-0.98.2}/.github/scripts/normalize_appcast.py +0 -0
  31. {agent_cli-0.98.0 → agent_cli-0.98.2}/.github/scripts/sync_extras.py +0 -0
  32. {agent_cli-0.98.0 → agent_cli-0.98.2}/.github/scripts/sync_requirements.py +0 -0
  33. {agent_cli-0.98.0 → agent_cli-0.98.2}/.github/workflows/automerge.yml +0 -0
  34. {agent_cli-0.98.0 → agent_cli-0.98.2}/.github/workflows/docker.yml +0 -0
  35. {agent_cli-0.98.0 → agent_cli-0.98.2}/.github/workflows/docs.yml +0 -0
  36. {agent_cli-0.98.0 → agent_cli-0.98.2}/.github/workflows/markdown-code-runner.yml +0 -0
  37. {agent_cli-0.98.0 → agent_cli-0.98.2}/.github/workflows/pytest.yml +0 -0
  38. {agent_cli-0.98.0 → agent_cli-0.98.2}/.github/workflows/release-drafter.yml +0 -0
  39. {agent_cli-0.98.0 → agent_cli-0.98.2}/.github/workflows/release.yml +0 -0
  40. {agent_cli-0.98.0 → agent_cli-0.98.2}/.github/workflows/toc.yaml +0 -0
  41. {agent_cli-0.98.0 → agent_cli-0.98.2}/.gitignore +0 -0
  42. {agent_cli-0.98.0 → agent_cli-0.98.2}/.jscpd.json +0 -0
  43. {agent_cli-0.98.0 → agent_cli-0.98.2}/.pre-commit-config.yaml +0 -0
  44. {agent_cli-0.98.0 → agent_cli-0.98.2}/.prompts/docs-review.md +0 -0
  45. {agent_cli-0.98.0 → agent_cli-0.98.2}/.prompts/pr-review.md +0 -0
  46. {agent_cli-0.98.0 → agent_cli-0.98.2}/CLAUDE.md +0 -0
  47. {agent_cli-0.98.0 → agent_cli-0.98.2}/LICENSE +0 -0
  48. {agent_cli-0.98.0 → agent_cli-0.98.2}/LLAMA_SERVER_USAGE.md +0 -0
  49. {agent_cli-0.98.0 → agent_cli-0.98.2}/README.md +0 -0
  50. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/__init__.py +0 -0
  51. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/__main__.py +0 -0
  52. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_extras.json +0 -0
  53. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_overrides/nemo-whisper.txt +0 -0
  54. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_requirements/.gitkeep +0 -0
  55. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_requirements/audio.txt +0 -0
  56. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_requirements/diarization.txt +0 -0
  57. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_requirements/faster-whisper.txt +0 -0
  58. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_requirements/kokoro.txt +0 -0
  59. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_requirements/llm.txt +0 -0
  60. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_requirements/memory.txt +0 -0
  61. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  62. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_requirements/nemo-whisper.txt +0 -0
  63. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_requirements/piper.txt +0 -0
  64. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_requirements/rag.txt +0 -0
  65. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_requirements/server.txt +0 -0
  66. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_requirements/speed.txt +0 -0
  67. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_requirements/vad.txt +0 -0
  68. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_requirements/vectordb.txt +0 -0
  69. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  70. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_requirements/wyoming.txt +0 -0
  71. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/_tools.py +0 -0
  72. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/agents/__init__.py +0 -0
  73. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/agents/_voice_agent_common.py +0 -0
  74. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/agents/assistant.py +0 -0
  75. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/agents/autocorrect.py +0 -0
  76. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/agents/chat.py +0 -0
  77. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/agents/diarize_live_session.py +0 -0
  78. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/agents/memory/__init__.py +0 -0
  79. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/agents/memory/add.py +0 -0
  80. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/agents/memory/proxy.py +0 -0
  81. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/agents/rag_proxy.py +0 -0
  82. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/agents/speak.py +0 -0
  83. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/agents/speakers.py +0 -0
  84. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/agents/transcribe.py +0 -0
  85. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/agents/transcribe_live.py +0 -0
  86. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/agents/voice_edit.py +0 -0
  87. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/api.py +0 -0
  88. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/cli.py +0 -0
  89. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/config.py +0 -0
  90. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/config_cmd.py +0 -0
  91. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/constants.py +0 -0
  92. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/core/__init__.py +0 -0
  93. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/core/alignment.py +0 -0
  94. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/core/audio.py +0 -0
  95. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/core/audio_format.py +0 -0
  96. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/core/chroma.py +0 -0
  97. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/core/diarization.py +0 -0
  98. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/core/openai_proxy.py +0 -0
  99. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/core/process.py +0 -0
  100. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/core/reranker.py +0 -0
  101. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/core/speaker_identity.py +0 -0
  102. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/core/sse.py +0 -0
  103. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/core/transcription_logger.py +0 -0
  104. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/core/utils.py +0 -0
  105. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/core/vad.py +0 -0
  106. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/core/watch.py +0 -0
  107. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/daemon/__init__.py +0 -0
  108. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/daemon/cli.py +0 -0
  109. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/__init__.py +0 -0
  110. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/_branch_name.py +0 -0
  111. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/_config.py +0 -0
  112. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/_output.py +0 -0
  113. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/cleanup.py +0 -0
  114. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/cli.py +0 -0
  115. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/coding_agents/__init__.py +0 -0
  116. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/coding_agents/aider.py +0 -0
  117. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/coding_agents/base.py +0 -0
  118. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/coding_agents/claude.py +0 -0
  119. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/coding_agents/codex.py +0 -0
  120. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  121. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/coding_agents/copilot.py +0 -0
  122. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  123. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/coding_agents/gemini.py +0 -0
  124. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/coding_agents/opencode.py +0 -0
  125. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/coding_agents/registry.py +0 -0
  126. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/editors/__init__.py +0 -0
  127. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/editors/base.py +0 -0
  128. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/editors/cursor.py +0 -0
  129. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/editors/emacs.py +0 -0
  130. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/editors/jetbrains.py +0 -0
  131. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/editors/nano.py +0 -0
  132. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/editors/neovim.py +0 -0
  133. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/editors/registry.py +0 -0
  134. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/editors/sublime.py +0 -0
  135. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/editors/vim.py +0 -0
  136. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/editors/vscode.py +0 -0
  137. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/editors/zed.py +0 -0
  138. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/hooks.py +0 -0
  139. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/launch.py +0 -0
  140. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/project.py +0 -0
  141. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/registry.py +0 -0
  142. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/skill/SKILL.md +0 -0
  143. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/skill/examples.md +0 -0
  144. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/terminals/__init__.py +0 -0
  145. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  146. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/terminals/base.py +0 -0
  147. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/terminals/gnome.py +0 -0
  148. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/terminals/iterm2.py +0 -0
  149. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/terminals/kitty.py +0 -0
  150. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/terminals/registry.py +0 -0
  151. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/terminals/tmux.py +0 -0
  152. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/terminals/warp.py +0 -0
  153. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/terminals/zellij.py +0 -0
  154. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/dev/worktree.py +0 -0
  155. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/docs_gen.py +0 -0
  156. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/example-config.toml +0 -0
  157. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/install/__init__.py +0 -0
  158. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/install/common.py +0 -0
  159. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/install/extras.py +0 -0
  160. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/install/hotkeys.py +0 -0
  161. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/install/service_config.py +0 -0
  162. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/install/services.py +0 -0
  163. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/install/systemd.py +0 -0
  164. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/memory/__init__.py +0 -0
  165. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/memory/_files.py +0 -0
  166. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/memory/_filters.py +0 -0
  167. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/memory/_git.py +0 -0
  168. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/memory/_indexer.py +0 -0
  169. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/memory/_ingest.py +0 -0
  170. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/memory/_persistence.py +0 -0
  171. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/memory/_prompt.py +0 -0
  172. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/memory/_retrieval.py +0 -0
  173. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/memory/_store.py +0 -0
  174. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/memory/_streaming.py +0 -0
  175. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/memory/_tasks.py +0 -0
  176. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/memory/api.py +0 -0
  177. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/memory/client.py +0 -0
  178. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/memory/engine.py +0 -0
  179. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/memory/entities.py +0 -0
  180. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/memory/models.py +0 -0
  181. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/opts.py +0 -0
  182. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/py.typed +0 -0
  183. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/rag/__init__.py +0 -0
  184. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/rag/_indexer.py +0 -0
  185. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/rag/_indexing.py +0 -0
  186. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/rag/_prompt.py +0 -0
  187. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/rag/_retriever.py +0 -0
  188. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/rag/_store.py +0 -0
  189. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/rag/_utils.py +0 -0
  190. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/rag/api.py +0 -0
  191. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/rag/client.py +0 -0
  192. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/rag/engine.py +0 -0
  193. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/rag/models.py +0 -0
  194. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  195. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/__init__.py +0 -0
  196. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  197. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  198. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  199. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  200. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  201. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  202. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  203. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  204. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  205. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  206. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  207. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  208. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  209. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  210. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/run-openwakeword.sh +0 -0
  211. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  212. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/setup-linux.sh +0 -0
  213. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  214. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/setup-macos.sh +0 -0
  215. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/setup-windows.ps1 +0 -0
  216. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  217. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/scripts/start-all-services.sh +0 -0
  218. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/__init__.py +0 -0
  219. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/common.py +0 -0
  220. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/model_manager.py +0 -0
  221. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/model_registry.py +0 -0
  222. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/proxy/__init__.py +0 -0
  223. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/proxy/api.py +0 -0
  224. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/streaming.py +0 -0
  225. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/tts/__init__.py +0 -0
  226. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/tts/api.py +0 -0
  227. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/tts/backends/__init__.py +0 -0
  228. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/tts/backends/base.py +0 -0
  229. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/tts/backends/kokoro.py +0 -0
  230. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/tts/backends/piper.py +0 -0
  231. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/tts/model_manager.py +0 -0
  232. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/tts/model_registry.py +0 -0
  233. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/tts/wyoming_handler.py +0 -0
  234. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/whisper/__init__.py +0 -0
  235. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/whisper/api.py +0 -0
  236. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/whisper/backends/__init__.py +0 -0
  237. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/whisper/backends/base.py +0 -0
  238. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  239. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/whisper/backends/mlx.py +0 -0
  240. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/whisper/backends/transformers.py +0 -0
  241. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/whisper/languages.py +0 -0
  242. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/whisper/model_manager.py +0 -0
  243. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/whisper/model_registry.py +0 -0
  244. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  245. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/services/__init__.py +0 -0
  246. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/services/_wyoming_utils.py +0 -0
  247. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/services/asr.py +0 -0
  248. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/services/llm.py +0 -0
  249. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/services/tts.py +0 -0
  250. {agent_cli-0.98.0 → agent_cli-0.98.2}/agent_cli/services/wake_word.py +0 -0
  251. {agent_cli-0.98.0 → agent_cli-0.98.2}/docker/docker-compose.yml +0 -0
  252. {agent_cli-0.98.0 → agent_cli-0.98.2}/docker/memory-proxy.Dockerfile +0 -0
  253. {agent_cli-0.98.0 → agent_cli-0.98.2}/docker/rag-proxy.Dockerfile +0 -0
  254. {agent_cli-0.98.0 → agent_cli-0.98.2}/docker/transcribe-proxy.Dockerfile +0 -0
  255. {agent_cli-0.98.0 → agent_cli-0.98.2}/docker/tts.Dockerfile +0 -0
  256. {agent_cli-0.98.0 → agent_cli-0.98.2}/docker/whisper.Dockerfile +0 -0
  257. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/CNAME +0 -0
  258. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/architecture/index.md +0 -0
  259. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/architecture/memory.md +0 -0
  260. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/architecture/rag.md +0 -0
  261. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/assistant.md +0 -0
  262. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/autocorrect.md +0 -0
  263. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/chat.md +0 -0
  264. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/config.md +0 -0
  265. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/daemon.md +0 -0
  266. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/dev.md +0 -0
  267. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/diarize-live-session.md +0 -0
  268. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/index.md +0 -0
  269. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/install-extras.md +0 -0
  270. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/install-hotkeys.md +0 -0
  271. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/install-services.md +0 -0
  272. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/memory.md +0 -0
  273. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/rag-proxy.md +0 -0
  274. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/server/index.md +0 -0
  275. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/server/transcribe-proxy.md +0 -0
  276. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/server/tts.md +0 -0
  277. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/speak.md +0 -0
  278. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/speakers.md +0 -0
  279. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/start-services.md +0 -0
  280. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/transcribe-live.md +0 -0
  281. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/transcribe.md +0 -0
  282. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/commands/voice-edit.md +0 -0
  283. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/configuration.md +0 -0
  284. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/getting-started.md +0 -0
  285. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/iOS_Shortcut_Guide.md +0 -0
  286. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/index.md +0 -0
  287. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/installation/docker.md +0 -0
  288. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/installation/index.md +0 -0
  289. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/installation/linux.md +0 -0
  290. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/installation/macos-app.md +0 -0
  291. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/installation/macos.md +0 -0
  292. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/installation/nixos.md +0 -0
  293. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/installation/windows.md +0 -0
  294. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/logo-avatar.svg +0 -0
  295. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/logo-clean.svg +0 -0
  296. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  297. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/run_markdown_code_runner.py +0 -0
  298. {agent_cli-0.98.0 → agent_cli-0.98.2}/docs/system-integration.md +0 -0
  299. {agent_cli-0.98.0 → agent_cli-0.98.2}/example.agent-cli-config.toml +0 -0
  300. {agent_cli-0.98.0 → agent_cli-0.98.2}/justfile +0 -0
  301. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Package.resolved +0 -0
  302. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Package.swift +0 -0
  303. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/README.md +0 -0
  304. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
  305. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Resources/Info.plist +0 -0
  306. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
  307. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
  308. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
  309. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +0 -0
  310. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
  311. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
  312. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
  313. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
  314. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
  315. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
  316. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  317. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
  318. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
  319. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +0 -0
  320. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +0 -0
  321. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
  322. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
  323. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
  324. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
  325. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
  326. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +0 -0
  327. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
  328. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
  329. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
  330. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
  331. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
  332. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
  333. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +0 -0
  334. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/build-macos-app.sh +0 -0
  335. {agent_cli-0.98.0 → agent_cli-0.98.2}/macos/test-macos-app-e2e.sh +0 -0
  336. {agent_cli-0.98.0 → agent_cli-0.98.2}/pyproject.toml +0 -0
  337. {agent_cli-0.98.0 → agent_cli-0.98.2}/reddit.md +0 -0
  338. {agent_cli-0.98.0 → agent_cli-0.98.2}/shell.nix +0 -0
  339. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/__init__.py +0 -0
  340. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/__init__.py +0 -0
  341. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_fix_my_text.py +0 -0
  342. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_interactive.py +0 -0
  343. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_interactive_extra.py +0 -0
  344. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_memory_add.py +0 -0
  345. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_speak.py +0 -0
  346. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_speak_e2e.py +0 -0
  347. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_speakers.py +0 -0
  348. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_transcribe.py +0 -0
  349. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_transcribe_agent.py +0 -0
  350. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_transcribe_e2e.py +0 -0
  351. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_transcribe_live.py +0 -0
  352. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_transcribe_recovery.py +0 -0
  353. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_tts_common.py +0 -0
  354. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_tts_common_extra.py +0 -0
  355. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_voice_agent_common.py +0 -0
  356. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_voice_edit.py +0 -0
  357. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_voice_edit_e2e.py +0 -0
  358. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/agents/test_wake_word_assistant.py +0 -0
  359. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/conftest.py +0 -0
  360. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/core/__init__.py +0 -0
  361. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/core/test_audio.py +0 -0
  362. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/core/test_audio_format.py +0 -0
  363. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/core/test_chroma.py +0 -0
  364. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/core/test_sse.py +0 -0
  365. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/core/test_vad.py +0 -0
  366. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/core/test_watch.py +0 -0
  367. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/dev/__init__.py +0 -0
  368. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/dev/test_cleanup.py +0 -0
  369. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/dev/test_cli.py +0 -0
  370. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/dev/test_coding_agents.py +0 -0
  371. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/dev/test_editors.py +0 -0
  372. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/dev/test_hooks.py +0 -0
  373. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/dev/test_launch.py +0 -0
  374. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/dev/test_project.py +0 -0
  375. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/dev/test_terminals.py +0 -0
  376. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/dev/test_verification.py +0 -0
  377. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/dev/test_worktree.py +0 -0
  378. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/install/__init__.py +0 -0
  379. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/install/test_extras.py +0 -0
  380. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/install/test_launchd.py +0 -0
  381. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/memory/__init__.py +0 -0
  382. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/memory/test_api_health.py +0 -0
  383. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/memory/test_api_integration_liveish.py +0 -0
  384. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/memory/test_client.py +0 -0
  385. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/memory/test_engine.py +0 -0
  386. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/memory/test_files.py +0 -0
  387. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/memory/test_filters.py +0 -0
  388. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/memory/test_git_integration.py +0 -0
  389. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/memory/test_indexer.py +0 -0
  390. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/memory/test_memory_integration.py +0 -0
  391. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/memory/test_proxy_passthrough.py +0 -0
  392. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/memory/test_store.py +0 -0
  393. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/memory/test_utils.py +0 -0
  394. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/mocks/__init__.py +0 -0
  395. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/mocks/audio.py +0 -0
  396. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/mocks/llm.py +0 -0
  397. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/mocks/wyoming.py +0 -0
  398. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/rag/__init__.py +0 -0
  399. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/rag/test_api.py +0 -0
  400. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/rag/test_engine.py +0 -0
  401. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/rag/test_history.py +0 -0
  402. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/rag/test_indexer.py +0 -0
  403. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/rag/test_indexing.py +0 -0
  404. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/rag/test_rag_client.py +0 -0
  405. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/rag/test_rag_integration_liveish.py +0 -0
  406. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  407. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/rag/test_retriever.py +0 -0
  408. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/rag/test_store.py +0 -0
  409. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/rag/test_utils.py +0 -0
  410. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_alignment.py +0 -0
  411. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_api.py +0 -0
  412. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_api_integration.py +0 -0
  413. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_asr.py +0 -0
  414. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_asr_recovery.py +0 -0
  415. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_audio_e2e.py +0 -0
  416. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_cli.py +0 -0
  417. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_config.py +0 -0
  418. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_config_cmd.py +0 -0
  419. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_diarization.py +0 -0
  420. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_diarize_live_session.py +0 -0
  421. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_docs_gen.py +0 -0
  422. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_env_vars.py +0 -0
  423. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_faster_whisper_backend.py +0 -0
  424. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_json_output.py +0 -0
  425. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_llm.py +0 -0
  426. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_llm_gemini.py +0 -0
  427. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_macos_app.py +0 -0
  428. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_memory_tools.py +0 -0
  429. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_mlx_backend.py +0 -0
  430. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_normalize_appcast.py +0 -0
  431. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_process_manager.py +0 -0
  432. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_requires_extras.py +0 -0
  433. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_server_streaming.py +0 -0
  434. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_server_tts.py +0 -0
  435. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_server_whisper.py +0 -0
  436. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_services.py +0 -0
  437. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_speaker_identity.py +0 -0
  438. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_tools.py +0 -0
  439. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_transformers_backend.py +0 -0
  440. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_tts.py +0 -0
  441. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_utils.py +0 -0
  442. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_wake_word.py +0 -0
  443. {agent_cli-0.98.0 → agent_cli-0.98.2}/tests/test_wyoming_utils.py +0 -0
  444. {agent_cli-0.98.0 → agent_cli-0.98.2}/uv.lock +0 -0
  445. {agent_cli-0.98.0 → agent_cli-0.98.2}/zensical.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.98.0
3
+ Version: 0.98.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>
@@ -283,7 +283,41 @@ def _is_uv_cmd(cmd: list[str]) -> bool:
283
283
 
284
284
  def _uv_override_path(extra: str) -> Path:
285
285
  """Return the override file path for an extra."""
286
- return _OVERRIDES_DIR / f"{extra}.txt"
286
+ source = _OVERRIDES_DIR / f"{extra}.txt"
287
+ if not _path_contains_whitespace(source):
288
+ return source
289
+ # uv mishandles --overrides paths with spaces (for example, app bundles
290
+ # installed under "Application Support"), so hand it a copied no-space path.
291
+ return _materialize_uv_override(source)
292
+
293
+
294
+ def _path_contains_whitespace(path: Path) -> bool:
295
+ return any(character.isspace() for character in str(path))
296
+
297
+
298
+ def _materialized_uv_overrides_dir() -> Path:
299
+ configured_dir = os.environ.get("AGENTCLI_UV_OVERRIDES_DIR")
300
+ if configured_dir:
301
+ configured_path = Path(configured_dir).expanduser()
302
+ if not _path_contains_whitespace(configured_path):
303
+ return configured_path
304
+
305
+ # Keep this outside AGENTCLI_APP_SUPPORT_DIR; that path usually contains a
306
+ # space on macOS and would reintroduce the launchd/uv parse failure.
307
+ return Path.home() / ".cache" / "agent-cli" / "uv-overrides"
308
+
309
+
310
+ def _materialize_uv_override(source: Path) -> Path:
311
+ """Copy a bundled override to a no-space path that uv can parse."""
312
+ target = _materialized_uv_overrides_dir() / source.name
313
+ try:
314
+ source_bytes = source.read_bytes()
315
+ target.parent.mkdir(parents=True, exist_ok=True)
316
+ if not target.exists() or target.read_bytes() != source_bytes:
317
+ target.write_bytes(source_bytes)
318
+ except OSError:
319
+ return source
320
+ return target
287
321
 
288
322
 
289
323
  def _supports_uv_runtime_override(
@@ -88,16 +88,18 @@ def _get_recent_logs(service_name: str, num_lines: int = 10) -> list[str]:
88
88
 
89
89
  lines: list[str] = []
90
90
 
91
- # Prefer stdout as it has structured output (startup message, usage examples)
92
- # stderr often has noisy warnings from libraries like PyTorch/Kokoro
93
91
  for log_file in [stdout_log, stderr_log]:
94
92
  if log_file.exists():
95
93
  try:
96
94
  with log_file.open() as f:
97
95
  all_lines = f.readlines()
98
- lines = [line.rstrip() for line in all_lines[-num_lines:]]
96
+ recent_lines = [line.rstrip() for line in all_lines[-num_lines:]]
97
+ if not recent_lines:
98
+ continue
99
99
  if lines:
100
- break
100
+ lines.append("")
101
+ lines.append(f"==> {log_file.name} <==")
102
+ lines.extend(recent_lines)
101
103
  except OSError:
102
104
  continue
103
105
 
@@ -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):
@@ -360,8 +360,10 @@ struct AgentRuntime {
360
360
  var contents = "runtimeMode=\(modeName)\npackageSource=\(agentCLIPackageSource)\n"
361
361
  if runtimeMode == .bundled {
362
362
  let backend = TranscriptionSettings.selectedBackend(userDefaults: userDefaults)
363
+ let ttlSeconds = TranscriptionSettings.selectedModelTTLSeconds(userDefaults: userDefaults)
363
364
  contents += "transcriptionBackend=\(backend.rawValue)\n"
364
365
  contents += "transcriptionModel=\(TranscriptionSettings.selectedModelName(userDefaults: userDefaults))\n"
366
+ contents += "transcriptionModelTTLSeconds=\(ttlSeconds)\n"
365
367
  }
366
368
  return contents
367
369
  }
@@ -5,7 +5,7 @@ import SwiftUI
5
5
  final class SettingsWindowController {
6
6
  static let shared = SettingsWindowController()
7
7
 
8
- private static let contentSize = NSSize(width: 460, height: 640)
8
+ private static let contentSize = NSSize(width: 460, height: 680)
9
9
 
10
10
  private var window: NSWindow?
11
11
 
@@ -285,6 +285,8 @@ struct SettingsView: View {
285
285
  private var transcriptionBackend = TranscriptionBackend.whisper.rawValue
286
286
  @AppStorage(TranscriptionSettings.transcriptionModelKey)
287
287
  private var transcriptionModel = TranscriptionBackend.whisper.defaultModelName
288
+ @AppStorage(TranscriptionSettings.transcriptionModelTTLSecondsKey)
289
+ private var transcriptionModelTTLSeconds = TranscriptionSettings.defaultModelTTLSeconds
288
290
  @AppStorage(TranscriptionSettings.transcriptionExtraInstructionsKey)
289
291
  private var transcriptionExtraInstructions = ""
290
292
  @State private var shortcutRevision = 0
@@ -335,13 +337,31 @@ struct SettingsView: View {
335
337
  }
336
338
  .pickerStyle(.menu)
337
339
  .disabled(useUserInstalledAgentCLI)
340
+
341
+ Stepper(
342
+ value: Binding(
343
+ get: { max(0, transcriptionModelTTLSeconds) },
344
+ set: { transcriptionModelTTLSeconds = max(0, $0) }
345
+ ),
346
+ in: 0...86_400,
347
+ step: 60
348
+ ) {
349
+ HStack {
350
+ Text("Model TTL")
351
+ Spacer()
352
+ Text(Self.formatTTLSeconds(transcriptionModelTTLSeconds))
353
+ .foregroundStyle(.secondary)
354
+ .monospacedDigit()
355
+ }
356
+ }
357
+ .disabled(useUserInstalledAgentCLI)
338
358
  } header: {
339
359
  Text("Voice Service")
340
360
  } footer: {
341
361
  Text(
342
362
  useUserInstalledAgentCLI
343
363
  ? "Disabled while User-Installed agent-cli is active."
344
- : "Changing these settings restarts the bundled voice service on next transcription."
364
+ : "TTL is how long the selected model lives in memory after the last transcription. Set to 0 to keep it loaded until the voice service restarts."
345
365
  )
346
366
  }
347
367
 
@@ -426,6 +446,26 @@ struct SettingsView: View {
426
446
  guard backend.modelOption(named: transcriptionModel) == nil else { return }
427
447
  transcriptionModel = backend.defaultModelName
428
448
  }
449
+
450
+ private static func formatTTLSeconds(_ seconds: Int) -> String {
451
+ let clampedSeconds = max(0, seconds)
452
+ if clampedSeconds == 0 {
453
+ return "Never"
454
+ }
455
+ if clampedSeconds < 60 {
456
+ return "\(clampedSeconds)s"
457
+ }
458
+ if clampedSeconds < 3_600 {
459
+ return "\(clampedSeconds / 60)m"
460
+ }
461
+
462
+ let hours = clampedSeconds / 3_600
463
+ let minutes = (clampedSeconds % 3_600) / 60
464
+ if minutes == 0 {
465
+ return "\(hours)h"
466
+ }
467
+ return "\(hours)h \(minutes)m"
468
+ }
429
469
  }
430
470
 
431
471
  struct ShortcutRecorderRow: View {
@@ -61,6 +61,8 @@ enum TranscriptionSettings {
61
61
  static let transcriptionExtraInstructionsKey = "transcriptionExtraInstructions"
62
62
  static let transcriptionBackendKey = "transcriptionBackend"
63
63
  static let transcriptionModelKey = "transcriptionModel"
64
+ static let transcriptionModelTTLSecondsKey = "transcriptionModelTTLSeconds"
65
+ static let defaultModelTTLSeconds = 300
64
66
 
65
67
  static var extraInstructions: String {
66
68
  UserDefaults.standard.string(forKey: transcriptionExtraInstructionsKey) ?? ""
@@ -77,6 +79,13 @@ enum TranscriptionSettings {
77
79
  return backend.modelOption(named: storedModelName)?.id ?? backend.defaultModelName
78
80
  }
79
81
 
82
+ static func selectedModelTTLSeconds(userDefaults: UserDefaults = .standard) -> Int {
83
+ guard let storedValue = userDefaults.object(forKey: transcriptionModelTTLSecondsKey) as? NSNumber else {
84
+ return defaultModelTTLSeconds
85
+ }
86
+ return max(0, storedValue.intValue)
87
+ }
88
+
80
89
  static func whisperDaemonInstallArguments(userDefaults: UserDefaults = .standard) -> [String] {
81
90
  let backend = selectedBackend(userDefaults: userDefaults)
82
91
  return [
@@ -89,6 +98,8 @@ enum TranscriptionSettings {
89
98
  backend.cliBackend,
90
99
  "--model",
91
100
  selectedModelName(userDefaults: userDefaults),
101
+ "--ttl",
102
+ "\(selectedModelTTLSeconds(userDefaults: userDefaults))",
92
103
  ]
93
104
  }
94
105
  }
@@ -64,12 +64,32 @@ final class AgentCommandTests: XCTestCase {
64
64
  "daemon", "install", "whisper", "-y", "--",
65
65
  "--backend", "nemo",
66
66
  "--model", "parakeet-tdt-0.6b-v3",
67
+ "--ttl", "86400",
67
68
  ]
68
69
  ),
69
70
  [
70
71
  "daemon", "install", "whisper", "-y", "--",
71
72
  "--backend", "nemo",
72
73
  "--model", "parakeet-tdt-0.6b-v3",
74
+ "--ttl", "86400",
75
+ ]
76
+ )
77
+ }
78
+
79
+ func testTranscriptionDaemonArgumentsIncludeConfiguredTTL() {
80
+ let defaults = UserDefaults(suiteName: "AgentCLITests.transcription-ttl")!
81
+ defaults.removePersistentDomain(forName: "AgentCLITests.transcription-ttl")
82
+ defaults.set("nemo", forKey: TranscriptionSettings.transcriptionBackendKey)
83
+ defaults.set("parakeet-unified-en-0.6b", forKey: TranscriptionSettings.transcriptionModelKey)
84
+ defaults.set(86400, forKey: TranscriptionSettings.transcriptionModelTTLSecondsKey)
85
+
86
+ XCTAssertEqual(
87
+ TranscriptionSettings.whisperDaemonInstallArguments(userDefaults: defaults),
88
+ [
89
+ "daemon", "install", "whisper", "-y", "--",
90
+ "--backend", "nemo",
91
+ "--model", "parakeet-unified-en-0.6b",
92
+ "--ttl", "86400",
73
93
  ]
74
94
  )
75
95
  }
@@ -220,7 +240,12 @@ final class AgentCommandTests: XCTestCase {
220
240
  userDefaults: defaults,
221
241
  processRunner: { _, arguments, _ in
222
242
  processArguments.append(arguments)
223
- if arguments == ["daemon", "install", "whisper", "-y", "--", "--backend", "auto", "--model", "large-v3"] {
243
+ if arguments == [
244
+ "daemon", "install", "whisper", "-y", "--",
245
+ "--backend", "auto",
246
+ "--model", "large-v3",
247
+ "--ttl", "300",
248
+ ] {
224
249
  installedWhisper = true
225
250
  return CommandResult(exitCode: 0, output: "Installed and started")
226
251
  }
@@ -241,7 +266,12 @@ final class AgentCommandTests: XCTestCase {
241
266
  XCTAssertEqual(
242
267
  processArguments,
243
268
  [
244
- ["daemon", "install", "whisper", "-y", "--", "--backend", "auto", "--model", "large-v3"],
269
+ [
270
+ "daemon", "install", "whisper", "-y", "--",
271
+ "--backend", "auto",
272
+ "--model", "large-v3",
273
+ "--ttl", "300",
274
+ ],
245
275
  ]
246
276
  )
247
277
  XCTAssertEqual(phases, [.installingVoiceService, .waitingForVoiceService])
@@ -277,7 +307,12 @@ final class AgentCommandTests: XCTestCase {
277
307
  userDefaults: defaults,
278
308
  processRunner: { _, arguments, _ in
279
309
  processArguments.append(arguments)
280
- if arguments == ["daemon", "install", "whisper", "-y", "--", "--backend", "auto", "--model", "large-v3"] {
310
+ if arguments == [
311
+ "daemon", "install", "whisper", "-y", "--",
312
+ "--backend", "auto",
313
+ "--model", "large-v3",
314
+ "--ttl", "300",
315
+ ] {
281
316
  installedWhisper = true
282
317
  return CommandResult(exitCode: 0, output: "Installed and started")
283
318
  }
@@ -297,7 +332,12 @@ final class AgentCommandTests: XCTestCase {
297
332
  XCTAssertEqual(
298
333
  processArguments,
299
334
  [
300
- ["daemon", "install", "whisper", "-y", "--", "--backend", "auto", "--model", "large-v3"],
335
+ [
336
+ "daemon", "install", "whisper", "-y", "--",
337
+ "--backend", "auto",
338
+ "--model", "large-v3",
339
+ "--ttl", "300",
340
+ ],
301
341
  ]
302
342
  )
303
343
  }
@@ -339,6 +379,7 @@ final class AgentCommandTests: XCTestCase {
339
379
  "daemon", "install", "whisper", "-y", "--",
340
380
  "--backend", "nemo",
341
381
  "--model", "parakeet-tdt-0.6b-v3",
382
+ "--ttl", "300",
342
383
  ] {
343
384
  installedWhisper = true
344
385
  return CommandResult(exitCode: 0, output: "Installed and started")
@@ -363,6 +404,7 @@ final class AgentCommandTests: XCTestCase {
363
404
  "daemon", "install", "whisper", "-y", "--",
364
405
  "--backend", "nemo",
365
406
  "--model", "parakeet-tdt-0.6b-v3",
407
+ "--ttl", "300",
366
408
  ],
367
409
  ]
368
410
  )
@@ -413,6 +455,7 @@ final class AgentCommandTests: XCTestCase {
413
455
  "daemon", "install", "whisper", "-y", "--",
414
456
  "--backend", "nemo",
415
457
  "--model", "parakeet-tdt-0.6b-v3",
458
+ "--ttl", "300",
416
459
  ] {
417
460
  installedWhisper = true
418
461
  return CommandResult(exitCode: 0, output: "Installed and started")
@@ -438,6 +481,7 @@ final class AgentCommandTests: XCTestCase {
438
481
  "daemon", "install", "whisper", "-y", "--",
439
482
  "--backend", "nemo",
440
483
  "--model", "parakeet-tdt-0.6b-v3",
484
+ "--ttl", "300",
441
485
  ],
442
486
  ]
443
487
  )
@@ -4,6 +4,38 @@
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>
22
+ <item>
23
+ <title>0.98.0</title>
24
+ <pubDate>Thu, 04 Jun 2026 16:25:34 +0000</pubDate>
25
+ <link>https://github.com/basnijholt/agent-cli</link>
26
+ <sparkle:version>188</sparkle:version>
27
+ <sparkle:shortVersionString>0.98.0</sparkle:shortVersionString>
28
+ <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
29
+ <sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
30
+ <description sparkle:format="markdown"><![CDATA[## What’s Changed
31
+
32
+ * Document NeMo Parakeet setup (#573) @basnijholt
33
+ * Add macOS transcription backend picker (#574) @basnijholt
34
+ * Reference upstream NeMo validation_ds fix (#577) @basnijholt
35
+
36
+ ]]></description>
37
+ <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=="/>
38
+ </item>
7
39
  <item>
8
40
  <title>0.97.2</title>
9
41
  <pubDate>Thu, 04 Jun 2026 07:34:52 +0000</pubDate>
@@ -137,39 +169,5 @@
137
169
  ]]></description>
138
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=="/>
139
171
  </item>
140
- <item>
141
- <title>0.96.5</title>
142
- <pubDate>Fri, 29 May 2026 16:40:33 +0000</pubDate>
143
- <link>https://github.com/basnijholt/agent-cli</link>
144
- <sparkle:version>179</sparkle:version>
145
- <sparkle:shortVersionString>0.96.5</sparkle:shortVersionString>
146
- <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
147
- <sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
148
- <description sparkle:format="markdown"><![CDATA[## What’s Changed
149
-
150
- * Fix bare Fn shortcut detection on macOS (#554) @marcellaholm
151
- * Fix macOS setup menu bar icon (#555) @marcellaholm
152
- * Use purr for recording release sound (#556) @basnijholt
153
- * Boost quiet waveform levels (#553) @basnijholt
154
-
155
- ]]></description>
156
- <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=="/>
157
- </item>
158
- <item>
159
- <title>0.96.4</title>
160
- <pubDate>Fri, 29 May 2026 14:59:58 +0000</pubDate>
161
- <link>https://github.com/basnijholt/agent-cli</link>
162
- <sparkle:version>178</sparkle:version>
163
- <sparkle:shortVersionString>0.96.4</sparkle:shortVersionString>
164
- <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
165
- <sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
166
- <description sparkle:format="markdown"><![CDATA[## What’s Changed
167
-
168
- * Cache user CLI runtime checks (#552) @basnijholt
169
- * Clean up macOS menu activity abstractions (#551) @basnijholt
170
-
171
- ]]></description>
172
- <enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.96.4/AgentCLI.zip" length="22738926" type="application/octet-stream" sparkle:edSignature="Ro8WhN/AVGWxCvG/C6//ISayy5lo5KiOJhvpVQdJKLBsPdZv96HmtZx7G2qeVG87sAmcyIR/84pW4zwzCR7lAA=="/>
173
- </item>
174
172
  </channel>
175
173
  </rss>
@@ -12,6 +12,8 @@ import pytest
12
12
  from typer.testing import CliRunner
13
13
 
14
14
  from agent_cli.cli import app
15
+ from agent_cli.core import deps
16
+ from agent_cli.install import launchd as launchd_module
15
17
  from agent_cli.install.launchd import _generate_plist as launchd_generate_plist
16
18
  from agent_cli.install.launchd import _get_log_command as launchd_get_log_command
17
19
  from agent_cli.install.launchd import _get_service_status as launchd_get_service_status
@@ -158,6 +160,34 @@ class TestServiceConfig:
158
160
  assert "agent-cli[server,nemo-whisper,wyoming]" in cmd
159
161
  assert cmd[cmd.index("--python") + 1] == "3.13"
160
162
 
163
+ def test_build_service_command_materializes_nemo_override_without_spaces(
164
+ self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
165
+ ) -> None:
166
+ """UV --overrides receives a copied no-space path for bundled app installs."""
167
+ uv_path = tmp_path / "uv"
168
+ uv_path.touch()
169
+ source_dir = tmp_path / "Application Support" / "AgentCLI" / "_overrides"
170
+ source_dir.mkdir(parents=True)
171
+ source_override = source_dir / "nemo-whisper.txt"
172
+ source_override.write_text("kaldialign==0.9.3\n")
173
+ materialized_dir = tmp_path / "agentcli-overrides"
174
+ monkeypatch.setattr(deps, "_OVERRIDES_DIR", source_dir)
175
+ monkeypatch.setattr(deps, "_find_runtime_uv", lambda: str(uv_path))
176
+ monkeypatch.setenv("AGENTCLI_UV_OVERRIDES_DIR", str(materialized_dir))
177
+
178
+ cmd = build_service_command(
179
+ SERVICES["whisper"],
180
+ uv_path,
181
+ use_macos_extra=True,
182
+ extra_command_args=["--backend", "nemo"],
183
+ )
184
+
185
+ override_path = Path(cmd[cmd.index("--overrides") + 1])
186
+ assert override_path == materialized_dir / "nemo-whisper.txt"
187
+ assert " " not in override_path.as_posix()
188
+ assert override_path.read_text() == source_override.read_text()
189
+ assert "agent-cli[server,nemo-whisper,wyoming]" in cmd
190
+
161
191
  def test_build_service_command_uses_app_package_source(
162
192
  self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
163
193
  ) -> None:
@@ -763,6 +793,21 @@ class TestLaunchdModule:
763
793
 
764
794
  assert plist["ProgramArguments"][-4:] == ["--model", "small", "--port", "10311"]
765
795
 
796
+ def test_launchd_recent_logs_include_stdout_and_stderr(
797
+ self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
798
+ ) -> None:
799
+ """Status output should include stderr when stdout has stale startup logs."""
800
+ (tmp_path / "stdout.log").write_text("old large-v3 startup\n")
801
+ (tmp_path / "stderr.log").write_text("error: File not found: `Library/Application`\n")
802
+ monkeypatch.setattr(launchd_module, "_get_log_dir", lambda _service_name: tmp_path)
803
+
804
+ lines = launchd_module._get_recent_logs("whisper", 5)
805
+
806
+ assert "==> stdout.log <==" in lines
807
+ assert "old large-v3 startup" in lines
808
+ assert "==> stderr.log <==" in lines
809
+ assert "error: File not found: `Library/Application`" in lines
810
+
766
811
  @patch("subprocess.run")
767
812
  def test_launchd_get_service_status_not_installed(
768
813
  self,
@@ -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