agent-cli 0.97.2__tar.gz → 0.98.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (446) hide show
  1. {agent_cli-0.97.2 → agent_cli-0.98.1}/PKG-INFO +1 -1
  2. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/deps.py +35 -1
  3. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/install/launchd.py +6 -4
  4. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/install/service_config.py +54 -1
  5. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/backends/nemo.py +1 -0
  6. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/install-extras.md +13 -0
  7. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/server/index.md +1 -1
  8. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/server/whisper.md +64 -5
  9. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/configuration.md +32 -0
  10. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +13 -2
  11. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +7 -1
  12. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +13 -2
  13. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +1 -1
  14. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +84 -0
  15. agent_cli-0.98.1/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +105 -0
  16. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +261 -3
  17. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/appcast.xml +32 -32
  18. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_daemon.py +60 -0
  19. agent_cli-0.97.2/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -9
  20. {agent_cli-0.97.2 → agent_cli-0.98.1}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  21. {agent_cli-0.97.2 → agent_cli-0.98.1}/.claude/skills/agent-cli-dev/examples.md +0 -0
  22. {agent_cli-0.97.2 → agent_cli-0.98.1}/.claude-plugin/README.md +0 -0
  23. {agent_cli-0.97.2 → agent_cli-0.98.1}/.claude-plugin/marketplace.json +0 -0
  24. {agent_cli-0.97.2 → agent_cli-0.98.1}/.claude-plugin/plugin.json +0 -0
  25. {agent_cli-0.97.2 → agent_cli-0.98.1}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  26. {agent_cli-0.97.2 → agent_cli-0.98.1}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  27. {agent_cli-0.97.2 → agent_cli-0.98.1}/.cursorrules +0 -0
  28. {agent_cli-0.97.2 → agent_cli-0.98.1}/.dockerignore +0 -0
  29. {agent_cli-0.97.2 → agent_cli-0.98.1}/.env.example +0 -0
  30. {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/logo.svg +0 -0
  31. {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/release-drafter.yml +0 -0
  32. {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/renovate.json +0 -0
  33. {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/scripts/check_extras_sync.py +0 -0
  34. {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/scripts/check_plugin_skill_sync.py +0 -0
  35. {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/scripts/normalize_appcast.py +0 -0
  36. {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/scripts/sync_extras.py +0 -0
  37. {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/scripts/sync_requirements.py +0 -0
  38. {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/workflows/automerge.yml +0 -0
  39. {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/workflows/docker.yml +0 -0
  40. {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/workflows/docs.yml +0 -0
  41. {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/workflows/markdown-code-runner.yml +0 -0
  42. {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/workflows/pytest.yml +0 -0
  43. {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/workflows/release-drafter.yml +0 -0
  44. {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/workflows/release.yml +0 -0
  45. {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/workflows/toc.yaml +0 -0
  46. {agent_cli-0.97.2 → agent_cli-0.98.1}/.gitignore +0 -0
  47. {agent_cli-0.97.2 → agent_cli-0.98.1}/.jscpd.json +0 -0
  48. {agent_cli-0.97.2 → agent_cli-0.98.1}/.pre-commit-config.yaml +0 -0
  49. {agent_cli-0.97.2 → agent_cli-0.98.1}/.prompts/docs-review.md +0 -0
  50. {agent_cli-0.97.2 → agent_cli-0.98.1}/.prompts/pr-review.md +0 -0
  51. {agent_cli-0.97.2 → agent_cli-0.98.1}/CLAUDE.md +0 -0
  52. {agent_cli-0.97.2 → agent_cli-0.98.1}/LICENSE +0 -0
  53. {agent_cli-0.97.2 → agent_cli-0.98.1}/LLAMA_SERVER_USAGE.md +0 -0
  54. {agent_cli-0.97.2 → agent_cli-0.98.1}/README.md +0 -0
  55. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/__init__.py +0 -0
  56. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/__main__.py +0 -0
  57. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_extras.json +0 -0
  58. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_overrides/nemo-whisper.txt +0 -0
  59. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/.gitkeep +0 -0
  60. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/audio.txt +0 -0
  61. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/diarization.txt +0 -0
  62. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/faster-whisper.txt +0 -0
  63. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/kokoro.txt +0 -0
  64. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/llm.txt +0 -0
  65. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/memory.txt +0 -0
  66. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  67. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/nemo-whisper.txt +0 -0
  68. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/piper.txt +0 -0
  69. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/rag.txt +0 -0
  70. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/server.txt +0 -0
  71. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/speed.txt +0 -0
  72. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/vad.txt +0 -0
  73. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/vectordb.txt +0 -0
  74. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  75. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/wyoming.txt +0 -0
  76. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_tools.py +0 -0
  77. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/__init__.py +0 -0
  78. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/_voice_agent_common.py +0 -0
  79. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/assistant.py +0 -0
  80. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/autocorrect.py +0 -0
  81. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/chat.py +0 -0
  82. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/diarize_live_session.py +0 -0
  83. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/memory/__init__.py +0 -0
  84. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/memory/add.py +0 -0
  85. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/memory/proxy.py +0 -0
  86. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/rag_proxy.py +0 -0
  87. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/speak.py +0 -0
  88. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/speakers.py +0 -0
  89. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/transcribe.py +0 -0
  90. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/transcribe_live.py +0 -0
  91. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/voice_edit.py +0 -0
  92. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/api.py +0 -0
  93. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/cli.py +0 -0
  94. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/config.py +0 -0
  95. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/config_cmd.py +0 -0
  96. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/constants.py +0 -0
  97. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/__init__.py +0 -0
  98. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/alignment.py +0 -0
  99. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/audio.py +0 -0
  100. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/audio_format.py +0 -0
  101. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/chroma.py +0 -0
  102. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/diarization.py +0 -0
  103. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/openai_proxy.py +0 -0
  104. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/process.py +0 -0
  105. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/reranker.py +0 -0
  106. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/speaker_identity.py +0 -0
  107. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/sse.py +0 -0
  108. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/transcription_logger.py +0 -0
  109. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/utils.py +0 -0
  110. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/vad.py +0 -0
  111. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/watch.py +0 -0
  112. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/daemon/__init__.py +0 -0
  113. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/daemon/cli.py +0 -0
  114. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/__init__.py +0 -0
  115. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/_branch_name.py +0 -0
  116. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/_config.py +0 -0
  117. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/_output.py +0 -0
  118. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/cleanup.py +0 -0
  119. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/cli.py +0 -0
  120. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/__init__.py +0 -0
  121. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/aider.py +0 -0
  122. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/base.py +0 -0
  123. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/claude.py +0 -0
  124. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/codex.py +0 -0
  125. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  126. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/copilot.py +0 -0
  127. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  128. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/gemini.py +0 -0
  129. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/opencode.py +0 -0
  130. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/registry.py +0 -0
  131. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/__init__.py +0 -0
  132. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/base.py +0 -0
  133. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/cursor.py +0 -0
  134. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/emacs.py +0 -0
  135. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/jetbrains.py +0 -0
  136. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/nano.py +0 -0
  137. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/neovim.py +0 -0
  138. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/registry.py +0 -0
  139. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/sublime.py +0 -0
  140. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/vim.py +0 -0
  141. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/vscode.py +0 -0
  142. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/zed.py +0 -0
  143. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/hooks.py +0 -0
  144. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/launch.py +0 -0
  145. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/project.py +0 -0
  146. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/registry.py +0 -0
  147. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/skill/SKILL.md +0 -0
  148. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/skill/examples.md +0 -0
  149. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/__init__.py +0 -0
  150. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  151. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/base.py +0 -0
  152. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/gnome.py +0 -0
  153. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/iterm2.py +0 -0
  154. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/kitty.py +0 -0
  155. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/registry.py +0 -0
  156. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/tmux.py +0 -0
  157. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/warp.py +0 -0
  158. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/zellij.py +0 -0
  159. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/worktree.py +0 -0
  160. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/docs_gen.py +0 -0
  161. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/example-config.toml +0 -0
  162. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/install/__init__.py +0 -0
  163. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/install/common.py +0 -0
  164. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/install/extras.py +0 -0
  165. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/install/hotkeys.py +0 -0
  166. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/install/services.py +0 -0
  167. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/install/systemd.py +0 -0
  168. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/__init__.py +0 -0
  169. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_files.py +0 -0
  170. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_filters.py +0 -0
  171. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_git.py +0 -0
  172. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_indexer.py +0 -0
  173. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_ingest.py +0 -0
  174. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_persistence.py +0 -0
  175. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_prompt.py +0 -0
  176. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_retrieval.py +0 -0
  177. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_store.py +0 -0
  178. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_streaming.py +0 -0
  179. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_tasks.py +0 -0
  180. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/api.py +0 -0
  181. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/client.py +0 -0
  182. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/engine.py +0 -0
  183. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/entities.py +0 -0
  184. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/models.py +0 -0
  185. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/opts.py +0 -0
  186. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/py.typed +0 -0
  187. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/__init__.py +0 -0
  188. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/_indexer.py +0 -0
  189. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/_indexing.py +0 -0
  190. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/_prompt.py +0 -0
  191. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/_retriever.py +0 -0
  192. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/_store.py +0 -0
  193. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/_utils.py +0 -0
  194. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/api.py +0 -0
  195. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/client.py +0 -0
  196. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/engine.py +0 -0
  197. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/models.py +0 -0
  198. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  199. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/__init__.py +0 -0
  200. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  201. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  202. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  203. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  204. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  205. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  206. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  207. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  208. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  209. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  210. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  211. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  212. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  213. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  214. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/run-openwakeword.sh +0 -0
  215. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  216. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/setup-linux.sh +0 -0
  217. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  218. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/setup-macos.sh +0 -0
  219. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/setup-windows.ps1 +0 -0
  220. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  221. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/start-all-services.sh +0 -0
  222. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/__init__.py +0 -0
  223. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/cli.py +0 -0
  224. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/common.py +0 -0
  225. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/model_manager.py +0 -0
  226. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/model_registry.py +0 -0
  227. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/proxy/__init__.py +0 -0
  228. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/proxy/api.py +0 -0
  229. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/streaming.py +0 -0
  230. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/__init__.py +0 -0
  231. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/api.py +0 -0
  232. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/backends/__init__.py +0 -0
  233. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/backends/base.py +0 -0
  234. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/backends/kokoro.py +0 -0
  235. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/backends/piper.py +0 -0
  236. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/model_manager.py +0 -0
  237. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/model_registry.py +0 -0
  238. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/wyoming_handler.py +0 -0
  239. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/__init__.py +0 -0
  240. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/api.py +0 -0
  241. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/backends/__init__.py +0 -0
  242. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/backends/base.py +0 -0
  243. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  244. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/backends/mlx.py +0 -0
  245. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/backends/transformers.py +0 -0
  246. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/languages.py +0 -0
  247. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/model_manager.py +0 -0
  248. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/model_registry.py +0 -0
  249. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  250. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/services/__init__.py +0 -0
  251. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/services/_wyoming_utils.py +0 -0
  252. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/services/asr.py +0 -0
  253. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/services/llm.py +0 -0
  254. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/services/tts.py +0 -0
  255. {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/services/wake_word.py +0 -0
  256. {agent_cli-0.97.2 → agent_cli-0.98.1}/docker/docker-compose.yml +0 -0
  257. {agent_cli-0.97.2 → agent_cli-0.98.1}/docker/memory-proxy.Dockerfile +0 -0
  258. {agent_cli-0.97.2 → agent_cli-0.98.1}/docker/rag-proxy.Dockerfile +0 -0
  259. {agent_cli-0.97.2 → agent_cli-0.98.1}/docker/transcribe-proxy.Dockerfile +0 -0
  260. {agent_cli-0.97.2 → agent_cli-0.98.1}/docker/tts.Dockerfile +0 -0
  261. {agent_cli-0.97.2 → agent_cli-0.98.1}/docker/whisper.Dockerfile +0 -0
  262. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/CNAME +0 -0
  263. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/architecture/index.md +0 -0
  264. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/architecture/memory.md +0 -0
  265. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/architecture/rag.md +0 -0
  266. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/assistant.md +0 -0
  267. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/autocorrect.md +0 -0
  268. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/chat.md +0 -0
  269. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/config.md +0 -0
  270. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/daemon.md +0 -0
  271. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/dev.md +0 -0
  272. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/diarize-live-session.md +0 -0
  273. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/index.md +0 -0
  274. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/install-hotkeys.md +0 -0
  275. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/install-services.md +0 -0
  276. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/memory.md +0 -0
  277. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/rag-proxy.md +0 -0
  278. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/server/transcribe-proxy.md +0 -0
  279. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/server/tts.md +0 -0
  280. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/speak.md +0 -0
  281. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/speakers.md +0 -0
  282. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/start-services.md +0 -0
  283. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/transcribe-live.md +0 -0
  284. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/transcribe.md +0 -0
  285. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/voice-edit.md +0 -0
  286. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/getting-started.md +0 -0
  287. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/iOS_Shortcut_Guide.md +0 -0
  288. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/index.md +0 -0
  289. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/installation/docker.md +0 -0
  290. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/installation/index.md +0 -0
  291. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/installation/linux.md +0 -0
  292. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/installation/macos-app.md +0 -0
  293. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/installation/macos.md +0 -0
  294. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/installation/nixos.md +0 -0
  295. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/installation/windows.md +0 -0
  296. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/logo-avatar.svg +0 -0
  297. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/logo-clean.svg +0 -0
  298. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  299. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/run_markdown_code_runner.py +0 -0
  300. {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/system-integration.md +0 -0
  301. {agent_cli-0.97.2 → agent_cli-0.98.1}/example.agent-cli-config.toml +0 -0
  302. {agent_cli-0.97.2 → agent_cli-0.98.1}/justfile +0 -0
  303. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Package.resolved +0 -0
  304. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Package.swift +0 -0
  305. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/README.md +0 -0
  306. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
  307. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Resources/Info.plist +0 -0
  308. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
  309. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
  310. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
  311. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
  312. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
  313. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
  314. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
  315. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
  316. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  317. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
  318. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
  319. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +0 -0
  320. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +0 -0
  321. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
  322. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
  323. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
  324. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
  325. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
  326. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +0 -0
  327. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
  328. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
  329. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
  330. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
  331. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
  332. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
  333. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +0 -0
  334. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/build-macos-app.sh +0 -0
  335. {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/test-macos-app-e2e.sh +0 -0
  336. {agent_cli-0.97.2 → agent_cli-0.98.1}/pyproject.toml +0 -0
  337. {agent_cli-0.97.2 → agent_cli-0.98.1}/reddit.md +0 -0
  338. {agent_cli-0.97.2 → agent_cli-0.98.1}/shell.nix +0 -0
  339. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/__init__.py +0 -0
  340. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/__init__.py +0 -0
  341. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_fix_my_text.py +0 -0
  342. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_interactive.py +0 -0
  343. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_interactive_extra.py +0 -0
  344. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_memory_add.py +0 -0
  345. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_speak.py +0 -0
  346. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_speak_e2e.py +0 -0
  347. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_speakers.py +0 -0
  348. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_transcribe.py +0 -0
  349. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_transcribe_agent.py +0 -0
  350. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_transcribe_e2e.py +0 -0
  351. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_transcribe_live.py +0 -0
  352. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_transcribe_recovery.py +0 -0
  353. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_tts_common.py +0 -0
  354. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_tts_common_extra.py +0 -0
  355. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_voice_agent_common.py +0 -0
  356. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_voice_edit.py +0 -0
  357. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_voice_edit_e2e.py +0 -0
  358. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_wake_word_assistant.py +0 -0
  359. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/conftest.py +0 -0
  360. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/core/__init__.py +0 -0
  361. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/core/test_audio.py +0 -0
  362. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/core/test_audio_format.py +0 -0
  363. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/core/test_chroma.py +0 -0
  364. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/core/test_sse.py +0 -0
  365. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/core/test_vad.py +0 -0
  366. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/core/test_watch.py +0 -0
  367. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/__init__.py +0 -0
  368. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_cleanup.py +0 -0
  369. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_cli.py +0 -0
  370. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_coding_agents.py +0 -0
  371. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_editors.py +0 -0
  372. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_hooks.py +0 -0
  373. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_launch.py +0 -0
  374. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_project.py +0 -0
  375. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_terminals.py +0 -0
  376. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_verification.py +0 -0
  377. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_worktree.py +0 -0
  378. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/install/__init__.py +0 -0
  379. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/install/test_extras.py +0 -0
  380. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/install/test_launchd.py +0 -0
  381. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/__init__.py +0 -0
  382. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_api_health.py +0 -0
  383. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_api_integration_liveish.py +0 -0
  384. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_client.py +0 -0
  385. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_engine.py +0 -0
  386. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_files.py +0 -0
  387. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_filters.py +0 -0
  388. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_git_integration.py +0 -0
  389. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_indexer.py +0 -0
  390. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_memory_integration.py +0 -0
  391. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_proxy_passthrough.py +0 -0
  392. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_store.py +0 -0
  393. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_utils.py +0 -0
  394. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/mocks/__init__.py +0 -0
  395. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/mocks/audio.py +0 -0
  396. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/mocks/llm.py +0 -0
  397. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/mocks/wyoming.py +0 -0
  398. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/__init__.py +0 -0
  399. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_api.py +0 -0
  400. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_engine.py +0 -0
  401. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_history.py +0 -0
  402. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_indexer.py +0 -0
  403. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_indexing.py +0 -0
  404. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_rag_client.py +0 -0
  405. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_rag_integration_liveish.py +0 -0
  406. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  407. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_retriever.py +0 -0
  408. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_store.py +0 -0
  409. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_utils.py +0 -0
  410. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_alignment.py +0 -0
  411. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_api.py +0 -0
  412. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_api_integration.py +0 -0
  413. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_asr.py +0 -0
  414. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_asr_recovery.py +0 -0
  415. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_audio_e2e.py +0 -0
  416. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_cli.py +0 -0
  417. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_config.py +0 -0
  418. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_config_cmd.py +0 -0
  419. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_diarization.py +0 -0
  420. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_diarize_live_session.py +0 -0
  421. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_docs_gen.py +0 -0
  422. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_env_vars.py +0 -0
  423. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_faster_whisper_backend.py +0 -0
  424. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_json_output.py +0 -0
  425. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_llm.py +0 -0
  426. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_llm_gemini.py +0 -0
  427. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_macos_app.py +0 -0
  428. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_memory_tools.py +0 -0
  429. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_mlx_backend.py +0 -0
  430. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_nemo_backend.py +0 -0
  431. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_normalize_appcast.py +0 -0
  432. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_process_manager.py +0 -0
  433. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_requires_extras.py +0 -0
  434. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_server_streaming.py +0 -0
  435. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_server_tts.py +0 -0
  436. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_server_whisper.py +0 -0
  437. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_services.py +0 -0
  438. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_speaker_identity.py +0 -0
  439. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_tools.py +0 -0
  440. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_transformers_backend.py +0 -0
  441. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_tts.py +0 -0
  442. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_utils.py +0 -0
  443. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_wake_word.py +0 -0
  444. {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_wyoming_utils.py +0 -0
  445. {agent_cli-0.97.2 → agent_cli-0.98.1}/uv.lock +0 -0
  446. {agent_cli-0.97.2 → agent_cli-0.98.1}/zensical.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.97.2
3
+ Version: 0.98.1
4
4
  Summary: A suite of AI-powered command-line tools for text correction, audio transcription, and voice assistance.
5
5
  Project-URL: Homepage, https://github.com/basnijholt/agent-cli
6
6
  Author-email: Bas Nijholt <bas@nijho.lt>
@@ -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
 
@@ -10,6 +10,8 @@ from dataclasses import dataclass
10
10
  from pathlib import Path
11
11
  from typing import TYPE_CHECKING, NamedTuple
12
12
 
13
+ from agent_cli.core.deps import _uv_tool_extra_args
14
+
13
15
  if TYPE_CHECKING:
14
16
  from collections.abc import Callable
15
17
 
@@ -35,6 +37,12 @@ class ServiceConfig:
35
37
 
36
38
  # TTS services that are mutually exclusive (same ports)
37
39
  TTS_SERVICES = ("tts-kokoro", "tts-piper")
40
+ _WHISPER_BACKEND_EXTRAS = {
41
+ "faster-whisper",
42
+ "mlx-whisper",
43
+ "whisper-transformers",
44
+ "nemo-whisper",
45
+ }
38
46
 
39
47
 
40
48
  def detect_preferred_tts() -> str:
@@ -127,14 +135,20 @@ def build_service_command(
127
135
  ) -> list[str]:
128
136
  """Build the command args for running a service via uv tool run."""
129
137
  extra = (service.macos_extra or service.extra) if use_macos_extra else service.extra
138
+ extra = _service_extra_for_command(service, extra, extra_command_args)
139
+ extras = _split_extras(extra)
130
140
  package_source = os.environ.get("AGENTCLI_PACKAGE_SOURCE", "agent-cli")
131
141
 
132
142
  args = [str(uv_path), "tool", "run"]
133
143
 
134
144
  # Add python version constraint (skip on macOS when using macos_extra,
135
145
  # since macos_extra typically avoids deps that lack py3.14 wheels)
136
- if service.python_version and not (use_macos_extra and service.macos_extra):
146
+ uses_macos_extra_without_python_pin = (
147
+ use_macos_extra and service.macos_extra and "nemo-whisper" not in extras
148
+ )
149
+ if service.python_version and not uses_macos_extra_without_python_pin:
137
150
  args.extend(["--python", service.python_version])
151
+ args.extend(_uv_tool_extra_args(extras))
138
152
 
139
153
  # Build the command: either custom command path or default "server <name>"
140
154
  cmd_path = service.command or ["server", service.name]
@@ -152,6 +166,45 @@ def build_service_command(
152
166
  return args
153
167
 
154
168
 
169
+ def _service_extra_for_command(
170
+ service: ServiceConfig,
171
+ extra: str,
172
+ extra_command_args: list[str] | None,
173
+ ) -> str:
174
+ """Adjust service extras when custom daemon args select a specific backend."""
175
+ if service.name != "whisper" or not _uses_nemo_backend(extra_command_args):
176
+ return extra
177
+
178
+ parts = _split_extras(extra)
179
+ result: list[str] = []
180
+ inserted = False
181
+ for part in parts:
182
+ if part in _WHISPER_BACKEND_EXTRAS:
183
+ if not inserted:
184
+ result.append("nemo-whisper")
185
+ inserted = True
186
+ continue
187
+ result.append(part)
188
+
189
+ if not inserted:
190
+ result.append("nemo-whisper")
191
+ return ",".join(result)
192
+
193
+
194
+ def _split_extras(extra: str) -> list[str]:
195
+ return [part.strip() for part in extra.split(",") if part.strip()]
196
+
197
+
198
+ def _uses_nemo_backend(extra_command_args: list[str] | None) -> bool:
199
+ args = extra_command_args or []
200
+ for index, arg in enumerate(args):
201
+ if arg in {"--backend", "-b"} and index + 1 < len(args):
202
+ return args[index + 1] == "nemo"
203
+ if arg in {"--backend=nemo", "-b=nemo"}:
204
+ return True
205
+ return False
206
+
207
+
155
208
  def find_uv(extra_paths: list[Path] | None = None) -> Path | None:
156
209
  """Find uv executable, preferring system paths over virtualenv."""
157
210
  explicit_uv = os.environ.get("AGENTCLI_UV_PATH")
@@ -240,6 +240,7 @@ def _ensure_validation_ds_config(model: Any) -> None:
240
240
  return
241
241
 
242
242
  if validation_ds is None:
243
+ # TODO(NVIDIA-NeMo/NeMo#15752): Drop after NeMo release. # noqa: FIX002
243
244
  _set_config_value(config, "validation_ds", {})
244
245
 
245
246
 
@@ -83,3 +83,16 @@ agent-cli install-extras rag memory vad
83
83
  # Install all extras
84
84
  agent-cli install-extras --all
85
85
  ```
86
+
87
+ ## NeMo / Parakeet
88
+
89
+ Use the runtime installer for NVIDIA NeMo support:
90
+
91
+ ```bash
92
+ agent-cli install-extras nemo-whisper wyoming
93
+ agent-cli server whisper --backend nemo
94
+ ```
95
+
96
+ This matters on Python 3.14. Plain `pip install "agent-cli[nemo-whisper]"` uses
97
+ the published extra metadata, while `agent-cli install-extras nemo-whisper` can
98
+ apply agent-cli's temporary uv override for the pinned NeMo Git build.
@@ -57,7 +57,7 @@ While Faster Whisper, Piper, and Kokoro are all available as standalone servers,
57
57
 
58
58
  2. **TTL-based memory management** - Like [LlamaSwap](https://github.com/mostlygeek/llama-swap), models load on-demand and automatically unload after idle periods. Run voice services 24/7 without permanently consuming RAM/VRAM - memory is freed when you're not actively using speech features.
59
59
 
60
- 3. **Multi-platform acceleration** - Whisper automatically uses the optimal backend: [MLX Whisper](https://github.com/ml-explore/mlx-examples/tree/main/whisper) on Apple Silicon for native Metal acceleration, [Faster Whisper](https://github.com/SYSTRAN/faster-whisper) on Linux/CUDA for GPU acceleration.
60
+ 3. **Multi-platform acceleration** - Whisper automatically uses the optimal backend: [MLX Whisper](https://github.com/ml-explore/mlx-examples/tree/main/whisper) on Apple Silicon for native Metal acceleration, [Faster Whisper](https://github.com/SYSTRAN/faster-whisper) on Linux/CUDA for GPU acceleration, and [NVIDIA NeMo](https://github.com/NVIDIA/NeMo) for Parakeet models.
61
61
 
62
62
  4. **Unified configuration** - Consistent CLI interface, environment variables, and Docker setup across all services.
63
63
 
@@ -34,6 +34,12 @@ Run a local ASR server with automatic backend selection based on your platform:
34
34
  > --default-language en
35
35
  > ```
36
36
  >
37
+ > NVIDIA Parakeet via NeMo:
38
+ > ```bash
39
+ > agent-cli install-extras nemo-whisper wyoming
40
+ > agent-cli server whisper --backend nemo
41
+ > ```
42
+ >
37
43
  > Use it with any OpenAI-compatible client, or configure agent-cli to use it - see [Configuration](../../configuration.md#using-local-whisper-server).
38
44
 
39
45
  ## Features
@@ -74,6 +80,12 @@ agent-cli server whisper --device cpu
74
80
  agent-cli server whisper --model large-v3 --download-only
75
81
 
76
82
  # Run NVIDIA Parakeet via NeMo
83
+ agent-cli server whisper --backend nemo
84
+
85
+ # Keep Parakeet loaded after first request (avoids repeated load cost)
86
+ agent-cli server whisper --backend nemo --ttl 0
87
+
88
+ # Run a specific Parakeet model instead of the NeMo default
77
89
  agent-cli server whisper --backend nemo --model parakeet-tdt-0.6b-v3
78
90
 
79
91
  # Preload model at startup and wait until ready
@@ -287,15 +299,62 @@ Notes for Cohere Transcribe:
287
299
 
288
300
  ### NVIDIA NeMo (Parakeet)
289
301
 
290
- For NeMo models like `nvidia/parakeet-tdt-0.6b-v3`:
302
+ The NeMo backend runs NVIDIA Parakeet models behind the same OpenAI-compatible
303
+ HTTP API and Wyoming protocol as the other Whisper backends. With `--backend
304
+ nemo`, the default model is `parakeet-unified-en-0.6b`.
305
+
306
+ Install the runtime dependencies:
291
307
 
292
308
  ```bash
293
- pip install "agent-cli[nemo-whisper,wyoming]"
294
- agent-cli server whisper --backend nemo --model parakeet-tdt-0.6b-v3
309
+ agent-cli install-extras nemo-whisper wyoming
310
+ ```
311
+
312
+ Start the server:
313
+
314
+ ```bash
315
+ agent-cli server whisper --backend nemo
295
316
  ```
296
317
 
297
- NeMo models are currently transcription-only in this server. Requests to
298
- `/v1/audio/translations` return `400` for `--backend nemo`.
318
+ Use it from agent-cli through either protocol:
319
+
320
+ ```bash
321
+ # OpenAI-compatible HTTP API
322
+ ag transcribe \
323
+ --asr-provider openai \
324
+ --asr-openai-base-url http://localhost:10301/v1
325
+
326
+ # Wyoming protocol
327
+ ag transcribe \
328
+ --asr-provider wyoming \
329
+ --asr-wyoming-ip localhost \
330
+ --asr-wyoming-port 10300
331
+ ```
332
+
333
+ Run it as a daemon with persistent arguments:
334
+
335
+ ```bash
336
+ agent-cli daemon install whisper -y -- \
337
+ --backend nemo \
338
+ --model parakeet-unified-en-0.6b \
339
+ --ttl 0
340
+ ```
341
+
342
+ Notes for NeMo/Parakeet:
343
+
344
+ - `--backend nemo` defaults to `parakeet-unified-en-0.6b`.
345
+ - `--backend auto` switches to NeMo when any requested model name is a Parakeet model.
346
+ - NeMo uses CUDA when available and CPU otherwise; it does not use MLX/MPS on Apple Silicon.
347
+ - First request can be slow because the model loads lazily. Use `--preload` to load at startup, or `--ttl 0` to keep it loaded after the first request.
348
+ - REST uploads can be WAV, MP3, M4A, FLAC, OGG, AAC, or WebM when `ffmpeg` is available.
349
+ - NeMo models are currently transcription-only in this server. Requests to `/v1/audio/translations` return `400`.
350
+ - Segment formats (`verbose_json`, `srt`, `vtt`) require timestamp output from the selected NeMo model.
351
+
352
+ Python 3.14 note:
353
+
354
+ On Python 3.14, the plain published extra path does not apply agent-cli's NeMo
355
+ override. The `agent-cli install-extras nemo-whisper` path is uv-aware and can
356
+ apply agent-cli's temporary pinned NeMo Git install plus override file. Prefer it
357
+ over plain `pip install "agent-cli[nemo-whisper]"` on Python 3.14.
299
358
 
300
359
  ### Docker
301
360
 
@@ -241,6 +241,7 @@ Add to your config file so all commands use your local server:
241
241
  ```toml
242
242
  [defaults]
243
243
  asr_provider = "wyoming"
244
+ asr_wyoming_ip = "localhost"
244
245
  asr_wyoming_port = 10300
245
246
  ```
246
247
 
@@ -260,6 +261,37 @@ Now just run `agent-cli transcribe` - it automatically uses your local server.
260
261
  > **OpenAI SDK users:** The server also exposes an OpenAI-compatible API on port 10301.
261
262
  > See [server whisper docs](commands/server/whisper.md) for all options.
262
263
 
264
+ ### NVIDIA Parakeet via NeMo
265
+
266
+ Start a Parakeet server:
267
+
268
+ ```bash
269
+ agent-cli install-extras nemo-whisper wyoming
270
+ agent-cli server whisper --backend nemo --ttl 0
271
+ ```
272
+
273
+ `--backend nemo` defaults to `parakeet-unified-en-0.6b`. `--ttl 0` keeps the
274
+ model loaded after the first request, which is useful because NeMo model loading
275
+ is expensive.
276
+
277
+ Use it from agent-cli through Wyoming:
278
+
279
+ ```toml
280
+ [defaults]
281
+ asr_provider = "wyoming"
282
+ asr_wyoming_ip = "localhost"
283
+ asr_wyoming_port = 10300
284
+ ```
285
+
286
+ Or through the OpenAI-compatible HTTP API:
287
+
288
+ ```toml
289
+ [defaults]
290
+ asr_provider = "openai"
291
+ asr_openai_base_url = "http://localhost:10301/v1"
292
+ asr_openai_model = "whisper-1"
293
+ ```
294
+
263
295
  ## Audio Device Configuration
264
296
 
265
297
  ```toml
@@ -15,6 +15,7 @@ struct AgentCommand {
15
15
  let title: String
16
16
  let arguments: [String]
17
17
  let appliesTranscriptionExtraInstructions: Bool
18
+ let appliesTranscriptionDaemonSettings: Bool
18
19
  let forceBootstrap: Bool
19
20
  let bootstrapRequirement: AgentBootstrapRequirement
20
21
  let showsRecordingIndicator: Bool
@@ -27,6 +28,7 @@ struct AgentCommand {
27
28
  title: String,
28
29
  arguments: [String],
29
30
  appliesTranscriptionExtraInstructions: Bool = false,
31
+ appliesTranscriptionDaemonSettings: Bool = false,
30
32
  forceBootstrap: Bool = false,
31
33
  bootstrapRequirement: AgentBootstrapRequirement = .cliRuntime,
32
34
  showsRecordingIndicator: Bool = false,
@@ -38,6 +40,7 @@ struct AgentCommand {
38
40
  self.title = title
39
41
  self.arguments = arguments
40
42
  self.appliesTranscriptionExtraInstructions = appliesTranscriptionExtraInstructions
43
+ self.appliesTranscriptionDaemonSettings = appliesTranscriptionDaemonSettings
41
44
  self.forceBootstrap = forceBootstrap
42
45
  self.bootstrapRequirement = bootstrapRequirement
43
46
  self.showsRecordingIndicator = showsRecordingIndicator
@@ -46,7 +49,14 @@ struct AgentCommand {
46
49
  self.finishNotificationTitle = finishNotificationTitle
47
50
  }
48
51
 
49
- func resolvedArguments(extraInstructions: String?) -> [String] {
52
+ func resolvedArguments(
53
+ extraInstructions: String?,
54
+ transcriptionDaemonArguments: [String]? = nil
55
+ ) -> [String] {
56
+ if appliesTranscriptionDaemonSettings {
57
+ return transcriptionDaemonArguments ?? arguments
58
+ }
59
+
50
60
  guard appliesTranscriptionExtraInstructions else { return arguments }
51
61
 
52
62
  let trimmedInstructions = extraInstructions?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
@@ -110,7 +120,8 @@ struct AgentCommand {
110
120
  static let installVoiceService = AgentCommand(
111
121
  identifier: "install-voice-service",
112
122
  title: "Install Voice Service",
113
- arguments: ["daemon", "install", "whisper", "-y"]
123
+ arguments: ["daemon", "install", "whisper", "-y"],
124
+ appliesTranscriptionDaemonSettings: true
114
125
  )
115
126
 
116
127
  static let installOrUpdateCLI = AgentCommand(
@@ -207,7 +207,13 @@ final class AgentCommandRunner: ObservableObject {
207
207
 
208
208
  let bootstrap = self.bootstrap
209
209
  let reportBootstrapPhase = makeBootstrapProgressReporter()
210
- let commandArguments = command.resolvedArguments(extraInstructions: TranscriptionSettings.extraInstructions)
210
+ let transcriptionDaemonArguments = AgentRuntime.shared.usesUserInstalledAgentCLI
211
+ ? nil
212
+ : TranscriptionSettings.whisperDaemonInstallArguments()
213
+ let commandArguments = command.resolvedArguments(
214
+ extraInstructions: TranscriptionSettings.extraInstructions,
215
+ transcriptionDaemonArguments: transcriptionDaemonArguments
216
+ )
211
217
  DispatchQueue.global(qos: .userInitiated).async {
212
218
  let bootstrapResult = bootstrap(command.bootstrapRequirement, command.forceBootstrap, reportBootstrapPhase)
213
219
  guard bootstrapResult.exitCode == 0 else {
@@ -338,7 +338,10 @@ struct AgentRuntime {
338
338
 
339
339
  private func installWhisperDaemon(progress: AgentBootstrapProgress) -> CommandResult {
340
340
  progress(.installingVoiceService)
341
- let result = runAgentCLI(arguments: ["daemon", "ensure", "whisper", "--quiet"])
341
+ let arguments = runtimeMode == .bundled
342
+ ? TranscriptionSettings.whisperDaemonInstallArguments(userDefaults: userDefaults)
343
+ : ["daemon", "ensure", "whisper", "--quiet"]
344
+ let result = runAgentCLI(arguments: arguments)
342
345
  guard result.exitCode == 0 else {
343
346
  return result
344
347
  }
@@ -354,7 +357,15 @@ struct AgentRuntime {
354
357
 
355
358
  private var whisperDaemonMarkerContents: String {
356
359
  let modeName = runtimeMode == .userInstalled ? "user-installed" : "bundled"
357
- return "runtimeMode=\(modeName)\npackageSource=\(agentCLIPackageSource)\n"
360
+ var contents = "runtimeMode=\(modeName)\npackageSource=\(agentCLIPackageSource)\n"
361
+ if runtimeMode == .bundled {
362
+ let backend = TranscriptionSettings.selectedBackend(userDefaults: userDefaults)
363
+ let ttlSeconds = TranscriptionSettings.selectedModelTTLSeconds(userDefaults: userDefaults)
364
+ contents += "transcriptionBackend=\(backend.rawValue)\n"
365
+ contents += "transcriptionModel=\(TranscriptionSettings.selectedModelName(userDefaults: userDefaults))\n"
366
+ contents += "transcriptionModelTTLSeconds=\(ttlSeconds)\n"
367
+ }
368
+ return contents
358
369
  }
359
370
 
360
371
  private func warmUpWhisperModel() -> CommandResult {
@@ -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
 
@@ -281,10 +281,20 @@ struct SettingsView: View {
281
281
  private var useUserInstalledAgentCLI = false
282
282
  @AppStorage(RecordingSoundSettings.enabledKey)
283
283
  private var recordingSoundsEnabled = false
284
+ @AppStorage(TranscriptionSettings.transcriptionBackendKey)
285
+ private var transcriptionBackend = TranscriptionBackend.whisper.rawValue
286
+ @AppStorage(TranscriptionSettings.transcriptionModelKey)
287
+ private var transcriptionModel = TranscriptionBackend.whisper.defaultModelName
288
+ @AppStorage(TranscriptionSettings.transcriptionModelTTLSecondsKey)
289
+ private var transcriptionModelTTLSeconds = TranscriptionSettings.defaultModelTTLSeconds
284
290
  @AppStorage(TranscriptionSettings.transcriptionExtraInstructionsKey)
285
291
  private var transcriptionExtraInstructions = ""
286
292
  @State private var shortcutRevision = 0
287
293
 
294
+ private var selectedTranscriptionBackend: TranscriptionBackend {
295
+ TranscriptionBackend(rawValue: transcriptionBackend) ?? .whisper
296
+ }
297
+
288
298
  var body: some View {
289
299
  Form {
290
300
  Section {
@@ -311,6 +321,50 @@ struct SettingsView: View {
311
321
  Text("Runs the agent-cli found on PATH with your normal config instead of the app's private bundled-uv runtime. Recording sounds use Frog when recording starts and Purr when recording ends.")
312
322
  }
313
323
 
324
+ Section {
325
+ Picker("Backend", selection: $transcriptionBackend) {
326
+ ForEach(TranscriptionBackend.allCases) { backend in
327
+ Text(backend.title).tag(backend.rawValue)
328
+ }
329
+ }
330
+ .pickerStyle(.menu)
331
+ .disabled(useUserInstalledAgentCLI)
332
+
333
+ Picker("Model", selection: $transcriptionModel) {
334
+ ForEach(selectedTranscriptionBackend.modelOptions) { model in
335
+ Text(model.title).tag(model.id)
336
+ }
337
+ }
338
+ .pickerStyle(.menu)
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)
358
+ } header: {
359
+ Text("Voice Service")
360
+ } footer: {
361
+ Text(
362
+ useUserInstalledAgentCLI
363
+ ? "Disabled while User-Installed agent-cli is active."
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."
365
+ )
366
+ }
367
+
314
368
  Section {
315
369
  TextEditor(text: $transcriptionExtraInstructions)
316
370
  .font(.body)
@@ -378,9 +432,39 @@ struct SettingsView: View {
378
432
  }
379
433
  .formStyle(.grouped)
380
434
  .padding()
435
+ .onChange(of: transcriptionBackend) { _ in
436
+ normalizeTranscriptionModel()
437
+ }
381
438
  .onAppear {
382
439
  loginItemController.refresh()
440
+ normalizeTranscriptionModel()
441
+ }
442
+ }
443
+
444
+ private func normalizeTranscriptionModel() {
445
+ let backend = selectedTranscriptionBackend
446
+ guard backend.modelOption(named: transcriptionModel) == nil else { return }
447
+ transcriptionModel = backend.defaultModelName
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"
383
466
  }
467
+ return "\(hours)h \(minutes)m"
384
468
  }
385
469
  }
386
470
 
@@ -0,0 +1,105 @@
1
+ import Foundation
2
+
3
+ struct TranscriptionModelOption: Identifiable, Equatable {
4
+ let id: String
5
+ let title: String
6
+ }
7
+
8
+ enum TranscriptionBackend: String, CaseIterable, Identifiable {
9
+ case whisper
10
+ case nemo
11
+
12
+ var id: String {
13
+ rawValue
14
+ }
15
+
16
+ var title: String {
17
+ switch self {
18
+ case .whisper:
19
+ return "Whisper"
20
+ case .nemo:
21
+ return "NeMo"
22
+ }
23
+ }
24
+
25
+ var cliBackend: String {
26
+ switch self {
27
+ case .whisper:
28
+ return "auto"
29
+ case .nemo:
30
+ return "nemo"
31
+ }
32
+ }
33
+
34
+ var defaultModelName: String {
35
+ modelOptions[0].id
36
+ }
37
+
38
+ var modelOptions: [TranscriptionModelOption] {
39
+ switch self {
40
+ case .whisper:
41
+ return [
42
+ TranscriptionModelOption(id: "large-v3", title: "Large v3"),
43
+ TranscriptionModelOption(id: "large-v3-turbo", title: "Turbo"),
44
+ TranscriptionModelOption(id: "small", title: "Small"),
45
+ ]
46
+ case .nemo:
47
+ return [
48
+ TranscriptionModelOption(id: "parakeet-unified-en-0.6b", title: "Parakeet Unified 0.6B"),
49
+ TranscriptionModelOption(id: "parakeet-tdt-0.6b-v3", title: "Parakeet TDT 0.6B v3"),
50
+ TranscriptionModelOption(id: "parakeet-tdt_ctc-110m", title: "Parakeet TDT CTC 110M"),
51
+ ]
52
+ }
53
+ }
54
+
55
+ func modelOption(named modelName: String) -> TranscriptionModelOption? {
56
+ modelOptions.first { $0.id == modelName }
57
+ }
58
+ }
59
+
60
+ enum TranscriptionSettings {
61
+ static let transcriptionExtraInstructionsKey = "transcriptionExtraInstructions"
62
+ static let transcriptionBackendKey = "transcriptionBackend"
63
+ static let transcriptionModelKey = "transcriptionModel"
64
+ static let transcriptionModelTTLSecondsKey = "transcriptionModelTTLSeconds"
65
+ static let defaultModelTTLSeconds = 300
66
+
67
+ static var extraInstructions: String {
68
+ UserDefaults.standard.string(forKey: transcriptionExtraInstructionsKey) ?? ""
69
+ }
70
+
71
+ static func selectedBackend(userDefaults: UserDefaults = .standard) -> TranscriptionBackend {
72
+ let rawValue = userDefaults.string(forKey: transcriptionBackendKey) ?? TranscriptionBackend.whisper.rawValue
73
+ return TranscriptionBackend(rawValue: rawValue) ?? .whisper
74
+ }
75
+
76
+ static func selectedModelName(userDefaults: UserDefaults = .standard) -> String {
77
+ let backend = selectedBackend(userDefaults: userDefaults)
78
+ let storedModelName = userDefaults.string(forKey: transcriptionModelKey) ?? ""
79
+ return backend.modelOption(named: storedModelName)?.id ?? backend.defaultModelName
80
+ }
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
+
89
+ static func whisperDaemonInstallArguments(userDefaults: UserDefaults = .standard) -> [String] {
90
+ let backend = selectedBackend(userDefaults: userDefaults)
91
+ return [
92
+ "daemon",
93
+ "install",
94
+ "whisper",
95
+ "-y",
96
+ "--",
97
+ "--backend",
98
+ backend.cliBackend,
99
+ "--model",
100
+ selectedModelName(userDefaults: userDefaults),
101
+ "--ttl",
102
+ "\(selectedModelTTLSeconds(userDefaults: userDefaults))",
103
+ ]
104
+ }
105
+ }